From 628cf2beed6d86b4dcee216d20b590e51fb0227e Mon Sep 17 00:00:00 2001 From: kola-web Date: Thu, 29 Jan 2026 11:24:55 +0800 Subject: [PATCH] init --- .editorconfig | 12 + .gitignore | 5 + .neoconf.json | 10 + .prettierrc | 28 + README.md | 47 + babel.config.json | 11 + dist.ps1 | 10 + dist.sh | 5 + eslint.config.mjs | 29 + package.json | 32 + pnpm-lock.yaml | 3857 + project.config.json | 76 + project.private.config.json | 24 + src/api/request.ts | 82 + src/app.json | 38 + src/app.scss | 35 + src/app.ts | 254 + src/components/calendar/core.js | 144 + src/components/calendar/helper.js | 12 + src/components/calendar/index.d.ts | 1 + src/components/calendar/index.js | 258 + src/components/calendar/index.json | 3 + src/components/calendar/index.wxml | 116 + src/components/calendar/index.wxss | 249 + .../calendar/plugins/holidays/holidays-map.js | 212 + .../calendar/plugins/holidays/index.d.ts | 1 + src/components/calendar/plugins/holidays/index.js | 201 + src/components/calendar/plugins/index.js | 18 + src/components/calendar/plugins/preset/base.js | 277 + .../calendar/plugins/preset/get-calendar-data.js | 69 + src/components/calendar/plugins/preset/index.d.ts | 1 + src/components/calendar/plugins/preset/index.js | 9 + src/components/calendar/plugins/selectable.d.ts | 1 + src/components/calendar/plugins/selectable.js | 221 + .../plugins/solarLunar/convertSolarLunar.js | 1036 + .../calendar/plugins/solarLunar/index.d.ts | 1 + .../calendar/plugins/solarLunar/index.js | 59 + src/components/calendar/plugins/time-range.js | 305 + src/components/calendar/plugins/todo.d.ts | 1 + src/components/calendar/plugins/todo.js | 135 + src/components/calendar/plugins/week.js | 432 + src/components/calendar/render.js | 49 + src/components/calendar/theme/iconfont.wxss | 29 + src/components/calendar/theme/theme-default.wxss | 61 + src/components/calendar/theme/theme-elegant.wxss | 58 + src/components/calendar/theme/theme-geneB.wxss | 95 + .../calendar/theme/theme-geneDoctorB.wxss | 95 + src/components/calendar/theme/theme-nuohe.wxss | 90 + src/components/calendar/utils/index.js | 275 + src/components/calendar/utils/logger.js | 23 + src/components/calendar/utils/wxData.js | 30 + src/components/customPoster/README.md | 160 + src/components/customPoster/index.js | 101 + src/components/customPoster/index.json | 3 + src/components/customPoster/index.scss | 53 + src/components/customPoster/index.wxml | 43 + src/components/customPoster/wxml2canvas/README.md | 0 src/components/customPoster/wxml2canvas/index.js | 1692 + .../customPoster/wxml2canvas/index.js.map | 1 + src/components/ec-canvas/ec-canvas.js | 269 + src/components/ec-canvas/ec-canvas.json | 4 + src/components/ec-canvas/ec-canvas.wxml | 4 + src/components/ec-canvas/ec-canvas.wxss | 5 + src/components/ec-canvas/echarts.js | 25 + src/components/ec-canvas/wx-canvas.js | 111 + src/components/login/index.json | 6 + src/components/login/index.scss | 60 + src/components/login/index.ts | 28 + src/components/login/index.wxml | 25 + src/components/navbar/index.json | 6 + src/components/navbar/index.scss | 0 src/components/navbar/index.ts | 50 + src/components/navbar/index.wxml | 17 + src/components/pagination/index.js | 21 + src/components/pagination/index.json | 6 + src/components/pagination/index.scss | 6 + src/components/pagination/index.wxml | 6 + src/components/pickerArea/index.json | 7 + src/components/pickerArea/index.scss | 128 + src/components/pickerArea/index.ts | 316 + src/components/pickerArea/index.wxml | 81 + src/components/pickerAreaBak/index.json | 7 + src/components/pickerAreaBak/index.scss | 0 src/components/pickerAreaBak/index.ts | 76 + src/components/pickerAreaBak/index.wxml | 13 + src/components/popup/index.json | 6 + src/components/popup/index.scss | 1225 + src/components/popup/index.ts | 165 + src/components/popup/index.wxml | 389 + src/components/popupDoctor/index.json | 6 + src/components/popupDoctor/index.scss | 92 + src/components/popupDoctor/index.ts | 66 + src/components/popupDoctor/index.wxml | 45 + src/components/star/index.json | 4 + src/components/star/index.scss | 0 src/components/star/index.ts | 204 + src/components/star/index.wxml | 1 + src/components/uploadFile/index.js | 289 + src/components/uploadFile/index.json | 9 + src/components/uploadFile/index.scss | 91 + src/components/uploadFile/index.wxml | 60 + src/custom-tab-bar/index.json | 7 + src/custom-tab-bar/index.scss | 19 + src/custom-tab-bar/index.ts | 55 + src/custom-tab-bar/index.wxml | 14 + src/doc/pages/doc1/index.json | 6 + src/doc/pages/doc1/index.scss | 3 + src/doc/pages/doc1/index.ts | 10 + src/doc/pages/doc1/index.wxml | 3 + src/doctor/components/doctor-tab-bar/index.json | 7 + src/doctor/components/doctor-tab-bar/index.scss | 16 + src/doctor/components/doctor-tab-bar/index.ts | 59 + src/doctor/components/doctor-tab-bar/index.wxml | 14 + src/images/tabbar/tabbar1-1-active.png | Bin 0 -> 2044 bytes src/images/tabbar/tabbar1-1.png | Bin 0 -> 1677 bytes src/images/tabbar/tabbar1-2-active.png | Bin 0 -> 1570 bytes src/images/tabbar/tabbar1-2.png | Bin 0 -> 1235 bytes src/images/tabbar/tabbar1-3-active.png | Bin 0 -> 1406 bytes src/images/tabbar/tabbar1-3.png | Bin 0 -> 1170 bytes src/images/tabbar/tabbar2-1-active.png | Bin 0 -> 2021 bytes src/images/tabbar/tabbar2-1.png | Bin 0 -> 1674 bytes src/images/tabbar/tabbar2-2-active.png | Bin 0 -> 934 bytes src/images/tabbar/tabbar2-2.png | Bin 0 -> 808 bytes src/images/tabbar/tabbar2-3-active.png | Bin 0 -> 903 bytes src/images/tabbar/tabbar2-3.png | Bin 0 -> 753 bytes src/images/tabbar/tabbar2-4-active.png | Bin 0 -> 1442 bytes src/images/tabbar/tabbar2-4.png | Bin 0 -> 1170 bytes src/images/tabbar/tabbar3-1-active.png | Bin 0 -> 1885 bytes src/images/tabbar/tabbar3-1.png | Bin 0 -> 1660 bytes src/images/tabbar/tabbar3-2-active.png | Bin 0 -> 1305 bytes src/images/tabbar/tabbar3-2.png | Bin 0 -> 1170 bytes src/images/tabbar/tabbar3-3-active.png | Bin 0 -> 894 bytes src/images/tabbar/tabbar3-3.png | Bin 0 -> 806 bytes src/miniprogram_npm/@galacean/effects/index.js | 37435 ++++++++ src/miniprogram_npm/@galacean/effects/index.js.map | 1 + .../video-swiper/index.js | 254 + .../video-swiper/index.json | 4 + .../video-swiper/index.wxml | 37 + .../video-swiper/index.wxss | 1 + .../@vant/weapp/action-sheet/index.d.ts | 1 + .../@vant/weapp/action-sheet/index.js | 78 + .../@vant/weapp/action-sheet/index.json | 8 + .../@vant/weapp/action-sheet/index.wxml | 70 + .../@vant/weapp/action-sheet/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/area/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/area/index.js | 235 + src/miniprogram_npm/@vant/weapp/area/index.json | 6 + src/miniprogram_npm/@vant/weapp/area/index.wxml | 20 + src/miniprogram_npm/@vant/weapp/area/index.wxs | 8 + src/miniprogram_npm/@vant/weapp/area/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/button/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/button/index.js | 67 + src/miniprogram_npm/@vant/weapp/button/index.json | 7 + src/miniprogram_npm/@vant/weapp/button/index.wxml | 56 + src/miniprogram_npm/@vant/weapp/button/index.wxs | 39 + src/miniprogram_npm/@vant/weapp/button/index.wxss | 1 + .../@vant/weapp/calendar/calendar.wxml | 70 + .../weapp/calendar/components/header/index.d.ts | 1 + .../weapp/calendar/components/header/index.js | 45 + .../weapp/calendar/components/header/index.json | 3 + .../weapp/calendar/components/header/index.wxml | 16 + .../weapp/calendar/components/header/index.wxss | 1 + .../weapp/calendar/components/month/index.d.ts | 6 + .../@vant/weapp/calendar/components/month/index.js | 158 + .../weapp/calendar/components/month/index.json | 3 + .../weapp/calendar/components/month/index.wxml | 39 + .../weapp/calendar/components/month/index.wxs | 71 + .../weapp/calendar/components/month/index.wxss | 1 + .../@vant/weapp/calendar/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/calendar/index.js | 383 + .../@vant/weapp/calendar/index.json | 10 + .../@vant/weapp/calendar/index.wxml | 27 + src/miniprogram_npm/@vant/weapp/calendar/index.wxs | 37 + .../@vant/weapp/calendar/index.wxss | 1 + .../@vant/weapp/calendar/utils.d.ts | 12 + src/miniprogram_npm/@vant/weapp/calendar/utils.js | 97 + src/miniprogram_npm/@vant/weapp/calendar/utils.wxs | 25 + src/miniprogram_npm/@vant/weapp/card/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/card/index.js | 51 + src/miniprogram_npm/@vant/weapp/card/index.json | 6 + src/miniprogram_npm/@vant/weapp/card/index.wxml | 56 + src/miniprogram_npm/@vant/weapp/card/index.wxss | 1 + .../@vant/weapp/cascader/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/cascader/index.js | 228 + .../@vant/weapp/cascader/index.json | 8 + .../@vant/weapp/cascader/index.wxml | 55 + src/miniprogram_npm/@vant/weapp/cascader/index.wxs | 24 + .../@vant/weapp/cascader/index.wxss | 1 + .../@vant/weapp/cell-group/index.d.ts | 1 + .../@vant/weapp/cell-group/index.js | 13 + .../@vant/weapp/cell-group/index.json | 3 + .../@vant/weapp/cell-group/index.wxml | 11 + .../@vant/weapp/cell-group/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/cell/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/cell/index.js | 40 + src/miniprogram_npm/@vant/weapp/cell/index.json | 6 + src/miniprogram_npm/@vant/weapp/cell/index.wxml | 47 + src/miniprogram_npm/@vant/weapp/cell/index.wxs | 17 + src/miniprogram_npm/@vant/weapp/cell/index.wxss | 1 + .../@vant/weapp/checkbox-group/index.d.ts | 1 + .../@vant/weapp/checkbox-group/index.js | 39 + .../@vant/weapp/checkbox-group/index.json | 3 + .../@vant/weapp/checkbox-group/index.wxml | 5 + .../@vant/weapp/checkbox-group/index.wxss | 1 + .../@vant/weapp/checkbox/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/checkbox/index.js | 79 + .../@vant/weapp/checkbox/index.json | 6 + .../@vant/weapp/checkbox/index.wxml | 31 + src/miniprogram_npm/@vant/weapp/checkbox/index.wxs | 20 + .../@vant/weapp/checkbox/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/circle/canvas.d.ts | 4 + src/miniprogram_npm/@vant/weapp/circle/canvas.js | 47 + src/miniprogram_npm/@vant/weapp/circle/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/circle/index.js | 207 + src/miniprogram_npm/@vant/weapp/circle/index.json | 3 + src/miniprogram_npm/@vant/weapp/circle/index.wxml | 9 + src/miniprogram_npm/@vant/weapp/circle/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/col/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/col/index.js | 11 + src/miniprogram_npm/@vant/weapp/col/index.json | 3 + src/miniprogram_npm/@vant/weapp/col/index.wxml | 9 + src/miniprogram_npm/@vant/weapp/col/index.wxs | 18 + src/miniprogram_npm/@vant/weapp/col/index.wxss | 1 + .../@vant/weapp/collapse-item/animate.d.ts | 2 + .../@vant/weapp/collapse-item/animate.js | 43 + .../@vant/weapp/collapse-item/index.d.ts | 1 + .../@vant/weapp/collapse-item/index.js | 63 + .../@vant/weapp/collapse-item/index.json | 6 + .../@vant/weapp/collapse-item/index.wxml | 45 + .../@vant/weapp/collapse-item/index.wxss | 1 + .../@vant/weapp/collapse/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/collapse/index.js | 48 + .../@vant/weapp/collapse/index.json | 3 + .../@vant/weapp/collapse/index.wxml | 3 + .../@vant/weapp/collapse/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/common/color.d.ts | 7 + src/miniprogram_npm/@vant/weapp/common/color.js | 10 + .../@vant/weapp/common/component.d.ts | 4 + .../@vant/weapp/common/component.js | 49 + src/miniprogram_npm/@vant/weapp/common/index.wxss | 1 + .../@vant/weapp/common/relation.d.ts | 15 + src/miniprogram_npm/@vant/weapp/common/relation.js | 65 + .../@vant/weapp/common/style/clearfix.wxss | 1 + .../@vant/weapp/common/style/ellipsis.wxss | 1 + .../@vant/weapp/common/style/hairline.wxss | 1 + .../@vant/weapp/common/style/mixins/clearfix.wxss | 0 .../@vant/weapp/common/style/mixins/ellipsis.wxss | 0 .../@vant/weapp/common/style/mixins/hairline.wxss | 0 .../@vant/weapp/common/style/var.wxss | 0 src/miniprogram_npm/@vant/weapp/common/utils.d.ts | 21 + src/miniprogram_npm/@vant/weapp/common/utils.js | 109 + .../@vant/weapp/common/validator.d.ts | 9 + .../@vant/weapp/common/validator.js | 43 + .../@vant/weapp/common/version.d.ts | 15 + src/miniprogram_npm/@vant/weapp/common/version.js | 70 + .../@vant/weapp/config-provider/index.d.ts | 1 + .../@vant/weapp/config-provider/index.js | 11 + .../@vant/weapp/config-provider/index.json | 3 + .../@vant/weapp/config-provider/index.wxml | 5 + .../@vant/weapp/config-provider/index.wxs | 29 + .../@vant/weapp/count-down/index.d.ts | 1 + .../@vant/weapp/count-down/index.js | 104 + .../@vant/weapp/count-down/index.json | 3 + .../@vant/weapp/count-down/index.wxml | 4 + .../@vant/weapp/count-down/index.wxss | 1 + .../@vant/weapp/count-down/utils.d.ts | 10 + .../@vant/weapp/count-down/utils.js | 64 + .../@vant/weapp/datetime-picker/index.d.ts | 1 + .../@vant/weapp/datetime-picker/index.js | 329 + .../@vant/weapp/datetime-picker/index.json | 6 + .../@vant/weapp/datetime-picker/index.wxml | 16 + .../@vant/weapp/datetime-picker/index.wxss | 1 + .../@vant/weapp/definitions/index.d.ts | 29 + .../@vant/weapp/definitions/index.js | 2 + src/miniprogram_npm/@vant/weapp/dialog/dialog.d.ts | 55 + src/miniprogram_npm/@vant/weapp/dialog/dialog.js | 92 + src/miniprogram_npm/@vant/weapp/dialog/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/dialog/index.js | 136 + src/miniprogram_npm/@vant/weapp/dialog/index.json | 9 + src/miniprogram_npm/@vant/weapp/dialog/index.wxml | 126 + src/miniprogram_npm/@vant/weapp/dialog/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/divider/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/divider/index.js | 14 + src/miniprogram_npm/@vant/weapp/divider/index.json | 4 + src/miniprogram_npm/@vant/weapp/divider/index.wxml | 9 + src/miniprogram_npm/@vant/weapp/divider/index.wxs | 18 + src/miniprogram_npm/@vant/weapp/divider/index.wxss | 1 + .../@vant/weapp/dropdown-item/index.d.ts | 1 + .../@vant/weapp/dropdown-item/index.js | 136 + .../@vant/weapp/dropdown-item/index.json | 8 + .../@vant/weapp/dropdown-item/index.wxml | 50 + .../@vant/weapp/dropdown-item/index.wxss | 1 + .../@vant/weapp/dropdown-item/shared.d.ts | 5 + .../@vant/weapp/dropdown-item/shared.js | 2 + .../@vant/weapp/dropdown-menu/index.d.ts | 1 + .../@vant/weapp/dropdown-menu/index.js | 122 + .../@vant/weapp/dropdown-menu/index.json | 3 + .../@vant/weapp/dropdown-menu/index.wxml | 23 + .../@vant/weapp/dropdown-menu/index.wxs | 16 + .../@vant/weapp/dropdown-menu/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/empty/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/empty/index.js | 12 + src/miniprogram_npm/@vant/weapp/empty/index.json | 4 + src/miniprogram_npm/@vant/weapp/empty/index.wxml | 22 + src/miniprogram_npm/@vant/weapp/empty/index.wxs | 15 + src/miniprogram_npm/@vant/weapp/empty/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/field/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/field/index.js | 152 + src/miniprogram_npm/@vant/weapp/field/index.json | 7 + src/miniprogram_npm/@vant/weapp/field/index.wxml | 56 + src/miniprogram_npm/@vant/weapp/field/index.wxs | 18 + src/miniprogram_npm/@vant/weapp/field/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/field/input.wxml | 31 + src/miniprogram_npm/@vant/weapp/field/props.d.ts | 4 + src/miniprogram_npm/@vant/weapp/field/props.js | 59 + .../@vant/weapp/field/textarea.wxml | 32 + src/miniprogram_npm/@vant/weapp/field/types.d.ts | 8 + src/miniprogram_npm/@vant/weapp/field/types.js | 2 + .../@vant/weapp/goods-action-button/index.d.ts | 1 + .../@vant/weapp/goods-action-button/index.js | 46 + .../@vant/weapp/goods-action-button/index.json | 6 + .../@vant/weapp/goods-action-button/index.wxml | 35 + .../@vant/weapp/goods-action-button/index.wxss | 1 + .../@vant/weapp/goods-action-icon/index.d.ts | 1 + .../@vant/weapp/goods-action-icon/index.js | 29 + .../@vant/weapp/goods-action-icon/index.json | 7 + .../@vant/weapp/goods-action-icon/index.wxml | 41 + .../@vant/weapp/goods-action-icon/index.wxss | 1 + .../@vant/weapp/goods-action/index.d.ts | 1 + .../@vant/weapp/goods-action/index.js | 17 + .../@vant/weapp/goods-action/index.json | 3 + .../@vant/weapp/goods-action/index.wxml | 5 + .../@vant/weapp/goods-action/index.wxss | 1 + .../@vant/weapp/grid-item/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/grid-item/index.js | 54 + .../@vant/weapp/grid-item/index.json | 6 + .../@vant/weapp/grid-item/index.wxml | 27 + .../@vant/weapp/grid-item/index.wxs | 32 + .../@vant/weapp/grid-item/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/grid/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/grid/index.js | 57 + src/miniprogram_npm/@vant/weapp/grid/index.json | 3 + src/miniprogram_npm/@vant/weapp/grid/index.wxml | 8 + src/miniprogram_npm/@vant/weapp/grid/index.wxs | 13 + src/miniprogram_npm/@vant/weapp/grid/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/icon/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/icon/index.js | 23 + src/miniprogram_npm/@vant/weapp/icon/index.json | 6 + src/miniprogram_npm/@vant/weapp/icon/index.wxml | 20 + src/miniprogram_npm/@vant/weapp/icon/index.wxs | 43 + src/miniprogram_npm/@vant/weapp/icon/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/image/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/image/index.js | 66 + src/miniprogram_npm/@vant/weapp/image/index.json | 7 + src/miniprogram_npm/@vant/weapp/image/index.wxml | 35 + src/miniprogram_npm/@vant/weapp/image/index.wxs | 32 + src/miniprogram_npm/@vant/weapp/image/index.wxss | 1 + .../@vant/weapp/index-anchor/index.d.ts | 1 + .../@vant/weapp/index-anchor/index.js | 28 + .../@vant/weapp/index-anchor/index.json | 3 + .../@vant/weapp/index-anchor/index.wxml | 14 + .../@vant/weapp/index-anchor/index.wxss | 1 + .../@vant/weapp/index-bar/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/index-bar/index.js | 243 + .../@vant/weapp/index-bar/index.json | 3 + .../@vant/weapp/index-bar/index.wxml | 22 + .../@vant/weapp/index-bar/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/info/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/info/index.js | 10 + src/miniprogram_npm/@vant/weapp/info/index.json | 3 + src/miniprogram_npm/@vant/weapp/info/index.wxml | 7 + src/miniprogram_npm/@vant/weapp/info/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/loading/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/loading/index.js | 18 + src/miniprogram_npm/@vant/weapp/loading/index.json | 3 + src/miniprogram_npm/@vant/weapp/loading/index.wxml | 19 + src/miniprogram_npm/@vant/weapp/loading/index.wxs | 22 + src/miniprogram_npm/@vant/weapp/loading/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/mixins/basic.d.ts | 1 + src/miniprogram_npm/@vant/weapp/mixins/basic.js | 30 + src/miniprogram_npm/@vant/weapp/mixins/button.d.ts | 1 + src/miniprogram_npm/@vant/weapp/mixins/button.js | 54 + src/miniprogram_npm/@vant/weapp/mixins/link.d.ts | 1 + src/miniprogram_npm/@vant/weapp/mixins/link.js | 27 + .../@vant/weapp/mixins/page-scroll.d.ts | 6 + .../@vant/weapp/mixins/page-scroll.js | 47 + src/miniprogram_npm/@vant/weapp/mixins/touch.d.ts | 1 + src/miniprogram_npm/@vant/weapp/mixins/touch.js | 40 + .../@vant/weapp/mixins/transition.d.ts | 1 + .../@vant/weapp/mixins/transition.js | 144 + src/miniprogram_npm/@vant/weapp/nav-bar/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/nav-bar/index.js | 68 + src/miniprogram_npm/@vant/weapp/nav-bar/index.json | 6 + src/miniprogram_npm/@vant/weapp/nav-bar/index.wxml | 42 + src/miniprogram_npm/@vant/weapp/nav-bar/index.wxs | 13 + src/miniprogram_npm/@vant/weapp/nav-bar/index.wxss | 1 + .../@vant/weapp/notice-bar/index.d.ts | 1 + .../@vant/weapp/notice-bar/index.js | 132 + .../@vant/weapp/notice-bar/index.json | 6 + .../@vant/weapp/notice-bar/index.wxml | 38 + .../@vant/weapp/notice-bar/index.wxs | 15 + .../@vant/weapp/notice-bar/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/notify/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/notify/index.js | 68 + src/miniprogram_npm/@vant/weapp/notify/index.json | 6 + src/miniprogram_npm/@vant/weapp/notify/index.wxml | 21 + src/miniprogram_npm/@vant/weapp/notify/index.wxs | 22 + src/miniprogram_npm/@vant/weapp/notify/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/notify/notify.d.ts | 22 + src/miniprogram_npm/@vant/weapp/notify/notify.js | 67 + src/miniprogram_npm/@vant/weapp/overlay/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/overlay/index.js | 32 + src/miniprogram_npm/@vant/weapp/overlay/index.json | 6 + src/miniprogram_npm/@vant/weapp/overlay/index.wxml | 7 + src/miniprogram_npm/@vant/weapp/overlay/index.wxss | 1 + .../@vant/weapp/overlay/overlay.wxml | 10 + src/miniprogram_npm/@vant/weapp/panel/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/panel/index.js | 11 + src/miniprogram_npm/@vant/weapp/panel/index.json | 6 + src/miniprogram_npm/@vant/weapp/panel/index.wxml | 19 + src/miniprogram_npm/@vant/weapp/panel/index.wxss | 1 + .../@vant/weapp/picker-column/index.d.ts | 1 + .../@vant/weapp/picker-column/index.js | 122 + .../@vant/weapp/picker-column/index.json | 3 + .../@vant/weapp/picker-column/index.wxml | 23 + .../@vant/weapp/picker-column/index.wxs | 36 + .../@vant/weapp/picker-column/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/picker/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/picker/index.js | 161 + src/miniprogram_npm/@vant/weapp/picker/index.json | 7 + src/miniprogram_npm/@vant/weapp/picker/index.wxml | 37 + src/miniprogram_npm/@vant/weapp/picker/index.wxs | 42 + src/miniprogram_npm/@vant/weapp/picker/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/picker/shared.d.ts | 21 + src/miniprogram_npm/@vant/weapp/picker/shared.js | 24 + .../@vant/weapp/picker/toolbar.wxml | 23 + src/miniprogram_npm/@vant/weapp/popup/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/popup/index.js | 99 + src/miniprogram_npm/@vant/weapp/popup/index.json | 7 + src/miniprogram_npm/@vant/weapp/popup/index.wxml | 21 + src/miniprogram_npm/@vant/weapp/popup/index.wxs | 18 + src/miniprogram_npm/@vant/weapp/popup/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/popup/popup.wxml | 16 + .../@vant/weapp/progress/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/progress/index.js | 55 + .../@vant/weapp/progress/index.json | 3 + .../@vant/weapp/progress/index.wxml | 20 + src/miniprogram_npm/@vant/weapp/progress/index.wxs | 36 + .../@vant/weapp/progress/index.wxss | 1 + .../@vant/weapp/radio-group/index.d.ts | 1 + .../@vant/weapp/radio-group/index.js | 24 + .../@vant/weapp/radio-group/index.json | 3 + .../@vant/weapp/radio-group/index.wxml | 5 + .../@vant/weapp/radio-group/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/radio/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/radio/index.js | 68 + src/miniprogram_npm/@vant/weapp/radio/index.json | 6 + src/miniprogram_npm/@vant/weapp/radio/index.wxml | 30 + src/miniprogram_npm/@vant/weapp/radio/index.wxs | 33 + src/miniprogram_npm/@vant/weapp/radio/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/rate/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/rate/index.js | 93 + src/miniprogram_npm/@vant/weapp/rate/index.json | 6 + src/miniprogram_npm/@vant/weapp/rate/index.wxml | 35 + src/miniprogram_npm/@vant/weapp/rate/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/row/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/row/index.js | 26 + src/miniprogram_npm/@vant/weapp/row/index.json | 3 + src/miniprogram_npm/@vant/weapp/row/index.wxml | 5 + src/miniprogram_npm/@vant/weapp/row/index.wxs | 18 + src/miniprogram_npm/@vant/weapp/row/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/search/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/search/index.js | 100 + src/miniprogram_npm/@vant/weapp/search/index.json | 6 + src/miniprogram_npm/@vant/weapp/search/index.wxml | 54 + src/miniprogram_npm/@vant/weapp/search/index.wxss | 1 + .../@vant/weapp/share-sheet/index.d.ts | 1 + .../@vant/weapp/share-sheet/index.js | 61 + .../@vant/weapp/share-sheet/index.json | 7 + .../@vant/weapp/share-sheet/index.wxml | 47 + .../@vant/weapp/share-sheet/index.wxs | 12 + .../@vant/weapp/share-sheet/index.wxss | 1 + .../@vant/weapp/share-sheet/options.d.ts | 1 + .../@vant/weapp/share-sheet/options.js | 27 + .../@vant/weapp/share-sheet/options.json | 3 + .../@vant/weapp/share-sheet/options.wxml | 20 + .../@vant/weapp/share-sheet/options.wxs | 14 + .../@vant/weapp/share-sheet/options.wxss | 1 + .../@vant/weapp/sidebar-item/index.d.ts | 1 + .../@vant/weapp/sidebar-item/index.js | 32 + .../@vant/weapp/sidebar-item/index.json | 6 + .../@vant/weapp/sidebar-item/index.wxml | 18 + .../@vant/weapp/sidebar-item/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/sidebar/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/sidebar/index.js | 36 + src/miniprogram_npm/@vant/weapp/sidebar/index.json | 3 + src/miniprogram_npm/@vant/weapp/sidebar/index.wxml | 3 + src/miniprogram_npm/@vant/weapp/sidebar/index.wxss | 1 + .../@vant/weapp/skeleton/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/skeleton/index.js | 48 + .../@vant/weapp/skeleton/index.json | 4 + .../@vant/weapp/skeleton/index.wxml | 29 + .../@vant/weapp/skeleton/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/slider/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/slider/index.js | 206 + src/miniprogram_npm/@vant/weapp/slider/index.json | 3 + src/miniprogram_npm/@vant/weapp/slider/index.wxml | 68 + src/miniprogram_npm/@vant/weapp/slider/index.wxs | 14 + src/miniprogram_npm/@vant/weapp/slider/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/stepper/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/stepper/index.js | 199 + src/miniprogram_npm/@vant/weapp/stepper/index.json | 3 + src/miniprogram_npm/@vant/weapp/stepper/index.wxml | 43 + src/miniprogram_npm/@vant/weapp/stepper/index.wxs | 22 + src/miniprogram_npm/@vant/weapp/stepper/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/steps/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/steps/index.js | 35 + src/miniprogram_npm/@vant/weapp/steps/index.json | 6 + src/miniprogram_npm/@vant/weapp/steps/index.wxml | 54 + src/miniprogram_npm/@vant/weapp/steps/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/sticky/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/sticky/index.js | 126 + src/miniprogram_npm/@vant/weapp/sticky/index.json | 3 + src/miniprogram_npm/@vant/weapp/sticky/index.wxml | 8 + src/miniprogram_npm/@vant/weapp/sticky/index.wxs | 25 + src/miniprogram_npm/@vant/weapp/sticky/index.wxss | 1 + .../@vant/weapp/submit-bar/index.d.ts | 1 + .../@vant/weapp/submit-bar/index.js | 58 + .../@vant/weapp/submit-bar/index.json | 7 + .../@vant/weapp/submit-bar/index.wxml | 44 + .../@vant/weapp/submit-bar/index.wxss | 1 + .../@vant/weapp/swipe-cell/index.d.ts | 1 + .../@vant/weapp/swipe-cell/index.js | 135 + .../@vant/weapp/swipe-cell/index.json | 3 + .../@vant/weapp/swipe-cell/index.wxml | 20 + .../@vant/weapp/swipe-cell/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/switch/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/switch/index.js | 38 + src/miniprogram_npm/@vant/weapp/switch/index.json | 6 + src/miniprogram_npm/@vant/weapp/switch/index.wxml | 16 + src/miniprogram_npm/@vant/weapp/switch/index.wxs | 26 + src/miniprogram_npm/@vant/weapp/switch/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/tab/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/tab/index.js | 58 + src/miniprogram_npm/@vant/weapp/tab/index.json | 3 + src/miniprogram_npm/@vant/weapp/tab/index.wxml | 8 + src/miniprogram_npm/@vant/weapp/tab/index.wxss | 1 + .../@vant/weapp/tabbar-item/index.d.ts | 1 + .../@vant/weapp/tabbar-item/index.js | 70 + .../@vant/weapp/tabbar-item/index.json | 7 + .../@vant/weapp/tabbar-item/index.wxml | 28 + .../@vant/weapp/tabbar-item/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/tabbar/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/tabbar/index.js | 68 + src/miniprogram_npm/@vant/weapp/tabbar/index.json | 3 + src/miniprogram_npm/@vant/weapp/tabbar/index.wxml | 10 + src/miniprogram_npm/@vant/weapp/tabbar/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/tabs/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/tabs/index.js | 327 + src/miniprogram_npm/@vant/weapp/tabs/index.json | 7 + src/miniprogram_npm/@vant/weapp/tabs/index.wxml | 63 + src/miniprogram_npm/@vant/weapp/tabs/index.wxs | 83 + src/miniprogram_npm/@vant/weapp/tabs/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/tag/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/tag/index.js | 23 + src/miniprogram_npm/@vant/weapp/tag/index.json | 6 + src/miniprogram_npm/@vant/weapp/tag/index.wxml | 15 + src/miniprogram_npm/@vant/weapp/tag/index.wxs | 13 + src/miniprogram_npm/@vant/weapp/tag/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/toast/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/toast/index.js | 31 + src/miniprogram_npm/@vant/weapp/toast/index.json | 9 + src/miniprogram_npm/@vant/weapp/toast/index.wxml | 36 + src/miniprogram_npm/@vant/weapp/toast/index.wxss | 1 + src/miniprogram_npm/@vant/weapp/toast/toast.d.ts | 28 + src/miniprogram_npm/@vant/weapp/toast/toast.js | 83 + .../@vant/weapp/transition/index.d.ts | 1 + .../@vant/weapp/transition/index.js | 15 + .../@vant/weapp/transition/index.json | 3 + .../@vant/weapp/transition/index.wxml | 10 + .../@vant/weapp/transition/index.wxs | 17 + .../@vant/weapp/transition/index.wxss | 1 + .../@vant/weapp/tree-select/index.d.ts | 1 + .../@vant/weapp/tree-select/index.js | 70 + .../@vant/weapp/tree-select/index.json | 8 + .../@vant/weapp/tree-select/index.wxml | 41 + .../@vant/weapp/tree-select/index.wxs | 12 + .../@vant/weapp/tree-select/index.wxss | 1 + .../@vant/weapp/uploader/index.d.ts | 1 + src/miniprogram_npm/@vant/weapp/uploader/index.js | 185 + .../@vant/weapp/uploader/index.json | 7 + .../@vant/weapp/uploader/index.wxml | 85 + src/miniprogram_npm/@vant/weapp/uploader/index.wxs | 17 + .../@vant/weapp/uploader/index.wxss | 1 + .../@vant/weapp/uploader/shared.d.ts | 61 + src/miniprogram_npm/@vant/weapp/uploader/shared.js | 68 + .../@vant/weapp/uploader/utils.d.ts | 24 + src/miniprogram_npm/@vant/weapp/uploader/utils.js | 112 + src/miniprogram_npm/@vant/weapp/wxs/add-unit.wxs | 12 + src/miniprogram_npm/@vant/weapp/wxs/array.wxs | 5 + src/miniprogram_npm/@vant/weapp/wxs/bem.wxs | 39 + src/miniprogram_npm/@vant/weapp/wxs/memoize.wxs | 55 + src/miniprogram_npm/@vant/weapp/wxs/object.wxs | 13 + src/miniprogram_npm/@vant/weapp/wxs/style.wxs | 42 + src/miniprogram_npm/@vant/weapp/wxs/utils.wxs | 10 + src/miniprogram_npm/a-calc/index.js | 14 + src/miniprogram_npm/a-calc/index.js.map | 1 + src/miniprogram_npm/dayjs/index.js | 13 + src/miniprogram_npm/dayjs/index.js.map | 1 + src/miniprogram_npm/echarts/index.js | 85965 +++++++++++++++++++ src/miniprogram_npm/echarts/index.js.map | 1 + src/miniprogram_npm/miniprogram-licia/Benchmark.js | 244 + .../miniprogram-licia/BloomFilter.js | 46 + src/miniprogram_npm/miniprogram-licia/Caseless.js | 35 + src/miniprogram_npm/miniprogram-licia/Channel.js | 48 + src/miniprogram_npm/miniprogram-licia/Class.js | 64 + src/miniprogram_npm/miniprogram-licia/Color.js | 95 + src/miniprogram_npm/miniprogram-licia/Delegator.js | 48 + .../miniprogram-licia/Dispatcher.js | 55 + src/miniprogram_npm/miniprogram-licia/Emitter.js | 65 + src/miniprogram_npm/miniprogram-licia/Enum.js | 31 + src/miniprogram_npm/miniprogram-licia/HashTable.js | 61 + src/miniprogram_npm/miniprogram-licia/Heap.js | 79 + .../miniprogram-licia/HeapSnapshot.js | 111 + src/miniprogram_npm/miniprogram-licia/I18n.js | 38 + .../miniprogram-licia/JsonTransformer.js | 68 + .../miniprogram-licia/LinkedList.js | 112 + src/miniprogram_npm/miniprogram-licia/Logger.js | 69 + src/miniprogram_npm/miniprogram-licia/Lru.js | 63 + .../miniprogram-licia/PriorityQueue.js | 39 + src/miniprogram_npm/miniprogram-licia/Promise.js | 178 + src/miniprogram_npm/miniprogram-licia/PseudoMap.js | 64 + src/miniprogram_npm/miniprogram-licia/Queue.js | 35 + src/miniprogram_npm/miniprogram-licia/QuickLru.js | 49 + src/miniprogram_npm/miniprogram-licia/Readiness.js | 59 + .../miniprogram-licia/ReduceStore.js | 41 + src/miniprogram_npm/miniprogram-licia/Semaphore.js | 28 + .../miniprogram-licia/SingleEmitter.js | 48 + src/miniprogram_npm/miniprogram-licia/Stack.js | 35 + src/miniprogram_npm/miniprogram-licia/State.js | 45 + src/miniprogram_npm/miniprogram-licia/Store.js | 58 + src/miniprogram_npm/miniprogram-licia/Trace.js | 157 + src/miniprogram_npm/miniprogram-licia/Tracing.js | 227 + src/miniprogram_npm/miniprogram-licia/Trie.js | 90 + src/miniprogram_npm/miniprogram-licia/Tween.js | 98 + src/miniprogram_npm/miniprogram-licia/Url.js | 125 + src/miniprogram_npm/miniprogram-licia/Validator.js | 82 + src/miniprogram_npm/miniprogram-licia/Wrr.js | 86 + src/miniprogram_npm/miniprogram-licia/abbrev.js | 28 + src/miniprogram_npm/miniprogram-licia/after.js | 7 + src/miniprogram_npm/miniprogram-licia/allKeys.js | 42 + src/miniprogram_npm/miniprogram-licia/arrToMap.js | 14 + src/miniprogram_npm/miniprogram-licia/atob.js | 21 + src/miniprogram_npm/miniprogram-licia/average.js | 9 + src/miniprogram_npm/miniprogram-licia/base64.js | 83 + src/miniprogram_npm/miniprogram-licia/before.js | 10 + .../miniprogram-licia/binarySearch.js | 24 + src/miniprogram_npm/miniprogram-licia/bind.js | 8 + src/miniprogram_npm/miniprogram-licia/btoa.js | 23 + .../miniprogram-licia/bubbleSort.js | 18 + .../miniprogram-licia/bytesToStr.js | 22 + .../miniprogram-licia/bytesToWords.js | 9 + .../miniprogram-licia/callbackify.js | 17 + src/miniprogram_npm/miniprogram-licia/camelCase.js | 16 + .../miniprogram-licia/capitalize.js | 5 + src/miniprogram_npm/miniprogram-licia/castPath.js | 16 + .../miniprogram-licia/centerAlign.js | 21 + src/miniprogram_npm/miniprogram-licia/char.js | 5 + src/miniprogram_npm/miniprogram-licia/chunk.js | 12 + src/miniprogram_npm/miniprogram-licia/clamp.js | 12 + src/miniprogram_npm/miniprogram-licia/className.js | 20 + src/miniprogram_npm/miniprogram-licia/clone.js | 9 + src/miniprogram_npm/miniprogram-licia/cloneDeep.js | 19 + .../miniprogram-licia/cmpVersion.js | 16 + src/miniprogram_npm/miniprogram-licia/combine.js | 9 + src/miniprogram_npm/miniprogram-licia/compact.js | 8 + src/miniprogram_npm/miniprogram-licia/compose.js | 11 + src/miniprogram_npm/miniprogram-licia/concat.js | 11 + src/miniprogram_npm/miniprogram-licia/contain.js | 11 + .../miniprogram-licia/convertBase.js | 5 + .../miniprogram-licia/convertBin.js | 60 + src/miniprogram_npm/miniprogram-licia/crc1.js | 19 + src/miniprogram_npm/miniprogram-licia/crc16.js | 276 + src/miniprogram_npm/miniprogram-licia/crc32.js | 29 + src/miniprogram_npm/miniprogram-licia/crc8.js | 276 + src/miniprogram_npm/miniprogram-licia/create.js | 11 + .../miniprogram-licia/createAssigner.js | 16 + src/miniprogram_npm/miniprogram-licia/css.js | 329 + .../miniprogram-licia/cssPriority.js | 63 + src/miniprogram_npm/miniprogram-licia/curry.js | 15 + src/miniprogram_npm/miniprogram-licia/dataUrl.js | 68 + src/miniprogram_npm/miniprogram-licia/dataView.js | 75 + .../miniprogram-licia/dateFormat.js | 142 + src/miniprogram_npm/miniprogram-licia/debounce.js | 15 + src/miniprogram_npm/miniprogram-licia/deburr.js | 206 + .../miniprogram-licia/decodeUriComponent.js | 31 + src/miniprogram_npm/miniprogram-licia/defaults.js | 5 + src/miniprogram_npm/miniprogram-licia/define.js | 17 + .../miniprogram-licia/defineProp.js | 26 + src/miniprogram_npm/miniprogram-licia/defined.js | 8 + src/miniprogram_npm/miniprogram-licia/delay.js | 8 + src/miniprogram_npm/miniprogram-licia/deprecate.js | 36 + .../miniprogram-licia/detectBrowser.js | 51 + .../miniprogram-licia/detectMocha.js | 11 + src/miniprogram_npm/miniprogram-licia/detectOs.js | 39 + .../miniprogram-licia/difference.js | 12 + src/miniprogram_npm/miniprogram-licia/dotCase.js | 6 + .../miniprogram-licia/durationFormat.js | 39 + src/miniprogram_npm/miniprogram-licia/each.js | 18 + src/miniprogram_npm/miniprogram-licia/easing.js | 63 + src/miniprogram_npm/miniprogram-licia/endWith.js | 6 + src/miniprogram_npm/miniprogram-licia/escape.js | 20 + .../miniprogram-licia/escapeJsStr.js | 24 + .../miniprogram-licia/escapeRegExp.js | 5 + src/miniprogram_npm/miniprogram-licia/every.js | 15 + src/miniprogram_npm/miniprogram-licia/extend.js | 5 + .../miniprogram-licia/extendDeep.js | 28 + src/miniprogram_npm/miniprogram-licia/extendOwn.js | 5 + .../miniprogram-licia/extractBlockCmts.js | 17 + .../miniprogram-licia/extractUrls.js | 15 + src/miniprogram_npm/miniprogram-licia/fibonacci.js | 6 + src/miniprogram_npm/miniprogram-licia/fileSize.js | 25 + src/miniprogram_npm/miniprogram-licia/fileType.js | 148 + src/miniprogram_npm/miniprogram-licia/fileUrl.js | 13 + src/miniprogram_npm/miniprogram-licia/fill.js | 11 + src/miniprogram_npm/miniprogram-licia/filter.js | 12 + src/miniprogram_npm/miniprogram-licia/find.js | 11 + src/miniprogram_npm/miniprogram-licia/findIdx.js | 14 + src/miniprogram_npm/miniprogram-licia/findKey.js | 13 + .../miniprogram-licia/findLastIdx.js | 6 + src/miniprogram_npm/miniprogram-licia/flatten.js | 16 + src/miniprogram_npm/miniprogram-licia/fnArgs.js | 68 + src/miniprogram_npm/miniprogram-licia/fnParams.js | 26 + src/miniprogram_npm/miniprogram-licia/fnv1a.js | 11 + src/miniprogram_npm/miniprogram-licia/format.js | 45 + src/miniprogram_npm/miniprogram-licia/fraction.js | 17 + src/miniprogram_npm/miniprogram-licia/freeze.js | 14 + .../miniprogram-licia/freezeDeep.js | 13 + .../miniprogram-licia/fuzzySearch.js | 55 + src/miniprogram_npm/miniprogram-licia/gcd.js | 6 + src/miniprogram_npm/miniprogram-licia/getProto.js | 14 + .../miniprogram-licia/getUrlParam.js | 6 + src/miniprogram_npm/miniprogram-licia/golangify.js | 26 + src/miniprogram_npm/miniprogram-licia/has.js | 6 + src/miniprogram_npm/miniprogram-licia/heapSort.js | 19 + src/miniprogram_npm/miniprogram-licia/hex.js | 23 + src/miniprogram_npm/miniprogram-licia/highlight.js | 135 + src/miniprogram_npm/miniprogram-licia/hookFn.js | 40 + src/miniprogram_npm/miniprogram-licia/hslToRgb.js | 40 + src/miniprogram_npm/miniprogram-licia/html.js | 84 + src/miniprogram_npm/miniprogram-licia/identity.js | 5 + src/miniprogram_npm/miniprogram-licia/idxOf.js | 5 + src/miniprogram_npm/miniprogram-licia/indent.js | 16 + src/miniprogram_npm/miniprogram-licia/index.js | 361 + src/miniprogram_npm/miniprogram-licia/inherits.js | 6 + src/miniprogram_npm/miniprogram-licia/ini.js | 90 + .../miniprogram-licia/insertionSort.js | 20 + src/miniprogram_npm/miniprogram-licia/intersect.js | 19 + .../miniprogram-licia/intersectRange.js | 11 + src/miniprogram_npm/miniprogram-licia/invariant.js | 35 + src/miniprogram_npm/miniprogram-licia/invert.js | 10 + .../miniprogram-licia/isAbsoluteUrl.js | 6 + src/miniprogram_npm/miniprogram-licia/isArgs.js | 6 + src/miniprogram_npm/miniprogram-licia/isArr.js | 10 + .../miniprogram-licia/isArrBuffer.js | 6 + src/miniprogram_npm/miniprogram-licia/isArrLike.js | 10 + src/miniprogram_npm/miniprogram-licia/isAsyncFn.js | 6 + src/miniprogram_npm/miniprogram-licia/isBool.js | 5 + src/miniprogram_npm/miniprogram-licia/isBrowser.js | 6 + src/miniprogram_npm/miniprogram-licia/isBuffer.js | 12 + src/miniprogram_npm/miniprogram-licia/isClose.js | 10 + src/miniprogram_npm/miniprogram-licia/isCyclic.js | 38 + src/miniprogram_npm/miniprogram-licia/isDataUrl.js | 8 + src/miniprogram_npm/miniprogram-licia/isDate.js | 6 + src/miniprogram_npm/miniprogram-licia/isEmail.js | 6 + src/miniprogram_npm/miniprogram-licia/isEmpty.js | 14 + src/miniprogram_npm/miniprogram-licia/isEqual.js | 75 + src/miniprogram_npm/miniprogram-licia/isErr.js | 12 + src/miniprogram_npm/miniprogram-licia/isEven.js | 7 + src/miniprogram_npm/miniprogram-licia/isFinite.js | 8 + src/miniprogram_npm/miniprogram-licia/isFn.js | 11 + .../miniprogram-licia/isFullWidth.js | 29 + .../miniprogram-licia/isGeneratorFn.js | 6 + src/miniprogram_npm/miniprogram-licia/isInt.js | 6 + src/miniprogram_npm/miniprogram-licia/isIp.js | 54 + src/miniprogram_npm/miniprogram-licia/isJson.js | 10 + .../miniprogram-licia/isLeapYear.js | 5 + src/miniprogram_npm/miniprogram-licia/isMac.js | 4 + src/miniprogram_npm/miniprogram-licia/isMap.js | 6 + src/miniprogram_npm/miniprogram-licia/isMatch.js | 14 + .../miniprogram-licia/isMiniProgram.js | 5 + src/miniprogram_npm/miniprogram-licia/isMobile.js | 10 + src/miniprogram_npm/miniprogram-licia/isNaN.js | 6 + src/miniprogram_npm/miniprogram-licia/isNative.js | 23 + src/miniprogram_npm/miniprogram-licia/isNil.js | 5 + src/miniprogram_npm/miniprogram-licia/isNode.js | 5 + src/miniprogram_npm/miniprogram-licia/isNull.js | 5 + src/miniprogram_npm/miniprogram-licia/isNum.js | 6 + src/miniprogram_npm/miniprogram-licia/isNumeric.js | 11 + src/miniprogram_npm/miniprogram-licia/isObj.js | 6 + src/miniprogram_npm/miniprogram-licia/isOdd.js | 7 + .../miniprogram-licia/isPlainObj.js | 13 + src/miniprogram_npm/miniprogram-licia/isPrime.js | 11 + .../miniprogram-licia/isPrimitive.js | 6 + src/miniprogram_npm/miniprogram-licia/isPromise.js | 7 + src/miniprogram_npm/miniprogram-licia/isRegExp.js | 6 + .../miniprogram-licia/isRelative.js | 6 + src/miniprogram_npm/miniprogram-licia/isSet.js | 6 + src/miniprogram_npm/miniprogram-licia/isSorted.js | 17 + src/miniprogram_npm/miniprogram-licia/isStr.js | 6 + .../miniprogram-licia/isStrBlank.js | 18 + src/miniprogram_npm/miniprogram-licia/isSymbol.js | 5 + .../miniprogram-licia/isTypedArr.js | 24 + src/miniprogram_npm/miniprogram-licia/isUndef.js | 5 + src/miniprogram_npm/miniprogram-licia/isUrl.js | 6 + src/miniprogram_npm/miniprogram-licia/isWeakMap.js | 6 + src/miniprogram_npm/miniprogram-licia/isWeakSet.js | 6 + src/miniprogram_npm/miniprogram-licia/isWindows.js | 4 + src/miniprogram_npm/miniprogram-licia/jsonClone.js | 5 + src/miniprogram_npm/miniprogram-licia/kebabCase.js | 6 + src/miniprogram_npm/miniprogram-licia/keyCode.js | 61 + src/miniprogram_npm/miniprogram-licia/keys.js | 14 + src/miniprogram_npm/miniprogram-licia/last.js | 6 + .../miniprogram-licia/levenshtein.js | 59 + src/miniprogram_npm/miniprogram-licia/linkify.js | 16 + src/miniprogram_npm/miniprogram-licia/longest.js | 16 + src/miniprogram_npm/miniprogram-licia/lowerCase.js | 6 + src/miniprogram_npm/miniprogram-licia/lpad.js | 11 + src/miniprogram_npm/miniprogram-licia/ltrim.js | 30 + src/miniprogram_npm/miniprogram-licia/map.js | 16 + src/miniprogram_npm/miniprogram-licia/mapObj.js | 15 + src/miniprogram_npm/miniprogram-licia/matcher.js | 10 + src/miniprogram_npm/miniprogram-licia/max.js | 10 + src/miniprogram_npm/miniprogram-licia/md5.js | 140 + .../miniprogram-licia/memStorage.js | 53 + src/miniprogram_npm/miniprogram-licia/memoize.js | 13 + src/miniprogram_npm/miniprogram-licia/mergeArr.js | 14 + src/miniprogram_npm/miniprogram-licia/mergeSort.js | 26 + src/miniprogram_npm/miniprogram-licia/methods.js | 10 + src/miniprogram_npm/miniprogram-licia/mime.js | 83 + src/miniprogram_npm/miniprogram-licia/min.js | 10 + src/miniprogram_npm/miniprogram-licia/moment.js | 256 + src/miniprogram_npm/miniprogram-licia/morse.js | 80 + src/miniprogram_npm/miniprogram-licia/ms.js | 31 + .../miniprogram-licia/naturalSort.js | 61 + src/miniprogram_npm/miniprogram-licia/negate.js | 7 + src/miniprogram_npm/miniprogram-licia/nextTick.js | 18 + src/miniprogram_npm/miniprogram-licia/noop.js | 3 + .../miniprogram-licia/normalizeHeader.js | 21 + .../miniprogram-licia/normalizePath.js | 6 + .../miniprogram-licia/normalizePhone.js | 22 + src/miniprogram_npm/miniprogram-licia/now.js | 9 + src/miniprogram_npm/miniprogram-licia/objToStr.js | 6 + src/miniprogram_npm/miniprogram-licia/omit.js | 6 + src/miniprogram_npm/miniprogram-licia/once.js | 5 + .../miniprogram-licia/optimizeCb.js | 23 + src/miniprogram_npm/miniprogram-licia/ordinal.js | 17 + src/miniprogram_npm/miniprogram-licia/pad.js | 15 + src/miniprogram_npm/miniprogram-licia/pairs.js | 12 + src/miniprogram_npm/miniprogram-licia/parallel.js | 26 + src/miniprogram_npm/miniprogram-licia/parseArgs.js | 72 + src/miniprogram_npm/miniprogram-licia/parseHtml.js | 105 + src/miniprogram_npm/miniprogram-licia/partial.js | 12 + .../miniprogram-licia/pascalCase.js | 7 + src/miniprogram_npm/miniprogram-licia/perfNow.js | 26 + src/miniprogram_npm/miniprogram-licia/pick.js | 26 + src/miniprogram_npm/miniprogram-licia/pluck.js | 7 + src/miniprogram_npm/miniprogram-licia/precision.js | 11 + src/miniprogram_npm/miniprogram-licia/promisify.js | 18 + src/miniprogram_npm/miniprogram-licia/property.js | 15 + src/miniprogram_npm/miniprogram-licia/query.js | 50 + src/miniprogram_npm/miniprogram-licia/quickSort.js | 32 + src/miniprogram_npm/miniprogram-licia/raf.js | 39 + src/miniprogram_npm/miniprogram-licia/random.js | 18 + .../miniprogram-licia/randomBytes.js | 26 + .../miniprogram-licia/randomColor.js | 60 + src/miniprogram_npm/miniprogram-licia/randomId.js | 20 + .../miniprogram-licia/randomItem.js | 6 + src/miniprogram_npm/miniprogram-licia/range.js | 13 + src/miniprogram_npm/miniprogram-licia/rc4.js | 46 + src/miniprogram_npm/miniprogram-licia/reduce.js | 38 + .../miniprogram-licia/reduceRight.js | 4 + src/miniprogram_npm/miniprogram-licia/reject.js | 9 + src/miniprogram_npm/miniprogram-licia/remove.js | 18 + src/miniprogram_npm/miniprogram-licia/repeat.js | 12 + .../miniprogram-licia/replaceAll.js | 6 + src/miniprogram_npm/miniprogram-licia/restArgs.js | 24 + src/miniprogram_npm/miniprogram-licia/reverse.js | 11 + src/miniprogram_npm/miniprogram-licia/rgbToHsl.js | 37 + src/miniprogram_npm/miniprogram-licia/root.js | 4 + src/miniprogram_npm/miniprogram-licia/rpad.js | 11 + src/miniprogram_npm/miniprogram-licia/rtrim.js | 28 + src/miniprogram_npm/miniprogram-licia/safeCb.js | 15 + src/miniprogram_npm/miniprogram-licia/safeDel.js | 16 + src/miniprogram_npm/miniprogram-licia/safeGet.js | 15 + src/miniprogram_npm/miniprogram-licia/safeSet.js | 29 + .../miniprogram-licia/sameOrigin.js | 14 + src/miniprogram_npm/miniprogram-licia/sample.js | 18 + .../miniprogram-licia/seedRandom.js | 18 + .../miniprogram-licia/selectionSort.js | 23 + src/miniprogram_npm/miniprogram-licia/selector.js | 137 + src/miniprogram_npm/miniprogram-licia/shebang.js | 9 + src/miniprogram_npm/miniprogram-licia/shellSort.js | 25 + src/miniprogram_npm/miniprogram-licia/shuffle.js | 6 + src/miniprogram_npm/miniprogram-licia/singleton.js | 23 + src/miniprogram_npm/miniprogram-licia/size.js | 7 + src/miniprogram_npm/miniprogram-licia/sizeof.js | 47 + src/miniprogram_npm/miniprogram-licia/sleep.js | 7 + src/miniprogram_npm/miniprogram-licia/slice.js | 22 + src/miniprogram_npm/miniprogram-licia/slugify.js | 27 + src/miniprogram_npm/miniprogram-licia/snakeCase.js | 6 + src/miniprogram_npm/miniprogram-licia/some.js | 15 + src/miniprogram_npm/miniprogram-licia/sortBy.js | 28 + src/miniprogram_npm/miniprogram-licia/sortKeys.js | 56 + src/miniprogram_npm/miniprogram-licia/spaceCase.js | 6 + src/miniprogram_npm/miniprogram-licia/splitCase.js | 13 + src/miniprogram_npm/miniprogram-licia/splitPath.js | 11 + src/miniprogram_npm/miniprogram-licia/startWith.js | 5 + src/miniprogram_npm/miniprogram-licia/strHash.js | 10 + .../miniprogram-licia/strToBytes.js | 21 + src/miniprogram_npm/miniprogram-licia/strTpl.js | 10 + src/miniprogram_npm/miniprogram-licia/strWidth.js | 17 + src/miniprogram_npm/miniprogram-licia/stringify.js | 44 + .../miniprogram-licia/stringifyAll.js | 403 + src/miniprogram_npm/miniprogram-licia/stripAnsi.js | 6 + src/miniprogram_npm/miniprogram-licia/stripBom.js | 8 + src/miniprogram_npm/miniprogram-licia/stripCmt.js | 56 + .../miniprogram-licia/stripColor.js | 6 + .../miniprogram-licia/stripHtmlTag.js | 6 + .../miniprogram-licia/stripIndent.js | 40 + src/miniprogram_npm/miniprogram-licia/stripNum.js | 7 + src/miniprogram_npm/miniprogram-licia/sum.js | 8 + src/miniprogram_npm/miniprogram-licia/swap.js | 8 + src/miniprogram_npm/miniprogram-licia/table.js | 232 + src/miniprogram_npm/miniprogram-licia/throttle.js | 6 + src/miniprogram_npm/miniprogram-licia/timeAgo.js | 42 + src/miniprogram_npm/miniprogram-licia/timeTaken.js | 8 + src/miniprogram_npm/miniprogram-licia/times.js | 11 + src/miniprogram_npm/miniprogram-licia/toArr.js | 12 + src/miniprogram_npm/miniprogram-licia/toAsync.js | 52 + src/miniprogram_npm/miniprogram-licia/toBool.js | 10 + src/miniprogram_npm/miniprogram-licia/toDate.js | 14 + src/miniprogram_npm/miniprogram-licia/toInt.js | 8 + src/miniprogram_npm/miniprogram-licia/toNum.js | 15 + src/miniprogram_npm/miniprogram-licia/toSrc.js | 14 + src/miniprogram_npm/miniprogram-licia/toStr.js | 5 + src/miniprogram_npm/miniprogram-licia/topoSort.js | 43 + src/miniprogram_npm/miniprogram-licia/trim.js | 10 + src/miniprogram_npm/miniprogram-licia/truncate.js | 27 + src/miniprogram_npm/miniprogram-licia/tryIt.js | 12 + src/miniprogram_npm/miniprogram-licia/type.js | 24 + src/miniprogram_npm/miniprogram-licia/types.js | 3 + src/miniprogram_npm/miniprogram-licia/ucs2.js | 37 + src/miniprogram_npm/miniprogram-licia/unescape.js | 15 + src/miniprogram_npm/miniprogram-licia/union.js | 8 + src/miniprogram_npm/miniprogram-licia/uniqId.js | 7 + src/miniprogram_npm/miniprogram-licia/unique.js | 16 + .../miniprogram-licia/universalify.js | 31 + src/miniprogram_npm/miniprogram-licia/unzip.js | 18 + src/miniprogram_npm/miniprogram-licia/upperCase.js | 6 + .../miniprogram-licia/upperFirst.js | 6 + src/miniprogram_npm/miniprogram-licia/use.js | 29 + src/miniprogram_npm/miniprogram-licia/utf8.js | 127 + src/miniprogram_npm/miniprogram-licia/uuid.js | 34 + src/miniprogram_npm/miniprogram-licia/values.js | 10 + src/miniprogram_npm/miniprogram-licia/vlq.js | 69 + src/miniprogram_npm/miniprogram-licia/waitUntil.js | 36 + src/miniprogram_npm/miniprogram-licia/waterfall.js | 27 + src/miniprogram_npm/miniprogram-licia/wordWrap.js | 49 + .../miniprogram-licia/wordsToBytes.js | 9 + src/miniprogram_npm/miniprogram-licia/wrap.js | 6 + src/miniprogram_npm/miniprogram-licia/wx.js | 69 + src/miniprogram_npm/miniprogram-licia/zip.js | 5 + src/miniprogram_npm/mp-html/index.js | 8 + src/miniprogram_npm/mp-html/index.json | 1 + src/miniprogram_npm/mp-html/index.wxml | 1 + src/miniprogram_npm/mp-html/index.wxss | 1 + src/miniprogram_npm/mp-html/node/node.js | 1 + src/miniprogram_npm/mp-html/node/node.json | 1 + src/miniprogram_npm/mp-html/node/node.wxml | 1 + src/miniprogram_npm/mp-html/node/node.wxss | 1 + src/miniprogram_npm/mp-html/parser.js | 1 + src/miniprogram_npm/number-precision/index.js | 177 + src/miniprogram_npm/number-precision/index.js.map | 1 + src/miniprogram_npm/tslib/index.js | 319 + src/miniprogram_npm/tslib/index.js.map | 1 + src/pages/index/index.json | 8 + src/pages/index/index.scss | 6 + src/pages/index/index.ts | 243 + src/pages/index/index.wxml | 12 + src/pages/start/index.json | 4 + src/pages/start/index.scss | 4 + src/pages/start/index.ts | 20 + src/pages/start/index.wxml | 1 + src/patient/components/patient-tab-bar/index.json | 7 + src/patient/components/patient-tab-bar/index.scss | 19 + src/patient/components/patient-tab-bar/index.ts | 66 + src/patient/components/patient-tab-bar/index.wxml | 14 + src/sitemap.json | 7 + src/utils/dayjs/day-zh-cn.js | 2 + src/utils/dayjs/relativeTime.d.ts | 24 + src/utils/dayjs/relativeTime.js | 1 + src/utils/page.ts | 105 + src/utils/tools.wxs | 12 + src/utils/util.ts | 29 + tsconfig.json | 37 + typings/index.d.ts | 73 + 1007 files changed, 164389 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .neoconf.json create mode 100644 .prettierrc create mode 100644 README.md create mode 100644 babel.config.json create mode 100644 dist.ps1 create mode 100644 dist.sh create mode 100644 eslint.config.mjs create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 src/api/request.ts create mode 100644 src/app.json create mode 100644 src/app.scss create mode 100644 src/app.ts create mode 100644 src/components/calendar/core.js create mode 100644 src/components/calendar/helper.js create mode 100644 src/components/calendar/index.d.ts create mode 100644 src/components/calendar/index.js create mode 100644 src/components/calendar/index.json create mode 100644 src/components/calendar/index.wxml create mode 100644 src/components/calendar/index.wxss create mode 100644 src/components/calendar/plugins/holidays/holidays-map.js create mode 100644 src/components/calendar/plugins/holidays/index.d.ts create mode 100644 src/components/calendar/plugins/holidays/index.js create mode 100644 src/components/calendar/plugins/index.js create mode 100644 src/components/calendar/plugins/preset/base.js create mode 100644 src/components/calendar/plugins/preset/get-calendar-data.js create mode 100644 src/components/calendar/plugins/preset/index.d.ts create mode 100644 src/components/calendar/plugins/preset/index.js create mode 100644 src/components/calendar/plugins/selectable.d.ts create mode 100644 src/components/calendar/plugins/selectable.js create mode 100644 src/components/calendar/plugins/solarLunar/convertSolarLunar.js create mode 100644 src/components/calendar/plugins/solarLunar/index.d.ts create mode 100644 src/components/calendar/plugins/solarLunar/index.js create mode 100644 src/components/calendar/plugins/time-range.js create mode 100644 src/components/calendar/plugins/todo.d.ts create mode 100644 src/components/calendar/plugins/todo.js create mode 100644 src/components/calendar/plugins/week.js create mode 100644 src/components/calendar/render.js create mode 100644 src/components/calendar/theme/iconfont.wxss create mode 100644 src/components/calendar/theme/theme-default.wxss create mode 100644 src/components/calendar/theme/theme-elegant.wxss create mode 100644 src/components/calendar/theme/theme-geneB.wxss create mode 100644 src/components/calendar/theme/theme-geneDoctorB.wxss create mode 100644 src/components/calendar/theme/theme-nuohe.wxss create mode 100644 src/components/calendar/utils/index.js create mode 100644 src/components/calendar/utils/logger.js create mode 100644 src/components/calendar/utils/wxData.js create mode 100644 src/components/customPoster/README.md create mode 100644 src/components/customPoster/index.js create mode 100644 src/components/customPoster/index.json create mode 100644 src/components/customPoster/index.scss create mode 100644 src/components/customPoster/index.wxml create mode 100644 src/components/customPoster/wxml2canvas/README.md create mode 100644 src/components/customPoster/wxml2canvas/index.js create mode 100644 src/components/customPoster/wxml2canvas/index.js.map create mode 100644 src/components/ec-canvas/ec-canvas.js create mode 100644 src/components/ec-canvas/ec-canvas.json create mode 100644 src/components/ec-canvas/ec-canvas.wxml create mode 100644 src/components/ec-canvas/ec-canvas.wxss create mode 100644 src/components/ec-canvas/echarts.js create mode 100644 src/components/ec-canvas/wx-canvas.js create mode 100644 src/components/login/index.json create mode 100644 src/components/login/index.scss create mode 100644 src/components/login/index.ts create mode 100644 src/components/login/index.wxml create mode 100644 src/components/navbar/index.json create mode 100644 src/components/navbar/index.scss create mode 100644 src/components/navbar/index.ts create mode 100644 src/components/navbar/index.wxml create mode 100644 src/components/pagination/index.js create mode 100644 src/components/pagination/index.json create mode 100644 src/components/pagination/index.scss create mode 100644 src/components/pagination/index.wxml create mode 100644 src/components/pickerArea/index.json create mode 100644 src/components/pickerArea/index.scss create mode 100644 src/components/pickerArea/index.ts create mode 100644 src/components/pickerArea/index.wxml create mode 100644 src/components/pickerAreaBak/index.json create mode 100644 src/components/pickerAreaBak/index.scss create mode 100644 src/components/pickerAreaBak/index.ts create mode 100644 src/components/pickerAreaBak/index.wxml create mode 100644 src/components/popup/index.json create mode 100644 src/components/popup/index.scss create mode 100644 src/components/popup/index.ts create mode 100644 src/components/popup/index.wxml create mode 100644 src/components/popupDoctor/index.json create mode 100644 src/components/popupDoctor/index.scss create mode 100644 src/components/popupDoctor/index.ts create mode 100644 src/components/popupDoctor/index.wxml create mode 100644 src/components/star/index.json create mode 100644 src/components/star/index.scss create mode 100644 src/components/star/index.ts create mode 100644 src/components/star/index.wxml create mode 100644 src/components/uploadFile/index.js create mode 100644 src/components/uploadFile/index.json create mode 100644 src/components/uploadFile/index.scss create mode 100644 src/components/uploadFile/index.wxml create mode 100644 src/custom-tab-bar/index.json create mode 100644 src/custom-tab-bar/index.scss create mode 100644 src/custom-tab-bar/index.ts create mode 100644 src/custom-tab-bar/index.wxml create mode 100644 src/doc/pages/doc1/index.json create mode 100644 src/doc/pages/doc1/index.scss create mode 100644 src/doc/pages/doc1/index.ts create mode 100644 src/doc/pages/doc1/index.wxml create mode 100644 src/doctor/components/doctor-tab-bar/index.json create mode 100644 src/doctor/components/doctor-tab-bar/index.scss create mode 100644 src/doctor/components/doctor-tab-bar/index.ts create mode 100644 src/doctor/components/doctor-tab-bar/index.wxml create mode 100644 src/images/tabbar/tabbar1-1-active.png create mode 100644 src/images/tabbar/tabbar1-1.png create mode 100644 src/images/tabbar/tabbar1-2-active.png create mode 100644 src/images/tabbar/tabbar1-2.png create mode 100644 src/images/tabbar/tabbar1-3-active.png create mode 100644 src/images/tabbar/tabbar1-3.png create mode 100644 src/images/tabbar/tabbar2-1-active.png create mode 100644 src/images/tabbar/tabbar2-1.png create mode 100644 src/images/tabbar/tabbar2-2-active.png create mode 100644 src/images/tabbar/tabbar2-2.png create mode 100644 src/images/tabbar/tabbar2-3-active.png create mode 100644 src/images/tabbar/tabbar2-3.png create mode 100644 src/images/tabbar/tabbar2-4-active.png create mode 100644 src/images/tabbar/tabbar2-4.png create mode 100644 src/images/tabbar/tabbar3-1-active.png create mode 100644 src/images/tabbar/tabbar3-1.png create mode 100644 src/images/tabbar/tabbar3-2-active.png create mode 100644 src/images/tabbar/tabbar3-2.png create mode 100644 src/images/tabbar/tabbar3-3-active.png create mode 100644 src/images/tabbar/tabbar3-3.png create mode 100644 src/miniprogram_npm/@galacean/effects/index.js create mode 100644 src/miniprogram_npm/@galacean/effects/index.js.map create mode 100644 src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.js create mode 100644 src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.json create mode 100644 src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxml create mode 100644 src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/action-sheet/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/action-sheet/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/action-sheet/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/action-sheet/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/action-sheet/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/area/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/area/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/area/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/area/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/area/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/area/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/button/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/button/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/button/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/button/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/button/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/button/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/calendar.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/header/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/header/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/header/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/month/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/month/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/month/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/utils.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/utils.js create mode 100644 src/miniprogram_npm/@vant/weapp/calendar/utils.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/card/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/card/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/card/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/card/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/card/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/cascader/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/cascader/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/cascader/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/cascader/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/cascader/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/cascader/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/cell-group/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/cell-group/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/cell-group/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/cell-group/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/cell-group/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/cell/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/cell/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/cell/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/cell/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/cell/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/cell/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox-group/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox-group/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox-group/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/checkbox/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/circle/canvas.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/circle/canvas.js create mode 100644 src/miniprogram_npm/@vant/weapp/circle/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/circle/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/circle/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/circle/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/circle/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/col/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/col/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/col/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/col/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/col/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/col/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/animate.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/animate.js create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/collapse-item/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/collapse/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/collapse/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/collapse/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/collapse/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/collapse/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/color.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/common/color.js create mode 100644 src/miniprogram_npm/@vant/weapp/common/component.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/common/component.js create mode 100644 src/miniprogram_npm/@vant/weapp/common/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/relation.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/common/relation.js create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/clearfix.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/ellipsis.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/hairline.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/mixins/clearfix.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/mixins/ellipsis.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/mixins/hairline.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/style/var.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/common/utils.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/common/utils.js create mode 100644 src/miniprogram_npm/@vant/weapp/common/validator.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/common/validator.js create mode 100644 src/miniprogram_npm/@vant/weapp/common/version.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/common/version.js create mode 100644 src/miniprogram_npm/@vant/weapp/config-provider/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/config-provider/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/config-provider/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/config-provider/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/config-provider/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/utils.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/count-down/utils.js create mode 100644 src/miniprogram_npm/@vant/weapp/datetime-picker/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/datetime-picker/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/datetime-picker/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/definitions/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/definitions/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/dialog.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/dialog.js create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/dialog/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/divider/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/divider/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/divider/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/divider/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/divider/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/divider/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/shared.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-item/shared.js create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-menu/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-menu/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-menu/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/empty/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/empty/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/empty/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/empty/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/empty/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/empty/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/field/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/field/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/field/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/field/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/field/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/field/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/field/input.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/field/props.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/field/props.js create mode 100644 src/miniprogram_npm/@vant/weapp/field/textarea.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/field/types.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/field/types.js create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-button/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-button/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-button/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-button/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-button/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-icon/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-icon/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-icon/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-icon/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action-icon/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/goods-action/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/grid-item/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/grid-item/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/grid-item/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/grid-item/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/grid-item/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/grid-item/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/grid/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/grid/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/grid/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/grid/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/grid/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/grid/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/icon/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/icon/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/icon/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/icon/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/icon/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/icon/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/image/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/image/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/image/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/image/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/image/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/image/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/index-anchor/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/index-anchor/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/index-anchor/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/index-anchor/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/index-anchor/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/index-bar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/index-bar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/index-bar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/index-bar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/index-bar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/info/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/info/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/info/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/info/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/info/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/loading/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/loading/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/loading/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/loading/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/loading/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/loading/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/basic.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/basic.js create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/button.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/button.js create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/link.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/link.js create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/page-scroll.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/page-scroll.js create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/touch.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/touch.js create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/transition.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/mixins/transition.js create mode 100644 src/miniprogram_npm/@vant/weapp/nav-bar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/nav-bar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/nav-bar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/nav-bar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/nav-bar/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/nav-bar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/notice-bar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/notice-bar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/notice-bar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/notice-bar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/notice-bar/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/notice-bar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/notify/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/notify/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/notify/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/notify/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/notify/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/notify/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/notify/notify.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/notify/notify.js create mode 100644 src/miniprogram_npm/@vant/weapp/overlay/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/overlay/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/overlay/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/overlay/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/overlay/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/overlay/overlay.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/panel/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/panel/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/panel/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/panel/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/panel/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/picker-column/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/picker-column/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/picker-column/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/picker-column/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/picker-column/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/picker-column/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/picker/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/picker/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/picker/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/picker/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/picker/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/picker/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/picker/shared.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/picker/shared.js create mode 100644 src/miniprogram_npm/@vant/weapp/picker/toolbar.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/popup/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/popup/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/popup/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/popup/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/popup/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/popup/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/popup/popup.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/progress/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/progress/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/progress/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/progress/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/progress/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/progress/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/radio-group/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/radio-group/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/radio-group/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/radio-group/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/radio-group/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/radio/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/radio/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/radio/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/radio/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/radio/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/radio/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/rate/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/rate/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/rate/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/rate/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/rate/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/row/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/row/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/row/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/row/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/row/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/row/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/search/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/search/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/search/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/search/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/search/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/options.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/options.js create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/options.json create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/options.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/options.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/share-sheet/options.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar-item/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar-item/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar-item/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar-item/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar-item/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/sidebar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/skeleton/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/skeleton/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/skeleton/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/skeleton/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/skeleton/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/slider/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/slider/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/slider/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/slider/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/slider/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/slider/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/stepper/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/stepper/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/stepper/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/stepper/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/stepper/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/stepper/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/steps/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/steps/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/steps/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/steps/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/steps/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/sticky/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/sticky/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/sticky/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/sticky/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/sticky/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/sticky/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/submit-bar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/submit-bar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/submit-bar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/submit-bar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/submit-bar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/swipe-cell/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/swipe-cell/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/swipe-cell/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/swipe-cell/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/swipe-cell/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/switch/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/switch/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/switch/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/switch/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/switch/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/switch/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/tab/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/tab/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/tab/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/tab/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/tab/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar-item/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar-item/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar-item/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar-item/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar-item/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/tabbar/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/tabs/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/tabs/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/tabs/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/tabs/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/tabs/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/tabs/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/tag/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/tag/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/tag/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/tag/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/tag/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/tag/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/toast/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/toast/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/toast/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/toast/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/toast/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/toast/toast.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/toast/toast.js create mode 100644 src/miniprogram_npm/@vant/weapp/transition/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/transition/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/transition/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/transition/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/transition/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/transition/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/tree-select/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/tree-select/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/tree-select/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/tree-select/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/tree-select/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/tree-select/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/index.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/index.js create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/index.json create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/index.wxml create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/index.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/index.wxss create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/shared.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/shared.js create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/utils.d.ts create mode 100644 src/miniprogram_npm/@vant/weapp/uploader/utils.js create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/add-unit.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/array.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/bem.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/memoize.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/object.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/style.wxs create mode 100644 src/miniprogram_npm/@vant/weapp/wxs/utils.wxs create mode 100644 src/miniprogram_npm/a-calc/index.js create mode 100644 src/miniprogram_npm/a-calc/index.js.map create mode 100644 src/miniprogram_npm/dayjs/index.js create mode 100644 src/miniprogram_npm/dayjs/index.js.map create mode 100644 src/miniprogram_npm/echarts/index.js create mode 100644 src/miniprogram_npm/echarts/index.js.map create mode 100644 src/miniprogram_npm/miniprogram-licia/Benchmark.js create mode 100644 src/miniprogram_npm/miniprogram-licia/BloomFilter.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Caseless.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Channel.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Class.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Color.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Delegator.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Dispatcher.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Emitter.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Enum.js create mode 100644 src/miniprogram_npm/miniprogram-licia/HashTable.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Heap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/HeapSnapshot.js create mode 100644 src/miniprogram_npm/miniprogram-licia/I18n.js create mode 100644 src/miniprogram_npm/miniprogram-licia/JsonTransformer.js create mode 100644 src/miniprogram_npm/miniprogram-licia/LinkedList.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Logger.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Lru.js create mode 100644 src/miniprogram_npm/miniprogram-licia/PriorityQueue.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Promise.js create mode 100644 src/miniprogram_npm/miniprogram-licia/PseudoMap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Queue.js create mode 100644 src/miniprogram_npm/miniprogram-licia/QuickLru.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Readiness.js create mode 100644 src/miniprogram_npm/miniprogram-licia/ReduceStore.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Semaphore.js create mode 100644 src/miniprogram_npm/miniprogram-licia/SingleEmitter.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Stack.js create mode 100644 src/miniprogram_npm/miniprogram-licia/State.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Store.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Trace.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Tracing.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Trie.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Tween.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Url.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Validator.js create mode 100644 src/miniprogram_npm/miniprogram-licia/Wrr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/abbrev.js create mode 100644 src/miniprogram_npm/miniprogram-licia/after.js create mode 100644 src/miniprogram_npm/miniprogram-licia/allKeys.js create mode 100644 src/miniprogram_npm/miniprogram-licia/arrToMap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/atob.js create mode 100644 src/miniprogram_npm/miniprogram-licia/average.js create mode 100644 src/miniprogram_npm/miniprogram-licia/base64.js create mode 100644 src/miniprogram_npm/miniprogram-licia/before.js create mode 100644 src/miniprogram_npm/miniprogram-licia/binarySearch.js create mode 100644 src/miniprogram_npm/miniprogram-licia/bind.js create mode 100644 src/miniprogram_npm/miniprogram-licia/btoa.js create mode 100644 src/miniprogram_npm/miniprogram-licia/bubbleSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/bytesToStr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/bytesToWords.js create mode 100644 src/miniprogram_npm/miniprogram-licia/callbackify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/camelCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/capitalize.js create mode 100644 src/miniprogram_npm/miniprogram-licia/castPath.js create mode 100644 src/miniprogram_npm/miniprogram-licia/centerAlign.js create mode 100644 src/miniprogram_npm/miniprogram-licia/char.js create mode 100644 src/miniprogram_npm/miniprogram-licia/chunk.js create mode 100644 src/miniprogram_npm/miniprogram-licia/clamp.js create mode 100644 src/miniprogram_npm/miniprogram-licia/className.js create mode 100644 src/miniprogram_npm/miniprogram-licia/clone.js create mode 100644 src/miniprogram_npm/miniprogram-licia/cloneDeep.js create mode 100644 src/miniprogram_npm/miniprogram-licia/cmpVersion.js create mode 100644 src/miniprogram_npm/miniprogram-licia/combine.js create mode 100644 src/miniprogram_npm/miniprogram-licia/compact.js create mode 100644 src/miniprogram_npm/miniprogram-licia/compose.js create mode 100644 src/miniprogram_npm/miniprogram-licia/concat.js create mode 100644 src/miniprogram_npm/miniprogram-licia/contain.js create mode 100644 src/miniprogram_npm/miniprogram-licia/convertBase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/convertBin.js create mode 100644 src/miniprogram_npm/miniprogram-licia/crc1.js create mode 100644 src/miniprogram_npm/miniprogram-licia/crc16.js create mode 100644 src/miniprogram_npm/miniprogram-licia/crc32.js create mode 100644 src/miniprogram_npm/miniprogram-licia/crc8.js create mode 100644 src/miniprogram_npm/miniprogram-licia/create.js create mode 100644 src/miniprogram_npm/miniprogram-licia/createAssigner.js create mode 100644 src/miniprogram_npm/miniprogram-licia/css.js create mode 100644 src/miniprogram_npm/miniprogram-licia/cssPriority.js create mode 100644 src/miniprogram_npm/miniprogram-licia/curry.js create mode 100644 src/miniprogram_npm/miniprogram-licia/dataUrl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/dataView.js create mode 100644 src/miniprogram_npm/miniprogram-licia/dateFormat.js create mode 100644 src/miniprogram_npm/miniprogram-licia/debounce.js create mode 100644 src/miniprogram_npm/miniprogram-licia/deburr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/decodeUriComponent.js create mode 100644 src/miniprogram_npm/miniprogram-licia/defaults.js create mode 100644 src/miniprogram_npm/miniprogram-licia/define.js create mode 100644 src/miniprogram_npm/miniprogram-licia/defineProp.js create mode 100644 src/miniprogram_npm/miniprogram-licia/defined.js create mode 100644 src/miniprogram_npm/miniprogram-licia/delay.js create mode 100644 src/miniprogram_npm/miniprogram-licia/deprecate.js create mode 100644 src/miniprogram_npm/miniprogram-licia/detectBrowser.js create mode 100644 src/miniprogram_npm/miniprogram-licia/detectMocha.js create mode 100644 src/miniprogram_npm/miniprogram-licia/detectOs.js create mode 100644 src/miniprogram_npm/miniprogram-licia/difference.js create mode 100644 src/miniprogram_npm/miniprogram-licia/dotCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/durationFormat.js create mode 100644 src/miniprogram_npm/miniprogram-licia/each.js create mode 100644 src/miniprogram_npm/miniprogram-licia/easing.js create mode 100644 src/miniprogram_npm/miniprogram-licia/endWith.js create mode 100644 src/miniprogram_npm/miniprogram-licia/escape.js create mode 100644 src/miniprogram_npm/miniprogram-licia/escapeJsStr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/escapeRegExp.js create mode 100644 src/miniprogram_npm/miniprogram-licia/every.js create mode 100644 src/miniprogram_npm/miniprogram-licia/extend.js create mode 100644 src/miniprogram_npm/miniprogram-licia/extendDeep.js create mode 100644 src/miniprogram_npm/miniprogram-licia/extendOwn.js create mode 100644 src/miniprogram_npm/miniprogram-licia/extractBlockCmts.js create mode 100644 src/miniprogram_npm/miniprogram-licia/extractUrls.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fibonacci.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fileSize.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fileType.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fileUrl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fill.js create mode 100644 src/miniprogram_npm/miniprogram-licia/filter.js create mode 100644 src/miniprogram_npm/miniprogram-licia/find.js create mode 100644 src/miniprogram_npm/miniprogram-licia/findIdx.js create mode 100644 src/miniprogram_npm/miniprogram-licia/findKey.js create mode 100644 src/miniprogram_npm/miniprogram-licia/findLastIdx.js create mode 100644 src/miniprogram_npm/miniprogram-licia/flatten.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fnArgs.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fnParams.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fnv1a.js create mode 100644 src/miniprogram_npm/miniprogram-licia/format.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fraction.js create mode 100644 src/miniprogram_npm/miniprogram-licia/freeze.js create mode 100644 src/miniprogram_npm/miniprogram-licia/freezeDeep.js create mode 100644 src/miniprogram_npm/miniprogram-licia/fuzzySearch.js create mode 100644 src/miniprogram_npm/miniprogram-licia/gcd.js create mode 100644 src/miniprogram_npm/miniprogram-licia/getProto.js create mode 100644 src/miniprogram_npm/miniprogram-licia/getUrlParam.js create mode 100644 src/miniprogram_npm/miniprogram-licia/golangify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/has.js create mode 100644 src/miniprogram_npm/miniprogram-licia/heapSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/hex.js create mode 100644 src/miniprogram_npm/miniprogram-licia/highlight.js create mode 100644 src/miniprogram_npm/miniprogram-licia/hookFn.js create mode 100644 src/miniprogram_npm/miniprogram-licia/hslToRgb.js create mode 100644 src/miniprogram_npm/miniprogram-licia/html.js create mode 100644 src/miniprogram_npm/miniprogram-licia/identity.js create mode 100644 src/miniprogram_npm/miniprogram-licia/idxOf.js create mode 100644 src/miniprogram_npm/miniprogram-licia/indent.js create mode 100644 src/miniprogram_npm/miniprogram-licia/index.js create mode 100644 src/miniprogram_npm/miniprogram-licia/inherits.js create mode 100644 src/miniprogram_npm/miniprogram-licia/ini.js create mode 100644 src/miniprogram_npm/miniprogram-licia/insertionSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/intersect.js create mode 100644 src/miniprogram_npm/miniprogram-licia/intersectRange.js create mode 100644 src/miniprogram_npm/miniprogram-licia/invariant.js create mode 100644 src/miniprogram_npm/miniprogram-licia/invert.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isAbsoluteUrl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isArgs.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isArr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isArrBuffer.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isArrLike.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isAsyncFn.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isBool.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isBrowser.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isBuffer.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isClose.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isCyclic.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isDataUrl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isDate.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isEmail.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isEmpty.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isEqual.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isErr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isEven.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isFinite.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isFn.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isFullWidth.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isGeneratorFn.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isInt.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isIp.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isJson.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isLeapYear.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isMac.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isMap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isMatch.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isMiniProgram.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isMobile.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNaN.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNative.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNil.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNode.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNull.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNum.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isNumeric.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isObj.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isOdd.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isPlainObj.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isPrime.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isPrimitive.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isPromise.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isRegExp.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isRelative.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isSet.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isSorted.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isStr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isStrBlank.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isSymbol.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isTypedArr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isUndef.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isUrl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isWeakMap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isWeakSet.js create mode 100644 src/miniprogram_npm/miniprogram-licia/isWindows.js create mode 100644 src/miniprogram_npm/miniprogram-licia/jsonClone.js create mode 100644 src/miniprogram_npm/miniprogram-licia/kebabCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/keyCode.js create mode 100644 src/miniprogram_npm/miniprogram-licia/keys.js create mode 100644 src/miniprogram_npm/miniprogram-licia/last.js create mode 100644 src/miniprogram_npm/miniprogram-licia/levenshtein.js create mode 100644 src/miniprogram_npm/miniprogram-licia/linkify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/longest.js create mode 100644 src/miniprogram_npm/miniprogram-licia/lowerCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/lpad.js create mode 100644 src/miniprogram_npm/miniprogram-licia/ltrim.js create mode 100644 src/miniprogram_npm/miniprogram-licia/map.js create mode 100644 src/miniprogram_npm/miniprogram-licia/mapObj.js create mode 100644 src/miniprogram_npm/miniprogram-licia/matcher.js create mode 100644 src/miniprogram_npm/miniprogram-licia/max.js create mode 100644 src/miniprogram_npm/miniprogram-licia/md5.js create mode 100644 src/miniprogram_npm/miniprogram-licia/memStorage.js create mode 100644 src/miniprogram_npm/miniprogram-licia/memoize.js create mode 100644 src/miniprogram_npm/miniprogram-licia/mergeArr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/mergeSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/methods.js create mode 100644 src/miniprogram_npm/miniprogram-licia/mime.js create mode 100644 src/miniprogram_npm/miniprogram-licia/min.js create mode 100644 src/miniprogram_npm/miniprogram-licia/moment.js create mode 100644 src/miniprogram_npm/miniprogram-licia/morse.js create mode 100644 src/miniprogram_npm/miniprogram-licia/ms.js create mode 100644 src/miniprogram_npm/miniprogram-licia/naturalSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/negate.js create mode 100644 src/miniprogram_npm/miniprogram-licia/nextTick.js create mode 100644 src/miniprogram_npm/miniprogram-licia/noop.js create mode 100644 src/miniprogram_npm/miniprogram-licia/normalizeHeader.js create mode 100644 src/miniprogram_npm/miniprogram-licia/normalizePath.js create mode 100644 src/miniprogram_npm/miniprogram-licia/normalizePhone.js create mode 100644 src/miniprogram_npm/miniprogram-licia/now.js create mode 100644 src/miniprogram_npm/miniprogram-licia/objToStr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/omit.js create mode 100644 src/miniprogram_npm/miniprogram-licia/once.js create mode 100644 src/miniprogram_npm/miniprogram-licia/optimizeCb.js create mode 100644 src/miniprogram_npm/miniprogram-licia/ordinal.js create mode 100644 src/miniprogram_npm/miniprogram-licia/pad.js create mode 100644 src/miniprogram_npm/miniprogram-licia/pairs.js create mode 100644 src/miniprogram_npm/miniprogram-licia/parallel.js create mode 100644 src/miniprogram_npm/miniprogram-licia/parseArgs.js create mode 100644 src/miniprogram_npm/miniprogram-licia/parseHtml.js create mode 100644 src/miniprogram_npm/miniprogram-licia/partial.js create mode 100644 src/miniprogram_npm/miniprogram-licia/pascalCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/perfNow.js create mode 100644 src/miniprogram_npm/miniprogram-licia/pick.js create mode 100644 src/miniprogram_npm/miniprogram-licia/pluck.js create mode 100644 src/miniprogram_npm/miniprogram-licia/precision.js create mode 100644 src/miniprogram_npm/miniprogram-licia/promisify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/property.js create mode 100644 src/miniprogram_npm/miniprogram-licia/query.js create mode 100644 src/miniprogram_npm/miniprogram-licia/quickSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/raf.js create mode 100644 src/miniprogram_npm/miniprogram-licia/random.js create mode 100644 src/miniprogram_npm/miniprogram-licia/randomBytes.js create mode 100644 src/miniprogram_npm/miniprogram-licia/randomColor.js create mode 100644 src/miniprogram_npm/miniprogram-licia/randomId.js create mode 100644 src/miniprogram_npm/miniprogram-licia/randomItem.js create mode 100644 src/miniprogram_npm/miniprogram-licia/range.js create mode 100644 src/miniprogram_npm/miniprogram-licia/rc4.js create mode 100644 src/miniprogram_npm/miniprogram-licia/reduce.js create mode 100644 src/miniprogram_npm/miniprogram-licia/reduceRight.js create mode 100644 src/miniprogram_npm/miniprogram-licia/reject.js create mode 100644 src/miniprogram_npm/miniprogram-licia/remove.js create mode 100644 src/miniprogram_npm/miniprogram-licia/repeat.js create mode 100644 src/miniprogram_npm/miniprogram-licia/replaceAll.js create mode 100644 src/miniprogram_npm/miniprogram-licia/restArgs.js create mode 100644 src/miniprogram_npm/miniprogram-licia/reverse.js create mode 100644 src/miniprogram_npm/miniprogram-licia/rgbToHsl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/root.js create mode 100644 src/miniprogram_npm/miniprogram-licia/rpad.js create mode 100644 src/miniprogram_npm/miniprogram-licia/rtrim.js create mode 100644 src/miniprogram_npm/miniprogram-licia/safeCb.js create mode 100644 src/miniprogram_npm/miniprogram-licia/safeDel.js create mode 100644 src/miniprogram_npm/miniprogram-licia/safeGet.js create mode 100644 src/miniprogram_npm/miniprogram-licia/safeSet.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sameOrigin.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sample.js create mode 100644 src/miniprogram_npm/miniprogram-licia/seedRandom.js create mode 100644 src/miniprogram_npm/miniprogram-licia/selectionSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/selector.js create mode 100644 src/miniprogram_npm/miniprogram-licia/shebang.js create mode 100644 src/miniprogram_npm/miniprogram-licia/shellSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/shuffle.js create mode 100644 src/miniprogram_npm/miniprogram-licia/singleton.js create mode 100644 src/miniprogram_npm/miniprogram-licia/size.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sizeof.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sleep.js create mode 100644 src/miniprogram_npm/miniprogram-licia/slice.js create mode 100644 src/miniprogram_npm/miniprogram-licia/slugify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/snakeCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/some.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sortBy.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sortKeys.js create mode 100644 src/miniprogram_npm/miniprogram-licia/spaceCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/splitCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/splitPath.js create mode 100644 src/miniprogram_npm/miniprogram-licia/startWith.js create mode 100644 src/miniprogram_npm/miniprogram-licia/strHash.js create mode 100644 src/miniprogram_npm/miniprogram-licia/strToBytes.js create mode 100644 src/miniprogram_npm/miniprogram-licia/strTpl.js create mode 100644 src/miniprogram_npm/miniprogram-licia/strWidth.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stringify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stringifyAll.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripAnsi.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripBom.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripCmt.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripColor.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripHtmlTag.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripIndent.js create mode 100644 src/miniprogram_npm/miniprogram-licia/stripNum.js create mode 100644 src/miniprogram_npm/miniprogram-licia/sum.js create mode 100644 src/miniprogram_npm/miniprogram-licia/swap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/table.js create mode 100644 src/miniprogram_npm/miniprogram-licia/throttle.js create mode 100644 src/miniprogram_npm/miniprogram-licia/timeAgo.js create mode 100644 src/miniprogram_npm/miniprogram-licia/timeTaken.js create mode 100644 src/miniprogram_npm/miniprogram-licia/times.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toArr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toAsync.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toBool.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toDate.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toInt.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toNum.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toSrc.js create mode 100644 src/miniprogram_npm/miniprogram-licia/toStr.js create mode 100644 src/miniprogram_npm/miniprogram-licia/topoSort.js create mode 100644 src/miniprogram_npm/miniprogram-licia/trim.js create mode 100644 src/miniprogram_npm/miniprogram-licia/truncate.js create mode 100644 src/miniprogram_npm/miniprogram-licia/tryIt.js create mode 100644 src/miniprogram_npm/miniprogram-licia/type.js create mode 100644 src/miniprogram_npm/miniprogram-licia/types.js create mode 100644 src/miniprogram_npm/miniprogram-licia/ucs2.js create mode 100644 src/miniprogram_npm/miniprogram-licia/unescape.js create mode 100644 src/miniprogram_npm/miniprogram-licia/union.js create mode 100644 src/miniprogram_npm/miniprogram-licia/uniqId.js create mode 100644 src/miniprogram_npm/miniprogram-licia/unique.js create mode 100644 src/miniprogram_npm/miniprogram-licia/universalify.js create mode 100644 src/miniprogram_npm/miniprogram-licia/unzip.js create mode 100644 src/miniprogram_npm/miniprogram-licia/upperCase.js create mode 100644 src/miniprogram_npm/miniprogram-licia/upperFirst.js create mode 100644 src/miniprogram_npm/miniprogram-licia/use.js create mode 100644 src/miniprogram_npm/miniprogram-licia/utf8.js create mode 100644 src/miniprogram_npm/miniprogram-licia/uuid.js create mode 100644 src/miniprogram_npm/miniprogram-licia/values.js create mode 100644 src/miniprogram_npm/miniprogram-licia/vlq.js create mode 100644 src/miniprogram_npm/miniprogram-licia/waitUntil.js create mode 100644 src/miniprogram_npm/miniprogram-licia/waterfall.js create mode 100644 src/miniprogram_npm/miniprogram-licia/wordWrap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/wordsToBytes.js create mode 100644 src/miniprogram_npm/miniprogram-licia/wrap.js create mode 100644 src/miniprogram_npm/miniprogram-licia/wx.js create mode 100644 src/miniprogram_npm/miniprogram-licia/zip.js create mode 100644 src/miniprogram_npm/mp-html/index.js create mode 100644 src/miniprogram_npm/mp-html/index.json create mode 100644 src/miniprogram_npm/mp-html/index.wxml create mode 100644 src/miniprogram_npm/mp-html/index.wxss create mode 100644 src/miniprogram_npm/mp-html/node/node.js create mode 100644 src/miniprogram_npm/mp-html/node/node.json create mode 100644 src/miniprogram_npm/mp-html/node/node.wxml create mode 100644 src/miniprogram_npm/mp-html/node/node.wxss create mode 100644 src/miniprogram_npm/mp-html/parser.js create mode 100644 src/miniprogram_npm/number-precision/index.js create mode 100644 src/miniprogram_npm/number-precision/index.js.map create mode 100644 src/miniprogram_npm/tslib/index.js create mode 100644 src/miniprogram_npm/tslib/index.js.map create mode 100644 src/pages/index/index.json create mode 100644 src/pages/index/index.scss create mode 100644 src/pages/index/index.ts create mode 100644 src/pages/index/index.wxml create mode 100644 src/pages/start/index.json create mode 100644 src/pages/start/index.scss create mode 100644 src/pages/start/index.ts create mode 100644 src/pages/start/index.wxml create mode 100644 src/patient/components/patient-tab-bar/index.json create mode 100644 src/patient/components/patient-tab-bar/index.scss create mode 100644 src/patient/components/patient-tab-bar/index.ts create mode 100644 src/patient/components/patient-tab-bar/index.wxml create mode 100644 src/sitemap.json create mode 100644 src/utils/dayjs/day-zh-cn.js create mode 100644 src/utils/dayjs/relativeTime.d.ts create mode 100644 src/utils/dayjs/relativeTime.js create mode 100644 src/utils/page.ts create mode 100644 src/utils/tools.wxs create mode 100644 src/utils/util.ts create mode 100644 tsconfig.json create mode 100644 typings/index.d.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5d47c21 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4257947 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.svn +.vscode +node_modules +.idea +.DS_Store diff --git a/.neoconf.json b/.neoconf.json new file mode 100644 index 0000000..437bfce --- /dev/null +++ b/.neoconf.json @@ -0,0 +1,10 @@ +{ + "emmet_language_server": { + "init_options": { + "preferences": { + "css.intUnit": "rpx", + "css.floatUnitr": "rpx" + } + } + } +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f20f145 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,28 @@ +{ + "$schema": "http://json.schemastore.org/prettierrc", + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "bracketSpacing": true, + "trailingComma": "all", + "arrowParens": "always", + "endOfLine": "lf", + "htmlWhitespaceSensitivity": "ignore", + "singleAttributePerLine": false, + "overrides": [ + { + "files": "*.wxml", + "options": { "parser": "html" } + }, + { + "files": "*.wxss", + "options": { "parser": "css" } + }, + { + "files": "*.wxs", + "options": { "parser": "babel" } + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..7614da2 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +## global color + + + +svn://39.106.86.127:28386/projects/wutian_xueyoubing_b/proj_src/shop/frontend/web/GeneB + +### vscode + +(/images/)(\S*(?=["|'])) +{{imageUrl}}$2?t={{Timestamp}} + +### neovim + +(/images/)([^\"|']\*) +{{imageUrl}}${2}?t={{Timestamp}} + +https://pic1.zhimg.com/50/v2-8cfef5f9ea7d15963af2277c6814f152_720w.jpg?source=2c26e567 + +### conform + +```js +wx.showModal({ + title: '确认解绑?', + confirmColor: 'rgba(246, 74, 58, 1)', + // confirmColor: 'rgba(29, 107, 255, 1)', +}) +``` + +## 游客端 + +1. 个人信息及隐私政策 + /doc/pages/doc1/index + +## 患者端 + +1. 个人信息共享知情同意书 + /doc/pages/doc2/index + +2. 个人信息及隐私政策 + /doc/pages/doc3/index + +3. 用户协议 + /doc/pages/doc4/index + +## 医生端 +1. 个人信息及隐私政策 + /doc/pages/doc5/index diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 0000000..5f36c55 --- /dev/null +++ b/babel.config.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "@babel/plugin-transform-react-jsx", + { + "runtime": "automatic", + "importSource": "@antv/f2" + } + ] + ] +} diff --git a/dist.ps1 b/dist.ps1 new file mode 100644 index 0000000..56abc95 --- /dev/null +++ b/dist.ps1 @@ -0,0 +1,10 @@ +# Change to the src/images directory, or exit if the directory doesn't exist +Set-Location -Path ./src/images/ -ErrorAction Stop + +# Add all files to svn, including ignored files and forced additions +svn add . --no-ignore --force + +# Commit the changes with a message +svn ci -m "版本更新" + +ssh hb127 "cd /data1/wwwroot/default/wutian_xueyoubing_b/shop/frontend/web/ && svn up && exit" diff --git a/dist.sh b/dist.sh new file mode 100644 index 0000000..1874050 --- /dev/null +++ b/dist.sh @@ -0,0 +1,5 @@ +#!/bin/bash +cd ./src/images/ || exit +svn add . --no-ignore --force +svn ci -m "版本更新" +exit diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..dc39439 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,29 @@ +// eslint.config.mjs +import antfu from '@antfu/eslint-config' +import prettierConfig from 'eslint-config-prettier' + +export default antfu( + { + env: { + es6: true, + }, + stylistic: false, + parserOptions: { project: ['./tsconfig.json'] }, + globals: { + wx: true, + App: true, + Page: true, + getCurrentPages: true, + getApp: true, + Component: true, + requirePlugin: true, + requireMiniProgram: true, + }, + rules: { + 'eslint-comments/no-unlimited-disable': 'off', + 'ts/no-require-imports': 'off', + eqeqeq: 'off', + }, + }, + prettierConfig, +) diff --git a/package.json b/package.json new file mode 100644 index 0000000..0722056 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "geneb", + "version": "1.0.0", + "description": "", + "author": "", + "license": "", + "keywords": [], + "scripts": { + "beforeCompile": "babel src/pages --out-dir src/pages --only **/*.jsx", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "@miniprogram-component-plus/video-swiper": "^1.0.1", + "@vant/weapp": "^1.11.2", + "a-calc": "^2.2.14", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "miniprogram-licia": "^1.39.2", + "mp-html": "^2.4.2" + }, + "devDependencies": { + "@antfu/eslint-config": "^3.2.0", + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.6", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", + "miniprogram-api-typings": "^3.12.3", + "prettier": "^3.3.3", + "typescript": "^5.8.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..4047f89 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3857 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@miniprogram-component-plus/video-swiper': + specifier: ^1.0.1 + version: 1.0.1 + '@vant/weapp': + specifier: ^1.11.2 + version: 1.11.7 + a-calc: + specifier: ^2.2.14 + version: 2.2.14 + dayjs: + specifier: ^1.11.10 + version: 1.11.13 + echarts: + specifier: ^5.4.3 + version: 5.6.0 + miniprogram-licia: + specifier: ^1.39.2 + version: 1.48.0 + mp-html: + specifier: ^2.4.2 + version: 2.5.1 + devDependencies: + '@antfu/eslint-config': + specifier: ^3.2.0 + version: 3.16.0(@vue/compiler-sfc@3.5.14)(eslint@9.27.0)(typescript@5.8.3) + '@babel/cli': + specifier: ^7.23.4 + version: 7.27.2(@babel/core@7.27.1) + '@babel/core': + specifier: ^7.23.6 + version: 7.27.1 + '@babel/plugin-transform-react-jsx': + specifier: ^7.23.4 + version: 7.27.1(@babel/core@7.27.1) + eslint: + specifier: ^9.9.1 + version: 9.27.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.27.0) + miniprogram-api-typings: + specifier: ^3.12.3 + version: 3.12.3 + prettier: + specifier: ^3.3.3 + version: 3.5.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/eslint-config@3.16.0': + resolution: {integrity: sha512-g6RAXUMeow9vexoOMYwCpByY2xSDpAD78q+rvQLvVpY6MFcxFD/zmdrZGYa/yt7LizK86m17kIYKOGLJ3L8P0w==} + hasBin: true + peerDependencies: + '@eslint-react/eslint-plugin': ^1.19.0 + '@prettier/plugin-xml': ^3.4.1 + '@unocss/eslint-plugin': '>=0.50.0' + astro-eslint-parser: ^1.0.2 + eslint: ^9.10.0 + eslint-plugin-astro: ^1.2.0 + eslint-plugin-format: '>=0.1.0' + eslint-plugin-react-hooks: ^5.0.0 + eslint-plugin-react-refresh: ^0.4.4 + eslint-plugin-solid: ^0.14.3 + eslint-plugin-svelte: '>=2.35.1' + prettier-plugin-astro: ^0.14.0 + prettier-plugin-slidev: ^1.0.5 + svelte-eslint-parser: '>=0.37.0' + peerDependenciesMeta: + '@eslint-react/eslint-plugin': + optional: true + '@prettier/plugin-xml': + optional: true + '@unocss/eslint-plugin': + optional: true + astro-eslint-parser: + optional: true + eslint-plugin-astro: + optional: true + eslint-plugin-format: + optional: true + eslint-plugin-react-hooks: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-solid: + optional: true + eslint-plugin-svelte: + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-slidev: + optional: true + svelte-eslint-parser: + optional: true + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/cli@7.27.2': + resolution: {integrity: sha512-cfd7DnGlhH6OIyuPSSj3vcfIdnbXukhAyKY8NaZrFadC7pXyL9mOL5WgjcptiEJLi5k3j8aYvLIVCzezrWTaiA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.1': + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + engines: {node: '>=6.9.0'} + + '@clack/core@0.4.1': + resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + + '@clack/prompts@0.9.1': + resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} + + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@es-joy/jsdoccomment@0.50.2': + resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} + engines: {node: '>=18'} + + '@eslint-community/eslint-plugin-eslint-comments@4.5.0': + resolution: {integrity: sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.2.9': + resolution: {integrity: sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.27.0': + resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/markdown@6.4.0': + resolution: {integrity: sha512-J07rR8uBSNFJ9iliNINrchilpkmCihPmTVotpThUeKEn5G8aBBZnkjNBy/zovhJA5LBk1vWU9UDlhqKSc/dViQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@miniprogram-component-plus/video-swiper@1.0.1': + resolution: {integrity: sha512-1rlmsS3/TR0Zu0nZHwEwb9UCQWY/ofPv73zU56FLfZh72Xw+BcIzfohrDxrGs5QpoL4KCLl9G7UB5w+3ZRSZzQ==} + + '@napi-rs/wasm-runtime@0.2.10': + resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@stylistic/eslint-plugin@2.13.0': + resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.40.0' + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@8.32.1': + resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.32.1': + resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.32.1': + resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.32.1': + resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.32.1': + resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.32.1': + resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.32.1': + resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.32.1': + resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-darwin-arm64@1.7.2': + resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.7.2': + resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.7.2': + resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} + cpu: [x64] + os: [win32] + + '@vant/weapp@1.11.7': + resolution: {integrity: sha512-Rwn9BBnb4kHSV4XmvBicwtd42J+amEUfnFDcXJsGNPNX4a9c/DoT6YLsm4X1wB2+sQbdiQsbFBLAvGRBxCkD8g==} + + '@vitest/eslint-plugin@1.2.1': + resolution: {integrity: sha512-JQr1jdVcrsoS7Sdzn83h9sq4DvREf9Q/onTZbJCqTVlv/76qb+TZrLv/9VhjnjSMHweQH5FdpMDeCR6aDe2fgw==} + peerDependencies: + eslint: '>= 8.57.0' + typescript: '>= 5.0.0' + vitest: '*' + peerDependenciesMeta: + typescript: + optional: true + vitest: + optional: true + + '@vue/compiler-core@3.5.14': + resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} + + '@vue/compiler-dom@3.5.14': + resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} + + '@vue/compiler-sfc@3.5.14': + resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==} + + '@vue/compiler-ssr@3.5.14': + resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==} + + '@vue/shared@3.5.14': + resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} + + a-calc@2.2.14: + resolution: {integrity: sha512-Lp6xxnZ1G+qgO4EeLGSYjKRYrYR5qnxE566sYo37KO2dIKYe+ZY5tQJ2MetR3uFhfyC2KcgeDDBH1AKg/rKdyA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-js-compat@3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + electron-to-chromium@1.5.157: + resolution: {integrity: sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-compat-utils@0.6.5: + resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-flat-gitignore@1.0.1: + resolution: {integrity: sha512-wjBmJ8TAb67G2or/gBp/H62uCIkDCjpCmlGPSG41/7QagUjMgh+iegVB3gY8eNYhTAmecjKtclT4wGAjHz5yWA==} + peerDependencies: + eslint: ^9.5.0 + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-flat-config-utils@1.1.0: + resolution: {integrity: sha512-W49wz7yQJGRfg4QSV3nwdO/fYcWetiSKhLV5YykfQMcqnIATNpoS7EPdINhLB9P3fmdjNmFtOgZjiKnCndWAnw==} + + eslint-import-context@0.1.5: + resolution: {integrity: sha512-jalO1mLiEvTv0io0koz1AE4LwkHQxDBFLaSXWweWtJR0y/NC1yyxvU61Z54bghIFNeM1M4TvwRwVRhLunQJ3gw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-json-compat-utils@0.2.1: + resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==} + engines: {node: '>=12'} + peerDependencies: + '@eslint/json': '*' + eslint: '*' + jsonc-eslint-parser: ^2.4.0 + peerDependenciesMeta: + '@eslint/json': + optional: true + + eslint-merge-processors@1.0.0: + resolution: {integrity: sha512-4GybyHmhXtT7/W8RAouQzNM0791sYasJCTYHIAYjuiJvbNFY0jMKkoESREhX+mjX37dxiN6v4EqhZ1nc0tJF7A==} + peerDependencies: + eslint: '*' + + eslint-plugin-antfu@2.7.0: + resolution: {integrity: sha512-gZM3jq3ouqaoHmUNszb1Zo2Ux7RckSvkGksjLWz9ipBYGSv1EwwBETN6AdiUXn+RpVHXTbEMPAPlXJazcA6+iA==} + peerDependencies: + eslint: '*' + + eslint-plugin-command@2.1.0: + resolution: {integrity: sha512-S3gvDSCRHLdRG7NYaevLvGA0g/txOju7NEB2di7SE80NtbCwsvpi/fft045YuTZpOzqCRUfuye39raldmpXXYQ==} + peerDependencies: + eslint: '*' + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-x@4.13.1: + resolution: {integrity: sha512-Ua4HZBmG5TNr18q3Is+nT6mKCzNNpycqtv/+TkIK7E3w4LBlPlZI6vLwmDjXdIZtJPP2Z1Oh5+wksWwlcCjMpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + eslint-plugin-jsdoc@50.6.17: + resolution: {integrity: sha512-hq+VQylhd12l8qjexyriDsejZhqiP33WgMTy2AmaGZ9+MrMWVqPECsM87GPxgHfQn0zw+YTuhqjUfk1f+q67aQ==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-jsonc@2.20.1: + resolution: {integrity: sha512-gUzIwQHXx7ZPypUoadcyRi4WbHW2TPixDr0kqQ4miuJBU0emJmyGTlnaT3Og9X2a8R1CDayN9BFSq5weGWbTng==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-n@17.18.0: + resolution: {integrity: sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-no-only-tests@3.3.0: + resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} + engines: {node: '>=5.0.0'} + + eslint-plugin-perfectionist@4.13.0: + resolution: {integrity: sha512-dsPwXwV7IrG26PJ+h1crQ1f5kxay/gQAU0NJnbVTQc91l5Mz9kPjyIZ7fXgie+QSgi8a+0TwGbfaJx+GIhzuoQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + eslint: '>=8.45.0' + + eslint-plugin-regexp@2.7.0: + resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==} + engines: {node: ^18 || >=20} + peerDependencies: + eslint: '>=8.44.0' + + eslint-plugin-toml@0.12.0: + resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-unicorn@56.0.1: + resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} + engines: {node: '>=18.18'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-plugin-unused-imports@4.1.4: + resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-plugin-vue@9.33.0: + resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-yml@1.18.0: + resolution: {integrity: sha512-9NtbhHRN2NJa/s3uHchO3qVVZw0vyOIvWlXWGaKCr/6l3Go62wsvJK5byiI6ZoYztDsow4GnS69BZD3GnqH3hA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-processor-vue-blocks@1.0.0: + resolution: {integrity: sha512-q+Wn9bCml65NwYtuINVCE5dUqZa/uVoY4jfc8qEDwWbcGqdRyfJJmAONNZsreA4Q9EJqjYGjk8Hk1QuwAktgkw==} + peerDependencies: + '@vue/compiler-sfc': ^3.3.0 + eslint: ^8.50.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.27.0: + resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exsolve@1.0.5: + resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.4: + resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + miniprogram-api-typings@3.12.3: + resolution: {integrity: sha512-o7bOfrU28MEMCBWo83nXv0ROQSBFxJcfCl4f2wTYqah64ipC5RGqLJfvWJTWhlQt2ECVwspSzM8LgvnfMo7TEQ==} + + miniprogram-licia@1.48.0: + resolution: {integrity: sha512-pe+l/+cIYIWZkLMKCANUQkqwiqrgEw0/Sm9juulXM/teUumG7mm9A9zTXzIlImpv84iizbkYxKZ32WE0U6qSxA==} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + mp-html@2.5.1: + resolution: {integrity: sha512-7BEH8dnQ89kOIyjdoYni8zcc0QAg+lgEWg0n9or9q2D4l26JNG+KPzHfttDyisC/5S7aPBblpXrFTYQv475w/Q==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.11.6: + resolution: {integrity: sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toml-eslint-parser@0.10.0: + resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typescript-treasure@0.0.9: + resolution: {integrity: sha512-QPmpqJvQqZ7rt2iVNzPrtQNSFs1zVuTuP+jzE3np7qytEUcfSKtAW8RTDslldeAwaJjVJa0UM3ps1uVddpEMqQ==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unrs-resolver@1.7.2: + resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml-eslint-parser@1.3.0: + resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==} + engines: {node: ^14.17.0 || >=16.0.0} + + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/eslint-config@3.16.0(@vue/compiler-sfc@3.5.14)(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@clack/prompts': 0.9.1 + '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.27.0) + '@eslint/markdown': 6.4.0 + '@stylistic/eslint-plugin': 2.13.0(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + '@vitest/eslint-plugin': 1.2.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 + eslint-config-flat-gitignore: 1.0.1(eslint@9.27.0) + eslint-flat-config-utils: 1.1.0 + eslint-merge-processors: 1.0.0(eslint@9.27.0) + eslint-plugin-antfu: 2.7.0(eslint@9.27.0) + eslint-plugin-command: 2.1.0(eslint@9.27.0) + eslint-plugin-import-x: 4.13.1(eslint@9.27.0)(typescript@5.8.3) + eslint-plugin-jsdoc: 50.6.17(eslint@9.27.0) + eslint-plugin-jsonc: 2.20.1(eslint@9.27.0) + eslint-plugin-n: 17.18.0(eslint@9.27.0) + eslint-plugin-no-only-tests: 3.3.0 + eslint-plugin-perfectionist: 4.13.0(eslint@9.27.0)(typescript@5.8.3) + eslint-plugin-regexp: 2.7.0(eslint@9.27.0) + eslint-plugin-toml: 0.12.0(eslint@9.27.0) + eslint-plugin-unicorn: 56.0.1(eslint@9.27.0) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0) + eslint-plugin-vue: 9.33.0(eslint@9.27.0) + eslint-plugin-yml: 1.18.0(eslint@9.27.0) + eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.14)(eslint@9.27.0) + globals: 15.15.0 + jsonc-eslint-parser: 2.4.0 + local-pkg: 1.1.1 + parse-gitignore: 2.0.0 + picocolors: 1.1.1 + toml-eslint-parser: 0.10.0 + vue-eslint-parser: 9.4.3(eslint@9.27.0) + yaml-eslint-parser: 1.3.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@eslint/json' + - '@vue/compiler-sfc' + - supports-color + - typescript + - vitest + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@0.7.10': {} + + '@babel/cli@7.27.2(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@jridgewell/trace-mapping': 0.3.25 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.27.2': {} + + '@babel/core@7.27.1': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.1': + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.1': + dependencies: + '@babel/types': 7.27.1 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.0 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/traverse@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@clack/core@0.4.1': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.9.1': + dependencies: + '@clack/core': 0.4.1 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@es-joy/jsdoccomment@0.50.2': + dependencies: + '@types/estree': 1.0.7 + '@typescript-eslint/types': 8.32.1 + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.1.0 + + '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.27.0)': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 9.27.0 + ignore: 5.3.2 + + '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0)': + dependencies: + eslint: 9.27.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.9(eslint@9.27.0)': + optionalDependencies: + eslint: 9.27.0 + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.2': {} + + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.27.0': {} + + '@eslint/markdown@6.4.0': + dependencies: + '@eslint/core': 0.10.0 + '@eslint/plugin-kit': 0.2.8 + mdast-util-from-markdown: 2.0.2 + mdast-util-frontmatter: 2.0.1 + mdast-util-gfm: 3.1.0 + micromark-extension-frontmatter: 2.0.0 + micromark-extension-gfm: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@eslint/plugin-kit@0.3.1': + dependencies: + '@eslint/core': 0.14.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@miniprogram-component-plus/video-swiper@1.0.1': {} + + '@napi-rs/wasm-runtime@0.2.10': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgr/core@0.2.4': {} + + '@stylistic/eslint-plugin@2.13.0(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + estraverse: 5.3.0 + picomatch: 4.0.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.7': {} + + '@types/json-schema@7.0.15': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + eslint: 9.27.0 + graphemer: 1.4.0 + ignore: 7.0.4 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 + eslint: 9.27.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.32.1': + dependencies: + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + + '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.27.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.32.1': {} + + '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/visitor-keys': 8.32.1 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@typescript-eslint/scope-manager': 8.32.1 + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + eslint: 9.27.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.32.1': + dependencies: + '@typescript-eslint/types': 8.32.1 + eslint-visitor-keys: 4.2.0 + + '@unrs/resolver-binding-darwin-arm64@1.7.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.7.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.10 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + optional: true + + '@vant/weapp@1.11.7': {} + + '@vitest/eslint-plugin@1.2.1(eslint@9.27.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.14': + dependencies: + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.14 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.14': + dependencies: + '@vue/compiler-core': 3.5.14 + '@vue/shared': 3.5.14 + + '@vue/compiler-sfc@3.5.14': + dependencies: + '@babel/parser': 7.28.0 + '@vue/compiler-core': 3.5.14 + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.14': + dependencies: + '@vue/compiler-dom': 3.5.14 + '@vue/shared': 3.5.14 + + '@vue/shared@3.5.14': {} + + a-calc@2.2.14: + dependencies: + typescript-treasure: 0.0.9 + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + optional: true + + are-docs-informative@0.0.2: {} + + argparse@2.0.1: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: + optional: true + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.5: + dependencies: + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.157 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + + builtin-modules@3.3.0: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001718: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities@2.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + + ci-info@4.2.0: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@6.2.1: {} + + comment-parser@1.4.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + convert-source-map@2.0.0: {} + + core-js-compat@3.42.0: + dependencies: + browserslist: 4.24.5 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + dayjs@1.11.13: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + electron-to-chromium@1.5.157: {} + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.27.0): + dependencies: + eslint: 9.27.0 + semver: 7.7.2 + + eslint-compat-utils@0.6.5(eslint@9.27.0): + dependencies: + eslint: 9.27.0 + semver: 7.7.2 + + eslint-config-flat-gitignore@1.0.1(eslint@9.27.0): + dependencies: + '@eslint/compat': 1.2.9(eslint@9.27.0) + eslint: 9.27.0 + + eslint-config-prettier@9.1.0(eslint@9.27.0): + dependencies: + eslint: 9.27.0 + + eslint-flat-config-utils@1.1.0: + dependencies: + pathe: 2.0.3 + + eslint-import-context@0.1.5(unrs-resolver@1.7.2): + dependencies: + get-tsconfig: 4.10.1 + stable-hash: 0.0.5 + optionalDependencies: + unrs-resolver: 1.7.2 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-json-compat-utils@0.2.1(eslint@9.27.0)(jsonc-eslint-parser@2.4.0): + dependencies: + eslint: 9.27.0 + esquery: 1.6.0 + jsonc-eslint-parser: 2.4.0 + + eslint-merge-processors@1.0.0(eslint@9.27.0): + dependencies: + eslint: 9.27.0 + + eslint-plugin-antfu@2.7.0(eslint@9.27.0): + dependencies: + '@antfu/utils': 0.7.10 + eslint: 9.27.0 + + eslint-plugin-command@2.1.0(eslint@9.27.0): + dependencies: + '@es-joy/jsdoccomment': 0.50.2 + eslint: 9.27.0 + + eslint-plugin-es-x@7.8.0(eslint@9.27.0): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@eslint-community/regexpp': 4.12.1 + eslint: 9.27.0 + eslint-compat-utils: 0.5.1(eslint@9.27.0) + + eslint-plugin-import-x@4.13.1(eslint@9.27.0)(typescript@5.8.3): + dependencies: + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + comment-parser: 1.4.1 + debug: 4.4.1 + eslint: 9.27.0 + eslint-import-context: 0.1.5(unrs-resolver@1.7.2) + eslint-import-resolver-node: 0.3.9 + is-glob: 4.0.3 + minimatch: 10.0.1 + semver: 7.7.2 + stable-hash: 0.0.5 + tslib: 2.8.1 + unrs-resolver: 1.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsdoc@50.6.17(eslint@9.27.0): + dependencies: + '@es-joy/jsdoccomment': 0.50.2 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint: 9.27.0 + espree: 10.3.0 + esquery: 1.6.0 + parse-imports-exports: 0.2.4 + semver: 7.7.2 + spdx-expression-parse: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-jsonc@2.20.1(eslint@9.27.0): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + eslint: 9.27.0 + eslint-compat-utils: 0.6.5(eslint@9.27.0) + eslint-json-compat-utils: 0.2.1(eslint@9.27.0)(jsonc-eslint-parser@2.4.0) + espree: 10.3.0 + graphemer: 1.4.0 + jsonc-eslint-parser: 2.4.0 + natural-compare: 1.4.0 + synckit: 0.11.6 + transitivePeerDependencies: + - '@eslint/json' + + eslint-plugin-n@17.18.0(eslint@9.27.0): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + enhanced-resolve: 5.18.1 + eslint: 9.27.0 + eslint-plugin-es-x: 7.8.0(eslint@9.27.0) + get-tsconfig: 4.10.1 + globals: 15.15.0 + ignore: 5.3.2 + minimatch: 9.0.5 + semver: 7.7.2 + + eslint-plugin-no-only-tests@3.3.0: {} + + eslint-plugin-perfectionist@4.13.0(eslint@9.27.0)(typescript@5.8.3): + dependencies: + '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) + eslint: 9.27.0 + natural-orderby: 5.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-regexp@2.7.0(eslint@9.27.0): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@eslint-community/regexpp': 4.12.1 + comment-parser: 1.4.1 + eslint: 9.27.0 + jsdoc-type-pratt-parser: 4.1.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 + + eslint-plugin-toml@0.12.0(eslint@9.27.0): + dependencies: + debug: 4.4.1 + eslint: 9.27.0 + eslint-compat-utils: 0.6.5(eslint@9.27.0) + lodash: 4.17.21 + toml-eslint-parser: 0.10.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-unicorn@56.0.1(eslint@9.27.0): + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + ci-info: 4.2.0 + clean-regexp: 1.0.0 + core-js-compat: 3.42.0 + eslint: 9.27.0 + esquery: 1.6.0 + globals: 15.15.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.7.2 + strip-indent: 3.0.0 + + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0): + dependencies: + eslint: 9.27.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3) + + eslint-plugin-vue@9.33.0(eslint@9.27.0): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + eslint: 9.27.0 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.2 + vue-eslint-parser: 9.4.3(eslint@9.27.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-yml@1.18.0(eslint@9.27.0): + dependencies: + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint: 9.27.0 + eslint-compat-utils: 0.6.5(eslint@9.27.0) + natural-compare: 1.4.0 + yaml-eslint-parser: 1.3.0 + transitivePeerDependencies: + - supports-color + + eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.14)(eslint@9.27.0): + dependencies: + '@vue/compiler-sfc': 3.5.14 + eslint: 9.27.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.27.0: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.27.0 + '@eslint/plugin-kit': 0.3.1 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + espree@9.6.1: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + exsolve@1.0.5: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + format@0.2.2: {} + + fs-readdir-recursive@1.1.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.15.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} + + ignore@5.3.2: {} + + ignore@7.0.4: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + optional: true + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdoc-type-pratt-parser@4.1.0: {} + + jsesc@0.5.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonc-eslint-parser@2.4.0: + dependencies: + acorn: 8.14.1 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.7.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + min-indent@1.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + miniprogram-api-typings@3.12.3: {} + + miniprogram-licia@1.48.0: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.1 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mp-html@2.5.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + napi-postinstall@0.2.4: {} + + natural-compare@1.4.0: {} + + natural-orderby@5.0.0: {} + + node-releases@2.0.19: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: + optional: true + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-manager-detector@1.3.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-gitignore@2.0.0: {} + + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-statements@1.0.11: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.5 + pathe: 2.0.3 + + pluralize@8.0.0: {} + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.5.3: {} + + punycode@2.3.1: {} + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + optional: true + + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + + regexp-tree@0.1.27: {} + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + sisteransi@1.0.5: {} + + slash@2.0.0: {} + + source-map-js@1.2.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + + stable-hash@0.0.5: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.11.6: + dependencies: + '@pkgr/core': 0.2.4 + + tapable@2.2.2: {} + + tinyexec@1.0.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toml-eslint-parser@0.10.0: + dependencies: + eslint-visitor-keys: 3.4.3 + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + typescript-treasure@0.0.9: {} + + typescript@5.8.3: {} + + ufo@1.6.1: {} + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unrs-resolver@1.7.2: + dependencies: + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.7.2 + '@unrs/resolver-binding-darwin-x64': 1.7.2 + '@unrs/resolver-binding-freebsd-x64': 1.7.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-musl': 1.7.2 + '@unrs/resolver-binding-wasm32-wasi': 1.7.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 + + update-browserslist-db@1.1.3(browserslist@4.24.5): + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vue-eslint-parser@9.4.3(eslint@9.27.0): + dependencies: + debug: 4.4.1 + eslint: 9.27.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + xml-name-validator@4.0.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml-eslint-parser@1.3.0: + dependencies: + eslint-visitor-keys: 3.4.3 + yaml: 2.8.0 + + yaml@2.8.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 + + zwitch@2.0.4: {} diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..d105a55 --- /dev/null +++ b/project.config.json @@ -0,0 +1,76 @@ +{ + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "miniprogramRoot": "src/", + "compileType": "miniprogram", + "setting": { + "useCompilerPlugins": [ + "typescript", + "sass" + ], + "urlCheck": true, + "coverView": true, + "es6": true, + "postcss": true, + "lazyloadPlaceholderEnable": false, + "preloadBackgroundData": false, + "minified": true, + "autoAudits": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "enhance": true, + "useMultiFrameRuntime": true, + "showShadowRootInWxmlPanel": true, + "packNpmManually": true, + "packNpmRelationList": [ + { + "packageJsonPath": "package.json", + "miniprogramNpmDistDir": "./src" + } + ], + "minifyWXSS": true, + "useStaticServer": true, + "showES6CompileOption": false, + "checkInvalidKey": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "disableUseStrict": false, + "minifyWXML": true, + "localPlugins": false, + "condition": false, + "ignoreUploadUnusedFiles": true, + "compileWorklet": false, + "swc": false, + "disableSWC": true + }, + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "condition": {}, + "srcMiniprogramRoot": "src/", + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "packOptions": { + "ignore": [ + { + "value": "/images/*.*", + "type": "glob" + }, + { + "value": "/images/**/*.*", + "type": "glob" + } + ], + "include": [] + }, + "appid": "wxfc95e2961d481f58", + "scripts": { + "beforeCompile": "pnpm run beforeCompile", + "beforePreview": "pnpm run beforeCompile", + "beforeUpload": "pnpm run beforeCompile" + }, + "libVersion": "3.5.8" +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..c9c0302 --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,24 @@ +{ + "projectname": "drug-miniporgram", + "setting": { + "compileHotReLoad": true, + "urlCheck": true, + "coverView": true, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": true, + "useStaticServer": true, + "useLanDebug": false, + "showES6CompileOption": false, + "checkInvalidKey": true, + "ignoreDevUnusedFiles": true, + "bigPackageSizeSupport": false + }, + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "condition": {}, + "libVersion": "3.5.8" +} \ No newline at end of file diff --git a/src/api/request.ts b/src/api/request.ts new file mode 100644 index 0000000..0eaa79a --- /dev/null +++ b/src/api/request.ts @@ -0,0 +1,82 @@ +interface IGlobalParams { + gUrl: string + version: string +} + +export const request = function ( + { gUrl, version }: IGlobalParams, + { + url, + method, + data, + header, + showMsg = true, + loading = false, + loadingText = '加载中...', + isJSON = false, + ...options + }: IAgaxParams, +): Promise { + return new Promise((resolve, reject) => { + if (loading) { + wx.showLoading({ + title: loadingText, + mask: true, + }) + } + wx.request({ + header: { + loginState: getApp().globalData.loginState, + ...header, + }, + url: gUrl + url, + method, + data: { + loginState: getApp().globalData.loginState, + ...(data as object), + }, + ...options, + success(res: any) { + const { code, data } = res.data + if (isJSON) { + resolve(res.data) + } else if (code === 0) { + resolve(data) + } else if (showMsg) { + const msg = errPicker(res.data) + if (loading) { + setTimeout(() => { + wx.showToast({ + title: msg, + icon: 'none', + }) + }, 30) + } else { + wx.showToast({ + title: msg, + icon: 'none', + }) + reject(res) + } + } else { + reject(res) + } + }, + fail(err) { + reject(err) + }, + complete() { + if (loading) { + wx.hideLoading() + } + }, + }) + }) +} + +function errPicker(err) { + if (typeof err === 'string') { + return err + } + return err.data || err.msg || err.errMsg || (err.detail && err.detail.errMsg) || '未知错误' +} diff --git a/src/app.json b/src/app.json new file mode 100644 index 0000000..b831987 --- /dev/null +++ b/src/app.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://dldir1.qq.com/WechatWebDev/editor-extension/wx-json/app.schema.json", + "pages": ["pages/start/index", "pages/index/index"], + "subPackages": [ + { + "root": "patient", + "pages": [] + }, + { + "root": "doctor", + "pages": [] + }, + { + "root": "doc", + "pages": ["pages/doc1/index"] + } + ], + "window": { + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#fff", + "navigationBarTitleText": "Weixin", + "navigationBarTextStyle": "black" + }, + "sitemapLocation": "sitemap.json", + "resolveAlias": { + "@/*": "/*" + }, + "usingComponents": { + "pagination": "/components/pagination/index", + "van-icon": "@vant/weapp/icon/index" + }, + "requiredPrivateInfos": [], + "permission": { + "scope.userFuzzyLocation": { + "desc": "获取您的当前位置,用于模糊匹配您附近的活动" + } + } +} diff --git a/src/app.scss b/src/app.scss new file mode 100644 index 0000000..8e1b4f5 --- /dev/null +++ b/src/app.scss @@ -0,0 +1,35 @@ +.clearfix:after { + content: '020'; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.clearfix { + /* 触发 hasLayout */ + zoom: 1; +} + +.scroll::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; +} + +.extend-via-pseudo-elem { + position: relative; + overflow: visible; + &::before { + content: ''; + position: absolute; + top: -20rpx; + right: -20rpx; + bottom: -20rpx; + left: -20rpx; + } +} + +view { + word-break: break-all; +} diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..5d98d7d --- /dev/null +++ b/src/app.ts @@ -0,0 +1,254 @@ +/* eslint-disable */ +// app.ts +import { request } from './api/request' +import { parseScene } from './utils/util' +const licia = require('miniprogram-licia') + +import plugin from './components/calendar/plugins/index' +import selectable from './components/calendar/plugins/selectable' +import solarLunar from './components/calendar/plugins/solarLunar/index' +import todo from './components/calendar/plugins/todo' +import week from './components/calendar/plugins/week.js' + +plugin.use(todo).use(solarLunar).use(selectable).use(week) + +const dayjs = require('dayjs') +require('/utils/dayjs/day-zh-cn.js') +const relativeTime = require('/utils/dayjs/relativeTime.js') +dayjs.locale('zh-cn') // 全局使用 +dayjs.extend(relativeTime) + +// page +import page from '@/utils/page' + +App({ + globalData: { + // dev + // appid:wxa4ece062e60e93a5 + // url: 'https://m.wtx.hbraas.com', + // upFileUrl: 'https://m.wtx.hbraas.com/', + // imageUrl: 'https://m.wtx.hbraas.com/GeneB/', + + // pro + // appid:wx96104303877e3fd9 老的正式环境,已弃用 + // appid:wxfc95e2961d481f58 + url: 'https://m.hbgene.hbsaas.com', + upFileUrl: 'https://m.hbgene.hbsaas.com/', + imageUrl: 'https://m.hbgene.hbsaas.com/GeneB/', + + Timestamp: new Date().getTime(), + + waitBindDoctorId: '', + scene: {}, + + loginState: '', + initLoginInfo: {}, + + // anyWhere: true, + anyWhere: false, + + userInfo: {}, + }, + onLaunch() { + this.autoUpdate() + + Page = page as WechatMiniprogram.Page.Constructor + + wx.ajax = licia.curry(request)({ gUrl: this.globalData.url }) + + wx.setInnerAudioOption({ + obeyMuteSwitch: false, + mixWithOther: false, + }) + }, + onShow(options) { + if (options.query.scene) { + this.globalData.scene = parseScene(options.query.scene) as { workerId: string } + } + this.startLogin() + }, + startLogin(callback?: () => void) { + wx.login({ + success: (res) => { + wx.ajax({ + method: 'GET', + url: '?r=wtx/user/init-login', + data: { + code: res.code, + }, + }).then((res) => { + this.globalData.loginState = res.loginState + this.globalData.initLoginInfo = res + if (callback) { + callback() + } + }) + }, + }) + }, + updateLoginInfo(callback?: () => void) { + wx.ajax({ + method: 'GET', + url: '?r=wtx/user/init-info', + data: {}, + }).then((res) => { + this.globalData.initLoginInfo = res + if (callback) { + callback() + } + }) + }, + waitLogin({ type = 0 } = { type: 'any' }) { + return new Promise((resolve) => { + const checkLogin = () => { + if (this.globalData.loginState) { + if (this.checkLoginType(type)) { + resolve() + } + return + } + setTimeout(() => { + checkLogin() + }, 500) + } + checkLogin() + }) + }, + checkLoginType(type: 0 | 1 | 2 | 'any') { + const { loginType, isLogin, isReg } = this.globalData.initLoginInfo + + if (type === 'any') { + return true + } + + if (isLogin !== 1) { + if (type === 0) { + return true + } + wx.reLaunch({ + url: '/pages/index/index', + }) + return false + } + + if (isReg !== 1) { + const typePageUrl = { + 1: '/patient/pages/entryInfo/index', + 2: '/doctor/pages/login/index', + }[loginType as 1 | 2] + wx.reLaunch({ + url: typePageUrl, + }) + return false + } + + if (loginType !== type) { + const typePageUrl = { + 1: '/patient/pages/index/index', + 2: '/doctor/pages/index/index', + }[loginType as 1 | 2] + wx.reLaunch({ + url: typePageUrl, + }) + return false + } + + return true + }, + mpBehavior(data: { PageName: string }) { + const { loginType } = this.globalData.initLoginInfo + const url = { + 1: '?r=wtx/mp-behavior/add', + 2: '?r=wtx/doctor/mp-behavior/add', + }[loginType as 1 | 2] + wx.ajax({ + method: 'POST', + url, + data: data, + loading: false, + showMsg: false, + }).then((res) => { + console.log('res: ', res) + }) + }, + + getUserInfo(type: 0 | 1 | 2 = 0) { + const url = { + 0: '?r=wtx/user/userinfo', + 1: '?r=wtx/account/info', + 2: '?r=wtx/doctor/account/info', + }[type] + return wx.ajax({ + method: 'GET', + url: url, + }) + }, + getDoctorInfo(doctorId: string) { + return wx.ajax({ + method: 'GET', + url: '?r=wtx/doctor/get-info', + data: { + doctorId, + }, + }) + }, + autoUpdate: function () { + var self = this + // 获取小程序更新机制兼容 + if (wx.canIUse('getUpdateManager')) { + const updateManager = wx.getUpdateManager() + //1. 检查小程序是否有新版本发布 + updateManager.onCheckForUpdate(function (res) { + // 请求完新版本信息的回调 + if (res.hasUpdate) { + //检测到新版本,需要更新,给出提示 + wx.showModal({ + title: '更新提示', + content: '检测到新版本,是否下载新版本并重启小程序?', + success: function (res) { + if (res.confirm) { + //2. 用户确定下载更新小程序,小程序下载及更新静默进行 + self.downLoadAndUpdate(updateManager) + } else if (res.cancel) { + //用户点击取消按钮的处理,如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了 + wx.showModal({ + title: '温馨提示~', + content: '本次版本更新涉及到新的功能添加,旧版本无法正常访问的哦~', + showCancel: false, //隐藏取消按钮 + confirmText: '确定更新', //只保留确定更新按钮 + success: function (res) { + if (res.confirm) { + //下载新版本,并重新应用 + self.downLoadAndUpdate(updateManager) + } + }, + }) + } + }, + }) + } + }) + } else { + // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示 + wx.showModal({ + title: '提示', + content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。', + }) + } + }, + downLoadAndUpdate: function (updateManager) { + //静默下载更新小程序新版本 + updateManager.onUpdateReady(function () { + wx.hideLoading() + //新的版本已经下载好,调用 applyUpdate 应用新版本并重启 + updateManager.applyUpdate() + }) + updateManager.onUpdateFailed(function () { + // 新的版本下载失败 + wx.showModal({ + title: '新版本更新失败', + content: '您可删除当前小程序,重新打开尝试', + }) + }) + }, +}) diff --git a/src/components/calendar/core.js b/src/components/calendar/core.js new file mode 100644 index 0000000..d71c4e4 --- /dev/null +++ b/src/components/calendar/core.js @@ -0,0 +1,144 @@ +import { dateUtil, getCalendarConfig } from './utils/index' + +/** + * 计算当前月份前后两月应占的格子 + * @param {number} year 年份 + * @param {number} month 月份 + */ +function calculateEmptyGrids(year, month, config) { + const prevMonthGrids = calculatePrevMonthGrids(year, month, config) + const nextMonthGrids = calculateNextMonthGrids(year, month, config) + return { + prevMonthGrids, + nextMonthGrids + } +} + +/** + * 计算上月应占的格子 + * @param {number} year 年份 + * @param {number} month 月份 + */ +function calculatePrevMonthGrids(year, month, config) { + let emptyGrids = [] + const prevMonthDays = dateUtil.getDatesCountOfMonth(year, month - 1) + let firstDayOfWeek = dateUtil.firstDayOfWeek(year, month) + if (config.firstDayOfWeek === 'Mon') { + if (firstDayOfWeek === 0) { + firstDayOfWeek = 6 + } else { + firstDayOfWeek -= 1 + } + } + if (firstDayOfWeek > 0) { + const len = prevMonthDays - firstDayOfWeek + const { onlyShowCurrentMonth } = config + const YMInfo = dateUtil.getPrevMonthInfo({ year, month }) + for (let i = prevMonthDays; i > len; i--) { + if (onlyShowCurrentMonth) { + emptyGrids.push('') + } else { + const week = dateUtil.getDayOfWeek(+year, +month, i) + emptyGrids.push({ + ...YMInfo, + date: i, + week + }) + } + } + emptyGrids.reverse() + } + return emptyGrids +} +/** + * 计算下一月日期是否需要多展示的日期 + * 某些月份日期为5排,某些月份6排,统一为6排 + * @param {number} year + * @param {number} month + * @param {object} config + */ +function calculateExtraEmptyDate(year, month, config) { + let extDate = 0 + if (+month === 2) { + extDate += 7 + let firstDayofMonth = dateUtil.getDayOfWeek(year, month, 1) + if (config.firstDayOfWeek === 'Mon') { + if (+firstDayofMonth === 1) extDate += 7 + } else { + if (+firstDayofMonth === 0) extDate += 7 + } + } else { + let firstDayofMonth = dateUtil.getDayOfWeek(year, month, 1) + if (config.firstDayOfWeek === 'Mon') { + if (firstDayofMonth !== 0 && firstDayofMonth < 6) { + extDate += 7 + } + } else { + if (firstDayofMonth <= 5) { + extDate += 7 + } + } + } + return extDate +} +/** + * 计算下月应占的格子 + * @param {number} year 年份 + * @param {number} month 月份 + */ +function calculateNextMonthGrids(year, month, config) { + let emptyGrids = [] + const datesCount = dateUtil.getDatesCountOfMonth(year, month) + let lastDayWeek = dateUtil.getDayOfWeek(year, month, datesCount) + if (config.firstDayOfWeek === 'Mon') { + if (lastDayWeek === 0) { + lastDayWeek = 6 + } else { + lastDayWeek -= 1 + } + } + let len = 7 - (lastDayWeek + 1) + const { onlyShowCurrentMonth } = config + if (!onlyShowCurrentMonth) { + len = len + calculateExtraEmptyDate(year, month, config) + } + const YMInfo = dateUtil.getNextMonthInfo({ year, month }) + for (let i = 1; i <= len; i++) { + const week = dateUtil.getDayOfWeek(+year, +month, i) + if (onlyShowCurrentMonth) { + emptyGrids.push('') + } else { + emptyGrids.push({ + id: i - 1, + ...YMInfo, + date: i, + week: week || 7 + }) + } + } + return emptyGrids +} +/** + * 设置日历面板数据 + * @param {number} year 年份 + * @param {number} month 月份 + * @param {number} curDate 日期 + */ +function calculateCurrentMonthDates(year, month) { + return dateUtil.calcDates(year, month) +} + +export function calcJumpData({ dateInfo, config, component }) { + dateInfo = dateInfo || dateUtil.todayFMD() + const { year, month, date } = dateInfo + const calendarConfig = config || getCalendarConfig(component) + const emptyGrids = calculateEmptyGrids(year, month, calendarConfig) + const calendar = { + curYear: year, + curMonth: month, + curDate: date, + dates: calculateCurrentMonthDates(year, month), + ...emptyGrids + } + return calendar +} diff --git a/src/components/calendar/helper.js b/src/components/calendar/helper.js new file mode 100644 index 0000000..981c452 --- /dev/null +++ b/src/components/calendar/helper.js @@ -0,0 +1,12 @@ +import { dateUtil } from './utils/index' + +export function calcTargetYMInfo() { + return { + right: dateUtil.getPrevMonthInfo, + left: dateUtil.getNextMonthInfo, + prev_month: dateUtil.getPrevMonthInfo, + next_month: dateUtil.getNextMonthInfo, + prev_year: dateUtil.getPrevYearInfo, + next_year: dateUtil.getNextYearInfo + } +} diff --git a/src/components/calendar/index.d.ts b/src/components/calendar/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/calendar/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/components/calendar/index.js b/src/components/calendar/index.js new file mode 100644 index 0000000..1d4cad6 --- /dev/null +++ b/src/components/calendar/index.js @@ -0,0 +1,258 @@ +import plugins from './plugins/index' +import { calcJumpData } from './core' +import { renderCalendar } from './render' +import { calcTargetYMInfo } from './helper' +import { dateUtil, calendarGesture, logger } from './utils/index' + +Component({ + options: { + styleIsolation: 'apply-shared', + multipleSlots: true // 在组件定义时的选项中启用多slot支持 + }, + properties: { + config: { + type: Object, + value: {} + } + }, + lifetimes: { + attached: function() { + this.initComp() + } + }, + methods: { + initComp() { + const calendarConfig = this.setDefaultDisableDate() + this.setConfig(calendarConfig) + }, + // 禁用某天日期配置默认为今天 + setDefaultDisableDate() { + const calendarConfig = this.properties.config || {} + if (calendarConfig.disableMode && !calendarConfig.disableMode.date) { + calendarConfig.disableMode.date = dateUtil.toTimeStr( + dateUtil.todayFMD() + ) + } + return calendarConfig + }, + initCalendar(config) { + const { defaultDate } = config + let date = dateUtil.todayFMD() + if (defaultDate && typeof defaultDate === 'string') { + const dateInfo = defaultDate.split('-') + if (dateInfo.length < 3) { + return logger.warn('defaultDate配置格式应为: 2018-4-2 或 2018-04-02') + } else { + date = { + year: +dateInfo[0], + month: +dateInfo[1], + date: +dateInfo[2] + } + } + } + const waitRenderData = calcJumpData({ + dateInfo: date, + config + }) + const timestamp = dateUtil.todayTimestamp() + if (config.autoChoosedWhenJump) { + const target = waitRenderData.dates.filter( + item => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(date) + ) + if (target && target.length) { + if (!waitRenderData.selectedDates) { + waitRenderData.selectedDates = target + } else { + waitRenderData.selectedDates.push(target[0]) + } + } + } + return { + ...waitRenderData, + todayTimestamp: timestamp, + weeksCh: dateUtil.getWeekHeader(config.firstDayOfWeek) + } + }, + setConfig(config) { + if (config.markToday && typeof config.markToday === 'string') { + config.highlightToday = true + } + config.theme = config.theme || 'default' + this.setData( + { + config + }, + () => { + for (let plugin of plugins.installed) { + const [, p] = plugin + if (typeof p.install === 'function') { + p.install(this) + } + if (typeof p.methods === 'function') { + const methods = p.methods(this) + for (let fnName in methods) { + if (fnName.startsWith('__')) continue + const fn = methods[fnName] + if (typeof fn === 'function') { + if (!this.calendar) this.calendar = {} + this.calendar[fnName] = fn + } + } + } + } + const initData = this.initCalendar(config) + renderCalendar.call(this, initData, config) + } + ) + }, + tapDate(e) { + const { info } = e.currentTarget.dataset + const { date, disable } = info || {} + if (disable || !date) return + const { calendar, config } = this.data + let calendarData = calendar + let calendarConfig = config + if (config.takeoverTap) { + return this.triggerEvent('takeoverTap', info) + } + for (let plugin of plugins.installed) { + const [, p] = plugin + if (typeof p.onTapDate === 'function') { + const { + calendarData: __calendarData, + calendarConfig: __calendarConfig + } = p.onTapDate(info, calendarData, calendarConfig) + calendarData = __calendarData + calendarConfig = __calendarConfig + } + } + renderCalendar.call(this, calendarData, calendarConfig).then(() => { + this.triggerEvent('afterTapDate', info) + }) + }, + /** + * 日历滑动开始 + * @param {object} e + */ + calendarTouchstart(e) { + const t = e.touches[0] + const startX = t.clientX + const startY = t.clientY + this.swipeLock = true + this.setData({ + 'gesture.startX': startX, + 'gesture.startY': startY + }) + }, + /** + * 日历滑动中 + * @param {object} e + */ + calendarTouchmove(e) { + const { gesture } = this.data + const { preventSwipe } = this.properties.config + if (!this.swipeLock || preventSwipe) return + if (calendarGesture.isLeft(gesture, e.touches[0])) { + this.handleSwipe('left') + this.swipeLock = false + } + if (calendarGesture.isRight(gesture, e.touches[0])) { + this.handleSwipe('right') + this.swipeLock = false + } + }, + calendarTouchend(e) { + this.setData({ + 'calendar.leftSwipe': 0, + 'calendar.rightSwipe': 0 + }) + }, + handleSwipe(direction) { + let swipeKey = 'calendar.leftSwipe' + if (direction === 'right') { + swipeKey = 'calendar.rightSwipe' + } + this.setData({ + [swipeKey]: 1 + }) + const { calendar } = this.data + let calendarData = calendar + const { curYear, curMonth } = calendarData + const getMonthInfo = calcTargetYMInfo()[direction] + const target = getMonthInfo({ + year: +curYear, + month: +curMonth + }) + target.direction = direction + this.renderCalendar(target) + }, + changeDate(e) { + const { type } = e.currentTarget.dataset + const { calendar: calendarData } = this.data + const { curYear, curMonth } = calendarData + const getMonthInfo = calcTargetYMInfo()[type] + const target = getMonthInfo({ + year: +curYear, + month: +curMonth + }) + target.direction = type + this.renderCalendar(target) + }, + renderCalendar(target) { + let { calendar: calendarData, config } = this.data + const { curYear, curMonth } = calendarData || {} + for (let plugin of plugins.installed) { + const [, p] = plugin + if (typeof p.onSwitchCalendar === 'function') { + calendarData = p.onSwitchCalendar(target, calendarData, this) + } + } + return renderCalendar.call(this, calendarData, config).then(() => { + let triggerEventName = 'whenChangeMonth' + if (config.weekMode) { + triggerEventName = 'whenChangeWeek' + } + this.triggerEvent(triggerEventName, { + current: { + year: +curYear, + month: +curMonth + }, + next: target + }) + this.triggerEvent('onSwipe', { + current: { + year: +curYear, + month: +curMonth + }, + next: target, + type: triggerEventName + }) + }) + }, + doubleClickJumpToToday() { + const { multi, weekMode } = this.calendar.getCalendarConfig() || {} + if (multi || weekMode) return + if (this.count === undefined) { + this.count = 1 + } else { + this.count += 1 + } + if (this.lastClick) { + const difference = new Date().getTime() - this.lastClick + if ( + difference < 500 && + this.count >= 2 && + typeof this.calendar.jump === 'function' + ) { + const today = dateUtil.todayFMD() + this.calendar.jump(today) + } + this.count = undefined + this.lastClick = undefined + } else { + this.lastClick = new Date().getTime() + } + this.triggerEvent('jumpToToday') + } + } +}) diff --git a/src/components/calendar/index.json b/src/components/calendar/index.json new file mode 100644 index 0000000..32640e0 --- /dev/null +++ b/src/components/calendar/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/src/components/calendar/index.wxml b/src/components/calendar/index.wxml new file mode 100644 index 0000000..186b758 --- /dev/null +++ b/src/components/calendar/index.wxml @@ -0,0 +1,116 @@ + + + + + + + + + {{calendar.curYear || "--"}} 年 {{calendar.curMonth || "--"}} 月 + + + + + + + + + {{item}} + + + + + + + + + {{item.date}} + + + + + + + + {{config.markToday && item.isToday ? config.markToday : item.date}} + + {{item.label || item.lunar.Term || item.lunar.IDayCn}} + + + + {{item.todoText}} + + + + + + + + + + {{item.date}} + + + + + + diff --git a/src/components/calendar/index.wxss b/src/components/calendar/index.wxss new file mode 100644 index 0000000..7ba3305 --- /dev/null +++ b/src/components/calendar/index.wxss @@ -0,0 +1,249 @@ +@import "./theme/iconfont.wxss"; +@import "./theme/theme-default.wxss"; +@import "./theme/theme-elegant.wxss"; +@import "./theme/theme-nuohe.wxss"; +@import "./theme/theme-geneB.wxss"; +@import "./theme/theme-geneDoctorB.wxss"; + +.blod { + font-weight: bold; +} + +.b { + display: flex; +} + +.lr { + flex-direction: row; +} + +.tb { + flex-direction: column; +} + +.pc { + justify-content: center; +} + +.ac { + align-items: center; +} + +.cc { + align-items: center; + justify-content: center; +} + +.wrap { + flex-wrap: wrap; +} + +.flex { + flex-grow: 1; +} + +.bg { + background-image: linear-gradient(to bottom, #faefe7, #ffcbd7); + overflow: hidden; +} + +.white-color { + color: #fff; +} + +.fs24 { + font-size: 24rpx; +} + +.fs28 { + font-size: 28rpx; +} + +.fs32 { + font-size: 32rpx; +} + +.fs36 { + font-size: 36rpx; +} + +.calendar { + width: 100%; + box-sizing: border-box; +} + +/* 日历操作栏 */ + +.handle { + height: 80rpx; +} + +.prev-handle, +.next-handle { + padding: 20rpx; +} + +.date-in-handle { + height: 80rpx; +} + +/* 星期栏 */ + +.weeks { + height: 50rpx; + line-height: 50rpx; + opacity: 0.5; +} + +.week { + text-align: center; +} + +.grid, +.week { + width: 14.286014285714286%; +} + +.date-wrap { + width: 100%; + height: 80rpx; + position: relative; + left: 0; + top: 0; +} + +.date { + position: relative; + left: 0; + top: 0; + width: 55rpx; + height: 55rpx; + text-align: center; + line-height: 55rpx; + font-size: 28rpx; + font-weight: 200; + border-radius: 50%; + transition: all 0.3s; + font-weight: bold; + + animation-name: choosed; + + animation-duration: 0.5s; + + animation-timing-function: linear; + + animation-iteration-count: 1; +} + +.date-area-mode { + width: 100%; + + border-radius: 0; +} + +.date-desc { + width: 150%; + + height: 32rpx; + + font-size: 20rpx; + + line-height: 32rpx; + + position: absolute; + + left: 50%; + + transform: translateX(-50%); + + overflow: hidden; + + word-break: break-all; + + text-overflow: ellipsis; + + white-space: nowrap; + + -webkit-line-clamp: 1; + + text-align: center; +} + +@keyframes choosed { + from { + transform: scale(1); + } + + 50% { + transform: scale(0.9); + } + + to { + transform: scale(1); + } +} + +/* 日期圆圈标记 */ + +.todo-circle { + border-width: 1rpx; + + border-style: solid; + + box-sizing: border-box; +} + +/* 待办点标记相关样式 */ + +.todo-dot { + width: 16rpx; + + height: 16rpx; + + border-radius: 50%; + + position: absolute; + + left: 50%; + bottom: -10rpx !important; + + transform: translateX(-50%); +} + +.todo-dot-top { + top: 3rpx; +} + +.todo-dot.todo-dot-top-always { + top: -8rpx; +} + +.todo-dot.todo-dot-bottom { + bottom: 0; +} + +.todo-dot.todo-dot-bottom-always { + bottom: -10rpx; +} + +/* 日期描述文字(待办文字/农历)相关样式 */ + +.date-desc.date-desc-top { + top: -6rpx; +} + +.date-desc.date-desc-top-always { + top: -20rpx; +} + +.date-desc.date-desc-bottom { + bottom: -14rpx; +} + +.todo-circle .date-desc.date-desc-bottom { + bottom: -30rpx; +} + +.date-desc.date-desc-bottom-always { + bottom: -28rpx; +} diff --git a/src/components/calendar/plugins/holidays/holidays-map.js b/src/components/calendar/plugins/holidays/holidays-map.js new file mode 100644 index 0000000..0bc5e04 --- /dev/null +++ b/src/components/calendar/plugins/holidays/holidays-map.js @@ -0,0 +1,212 @@ +/* * + @Author: drfu* + @Description: 数据来源于国务院办公厅关于2020年部分节假日安排的通知(国办发明电〔2019〕16号)_政府信息公开专栏,http://www.gov.cn/zhengce/content/2019-11/21/content_5454164.htm + @Date: 2020-10-12 14:29:45* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-16 17:38:08 +*/ + +// 节日列表 +export const festival = { + // 农历固定日期节日 + lunar: { + 1: { + 1: { + type: 'festival', + name: '春节', + label: '春节' + }, + 8: { + type: 'festival', + name: '腊八节', + label: '腊八' + }, + 15: { + type: 'festival', + name: '元宵节', + label: '元宵' + } + }, + 7: { + 7: { + type: 'festival', + name: '七夕节', + label: '七夕' + }, + 15: { + type: 'festival', + name: '中元节', + label: '中元节' + } + }, + 9: { + 9: { + type: 'festival', + name: '重阳节', + label: '重阳节' + } + } + }, + // 阳历固定日期节日 + solar: { + 2: { + 14: { + type: 'festival', + name: '情人节', + label: '情人节' + } + }, + 3: { + 12: { + type: 'festival', + name: '植树节', + label: '植树节' + } + }, + 4: { + 1: { + type: 'festival', + name: '愚人节', + label: '愚人节' + }, + 5: { + type: 'festival', + name: '清明节', + label: '清明节' + } + }, + 5: { + 1: { + type: 'festival', + name: '劳动节', + label: '劳动节' + } + }, + 6: { + 1: { + type: 'festival', + name: '儿童节', + label: '儿童节' + } + }, + 7: { + 1: { + type: 'festival', + name: '建党节', + label: '建党节' + } + }, + 8: { + 1: { + type: 'festival', + name: '建军节', + label: '建军节' + } + }, + 9: { + 10: { + type: 'festival', + name: '教师节', + label: '教师节' + } + }, + 10: { + 1: { + type: 'festival', + name: '国庆节', + label: '国庆节' + } + }, + 12: { + 25: { + type: 'festival', + name: '圣诞节', + label: '圣诞节' + } + } + } +} + +export const holidays = { + 2020: { + 1: { + 1: { + type: 'holiday', + name: '元旦', + label: '休' + }, + 19: { + type: 'work', + name: '调班', + label: '班' + }, + '24-30': { + type: 'holiday', + name: '春节', + label: '休' + } + }, + 2: { + 1: { + type: 'work', + name: '调班', + label: '班' + } + }, + 4: { + '4-6': { + type: 'holiday', + name: '清明节', + label: '休' + }, + 26: { + type: 'work', + name: '调班', + label: '班' + } + }, + 5: { + '1-5': { + type: 'holiday', + name: '劳动节', + label: '休' + }, + 9: { + type: 'work', + name: '调班', + label: '班' + } + }, + 6: { + '25-27': { + type: 'holiday', + name: '端午节', + label: '休' + }, + 28: { + type: 'work', + name: '调班', + label: '班' + } + }, + 9: { + 27: { + type: 'work', + name: '调班', + label: '班' + } + }, + 10: { + '1-8': { + type: 'holiday', + name: '国庆节/中秋节', + label: '休' + }, + 10: { + type: 'work', + name: '调班', + label: '班' + } + } + } +} diff --git a/src/components/calendar/plugins/holidays/index.d.ts b/src/components/calendar/plugins/holidays/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/calendar/plugins/holidays/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/components/calendar/plugins/holidays/index.js b/src/components/calendar/plugins/holidays/index.js new file mode 100644 index 0000000..ee4ae77 --- /dev/null +++ b/src/components/calendar/plugins/holidays/index.js @@ -0,0 +1,201 @@ +/* * + @Author: drfu* + @Description: 显示法定节假日班/休情况 + @Date: 2020-10-12 14:29:45* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-16 17:34:13 +*/ + +import { holidays, festival } from './holidays-map' +import { dateUtil, getCalendarData, logger } from '../../utils/index' + +/** + * 当前是否在休假期内 + * @param {object} { year, month } + * @param {object} { start, end, current } + * @returns + */ +function inHolidays({ year, month }, { start, end, current }) { + const getTimeStamp = dateUtil.getTimeStamp + const startTimestamp = getTimeStamp({ + year, + month, + date: start + }) + const endTimestamp = getTimeStamp({ + year, + month, + date: end + }) + const currentDateTimestamp = getTimeStamp({ + year, + month, + date: current + }) + if ( + currentDateTimestamp >= startTimestamp && + currentDateTimestamp <= endTimestamp + ) { + return true + } + return false +} + +function addSpecialFestival(date, component) { + const { convertlLunar2Solar, convertSolarLunar } = component.calendar || {} + const lunarDateInfo = convertSolarLunar(date) + const { lYear, lMonth } = lunarDateInfo || {} + // 春节 + const info = { + type: 'festival', + name: '除夕', + label: '除夕' + } + if (lMonth === 12) { + if (!festival.lunar['12']) festival.lunar['12'] = {} + if (convertlLunar2Solar(`${lYear}-12-30`) === -1) { + festival.lunar['12']['29'] = info + } else { + festival.lunar['12']['30'] = info + } + } +} + +/** + * 是否匹配到节日 + * @param {object} [dateInfo={}] + * @param {object} [component={}] + * @returns {object|boolean} 匹配到的节日数据或者false + */ +function hasFestivalDate(dateInfo = {}, component = {}) { + const { month, date } = dateInfo + let festivalDate = festival.solar[month] && festival.solar[month][date] + if (!festivalDate) { + const { convertSolarLunar } = component.calendar || {} + const lunarDateInfo = convertSolarLunar(dateInfo) + const { lMonth, lDay } = lunarDateInfo + festivalDate = festival.lunar[lMonth] && festival.lunar[lMonth][lDay] + if (!festivalDate) { + const festivalOfMonth = festival.lunar[lMonth] || {} + const festivalDateKey = Object.keys(festivalOfMonth).find(item => + item.match(new RegExp(`\\b${lDay}\\b`)) + ) + if (!festivalDateKey) { + festivalDate = false + } else { + const festivalInfo = festival.lunar[lMonth][festivalDateKey] + if (!festivalInfo) { + festivalDate = false + } else { + const { condition } = festivalInfo + if (typeof condition === 'function') { + festivalDate = condition(lunarDateInfo) + } else { + festivalDate = false + } + } + } + } + } + return festivalDate +} + +export default () => { + return { + name: 'holidays', + beforeRender(calendarData = {}, calendarConfig = {}, component) { + let { dates = [] } = calendarData + if (calendarConfig.showHolidays || calendarConfig.showFestival) { + dates = dates.map(d => { + let item = { ...d } + const { year, month, date } = item + const holidaysOfMonth = + (holidays[year] && holidays[year][month]) || {} + const holidayDate = holidaysOfMonth[date] + if (holidayDate) { + item = { + ...item, + ...holidayDate + } + } else { + const holidayKeys = Object.keys(holidaysOfMonth).filter(item => + item.includes('-') + ) + let target = '' + for (let v of holidayKeys) { + const [start, end] = v.split('-') + if (+d.date >= +start && +d.date <= +end) { + target = v + break + } + } + const [start, end] = target.split('-') + const isInHolidays = inHolidays( + { + year, + month + }, + { + start, + end, + current: date + } + ) + if (isInHolidays) { + item = { + ...item, + ...holidaysOfMonth[target] + } + } else if (calendarConfig.showFestival) { + const { convertSolarLunar, convertlLunar2Solar } = + component.calendar || {} + if ( + typeof convertSolarLunar !== 'function' || + typeof convertlLunar2Solar !== 'function' + ) { + return logger.warn( + '农历节日显示需要引入农历插件(/component/v2/plugins/solarLunar)' + ) + } + addSpecialFestival(item, component) + const festivalDate = hasFestivalDate(item, component) + if (festivalDate) { + item = { + ...item, + ...festivalDate + } + } + } + } + return item + }) + } + return { + calendarData: { + ...calendarData, + dates: dates + }, + calendarConfig + } + }, + methods(component) { + return { + getHolidaysOfCurrentYear() { + const calendar = getCalendarData('calendar', component) + const { curYear } = calendar + return this.methods(component).getHolidaysOfYear(curYear) + }, + getHolidaysOfYear(year) { + if (!year) return logger.warn('getHolidaysOfCurrentYear() 入参错误') + if (!holidays[year]) { + logger.warn('未匹配到当前年份节假日信息,请自行补充') + return { + err: 'not match' + } + } + return holidays[year] + } + } + } + } +} diff --git a/src/components/calendar/plugins/index.js b/src/components/calendar/plugins/index.js new file mode 100644 index 0000000..238425d --- /dev/null +++ b/src/components/calendar/plugins/index.js @@ -0,0 +1,18 @@ +import preset from './preset/index' + +export default { + installed: [...preset], + use(plugin) { + if (typeof plugin !== 'function') return + const info = plugin() || {} + const { name } = info + if ( + name && + name !== 'methods' && + !this.installed.some(p => p[0] === name) + ) { + this.installed.unshift([name, info]) + } + return this + } +} diff --git a/src/components/calendar/plugins/preset/base.js b/src/components/calendar/plugins/preset/base.js new file mode 100644 index 0000000..3be7d51 --- /dev/null +++ b/src/components/calendar/plugins/preset/base.js @@ -0,0 +1,277 @@ +/** + * @Author: drfu* + * @Description: 基础功能 + * @Date: 2020-10-08 21:22:09* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-11 13:28:52 + * */ + +import { calcJumpData } from '../../core' +import { renderCalendar } from '../../render' +import { + dateUtil, + getCalendarData, + setCalendarData, + getCalendarConfig +} from '../../utils/index' + +export default () => { + return { + name: 'base', + beforeRender(calendarData = {}, calendarConfig) { + const calendar = calendarData + const { selectedDates = [], dates } = calendar + let _dates = [...dates] + if (selectedDates.length) { + const selectedDatesStr = selectedDates.map(date => + dateUtil.toTimeStr(date) + ) + _dates.forEach(date => { + const dateStr = dateUtil.toTimeStr(date) + if (selectedDatesStr.includes(dateStr)) { + date.choosed = true + } + }) + } + return { + calendarData: { + ...calendarData, + dates: _dates + }, + calendarConfig + } + }, + onTapDate(tapedDate, calendarData = {}, calendarConfig = {}) { + const calendar = { + ...calendarData + } + const dateIndex = dateUtil.findDateIndexInArray( + tapedDate, + calendarData.dates + ) + const { multi, inverse } = calendarConfig + let dates = [...calendar.dates] + const { selectedDates = [] } = calendar + if (!multi) { + let preSelectedDate = {} + if (selectedDates.length) { + preSelectedDate = [...selectedDates].pop() || {} + } + const timeStr = dateUtil.toTimeStr + if (!inverse && timeStr(preSelectedDate) === timeStr(tapedDate)) { + return calendar + } + let _tapedDate = { ...tapedDate, choosed: !tapedDate.choosed } + + dates[dateIndex] = _tapedDate + if (preSelectedDate.date) { + const idx = dateUtil.findDateIndexInArray(preSelectedDate, dates) + const date = dates[idx] + if (date) { + date.choosed = false + } + } + if (dates[dateIndex].choosed) { + calendar.selectedDates = [dates[dateIndex]] + } else { + calendar.selectedDates = [] + } + } else { + dates[dateIndex] = { + ...dates[dateIndex], + choosed: !dates[dateIndex].choosed + } + if (!calendar.selectedDates) { + calendar.selectedDates = [] + } + if (dates[dateIndex].choosed) { + calendar.selectedDates.push(dates[dateIndex]) + } else { + calendar.selectedDates = calendar.selectedDates.filter( + date => + dateUtil.toTimeStr(date) !== dateUtil.toTimeStr(dates[dateIndex]) + ) + } + } + return { + calendarData: { + ...calendar, + dates + }, + calendarConfig + } + }, + onSwitchCalendar(date, calendarData = {}, component) { + const calendarConfig = getCalendarConfig(component) + if (calendarConfig.weekMode) { + return calendarData + } + const updatedRenderData = calcJumpData({ + dateInfo: date, + config: calendarConfig + }) + return { + ...calendarData, + ...updatedRenderData + } + }, + methods(component) { + return { + jump: dateInfo => { + if (Object.prototype.toString.call(dateInfo) !== '[object Object]') + return + const updatedRenderData = calcJumpData({ + dateInfo, + component + }) + const existCalendarData = getCalendarData('calendar', component) + const config = getCalendarConfig(component) + if (config.autoChoosedWhenJump) { + const target = updatedRenderData.dates[dateInfo.date - 1] + if (!updatedRenderData.selectedDates) { + updatedRenderData.selectedDates = [target] + } else { + updatedRenderData.selectedDates.push(target) + } + } + return renderCalendar.call(component, { + ...existCalendarData, + ...updatedRenderData + }) + }, + getCalendarConfig() { + return getCalendarConfig(component) + }, + setCalendarConfig(config) { + return new Promise((resolve, reject) => { + if (!component || !component.data.config) { + reject('异常:未找到组件配置信息') + return + } + let conf = { ...component.config, ...config } + component.config = conf + setCalendarData({ config: conf }, component) + .then(resolve) + .catch(reject) + }) + }, + cancelSelectedDates(cancelDates = []) { + const existCalendarData = getCalendarData('calendar', component) || {} + const { dates = [], selectedDates = [] } = existCalendarData + let updatedRenderData = {} + const config = getCalendarConfig(component) + let chooseAreaData = {} + if (config.chooseAreaMode) { + chooseAreaData = { + chooseAreaTimestamp: [], + tempChooseAreaTimestamp: [] + } + } + if (!cancelDates.length) { + dates.forEach(item => { + item.choosed = false + }) + updatedRenderData = { + dates, + selectedDates: [] + } + } else { + const cancelDatesStr = cancelDates.map(date => + dateUtil.toTimeStr(date) + ) + const filterSelectedDates = selectedDates.filter( + date => !cancelDatesStr.includes(dateUtil.toTimeStr(date)) + ) + dates.forEach(date => { + if (cancelDatesStr.includes(dateUtil.toTimeStr(date))) { + date.choosed = false + } + }) + updatedRenderData = { + dates, + selectedDates: filterSelectedDates + } + } + + return renderCalendar.call(component, { + ...existCalendarData, + ...updatedRenderData, + ...chooseAreaData + }) + }, + setSelectedDates: targetDates => { + const existCalendarData = getCalendarData('calendar', component) + let { dates, selectedDates = [] } = existCalendarData || {} + let __selectedDates = [] + let __dates = dates + if (!targetDates) { + __dates = dates.map(item => { + const date = { ...item } + date.choosed = true + if (existCalendarData.showLabelAlways && date.showTodoLabel) { + date.showTodoLabel = true + } else { + date.showTodoLabel = false + } + return date + }) + __selectedDates = dates + } else if (targetDates && targetDates.length) { + const allSelected = dateUtil.uniqueArrayByDate( + selectedDates.concat(targetDates) + ) + const allSelectedDateStr = allSelected.map(d => + dateUtil.toTimeStr(d) + ) + __dates = dates.map(item => { + const date = { ...item } + if (allSelectedDateStr.includes(dateUtil.toTimeStr(date))) { + date.choosed = true + __selectedDates.push(date) + } + if (existCalendarData.showLabelAlways && date.showTodoLabel) { + date.showTodoLabel = true + } else { + date.showTodoLabel = false + } + return date + }) + } + return renderCalendar.call(component, { + ...existCalendarData, + dates: __dates, + selectedDates: __selectedDates + }) + }, + setDateStyle: toSetDates => { + if (!Array.isArray(toSetDates)) return Promise.reject() + const existCalendarData = getCalendarData('calendar', component) + const { dates = [], specialStyleDates } = existCalendarData || {} + if (Array.isArray(specialStyleDates)) { + toSetDates = dateUtil.uniqueArrayByDate([ + ...specialStyleDates, + ...toSetDates + ]) + } + const toSetDatesStr = toSetDates.map(item => dateUtil.toTimeStr(item)) + const _dates = dates.map(item => { + const idx = toSetDatesStr.indexOf(dateUtil.toTimeStr(item)) + if (idx > -1) { + return { + ...item, + class: toSetDates[idx].class + } + } else { + return item + } + }) + return renderCalendar.call(component, { + ...existCalendarData, + dates: _dates, + specialStyleDates: toSetDates + }) + } + } + } + } +} diff --git a/src/components/calendar/plugins/preset/get-calendar-data.js b/src/components/calendar/plugins/preset/get-calendar-data.js new file mode 100644 index 0000000..463082a --- /dev/null +++ b/src/components/calendar/plugins/preset/get-calendar-data.js @@ -0,0 +1,69 @@ +/** + * @Author: drfu* + * @Description: 获取日历数据 + * @Date: 2020-10-08 21:22:09* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-11 13:42:37 + * */ + +import { getCalendarData, logger, getCalendarConfig } from '../../utils/index' + +function wrapDateWithLunar(dates = [], convertFn) { + const datesWithLunar = JSON.parse(JSON.stringify(dates)).map(date => ({ + ...date, + lunar: convertFn(date) + })) + return datesWithLunar +} + +export default () => { + return { + name: 'getData', + methods(component) { + return { + getCurrentYM: () => { + const { curYear, curMonth } = getCalendarData('calendar', component) + return { + year: curYear, + month: curMonth + } + }, + getSelectedDates: (options = {}) => { + const dates = + getCalendarData('calendar.selectedDates', component) || [] + const config = getCalendarConfig(component) || {} + if (options.lunar && !config.showLunar) { + const injectedFns = component.calendar || {} + if (typeof injectedFns.convertSolarLunar === 'function') { + return wrapDateWithLunar(dates, injectedFns.convertSolarLunar) + } else { + logger.warn('获取农历信息需引入农历插件') + } + } else { + return dates + } + }, + getCalendarDates: (options = {}) => { + const config = getCalendarConfig(component) || {} + const dates = getCalendarData('calendar.dates', component) + if (options.lunar && !config.showLunar) { + const injectedFns = component.calendar || {} + if (typeof injectedFns.convertSolarLunar === 'function') { + return wrapDateWithLunar(dates, injectedFns.convertSolarLunar) + } else { + logger.warn('获取农历信息需引入农历插件') + } + } else { + return dates + } + }, + getCalendarAllData: () => { + return { + data: getCalendarData('calendar', component) || {}, + config: getCalendarConfig(component) || {} + } + } + } + } + } +} diff --git a/src/components/calendar/plugins/preset/index.d.ts b/src/components/calendar/plugins/preset/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/calendar/plugins/preset/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/components/calendar/plugins/preset/index.js b/src/components/calendar/plugins/preset/index.js new file mode 100644 index 0000000..70cde39 --- /dev/null +++ b/src/components/calendar/plugins/preset/index.js @@ -0,0 +1,9 @@ +import base from './base' +import getCalendarData from './get-calendar-data' + +const preset = [ + ['base', base()], + ['get-calendar-data', getCalendarData()] +] + +export default preset diff --git a/src/components/calendar/plugins/selectable.d.ts b/src/components/calendar/plugins/selectable.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/calendar/plugins/selectable.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/components/calendar/plugins/selectable.js b/src/components/calendar/plugins/selectable.js new file mode 100644 index 0000000..3734983 --- /dev/null +++ b/src/components/calendar/plugins/selectable.js @@ -0,0 +1,221 @@ +/** + * @Author: drfu* + * @Description: 禁用、启用日期选择 + * @Date: 2020-10-08 21:22:09* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-08 21:25:00 + * */ + +import { getCalendarData, dateUtil, logger } from '../utils/index' +import { renderCalendar } from '../render' + +function convertEnableAreaToTimestamp(timearea = []) { + const start = timearea[0].split('-') + const end = timearea[1].split('-') + if (start.length !== 3 || end.length !== 3) { + logger.warn('enableArea() 参数格式为: ["2018-2-1", "2018-3-1"]') + return {} + } + const startTimestamp = dateUtil + .newDate(start[0], start[1], start[2]) + .getTime() + const endTimestamp = dateUtil.newDate(end[0], end[1], end[2]).getTime() + return { + start, + end, + startTimestamp, + endTimestamp + } +} + +function isValiditeOfDateArea(dateArea) { + const { + start, + end, + startTimestamp, + endTimestamp + } = convertEnableAreaToTimestamp(dateArea) + if (!start || !end) return + const datesCountOfStart = dateUtil.getDatesCountOfMonth(start[0], start[1]) + const datesCountOfEnd = dateUtil.getDatesCountOfMonth(end[0], end[1]) + if (start[2] > datesCountOfStart || start[2] < 1) { + logger.warn('enableArea() 开始日期错误,指定日期不在指定月份天数范围内') + return false + } else if (start[1] > 12 || start[1] < 1) { + logger.warn('enableArea() 开始日期错误,月份超出1-12月份') + return false + } else if (end[2] > datesCountOfEnd || end[2] < 1) { + logger.warn('enableArea() 截止日期错误,指定日期不在指定月份天数范围内') + return false + } else if (end[1] > 12 || end[1] < 1) { + logger.warn('enableArea() 截止日期错误,月份超出1-12月份') + return false + } else if (startTimestamp > endTimestamp) { + logger.warn('enableArea()参数最小日期大于了最大日期') + return false + } else { + return true + } +} + +function handleDisableMode(calendarConfig) { + const { disableMode } = calendarConfig + if (!disableMode) return {} + const disableBound = + dateUtil.getTimeStamp(disableMode.date) || dateUtil.todayTimestamp() + return { + disableBound, + disableType: disableMode.type + } +} + +function disabledByConfig(dateInfo, currentDate, calendarConfig) { + const date = { ...dateInfo } + const { disableType, disableBound } = handleDisableMode(calendarConfig) + if ( + (disableType === 'before' && disableBound && currentDate < disableBound) || + (disableType === 'after' && disableBound && currentDate > disableBound) + ) { + date.disable = true + } else { + date.disable = false + } + return date +} + +export default () => { + return { + name: 'enable', + beforeRender(calendarData = {}, calendarConfig = {}) { + const { + dates, + enableArea, + enableDates, + disableDates, + renderCausedBy + } = calendarData + const _dates = [...dates].map(date => { + let item = { ...date } + const timeStr = dateUtil.toTimeStr(date) + const timestamp = +dateUtil.getTimeStamp(item) + if (renderCausedBy === 'enableDates') { + if (enableDates && enableDates.length) { + if (enableDates.includes(timeStr)) { + item.disable = false + } else { + item.disable = true + } + return item + } + } else if (renderCausedBy === 'enableArea') { + if (enableArea && enableArea.length) { + const [startTimestamp, endTimestamp] = enableArea || [] + const ifOutofArea = + +startTimestamp > timestamp || timestamp > +endTimestamp + item.disable = ifOutofArea + return item + } + } else if (renderCausedBy === 'disableDates') { + if (disableDates && disableDates.length) { + if (disableDates && disableDates.includes(timeStr)) { + item.disable = true + } else { + item.disable = false + } + return item + } + } + return disabledByConfig(item, timestamp, calendarConfig) + }) + + return { + calendarData: { + ...calendarData, + dates: _dates + }, + calendarConfig + } + }, + methods(component) { + return { + enableArea: (dateArea = []) => { + if (dateArea.length === 2) { + const validate = isValiditeOfDateArea(dateArea) + if (validate) { + const existCalendarData = getCalendarData('calendar', component) + const { + startTimestamp, + endTimestamp + } = convertEnableAreaToTimestamp(dateArea) + + return renderCalendar.call(component, { + ...existCalendarData, + renderCausedBy: 'enableArea', + enableArea: [startTimestamp, endTimestamp] + }) + } + } else { + return Promise.inject( + 'enableArea()参数需为时间范围数组,形如:["2018-8-4" , "2018-8-24"]' + ) + } + }, + enableDates: (toSet = []) => { + if (!toSet.length) return + const existCalendarData = getCalendarData('calendar', component) + const { enableDates = [] } = existCalendarData || {} + let toSetDates = toSet.map(item => { + if (typeof item === 'string') { + return dateUtil.transformDateRow2Dict(item) + } + return item + }) + if (enableDates.length) { + toSetDates = dateUtil.uniqueArrayByDate([ + ...toSetDates, + ...enableDates.map(d => dateUtil.transformDateRow2Dict(d)) + ]) + } + return renderCalendar.call(component, { + ...existCalendarData, + renderCausedBy: 'enableDates', + enableDates: toSetDates.map(date => { + if (typeof date !== 'string') { + return dateUtil.toTimeStr(date) + } + return date + }) + }) + }, + disableDates: toSet => { + const existCalendarData = getCalendarData('calendar', component) + const { disableDates = [], dates = [] } = existCalendarData || {} + let toSetDates = toSet.map(item => { + let date = { ...item } + if (typeof date === 'string') { + return dateUtil.transformDateRow2Dict(item) + } + return item + }) + if (disableDates && disableDates.length) { + toSetDates = dateUtil.uniqueArrayByDate([ + ...toSetDates, + ...disableDates.map(d => dateUtil.transformDateRow2Dict(d)) + ]) + } + return renderCalendar.call(component, { + ...existCalendarData, + renderCausedBy: 'disableDates', + dates, + disableDates: toSetDates.map(date => { + if (typeof date !== 'string') { + return dateUtil.toTimeStr(date) + } + return date + }) + }) + } + } + } + } +} diff --git a/src/components/calendar/plugins/solarLunar/convertSolarLunar.js b/src/components/calendar/plugins/solarLunar/convertSolarLunar.js new file mode 100644 index 0000000..4ee3d8e --- /dev/null +++ b/src/components/calendar/plugins/solarLunar/convertSolarLunar.js @@ -0,0 +1,1036 @@ +/** + * @1900-2100区间内的公历、农历互转 + * @Version 1.0.3 + * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] + * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] + */ +/* 公历年月日转农历数据 返回json */ +// calendar.solar2lunar(1987,11,01); +/** 农历年月日转公历年月日 **/ +// calendar.lunar2solar(1987,9,10); +// 调用以上方法后返回类似如下object(json)具体以上就不需要解释了吧! +// c开头的是公历各属性值 l开头的自然就是农历咯 gz开头的就是天干地支纪年的数据啦~ +// { +// Animal: "兔", +// IDayCn: "初十", +// IMonthCn: "九月", +// Term: null, +// astro: "天蝎座", +// cDay: 1, +// cMonth: 11, +// cYear: 1987, +// gzDay: "甲寅", +// gzMonth: "庚戌", +// gzYear: "丁卯", +// isLeap: false, +// isTerm: false, +// isToday: false, +// lDay: 10, +// lMonth: 9, +// lYear: 1987, +// nWeek: 7, +// ncWeek: "星期日" +// } +// 该代码还有其它可以调用的方法,请自己查看代码中的详细注释 +const calendar = { + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [ + 0x04bd8, + 0x04ae0, + 0x0a570, + 0x054d5, + 0x0d260, + 0x0d950, + 0x16554, + 0x056a0, + 0x09ad0, + 0x055d2, // 1900-1909 + 0x04ae0, + 0x0a5b6, + 0x0a4d0, + 0x0d250, + 0x1d255, + 0x0b540, + 0x0d6a0, + 0x0ada2, + 0x095b0, + 0x14977, // 1910-1919 + 0x04970, + 0x0a4b0, + 0x0b4b5, + 0x06a50, + 0x06d40, + 0x1ab54, + 0x02b60, + 0x09570, + 0x052f2, + 0x04970, // 1920-1929 + 0x06566, + 0x0d4a0, + 0x0ea50, + 0x06e95, + 0x05ad0, + 0x02b60, + 0x186e3, + 0x092e0, + 0x1c8d7, + 0x0c950, // 1930-1939 + 0x0d4a0, + 0x1d8a6, + 0x0b550, + 0x056a0, + 0x1a5b4, + 0x025d0, + 0x092d0, + 0x0d2b2, + 0x0a950, + 0x0b557, // 1940-1949 + 0x06ca0, + 0x0b550, + 0x15355, + 0x04da0, + 0x0a5b0, + 0x14573, + 0x052b0, + 0x0a9a8, + 0x0e950, + 0x06aa0, // 1950-1959 + 0x0aea6, + 0x0ab50, + 0x04b60, + 0x0aae4, + 0x0a570, + 0x05260, + 0x0f263, + 0x0d950, + 0x05b57, + 0x056a0, // 1960-1969 + 0x096d0, + 0x04dd5, + 0x04ad0, + 0x0a4d0, + 0x0d4d4, + 0x0d250, + 0x0d558, + 0x0b540, + 0x0b6a0, + 0x195a6, // 1970-1979 + 0x095b0, + 0x049b0, + 0x0a974, + 0x0a4b0, + 0x0b27a, + 0x06a50, + 0x06d40, + 0x0af46, + 0x0ab60, + 0x09570, // 1980-1989 + 0x04af5, + 0x04970, + 0x064b0, + 0x074a3, + 0x0ea50, + 0x06b58, + 0x055c0, + 0x0ab60, + 0x096d5, + 0x092e0, // 1990-1999 + 0x0c960, + 0x0d954, + 0x0d4a0, + 0x0da50, + 0x07552, + 0x056a0, + 0x0abb7, + 0x025d0, + 0x092d0, + 0x0cab5, // 2000-2009 + 0x0a950, + 0x0b4a0, + 0x0baa4, + 0x0ad50, + 0x055d9, + 0x04ba0, + 0x0a5b0, + 0x15176, + 0x052b0, + 0x0a930, // 2010-2019 + 0x07954, + 0x06aa0, + 0x0ad50, + 0x05b52, + 0x04b60, + 0x0a6e6, + 0x0a4e0, + 0x0d260, + 0x0ea65, + 0x0d530, // 2020-2029 + 0x05aa0, + 0x076a3, + 0x096d0, + 0x04afb, + 0x04ad0, + 0x0a4d0, + 0x1d0b6, + 0x0d250, + 0x0d520, + 0x0dd45, // 2030-2039 + 0x0b5a0, + 0x056d0, + 0x055b2, + 0x049b0, + 0x0a577, + 0x0a4b0, + 0x0aa50, + 0x1b255, + 0x06d20, + 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn **/ + 0x14b63, + 0x09370, + 0x049f8, + 0x04970, + 0x064b0, + 0x168a6, + 0x0ea50, + 0x06b20, + 0x1a6c4, + 0x0aae0, // 2050-2059 + 0x0a2e0, + 0x0d2e3, + 0x0c960, + 0x0d557, + 0x0d4a0, + 0x0da50, + 0x05d55, + 0x056a0, + 0x0a6d0, + 0x055d4, // 2060-2069 + 0x052d0, + 0x0a9b8, + 0x0a950, + 0x0b4a0, + 0x0b6a6, + 0x0ad50, + 0x055a0, + 0x0aba4, + 0x0a5b0, + 0x052b0, // 2070-2079 + 0x0b273, + 0x06930, + 0x07337, + 0x06aa0, + 0x0ad50, + 0x14b55, + 0x04b60, + 0x0a570, + 0x054e4, + 0x0d160, // 2080-2089 + 0x0e968, + 0x0d520, + 0x0daa0, + 0x16aa6, + 0x056d0, + 0x04ae0, + 0x0a9d4, + 0x0a2d0, + 0x0d150, + 0x0f252, // 2090-2099 + 0x0d520 + ], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: [ + '\u7532', + '\u4e59', + '\u4e19', + '\u4e01', + '\u620a', + '\u5df1', + '\u5e9a', + '\u8f9b', + '\u58ec', + '\u7678' + ], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: [ + '\u5b50', + '\u4e11', + '\u5bc5', + '\u536f', + '\u8fb0', + '\u5df3', + '\u5348', + '\u672a', + '\u7533', + '\u9149', + '\u620c', + '\u4ea5' + ], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: [ + '\u9f20', + '\u725b', + '\u864e', + '\u5154', + '\u9f99', + '\u86c7', + '\u9a6c', + '\u7f8a', + '\u7334', + '\u9e21', + '\u72d7', + '\u732a' + ], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: [ + '\u5c0f\u5bd2', + '\u5927\u5bd2', + '\u7acb\u6625', + '\u96e8\u6c34', + '\u60ca\u86f0', + '\u6625\u5206', + '\u6e05\u660e', + '\u8c37\u96e8', + '\u7acb\u590f', + '\u5c0f\u6ee1', + '\u8292\u79cd', + '\u590f\u81f3', + '\u5c0f\u6691', + '\u5927\u6691', + '\u7acb\u79cb', + '\u5904\u6691', + '\u767d\u9732', + '\u79cb\u5206', + '\u5bd2\u9732', + '\u971c\u964d', + '\u7acb\u51ac', + '\u5c0f\u96ea', + '\u5927\u96ea', + '\u51ac\u81f3' + ], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: [ + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', + '9778397bd19801ec9210c965cc920e', + '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', + '97bd09801d98082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', + '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', + '9778397bd19801ec9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', + '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', + '97b6b97bd197c36c9210c9274c920e', + '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', + '7f0e37f5307f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', + '7f0e27f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', + '97b6b7f0e47f149b0723b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', + '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e37f5307f595b0b0bc920fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', + '7f07e7f0e37f149b0723b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e37f14998083b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14898082b0723b02d5', + '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e36665b66aa89801e9808297c35', + '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e26665b66a449801e9808297c35', + '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722' + ], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: [ + '\u65e5', + '\u4e00', + '\u4e8c', + '\u4e09', + '\u56db', + '\u4e94', + '\u516d', + '\u4e03', + '\u516b', + '\u4e5d', + '\u5341' + ], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: [ + '\u6b63', + '\u4e8c', + '\u4e09', + '\u56db', + '\u4e94', + '\u516d', + '\u4e03', + '\u516b', + '\u4e5d', + '\u5341', + '\u51ac', + '\u814a' + ], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function(y) { + let i + let sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { + sum += calendar.lunarInfo[y - 1900] & i ? 1 : 0 + } + return sum + calendar.leapDays(y) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function(y) { + // 闰字编码 \u95f0 + return calendar.lunarInfo[y - 1900] & 0xf + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function(y) { + if (calendar.leapMonth(y)) { + return calendar.lunarInfo[y - 1900] & 0x10000 ? 30 : 29 + } + return 0 + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function(y, m) { + if (m > 12 || m < 1) return -1 // 月份参数从1至12,参数错误返回-1 + return calendar.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29 + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function(y, m) { + if (m > 12 || m < 1) return -1 // 若参数错误 返回-1 + const ms = m - 1 + if (+ms === 1) { + // 2月份的闰平规律测算后确认返回28或29 + return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 ? 29 : 28 + } else { + return calendar.solarMonth[ms] + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function(lYear) { + let ganKey = (lYear - 3) % 10 + let zhiKey = (lYear - 3) % 12 + if (+ganKey === 0) ganKey = 10 // 如果余数为0则为最后一个天干 + if (+zhiKey === 0) zhiKey = 12 // 如果余数为0则为最后一个地支 + return calendar.Gan[ganKey - 1] + calendar.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function(cMonth, cDay) { + const s = + '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7' // 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function(offset) { + return calendar.Gan[offset % 10] + calendar.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function(y, n) { + if (y < 1900 || y > 2100) return -1 + if (n < 1 || n > 24) return -1 + const _table = calendar.sTermInfo[y - 1900] + const _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + const _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function(m) { + // 月 => \u6708 + if (m > 12 || m < 1) return -1 // 若参数错误 返回-1 + let s = calendar.nStr3[m - 1] + s += '\u6708' // 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function(d) { + // 日 => \u65e5 + let s + switch (d) { + case 10: + s = '\u521d\u5341' + break + case 20: + s = '\u4e8c\u5341' + break + case 30: + s = '\u4e09\u5341' + break + default: + s = calendar.nStr2[Math.floor(d / 10)] + s += calendar.nStr1[d % 10] + } + return s + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function(y) { + return calendar.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function(y, m, d) { + // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1 // undefined转换为数字变为NaN + } + // 公历传参最下限 + if (+y === 1900 && +m === 1 && +d < 31) { + return -1 + } + // 未传参 获得当天 + let objDate + if (!y) { + objDate = new Date() + } else { + objDate = new Date(y, parseInt(m) - 1, d) + } + let i + let leap = 0 + let temp = 0 + // 修正ymd参数 + y = objDate.getFullYear() + m = objDate.getMonth() + 1 + d = objDate.getDate() + let offset = + (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - + Date.UTC(1900, 0, 31)) / + 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = calendar.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp + i-- + } + + // 是否今天 + const isTodayObj = new Date() + let isToday = false + if ( + isTodayObj.getFullYear() === +y && + isTodayObj.getMonth() + 1 === +m && + isTodayObj.getDate() === +d + ) { + isToday = true + } + // 星期几 + let nWeek = objDate.getDay() + const cWeek = calendar.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (+nWeek === 0) { + nWeek = 7 + } + // 农历年 + const year = i + leap = calendar.leapMonth(i) // 闰哪个月 + let isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i === leap + 1 && isLeap === false) { + --i + isLeap = true + temp = calendar.leapDays(year) // 计算农历闰月天数 + } else { + temp = calendar.monthDays(year, i) // 计算农历普通月天数 + } + // 解除闰月 + if (isLeap === true && i === leap + 1) isLeap = false + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset === 0 && leap > 0 && i === leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true + --i + } + } + if (offset < 0) { + offset += temp + --i + } + // 农历月 + const month = i + // 农历日 + const day = offset + 1 + // 天干地支处理 + const sm = m - 1 + const gzY = calendar.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + const firstNode = calendar.getTerm(y, m * 2 - 1) // 返回当月「节」为几日开始 + const secondNode = calendar.getTerm(y, m * 2) // 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + let gzM = calendar.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = calendar.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + let isTerm = false + let Term = null + if (+firstNode === d) { + isTerm = true + Term = calendar.solarTerm[m * 2 - 2] + } + if (+secondNode === d) { + isTerm = true + Term = calendar.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + const gzD = calendar.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + const astro = calendar.toAstro(m, d) + + return { + lYear: year, + lMonth: month, + lDay: day, + Animal: calendar.getAnimal(year), + IMonthCn: (isLeap ? '\u95f0' : '') + calendar.toChinaMonth(month), + IDayCn: calendar.toChinaDay(day), + cYear: y, + cMonth: m, + cDay: d, + gzYear: gzY, + gzMonth: gzM, + gzDay: gzD, + isToday: isToday, + isLeap: isLeap, + nWeek: nWeek, + ncWeek: '\u661f\u671f' + cWeek, + isTerm: isTerm, + Term: Term, + astro: astro + } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function(y, m, d, isLeapMonth) { + // 参数区间1900.1.31~2100.12.1 + isLeapMonth = !!isLeapMonth + // let leapOffset = 0; + const leapMonth = calendar.leapMonth(y) + // let leapDay = calendar.leapDays(y); + if (isLeapMonth && leapMonth !== m) return -1 // 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if ( + (+y === 2100 && +m === 12 && +d > 1) || + (+y === 1900 && +m === 1 && +d < 31) + ) + return -1 // 超出了最大极限值 + const day = calendar.monthDays(y, m) + let _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = calendar.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) return -1 // 参数合法性效验 + + // 计算农历的时间差 + let offset = 0 + for (let i = 1900; i < y; i++) { + offset += calendar.lYearDays(i) + } + let leap = 0 + let isAdd = false + for (let i = 1; i < m; i++) { + leap = calendar.leapMonth(y) + if (!isAdd) { + // 处理闰月 + if (leap <= i && leap > 0) { + offset += calendar.leapDays(y) + isAdd = true + } + } + offset += calendar.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) offset += day + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + const stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + const calObj = new Date((offset + d - 31) * 86400000 + stmap) + const cY = calObj.getUTCFullYear() + const cM = calObj.getUTCMonth() + 1 + const cD = calObj.getUTCDate() + + return calendar.solar2lunar(cY, cM, cD) + } +} + +const { + Gan, + Zhi, + nStr1, + nStr2, + nStr3, + Animals, + solarTerm, + lunarInfo, + sTermInfo, + solarMonth, + ...rest +} = calendar + +export default rest diff --git a/src/components/calendar/plugins/solarLunar/index.d.ts b/src/components/calendar/plugins/solarLunar/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/calendar/plugins/solarLunar/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/components/calendar/plugins/solarLunar/index.js b/src/components/calendar/plugins/solarLunar/index.js new file mode 100644 index 0000000..79ffbfd --- /dev/null +++ b/src/components/calendar/plugins/solarLunar/index.js @@ -0,0 +1,59 @@ +import { dateUtil } from '../../utils/index' +import convertSolarLunar from './convertSolarLunar' + +function getDateRow2Dict(dateInfo) { + if (!dateInfo) return dateInfo + if (typeof dateInfo === 'string' && dateInfo.includes('-')) { + dateInfo = dateUtil.transformDateRow2Dict(dateInfo) + } + return dateInfo +} + +export default () => { + return { + name: 'convertSolarLunar', + beforeRender(calendarData = {}, calendarConfig = {}) { + let { dates = [], selectedDates = [] } = calendarData + if (calendarConfig.showLunar) { + dates = dates.map(dataInfo => { + const { year, month, date } = dataInfo + return { + ...dataInfo, + lunar: convertSolarLunar.solar2lunar(year, month, date) + } + }) + selectedDates = selectedDates.map(dataInfo => { + const { year, month, date } = dataInfo + return { + ...dataInfo, + lunar: convertSolarLunar.solar2lunar(year, month, date) + } + }) + } + return { + calendarData: { + ...calendarData, + dates: dates, + selectedDates: selectedDates + }, + calendarConfig + } + }, + methods() { + return { + convertSolarLunar: dateInfo => { + dateInfo = getDateRow2Dict(dateInfo) + if (!dateInfo) return dateInfo + const { year, month, date } = dateInfo + return convertSolarLunar.solar2lunar(year, month, date) + }, + convertlLunar2Solar: (dateInfo, isLeapMonth) => { + dateInfo = getDateRow2Dict(dateInfo) + if (!dateInfo) return dateInfo + const { year, month, date } = dateInfo + return convertSolarLunar.lunar2solar(year, month, date, isLeapMonth) + } + } + } + } +} diff --git a/src/components/calendar/plugins/time-range.js b/src/components/calendar/plugins/time-range.js new file mode 100644 index 0000000..ef4dd41 --- /dev/null +++ b/src/components/calendar/plugins/time-range.js @@ -0,0 +1,305 @@ +/** + * @Author: drfu* + * @Description: 时间区域选择 + * @Date: 2020-10-08 21:22:09* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-11 13:56:32 + * */ + +import { renderCalendar } from '../render' +import { + logger, + dateUtil, + getCalendarConfig, + getCalendarData +} from '../utils/index' + +function pusheNextMonthDateArea( + dateInfo = {}, + startTimestamp, + endTimestamp, + selectedDates = [] +) { + let tempOfSelectedDate = [...selectedDates] + const dates = dateUtil.calcDates(dateInfo.year, dateInfo.month) + let datesLen = dates.length + for (let i = 0; i < datesLen; i++) { + const date = dates[i] + const timeStamp = dateUtil.getTimeStamp(date) + if (timeStamp <= endTimestamp && timeStamp >= startTimestamp) { + tempOfSelectedDate.push({ + ...date, + choosed: true + }) + } + if (i === datesLen - 1 && timeStamp < endTimestamp) { + pusheNextMonthDateArea( + dateUtil.getNextMonthInfo(date), + startTimestamp, + endTimestamp, + tempOfSelectedDate + ) + } + } + return tempOfSelectedDate +} +function pushPrevMonthDateArea( + dateInfo = {}, + startTimestamp, + endTimestamp, + selectedDates = [] +) { + let tempOfSelectedDate = [...selectedDates] + const dates = dateUtil.sortDatesByTime( + dateUtil.calcDates(dateInfo.year, dateInfo.month), + 'desc' + ) + let datesLen = dates.length + let firstDate = dateUtil.getTimeStamp(dates[0]) + for (let i = 0; i < datesLen; i++) { + const date = dates[i] + const timeStamp = dateUtil.getTimeStamp(date) + if (timeStamp >= startTimestamp && timeStamp <= endTimestamp) { + tempOfSelectedDate.push({ + ...date, + choosed: true + }) + } + if (i === datesLen - 1 && firstDate > startTimestamp) { + pushPrevMonthDateArea( + dateUtil.getPrevMonthInfo(date), + startTimestamp, + endTimestamp, + tempOfSelectedDate + ) + } + } + return tempOfSelectedDate +} +/** + * 当设置日期区域非当前时保存其它月份的日期至已选日期数组 + * @param {object} info + */ +function calcDateWhenNotInOneMonth(info) { + const { firstDate, lastDate, startTimestamp, endTimestamp } = info + let { selectedDate } = info + if (dateUtil.getTimeStamp(firstDate) > startTimestamp) { + selectedDate = pushPrevMonthDateArea( + dateUtil.getPrevMonthInfo(firstDate), + startTimestamp, + endTimestamp, + selectedDate + ) + } + if (dateUtil.getTimeStamp(lastDate) < endTimestamp) { + selectedDate = pusheNextMonthDateArea( + dateUtil.getNextMonthInfo(lastDate), + startTimestamp, + endTimestamp, + selectedDate + ) + } + return [...selectedDate] +} + +/** + * 指定日期区域转时间戳 + * @param {array} timearea 时间区域 + */ +export function convertTimeRangeToTimestamp(timearea = []) { + const start = timearea[0].split('-') + const end = timearea[1].split('-') + if (start.length !== 3 || end.length !== 3) { + logger.warn('enableArea() 参数格式为: ["2018-2-1", "2018-3-1"]') + return {} + } + const startTimestamp = dateUtil + .newDate(start[0], start[1], start[2]) + .getTime() + const endTimestamp = dateUtil.newDate(end[0], end[1], end[2]).getTime() + return { + start, + end, + startTimestamp, + endTimestamp + } +} + +/** + * 校验时间区域是否合法 + * @param {array} dateArea 时间区域 + */ +function validateTimeRange(dateArea) { + const { + start, + end, + startTimestamp, + endTimestamp + } = convertTimeRangeToTimestamp(dateArea) + if (!start || !end) return + const startMonthDays = dateUtil.getDatesCountOfMonth(start[0], start[1]) + const endMonthDays = dateUtil.getDatesCountOfMonth(end[0], end[1]) + if (start[2] > startMonthDays || start[2] < 1) { + logger.warn('enableArea() 开始日期错误,指定日期不在当前月份天数范围内') + return false + } else if (start[1] > 12 || start[1] < 1) { + logger.warn('enableArea() 开始日期错误,月份超出1-12月份') + return false + } else if (end[2] > endMonthDays || end[2] < 1) { + logger.warn('enableArea() 截止日期错误,指定日期不在当前月份天数范围内') + return false + } else if (end[1] > 12 || end[1] < 1) { + logger.warn('enableArea() 截止日期错误,月份超出1-12月份') + return false + } else if (startTimestamp > endTimestamp) { + logger.warn('enableArea()参数最小日期大于了最大日期') + return false + } else { + return true + } +} + +export default () => { + return { + name: 'timeRange', + beforeRender(calendarData = {}, calendarConfig = {}) { + const { + chooseAreaTimestamp = [], + dates = [], + selectedDates = [] + } = calendarData + let __dates = dates + let __selectedDates = selectedDates + const [startDateTimestamp, endDateTimestamp] = chooseAreaTimestamp + if (chooseAreaTimestamp.length === 2) { + __selectedDates = [] + __dates = dates.map(d => { + const date = { ...d } + const dateTimeStamp = dateUtil.getTimeStamp(date) + if ( + dateTimeStamp >= startDateTimestamp && + endDateTimestamp >= dateTimeStamp + ) { + date.choosed = true + __selectedDates.push(date) + } else { + date.choosed = false + __selectedDates = __selectedDates.filter( + item => dateUtil.getTimeStamp(item) !== dateTimeStamp + ) + } + return date + }) + const monthOfStartDate = new Date(startDateTimestamp).getMonth() + const monthOfEndDate = new Date(endDateTimestamp).getMonth() + if (monthOfStartDate !== monthOfEndDate) { + __selectedDates = calcDateWhenNotInOneMonth({ + firstDate: __dates[0], + lastDate: __dates[__dates.length - 1], + startTimestamp: startDateTimestamp, + endTimestamp: endDateTimestamp, + selectedDate: __selectedDates + }) + } + } + return { + calendarData: { + ...calendarData, + dates: __dates, + selectedDates: dateUtil.sortDatesByTime( + dateUtil.uniqueArrayByDate(__selectedDates) + ) + }, + calendarConfig + } + }, + onTapDate(tapedDate, calendarData = {}, calendarConfig = {}) { + if (!calendarConfig.chooseAreaMode) { + return { + calendarData, + calendarConfig + } + } + let { + tempChooseAreaTimestamp = [], + chooseAreaTimestamp: existChooseAreaTimestamp = [], + selectedDates = [], + dates = [] + } = calendarData + const timestamp = dateUtil.getTimeStamp(tapedDate) + let __dates = [...dates] + let __selectedDates = [...selectedDates] + if ( + tempChooseAreaTimestamp.length === 2 || + existChooseAreaTimestamp.length === 2 + ) { + tempChooseAreaTimestamp = [tapedDate] + __selectedDates = [] + __dates.forEach(d => (d.choosed = false)) + } else if (tempChooseAreaTimestamp.length === 1) { + const preChoosedDate = tempChooseAreaTimestamp[0] + const preTimestamp = dateUtil.getTimeStamp(preChoosedDate) + if (preTimestamp <= timestamp) { + tempChooseAreaTimestamp.push(tapedDate) + } else if (preTimestamp > timestamp) { + tempChooseAreaTimestamp.unshift(tapedDate) + } + } else { + tempChooseAreaTimestamp = [tapedDate] + } + let chooseAreaTimestamp = [] + if (tempChooseAreaTimestamp.length === 2) { + const [startDate, endDate] = tempChooseAreaTimestamp + const startDateTimestamp = dateUtil.getTimeStamp(startDate) + const endDateTimestamp = dateUtil.getTimeStamp(endDate) + chooseAreaTimestamp = [startDateTimestamp, endDateTimestamp] + } + return { + calendarData: { + ...calendarData, + chooseAreaTimestamp, + tempChooseAreaTimestamp, + dates: __dates, + selectedDates: __selectedDates + }, + calendarConfig: { + ...calendarConfig, + multi: true + } + } + }, + methods(component) { + return { + /** + * 设置连续日期选择区域 + * @param {array} dateArea 区域开始结束日期数组 + */ + chooseDateArea: (dateArea = []) => { + if (dateArea.length === 1) { + dateArea = dateArea.concat(dateArea) + } + if (dateArea.length !== 2) return + const isRight = validateTimeRange(dateArea) + if (!isRight) return + const config = getCalendarConfig(component) || {} + const { startTimestamp, endTimestamp } = convertTimeRangeToTimestamp( + dateArea + ) + const existCalendarData = getCalendarData('calendar', component) + return renderCalendar.call( + component, + { + ...existCalendarData, + chooseAreaTimestamp: [startTimestamp, endTimestamp] + }, + { + ...config, + multi: true, + chooseAreaMode: true + } + ) + } + } + } + } +} diff --git a/src/components/calendar/plugins/todo.d.ts b/src/components/calendar/plugins/todo.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/calendar/plugins/todo.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/components/calendar/plugins/todo.js b/src/components/calendar/plugins/todo.js new file mode 100644 index 0000000..1559c6c --- /dev/null +++ b/src/components/calendar/plugins/todo.js @@ -0,0 +1,135 @@ +/** + * @Author: drfu* + * @Description: 代办事项 + * @Date: 2020-10-08 21:22:09* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-11 14:23:02 + * */ + +import { getCalendarData, dateUtil } from '../utils/index' +import { renderCalendar } from '../render' + +function updateDatePropertyOfTodoLabel(todos, dates, showLabelAlways) { + const datesInfo = [...dates] + for (let todo of todos) { + let targetIdx = datesInfo.findIndex( + item => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(todo) + ) + let target = datesInfo[targetIdx] + if (!target) continue + if (showLabelAlways) { + target.showTodoLabel = true + } else { + target.showTodoLabel = !target.choosed + } + if (target.showTodoLabel) { + target.todoText = todo.todoText + } + target.color = todo.color + } + return datesInfo +} + +export default () => { + return { + name: 'todo', + beforeRender(calendarData = {}, calendarConfig = {}, component) { + const { todos = [], dates = [], showLabelAlways } = calendarData + const dateWithTodoInfo = updateDatePropertyOfTodoLabel( + todos, + dates, + showLabelAlways + ) + return { + calendarData: { + ...calendarData, + dates: dateWithTodoInfo + }, + calendarConfig + } + }, + methods(component) { + return { + setTodos: (options = {}) => { + const calendar = getCalendarData('calendar', component) + if (!calendar || !calendar.dates) { + return Promise.reject('请等待日历初始化完成后再调用该方法') + } + const { + circle, + dotColor = '', + pos = 'bottom', + showLabelAlways, + dates: todoDates = [] + } = options + const { todos = [] } = calendar + const tranformStr2NumOfTodo = todoDates.map(date => + dateUtil.tranformStr2NumOfDate(date) + ) + const calendarData = { + dates: calendar.dates, + todos: dateUtil.uniqueArrayByDate( + todos.concat(tranformStr2NumOfTodo) + ) + } + if (!circle) { + calendarData.todoLabelPos = pos + calendarData.todoLabelColor = dotColor + } + calendarData.todoLabelCircle = circle || false + calendarData.showLabelAlways = showLabelAlways || false + const existCalendarData = getCalendarData('calendar', component) + return renderCalendar.call(component, { + ...existCalendarData, + ...calendarData + }) + }, + deleteTodos(todos = []) { + if (!(todos instanceof Array) || !todos.length) + return Promise.reject('deleteTodos()应为入参为非空数组') + const existCalendarData = getCalendarData('calendar', component) + const allTodos = existCalendarData.todos || [] + const toDeleteTodos = todos.map(item => dateUtil.toTimeStr(item)) + const remainTodos = allTodos.filter( + item => !toDeleteTodos.includes(dateUtil.toTimeStr(item)) + ) + const { dates, curYear, curMonth } = existCalendarData + const _dates = [...dates] + const currentMonthTodos = dateUtil.filterDatesByYM( + { + year: curYear, + month: curMonth + }, + remainTodos + ) + _dates.forEach(item => { + item.showTodoLabel = false + }) + currentMonthTodos.forEach(item => { + _dates[item.date - 1].showTodoLabel = !_dates[item.date - 1].choosed + }) + return renderCalendar.call(component, { + ...existCalendarData, + dates: _dates, + todos: remainTodos + }) + }, + clearTodos() { + const existCalendarData = getCalendarData('calendar', component) + const _dates = [...existCalendarData.dates] + _dates.forEach(item => { + item.showTodoLabel = false + }) + return renderCalendar.call(component, { + ...existCalendarData, + dates: _dates, + todos: [] + }) + }, + getTodos() { + return getCalendarData('calendar.todos', component) || [] + } + } + } + } +} diff --git a/src/components/calendar/plugins/week.js b/src/components/calendar/plugins/week.js new file mode 100644 index 0000000..673fb7e --- /dev/null +++ b/src/components/calendar/plugins/week.js @@ -0,0 +1,432 @@ +/** + * @Author: drfu* + * @Description: 周视图 + * @Date: 2020-10-08 21:22:09* + * @Last Modified by: drfu + * @Last Modified time: 2020-10-12 14:39:45 + * */ + +import { renderCalendar } from '../render' +import { + getCalendarConfig, + getCalendarData, + logger, + dateUtil +} from '../utils/index' +import { calcJumpData } from '../core' + +/** + * 当月第一周所有日期 + */ +function firstWeekInMonth( + target = {}, + calendarDates = [], + calendarConfig = {} +) { + const { firstDayOfWeek } = calendarConfig + const firstDayOfWeekIsMon = firstDayOfWeek === 'Mon' + const { year, month } = target + let firstDay = dateUtil.getDayOfWeek(year, month, 1) + if (firstDayOfWeekIsMon && firstDay === 0) { + firstDay = 7 + } + const [, end] = [0, 7 - firstDay] + return calendarDates.slice(0, firstDayOfWeekIsMon ? end + 1 : end) +} + +/** + * 当月最后一周所有日期 + */ +function lastWeekInMonth(target = {}, calendarDates = [], calendarConfig = {}) { + const { firstDayOfWeek } = calendarConfig + const firstDayOfWeekIsMon = firstDayOfWeek === 'Mon' + const { year, month } = target + const lastDay = dateUtil.getDatesCountOfMonth(year, month) + let lastDayWeek = dateUtil.getDayOfWeek(year, month, lastDay) + if (firstDayOfWeekIsMon && lastDayWeek === 0) { + lastDayWeek = 7 + } + const [start, end] = [lastDay - lastDayWeek, lastDay] + return calendarDates.slice(firstDayOfWeekIsMon ? start : start - 1, end) +} + +/** + * 判断目标日期是否在某些指定日历内 + */ +function dateIsInDatesRange(target, dates) { + if (!target || !dates || !dates.length) return false + const targetDateStr = dateUtil.toTimeStr(target) + let rst = false + for (let date of dates) { + const dateStr = dateUtil.toTimeStr(date) + if (dateStr === targetDateStr) { + rst = true + return rst + } + rst = false + } + return rst +} + +function getDatesWhenTargetInFirstWeek(target, firstWeekDates) { + const { year, month } = target + const prevMonthInfo = dateUtil.getPrevMonthInfo({ year, month }) + let lastMonthDatesCount = dateUtil.getDatesCountOfMonth( + prevMonthInfo.year, + prevMonthInfo.month + ) + let dates = firstWeekDates + let firstWeekCount = firstWeekDates.length + for (let i = 0; i < 7 - firstWeekCount; i++) { + const week = dateUtil.getDayOfWeek(+year, +month, lastMonthDatesCount) + dates.unshift({ + year: prevMonthInfo.year, + month: prevMonthInfo.month, + date: lastMonthDatesCount, + week + }) + lastMonthDatesCount -= 1 + } + return dates +} + +function getDatesWhenTargetInLastWeek(target, lastWeekDates) { + const { year, month } = target + const prevMonthInfo = dateUtil.getNextMonthInfo({ year, month }) + let dates = lastWeekDates + let lastWeekCount = lastWeekDates.length + for (let i = 0; i < 7 - lastWeekCount; i++) { + const week = dateUtil.getDayOfWeek(+year, +month, i + 1) + dates.push({ + year: prevMonthInfo.year, + month: prevMonthInfo.month, + date: i + 1, + week + }) + } + return dates +} + +function getDates(target, calendarDates = [], calendarConfig = {}) { + const { year, month, date } = target + const targetDay = dateUtil.getDayOfWeek(year, month, date) + const { firstDayOfWeek } = calendarConfig + const firstDayOfWeekIsMon = firstDayOfWeek === 'Mon' + if (firstDayOfWeekIsMon) { + const startIdx = date - (targetDay || 7) + return calendarDates.splice(startIdx, 7) + } else { + const startIdx = date - targetDay - 1 + return calendarDates.splice(startIdx, 7) + } +} + +function getTargetWeekDates(target, calendarConfig) { + if (!target) return + const { year, month } = target + const calendarDates = dateUtil.calcDates(year, month) + const firstWeekDates = firstWeekInMonth(target, calendarDates, calendarConfig) + const lastWeekDates = lastWeekInMonth(target, calendarDates, calendarConfig) + if (dateIsInDatesRange(target, firstWeekDates)) { + return getDatesWhenTargetInFirstWeek(target, firstWeekDates) + } else if (dateIsInDatesRange(target, lastWeekDates)) { + return getDatesWhenTargetInLastWeek(target, lastWeekDates) + } else { + return getDates(target, calendarDates, calendarConfig) + } +} + +/** + * 计算周视图下当前这一周最后一天 + */ +function calculateLastDateOfCurrentWeek(calendarData = {}) { + const { dates = [] } = calendarData + return dates[dates.length - 1] +} +/** + * 计算周视图下当前这一周第一天 + */ +function calculateFirstDateOfCurrentWeek(calendarData = {}) { + const { dates } = calendarData + return dates[0] +} + +/** + * 计算下一周的日期 + */ +function calculateNextWeekDates(calendarData = {}) { + let { curYear, curMonth } = calendarData + let calendarDates = [] + let lastDateInThisWeek = calculateLastDateOfCurrentWeek(calendarData) + const { year: LYear, month: LMonth } = lastDateInThisWeek + if (curYear !== LYear || curMonth !== LMonth) { + calendarDates = dateUtil.calcDates(LYear, LMonth) + curYear = LYear + curMonth = LMonth + } else { + calendarDates = dateUtil.calcDates(curYear, curMonth) + } + const lastDateInThisMonth = dateUtil.getDatesCountOfMonth(curYear, curMonth) + const count = lastDateInThisMonth - lastDateInThisWeek.date + const lastDateIdx = calendarDates.findIndex( + date => dateUtil.toTimeStr(date) === dateUtil.toTimeStr(lastDateInThisWeek) + ) + const startIdx = lastDateIdx + 1 + if (count >= 7) { + return { + dates: calendarDates.splice(startIdx, 7), + year: curYear, + month: curMonth + } + } else { + const nextMonth = dateUtil.getNextMonthInfo({ + year: curYear, + month: curMonth + }) + const { year, month } = nextMonth || {} + const calendarDatesOfNextMonth = dateUtil.calcDates(year, month) + const remainDatesOfThisMonth = calendarDates.splice(startIdx) + const patchDatesOfNextMonth = calendarDatesOfNextMonth.splice( + 0, + 7 - remainDatesOfThisMonth.length + ) + return { + dates: [...remainDatesOfThisMonth, ...patchDatesOfNextMonth], + ...nextMonth + } + } +} + +/** + * 计算上一周的日期 + */ +function calculatePrevWeekDates(calendarData = {}) { + let { curYear, curMonth } = calendarData + let firstDateInThisWeek = calculateFirstDateOfCurrentWeek(calendarData) + let calendarDates = [] + const { year: FYear, month: FMonth } = firstDateInThisWeek + if (curYear !== FYear || curMonth !== FMonth) { + calendarDates = dateUtil.calcDates(FYear, FMonth) + curYear = FYear + curMonth = FMonth + } else { + calendarDates = dateUtil.calcDates(curYear, curMonth) + } + const firstDateIdx = calendarDates.findIndex( + date => dateUtil.toTimeStr(date) === dateUtil.toTimeStr(firstDateInThisWeek) + ) + if (firstDateIdx - 7 >= 0) { + const startIdx = firstDateIdx - 7 + return { + dates: calendarDates.splice(startIdx, 7), + year: curYear, + month: curMonth + } + } else { + const prevMonth = dateUtil.getPrevMonthInfo({ + year: curYear, + month: curMonth + }) + const { year, month } = prevMonth || {} + const calendarDatesOfPrevMonth = dateUtil.calcDates(year, month) + const remainDatesOfThisMonth = calendarDates.splice( + 0, + firstDateInThisWeek.date - 1 + ) + const patchDatesOfPrevMonth = calendarDatesOfPrevMonth.splice( + -(7 - remainDatesOfThisMonth.length) + ) + return { + dates: [...patchDatesOfPrevMonth, ...remainDatesOfThisMonth], + ...prevMonth + } + } +} + +export default () => { + return { + name: 'week', + beforeRender(calendarData = {}, calendarConfig = {}, component) { + const { initializedWeekMode, selectedDates } = calendarData + if (calendarConfig.weekMode && !initializedWeekMode) { + const { defaultDate } = calendarConfig + const target = + (selectedDates && selectedDates[0]) || + (defaultDate && dateUtil.transformDateRow2Dict(defaultDate)) || + dateUtil.todayFMD() + const waitRenderData = this.methods( + component + ).__calcDatesWhenSwitchView('week', target) + const { data, config } = waitRenderData || {} + const setSelectDates = this.methods( + component + ).__selectTargetDateWhenJump(target, data.dates, config) + return { + calendarData: { + ...data, + ...setSelectDates, + weeksCh: dateUtil.getWeekHeader(calendarConfig.firstDayOfWeek), + initializedWeekMode: true + }, + calendarConfig + } + } + return { + calendarData, + calendarConfig + } + }, + onSwitchCalendar(target = {}, calendarData = {}, component) { + const { direction } = target + const { curYear, curMonth } = calendarData + const calendarConfig = getCalendarConfig(component) + let waitRenderData = {} + if (calendarConfig.weekMode) { + if (direction === 'left') { + waitRenderData = calculateNextWeekDates(calendarData) + } else { + waitRenderData = calculatePrevWeekDates(calendarData) + } + const { dates, year, month } = waitRenderData + return { + ...calendarData, + dates, + curYear: year || curYear, + curMonth: month || curMonth + } + } + return calendarData + }, + methods(component) { + return { + __selectTargetDateWhenJump: (target = {}, dates = [], config = {}) => { + let selectedDate = target + const weekDates = dates.map((date, idx) => { + const tmp = { ...date } + tmp.id = idx + const isTarget = + dateUtil.toTimeStr(target) === dateUtil.toTimeStr(tmp) + if (isTarget && !target.choosed && config.autoChoosedWhenJump) { + tmp.choosed = true + selectedDate = tmp + } + return tmp + }) + return { + dates: weekDates, + selectedDates: [selectedDate] + } + }, + __calcDatesForWeekMode(target, config = {}, calendarData = {}) { + const { year, month } = target || {} + const weekDates = getTargetWeekDates(target, config) + weekDates.forEach((date, idx) => (date.id = idx)) + return { + data: { + ...calendarData, + prevMonthGrids: null, + nextMonthGrids: null, + dates: weekDates, + curYear: year, + curMonth: month + }, + config: { + ...config, + weekMode: true + } + } + }, + __calcDatesForMonthMode(target, config = {}, calendarData = {}) { + const { year, month } = target || {} + const waitRenderData = calcJumpData({ + dateInfo: target, + config + }) + return { + data: { + ...calendarData, + ...waitRenderData, + curYear: year, + curMonth: month + }, + config: { + ...config, + weekMode: false + } + } + }, + /** + * 周、月视图切换 + * @param {string} view 视图 [week, month] + * @param {object} target + */ + __calcDatesWhenSwitchView: (view, target) => { + const calendarConfig = getCalendarConfig(component) + if (calendarConfig.multi) + return logger.warn('多选模式不能切换周月视图') + const existCalendarData = getCalendarData('calendar', component) || {} + const { + selectedDates = [], + dates = [], + curYear, + curMonth + } = existCalendarData + const currentMonthSelected = selectedDates.filter( + item => curYear === +item.year || curMonth === +item.month + ) + let jumpTarget = {} + if (target) { + jumpTarget = target + } else { + if (currentMonthSelected.length) { + jumpTarget = currentMonthSelected.pop() + } else { + jumpTarget = dates[0] + } + } + if (view === 'week') { + return this.methods(component).__calcDatesForWeekMode( + jumpTarget, + calendarConfig, + existCalendarData + ) + } else { + return this.methods(component).__calcDatesForMonthMode( + jumpTarget, + calendarConfig, + existCalendarData + ) + } + }, + weekModeJump: dateInfo => { + const target = dateInfo || dateUtil.todayFMD() + const existCalendarData = getCalendarData('calendar', component) || {} + const waitRenderData = this.methods( + component + ).__calcDatesWhenSwitchView('week', target) + const { data, config } = waitRenderData || {} + const setSelectDates = this.methods( + component + ).__selectTargetDateWhenJump(target, data.dates, config) + return renderCalendar.call( + component, + { + ...existCalendarData, + ...data, + ...setSelectDates + }, + config + ) + }, + switchView: (view, target) => { + const waitRenderData = this.methods( + component + ).__calcDatesWhenSwitchView(view, target) + const { data, config } = waitRenderData || {} + if (!data) return logger.warn('当前状态不能切换为周视图') + return renderCalendar.call(component, data, config) + } + } + } + } +} diff --git a/src/components/calendar/render.js b/src/components/calendar/render.js new file mode 100644 index 0000000..ea5a1fa --- /dev/null +++ b/src/components/calendar/render.js @@ -0,0 +1,49 @@ +import plugins from "./plugins/index"; +import { getCalendarConfig } from "./utils/index"; + +/** + * 渲染日历 + */ +export function renderCalendar(calendarData, calendarConfig) { + return new Promise((resolve) => { + const Component = this; + if (Component.firstRender === void 0) { + Component.firstRender = true; + } else { + Component.firstRender = false; + } + const exitData = Component.data.calendar || {}; + for (let plugin of plugins.installed) { + const [, p] = plugin; + if (typeof p.beforeRender === "function") { + const { calendarData: newData, calendarConfig: newConfig } = + p.beforeRender( + { ...exitData, ...calendarData }, + calendarConfig || getCalendarConfig(Component), + Component + ); + calendarData = newData; + calendarConfig = newConfig; + } + } + + Component.setData( + { + config: calendarConfig, + calendar: calendarData, + }, + () => { + const rst = { + calendar: calendarData, + config: calendarConfig, + firstRender: Component.firstRender, + }; + resolve(rst); + if (Component.firstRender) { + Component.triggerEvent("afterCalendarRender", rst); + Component.firstRender = false; + } + } + ); + }); +} diff --git a/src/components/calendar/theme/iconfont.wxss b/src/components/calendar/theme/iconfont.wxss new file mode 100644 index 0000000..9b909a8 --- /dev/null +++ b/src/components/calendar/theme/iconfont.wxss @@ -0,0 +1,29 @@ +@font-face { + font-family: 'iconfont'; + src: url(data:font/truetype;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTYda3jUAAAfEAAAAHEdERUYAKQANAAAHpAAAAB5PUy8yPllJ4AAAAVgAAABWY21hcAAP65kAAAHIAAABQmdhc3D//wADAAAHnAAAAAhnbHlmLotR3AAAAxwAAAGkaGVhZBTU+ykAAADcAAAANmhoZWEHKwOFAAABFAAAACRobXR4DasB4gAAAbAAAAAWbG9jYQC0AR4AAAMMAAAAEG1heHABEwAyAAABOAAAACBuYW1lKeYRVQAABMAAAAKIcG9zdEoLnOYAAAdIAAAAUgABAAAAAQAAiPM8al8PPPUACwQAAAAAANjbW5YAAAAA2NtblgCzAAQDTQL8AAAACAACAAAAAAAAAAEAAAOA/4AAXAQAAAAAAANNAAEAAAAAAAAAAAAAAAAAAAAEAAEAAAAHACYAAgAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQQAAZAABQAAAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA5+vn7gOA/4AAXAOAAIAAAAABAAAAAAAABAAAAAAAAAAEAAAABAABLgD4ALQAswAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAA5+7//wAA5+v//xgYAAEAAAAAAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgBMAI4A0gABAS4ABAMKAvwAEgAACQEmBh0BFBcJAQYdARQWNwE2NAL+/j0ECQYBaP6YBgkEAcMMAZkBYAMEBU0IBf7n/ucFCE0FBAMBYAoeAAAAAQD4AAQC1AL8ABIAAAE1NCYHAQYUFwEWNj0BNCcJATYC1AkE/j0MDAHDBAkG/pgBaAYCpk0FBAP+oAoeCv6gAwQFTQgFARkBGQUAAAIAtAAgA00C4AASACUAAAkBNiYrASIHAwYUFwEWOwEyNicTATYmKwEiBwMGFBcBFjsBMjYnAREBCQMEBU0IBf8HBwD/BQhNBQQDJwEJAwQFTQgF/wcHAP8FCE0FBAMBgAFTBAkG/roJFgn+ugYJBAFTAVMECQb+ugkWCf66BgkEAAAAAAIAswAgA0wC4AASACUAAAEDJisBIgYXCQEGFjsBMjcBNjQlAyYrASIGFwkBBhY7ATI3ATY0AhX/BQhNBQQDAQn+9wMEBU0IBQD/BwEp/wUITQUEAwEJ/vcDBAVNCAUA/wcBlAFGBgkE/q3+rQQJBgFGCRYJAUYGCQT+rf6tBAkGAUYJFgAAAAAAABIA3gABAAAAAAAAABUALAABAAAAAAABAAgAVAABAAAAAAACAAcAbQABAAAAAAADAAgAhwABAAAAAAAEAAgAogABAAAAAAAFAAsAwwABAAAAAAAGAAgA4QABAAAAAAAKACsBQgABAAAAAAALABMBlgADAAEECQAAACoAAAADAAEECQABABAAQgADAAEECQACAA4AXQADAAEECQADABAAdQADAAEECQAEABAAkAADAAEECQAFABYAqwADAAEECQAGABAAzwADAAEECQAKAFYA6gADAAEECQALACYBbgAKAEMAcgBlAGEAdABlAGQAIABiAHkAIABpAGMAbwBuAGYAbwBuAHQACgAACkNyZWF0ZWQgYnkgaWNvbmZvbnQKAABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABSAGUAZwB1AGwAYQByAABSZWd1bGFyAABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABWAGUAcgBzAGkAbwBuACAAMQAuADAAAFZlcnNpb24gMS4wAABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAABHZW5lcmF0ZWQgYnkgc3ZnMnR0ZiBmcm9tIEZvbnRlbGxvIHByb2plY3QuAABoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAABodHRwOi8vZm9udGVsbG8uY29tAAACAAAAAAAAAAoAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAcAAAABAAIBAgEDAQQBBQVyaWdodARsZWZ0CmRvdWJsZWxlZnQLZG91YmxlcmlnaHQAAAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAYAAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA2NtblgAAAADY21uW) format('truetype'); + font-weight: normal; + font-style: normal; +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; +} + +.icon-right::before { + content: "\e7eb"; +} + +.icon-left::before { + content: "\e7ec"; +} + +.icon-doubleleft::before { + content: "\e7ed"; +} + +.icon-doubleright::before { + content: "\e7ee"; +} diff --git a/src/components/calendar/theme/theme-default.wxss b/src/components/calendar/theme/theme-default.wxss new file mode 100644 index 0000000..08de663 --- /dev/null +++ b/src/components/calendar/theme/theme-default.wxss @@ -0,0 +1,61 @@ + +/* 日历主要颜色相关样式 */ + +.default_color, +.default_weekend-color, +.default_handle-color, +.default_week-color { + color: #ff629a; +} + +.default_today { + color: #fff; + background-color: #874fb4; +} + +.default_choosed { + color: #fff; + background-color: #ff629a; +} + +.default_date-disable { + color: #c7c7c7; +} + +.default_choosed.default_date-disable { + color: #e2e2e2; + background-color: #c2afb6; +} + +.default_prev-month-date, +.default_next-month-date { + color: #e2e2e2; +} + +.default_normal-date { + color: #88d2ac; +} + +.default_todo-circle { + border-color: #88d2ac; +} + +.default_todo-dot { + background-color: #e54d42; +} + +.default_date-desc { + color: #c2c2c2; +} + +.default_date-desc-lunar { + color: #e54d42; +} + +.default_date-desc-disable { + color: #e2e2e2; +} + +.default_festival { + color: #c2c2c2; +} diff --git a/src/components/calendar/theme/theme-elegant.wxss b/src/components/calendar/theme/theme-elegant.wxss new file mode 100644 index 0000000..6296701 --- /dev/null +++ b/src/components/calendar/theme/theme-elegant.wxss @@ -0,0 +1,58 @@ +.elegant_color, +.elegant_weekend-color, +.elegant_handle-color, +.elegant_week-color { + color: #333; +} + +.elegant_today { + color: #000; + background-color: #e1e7f5; +} + +.elegant_choosed { + color: #000; + background-color: #e2e2e2; +} + +.elegant_date-disable { + color: #c7c7c7; +} + +.elegant_choosed.elegant_date-disable { + color: #999; + background-color: #ebebeb; +} + +.elegant_prev-month-date, +.elegant_next-month-date { + color: #e2e2e2; +} + +.elegant_normal-date { + color: #777; +} + +.elegant_todo-circle { + border-color: #161035; +} + +.elegant_todo-dot { + background-color: #161035; +} + +.elegant_date-desc { + color: #c2c2c2; +} + +.elegant_date-desc-lunar { + color: #161035; +} + +.elegant_date-desc-disable { + color: #e2e2e2; +} + +.elegant_festival { + color: #c2c2c2; +} diff --git a/src/components/calendar/theme/theme-geneB.wxss b/src/components/calendar/theme/theme-geneB.wxss new file mode 100644 index 0000000..ab8def7 --- /dev/null +++ b/src/components/calendar/theme/theme-geneB.wxss @@ -0,0 +1,95 @@ +/* 日历主要颜色相关样式 */ + +.geneb_color, +.geneb_weekend-color, +.geneb_handle-color, +.geneb_week-color { + color: rgba(51, 51, 51, 1); +} + +.geneb_choosed { + color:#fff; + background-color: rgba(246, 74, 58, 1); +} + +.geneb_today { + color: rgba(246, 74, 58, 1); + background-color: rgba(255, 237, 235, 1); +} + +.geneb_today.geneb_choosed { + color: #fff; + background-color: rgba(246, 74, 58, 1); +} + +.geneb_date-disable { + color: #c7c7c7; +} + +.geneb_choosed.geneb_date-disable { + color: #e2e2e2; + background-color: #c2afb6; +} + +.geneb_prev-month-date, +.geneb_next-month-date { + color: #e2e2e2; +} + +.geneb_normal-date { + color: rgba(1, 1, 5, 1); +} + +.geneb_todo-circle { + border-color: #88d2ac; +} + +.geneb_todo-dot { + background-color: #e54d42; +} + +.geneb_date-desc { + color: #c2c2c2; +} + +.geneb_date-desc-lunar { + color: #e54d42; +} + +.geneb_date-desc-disable { + color: #e2e2e2; +} + +.geneb_festival { + color: #c2c2c2; +} + +.date.doc { + position: relative; + background-color: #e5e5e5; +} + +.date.doc::after { + position: absolute; + z-index: 1; + top: -5rpx; + right: -5rpx; + content: ''; + width: 17rpx; + height: 24rpx; + background-repeat: no-repeat; + background-size: cover; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAABACAYAAABhspUgAAAAAXNSR0IArs4c6QAACAVJREFUaEPtmltsHFcZx/9nZu92bMdJSMitzoWkoXVKUrVV8wKk4gHxgJTwgKA8lhfgCZBoUJEqUYGA0AhRQUSpFJQIHlyqogZFIipUoKiAKJAYQkp9qR1ir9fe6+zuXM4FfWf2MrOJY+/aS0zlkRxZzsw5v/nP/3znO+c7DItcl4vFTWVl/7wg5EctKSK2knCVBFcKcrGH7vL3MvfwVnYeGbsaustgAAODCSDCDLU1Hp/Ym+o7fnrvB9+9U3NssT5ezWe+k5X8qwvCQ0FwVKSEswJg6sfmHH+cm2l0SZ3Tj8F84ChjiDID+1I9ly4ceuTjbQFfyM2MpDk/meEu8oKjJIUG9khh1YHEtUeupgPAWl3AAENEwzLEmIGd8dToq8OPDbcF/OLCrZFZ7p5Mcxc5wVEUAmQLT8mOLFHvfCwzF7ZEC3CcGdiRSIxeHD7WHvDZhZsjM56ngbMELDlsWVO4c4ExOd8E9i1R969vhzhj2BFPjv76cJvApPCtkMK8YYkVOALLUXh7PNE+8M/Iw553MiN8S1ii6eGVAI+mZ0PfhzHoAWfWBlyMMWyPJ0dfG368PUu8nJ8bWRD8ZPYOUWIlwH+YmQ4Dg8FoAPu22J5Ijb7ywKPtAV8uZZ/LC36qIH11q7UIIZRCp8CW5+Ly7M3bgVkzUlC0ONC74VcvHTj6ybaiBN38RmVhV9YxTBs2nrl08VTRrjy1gvEGZRh+HGu5epOp808ceehMFFEkDYN/f++Df1+sn0UnjtYHjB9+63tQ6ssrAV70WcZOyy8+/ZXltL0o8Hfzk3u4jc94Bh7nSm0uOZWNruvFozBMkzEG+iF3KGm5XJTAZFVIxRXCjnGkNB0pIwXPTWYcu6/MeYLAgh1HozHeE48VE6Y5vyFiXknFoufO73/4nWVZ4kwmc9BG5QVLiONcKSYYEFU0z/vd1P3rQaEiBYiwnSvr2Jgo5mFxTz9Gcbj+AjTjmczPKbbF41fej9jnzz5w9J/B9kMKP58e/1xO4ayjZNKlwaUUkqYJJZsDjRKfBcH1dN3pRa3dKpUwX61oqRs5RS1amLWpOmWYzv5k7xfO3X/0p/W+GsBnMtNPLQjvx1UlDUcKQDEkDKanYRJR6W+tMM0dzPPOYYMvmauWkStXfOBA1kYxWecWMJAwDHV/T9+Xzh088kLDSmfmpx9b8Lw3qpDxqv7MCilmaFBJ/9aMmZYcY05VK78aFw2DrGXBdp2AymSLQDIEAynD9B4c3PKRnwwduqIV/ubc5N+Kgj9EnqQEhxIQ+iwyEHPJIm+WSxBMj7TV4NX+lVIiXyzURGCg/NjP3ijdNEAzH/FsjcX/dWn42CH2g+zMJ9Ju5bWyFDrnFQB6GMGSur4N6Bpzq5hwnVUBbW2kWq3CcXyV6QoMvgZwghk43Dtwgn17burlrHBPaGAlEQFDnN68Bku41NDvrQLsVVK2FZhzAcsqNYCpP/rCZA2tsGGAgIeSvRfZs3Pj0wUhdpZr028vo/cj4OaHJ+WvVIpdUbfeaKHg26KpMoU3P7cgaALeHIun2TPpcaskeE9ZSp0v9DPTjwoB4Cytx+xyV4FLxSKE9FeL9TDnZ3D+KoSA+yIRm52aGVOWEiBLVKXEoBHRdtDRoXbNcQ9XuwxMliBrhIBr8VgDGwxJZoI9TcCSo6wkHCmxUQOHV8Zz3MVVu9JVha2SBR6YjCjlrK/1tCUMwwf+WgDYrQGLlsC1VoDJFiHgoMLBSLsWgClSJOvAJdncd6hbYi0B08DzLVFTeB24g+F5t0G3rnAHgt72yLrC93LieO952ARHVDWXQQVuYbqaWQ2rLtrGVJmhEljR6pyRFqS1fIKS+LjB/JmuNQ7vlrMYUs1dxp3udRwrvdJV4GedJ3BDbl6yj1UFdgsJVNMbQp0mt5UQ67OXBLknwOO/OILi2KYQXN++Bez99F/XJvA75x+G9e7GEFzvfTnsf/Iv68CNKhFla50OujWtsD3fA2tyMPSpM3/eBSebCv0tPljBlkfCm9i9Q1kkNofXiF0fdJO/HEb++tYlvXmnGwYOpTF04lrov7oOPDFyGIUb7+sIuP9gBns+Fd6zXgdunen+7xT+z28OIPOn3R1ZYsujU9jxsbf/tx6m3pQMVxzGLhyFNdUycezOYd9n3wrBMeP23c+ue/hO0q7pOLwOfC/Sy1uvfwDZa9tC4g8Oz2L78X8vOTjviYeXpLrLDSsC3qqy2KZyjeYH3EnsKf92JTxLPvti9UOYkv233eefWKEqE52rWGSJFNx9pxbu9Wbge2/VvOYVru/Ar+UN7cb+8FosGTRrz35RpulhE+zrs1TjoKKMf5BuIzN1cTFYRcpwD6NOd2scxRIVZZqbN/q0la7sN6tIumTwjdlxXUWqCAIW6KeiTMtxxXnh4boTPoK4ZJxq84ZssQgvAEwl3HpVXyusK0kG2HNzk/mSEP0VJfS5NCosKjq7USuAU15lKYkbXa4i3czlwOkUQe0KAtfrzf2RqMVOZ6Z+VxD8w1RUJEtElV9JDx4Ipd8nXFtX+btxOULg7ay/d9eohDL/tFX9PCZB70qk3mQ/ys0M5T3nWlXKXqrYcyaRpFtrRw7qiPQyRa3Aso8JLevdqAg/mptHwW1uZ9XPYxIwiUc/GyLRyuH+LcO6d4KuCv5SRYojrpQDFIcjMLTp60dcdMJel6D1YM+y0MI3uUIg57n4RyGLoueGE/xar2SLHsO0NsXi13b1DDz5/H0Hxv8Lo3UyF0Y2DrcAAAAASUVORK5CYII='); +} + +.date.error { + background-color: rgba(207, 83, 117, 1); + border-radius: 50%; + color: #fff; +} + +.date.primary { + background-color: rgba(37, 217, 200, 1); + color: #fff; + border-radius: 50%; +} diff --git a/src/components/calendar/theme/theme-geneDoctorB.wxss b/src/components/calendar/theme/theme-geneDoctorB.wxss new file mode 100644 index 0000000..b006fd6 --- /dev/null +++ b/src/components/calendar/theme/theme-geneDoctorB.wxss @@ -0,0 +1,95 @@ +/* 日历主要颜色相关样式 */ + +.geneb_doctor_color, +.geneb_doctor_weekend-color, +.geneb_doctor_handle-color, +.geneb_doctor_week-color { + color: rgba(51, 51, 51, 1); +} + +.geneb_doctor_choosed { + color:#fff; + background-color: rgba(28, 107, 255, 1); +} + +.geneb_doctor_today { + color: #fff; + background-color: rgba(28, 107, 255, 1); +} + +.geneb_doctor_today.geneb_choosed { + color: #fff; + background-color: rgba(28, 107, 255, 1); +} + +.geneb_doctor_date-disable { + color: #c7c7c7; +} + +.geneb_doctor_choosed.geneb_date-disable { + color: #e2e2e2; + background-color: #c2afb6; +} + +.geneb_doctor_prev-month-date, +.geneb_doctor_next-month-date { + color: #e2e2e2; +} + +.geneb_doctor_normal-date { + color: rgba(1, 1, 5, 1); +} + +.geneb_doctor_todo-circle { + border-color: #88d2ac; +} + +.geneb_doctor_todo-dot { + background-color: #e54d42; +} + +.geneb_doctor_date-desc { + color: #c2c2c2; +} + +.geneb_doctor_date-desc-lunar { + color: #e54d42; +} + +.geneb_doctor_date-desc-disable { + color: #e2e2e2; +} + +.geneb_doctor_festival { + color: #c2c2c2; +} + +.date.doc { + position: relative; + background-color: #e5e5e5; +} + +.date.doc::after { + position: absolute; + z-index: 1; + top: -5rpx; + right: -5rpx; + content: ''; + width: 17rpx; + height: 24rpx; + background-repeat: no-repeat; + background-size: cover; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAABACAYAAABhspUgAAAAAXNSR0IArs4c6QAACAVJREFUaEPtmltsHFcZx/9nZu92bMdJSMitzoWkoXVKUrVV8wKk4gHxgJTwgKA8lhfgCZBoUJEqUYGA0AhRQUSpFJQIHlyqogZFIipUoKiAKJAYQkp9qR1ir9fe6+zuXM4FfWf2MrOJY+/aS0zlkRxZzsw5v/nP/3znO+c7DItcl4vFTWVl/7wg5EctKSK2knCVBFcKcrGH7vL3MvfwVnYeGbsaustgAAODCSDCDLU1Hp/Ym+o7fnrvB9+9U3NssT5ezWe+k5X8qwvCQ0FwVKSEswJg6sfmHH+cm2l0SZ3Tj8F84ChjiDID+1I9ly4ceuTjbQFfyM2MpDk/meEu8oKjJIUG9khh1YHEtUeupgPAWl3AAENEwzLEmIGd8dToq8OPDbcF/OLCrZFZ7p5Mcxc5wVEUAmQLT8mOLFHvfCwzF7ZEC3CcGdiRSIxeHD7WHvDZhZsjM56ngbMELDlsWVO4c4ExOd8E9i1R969vhzhj2BFPjv76cJvApPCtkMK8YYkVOALLUXh7PNE+8M/Iw553MiN8S1ii6eGVAI+mZ0PfhzHoAWfWBlyMMWyPJ0dfG368PUu8nJ8bWRD8ZPYOUWIlwH+YmQ4Dg8FoAPu22J5Ijb7ywKPtAV8uZZ/LC36qIH11q7UIIZRCp8CW5+Ly7M3bgVkzUlC0ONC74VcvHTj6ybaiBN38RmVhV9YxTBs2nrl08VTRrjy1gvEGZRh+HGu5epOp808ceehMFFEkDYN/f++Df1+sn0UnjtYHjB9+63tQ6ssrAV70WcZOyy8+/ZXltL0o8Hfzk3u4jc94Bh7nSm0uOZWNruvFozBMkzEG+iF3KGm5XJTAZFVIxRXCjnGkNB0pIwXPTWYcu6/MeYLAgh1HozHeE48VE6Y5vyFiXknFoufO73/4nWVZ4kwmc9BG5QVLiONcKSYYEFU0z/vd1P3rQaEiBYiwnSvr2Jgo5mFxTz9Gcbj+AjTjmczPKbbF41fej9jnzz5w9J/B9kMKP58e/1xO4ayjZNKlwaUUkqYJJZsDjRKfBcH1dN3pRa3dKpUwX61oqRs5RS1amLWpOmWYzv5k7xfO3X/0p/W+GsBnMtNPLQjvx1UlDUcKQDEkDKanYRJR6W+tMM0dzPPOYYMvmauWkStXfOBA1kYxWecWMJAwDHV/T9+Xzh088kLDSmfmpx9b8Lw3qpDxqv7MCilmaFBJ/9aMmZYcY05VK78aFw2DrGXBdp2AymSLQDIEAynD9B4c3PKRnwwduqIV/ubc5N+Kgj9EnqQEhxIQ+iwyEHPJIm+WSxBMj7TV4NX+lVIiXyzURGCg/NjP3ijdNEAzH/FsjcX/dWn42CH2g+zMJ9Ju5bWyFDrnFQB6GMGSur4N6Bpzq5hwnVUBbW2kWq3CcXyV6QoMvgZwghk43Dtwgn17burlrHBPaGAlEQFDnN68Bku41NDvrQLsVVK2FZhzAcsqNYCpP/rCZA2tsGGAgIeSvRfZs3Pj0wUhdpZr028vo/cj4OaHJ+WvVIpdUbfeaKHg26KpMoU3P7cgaALeHIun2TPpcaskeE9ZSp0v9DPTjwoB4Cytx+xyV4FLxSKE9FeL9TDnZ3D+KoSA+yIRm52aGVOWEiBLVKXEoBHRdtDRoXbNcQ9XuwxMliBrhIBr8VgDGwxJZoI9TcCSo6wkHCmxUQOHV8Zz3MVVu9JVha2SBR6YjCjlrK/1tCUMwwf+WgDYrQGLlsC1VoDJFiHgoMLBSLsWgClSJOvAJdncd6hbYi0B08DzLVFTeB24g+F5t0G3rnAHgt72yLrC93LieO952ARHVDWXQQVuYbqaWQ2rLtrGVJmhEljR6pyRFqS1fIKS+LjB/JmuNQ7vlrMYUs1dxp3udRwrvdJV4GedJ3BDbl6yj1UFdgsJVNMbQp0mt5UQ67OXBLknwOO/OILi2KYQXN++Bez99F/XJvA75x+G9e7GEFzvfTnsf/Iv68CNKhFla50OujWtsD3fA2tyMPSpM3/eBSebCv0tPljBlkfCm9i9Q1kkNofXiF0fdJO/HEb++tYlvXmnGwYOpTF04lrov7oOPDFyGIUb7+sIuP9gBns+Fd6zXgdunen+7xT+z28OIPOn3R1ZYsujU9jxsbf/tx6m3pQMVxzGLhyFNdUycezOYd9n3wrBMeP23c+ue/hO0q7pOLwOfC/Sy1uvfwDZa9tC4g8Oz2L78X8vOTjviYeXpLrLDSsC3qqy2KZyjeYH3EnsKf92JTxLPvti9UOYkv233eefWKEqE52rWGSJFNx9pxbu9Wbge2/VvOYVru/Ar+UN7cb+8FosGTRrz35RpulhE+zrs1TjoKKMf5BuIzN1cTFYRcpwD6NOd2scxRIVZZqbN/q0la7sN6tIumTwjdlxXUWqCAIW6KeiTMtxxXnh4boTPoK4ZJxq84ZssQgvAEwl3HpVXyusK0kG2HNzk/mSEP0VJfS5NCosKjq7USuAU15lKYkbXa4i3czlwOkUQe0KAtfrzf2RqMVOZ6Z+VxD8w1RUJEtElV9JDx4Ipd8nXFtX+btxOULg7ay/d9eohDL/tFX9PCZB70qk3mQ/ys0M5T3nWlXKXqrYcyaRpFtrRw7qiPQyRa3Aso8JLevdqAg/mptHwW1uZ9XPYxIwiUc/GyLRyuH+LcO6d4KuCv5SRYojrpQDFIcjMLTp60dcdMJel6D1YM+y0MI3uUIg57n4RyGLoueGE/xar2SLHsO0NsXi13b1DDz5/H0Hxv8Lo3UyF0Y2DrcAAAAASUVORK5CYII='); +} + +.date.error { + background-color: rgba(207, 83, 117, 1); + border-radius: 50%; + color: #fff; +} + +.date.primary { + background-color: rgba(37, 217, 200, 1); + color: #fff; + border-radius: 50%; +} diff --git a/src/components/calendar/theme/theme-nuohe.wxss b/src/components/calendar/theme/theme-nuohe.wxss new file mode 100644 index 0000000..57489a4 --- /dev/null +++ b/src/components/calendar/theme/theme-nuohe.wxss @@ -0,0 +1,90 @@ +/* 日历主要颜色相关样式 */ + +.nuohe_color, +.nuohe_weekend-color, +.nuohe_handle-color, +.nuohe_week-color { + color: rgba(51, 51, 51, 1); +} + +.nuohe_today { + color: #fff; + background-color: #874fb4; +} + +.nuohe_choosed { + color: rgba(51, 51, 51, 1); + background-color: rgba(189, 189, 189, 0.3); +} + +.nuohe_date-disable { + color: #c7c7c7; +} + +.nuohe_choosed.nuohe_date-disable { + color: #e2e2e2; + background-color: #c2afb6; +} + +.nuohe_prev-month-date, +.nuohe_next-month-date { + color: #e2e2e2; +} + +.nuohe_normal-date { + color: rgba(51, 51, 51, 1); +} + +.nuohe_todo-circle { + border-color: #88d2ac; +} + +.nuohe_todo-dot { + background-color: #e54d42; +} + +.nuohe_date-desc { + color: #c2c2c2; +} + +.nuohe_date-desc-lunar { + color: #e54d42; +} + +.nuohe_date-desc-disable { + color: #e2e2e2; +} + +.nuohe_festival { + color: #c2c2c2; +} + +.date.doc { + position: relative; + background-color: #e5e5e5; +} + +.date.doc::after { + position: absolute; + z-index: 1; + top: -5rpx; + right: -5rpx; + content: ""; + width: 17rpx; + height: 24rpx; + background-repeat: no-repeat; + background-size: cover; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAABACAYAAABhspUgAAAAAXNSR0IArs4c6QAACAVJREFUaEPtmltsHFcZx/9nZu92bMdJSMitzoWkoXVKUrVV8wKk4gHxgJTwgKA8lhfgCZBoUJEqUYGA0AhRQUSpFJQIHlyqogZFIipUoKiAKJAYQkp9qR1ir9fe6+zuXM4FfWf2MrOJY+/aS0zlkRxZzsw5v/nP/3znO+c7DItcl4vFTWVl/7wg5EctKSK2knCVBFcKcrGH7vL3MvfwVnYeGbsaustgAAODCSDCDLU1Hp/Ym+o7fnrvB9+9U3NssT5ezWe+k5X8qwvCQ0FwVKSEswJg6sfmHH+cm2l0SZ3Tj8F84ChjiDID+1I9ly4ceuTjbQFfyM2MpDk/meEu8oKjJIUG9khh1YHEtUeupgPAWl3AAENEwzLEmIGd8dToq8OPDbcF/OLCrZFZ7p5Mcxc5wVEUAmQLT8mOLFHvfCwzF7ZEC3CcGdiRSIxeHD7WHvDZhZsjM56ngbMELDlsWVO4c4ExOd8E9i1R969vhzhj2BFPjv76cJvApPCtkMK8YYkVOALLUXh7PNE+8M/Iw553MiN8S1ii6eGVAI+mZ0PfhzHoAWfWBlyMMWyPJ0dfG368PUu8nJ8bWRD8ZPYOUWIlwH+YmQ4Dg8FoAPu22J5Ijb7ywKPtAV8uZZ/LC36qIH11q7UIIZRCp8CW5+Ly7M3bgVkzUlC0ONC74VcvHTj6ybaiBN38RmVhV9YxTBs2nrl08VTRrjy1gvEGZRh+HGu5epOp808ceehMFFEkDYN/f++Df1+sn0UnjtYHjB9+63tQ6ssrAV70WcZOyy8+/ZXltL0o8Hfzk3u4jc94Bh7nSm0uOZWNruvFozBMkzEG+iF3KGm5XJTAZFVIxRXCjnGkNB0pIwXPTWYcu6/MeYLAgh1HozHeE48VE6Y5vyFiXknFoufO73/4nWVZ4kwmc9BG5QVLiONcKSYYEFU0z/vd1P3rQaEiBYiwnSvr2Jgo5mFxTz9Gcbj+AjTjmczPKbbF41fej9jnzz5w9J/B9kMKP58e/1xO4ayjZNKlwaUUkqYJJZsDjRKfBcH1dN3pRa3dKpUwX61oqRs5RS1amLWpOmWYzv5k7xfO3X/0p/W+GsBnMtNPLQjvx1UlDUcKQDEkDKanYRJR6W+tMM0dzPPOYYMvmauWkStXfOBA1kYxWecWMJAwDHV/T9+Xzh088kLDSmfmpx9b8Lw3qpDxqv7MCilmaFBJ/9aMmZYcY05VK78aFw2DrGXBdp2AymSLQDIEAynD9B4c3PKRnwwduqIV/ubc5N+Kgj9EnqQEhxIQ+iwyEHPJIm+WSxBMj7TV4NX+lVIiXyzURGCg/NjP3ijdNEAzH/FsjcX/dWn42CH2g+zMJ9Ju5bWyFDrnFQB6GMGSur4N6Bpzq5hwnVUBbW2kWq3CcXyV6QoMvgZwghk43Dtwgn17burlrHBPaGAlEQFDnN68Bku41NDvrQLsVVK2FZhzAcsqNYCpP/rCZA2tsGGAgIeSvRfZs3Pj0wUhdpZr028vo/cj4OaHJ+WvVIpdUbfeaKHg26KpMoU3P7cgaALeHIun2TPpcaskeE9ZSp0v9DPTjwoB4Cytx+xyV4FLxSKE9FeL9TDnZ3D+KoSA+yIRm52aGVOWEiBLVKXEoBHRdtDRoXbNcQ9XuwxMliBrhIBr8VgDGwxJZoI9TcCSo6wkHCmxUQOHV8Zz3MVVu9JVha2SBR6YjCjlrK/1tCUMwwf+WgDYrQGLlsC1VoDJFiHgoMLBSLsWgClSJOvAJdncd6hbYi0B08DzLVFTeB24g+F5t0G3rnAHgt72yLrC93LieO952ARHVDWXQQVuYbqaWQ2rLtrGVJmhEljR6pyRFqS1fIKS+LjB/JmuNQ7vlrMYUs1dxp3udRwrvdJV4GedJ3BDbl6yj1UFdgsJVNMbQp0mt5UQ67OXBLknwOO/OILi2KYQXN++Bez99F/XJvA75x+G9e7GEFzvfTnsf/Iv68CNKhFla50OujWtsD3fA2tyMPSpM3/eBSebCv0tPljBlkfCm9i9Q1kkNofXiF0fdJO/HEb++tYlvXmnGwYOpTF04lrov7oOPDFyGIUb7+sIuP9gBns+Fd6zXgdunen+7xT+z28OIPOn3R1ZYsujU9jxsbf/tx6m3pQMVxzGLhyFNdUycezOYd9n3wrBMeP23c+ue/hO0q7pOLwOfC/Sy1uvfwDZa9tC4g8Oz2L78X8vOTjviYeXpLrLDSsC3qqy2KZyjeYH3EnsKf92JTxLPvti9UOYkv233eefWKEqE52rWGSJFNx9pxbu9Wbge2/VvOYVru/Ar+UN7cb+8FosGTRrz35RpulhE+zrs1TjoKKMf5BuIzN1cTFYRcpwD6NOd2scxRIVZZqbN/q0la7sN6tIumTwjdlxXUWqCAIW6KeiTMtxxXnh4boTPoK4ZJxq84ZssQgvAEwl3HpVXyusK0kG2HNzk/mSEP0VJfS5NCosKjq7USuAU15lKYkbXa4i3czlwOkUQe0KAtfrzf2RqMVOZ6Z+VxD8w1RUJEtElV9JDx4Ipd8nXFtX+btxOULg7ay/d9eohDL/tFX9PCZB70qk3mQ/ys0M5T3nWlXKXqrYcyaRpFtrRw7qiPQyRa3Aso8JLevdqAg/mptHwW1uZ9XPYxIwiUc/GyLRyuH+LcO6d4KuCv5SRYojrpQDFIcjMLTp60dcdMJel6D1YM+y0MI3uUIg57n4RyGLoueGE/xar2SLHsO0NsXi13b1DDz5/H0Hxv8Lo3UyF0Y2DrcAAAAASUVORK5CYII="); +} + +.date.error { + background-color: rgba(207, 83, 117, 1); + border-radius: 50%; + color: #fff; +} + +.date.primary { + background-color: rgba(37, 217, 200, 1); + color: #fff; + border-radius: 50%; +} diff --git a/src/components/calendar/utils/index.js b/src/components/calendar/utils/index.js new file mode 100644 index 0000000..5d5da50 --- /dev/null +++ b/src/components/calendar/utils/index.js @@ -0,0 +1,275 @@ +import Logger from "./logger"; +import WxData from "./wxData"; + +let systemInfo; +export function getSystemInfo() { + if (systemInfo) return systemInfo; + systemInfo = wx.getSystemInfoSync(); + return systemInfo; +} + +export function isIos() { + const sys = getSystemInfo(); + return /iphone|ios/i.test(sys.platform); +} + +class Gesture { + /** + * 左滑 + * @param {object} e 事件对象 + * @returns {boolean} 布尔值 + */ + isLeft(gesture = {}, touche = {}) { + const { startX, startY } = gesture; + const deltaX = touche.clientX - startX; + const deltaY = touche.clientY - startY; + if (deltaX < -60 && deltaY < 20 && deltaY > -20) { + return true; + } else { + return false; + } + } + /** + * 右滑 + * @param {object} e 事件对象 + * @returns {boolean} 布尔值 + */ + isRight(gesture = {}, touche = {}) { + const { startX, startY } = gesture; + const deltaX = touche.clientX - startX; + const deltaY = touche.clientY - startY; + + if (deltaX > 60 && deltaY < 20 && deltaY > -20) { + return true; + } else { + return false; + } + } +} + +class DateUtil { + newDate(year, month, date) { + let cur = `${+year}-${+month}-${+date}`; + if (isIos()) { + cur = `${+year}/${+month}/${+date}`; + } + return new Date(cur); + } + /** + * 计算指定日期时间戳 + * @param {object} date + */ + getTimeStamp(dateInfo) { + if (typeof dateInfo === "string") { + dateInfo = this.transformDateRow2Dict(dateInfo); + } + if (Object.prototype.toString.call(dateInfo) !== "[object Object]") return; + const dateUtil = new DateUtil(); + return dateUtil.newDate(dateInfo.year, dateInfo.month, dateInfo.date).getTime(); + } + /** + * 计算指定月份共多少天 + * @param {number} year 年份 + * @param {number} month 月份 + */ + getDatesCountOfMonth(year, month) { + return new Date(Date.UTC(year, month, 0)).getUTCDate(); + } + /** + * 计算指定月份第一天星期几 + * @param {number} year 年份 + * @param {number} month 月份 + */ + firstDayOfWeek(year, month) { + return new Date(Date.UTC(year, month - 1, 1)).getUTCDay(); + } + /** + * 计算指定日期星期几 + * @param {number} year 年份 + * @param {number} month 月份 + * @param {number} date 日期 + */ + getDayOfWeek(year, month, date) { + return new Date(Date.UTC(year, month - 1, date)).getUTCDay(); + } + todayFMD() { + const _date = new Date(); + const year = _date.getFullYear(); + const month = _date.getMonth() + 1; + const date = _date.getDate(); + return { + year: +year, + month: +month, + date: +date, + }; + } + todayTimestamp() { + const { year, month, date } = this.todayFMD(); + const timestamp = this.newDate(year, month, date).getTime(); + return timestamp; + } + toTimeStr(dateInfo = {}) { + return `${+dateInfo.year}-${+dateInfo.month}-${+dateInfo.date}`; + } + transformDateRow2Dict(dateStr) { + if (typeof dateStr === "string" && dateStr.includes("-")) { + const [year, month, date] = dateStr.split("-"); + return this.tranformStr2NumOfDate({ + year, + month, + date, + }); + } + return {}; + } + tranformStr2NumOfDate(date = {}) { + const target = { ...date }; + // 可能传入字符串 + target.year = +target.year; + target.month = +target.month; + target.date = +target.date; + return target; + } + sortDatesByTime(dates = [], sortType) { + return dates.sort((a, b) => { + const at = this.getTimeStamp(a); + const bt = this.getTimeStamp(b); + if (at < bt && sortType !== "desc") { + return -1; + } else { + return 1; + } + }); + } + getPrevMonthInfo(date = {}) { + const prevMonthInfo = + Number(date.month) > 1 + ? { + year: +date.year, + month: Number(date.month) - 1, + } + : { + year: Number(date.year) - 1, + month: 12, + }; + return prevMonthInfo; + } + getNextMonthInfo(date = {}) { + const nextMonthInfo = + Number(date.month) < 12 + ? { + year: +date.year, + month: Number(date.month) + 1, + } + : { + year: Number(date.year) + 1, + month: 1, + }; + return nextMonthInfo; + } + getPrevYearInfo(date = {}) { + return { + year: Number(date.year) - 1, + month: +date.month, + }; + } + getNextYearInfo(date = {}) { + return { + year: Number(date.year) + 1, + month: +date.month, + }; + } + findDateIndexInArray(target, dates) { + return dates.findIndex((item) => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(target)); + } + calcDates(year, month) { + const datesCount = this.getDatesCountOfMonth(year, month); + const dates = []; + const today = dateUtil.todayFMD(); + for (let i = 1; i <= datesCount; i++) { + const week = dateUtil.getDayOfWeek(+year, +month, i); + const date = { + year: +year, + id: i - 1, + month: +month, + date: i, + week, + isToday: +today.year === +year && +today.month === +month && i === +today.date, + }; + dates.push(date); + } + return dates; + } + /** + * 日期数组根据日期去重 + * @param {array} array 数组 + */ + uniqueArrayByDate(array = []) { + let uniqueObject = {}; + let uniqueArray = []; + array.forEach((item) => { + uniqueObject[dateUtil.toTimeStr(item)] = item; + }); + for (let i in uniqueObject) { + uniqueArray.push(uniqueObject[i]); + } + return uniqueArray; + } + /** + * 筛选指定年月日期 + * @param {object} target 指定年月 + * @param {array} dates 待筛选日期 + */ + filterDatesByYM(target, dates) { + if (target) { + const { year, month } = target; + const _dates = dates.filter((item) => +item.year === +year && +item.month === +month); + return _dates; + } + return dates; + } + getWeekHeader(firstDayOfWeek) { + let weeksCh = ["日", "一", "二", "三", "四", "五", "六"]; + if (firstDayOfWeek === "Mon") { + weeksCh = ["一", "二", "三", "四", "五", "六", "日"]; + } + return weeksCh; + } +} + +/** + * 获取当前页面实例 + */ +export function getCurrentPage() { + const pages = getCurrentPages() || []; + const last = pages.length - 1; + return pages[last] || {}; +} + +export function getComponentById(componentId) { + const logger = new Logger(); + let page = getCurrentPage() || {}; + if (page.selectComponent && typeof page.selectComponent === "function") { + if (componentId) { + return page.selectComponent(componentId); + } else { + logger.warn("请传入组件ID"); + } + } else { + logger.warn("该基础库暂不支持多个小程序日历组件"); + } +} + +export const logger = new Logger(); +export const calendarGesture = new Gesture(); +export const dateUtil = new DateUtil(); +export const getCalendarData = (key, component) => new WxData(component).getData(key); +export const setCalendarData = (data, component) => new WxData(component).setData(data); +export const getCalendarConfig = (component) => getCalendarData("config", component); +export const setCalendarConfig = (config, component) => + setCalendarData( + { + config, + }, + component, + ); diff --git a/src/components/calendar/utils/logger.js b/src/components/calendar/utils/logger.js new file mode 100644 index 0000000..b440ba6 --- /dev/null +++ b/src/components/calendar/utils/logger.js @@ -0,0 +1,23 @@ +export default class Logger { + info(msg) { + console.log( + '%cInfo: %c' + msg, + 'color:#FF0080;font-weight:bold', + 'color: #FF509B' + ) + } + warn(msg) { + console.log( + '%cWarn: %c' + msg, + 'color:#FF6600;font-weight:bold', + 'color: #FF9933' + ) + } + tips(msg) { + console.log( + '%cTips: %c' + msg, + 'color:#00B200;font-weight:bold', + 'color: #00CC33' + ) + } +} diff --git a/src/components/calendar/utils/wxData.js b/src/components/calendar/utils/wxData.js new file mode 100644 index 0000000..43b254d --- /dev/null +++ b/src/components/calendar/utils/wxData.js @@ -0,0 +1,30 @@ +class WxData { + constructor(component) { + this.Component = component + } + getData(key) { + const data = this.Component.data + if (!key) return data + if (key.includes('.')) { + let keys = key.split('.') + const tmp = keys.reduce((prev, next) => { + return prev[next] + }, data) + return tmp + } else { + return this.Component.data[key] + } + } + setData(data) { + return new Promise((resolve, reject) => { + if (!data) return reject('no data to set') + if (typeof data === 'object') { + this.Component.setData(data, () => { + resolve(data) + }) + } + }) + } +} + +export default WxData diff --git a/src/components/customPoster/README.md b/src/components/customPoster/README.md new file mode 100644 index 0000000..7fed6ab --- /dev/null +++ b/src/components/customPoster/README.md @@ -0,0 +1,160 @@ +# 海报插件 + +## 基于[wxml2canvas](https://github.com/wg-front/wxml2canvas)插件 + +### 插件引入 + +```json +{ + "customPoster": "/components/customPoster/index" +} +``` + +```wxml + +``` + +### 参数示例 + +```js +const data = { + params: { + info: { id: 'circle-note_mp', title: '动态页', desc: '指定动态的页面,mp' }, + body: { + bgImg: + 'https://picsissiok-10049618.cos.ap-shanghai.myqcloud.com/a74018e725861534f1644cff04780f4e_16273677601587.png', + width: '750', + height: '1254', + }, + elements: [ + { + id: 'circle-name', + desc: '圈名称', + type: 1, + text: '治疗讨论', + font: '宋体', + 'font-size': '42', + color: '#FFFFFF', + 'single-line': true, + halign: 'center', + top: '106', + }, + { + id: 'master-name', + desc: '专家名称', + type: 1, + text: '健康小贴士', + font: '宋体', + 'font-size': '38', + color: '#FFFFFF', + 'single-line': true, + halign: 'center', + top: '237', + }, + { + id: 'master-avatar', + desc: '专家头像', + type: 0, + picType: 'avatar', + src: 'https://picsissiok-10049618.cos.ap-shanghai.myqcloud.com/ceb31ac6137e873225b8cc826389a267_16655329078962.jpg', + width: '120', + height: '120', + halign: 'center', + shape: 'circle', + top: '328', + }, + { + id: 'note-content', + desc: '动态内容', + type: 1, + text: '11月5日上海组织进口博览会CIIE大会,邀请大家来我们的展馆现场交流。', + font: '宋体', + 'font-size': '45', + color: '#18191A', + width: '630', + height: '348', + left: '60', + top: '495', + }, + { + id: 'note-title', + desc: '长文标题', + type: 1, + text: '', + font: '宋体', + 'font-size': '42', + color: '#18191A', + width: '659', + height: '116', + left: '46', + top: '495', + 'font-weight': 'bold', + }, + { + id: 'note-summary', + desc: '长文摘要 ', + type: 1, + text: '', + font: '宋体', + 'font-size': '42', + color: '#18191A', + width: '672', + height: '232', + left: '39', + top: '646', + }, + { + id: 'note-more', + desc: '还有', + type: 1, + text: '还有3条精彩附件>', + font: '宋体', + 'font-size': '31', + color: '#666666', + 'single-line': true, + width: '292', + height: '46', + left: '60', + top: '1024', + }, + { + id: 'scanText', + desc: '扫描二维码查看详情', + type: 1, + text: '扫描二维码查看详情', + font: '宋体', + 'font-size': '31', + color: '#666666', + 'single-line': true, + width: '279', + height: '43', + left: '60', + top: '1087', + }, + { + id: 'note-qrcode', + desc: '专家列表的二维码', + type: 0, + picType: 'qrcode', + src: 'https://family.devred.hbraas.com/proxy/mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHJ8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyUWhDdGhTWVNlTjMxMDAwMDAwN3gAAgSonPxjAwQAAAAA', + width: '130', + height: '130', + left: '554', + top: '1012', + }, + { + id: 'brand', + desc: 'brand×华秉科技', + type: 1, + text: '做企业数字化转型的亲密伙伴×华秉科技', + font: '宋体', + 'font-size': '24', + color: '#B2B3B4', + 'single-line': true, + halign: 'center', + top: '1192', + }, + ], + }, +} +``` diff --git a/src/components/customPoster/index.js b/src/components/customPoster/index.js new file mode 100644 index 0000000..7344bf8 --- /dev/null +++ b/src/components/customPoster/index.js @@ -0,0 +1,101 @@ +import Wxml2Canvas from "./wxml2canvas/index.js"; // 根据具体路径修改,node_modules会被忽略 + +Component({ + properties: { + params: { + type: Object, + observer(newVal, _olVal) { + if (Object.keys(newVal).length > 0) { + this.paramsFormat(newVal); + this.setData({ + width: newVal.body.width, + height: newVal.body.height, + bgImg: newVal.body.bgImg, + elementsMp: newVal.elements, + }); + this.drawImage1(); + } + }, + }, + }, + data: { + imgUrl: "", + width: "", + height: "", + imgheight: "", + bgImg: "", + elementsMp: [], + }, + lifetimes: { + attached() {}, + }, + methods: { + paramsFormat(params) { + params.elements.forEach((item) => { + if (item.type === 0) { + // 图片居中 + if (item.halign === "center") { + item.left = (params.body.width - item.width) / 2; + } + } else { + item.text = item.text.replace(/[\r\n]/g, ""); + // 文字居中(使文字标签宽度等于画布宽度,文字加上居中的className) + if (item.halign === "center") { + item.width = item.width || params.body.width; + item.left = (params.body.width - item.width) / 2; + } + if (item.halign === "right") { + item.width = params.body.width; + } + if (item.id === "shareText" && item.text.length > 30) { + item.text = item.text.slice(0, 30) + "..."; + } + if (item.id === "note-title" && item.text.length > 28) { + item.text = item.text.slice(0, 28) + "..."; + } + if (item.id === "note-content" && item.text.length > 90) { + item.text = item.text.slice(0, 90) + "..."; + } + let len = params.elements.some((x) => x.id === "note-title" && x.text.length); + if (len && item.id === "note-summary" && item.text.length > 62) { + item.text = item.text.slice(0, 62) + "..."; + } else if (item.id === "note-summary" && item.text.length > 76) { + item.text = item.text.slice(0, 76) + "..."; + } + } + }); + }, + drawImage1() { + let self = this; + this.drawImage1 = new Wxml2Canvas({ + obj: self, + width: this.data.width, // 宽, 以iphone6为基准,传具体数值,其它机型自动适配 + height: this.data.height, // 高 + element: "canvas1", + background: "transparent", + progress(percent) {}, + finish(url) { + self.setData({ + imgUrl: url, + }); + self.triggerEvent("finish", url); + }, + error(res) {}, + }); + + let data = { + list: [ + { + type: "wxml", + class: "#canvas-bill-body-mp .draw_canvas", + limit: "#canvas-bill-body-mp", + x: 0, + y: 0, + }, + ], + }; + + this.drawImage1.draw(data); + }, + }, +}); diff --git a/src/components/customPoster/index.json b/src/components/customPoster/index.json new file mode 100644 index 0000000..a97367d --- /dev/null +++ b/src/components/customPoster/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} diff --git a/src/components/customPoster/index.scss b/src/components/customPoster/index.scss new file mode 100644 index 0000000..5dce05f --- /dev/null +++ b/src/components/customPoster/index.scss @@ -0,0 +1,53 @@ +.canvas-box { + position: fixed; + left: 1000000rpx; + top: -1000000rpx; +} +.canvas-body { + background-position: center; + background-repeat: no-repeat; + background-size: cover; + background-color: #fff; +} +.draw_canvas { + position: absolute; +} +.canvas-bill { + position: fixed; + width: 750rpx; + left: 1000000rpx; + top: -1000000rpx; + visibility: hidden; +} +.lineOne { + // overflow: hidden; + // text-overflow: ellipsis; + // white-space: nowrap; +} +.textCenter { + text-align: center; +} +.textRight { + text-align: right; +} +.billImg-box { + position: fixed; + left: 0; + top: 0; + z-index: 10; + width: 750rpx; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(0, 0, 0, 0.75); +} +.image-load-text { + width: 750rpx; + text-align: center; + color: #fff; + line-height: 50rpx; + margin-top: 20rpx; + font-size: 28rpx; + letter-spacing: 2rpx; +} diff --git a/src/components/customPoster/index.wxml b/src/components/customPoster/index.wxml new file mode 100644 index 0000000..511c91a --- /dev/null +++ b/src/components/customPoster/index.wxml @@ -0,0 +1,43 @@ + + + + + + {{item.text}} + + + + + + + + + + + + + + diff --git a/src/components/customPoster/wxml2canvas/README.md b/src/components/customPoster/wxml2canvas/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/components/customPoster/wxml2canvas/index.js b/src/components/customPoster/wxml2canvas/index.js new file mode 100644 index 0000000..97b0ab6 --- /dev/null +++ b/src/components/customPoster/wxml2canvas/index.js @@ -0,0 +1,1692 @@ +module.exports = (function () { + var __MODS__ = {}; + var __DEFINE__ = function (modId, func, req) { + var m = { exports: {}, _tempexports: {} }; + __MODS__[modId] = { status: 0, func: func, req: req, m: m }; + }; + var __REQUIRE__ = function (modId, source) { + if (!__MODS__[modId]) return require(source); + if (!__MODS__[modId].status) { + var m = __MODS__[modId].m; + m._exports = m._tempexports; + var desp = Object.getOwnPropertyDescriptor(m, "exports"); + if (desp && desp.configurable) + Object.defineProperty(m, "exports", { + set: function (val) { + if (typeof val === "object" && val !== m._exports) { + m._exports.__proto__ = val.__proto__; + Object.keys(val).forEach(function (k) { + m._exports[k] = val[k]; + }); + } + m._tempexports = val; + }, + get: function () { + return m._tempexports; + }, + }); + __MODS__[modId].status = 1; + __MODS__[modId].func(__MODS__[modId].req, m, m.exports); + } + return __MODS__[modId].m.exports; + }; + var __REQUIRE_WILDCARD__ = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var k in obj) { + if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; + } + } + newObj.default = obj; + return newObj; + } + }; + var __REQUIRE_DEFAULT__ = function (obj) { + return obj && obj.__esModule ? obj.default : obj; + }; + __DEFINE__( + 1685064731946, + function (require, module, exports) { + var __TEMP__ = require("./src/index"); + var Wxml2Canvas = __REQUIRE_DEFAULT__(__TEMP__); + + if (!exports.__esModule) Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Wxml2Canvas; + }, + function (modId) { + var map = { "./src/index": 1685064731947 }; + return __REQUIRE__(map[modId], modId); + }, + ); + __DEFINE__( + 1685064731947, + function (require, module, exports) { + var __TEMP__ = require("./util"); + var Util = __REQUIRE_DEFAULT__(__TEMP__); + + const imageMode = [ + "scaleToFill", + "aspectFit", + "aspectFill", + "widthFix", + "top", + "bottom", + "center", + "left", + "right", + "top left", + "top right", + "bottom left", + "bottom right", + ]; + + class Wxml2Canvas { + constructor(options = {}) { + this.device = (wx.getSystemInfoSync && wx.getSystemInfoSync()) || {}; + + if (!options.zoom) { + this.zoom = this.device.windowWidth / 375; + } else { + this.zoom = options.zoom || 1; + } + + this.element = options.element; + this.object = options.obj; + this.width = options.width * this.zoom || 0; + this.height = options.height * this.zoom || 0; + this.destZoom = options.destZoom || 3; + this.destWidth = this.width * this.destZoom; + this.destHeight = this.height * this.destZoom; + this.translateX = options.translateX * this.zoom || 0; + this.translateY = options.translateY * this.zoom || 0; + this.gradientBackground = options.gradientBackground || null; + this.background = options.background || "#ffffff"; + this.finishDraw = options.finish || function finish(params) {}; + this.errorHandler = options.error || function error(params) {}; + this.progress = options.progress || function progress(params) {}; + this.textAlign = options.textAlign || "left"; + this.fullText = options.fullText || false; + this.font = options.font || "14px PingFang SC"; + + this._init(); + } + + draw(data = {}, that) { + let self = this; + this.data = data; + this.fef = that; + + this.progress(10); + this._preloadImage(data.list) + .then((result) => { + this.progress(30); + self._draw(); + }) + .catch((res) => { + self.errorHandler(res); + }); + } + + measureWidth(text, font) { + if (font) { + this.ctx.font = font; + } + let res = this.ctx.measureText(text) || {}; + return res.width || 0; + } + + _init() { + this.progressPercent = 0; // 绘制进度百分比 + this.data = null; + this.ref = null; + this.allPic = []; + this.screenList = []; + this.asyncList = []; + this.imgUrl = ""; + this.progressPercent = 0; + this.distance = 0; + this.progress(0); + + this.ctx = wx.createCanvasContext(this.element, this.object); + this.ctx.font = this.font; + this.ctx.setTextBaseline("top"); + this.ctx.setStrokeStyle("white"); + + this.debug = this.device.platform === "devtools" ? true : false; + + this._drawBakcground(); + } + + _drawBakcground() { + if (this.gradientBackground) { + let line = this.gradientBackground.line || [0, 0, 0, this.height]; + let color = this.gradientBackground.color || ["#fff", "#fff"]; + let style = { fill: { line, color } }; + this._drawRectToCanvas(0, 0, this.width, this.height, style); + } else { + let style = { fill: this.background }; + this._drawRectToCanvas(0, 0, this.width, this.height, style); + } + } + + _draw() { + let self = this; + let list = this.data.list || []; + let index = 0; + let all = []; + let count = 0; + + list.forEach((item) => { + if (item.type === "wxml") { + count += 3; + } else { + count += 1; + } + }); + + this.distance = 60 / (count || 1); // 进度条的间距 + this.progressPercent = 30; + this.asyncList = list.filter((item) => item.delay == true); + list = list.filter((item) => item.delay != true); + drawList(list); + + Promise.all(all) + .then((results) => { + index = 0; + drawList(self.asyncList, true); + + Promise.all(all).then((results) => { + self.progress(90); + self._saveCanvasToImage(); + }); + }) + .catch((e) => { + console.log(e); + self.errorHandler(e); + }); + + function drawList(list = [], noDelay) { + list.forEach((item, i) => { + all[index++] = new Promise((resolve, reject) => { + let attr = item.style; + item.progress = self.distance; + if (noDelay) { + item.delay = 0; + } + if (item.type === "radius-image") { + self._drawCircle(item, attr, resolve, reject, "image"); + } else if (item.type === "text") { + self._drawText(item, attr, resolve, reject); + } else if (item.type === "line") { + self._drawLine(item, attr, resolve, reject); + } else if (item.type === "circle") { + self._drawCircle(item, attr, resolve, reject); + } else if (item.type === "rect") { + self._drawRect(item, attr, resolve, reject); + } else if (item.type === "image") { + self._drawRect(item, attr, resolve, reject, "image"); + } else if (item.type === "wxml") { + self._drawWxml(item, attr, resolve, reject); + } else { + resolve(); + } + }); + }); + } + } + + _saveCanvasToImage() { + let self = this; + + // 延时保存有两个原因,一个是等待绘制delay的元素,另一个是安卓上样式会错乱 + setTimeout( + () => { + self.progress(95); + + let obj = { + x: 0, + y: 0, + width: self.width, + height: self.height, + canvasId: self.element, + success: function (res) { + self.progress(100); + self.imgUrl = res.tempFilePath; + self.finishDraw(self.imgUrl); + }, + fail: function (res) { + self.errorHandler({ errcode: 1000, errmsg: "save canvas error", e: res }); + }, + }; + + if (self.destZoom !== 3) { + obj.destWidth = self.destWidth; + obj.destHeight = self.destHeight; + } + + wx.canvasToTempFilePath(obj, self.object); + }, + self.device.system.indexOf("iOS") === -1 ? 300 : 100, + ); + } + + _preloadImage(list = []) { + let self = this; + let all = []; + let count = 0; + + list.forEach((item, i) => { + if (item.url && self._findPicIndex(item.url) === -1) { + // 避免重复下载同一图片 + self.allPic.push({ + url: item.url, + local: "", + }); + all[count++] = new Promise((resolve, reject) => { + // 非http(s)域名的就不下载了 + if ( + !/^http/.test(item.url) || + /^http:\/\/(tmp)|(usr)\//.test(item.url) || + /^http:\/\/127\.0\.0\.1/.test(item.url) + ) { + if (item.isBase64) { + let fileManager = wx.getFileSystemManager(); + + fileManager.writeFile({ + filePath: item.url, + data: item.isBase64.replace(/data:image\/(.*);base64,/, ""), + encoding: "base64", + success(res) { + imageInfo(item.url); + }, + fail(res) { + reject(res); + }, + }); + } else { + imageInfo(item.url); + } + + function imageInfo(url) { + wx.getImageInfo({ + src: url, + success(res) { + let index = self._findPicIndex(url); + if (index > -1) { + self.allPic[index].local = url; + self.allPic[index].width = res.width; + self.allPic[index].height = res.height; + } + resolve({ tempFilePath: url }); + }, + fail(res) { + reject(res); + }, + }); + } + } else { + wx.downloadFile({ + url: item.url.replace(/^https?/, "https"), + success: function (res) { + wx.getImageInfo({ + src: res.tempFilePath, + success(img) { + let index = self._findPicIndex(item.url); + if (index > -1) { + self.allPic[index].local = res.tempFilePath; + self.allPic[index].width = img.width; + self.allPic[index].height = img.height; + } + resolve(res); + }, + fail(res) { + reject(res); + }, + }); + }, + fail: (res) => { + reject({ errcode: 1001, errmsg: "download pic error" }); + }, + }); + } + }); + } + }); + + return Promise.all(all) + .then((results) => { + return new Promise((resolve) => { + resolve(); + }); + }) + .catch((results) => { + return new Promise((resolve, reject) => { + reject(results); + }); + }); + } + + _findPicIndex(url) { + let index = this.allPic.findIndex((pic) => pic.url === url); + return index; + } + + _drawRect(item, style, resolve, reject, isImage, isWxml) { + let zoom = this.zoom; + let leftOffset = 0; + let topOffset = 0; + let width = style.width; + let height = style.height; + let imgWidth = style.width; + let imgHeight = style.height; + let mode = null; + + try { + item.x = this._resetPositionX(item, style); + item.y = this._resetPositionY(item, style); + + let url; + if (isImage) { + let index = this._findPicIndex(item.url); + if (index > -1) { + url = this.allPic[index].local; + imgWidth = this.allPic[index].width; + imgHeight = this.allPic[index].height; + } else { + url = item.url; + } + } + + style.padding = style.padding || []; + if (isWxml === "inline-wxml") { + item.x = item.x + ((style.padding[3] && style.padding[3]) || 0); + item.y = item.y + ((style.padding[0] && style.padding[0]) || 0); + } + + leftOffset = item.x + style.width + ((style.padding[1] && style.padding[1]) || 0); + + if (!isWxml) { + width = width * zoom; + height = height * zoom; + } + + if (style.dataset && style.dataset.mode && imageMode.indexOf(style.dataset.mode) > -1) { + mode = { + type: style.dataset.mode, + width: imgWidth, + height: imgHeight, + }; + } + + this._drawRectToCanvas(item.x, item.y, width, height, style, url, mode); + this._updateProgress(item.progress); + + if (resolve) { + resolve(); + } else { + return { + leftOffset, + topOffset, + }; + } + } catch (e) { + reject && + reject({ errcode: isImage ? 1003 : 1002, errmsg: isImage ? "drawImage error" : "drawRect error", e }); + } + } + + _drawRectToCanvas(x, y, width, height, style, url, mode) { + let { fill, border, boxShadow } = style; + this.ctx.save(); + this._drawBoxShadow(boxShadow, (res) => { + // 真机上填充渐变色时,没有阴影,先画个相等大小的纯色矩形来实现阴影 + if (fill && typeof fill !== "string" && !this.debug) { + this.ctx.setFillStyle(res.color || "#ffffff"); + this.ctx.fillRect(x, y, width, height); + } + }); + + if (url) { + // 开发者工具有bug,先不裁剪 + if (mode) { + this._resetImageByMode(url, x, y, width, height, mode); + } else { + this.ctx.drawImage(url, x, y, width, height); + } + } else { + this._setFill(fill, () => { + this.ctx.fillRect(x, y, width, height); + }); + } + + this._drawBorder(border, style, (border) => { + let fixBorder = border.width; + this.ctx.strokeRect(x - fixBorder / 2, y - fixBorder / 2, width + fixBorder, height + fixBorder); + }); + + this.ctx.draw(true); + this.ctx.restore(); + this.ctx.strokeStyle = "#fff"; + } + + _resetImageByMode(url, x, y, width, height, mode) { + let self = this; + let offsetX = 0; + let offsetY = 0; + let imgWidth = mode.width; + let imgHeight = mode.height; + + switch (mode.type) { + case "scaleToFill": + imgWidth = width; + imgHeight = height; + self.ctx.drawImage(url, x, y, width, height); + break; + case "widthFix": + height = width / ((imgWidth || 1) / (imgHeight || 1)); + self.ctx.drawImage(url, x, y, width, height); + break; + case "aspectFit": + if (imgWidth > imgHeight) { + let realHeight = width / ((imgWidth || 1) / (imgHeight || 1)); + offsetY = -(height - realHeight) / 2; + imgWidth = width; + imgHeight = realHeight; + } else { + let realWidth = height / ((imgHeight || 1) / (imgWidth || 1)); + offsetX = -(width - realWidth) / 2; + imgWidth = realWidth; + imgHeight = height; + } + + _clip(); + break; + case "aspectFill": + if (imgWidth > imgHeight) { + let realWidth = imgWidth / ((imgHeight || 1) / (height || 1)); + offsetX = (realWidth - width) / 2; + imgWidth = realWidth; + imgHeight = height; + } else { + let realHeight = imgHeight / ((imgWidth || 1) / (width || 1)); + offsetY = (realHeight - height) / 2; + imgWidth = width; + imgHeight = realHeight; + } + + _clip(); + break; + case "top left": + _clip(); + break; + case "top": + offsetX = (mode.width - width) / 2; + _clip(); + break; + case "top right": + offsetX = mode.width - width; + _clip(); + break; + case "left": + offsetY = (mode.height - height) / 2; + _clip(); + break; + case "center": + offsetX = (mode.width - width) / 2; + offsetY = (mode.height - height) / 2; + _clip(); + break; + case "right": + offsetX = mode.width - width; + offsetY = (mode.height - height) / 2; + _clip(); + break; + case "bottom left": + offsetY = mode.height - height; + _clip(); + break; + case "bottom": + offsetX = (mode.width - width) / 2; + offsetY = mode.height - height; + _clip(); + break; + case "bottom right": + offsetX = mode.width - width; + offsetY = mode.height - height; + _clip(); + break; + default: + imgWidth = width; + imgHeight = height; + break; + } + + function _clip() { + self.ctx.save(); + self.ctx.beginPath(); + self.ctx.rect(x, y, width, height); + self.ctx.clip(); + self.ctx.drawImage(url, x - offsetX, y - offsetY, imgWidth, imgHeight); + self.ctx.closePath(); + self.ctx.restore(); + } + } + + _drawText(item, style, resolve, reject, type, isWxml) { + let zoom = this.zoom; + let leftOffset = 0; + let topOffset = 0; + + try { + style.fontSize = this._parseNumber(style.fontSize); + let fontSize = Math.ceil((style.fontSize || 14) * zoom); + this.ctx.setTextBaseline("top"); + this.ctx.font = `${style.fontWeight ? style.fontWeight : "normal"} ${fontSize}px ${ + style.fontFamily || "PingFang SC" + }`; + this.ctx.setFillStyle(style.color || "#454545"); + + let text = item.text || ""; + let textWidth = Math.floor(this.measureWidth(text, style.font || this.ctx.font)); + let lineHeight = this._getLineHeight(style); + let textHeight = Math.ceil(textWidth / (style.width || textWidth)) * lineHeight; + let width = Math.ceil((style.width || textWidth) * (!isWxml ? zoom : 1)); + let whiteSpace = style.whiteSpace || "wrap"; + let x = 0; + let y = 0; + + if (typeof style.padding === "string") { + style.padding = Util.transferPadding(style.padding); + } + item.x = this._resetPositionX(item, style); + item.y = this._resetPositionY(item, style, textHeight); + this._drawBoxShadow(style.boxShadow); + + if (style.background || style.border) { + this._drawTextBackgroud(item, style, textWidth, textHeight, isWxml); + } + + // 行内文本 + if (type === "inline-text") { + width = item.maxWidth; + if (item.leftOffset + textWidth > width) { + // 如果上一个行内元素换行了,这个元素要继续在后面补足一行 + let lineNum = Math.max(Math.floor(textWidth / width), 1); + let length = text.length; + let singleLength = Math.floor(length / lineNum); + let widthOffset = item.leftOffset ? item.leftOffset - item.originX : 0; + let { + endIndex: currentIndex, + single, + singleWidth, + } = this._getTextSingleLine(text, width, singleLength, 0, widthOffset); + x = this._resetTextPositionX(item, style, singleWidth); + y = this._resetTextPositionY(item, style); + this.ctx.fillText(single, x, y); + leftOffset = x + singleWidth; + topOffset = y; + + // 去除第一行补的内容,然后重置 + text = text.substring(currentIndex, text.length); + currentIndex = 0; + lineNum = Math.max(Math.floor(textWidth / width), 1); + textWidth = Math.floor(this.measureWidth(text, style.font || this.ctx.font)); + item.x = item.originX; // 还原换行后的x + for (let i = 0; i < lineNum; i++) { + let { endIndex, single, singleWidth } = this._getTextSingleLine( + text, + width, + singleLength, + currentIndex, + ); + currentIndex = endIndex; + if (single) { + x = this._resetTextPositionX(item, style, singleWidth, width); + y = this._resetTextPositionY(item, style, i + 1); + this.ctx.fillText(single, x, y); + if (i === lineNum - 1) { + leftOffset = x + singleWidth; + topOffset = lineHeight * lineNum; + } + } + } + + let last = text.substring(currentIndex, length); + let lastWidth = this.measureWidth(last); + + if (last) { + x = this._resetTextPositionX(item, style, lastWidth, width); + y = this._resetTextPositionY(item, style, lineNum + 1); + this.ctx.fillText(last, x, y); + leftOffset = x + lastWidth; + topOffset = lineHeight * (lineNum + 1); + } + } else { + x = this._resetTextPositionX(item, style, textWidth, width); + y = this._resetTextPositionY(item, style); + this.ctx.fillText(item.text, x, y); + leftOffset = x + textWidth; + topOffset = lineHeight; + } + } else { + // block文本,如果文本长度超过宽度换行 + if (width && textWidth > width && whiteSpace !== "nowrap") { + let lineNum = Math.max(Math.floor(textWidth / width), 1); + let length = text.length; + let singleLength = Math.floor(length / lineNum); + let currentIndex = 0; + + // lineClamp参数限制最多行数 + if (style.lineClamp && lineNum + 1 > style.lineClamp) { + lineNum = style.lineClamp - 1; + } + + for (let i = 0; i < lineNum; i++) { + let { endIndex, single, singleWidth } = this._getTextSingleLine( + text, + width, + singleLength, + currentIndex, + ); + currentIndex = endIndex; + x = this._resetTextPositionX(item, style, singleWidth, width); + y = this._resetTextPositionY(item, style, i); + this.ctx.fillText(single, x, y); + } + + // 换行后剩余的文字,超过一行则截断增加省略号 + let last = text.substring(currentIndex, length); + let lastWidth = this.measureWidth(last); + if (lastWidth > width) { + let { single, singleWidth } = this._getTextSingleLine(last, width, singleLength); + lastWidth = singleWidth; + last = single.substring(0, single.length - 1) + "..."; + } + + x = this._resetTextPositionX(item, style, lastWidth, width); + y = this._resetTextPositionY(item, style, lineNum); + this.ctx.fillText(last, x, y); + } else { + x = this._resetTextPositionX(item, style, textWidth, width); + y = this._resetTextPositionY(item, style); + this.ctx.fillText(item.text, x, y); + } + } + + this.ctx.draw(true); + + this._updateProgress(item.progress); + + if (resolve) { + resolve(); + } else { + return { + leftOffset, + topOffset, + }; + } + } catch (e) { + reject && reject({ errcode: 1004, errmsg: "drawText error", e: e }); + } + } + + _drawTextBackgroud(item, style, textWidth, textHeight, isWxml) { + if (!style.width) return; + let zoom = isWxml ? 1 : this.zoom; + let width = style.width || textWidth; + let height = style.height || textHeight; + let rectStyle = { + fill: style.background, + border: style.border, + }; + style.padding = style.padding || [0, 0, 0, 0]; + width += (style.padding[1] || 0) + (style.padding[3] || 0); + height += (style.padding[0] || 0) + (style.padding[2] || 0); + width = width * zoom; + height = height * zoom; + this._drawRectToCanvas(item.x, item.y, width, height, rectStyle); + } + + _drawCircle(item, style, resolve, reject, isImage, isWxml) { + let zoom = this.zoom; + let r = style.r; + try { + item.x = this._resetPositionX(item, style); + item.y = this._resetPositionY(item, style); + + let url; + if (isImage) { + let index = this._findPicIndex(item.url); + if (index > -1) { + url = this.allPic[index].local; + } else { + url = item.url; + } + } + + if (!isWxml) { + r = r * zoom; + } + + this._drawCircleToCanvas(item.x, item.y, r, style, url); + + this._updateProgress(item.progress); + resolve && resolve(); + } catch (e) { + reject && + reject({ + errcode: isImage ? 1006 : 1005, + errmsg: isImage ? "drawCircleImage error" : "drawCircle error", + e, + }); + } + } + + _drawCircleToCanvas(x, y, r, style, url) { + let { fill, border, boxShadow } = style; + + this.ctx.save(); + + this._drawBoxShadow(boxShadow, (res) => { + // 真机上填充渐变色时,没有阴影,先画个相等大小的纯色矩形来实现阴影 + if ((fill && typeof fill !== "string") || (url && res.color)) { + this.ctx.setFillStyle(res.color || "#ffffff"); + this.ctx.beginPath(); + this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI); + this.ctx.closePath(); + this.ctx.fill(); + } + }); + + if (url) { + this.ctx.save(); + this.ctx.beginPath(); + this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI); + this.ctx.clip(); + this.ctx.drawImage(url, x, y, r * 2, r * 2); + this.ctx.closePath(); + this.ctx.restore(); + } else { + this._setFill(fill, () => { + this.ctx.beginPath(); + this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI); + this.ctx.closePath(); + this.ctx.fill(); + }); + } + + this._drawBorder(border, style, (border) => { + this.ctx.beginPath(); + this.ctx.arc(x + r, y + r, r + border.width / 2, 0, 2 * Math.PI); + this.ctx.stroke(); + this.ctx.closePath(); + }); + + this.ctx.draw(true); + this.ctx.restore(); + } + + _drawLine(item, style, resolve, reject, isWxml) { + let zoom = this.zoom; + try { + let x1 = item.x * zoom + this.translateX; + let y1 = item.y * zoom + this.translateY; + let x2 = item.x2 * zoom + this.translateX; + let y2 = item.y2 * zoom + this.translateY; + this._drawLineToCanvas(x1, y1, x2, y2, style); + + this._updateProgress(item.progress); + resolve && resolve(); + } catch (e) { + reject && reject({ errcode: 1007, errmsg: "drawLine error", e }); + } + } + + _drawLineToCanvas(x1, y1, x2, y2, style) { + let { stroke, dash, boxShadow } = style; + + this.ctx.save(); + if (stroke) { + this._setStroke(stroke); + } + + this._drawBoxShadow(boxShadow); + + if (dash) { + let dash = [style.dash[0] || 5, style.dash[1] || 5]; + let offset = style.dash[2] || 0; + this.ctx.setLineDash(dash, offset || 0); + } + + this.ctx.moveTo(x1, y1); + this.ctx.setLineWidth((style.width || 1) * this.zoom); + this.ctx.lineTo(x2, y2); + this.ctx.stroke(); + this.ctx.draw(true); + this.ctx.restore(); + } + + // 废弃,合并到_drawRect + _drawImage(item, style, resolve, reject, isWxml) { + let zoom = this.zoom; + try { + item.x = this._resetPositionX(item, style); + item.y = this._resetPositionY(item, style); + item.x = item.x + (style.padding[3] || 0); + item.y = item.y + (style.padding[0] || 0); + + let index = this._findPicIndex(item.url); + let url = index > -1 ? this.allPic[index].local : item.url; + this._drawImageToCanvas(url, item.x, item.y, style.width * zoom, style.height * zoom, style); + + this._updateProgress(item.progress); + resolve && resolve(); + } catch (e) { + reject && reject({ errcode: 1012, errmsg: "drawRect error", e }); + } + } + + // 废弃,合并到_drawRect + _drawImageToCanvas(url, x, y, width, height, style) { + let { fill, border, boxShadow } = style; + this.ctx.save(); + + this._drawBoxShadow(boxShadow); + this.ctx.drawImage(url, x, y, width, height); + + this._drawBorder(border, style, (border) => { + let fixBorder = border.width; + this.ctx.strokeRect(x - fixBorder / 2, y - fixBorder / 2, width + fixBorder, height + fixBorder); + }); + this.ctx.draw(true); + this.ctx.restore(); + } + + _drawWxml(item, style, resolve, reject) { + let self = this; + let all = []; + try { + this._getWxml(item, style).then((results) => { + // 上 -> 下 + let sorted = self._sortListByTop(results[0]); + let count = 0; + let progress = 0; + Object.keys(sorted).forEach((item) => { + count += sorted[item].length; + }); + progress = (this.distance * 3) / (count || 1); + + all = this._drawWxmlBlock(item, sorted, all, progress, results[1]); + all = this._drawWxmlInline(item, sorted, all, progress, results[1]); + + Promise.all(all) + .then((results) => { + resolve && resolve(); + }) + .catch((e) => { + reject && reject(e); + }); + }); + } catch (e) { + reject && reject({ errcode: 1008, errmsg: "drawWxml error" }); + } + } + + _drawWxmlBlock(item, sorted, all, progress, results) { + let self = this; + // 用来限定位置范围,取相对位置 + let limitLeft = results ? results.left : 0; + let limitTop = results ? results.top : 0; + Object.keys(sorted).forEach((top, topIndex) => { + // 左 -> 右 + let list = sorted[top].sort((a, b) => { + return a.left - b.left; + }); + + list = list.filter((sub) => sub.dataset.type && sub.dataset.type.indexOf("inline") === -1); + + list.forEach((sub, index) => { + all[index] = new Promise((resolve2, reject2) => { + sub = self._transferWxmlStyle(sub, item, limitLeft, limitTop); + sub.progress = progress; + let type = sub.dataset.type; + if (sub.dataset.delay) { + setTimeout(() => { + drawWxmlItem(); + }, sub.dataset.delay); + } else { + drawWxmlItem(); + } + function drawWxmlItem() { + if (type === "text") { + self._drawWxmlText(sub, resolve2, reject2); + } else if (type === "image") { + self._drawWxmlImage(sub, resolve2, reject2); + } else if (type === "radius-image") { + self._drawWxmlCircleImage(sub, resolve2, reject2); + } else if (type === "background-image") { + self._drawWxmlBackgroundImage(sub, resolve2, reject2); + } + } + }); + }); + }); + + return all; + } + + _drawWxmlInline(item, sorted, all, progress, results) { + let self = this; + let topOffset = 0; + let leftOffset = 0; + let lastTop = 0; + let limitLeft = results ? results.left : 0; + let limitTop = results ? results.top : 0; + let p = new Promise((resolve2, reject2) => { + let maxWidth = 0; + let minLeft = Infinity; + let maxRight = 0; + + // 找出同一top下的最小left和最大right,得到最大的宽度,用于换行 + Object.keys(sorted).forEach((top) => { + let inlineList = sorted[top].filter((sub) => sub.dataset.type && sub.dataset.type.indexOf("inline") > -1); + inlineList.forEach((sub) => { + if (sub.left < minLeft) { + minLeft = sub.left; + } + if (sub.right > maxRight) { + maxRight = sub.right; + } + }); + }); + maxWidth = Math.ceil(maxRight - minLeft || self.width); + + Object.keys(sorted).forEach((top, topIndex) => { + // 左 -> 右 + let list = sorted[top].sort((a, b) => { + return a.left - b.left; + }); + + // 换行的行内元素left放到后面,version2.0.6后无法获取高度,改用bottom值来判断是否换行了 + let position = -1; + for (let i = 0, len = list.length; i < len; i++) { + if (list[i] && list[i + 1]) { + if (list[i].bottom > list[i + 1].bottom) { + position = i; + break; + } + } + } + + if (position > -1) { + list.push(list.splice(position, 1)[0]); + } + + let inlineList = list.filter((sub) => sub.dataset.type && sub.dataset.type.indexOf("inline") > -1); + let originLeft = inlineList[0] ? inlineList[0].left : 0; + // 换行后和top不相等时,认为是换行了,要清除左边距;当左偏移量大于最大宽度时,也要清除左边距; 当左偏移小于左边距时,也要清除 + if ( + Math.abs(topOffset + lastTop - top) > 2 || + leftOffset - originLeft - limitLeft >= maxWidth || + leftOffset <= originLeft - limitLeft - 2 + ) { + leftOffset = 0; + } + + lastTop = +top; + topOffset = 0; + + inlineList.forEach((sub, index) => { + sub = self._transferWxmlStyle(sub, item, limitLeft, limitTop); + sub.progress = progress; + let type = sub.dataset.type; + if (type === "inline-text") { + let drawRes = self._drawWxmlInlineText(sub, leftOffset, maxWidth); + leftOffset = drawRes.leftOffset; + topOffset = drawRes.topOffset; + } else if (type === "inline-image") { + let drawRes = self._drawWxmlImage(sub) || {}; + leftOffset = drawRes.leftOffset || 0; + topOffset = drawRes.topOffset || 0; + } + }); + }); + resolve2(); + }); + + all.push(p); + return all; + } + + _drawWxmlInlineText(sub, leftOffset = 0, maxWidth) { + let text = sub.dataset.text || ""; + if (sub.dataset.maxlength && text.length > sub.dataset.maxlength) { + text = text.substring(0, sub.dataset.maxlength) + "..."; + } + + let textData = { + text, + originX: sub.left, + x: leftOffset ? leftOffset : sub.left, + y: sub.top, + progress: sub.progress, + leftOffset: leftOffset, + maxWidth: maxWidth, // 行内元素的最大宽度,取决于limit的宽度 + }; + + if (sub.backgroundColor !== "rgba(0, 0, 0, 0)") { + sub.background = sub.backgroundColor; + } else { + sub.background = "rgba(0, 0, 0, 0)"; + } + + if (sub.dataset.background) { + sub.background = sub.dataset.background; + } + + let res = this._drawText(textData, sub, null, null, "inline-text", "wxml"); + + return res; + } + + _drawWxmlText(sub, resolve, reject) { + let text = sub.dataset.text || ""; + if (sub.dataset.maxlength && text.length > sub.dataset.maxlength) { + text = text.substring(0, sub.dataset.maxlength) + "..."; + } + + let textData = { + text, + x: sub.left, + y: sub.top, + progress: sub.progress, + }; + if (sub.backgroundColor !== "rgba(0, 0, 0, 0)") { + sub.background = sub.backgroundColor; + } else { + sub.background = "rgba(0, 0, 0, 0)"; + } + + if (sub.dataset.background) { + sub.background = sub.dataset.background; + } + + this._drawText(textData, sub, resolve, reject, "text", "wxml"); + } + + _drawWxmlImage(sub, resolve, reject) { + let imageData = { + url: sub.dataset.url, + x: sub.left, + y: sub.top, + progress: sub.progress, + }; + + let res = this._drawRect(imageData, sub, resolve, reject, "image", "inline-wxml"); + + return res; + } + + _drawWxmlCircleImage(sub, resolve, reject) { + let imageData = { + url: sub.dataset.url, + x: sub.left, + y: sub.top, + progress: sub.progress, + }; + sub.r = sub.width / 2; + + this._drawCircle(imageData, sub, resolve, reject, true, "wxml"); + } + + _drawWxmlBackgroundImage(sub, resolve, reject) { + let url = sub.dataset.url; + let index = this._findPicIndex(url); + url = index > -1 ? this.allPic[index].local : url; + let size = sub.backgroundSize.replace(/px/g, "").split(" "); + + let imageData = { + url: url, + x: sub.left, + y: sub.top, + progress: sub.progress, + }; + + this._drawRect(imageData, sub, resolve, reject, "image", "wxml"); + } + + _getWxml(item, style) { + let self = this; + let query; + // if (this.obj) { + // query = wx.createSelectorQuery().in(this.obj); + // } else { + // query = wx.createSelectorQuery(); + // } + if (this.object) { + query = wx.createSelectorQuery().in(this.object); + } else { + query = wx.createSelectorQuery(); + } + + let p1 = new Promise((resolve, reject) => { + // 会触发两次,要限制 + let count = 0; + query + .selectAll(`${item.class}`) + .fields( + { + dataset: true, + size: true, + rect: true, + computedStyle: [ + "width", + "height", + "font", + "fontSize", + "fontFamily", + "fontWeight", + "fontStyle", + "textAlign", + "color", + "lineHeight", + "border", + "borderColor", + "borderStyle", + "borderWidth", + "verticalAlign", + "boxShadow", + "background", + "backgroundColor", + "backgroundImage", + "backgroundPosition", + "backgroundSize", + "paddingLeft", + "paddingTop", + "paddingRight", + "paddingBottom", + ], + }, + (res) => { + if (count++ === 0) { + let formated = self._formatImage(res); + let list = formated.list; + res = formated.res; + + self + ._preloadImage(list) + .then((result) => { + resolve(res); + }) + .catch((res) => { + reject && reject({ errcode: 1009, errmsg: "drawWxml preLoadImage error" }); + }); + } + }, + ) + .exec(); + }); + + let p2 = new Promise((resolve, reject) => { + if (!item.limit) { + resolve({ top: 0, width: self.width / self.zoom }); + } + + query + .select(`${item.limit}`) + .fields( + { + dataset: true, + size: true, + rect: true, + }, + (res) => { + resolve(res); + }, + ) + .exec(); + }); + + return Promise.all([p1, p2]); + } + + _getLineHeight(style) { + let zoom = this.zoom; + if (style.dataset && style.dataset.type) { + zoom = 1; + } + let lineHeight; + if (!isNaN(style.lineHeight) && style.lineHeight > style.fontSize) { + lineHeight = style.lineHeight; + } else { + style.lineHeight = (style.lineHeight || "") + ""; + lineHeight = +style.lineHeight.replace("px", ""); + lineHeight = lineHeight ? lineHeight : (style.fontSize || 14) * 1.2; + } + return lineHeight * zoom; + } + + _formatImage(res = []) { + let list = []; + res.forEach((item, index) => { + let dataset = item.dataset; + let uid = Util.getUid(); + let filename = `${wx.env.USER_DATA_PATH}/${uid}.png`; + if ((dataset.type === "image" || dataset.type === "radius-image") && dataset.url) { + let sub = { + url: dataset.base64 ? filename : dataset.url, + isBase64: dataset.base64 ? dataset.url : false, + }; + + res[index].dataset = Object.assign(res[index].dataset, sub); + list.push(sub); + } else if (dataset.type === "background-image" && item.backgroundImage.indexOf("url") > -1) { + let url = item.backgroundImage.replace(/url\((\"|\')?/, "").replace(/(\"|\')?\)$/, ""); + let sub = { + url: dataset.base64 ? filename : url, + isBase64: dataset.base64 ? url : false, + }; + res[index].dataset = Object.assign(res[index].dataset, sub); + list.push(sub); + } + }); + + return { list, res }; + } + + _updateProgress(distance) { + this.progressPercent += distance; + this.progress(this.progressPercent); + } + + _sortListByTop(list = []) { + let sorted = {}; + + // 粗略地认为2px相差的元素在同一行 + list.forEach((item, index) => { + let top = item.top; + if (!sorted[top]) { + if (sorted[top - 2]) { + top = top - 2; + } else if (sorted[top - 1]) { + top = top - 1; + } else if (sorted[top + 1]) { + top = top + 1; + } else if (sorted[top + 2]) { + top = top + 2; + } else { + sorted[top] = []; + } + } + sorted[top].push(item); + }); + + return sorted; + } + + _parseNumber(number) { + return isNaN(number) ? +(number || "").replace("px", "") : number; + } + + _transferWxmlStyle(sub, item, limitLeft, limitTop) { + let leftFix = +sub.dataset.left || 0; + let topFix = +sub.dataset.top || 0; + + sub.width = this._parseNumber(sub.width); + sub.height = this._parseNumber(sub.height); + sub.left = this._parseNumber(sub.left) - limitLeft + (leftFix + (item.x || 0)) * this.zoom; + sub.top = this._parseNumber(sub.top) - limitTop + (topFix + (item.y || 0)) * this.zoom; + + let padding = sub.dataset.padding || "0 0 0 0"; + if (typeof padding === "string") { + padding = Util.transferPadding(padding); + } + let paddingTop = Number(sub.paddingTop.replace("px", "")) + Number(padding[0]); + let paddingRight = Number(sub.paddingRight.replace("px", "")) + Number(padding[1]); + let paddingBottom = Number(sub.paddingBottom.replace("px", "")) + Number(padding[2]); + let paddingLeft = Number(sub.paddingLeft.replace("px", "")) + Number(padding[3]); + sub.padding = [paddingTop, paddingRight, paddingBottom, paddingLeft]; + + return sub; + } + + /** + * 支持负值绘制,从右边计算 + * @param {*} item + * @param {*} style + */ + _resetPositionX(item, style) { + let zoom = this.zoom; + let x = 0; + + if (style.dataset && style.dataset.type) { + zoom = 1; + } + + // 通过wxml获取的不需要重置坐标 + if (item.x < 0 && item.type) { + x = this.width + item.x * zoom - style.width * zoom; + } else { + x = item.x * zoom; + } + + if (parseInt(style.borderWidth)) { + x += parseInt(style.borderWidth); + } + + return x + this.translateX; + } + + /** + * 支持负值绘制,从底部计算 + * @param {*} item + * @param {*} style + */ + _resetPositionY(item, style, textHeight) { + let zoom = this.zoom; + let y = 0; + + if (style.dataset && style.dataset.type) { + zoom = 1; + } + + if (item.y < 0) { + y = this.height + item.y * zoom - (textHeight ? textHeight : style.height * zoom); + } else { + y = item.y * zoom; + } + + if (parseInt(style.borderWidth)) { + y += parseInt(style.borderWidth); + } + + return y + this.translateY; + } + + /** + * 文字的padding、text-align + * @param {*} item + * @param {*} style + * @param {*} textWidth + */ + _resetTextPositionX(item, style, textWidth, width) { + let textAlign = style.textAlign || "left"; + let x = item.x; + if (textAlign === "center") { + x = (width - textWidth) / 2 + item.x; + } else if (textAlign === "right") { + x = width - textWidth + item.x; + } + + let left = style.padding ? style.padding[3] || 0 : 0; + + return x + left + this.translateX; + } + + /** + * 文字的padding、text-align + * @param {*} item + * @param {*} style + * @param {*} textWidth + */ + _resetTextPositionY(item, style, lineNum = 0) { + let zoom = this.zoom; + if (style.dataset && style.dataset.type) { + zoom = 1; + } + + let lineHeight = this._getLineHeight(style); + let fontSize = Math.ceil((style.fontSize || 14) * zoom); + + let blockLineHeightFix = + ((style.dataset && style.dataset.type) || "").indexOf("inline") > -1 ? 0 : (lineHeight - fontSize) / 2; + + let top = style.padding ? style.padding[0] || 0 : 0; + + // y + lineheight偏移 + 行数 + paddingTop + 整体画布位移 + return item.y + blockLineHeightFix + lineNum * lineHeight + top + this.translateY; + } + + /** + * 当文本超过宽度时,计算每一行应该绘制的文本 + * @param {*} text + * @param {*} width + * @param {*} singleLength + * @param {*} currentIndex + * @param {*} widthOffset + */ + _getTextSingleLine(text, width, singleLength, currentIndex = 0, widthOffset = 0) { + let offset = 0; + let endIndex = currentIndex + singleLength + offset; + let single = text.substring(currentIndex, endIndex); + let singleWidth = this.measureWidth(single); + + while (Math.round(widthOffset + singleWidth) > width) { + offset--; + endIndex = currentIndex + singleLength + offset; + single = text.substring(currentIndex, endIndex); + singleWidth = this.measureWidth(single); + } + + return { + endIndex, + single, + singleWidth, + }; + } + + _drawBorder(border, style, callback) { + let zoom = this.zoom; + if (style.dataset && style.dataset.type) { + zoom = 1; + } + border = Util.transferBorder(border); + + if (border && border.width) { + // 空白阴影,清空掉边框的阴影 + this._drawBoxShadow(); + if (border) { + this.ctx.setLineWidth(border.width * zoom); + + if (border.style === "dashed") { + let dash = style.dash || [5, 5, 0]; + let offset = dash[2] || 0; + let array = [dash[0] || 5, dash[1] || 5]; + this.ctx.setLineDash(array, offset); + } + this.ctx.setStrokeStyle(border.color); + } + callback && callback(border); + } + } + + _drawBoxShadow(boxShadow, callback) { + boxShadow = Util.transferBoxShadow(boxShadow); + if (boxShadow) { + this.ctx.setShadow(boxShadow.offsetX, boxShadow.offsetY, boxShadow.blur, boxShadow.color); + } else { + this.ctx.setShadow(0, 0, 0, "#ffffff"); + } + + callback && callback(boxShadow || {}); + } + + _setFill(fill, callback) { + if (fill) { + if (typeof fill === "string") { + this.ctx.setFillStyle(fill); + } else { + let line = fill.line; + let color = fill.color; + let grd = this.ctx.createLinearGradient(line[0], line[1], line[2], line[3]); + grd.addColorStop(0, color[0]); + grd.addColorStop(1, color[1]); + this.ctx.setFillStyle(grd); + } + callback && callback(); + } + } + + _setStroke(stroke, callback) { + if (stroke) { + if (typeof stroke === "string") { + this.ctx.setStrokeStyle(stroke); + } else { + let line = stroke.line; + let color = stroke.color; + let grd = this.ctx.createLinearGradient(line[0], line[1], line[2], line[3]); + grd.addColorStop(0, color[0]); + grd.addColorStop(1, color[1]); + this.ctx.setStrokeStyle(grd); + } + + callback && callback(); + } + } + } + + if (!exports.__esModule) Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Wxml2Canvas; + }, + function (modId) { + var map = { "./util": 1685064731948 }; + return __REQUIRE__(map[modId], modId); + }, + ); + __DEFINE__( + 1685064731948, + function (require, module, exports) { + /** + * 获取字符的长度,full为true时,一个汉字算两个长度 + * @param {String} str + * @param {Boolean} full + */ + + function getTextLength(str, full) { + let len = 0; + for (let i = 0; i < str.length; i++) { + let c = str.charCodeAt(i); + //单字节加1 + if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) { + len++; + } else { + len += full ? 2 : 1; + } + } + return len; + } + + /** + * rgba(255, 255, 255, 1) => #ffffff + * @param {String} color + */ + function transferColor(color = "") { + let res = "#"; + color = color.replace(/^rgba?\(/, "").replace(/\)$/, ""); + color = color.split(", "); + + color.length > 3 ? (color.length = 3) : ""; + for (let item of color) { + item = parseInt(item || 0); + if (item < 10) { + res += "0" + item; + } else { + res += item.toString(16); + } + } + + return res; + } + + function transferBorder(border = "") { + let res = border.match(/(\w+)px\s(\w+)\s(.*)/); + let obj = {}; + + if (res) { + obj = { + width: +res[1], + style: res[2], + color: res[3], + }; + } + + return res ? obj : null; + } + + /** + * 内边距,依次为上右下左 + * @param {*} padding + */ + function transferPadding(padding = "0 0 0 0") { + padding = padding.split(" "); + for (let i = 0, len = padding.length; i < len; i++) { + padding[i] = +padding[i].replace("px", ""); + } + + return padding; + } + /** + * type1: 0, 25, 17, rgba(0, 0, 0, 0.3) + * type2: rgba(0, 0, 0, 0.3) 0px 25px 17px 0px => (0, 25, 17, rgba(0, 0, 0, 0.3)) + * @param {*} shadow + */ + function transferBoxShadow(shadow = "", type) { + if (!shadow || shadow === "none") return; + let color; + let split; + + split = shadow.match(/(\w+)\s(\w+)\s(\w+)\s(rgb.*)/); + + if (split) { + split.shift(); + shadow = split; + color = split[3] || "#ffffff"; + } else { + split = shadow.split(") "); + color = split[0] + ")"; + shadow = split[1].split("px "); + } + + return { + offsetX: +shadow[0] || 0, + offsetY: +shadow[1] || 0, + blur: +shadow[2] || 0, + color, + }; + } + + function getUid(prefix) { + prefix = prefix || ""; + + return ( + prefix + + "xxyxxyxx".replace(/[xy]/g, (c) => { + let r = (Math.random() * 16) | 0; + let v = c === "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }) + ); + } + + if (!exports.__esModule) Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = { + getTextLength, + transferBorder, + transferColor, + transferPadding, + transferBoxShadow, + getUid, + }; + }, + function (modId) { + var map = {}; + return __REQUIRE__(map[modId], modId); + }, + ); + return __REQUIRE__(1685064731946); +})(); +//miniprogram-npm-outsideDeps=[] +//# sourceMappingURL=index.js.map diff --git a/src/components/customPoster/wxml2canvas/index.js.map b/src/components/customPoster/wxml2canvas/index.js.map new file mode 100644 index 0000000..68e773e --- /dev/null +++ b/src/components/customPoster/wxml2canvas/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.js","src/index.js","src/util.js"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;ACFA;AACA;AACA;AACA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":["var __TEMP__ = require('./src/index');var Wxml2Canvas = __REQUIRE_DEFAULT__(__TEMP__);\n\nif (!exports.__esModule) Object.defineProperty(exports, \"__esModule\", { value: true });exports.default = Wxml2Canvas;","var __TEMP__ = require('./util');var Util = __REQUIRE_DEFAULT__(__TEMP__);\n\nconst imageMode = ['scaleToFill', 'aspectFit', 'aspectFill', 'widthFix', 'top', 'bottom', 'center', 'left', 'right', 'top left', 'top right', 'bottom left', 'bottom right']\n\nclass Wxml2Canvas {\n constructor (options = {}) {\n this.device = wx.getSystemInfoSync && wx.getSystemInfoSync() || {};\n \n if (!options.zoom) {\n this.zoom = this.device.windowWidth / 375;\n } else {\n this.zoom = options.zoom || 1;\n } \n \n this.element = options.element;\n this.object = options.obj;\n this.width = options.width * this.zoom || 0;\n this.height = options.height * this.zoom || 0;\n this.destZoom = options.destZoom || 3;\n this.destWidth = this.width * this.destZoom;\n this.destHeight = this.height * this.destZoom;\n this.translateX = options.translateX * this.zoom || 0;\n this.translateY = options.translateY * this.zoom || 0;\n this.gradientBackground = options.gradientBackground || null;\n this.background = options.background || '#ffffff';\n this.finishDraw = options.finish || function finish(params) {}\n this.errorHandler = options.error || function error(params) {}\n this.progress = options.progress || function progress(params) {}\n this.textAlign = options.textAlign || 'left';\n this.fullText = options.fullText || false;\n this.font = options.font || '14px PingFang SC';\n\n this._init();\n }\n\n draw (data = {}, that) {\n let self = this;\n this.data = data;\n this.fef = that;\n\n this.progress(10);\n this._preloadImage(data.list).then((result) => {\n this.progress(30);\n self._draw();\n }).catch((res) => {\n self.errorHandler(res);\n })\n }\n\n measureWidth (text, font) {\n if(font) {\n this.ctx.font = font;\n }\n let res = this.ctx.measureText(text) || {};\n return res.width || 0;\n }\n\n _init () {\n this.progressPercent = 0; // 绘制进度百分比\n this.data = null;\n this.ref = null;\n this.allPic = [];\n this.screenList = []; \n this.asyncList = [];\n this.imgUrl = '';\n this.progressPercent = 0;\n this.distance = 0;\n this.progress(0);\n\n this.ctx = wx.createCanvasContext(this.element, this.obj);\n this.ctx.font = this.font;\n this.ctx.setTextBaseline('top');\n this.ctx.setStrokeStyle('white');\n\n this.debug = this.device.platform === 'devtools' ? true : false;\n\n this._drawBakcground();\n }\n\n _drawBakcground () {\n if (this.gradientBackground) {\n let line = this.gradientBackground.line || [0, 0, 0, this.height];\n let color = this.gradientBackground.color || ['#fff', '#fff'];\n let style = { fill: { line, color } }\n this._drawRectToCanvas(0, 0, this.width, this.height, style);\n } else {\n let style = { fill: this.background }\n this._drawRectToCanvas(0, 0, this.width, this.height, style);\n }\n }\n\n _draw () {\n let self = this;\n let list = this.data.list || [];\n let index = 0;\n let all = [];\n let count = 0;\n\n list.forEach(item => {\n if(item.type === 'wxml') {\n count += 3;\n } else {\n count += 1;\n }\n })\n\n this.distance = 60 / (count || 1); // 进度条的间距\n this.progressPercent = 30;\n this.asyncList = list.filter( item => item.delay == true );\n list = list.filter( item => item.delay != true );\n drawList(list);\n\n Promise.all(all).then(results => {\n index = 0;\n drawList(self.asyncList, true);\n\n Promise.all(all).then(results => {\n self.progress(90);\n self._saveCanvasToImage();\n });\n }).catch (e => {\n console.log(e)\n self.errorHandler(e);\n });\n\n function drawList(list = [], noDelay) {\n list.forEach((item, i) => {\n all[index++] = new Promise((resolve, reject) => {\n let attr = item.style;\n item.progress = self.distance;\n if (noDelay) {\n item.delay = 0;\n }\n if (item.type === 'radius-image') {\n self._drawCircle(item, attr, resolve, reject, 'image');\n } else if (item.type === 'text') {\n self._drawText(item, attr, resolve, reject);\n } else if (item.type === 'line') {\n self._drawLine(item, attr, resolve, reject);\n } else if (item.type === 'circle') {\n self._drawCircle(item, attr, resolve, reject);\n } else if (item.type === 'rect') {\n self._drawRect(item, attr, resolve, reject);\n } else if (item.type === 'image') {\n self._drawRect(item, attr, resolve, reject, 'image');\n } else if (item.type === 'wxml') {\n self._drawWxml(item, attr, resolve, reject);\n }else {\n resolve();\n }\n });\n });\n }\n }\n\n _saveCanvasToImage () {\n let self = this; \n\n // 延时保存有两个原因,一个是等待绘制delay的元素,另一个是安卓上样式会错乱\n setTimeout(() => {\n self.progress(95);\n\n let obj = {\n x: 0,\n y: 0,\n width: self.width,\n height: self.height,\n canvasId: self.element,\n success: function (res) {\n\n self.progress(100);\n self.imgUrl = res.tempFilePath;\n self.finishDraw(self.imgUrl);\n },\n fail: function (res) {\n\n self.errorHandler({errcode: 1000, errmsg: 'save canvas error', e: res});\n }\n }\n\n if(self.destZoom !== 3) {\n obj.destWidth = self.destWidth;\n obj.destHeight = self.destHeight;\n }\n\n wx.canvasToTempFilePath(obj, self.object);\n }, self.device.system.indexOf('iOS') === -1 ? 300 : 100);\n }\n\n _preloadImage (list = []) {\n let self = this;\n let all = [];\n let count = 0;\n\n list.forEach((item, i) => {\n if (item.url && self._findPicIndex(item.url) === -1) {\n \n // 避免重复下载同一图片\n self.allPic.push({\n url: item.url,\n local: ''\n });\n all[count++] = new Promise((resolve, reject) => {\n // 非http(s)域名的就不下载了\n if (!/^http/.test(item.url) || /^http:\\/\\/(tmp)|(usr)\\//.test(item.url) || /^http:\\/\\/127\\.0\\.0\\.1/.test(item.url)) {\n if(item.isBase64) {\n let fileManager = wx.getFileSystemManager();\n\n fileManager.writeFile({\n filePath: item.url,\n data: item.isBase64.replace(/data:image\\/(.*);base64,/, ''),\n encoding: 'base64',\n success (res) {\n imageInfo(item.url);\n },\n fail (res) {\n reject(res);\n },\n })\n \n }else {\n imageInfo(item.url);\n }\n\n function imageInfo (url) {\n wx.getImageInfo({\n src: url,\n success (res) {\n let index = self._findPicIndex(url);\n if(index > -1) {\n self.allPic[index].local = url;\n self.allPic[index].width = res.width;\n self.allPic[index].height = res.height;\n }\n resolve({ tempFilePath: url });\n }, \n fail (res) {\n reject(res);\n }\n })\n }\n } else {\n wx.downloadFile({\n url: item.url.replace(/^https?/, 'https'),\n success: function (res) {\n wx.getImageInfo({\n src: res.tempFilePath,\n success (img) {\n let index = self._findPicIndex(item.url);\n if (index > -1) {\n self.allPic[index].local = res.tempFilePath;\n self.allPic[index].width = img.width;\n self.allPic[index].height = img.height;\n }\n resolve(res);\n },\n fail (res) {\n reject(res);\n }\n })\n },\n fail: (res) => {\n reject({errcode: 1001, errmsg: 'download pic error'});\n }\n })\n }\n }) \n }\n });\n\n return Promise.all(all).then(results => {\n return new Promise(resolve => { resolve() })\n }).catch((results) => {\n return new Promise((resolve, reject) => { reject(results) })\n })\n }\n\n _findPicIndex (url) {\n let index = this.allPic.findIndex(pic => pic.url === url);\n return index;\n }\n\n _drawRect (item, style, resolve, reject, isImage, isWxml) {\n let zoom = this.zoom;\n let leftOffset = 0;\n let topOffset = 0;\n let width = style.width;\n let height = style.height;\n let imgWidth = style.width;\n let imgHeight = style.height;\n let mode = null;\n\n try {\n item.x = this._resetPositionX(item, style);\n item.y = this._resetPositionY(item, style);\n \n let url;\n if(isImage) {\n let index = this._findPicIndex(item.url);\n if(index > -1) {\n url = this.allPic[index].local\n imgWidth = this.allPic[index].width\n imgHeight = this.allPic[index].height\n }else {\n url = item.url;\n }\n }\n\n style.padding = style.padding || [];\n if(isWxml === 'inline-wxml') {\n item.x = item.x + (style.padding[3] && style.padding[3] || 0)\n item.y = item.y + (style.padding[0] && style.padding[0] || 0)\n }\n\n leftOffset = item.x + style.width + (style.padding[1] && style.padding[1] || 0);\n\n if(!isWxml) {\n width = width * zoom;\n height = height * zoom;\n }\n\n if(style.dataset && style.dataset.mode && imageMode.indexOf(style.dataset.mode) > -1) {\n mode = {\n type: style.dataset.mode,\n width: imgWidth,\n height: imgHeight\n };\n }\n\n this._drawRectToCanvas(item.x, item.y, width, height, style, url, mode);\n this._updateProgress(item.progress);\n\n if(resolve) {\n resolve();\n }else {\n return {\n leftOffset,\n topOffset\n }\n }\n } catch (e) {\n reject && reject({ errcode: (isImage ? 1003 : 1002), errmsg: (isImage ? 'drawImage error' : 'drawRect error'), e });\n }\n }\n\n _drawRectToCanvas (x, y, width, height, style, url, mode) {\n let { fill, border, boxShadow } = style;\n this.ctx.save();\n this._drawBoxShadow(boxShadow, (res) => {\n // 真机上填充渐变色时,没有阴影,先画个相等大小的纯色矩形来实现阴影\n if(fill && typeof fill !== 'string' && !this.debug) {\n this.ctx.setFillStyle(res.color || '#ffffff');\n this.ctx.fillRect(x, y, width, height);\n }\n });\n \n if(url) {\n // 开发者工具有bug,先不裁剪\n if(mode) {\n this._resetImageByMode(url, x, y, width, height, mode);\n }else {\n this.ctx.drawImage(url, x, y, width, height)\n }\n }else {\n this._setFill(fill, () => {\n this.ctx.fillRect(x, y, width, height);\n });\n }\n\n this._drawBorder(border, style, (border) => {\n let fixBorder = border.width;\n this.ctx.strokeRect(x - fixBorder / 2, y - fixBorder / 2, width + fixBorder, height + fixBorder);\n });\n\n this.ctx.draw(true);\n this.ctx.restore();\n }\n\n _resetImageByMode (url, x, y, width, height, mode) {\n let self = this;\n let offsetX = 0;\n let offsetY = 0;\n let imgWidth = mode.width;\n let imgHeight = mode.height;\n\n switch (mode.type) {\n case 'scaleToFill': \n imgWidth = width;\n imgHeight = height;\n self.ctx.drawImage(url, x, y, width, height)\n break;\n case 'widthFix': \n height = width / ((imgWidth || 1) / (imgHeight || 1))\n self.ctx.drawImage(url, x, y, width, height)\n break; \n case 'aspectFit': \n if(imgWidth > imgHeight) {\n let realHeight = width / ((imgWidth || 1) / (imgHeight || 1))\n offsetY = -(height - realHeight) / 2\n imgWidth = width;\n imgHeight = realHeight;\n }else {\n let realWidth = height / ((imgHeight || 1) / (imgWidth || 1))\n offsetX = -(width - realWidth) / 2\n imgWidth = realWidth;\n imgHeight = height;\n }\n\n _clip();\n break;\n case 'aspectFill': \n if(imgWidth > imgHeight) {\n let realWidth = imgWidth / ((imgHeight || 1) / (height || 1))\n offsetX = (realWidth - width) / 2\n imgWidth = realWidth;\n imgHeight = height;\n }else {\n let realHeight = imgHeight / ((imgWidth || 1) / (width || 1))\n offsetY = (realHeight - height) / 2\n imgWidth = width;\n imgHeight = realHeight;\n }\n\n _clip();\n break;\n case 'top left': \n _clip();\n break;\n case 'top': \n offsetX = (mode.width - width) / 2;\n _clip();\n break;\n case 'top right': \n offsetX = (mode.width - width);\n _clip();\n break;\n case 'left': \n offsetY = (mode.height - height) / 2;\n _clip();\n break;\n case 'center': \n offsetX = (mode.width - width) / 2;\n offsetY = (mode.height - height) / 2;\n _clip();\n break;\n case 'right': \n offsetX = (mode.width - width);\n offsetY = (mode.height - height) / 2;\n _clip();\n break;\n case 'bottom left': \n offsetY = (mode.height - height)\n _clip();\n break;\n case 'bottom': \n offsetX = (mode.width - width) / 2;\n offsetY = (mode.height - height)\n _clip();\n break;\n case 'bottom right': \n offsetX = (mode.width - width);\n offsetY = (mode.height - height)\n _clip();\n break;\n default: \n imgWidth = width;\n imgHeight = height;\n break; \n }\n\n function _clip () {\n self.ctx.save();\n self.ctx.beginPath()\n self.ctx.rect(x, y, width, height)\n self.ctx.clip();\n self.ctx.drawImage(url, x - offsetX, y - offsetY, imgWidth, imgHeight)\n self.ctx.closePath();\n self.ctx.restore();\n }\n }\n\n _drawText (item, style, resolve, reject, type, isWxml) {\n let zoom = this.zoom;\n let leftOffset = 0;\n let topOffset = 0;\n\n try {\n style.fontSize = this._parseNumber(style.fontSize);\n let fontSize = Math.ceil((style.fontSize || 14) * zoom)\n this.ctx.setTextBaseline('top');\n this.ctx.font = (`${style.fontWeight ? (style.fontWeight) : 'normal'} ${ fontSize }px ${ style.fontFamily || 'PingFang SC' }`);\n this.ctx.setFillStyle(style.color || '#454545');\n\n let text = item.text || '';\n let textWidth = Math.floor(this.measureWidth(text, style.font || this.ctx.font));\n let lineHeight = this._getLineHeight(style);\n let textHeight = Math.ceil(textWidth / (style.width || textWidth)) * lineHeight;\n let width = Math.ceil((style.width || textWidth) * (!isWxml ? zoom : 1));\n let whiteSpace = style.whiteSpace || 'wrap';\n let x = 0;\n let y = 0; \n\n if(typeof style.padding === 'string') {\n style.padding = Util.transferPadding(style.padding);\n }\n item.x = this._resetPositionX(item, style);\n item.y = this._resetPositionY(item, style, textHeight);\n this._drawBoxShadow(style.boxShadow);\n\n if(style.background || style.border) {\n this._drawTextBackgroud(item, style, textWidth, textHeight, isWxml);\n }\n \n // 行内文本\n if(type === 'inline-text') {\n width = item.maxWidth;\n if(item.leftOffset + textWidth > width) {\n // 如果上一个行内元素换行了,这个元素要继续在后面补足一行\n let lineNum = Math.max(Math.floor(textWidth / width), 1);\n let length = text.length;\n let singleLength = Math.floor(length / lineNum);\n let widthOffset = item.leftOffset ? item.leftOffset - item.originX : 0;\n let { endIndex: currentIndex, single, singleWidth } = this._getTextSingleLine(text, width, singleLength, 0, widthOffset)\n x = this._resetTextPositionX(item, style, singleWidth);\n y = this._resetTextPositionY(item, style);\n this.ctx.fillText(single, x, y);\n leftOffset = x + singleWidth;\n topOffset = y;\n\n // 去除第一行补的内容,然后重置\n text = text.substring(currentIndex, text.length);\n currentIndex = 0;\n lineNum = Math.max(Math.floor(textWidth / width), 1);\n textWidth = Math.floor(this.measureWidth(text, style.font || this.ctx.font));\n item.x = item.originX; // 还原换行后的x\n for (let i = 0; i < lineNum; i++) {\n let { endIndex, single, singleWidth } = this._getTextSingleLine(text, width, singleLength, currentIndex);\n currentIndex = endIndex;\n if(single) {\n x = this._resetTextPositionX(item, style, singleWidth, width);\n y = this._resetTextPositionY(item, style, i + 1);\n this.ctx.fillText(single, x, y);\n if(i === lineNum - 1) {\n leftOffset = x + singleWidth;\n topOffset = lineHeight * lineNum;\n }\n }\n }\n\n let last = text.substring(currentIndex, length);\n let lastWidth = this.measureWidth(last);\n\n if(last) {\n x = this._resetTextPositionX(item, style, lastWidth, width);\n y = this._resetTextPositionY(item, style, lineNum + 1);\n this.ctx.fillText(last, x, y);\n leftOffset = x + lastWidth;\n topOffset = lineHeight * (lineNum + 1);\n }\n }else {\n x = this._resetTextPositionX(item, style, textWidth, width);\n y = this._resetTextPositionY(item, style);\n this.ctx.fillText(item.text, x, y);\n leftOffset = x + textWidth;\n topOffset = lineHeight;\n }\n }else {\n // block文本,如果文本长度超过宽度换行\n if (width && textWidth > width && whiteSpace !== 'nowrap') {\n let lineNum = Math.max(Math.floor(textWidth / width), 1);\n let length = text.length;\n let singleLength = Math.floor(length / lineNum);\n let currentIndex = 0;\n\n // lineClamp参数限制最多行数\n if (style.lineClamp && lineNum + 1 > style.lineClamp) {\n lineNum = style.lineClamp - 1;\n }\n\n for (let i = 0; i < lineNum; i++) {\n let { endIndex, single, singleWidth } = this._getTextSingleLine(text, width, singleLength, currentIndex);\n currentIndex = endIndex;\n x = this._resetTextPositionX(item, style, singleWidth, width);\n y = this._resetTextPositionY(item, style, i);\n this.ctx.fillText(single, x, y);\n\n }\n\n // 换行后剩余的文字,超过一行则截断增加省略号\n let last = text.substring(currentIndex, length);\n let lastWidth = this.measureWidth(last);\n if(lastWidth > width) {\n let { single, singleWidth } = this._getTextSingleLine(last, width, singleLength);\n lastWidth = singleWidth;\n last = single.substring(0, single.length - 1) + '...';\n }\n\n x = this._resetTextPositionX(item, style, lastWidth, width);\n y = this._resetTextPositionY(item, style, lineNum);\n this.ctx.fillText(last, x, y);\n\n }else {\n x = this._resetTextPositionX(item, style, textWidth, width);\n y = this._resetTextPositionY(item, style);\n this.ctx.fillText(item.text, x, y);\n }\n }\n \n this.ctx.draw(true);\n \n this._updateProgress(item.progress);\n\n if(resolve) {\n resolve();\n }else {\n return {\n leftOffset,\n topOffset\n }\n }\n } catch(e) {\n reject && reject({ errcode: 1004, errmsg: 'drawText error', e: e });\n }\n }\n\n _drawTextBackgroud (item, style, textWidth, textHeight, isWxml) {\n if(!style.width) return;\n let zoom = isWxml ? 1 : this.zoom;\n let width = style.width || textWidth;\n let height = style.height || textHeight;\n let rectStyle = {\n fill: style.background,\n border: style.border\n }\n style.padding = style.padding || [0, 0, 0, 0];\n width += (style.padding[1] || 0) + (style.padding[3] || 0);\n height += (style.padding[0] || 0) + (style.padding[2] || 0);\n width = width * zoom\n height = height * zoom\n this._drawRectToCanvas(item.x, item.y, width, height, rectStyle);\n }\n\n _drawCircle (item, style, resolve, reject, isImage, isWxml) {\n let zoom = this.zoom;\n let r = style.r;\n try {\n \n item.x = this._resetPositionX(item, style);\n item.y = this._resetPositionY(item, style);\n\n let url;\n if(isImage) {\n let index = this._findPicIndex(item.url);\n if (index > -1) {\n url = this.allPic[index].local;\n } else {\n url = item.url;\n }\n }\n\n if(!isWxml) {\n r = r * zoom;\n }\n\n this._drawCircleToCanvas(item.x, item.y, r, style, url);\n \n this._updateProgress(item.progress);\n resolve && resolve();\n } catch (e) {\n reject && reject({ errcode: (isImage ? 1006 : 1005), errmsg: (isImage ? 'drawCircleImage error' : 'drawCircle error'), e });\n }\n }\n\n _drawCircleToCanvas (x, y, r, style, url) {\n let { fill, border, boxShadow } = style;\n\n this.ctx.save();\n\n this._drawBoxShadow(boxShadow, (res) => {\n // 真机上填充渐变色时,没有阴影,先画个相等大小的纯色矩形来实现阴影\n if((fill && typeof fill !== 'string') || (url && res.color)) {\n this.ctx.setFillStyle(res.color || '#ffffff');\n this.ctx.beginPath();\n this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI);\n this.ctx.closePath();\n this.ctx.fill();\n }\n });\n\n if(url) {\n this.ctx.save();\n this.ctx.beginPath();\n this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI);\n this.ctx.clip();\n this.ctx.drawImage(url, x, y, r * 2, r * 2);\n this.ctx.closePath();\n this.ctx.restore();\n }else {\n this._setFill(fill, () => {\n this.ctx.beginPath();\n this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI);\n this.ctx.closePath();\n this.ctx.fill();\n });\n }\n\n this._drawBorder(border, style, (border) => {\n this.ctx.beginPath()\n this.ctx.arc(x + r, y + r, r + border.width / 2, 0, 2 * Math.PI)\n this.ctx.stroke()\n this.ctx.closePath();\n });\n\n this.ctx.draw(true);\n this.ctx.restore();\n }\n\n _drawLine (item, style, resolve, reject, isWxml) {\n let zoom = this.zoom;\n try {\n let x1 = item.x * zoom + this.translateX;\n let y1 = item.y * zoom + this.translateY;\n let x2 = item.x2 * zoom + this.translateX;\n let y2 = item.y2 * zoom + this.translateY;\n this._drawLineToCanvas(x1, y1, x2, y2, style);\n\n this._updateProgress(item.progress);\n resolve && resolve();\n } catch (e) {\n reject && reject({ errcode: 1007, errmsg: 'drawLine error', e });\n }\n }\n\n _drawLineToCanvas (x1, y1, x2, y2, style) {\n let { stroke, dash, boxShadow } = style;\n\n this.ctx.save();\n if(stroke) {\n this._setStroke(stroke);\n }\n\n this._drawBoxShadow(boxShadow);\n\n if(dash) {\n let dash = [style.dash[0] || 5, style.dash[1] || 5];\n let offset = style.dash[2] || 0;\n this.ctx.setLineDash(dash, offset || 0);\n }\n\n this.ctx.moveTo(x1, y1);\n this.ctx.setLineWidth((style.width || 1) * this.zoom);\n this.ctx.lineTo(x2, y2);\n this.ctx.stroke();\n this.ctx.draw(true);\n this.ctx.restore();\n }\n\n // 废弃,合并到_drawRect\n _drawImage (item, style, resolve, reject, isWxml) {\n let zoom = this.zoom;\n try {\n \n item.x = this._resetPositionX(item, style);\n item.y = this._resetPositionY(item, style);\n item.x = item.x + (style.padding[3] || 0);\n item.y = item.y + (style.padding[0] || 0);\n\n let index = this._findPicIndex(item.url);\n let url = index > -1 ? this.allPic[index].local : item.url;\n this._drawImageToCanvas(url, item.x, item.y, style.width * zoom, style.height * zoom, style);\n\n this._updateProgress(item.progress);\n resolve && resolve();\n } catch (e) {\n reject && reject({ errcode: 1012, errmsg: 'drawRect error', e });\n }\n }\n\n // 废弃,合并到_drawRect\n _drawImageToCanvas (url, x, y, width, height, style) {\n let { fill, border, boxShadow } = style;\n this.ctx.save();\n\n this._drawBoxShadow(boxShadow);\n this.ctx.drawImage(url, x, y, width, height);\n\n this._drawBorder(border, style, (border) => {\n let fixBorder = border.width;\n this.ctx.strokeRect(x - fixBorder / 2, y - fixBorder / 2, width + fixBorder, height + fixBorder);\n });\n this.ctx.draw(true);\n this.ctx.restore();\n }\n\n _drawWxml (item, style, resolve, reject) {\n let self = this;\n let all = [];\n try {\n this._getWxml(item, style).then((results) => {\n \n // 上 -> 下\n let sorted = self._sortListByTop(results[0]);\n let count = 0;\n let progress = 0;\n Object.keys(sorted).forEach(item => {\n count += sorted[item].length;\n })\n progress = this.distance * 3 / (count || 1);\n\n all = this._drawWxmlBlock(item, sorted, all, progress, results[1]);\n all = this._drawWxmlInline(item, sorted, all, progress, results[1]);\n\n Promise.all(all).then(results => {\n resolve && resolve();\n }).catch (e => {\n reject && reject(e);\n });\n });\n } catch (e) {\n reject && reject({ errcode: 1008, errmsg: 'drawWxml error' });\n }\n }\n\n _drawWxmlBlock (item, sorted, all, progress, results) {\n let self = this;\n // 用来限定位置范围,取相对位置\n let limitLeft = (results ? results.left : 0);\n let limitTop = (results ? results.top : 0);\n Object.keys(sorted).forEach((top, topIndex) => {\n // 左 -> 右\n let list = sorted[top].sort((a, b) => {\n return (a.left - b.left);\n });\n\n list = list.filter(sub => sub.dataset.type && sub.dataset.type.indexOf('inline') === -1);\n\n list.forEach((sub, index) => {\n all[index] = new Promise((resolve2, reject2) => {\n sub = self._transferWxmlStyle(sub, item, limitLeft, limitTop);\n sub.progress = progress;\n let type = sub.dataset.type;\n if(sub.dataset.delay) {\n setTimeout(() => {\n drawWxmlItem();\n }, sub.dataset.delay)\n } else {\n drawWxmlItem();\n }\n function drawWxmlItem () {\n if (type === 'text') {\n self._drawWxmlText(sub, resolve2, reject2);\n } else if (type === 'image') {\n self._drawWxmlImage(sub, resolve2, reject2);\n } else if (type === 'radius-image') {\n self._drawWxmlCircleImage(sub, resolve2, reject2);\n } else if (type === 'background-image') {\n self._drawWxmlBackgroundImage(sub, resolve2, reject2);\n }\n }\n });\n });\n });\n\n return all;\n\n }\n\n _drawWxmlInline (item, sorted, all, progress, results) {\n let self = this;\n let topOffset = 0;\n let leftOffset = 0;\n let lastTop = 0;\n let limitLeft = (results ? results.left : 0);\n let limitTop = (results ? results.top : 0);\n let p = new Promise((resolve2, reject2) => {\n let maxWidth = 0;\n let minLeft = Infinity;\n let maxRight = 0;\n\n // 找出同一top下的最小left和最大right,得到最大的宽度,用于换行\n Object.keys(sorted).forEach(top => {\n let inlineList = sorted[top].filter(sub => sub.dataset.type && sub.dataset.type.indexOf('inline') > -1);\n inlineList.forEach(sub => {\n if(sub.left < minLeft) {\n minLeft = sub.left\n }\n if(sub.right > maxRight) {\n maxRight = sub.right;\n }\n })\n });\n maxWidth = Math.ceil((maxRight - minLeft) || self.width);\n\n Object.keys(sorted).forEach((top, topIndex) => {\n // 左 -> 右\n let list = sorted[top].sort((a, b) => {\n return (a.left - b.left);\n });\n\n // 换行的行内元素left放到后面,version2.0.6后无法获取高度,改用bottom值来判断是否换行了\n let position = -1;\n for(let i = 0, len = list.length; i < len; i++) {\n if(list[i] && list[i + 1]) {\n if(list[i].bottom > list[i + 1].bottom) {\n position = i;\n break;\n }\n }\n }\n\n if(position > -1) {\n list.push(list.splice(position, 1)[0]);\n }\n\n let inlineList = list.filter(sub => sub.dataset.type && sub.dataset.type.indexOf('inline') > -1);\n let originLeft = (inlineList[0] ? inlineList[0].left : 0);\n // 换行后和top不相等时,认为是换行了,要清除左边距;当左偏移量大于最大宽度时,也要清除左边距; 当左偏移小于左边距时,也要清除\n if (Math.abs(topOffset + lastTop - top) > 2 || leftOffset - originLeft - limitLeft >= maxWidth || leftOffset <= originLeft - limitLeft - 2) {\n leftOffset = 0;\n }\n\n lastTop = +top;\n topOffset = 0;\n \n inlineList.forEach((sub, index) => {\n sub = self._transferWxmlStyle(sub, item, limitLeft, limitTop);\n sub.progress = progress;\n let type = sub.dataset.type;\n if (type === 'inline-text') {\n let drawRes = self._drawWxmlInlineText(sub, leftOffset, maxWidth);\n leftOffset = drawRes.leftOffset;\n topOffset = drawRes.topOffset;\n } else if (type === 'inline-image') {\n let drawRes = self._drawWxmlImage(sub) || {};\n leftOffset = drawRes.leftOffset || 0;\n topOffset = drawRes.topOffset || 0;\n }\n });\n });\n resolve2();\n })\n\n all.push(p); \n return all;\n }\n\n _drawWxmlInlineText (sub, leftOffset = 0, maxWidth) {\n let text = sub.dataset.text || '';\n if(sub.dataset.maxlength && text.length > sub.dataset.maxlength) {\n text = text.substring(0, sub.dataset.maxlength) + '...';\n }\n \n let textData = {\n text,\n originX: sub.left,\n x: leftOffset ? leftOffset : sub.left,\n y: sub.top,\n progress: sub.progress,\n leftOffset: leftOffset,\n maxWidth: maxWidth // 行内元素的最大宽度,取决于limit的宽度\n }\n\n if (sub.backgroundColor !== 'rgba(0, 0, 0, 0)') {\n sub.background = sub.backgroundColor;\n }else {\n sub.background = 'rgba(0, 0, 0, 0)';\n }\n\n if(sub.dataset.background) {\n sub.background = sub.dataset.background;\n }\n\n let res = this._drawText(textData, sub, null, null, 'inline-text', 'wxml');\n\n return res\n }\n\n _drawWxmlText (sub, resolve, reject) {\n let text = sub.dataset.text || '';\n if(sub.dataset.maxlength && text.length > sub.dataset.maxlength) {\n text = text.substring(0, sub.dataset.maxlength) + '...';\n }\n \n let textData = {\n text,\n x: sub.left,\n y: sub.top,\n progress: sub.progress\n }\n if (sub.backgroundColor !== 'rgba(0, 0, 0, 0)') {\n sub.background = sub.backgroundColor;\n }else {\n sub.background = 'rgba(0, 0, 0, 0)';\n }\n\n if(sub.dataset.background) {\n sub.background = sub.dataset.background;\n }\n\n this._drawText(textData, sub, resolve, reject, 'text', 'wxml');\n }\n\n _drawWxmlImage (sub, resolve, reject) {\n let imageData = {\n url: sub.dataset.url,\n x: sub.left,\n y: sub.top,\n progress: sub.progress\n }\n\n let res = this._drawRect(imageData, sub, resolve, reject, 'image', 'inline-wxml');\n\n return res\n }\n\n _drawWxmlCircleImage (sub, resolve, reject) {\n let imageData = {\n url: sub.dataset.url,\n x: sub.left,\n y: sub.top,\n progress: sub.progress\n }\n sub.r = sub.width / 2;\n\n this._drawCircle(imageData, sub, resolve, reject, true, 'wxml');\n }\n\n _drawWxmlBackgroundImage (sub, resolve, reject) {\n let url = sub.dataset.url;\n let index = this._findPicIndex(url);\n url = index > -1 ? this.allPic[index].local : url;\n let size = sub.backgroundSize.replace(/px/g, '').split(' ');\n\n let imageData = {\n url: url,\n x: sub.left,\n y: sub.top,\n progress: sub.progress\n }\n\n this._drawRect(imageData, sub, resolve, reject, 'image', 'wxml');\n }\n\n _getWxml (item, style) {\n let self = this;\n let query;\n if(this.obj) {\n query = wx.createSelectorQuery().in(this.obj);\n }else {\n query = wx.createSelectorQuery();\n }\n\n let p1 = new Promise((resolve, reject) => {\n // 会触发两次,要限制\n let count = 0;\n query.selectAll(`${item.class}`).fields({\n dataset: true,\n size: true,\n rect: true,\n computedStyle: ['width', 'height', 'font', 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle', 'textAlign', \n 'color', 'lineHeight', 'border', 'borderColor', 'borderStyle', 'borderWidth', 'verticalAlign', 'boxShadow',\n 'background', 'backgroundColor', 'backgroundImage', 'backgroundPosition', 'backgroundSize', 'paddingLeft', 'paddingTop',\n 'paddingRight', 'paddingBottom'\n ]\n }, (res) => {\n if(count++ === 0) {\n let formated = self._formatImage(res);\n let list = formated.list;\n res = formated.res;\n\n self._preloadImage(list).then(result => {\n resolve(res);\n }).catch((res) => {\n reject && reject({ errcode: 1009, errmsg: 'drawWxml preLoadImage error' });\n });\n }\n }).exec();\n });\n\n let p2 = new Promise((resolve, reject) => {\n if (!item.limit) {\n resolve({ top: 0, width: self.width / self.zoom });\n }\n\n query.select(`${item.limit}`).fields({\n dataset: true,\n size: true,\n rect: true,\n }, (res) => {\n resolve(res);\n }).exec();\n });\n\n return Promise.all([p1, p2]);\n }\n\n _getLineHeight (style) {\n let zoom = this.zoom;\n if(style.dataset && style.dataset.type) {\n zoom = 1;\n }\n let lineHeight;\n if(!isNaN(style.lineHeight) && style.lineHeight > style.fontSize) {\n lineHeight = style.lineHeight;\n }else {\n style.lineHeight = (style.lineHeight || '') + '';\n lineHeight = +style.lineHeight.replace('px', '');\n lineHeight = lineHeight ? lineHeight : (style.fontSize || 14) * 1.2;\n }\n return lineHeight * zoom;\n }\n\n _formatImage (res = []) {\n let list = [];\n res.forEach((item, index) => {\n let dataset = item.dataset;\n let uid = Util.getUid();\n let filename = `${wx.env.USER_DATA_PATH}/${uid}.png`;\n if ((dataset.type === \"image\" || dataset.type === \"radius-image\") && dataset.url) {\n let sub = {\n url: dataset.base64 ? filename : dataset.url,\n isBase64: dataset.base64 ? dataset.url : false\n }\n\n res[index].dataset = Object.assign(res[index].dataset, sub);\n list.push(sub)\n } else if (dataset.type === 'background-image' && item.backgroundImage.indexOf('url') > -1) {\n let url = item.backgroundImage.replace(/url\\((\\\"|\\')?/, '').replace(/(\\\"|\\')?\\)$/, '');\n let sub = {\n url: dataset.base64 ? filename : url,\n isBase64: dataset.base64 ? url : false\n }\n res[index].dataset = Object.assign(res[index].dataset, sub);\n list.push(sub)\n }\n });\n\n return { list, res };\n }\n\n _updateProgress (distance) {\n this.progressPercent += distance;\n this.progress(this.progressPercent);\n }\n\n _sortListByTop (list = []) {\n let sorted = {};\n\n // 粗略地认为2px相差的元素在同一行\n list.forEach((item, index) => {\n let top = item.top;\n if (!sorted[top]) {\n if (sorted[top - 2]) {\n top = top - 2;\n }else if (sorted[top - 1]) {\n top = top - 1;\n } else if (sorted[top + 1]) {\n top = top + 1;\n } else if (sorted[top + 2]) {\n top = top + 2;\n } else {\n sorted[top] = [];\n }\n }\n sorted[top].push(item);\n });\n\n return sorted;\n }\n\n _parseNumber (number) {\n return isNaN(number) ? +(number || '').replace('px', '') : number;\n }\n\n _transferWxmlStyle (sub, item, limitLeft, limitTop) {\n let leftFix = (+sub.dataset.left || 0);\n let topFix = (+sub.dataset.top || 0);\n\n sub.width = this._parseNumber(sub.width);\n sub.height = this._parseNumber(sub.height);\n sub.left = this._parseNumber(sub.left) - limitLeft + (leftFix + (item.x || 0)) * this.zoom;\n sub.top = this._parseNumber(sub.top) - limitTop + (topFix + (item.y || 0)) * this.zoom;\n\n let padding = sub.dataset.padding || '0 0 0 0';\n if (typeof padding === 'string') {\n padding = Util.transferPadding(padding);\n }\n let paddingTop = Number(sub.paddingTop.replace('px', '')) + Number(padding[0]);\n let paddingRight = Number(sub.paddingRight.replace('px', '')) + Number(padding[1]);\n let paddingBottom = Number(sub.paddingBottom.replace('px', '')) + Number(padding[2]);\n let paddingLeft = Number(sub.paddingLeft.replace('px', '')) + Number(padding[3]);\n sub.padding = [paddingTop, paddingRight, paddingBottom, paddingLeft];\n \n return sub;\n }\n\n /**\n * 支持负值绘制,从右边计算\n * @param {*} item \n * @param {*} style \n */\n _resetPositionX (item, style) {\n let zoom = this.zoom;\n let x = 0;\n\n if(style.dataset && style.dataset.type) {\n zoom = 1;\n }\n\n // 通过wxml获取的不需要重置坐标\n if (item.x < 0 && item.type) {\n x = this.width + item.x * zoom - style.width * zoom;\n } else {\n x = item.x * zoom;\n }\n\n if (parseInt(style.borderWidth)) {\n x += parseInt(style.borderWidth)\n }\n\n return x + this.translateX;\n }\n\n /**\n * 支持负值绘制,从底部计算\n * @param {*} item \n * @param {*} style \n */\n _resetPositionY (item, style, textHeight) {\n let zoom = this.zoom;\n let y = 0;\n\n if(style.dataset && style.dataset.type) {\n zoom = 1;\n }\n\n if (item.y < 0) {\n y = this.height + item.y * zoom - (textHeight ? textHeight : style.height * zoom)\n } else {\n y = item.y * zoom;\n }\n\n if (parseInt(style.borderWidth)) {\n y += parseInt(style.borderWidth)\n }\n \n return y + this.translateY;\n }\n\n /**\n * 文字的padding、text-align\n * @param {*} item \n * @param {*} style \n * @param {*} textWidth\n */\n _resetTextPositionX (item, style, textWidth, width) {\n let textAlign = style.textAlign || 'left';\n let x = item.x;\n if (textAlign === 'center') {\n x = (width - textWidth) / 2 + item.x;\n } else if (textAlign === 'right') {\n x = width - textWidth + item.x;\n }\n\n let left = style.padding ? (style.padding[3] || 0) : 0;\n\n return x + left + this.translateX;\n }\n\n /**\n * 文字的padding、text-align\n * @param {*} item \n * @param {*} style \n * @param {*} textWidth\n */\n _resetTextPositionY (item, style, lineNum = 0) {\n let zoom = this.zoom;\n if(style.dataset && style.dataset.type) {\n zoom = 1;\n }\n\n let lineHeight = this._getLineHeight(style);\n let fontSize = Math.ceil((style.fontSize || 14) * zoom)\n\n let blockLineHeightFix = (style.dataset && style.dataset.type || '').indexOf('inline') > -1 ? 0 : (lineHeight - fontSize) / 2\n\n let top = style.padding ? (style.padding[0] || 0) : 0;\n\n // y + lineheight偏移 + 行数 + paddingTop + 整体画布位移\n return item.y + blockLineHeightFix + lineNum * lineHeight + top + this.translateY;\n }\n\n /**\n * 当文本超过宽度时,计算每一行应该绘制的文本\n * @param {*} text \n * @param {*} width \n * @param {*} singleLength \n * @param {*} currentIndex \n * @param {*} widthOffset\n */\n _getTextSingleLine(text, width, singleLength, currentIndex = 0, widthOffset = 0) {\n let offset = 0;\n let endIndex = currentIndex + singleLength + offset;\n let single = text.substring(currentIndex, endIndex);\n let singleWidth = this.measureWidth(single);\n\n while (Math.round(widthOffset + singleWidth) > width) {\n offset--;\n endIndex = currentIndex + singleLength + offset;\n single = text.substring(currentIndex, endIndex);\n singleWidth = this.measureWidth(single);\n }\n\n return {\n endIndex, \n single, \n singleWidth\n }\n }\n\n _drawBorder (border, style, callback) {\n let zoom = this.zoom;\n if(style.dataset && style.dataset.type) {\n zoom = 1;\n }\n border = Util.transferBorder(border);\n\n if (border && border.width) {\n // 空白阴影,清空掉边框的阴影\n this._drawBoxShadow();\n if (border) {\n \n this.ctx.setLineWidth(border.width * zoom);\n\n if (border.style === 'dashed') {\n let dash = style.dash || [5, 5, 0];\n let offset = dash[2] || 0;\n let array = [dash[0] || 5, dash[1] || 5];\n this.ctx.setLineDash(array, offset);\n }\n this.ctx.setStrokeStyle(border.color);\n }\n callback && callback(border);\n }\n } \n\n _drawBoxShadow (boxShadow, callback) {\n boxShadow = Util.transferBoxShadow(boxShadow);\n if (boxShadow) {\n this.ctx.setShadow(boxShadow.offsetX, boxShadow.offsetY, boxShadow.blur, boxShadow.color);\n }else {\n this.ctx.setShadow(0, 0, 0, '#ffffff');\n }\n\n callback && callback(boxShadow || {});\n }\n\n _setFill (fill, callback) {\n if(fill) {\n if (typeof fill === 'string') {\n this.ctx.setFillStyle(fill);\n } else {\n let line = fill.line;\n let color = fill.color;\n let grd = this.ctx.createLinearGradient(line[0], line[1], line[2], line[3]);\n grd.addColorStop(0, color[0]);\n grd.addColorStop(1, color[1]);\n this.ctx.setFillStyle(grd);\n }\n callback && callback();\n }\n }\n\n _setStroke (stroke, callback) {\n if(stroke) {\n if (typeof stroke === 'string') {\n this.ctx.setStrokeStyle(stroke);\n } else {\n let line = stroke.line;\n let color = stroke.color;\n let grd = this.ctx.createLinearGradient(line[0], line[1], line[2], line[3]);\n grd.addColorStop(0, color[0]);\n grd.addColorStop(1, color[1]);\n this.ctx.setStrokeStyle(grd);\n }\n\n callback && callback();\n }\n }\n}\n\nif (!exports.__esModule) Object.defineProperty(exports, \"__esModule\", { value: true });exports.default = Wxml2Canvas;","/**\n * 获取字符的长度,full为true时,一个汉字算两个长度\n * @param {String} str \n * @param {Boolean} full \n */\n\nfunction getTextLength (str, full) {\n let len = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n //单字节加1 \n if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {\n len++;\n }\n else {\n len += (full ? 2 : 1);\n }\n }\n return len;\n}\n\n/**\n * rgba(255, 255, 255, 1) => #ffffff\n * @param {String} color \n */\nfunction transferColor (color = '') {\n let res = '#';\n color = color.replace(/^rgba?\\(/, '').replace(/\\)$/, '');\n color = color.split(', ');\n \n color.length > 3 ? color.length = 3 : '';\n for(let item of color) {\n item = parseInt(item || 0);\n if(item < 10) {\n res += ('0' + item)\n }else {\n res += (item.toString(16))\n }\n }\n\n return res;\n}\n\nfunction transferBorder (border = '') {\n let res = border.match(/(\\w+)px\\s(\\w+)\\s(.*)/);\n let obj = {};\n\n if(res) {\n obj = {\n width: +res[1],\n style: res[2],\n color: res[3]\n }\n }\n \n return res ? obj : null;\n}\n\n\n/**\n * 内边距,依次为上右下左\n * @param {*} padding \n */\nfunction transferPadding (padding = '0 0 0 0') {\n padding = padding.split(' ');\n for(let i = 0, len = padding.length; i < len; i++) {\n padding[i] = +padding[i].replace('px', '');\n }\n\n return padding;\n}\n/**\n * type1: 0, 25, 17, rgba(0, 0, 0, 0.3)\n * type2: rgba(0, 0, 0, 0.3) 0px 25px 17px 0px => (0, 25, 17, rgba(0, 0, 0, 0.3))\n * @param {*} shadow \n */\nfunction transferBoxShadow(shadow = '', type) {\n if(!shadow || shadow === 'none') return;\n let color;\n let split;\n\n split = shadow.match(/(\\w+)\\s(\\w+)\\s(\\w+)\\s(rgb.*)/);\n\n if (split) {\n split.shift();\n shadow = split;\n color = split[3] || '#ffffff';\n } else {\n split = shadow.split(') ');\n color = split[0] + ')'\n shadow = split[1].split('px ');\n }\n\n return {\n offsetX: +shadow[0] || 0,\n offsetY: +shadow[1] || 0,\n blur: +shadow[2] || 0,\n color\n }\n}\n\nfunction getUid(prefix) {\n prefix = prefix || '';\n\n return (\n prefix +\n 'xxyxxyxx'.replace(/[xy]/g, c => {\n let r = (Math.random() * 16) | 0;\n let v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n })\n );\n}\n\nif (!exports.__esModule) Object.defineProperty(exports, \"__esModule\", { value: true });exports.default = {\n getTextLength,\n transferBorder,\n transferColor,\n transferPadding,\n transferBoxShadow,\n getUid\n};"]} diff --git a/src/components/ec-canvas/ec-canvas.js b/src/components/ec-canvas/ec-canvas.js new file mode 100644 index 0000000..085c902 --- /dev/null +++ b/src/components/ec-canvas/ec-canvas.js @@ -0,0 +1,269 @@ +import WxCanvas from './wx-canvas' +const echarts = require('./echarts.js') + +let ctx + +function compareVersion(v1, v2) { + v1 = v1.split('.') + v2 = v2.split('.') + const len = Math.max(v1.length, v2.length) + + while (v1.length < len) { + v1.push('0') + } + while (v2.length < len) { + v2.push('0') + } + + for (let i = 0; i < len; i++) { + const num1 = parseInt(v1[i]) + const num2 = parseInt(v2[i]) + + if (num1 > num2) { + return 1 + } else if (num1 < num2) { + return -1 + } + } + return 0 +} + +Component({ + properties: { + canvasId: { + type: String, + value: 'ec-canvas', + }, + + ec: { + type: Object, + }, + + forceUseOldCanvas: { + type: Boolean, + value: false, + }, + }, + + data: { + isUseNewCanvas: false, + }, + + ready: async function () { + // Disable prograssive because drawImage doesn't support DOM as parameter + // See https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html + echarts.registerPreprocessor((option) => { + if (option && option.series) { + if (option.series.length > 0) { + option.series.forEach((series) => { + series.progressive = 0 + }) + } else if (typeof option.series === 'object') { + option.series.progressive = 0 + } + } + }) + + if (!this.data.ec) { + console.warn( + '组件需绑定 ec 变量,例:', + ) + return + } + + if (!this.data.ec.lazyLoad) { + this.init() + } + }, + + methods: { + init: async function (callback) { + const version = wx.getSystemInfoSync().SDKVersion + + const canUseNewCanvas = compareVersion(version, '2.9.0') >= 0 + const forceUseOldCanvas = this.data.forceUseOldCanvas + const isUseNewCanvas = canUseNewCanvas && !forceUseOldCanvas + this.setData({ isUseNewCanvas }) + + if (forceUseOldCanvas && canUseNewCanvas) { + console.warn('开发者强制使用旧canvas,建议关闭') + } + + if (isUseNewCanvas) { + // console.log('微信基础库版本大于2.9.0,开始使用'); + // 2.9.0 可以使用 + this.initByNewWay(callback) + } else { + const isValid = compareVersion(version, '1.9.91') >= 0 + if (!isValid) { + console.error( + '微信基础库版本过低,需大于等于 1.9.91。' + + '参见:https://github.com/ecomfe/echarts-for-weixin' + + '#%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC%E8%A6%81%E6%B1%82', + ) + return + } else { + console.warn('建议将微信基础库调整大于等于2.9.0版本。升级后绘图将有更好性能') + this.initByOldWay(callback) + } + } + }, + + initByOldWay(callback) { + // 1.9.91 <= version < 2.9.0:原来的方式初始化 + ctx = wx.createCanvasContext(this.data.canvasId, this) + const canvas = new WxCanvas(ctx, this.data.canvasId, false) + + echarts.setCanvasCreator(() => { + return canvas + }) + // const canvasDpr = wx.getSystemInfoSync().pixelRatio // 微信旧的canvas不能传入dpr + const canvasDpr = 1 + var query = wx.createSelectorQuery().in(this) + query + .select('.ec-canvas') + .boundingClientRect((res) => { + if (typeof callback === 'function') { + this.chart = callback(canvas, res.width, res.height, canvasDpr) + } else if (this.data.ec && typeof this.data.ec.onInit === 'function') { + this.chart = this.data.ec.onInit(canvas, res.width, res.height, canvasDpr) + } else { + this.triggerEvent('init', { + canvas: canvas, + width: res.width, + height: res.height, + canvasDpr: canvasDpr, // 增加了dpr,可方便外面echarts.init + }) + } + }) + .exec() + }, + + initByNewWay(callback) { + // version >= 2.9.0:使用新的方式初始化 + const query = wx.createSelectorQuery().in(this) + query + .select('.ec-canvas') + .fields({ node: true, size: true }) + .exec((res) => { + const canvasNode = res[0].node + this.canvasNode = canvasNode + + const canvasDpr = wx.getSystemInfoSync().pixelRatio + const canvasWidth = res[0].width + const canvasHeight = res[0].height + + const ctx = canvasNode.getContext('2d') + + const canvas = new WxCanvas(ctx, this.data.canvasId, true, canvasNode) + echarts.setCanvasCreator(() => { + return canvas + }) + + if (typeof callback === 'function') { + this.chart = callback(canvas, canvasWidth, canvasHeight, canvasDpr) + } else if (this.data.ec && typeof this.data.ec.onInit === 'function') { + this.chart = this.data.ec.onInit(canvas, canvasWidth, canvasHeight, canvasDpr) + } else { + this.triggerEvent('init', { + canvas: canvas, + width: canvasWidth, + height: canvasHeight, + dpr: canvasDpr, + }) + } + }) + }, + canvasToTempFilePath(opt) { + if (this.data.isUseNewCanvas) { + // 新版 + const query = wx.createSelectorQuery().in(this) + query + .select('.ec-canvas') + .fields({ node: true, size: true }) + .exec((res) => { + const canvasNode = res[0].node + opt.canvas = canvasNode + wx.canvasToTempFilePath(opt) + }) + } else { + // 旧的 + if (!opt.canvasId) { + opt.canvasId = this.data.canvasId + } + ctx.draw(true, () => { + wx.canvasToTempFilePath(opt, this) + }) + } + }, + + touchStart(e) { + if (this.chart && e.touches.length > 0) { + var touch = e.touches[0] + var handler = this.chart.getZr().handler + handler.dispatch('mousedown', { + zrX: touch.x, + zrY: touch.y, + preventDefault: () => {}, + stopImmediatePropagation: () => {}, + stopPropagation: () => {}, + }) + handler.dispatch('mousemove', { + zrX: touch.x, + zrY: touch.y, + preventDefault: () => {}, + stopImmediatePropagation: () => {}, + stopPropagation: () => {}, + }) + handler.processGesture(wrapTouch(e), 'start') + } + }, + + touchMove(e) { + if (this.chart && e.touches.length > 0) { + var touch = e.touches[0] + var handler = this.chart.getZr().handler + handler.dispatch('mousemove', { + zrX: touch.x, + zrY: touch.y, + preventDefault: () => {}, + stopImmediatePropagation: () => {}, + stopPropagation: () => {}, + }) + handler.processGesture(wrapTouch(e), 'change') + } + }, + + touchEnd(e) { + if (this.chart) { + const touch = e.changedTouches ? e.changedTouches[0] : {} + var handler = this.chart.getZr().handler + handler.dispatch('mouseup', { + zrX: touch.x, + zrY: touch.y, + preventDefault: () => {}, + stopImmediatePropagation: () => {}, + stopPropagation: () => {}, + }) + handler.dispatch('click', { + zrX: touch.x, + zrY: touch.y, + preventDefault: () => {}, + stopImmediatePropagation: () => {}, + stopPropagation: () => {}, + }) + handler.processGesture(wrapTouch(e), 'end') + } + }, + }, +}) + +function wrapTouch(event) { + for (let i = 0; i < event.touches.length; ++i) { + const touch = event.touches[i] + touch.offsetX = touch.x + touch.offsetY = touch.y + } + return event +} diff --git a/src/components/ec-canvas/ec-canvas.json b/src/components/ec-canvas/ec-canvas.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/src/components/ec-canvas/ec-canvas.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/src/components/ec-canvas/ec-canvas.wxml b/src/components/ec-canvas/ec-canvas.wxml new file mode 100644 index 0000000..88826d9 --- /dev/null +++ b/src/components/ec-canvas/ec-canvas.wxml @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/ec-canvas/ec-canvas.wxss b/src/components/ec-canvas/ec-canvas.wxss new file mode 100644 index 0000000..5307021 --- /dev/null +++ b/src/components/ec-canvas/ec-canvas.wxss @@ -0,0 +1,5 @@ +.ec-canvas { + width: 100%; + height: 100%; + z-index: 1; +} diff --git a/src/components/ec-canvas/echarts.js b/src/components/ec-canvas/echarts.js new file mode 100644 index 0000000..69cc654 --- /dev/null +++ b/src/components/ec-canvas/echarts.js @@ -0,0 +1,25 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},r=new function(){this.browser=new i,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow="undefined"!=typeof window};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(r.wxa=!0,r.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?r.worker=!0:"undefined"==typeof navigator?(r.node=!0,r.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge?\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),o&&(n.edge=!0,n.version=o[1],n.newEdge=+o[1].split(".")[0]>18),a&&(n.weChat=!0),e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,r);var s,l,a="12px sans-serif",u=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n<95;n++){var i=String.fromCharCode(n+32),r=(t.charCodeAt(n)-20)/100;e[i]=r}return e}("007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"),h={createCanvas:function(){return"undefined"!=typeof document&&document.createElement("canvas")},measureText:function(t,e){if(!s){var n=h.createCanvas();s=n&&n.getContext("2d")}if(s)return l!==e&&(l=s.font=e||a),s.measureText(t);t=t||"";var i=/^([0-9]*?)px$/.exec(e=e||a),r=+(i&&i[1])||12,o=0;if(e.indexOf("mono")>=0)o=r*t.length;else for(var c=0;c>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),a,o);if(s)return s(t,n,i),!0}return!1}function Jt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Qt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,te=[],ee=r.browser.firefox&&+r.browser.version.split(".")[0]<39;function ne(t,e,n,i){return n=n||{},i?ie(t,e,n):ee&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):ie(t,e,n),n}function ie(t,e,n){if(r.domSupported&&t.getBoundingClientRect){var i=e.clientX,o=e.clientY;if(Jt(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=o-a.top)}if($t(te,t,i,o))return n.zrX=te[0],void(n.zrY=te[1])}n.zrX=n.zrY=0}function re(t){return t||window.event}function oe(t,e,n){if(null!=(e=re(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&ne(t,r,e,n)}else{ne(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;return null==n||null==i?e:3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&Qt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ae(t,e,n,i){t.addEventListener(e,n,i)}var se=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function le(t){return 2===t.which||3===t.which}var ue=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o1&&r&&r.length>1){var a=he(r)/he(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}};function de(){se(this.event)}var fe=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Xt),ge=function(t,e){this.x=t,this.y=e},ye=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ve=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o._hovered=new ge(0,0),o.storage=e,o.painter=n,o.painterRoot=r,i=i||new fe,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new Ut(o),o}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(E(ye,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=xe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new ge(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new ge(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:de}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new ge(t,e),o=i.length-1;o>=0;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=me(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),"silent"!==a)){r.target=i[o];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new ue);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var o=new ge;o.target=i.target,this.dispatchToElement(o,r,i.event)}},e}(Xt);function me(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}i=i.__hostTarget||i.parent}return!r||"silent"}return!1}function xe(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}function _e(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function be(t,e,n,i,r){for(i===e&&i++;i>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function we(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function Se(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function Ie(t,e,n,i){n||(n=0),i||(i=t.length);var r=i-n;if(!(r<2)){var o=0;if(r<32)be(t,n,i,n+(o=_e(t,n,i,e)),e);else{var a=function(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=Se(t[h],t,l,u,0,e);l+=p,0!=(u-=p)&&0!==(c=we(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!=(y=s-we(t[u],a,0,s,s-1,e))){for(s-=y,d=1+(c-=y),p=1+(h-=y),l=0;l=7||y>=7);if(v)break;f<0&&(f=0),f+=2}if((r=f)<1&&(r=1),1===s){for(d=1+(c-=i),p=1+(u-=i),l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else for(p=c-(s-1),l=0;l1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=_e(t,n,i,e))s&&(l=s),be(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){ve.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=xe(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Et(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));var Te=!1;function Ce(){Te||(Te=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function De(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Ae=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=De}return t.prototype.traverse=function(t,e){for(var n=0;n0&&(u.__clipPaths=[]),isNaN(u.z)&&(Ce(),u.z=0),isNaN(u.z2)&&(Ce(),u.z2=0),isNaN(u.zlevel)&&(Ce(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),ke=r.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Le={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Le.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Le.bounceIn(2*t):.5*Le.bounceOut(2*t-1)+.5}},Pe=Math.pow,Oe=Math.sqrt,Re=1e-8,Ne=1e-4,Ee=Oe(3),ze=1/3,Ve=wt(),Be=wt(),Fe=wt();function Ge(t){return t>-1e-8&&tRe||t<-1e-8}function He(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Ye(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Ue(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(Ge(h)&&Ge(c))Ge(s)?o[0]=0:(M=-l/s)>=0&&M<=1&&(o[d++]=M);else{var f=c*c-4*h*p;if(Ge(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=Oe(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-Pe(-m,ze):Pe(m,ze))+(x=x<0?-Pe(-x,ze):Pe(x,ze))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*Oe(h*h*h)),b=Math.acos(_)/3,w=Oe(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+Ee*Math.sin(b)))/(3*a),(-s+w*(S-Ee*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function Xe(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Ge(a))We(o)&&(h=-s/o)>=0&&h<=1&&(r[l++]=h);else{var u=o*o-4*a*s;if(Ge(u))r[0]=-o/(2*a);else if(u>0){var h,c=Oe(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function Ze(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function je(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;Ve[0]=l,Ve[1]=u;for(var m=0;m<1;m+=.05)Be[0]=He(t,n,r,a,m),Be[1]=He(e,i,o,s,m),(f=Vt(Ve,Be))=0&&f=0&&y=1?1:Ue(0,i,o,1,t,s)&&He(0,r,a,1,s[0])}}}var on=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||xt,this.ondestroy=t.ondestroy||xt,this.onrestart=t.onrestart||xt,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=U(t)?t:Le[t]||rn(t)},t}(),an=function(t){this.value=t},sn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new an(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),ln=function(){function t(t){this._list=new sn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new an(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),un={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function hn(t){return(t=Math.round(t))<0?0:t>255?255:t}function cn(t){return t<0?0:t>1?1:t}function pn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?hn(parseFloat(e)/100*255):hn(parseInt(e,10))}function dn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?cn(parseFloat(e)/100):cn(parseFloat(e))}function fn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function gn(t,e,n){return t+(e-t)*n}function yn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function vn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var mn=new ln(20),xn=null;function _n(t,e){xn&&vn(xn,e),xn=mn.put(t,xn||e.slice())}function bn(t,e){if(t){e=e||[];var n=mn.get(t);if(n)return vn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in un)return vn(e,un[i]),_n(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(yn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),_n(t,e),e):void yn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(yn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),_n(t,e),e):void yn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?yn(e,+u[0],+u[1],+u[2],1):yn(e,0,0,0,1);h=dn(u.pop());case"rgb":return 3!==u.length?void yn(e,0,0,0,1):(yn(e,pn(u[0]),pn(u[1]),pn(u[2]),h),_n(t,e),e);case"hsla":return 4!==u.length?void yn(e,0,0,0,1):(u[3]=dn(u[3]),wn(u,e),_n(t,e),e);case"hsl":return 3!==u.length?void yn(e,0,0,0,1):(wn(u,e),_n(t,e),e);default:return}}yn(e,0,0,0,1)}}function wn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=dn(t[1]),r=dn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return yn(e=e||[],hn(255*fn(a,o,n+1/3)),hn(255*fn(a,o,n)),hn(255*fn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Sn(t,e){var n=bn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return kn(n,4===n.length?"rgba":"rgb")}}function Mn(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=hn(gn(a[0],s[0],l)),n[1]=hn(gn(a[1],s[1],l)),n[2]=hn(gn(a[2],s[2],l)),n[3]=cn(gn(a[3],s[3],l)),n}}var In=Mn;function Tn(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=bn(e[r]),s=bn(e[o]),l=i-r,u=kn([hn(gn(a[0],s[0],l)),hn(gn(a[1],s[1],l)),hn(gn(a[2],s[2],l)),cn(gn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Cn=Tn;function Dn(t,e,n,i){var r=bn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=dn(n)),null!=i&&(r[2]=dn(i)),kn(wn(r),"rgba")}function An(t,e){var n=bn(t);if(n&&null!=e)return n[3]=cn(e),kn(n,"rgba")}function kn(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ln(t,e){var n=bn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var Pn=Object.freeze({__proto__:null,parse:bn,lift:Sn,toHex:function(t){var e=bn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:Mn,fastMapToColor:In,lerp:Tn,mapToColor:Cn,modifyHSL:Dn,modifyAlpha:An,stringify:kn,lum:Ln,random:function(){return kn([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")}}),On=Math.round;function Rn(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=bn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var Nn=1e-4;function En(t){return t-1e-4}function zn(t){return On(1e3*t)/1e3}function Vn(t){return On(1e4*t)/1e4}var Bn={left:"start",right:"end",center:"middle",middle:"middle"};function Fn(t){return t&&!!t.image}function Gn(t){return"linear"===t.type}function Wn(t){return"radial"===t.type}function Hn(t){return"url(#"+t+")"}function Yn(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function Un(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*_t,r=rt(t.scaleX,1),o=rt(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+On(a*_t)+"deg, "+On(s*_t)+"deg)"),l.join(" ")}var Xn=r.hasGlobalWindow&&U(window.btoa)?function(t){return window.btoa(unescape(t))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},Zn=Array.prototype.slice;function jn(t,e,n){return(e-t)*n+t}function qn(t,e,n,i){for(var r=e.length,o=0;oi?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;sa)i.length=a;else for(var s=o;s=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(N(e)){var l=function(t){return N(t&&t[0])?2:1}(e);a=l,(1===l&&!j(e[0])||2===l&&!j(e[0][0]))&&(o=!0)}else if(j(e)&&!nt(e))a=0;else if(X(e))if(isNaN(+e)){var u=bn(e);u&&(s=u,a=3)}else a=0;else if(Q(e)){var h=A({},s);h.colorStops=z(e.colorStops,(function(t){return{offset:t.offset,color:bn(t.color)}})),Gn(e)?a=4:Wn(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=U(n)?n:Le[n]||rn(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=ii(i),l=ni(i),u=0;u=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;ne);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?ri:t[h];if(!ii(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(ii(s))1===s?qn(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a0&&s.addKeyframe(0,ti(l),i),this._trackKeys.push(a)}s.addKeyframe(t,ti(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function si(){return(new Date).getTime()}var li,ui,hi=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=si()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,ke((function e(){t._running&&(ke(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=si(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=si(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=si()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},e.prototype.isFinished=function(){return null==this._head},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new ai(t,e.loop);return this.addAnimator(n),n},e}(Xt),ci=r.domSupported,pi=(ui={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:li=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:z(li,(function(t){var e=t.replace("mouse","pointer");return ui.hasOwnProperty(e)?e:t}))}),di=["mousemove","mouseup"],fi=["pointermove","pointerup"],gi=!1;function yi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function vi(t){t&&(t.zrByTouch=!0)}function mi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var xi=function(t,e){this.stopPropagation=xt,this.stopImmediatePropagation=xt,this.preventDefault=xt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},_i={mousedown:function(t){t=oe(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=oe(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=oe(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){mi(this,(t=oe(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){gi=!0,t=oe(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){gi||(t=oe(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){vi(t=oe(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),_i.mousemove.call(this,t),_i.mousedown.call(this,t)},touchmove:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"change"),_i.mousemove.call(this,t)},touchend:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"end"),_i.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&_i.click.call(this,t)},pointerdown:function(t){_i.mousedown.call(this,t)},pointermove:function(t){yi(t)||_i.mousemove.call(this,t)},pointerup:function(t){_i.mouseup.call(this,t)},pointerout:function(t){yi(t)||_i.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],(function(t){_i[t]=function(e){e=oe(this.dom,e),this.trigger(t,e)}}));var bi={pointermove:function(t){yi(t)||bi.mousemove.call(this,t)},pointerup:function(t){bi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function Mi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ae(t.domTarget,e,n,i)}function Ii(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var Ti=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ci=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new Ti(e,_i),ci&&(i._globalHandlerScope=new Ti(document,bi)),function(t,e){var n=e.domHandlers;r.pointerEventsSupported?E(pi.pointer,(function(i){Mi(e,i,(function(e){n[i].call(t,e)}))})):(r.touchEventsSupported&&E(pi.touch,(function(i){Mi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),E(pi.mouse,(function(i){Mi(e,i,(function(r){r=re(r),e.touching||n[i].call(t,r)}))})))}(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Ii(this._localHandlerScope),ci&&Ii(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,ci&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?function(t,e){function n(n){Mi(e,n,(function(i){i=re(i),mi(t,i.target)||(i=function(t,e){return oe(t.dom,new xi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}r.pointerEventsSupported?E(fi,n):r.touchEventsSupported||E(di,n)}(this,e):Ii(e)}},e}(Xt),Di=1;r.hasGlobalWindow&&(Di=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Ai=Di,ki="#333",Li="#ccc";function Oi(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Ri(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ni(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Ei(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function zi(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Vi(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Bi(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Fi(t){var e=[1,0,0,1,0,0];return Ri(e,t),e}var Gi=Object.freeze({__proto__:null,create:function(){return[1,0,0,1,0,0]},identity:Oi,copy:Ri,mul:Ni,translate:Ei,rotate:zi,scale:Vi,invert:Bi,clone:Fi}),Wi=Oi;function Yi(t){return t>5e-5||t<-5e-5}var Ui=[],Xi=[],Zi=[1,0,0,1,0,0],ji=Math.abs,qi=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return Yi(this.rotation)||Yi(this.x)||Yi(this.y)||Yi(this.scaleX-1)||Yi(this.scaleY-1)||Yi(this.skewX)||Yi(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):Wi(n),t&&(e?Ni(n,t,n):Ri(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&Wi(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(Ui);var n=Ui[0]<0?-1:1,i=Ui[1]<0?-1:1,r=((Ui[0]-n)*e+n)/Ui[0]||0,o=((Ui[1]-i)*e+i)/Ui[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],Bi(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Ni(Xi,t.invTransform,e),e=Xi);var n=this.originX,i=this.originY;(n||i)&&(Zi[4]=n,Zi[5]=i,Ni(Xi,e,Zi),Xi[4]-=n,Xi[5]-=i,e=Xi),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Ft(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Ft(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&ji(t[0]-1)>1e-10&&ji(t[3]-1)>1e-10?Math.sqrt(ji(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){$i(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&zi(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),Ki=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function $i(t,e){for(var n=0;nf&&(f=x,gf&&(f=_,v=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}er.x=ir.x=n.x,er.y=rr.y=n.y,nr.x=rr.x=n.x+n.width,nr.y=ir.y=n.y+n.height,er.transform(i),rr.transform(i),nr.transform(i),ir.transform(i),e.x=Qi(er.x,nr.x,ir.x,rr.x),e.y=Qi(er.y,nr.y,ir.y,rr.y);var l=tr(er.x,nr.x,ir.x,rr.x),u=tr(er.y,nr.y,ir.y,rr.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),lr={};function ur(t,e){var n=lr[e=e||a];n||(n=lr[e]=new ln(500));var i=n.get(t);return null==i&&(i=h.measureText(t,e).width,n.put(t,i)),i}function hr(t,e,n,i){var r=ur(t,e),o=fr(e),a=pr(0,r,n),s=dr(0,o,i);return new sr(a,s,r,o)}function cr(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return hr(r[0],e,n,i);for(var o=new sr(0,0,0,0),a=0;a=0?parseFloat(t)/100*e:parseFloat(t):t}function yr(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=gr(i[0],n.width),u+=gr(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var vr="__zr_normal__",mr=Ki.concat(["ignore"]),xr=V(Ki,(function(t,e){return t[e]=!0,t}),{ignore:!1}),_r={},br=new sr(0,0,0,0),wr=function(){function t(t){this.id=M(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=br;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(_r,n,u):yr(_r,n,u),r.x=_r.x,r.y=_r.y,o=_r.align,a=_r.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=gr(h[0],u.width),p=gr(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Li:ki},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&bn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,kn(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(q(t))for(var n=G(t),i=0;i0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(vr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===vr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(P(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}I("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=P(i,t),o=P(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s)for(M={},p&&(S={}),_=0;_=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=P(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=P(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Er(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function zr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Vr(t){return t.sort((function(t,e){return t-e})),t}function Br(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Fr(t)}function Fr(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function Gr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Wr(t,e,n){if(!t[e])return 0;var i=V(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),o=z(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),a=100*r,s=z(o,(function(t){return Math.floor(t)})),l=V(s,(function(t,e){return t+e}),0),u=z(o,(function(t,e){return t-s[e]}));lh&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function Hr(t,e){var n=Math.max(Br(t),Br(e)),i=t+e;return n>20?i:zr(i,n)}var Yr=9007199254740991;function Ur(t){var e=2*Math.PI;return(t%e+e)%e}function Xr(t){return t>-1e-4&&t<1e-4}var Zr=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function jr(t){if(t instanceof Date)return t;if(X(t)){var e=Zr.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=+e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0)}return null==t?new Date(NaN):new Date(Math.round(t))}function qr(t){return Math.pow(10,Kr(t))}function Kr(t){if(0===t)return 0;var e=Math.floor(Math.log(t)/Math.LN10);return t/Math.pow(10,e)>=10&&e++,e}function $r(t,e){var n=Kr(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function Jr(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function Qr(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i=0||r&&P(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var Ho=Wo([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Yo=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return Ho(this,t,e)},t}(),Uo=new ln(50);function Xo(t){if("string"==typeof t){var e=Uo.get(t);return e&&e.image}return t}function Zo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=Uo.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!qo(e=o.image)&&o.pending.push(a):((e=h.loadImage(t,jo,jo)).__zrImageSrc=t,Uo.put(t,e.__cachedImgObj={image:e,pending:[a]})),e}return t}return e}function jo(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e=a;l++)s-=a;var u=ur(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function Qo(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=ur(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?ta(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=ur(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function ta(t,e,n,i){for(var r=0,o=0,a=t.length;o0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=sa(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y=33&&e<=383}(t)||!!oa[t]}function sa(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;cn:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var la="__zr_style_"+Math.round(10*Math.random()),ua={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ha={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};ua[la]=!0;var ca=["z","z2","invisible"],pa=["invisible"],da=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=G(e),i=0;i1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ba[0]=xa(r)*n+t,ba[1]=ma(r)*i+e,wa[0]=xa(o)*n+t,wa[1]=ma(o)*i+e,u(s,ba,wa),h(l,ba,wa),(r%=_a)<0&&(r+=_a),(o%=_a)<0&&(o+=_a),r>o&&!a?o+=_a:rr&&(Sa[0]=xa(d)*n+t,Sa[1]=ma(d)*i+e,u(s,Sa,s),h(l,Sa,l))}var La={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Pa=[],Oa=[],Ra=[],Na=[],Ea=[],za=[],Va=Math.min,Ba=Math.max,Fa=Math.cos,Ga=Math.sin,Wa=Math.abs,Ha=Math.PI,Ya=2*Ha,Ua="undefined"!=typeof Float32Array,Xa=[];function Za(t){return Math.round(t/Ha*1e8)/1e8%2*Ha}function ja(t,e){var n=Za(t[0]);n<0&&(n+=Ya);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=Ya?r=n+Ya:e&&n-r>=Ya?r=n-Ya:!e&&n>r?r=n+(Ya-Za(n-r)):e&&n0&&(this._ux=Wa(n/Ai/t)||0,this._uy=Wa(n/Ai/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(La.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Wa(t-this._xi),i=Wa(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(La.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(La.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(La.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),Xa[0]=i,Xa[1]=r,ja(Xa,o),i=Xa[0];var a=(r=Xa[1])-i;return this.addData(La.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Fa(r)*n+t,this._yi=Ga(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(La.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(La.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&t.closePath(),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!Ua||(this.data=new Float32Array(e));for(var n=0;nu.length&&(this._expandData(),u=this.data);for(var h=0;h0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Ra[0]=Ra[1]=Ea[0]=Ea[1]=Number.MAX_VALUE,Na[0]=Na[1]=za[0]=za[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;tn||Wa(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case La.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=qe(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case La.Q:f=en(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case La.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1,t[c++],d&&(a=Fa(T)*M+w,s=Ga(T)*I+S),f=Ba(M,I)*Va(Ya,Math.abs(C)),r=Fa(D)*M+w,o=Ga(D)*I+S;break;case La.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case La.Z:var A=a-r;y=s-o,f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_0&&(t.lineTo(h,c),x=0),b){case La.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case La.L:a=p[_++],s=p[_++];var S=Wa(a-r),M=Wa(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case La.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){Ze(r,C,A,L,I=(u-v)/j,Pa),Ze(o,D,k,P,I,Oa),t.bezierCurveTo(Pa[1],Oa[1],Pa[2],Oa[2],Pa[3],Oa[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case La.Q:if(C=p[_++],D=p[_++],A=p[_++],k=p[_++],y){if(v+(j=l[m++])>u){Qe(r,C,A,I=(u-v)/j,Pa),Qe(o,D,k,I,Oa),t.quadraticCurveTo(Pa[1],Oa[1],Pa[2],Oa[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case La.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=Wa(N-E)>.001,H=z+V,Y=!1;if(y&&(v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j),W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=Fa(z)*N+O,i=Ga(z)*E+R),r=Fa(H)*N+O,o=Ga(H)*E+R;break;case La.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var U=p[_++],X=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Va(Z,U),s),(Z-=U)>0&&t.lineTo(a+U,s+Va(Z,X)),(Z-=X)>0&&t.lineTo(a+Ba(U-Z,0),s+X),(Z-=U)>0&&t.lineTo(a,s+Ba(X-Z,0));break t}v+=j}t.rect(a,s,U,X);break;case La.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j,t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=La,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function Ka(t,e,n,i,r,o,a){if(0===r)return!1;var l,s=r;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&h>i+c&&h>o+c&&h>s+c||ht+c&&u>n+c&&u>r+c&&u>a+c||ue+u&&l>i+u&&l>o+u||lt+u&&s>n+u&&s>r+u||sn||h+ur&&(r+=es);var p=Math.atan2(l,s);return p<0&&(p+=es),p>=i&&p<=r||p+es>=i&&p+es<=r}function is(t,e,n,i,r,o){if(o>e&&o>i||or?s:0}var rs=qa.CMD,os=2*Math.PI,as=[-1,-1,-1],ss=[-1,-1];function ls(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u1&&(void 0,h=ss[0],ss[0]=ss[1],ss[1]=h),f=He(e,i,o,s,ss[0]),d>1&&(g=He(e,i,o,s,ss[1]))),2===d?ve&&s>i&&s>o||s=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(Ge(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=Oe(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,as);if(0===l)return 0;var u=Je(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Ke(e,i,o,u),p=0;pn||s<-n)return 0;var l=Math.sqrt(n*n-s*s);as[0]=-l,as[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=os-1e-4){i=0,r=os;var h=o?1:-1;return a>=as[0]+t&&a<=as[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=os,r+=os);for(var p=0,d=0;d<2;d++){var f=as[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1,g<0&&(g=os+g),(g>=i&&g<=r||g+os>=i&&g+os<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function cs(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y1&&(n||(c+=is(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case rs.M:p=f=u[y++],d=g=u[y++];break;case rs.L:if(n){if(Ka(p,d,u[y],u[y+1],e,i,r))return!0}else c+=is(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.C:if(n){if($a(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ls(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.Q:if(n){if(Ja(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=us(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=is(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(ns(x,_,w,S,S+M,I,e,T,r))return!0}else c+=hs(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case rs.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(Ka(f,g,o,g,e,i,r)||Ka(o,g,o,a,e,i,r)||Ka(o,a,f,a,e,i,r)||Ka(f,a,f,g,e,i,r))return!0}else c+=is(o,g,o,a,i,r),c+=is(f,a,f,g,i,r);break;case rs.Z:if(n){if(Ka(p,d,f,g,e,i,r))return!0}else c+=is(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=is(p,d,f,g,i,r)||0),0!==c}var ps=k({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},ua),ds={style:k({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ha.style)},fs=Ki.concat(["invisible","culling","z","z2","zlevel","parent"]),gs=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s.5?ki:e>.2?"#eee":Li}if(t)return Li}return ki},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())==Ln(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new qa(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return cs(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return cs(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return yt(ps,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=A({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=A({},i.shape),A(s,n.shape)):(s=A({},r?this.shape:i.shape),A(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=A({},this.shape);for(var u={},h=G(s),c=0;c0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return yt(ys,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=cr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(da);vs.prototype.type="tspan";var ms=k({x:0,y:0},ua),xs={style:k({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ha.style)},_s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return yt(ms,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return xs},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new sr(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(da);_s.prototype.type="image";var bs=Math.round;function ws(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(bs(2*i)===bs(2*r)&&(t.x1=t.x2=Ms(i,s,!0)),bs(2*o)===bs(2*a)&&(t.y1=t.y2=Ms(o,s,!0)),t):t}}function Ss(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=Ms(i,s,!0),t.y=Ms(r,s,!0),t.width=Math.max(Ms(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(Ms(r+a,s,!1)-t.y,0===a?0:1),t):t}}function Ms(t,e,n){if(!e)return t;var i=bs(2*t);return(i+bs(e))%2==0?i/2:(i+(n?1:-1))/2}var Is=function(){this.x=0,this.y=0,this.width=0,this.height=0},Ts={},Cs=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Is},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=Ss(Ts,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(gs);Cs.prototype.type="rect";var Ds={fill:"#000"},As={style:k({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ha.style)},ks=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Ds,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;ed&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=Jo(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;Dl&&ra(n,t.substring(l,u),e,s),ra(n,i[2],e,s,i[1]),l=Ko.lastIndex}lo){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=ur(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&qo(k=Xo(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&Ws(l)&&this._renderBackground(l,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=Fs(r,o,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(vs),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Bs("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=Vs("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=o,f.textBaseline="middle",f.font=t.font||a,f.opacity=ot(l.opacity,e.opacity,1),Ns(f,l),x&&(f.lineWidth=ot(l.lineWidth,e.lineWidth,v),f.lineDash=rt(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new sr(pr(f.x,b,f.textAlign),dr(f.y,w,f.textBaseline),b,w))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Cs)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=rt(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(_s)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=rt(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=ot(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";return Es(t)&&(e=[t.fontStyle,t.fontWeight,Rs(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&&ut(e)||t.textFont||t.font},e}(da),Ls={left:!0,right:1,center:1},Ps={top:1,bottom:1,middle:1},Os=["fontStyle","fontWeight","fontSize","fontFamily"];function Rs(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function Ns(t,e){for(var n=0;n=0,o=!1;if(t instanceof gs){var a=Zs(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(il(s)||il(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=A({},i),(u=A({},u)).fill=s):!il(u.fill)&&il(s)?(o=!0,i=A({},i),(u=A({},u)).fill=ol(s)):!il(u.stroke)&&il(l)&&(o||(i=A({},i),u=A({},u)),u.stroke=ol(l)),i.style=u}}if(i&&null==i.z2){o||(i=A({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:$s)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=P(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Ol(t,e,n){Bl(t,!0),fl(t,vl),Nl(t,e,n)}function Rl(t,e,n,i){i?function(t){Bl(t,!1)}(t):Ol(t,e,n)}function Nl(t,e,n){var i=Hs(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var El=["emphasis","blur","select"],zl={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Vl(t,e,n,i){n=n||"itemStyle";for(var r=0;r1&&(a*=jl(f),s*=jl(f));var g=(r===o?-1:1)*jl((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+Kl(c)*y-ql(c)*v,x=(e+i)/2+ql(c)*y+Kl(c)*v,_=tu([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=tu(b,w);if(Ql(b,w)<=-1&&(S=$l),Ql(b,w)>=1&&(S=0),S<0){var M=Math.round(S/$l*1e6)/1e6;S=2*$l+M%2*$l}h.addData(u,m,x,a,s,_,S,c,o)}var nu=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,iu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g,ru=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(gs);function ou(t){return null!=t.setData}function au(t,e){var n=function(t){var e=new qa;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=qa.CMD,l=t.match(nu);if(!l)return e;for(var u=0;uk*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}var Tu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Cu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Tu},e.prototype.buildPath=function(t,e){!function(t,e){var n,i=bu(e.r,0),r=bu(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=xu(l-s),d=p>fu&&p%fu;if(d>Su&&(p=d),i>Su)if(p>fu-Su)t.moveTo(u+i*yu(s),h+i*gu(s)),t.arc(u,h,i,s,l,!c),r>Su&&(t.moveTo(u+r*yu(l),h+r*gu(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*yu(s),L=i*gu(s),P=r*yu(l),O=r*gu(l),R=p>Su;if(R){var N=e.cornerRadius;N&&(f=(n=function(t){var e;if(Y(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N))[0],g=n[1],y=n[2],v=n[3]);var E=xu(i-r)/2;if(m=wu(E,y),x=wu(E,v),_=wu(E,f),b=wu(E,g),M=w=bu(m,x),I=S=bu(_,b),(w>Su||S>Su)&&(T=i*yu(l),C=i*gu(l),D=r*yu(s),A=r*gu(s),pSu){var U=wu(y,M),X=wu(v,M),Z=Mu(D,A,k,L,i,U,c),j=Mu(T,C,P,O,i,X,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M0&&t.arc(u+Z.cx,h+Z.cy,U,mu(Z.y0,Z.x0),mu(Z.y1,Z.x1),!c),t.arc(u,h,i,mu(Z.cy+Z.y1,Z.cx+Z.x1),mu(j.cy+j.y1,j.cx+j.x1),!c),X>0&&t.arc(u+j.cx,h+j.cy,X,mu(j.y1,j.x1),mu(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);r>Su&&R?I>Su?(U=wu(f,I),Z=Mu(P,O,T,C,r,-(X=wu(g,I)),c),j=Mu(k,L,D,A,r,-U,c),t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I0&&t.arc(u+Z.cx,h+Z.cy,X,mu(Z.y0,Z.x0),mu(Z.y1,Z.x1),!c),t.arc(u,h,r,mu(Z.cy+Z.y1,Z.cx+Z.x1),mu(j.cy+j.y1,j.cx+j.x1),c),U>0&&t.arc(u+j.cx,h+j.cy,U,mu(j.y1,j.x1),mu(j.y0,j.x0),!c))):(t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c)):t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(gs);Cu.prototype.type="sector";var Du=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Au=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Du},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(gs);function ku(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;pqu[1]){if(a=!1,r)return a;var u=Math.abs(qu[0]-ju[1]),h=Math.abs(ju[0]-qu[1]);Math.min(u,h)>i.len()&&(u0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function rh(t,e,n,i,r,o){ih("update",t,e,n,i,r,o)}function oh(t,e,n,i,r,o){ih("enter",t,e,n,i,r,o)}function ah(t){if(!t.__zr)return!0;for(var e=0;eMath.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Dh(t){return!t.isGroup}function Ah(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Dh(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Dh(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),rh(t,i,n,Hs(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=A({},t.shape)),e}}function kh(t,e){return z(t,(function(t){var n=t[0];n=ch(n,e.x),n=ph(n,e.x+e.width);var i=t[1];return i=ch(i,e.y),[n,i=ph(i,e.y+e.height)]}))}function Lh(t,e){var n=ch(t.x,e.x),i=ph(t.x+t.width,e.x+e.width),r=ch(t.y,e.y),o=ph(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Ph(t,e,n){var i=A({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),k(r,n),new _s(i)):xh(t.replace("path://",""),i,n,"center")}function Oh(t,e,n,i,r){for(var o=0,a=r[r.length-1];o=-1e-6)return!1;var f=t-r,g=e-o,y=Nh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=Nh(f,g,c,p)/d;return!(v<0||v>1)}function Nh(t,e,n,i){return t*i-n*e}function Eh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&E(G(l),(function(t){mt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=Hs(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:k({content:i,formatterParams:s},r)}}function zh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function Vh(t,e){if(t)if(Y(t))for(var n=0;n-1?"ZH":"EN";function Sc(t,e){t=t.toUpperCase(),bc[t]=new dc(e),_c[t]=e}function Mc(t){return bc[t]}Sc("EN",{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Sc("ZH",{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var Dc=864e5,Ac=31536e6,kc={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},Pc={year:"{yyyy}",month:"{yyyy}-{MM}",day:"{yyyy}-{MM}-{dd}",hour:"{yyyy}-{MM}-{dd} "+kc.hour,minute:"{yyyy}-{MM}-{dd} "+kc.minute,second:"{yyyy}-{MM}-{dd} "+kc.second,millisecond:kc.none},Oc=["year","month","day","hour","minute","second","millisecond"],Rc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function Nc(t,e){return"0000".substr(0,e-(t+="").length)+t}function Ec(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function zc(t){return t===Ec(t)}function Vc(t,e,n,i){var r=jr(t),o=r[Gc(n)](),a=r[Wc(n)]()+1,s=Math.floor((a-1)/3)+1,l=r[Hc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[Yc(n)](),c=(h-1)%12+1,p=r[Uc(n)](),d=r[Xc(n)](),f=r[Zc(n)](),g=(i instanceof dc?i:Mc(i||wc)||bc.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),x=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,Nc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,Nc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,x[u]).replace(/{e}/g,u+"").replace(/{HH}/g,Nc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,Nc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,Nc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,Nc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,Nc(f,3)).replace(/{S}/g,f+"")}function Bc(t,e){var n=jr(t),i=n[Wc(e)]()+1,r=n[Hc(e)](),o=n[Yc(e)](),a=n[Uc(e)](),s=n[Xc(e)](),l=0===n[Zc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Fc(t,e,n){var i=j(t)?jr(t):t;switch(e=e||Bc(t,n)){case"year":return i[Gc(n)]();case"half-year":return i[Wc(n)]()>=6?1:0;case"quarter":return Math.floor((i[Wc(n)]()+1)/4);case"month":return i[Wc(n)]();case"day":return i[Hc(n)]();case"half-day":return i[Yc(n)]()/24;case"hour":return i[Yc(n)]();case"minute":return i[Uc(n)]();case"second":return i[Xc(n)]();case"millisecond":return i[Zc(n)]()}}function Gc(t){return t?"getUTCFullYear":"getFullYear"}function Wc(t){return t?"getUTCMonth":"getMonth"}function Hc(t){return t?"getUTCDate":"getDate"}function Yc(t){return t?"getUTCHours":"getHours"}function Uc(t){return t?"getUTCMinutes":"getMinutes"}function Xc(t){return t?"getUTCSeconds":"getSeconds"}function Zc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function jc(t){return t?"setUTCFullYear":"setFullYear"}function qc(t){return t?"setUTCMonth":"setMonth"}function Kc(t){return t?"setUTCDate":"setDate"}function $c(t){return t?"setUTCHours":"setHours"}function Jc(t){return t?"setUTCMinutes":"setMinutes"}function Qc(t){return t?"setUTCSeconds":"setSeconds"}function tp(t){return t?"setUTCMilliseconds":"setMilliseconds"}function ep(t){if(!eo(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function np(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var ip=st,rp=/([&<>"'])/g,op={"&":"&","<":"<",">":">",'"':""","'":"'"};function ap(t){return null==t?"":(t+"").replace(rp,(function(t,e){return op[e]}))}function sp(t,e,n){function i(t){return t&&ut(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?jr(t):t;if(!isNaN(+s))return Vc(s,"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return Z(t)?i(t):j(t)&&r(t)?t+"":"-";var l=to(t);return r(l)?ep(l):Z(t)?i(t):"boolean"==typeof t?t+"":"-"}var lp=["a","b","c","d","e","f","g"],up=function(t,e){return"{"+t+(null==e?"":e)+"}"};function hp(t,e,n){Y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function pp(t,e){return e=e||"transparent",X(t)?t:q(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function dp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var fp=E,gp=["left","right","top","bottom","width","height"],yp=[["width","left","right"],["height","top","bottom"]];function vp(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var mp=vp;function xp(t,e,n){n=ip(n||0);var i=e.width,r=e.height,o=Er(t.left,i),a=Er(t.top,r),s=Er(t.right,i),l=Er(t.bottom,r),u=Er(t.width,i),h=Er(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new sr(o+n[3],a+n[0],u,h);return f.margin=n,f}function _p(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new sr(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=xp(k({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function bp(t){var e=t.layoutMode||t.constructor.layoutMode;return q(e)?e:e?{type:e}:null}function wp(t,e,n){var i=n&&n.ignoreSize;!Y(i)&&(i=[i,i]);var r=a(yp[0],0),o=a(yp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(fp(n,(function(e){u[e]=t[e]})),fp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c=0;a--)o=C(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ao(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.prototype.getZLevelKey=function(){return""},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(dc);zo(Tp,dc),Go(Tp),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=No(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=No(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Tp),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return E(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return E(t,(function(t){P(e,t)>=0&&n.push(t)})),n}(a.originalDeps=function(t){var e=[];return E(Tp.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=z(e,(function(t){return No(t).main})),"dataset"!==t&&P(e,"dataset")<=0&&e.unshift("dataset"),e}(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),E(s,(function(t){P(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);P(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(E(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,(function(){throw new Error("")}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Tp);var Cp="";"undefined"!=typeof navigator&&(Cp=navigator.platform||"");var Dp="rgba(0, 0, 0, 0.2)",Ap={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Dp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Dp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Dp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Dp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Dp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Dp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Cp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},kp=ft(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),Lp="original",Pp="arrayRows",Op="objectRows",Rp="keyedColumns",Np="typedArray",Ep="unknown",zp="column",Vp="row",Bp=1,Fp=2,Gp=3,Wp=So();function Hp(t,e,n){var i={},r=Up(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Wp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;E(t=t.slice(),(function(e,n){var r=q(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;ie)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var id=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new dc(i),this._locale=new dc(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=ad(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,ad(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):$p(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&E(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ft(),s=e&&e.replaceMergeMainTypeMap;Wp(this).datasetMap=ft(),E(t,(function(t,e){null!=t&&(Tp.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?T(t):C(n[e],t,!0))})),s&&s.each((function(t,e){Tp.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Tp.topologicalTravel(o,Tp.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=jp.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,ho(t[e])),a=i.get(e),u=yo(a,o,a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll");(function(t,e,n){E(t,(function(t){var i=t.newOption;q(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Tp),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;E(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Tp.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=A({componentIndex:n},t.keyInfo);A(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&qp(this)}),this),this._seriesIndices||qp(this)},e.prototype.getOption=function(){var t=T(this.option);return E(t,(function(e,n){if(Tp.hasClass(n)){for(var i=ho(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!bo(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var fd=E,gd=q,yd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function vd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=yd.length;n=0;g--){var y=t[g];if(s||(p=y.data.rawIndexOf(y.stackedByDimension,c)),p>=0){var v=y.data.getByRawIndex(y.stackResultDimension,p);if("all"===l||"positive"===l&&v>0||"negative"===l&&v<0||"samesign"===l&&d>=0&&v>0||"samesign"===l&&d<=0&&v<0){d=Hr(d,v),f=v;break}}}return i[0]=d,i[1]=f,i}))}))}var Nd,Ed,zd,Vd,Bd,Fd=function(t){this.data=t.data||(t.sourceFormat===Rp?{}:[]),this.sourceFormat=t.sourceFormat||Ep,this.seriesLayoutBy=t.seriesLayoutBy||zp,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;nu&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return af(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function uf(t){var e,n;return q(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function hf(t){return new cf(t)}var cf=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p1&&i>0?s:a}};return o;function a(){return e=t?null:oe},gte:function(t,e){return t>=e}},vf=function(){function t(t,e){if(!j(e)){ao("")}this._opFn=yf[t],this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){return j(t)?this._opFn(t,this._rvalFloat):this._opFn(to(t),this._rvalFloat)},t}(),mf=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=j(t)?t:to(t),i=j(e)?e:to(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return ni?-this._resultLT:0},t}(),xf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=to(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function _f(t,e){return"eq"===t||"ne"===t?new xf("eq"===t,e):mt(yf,t)?new vf(t,e):null}var bf=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return df(t,e)},t}();function wf(t){if(!Df(t.sourceFormat)){ao("")}return t.data}function Sf(t){var e=t.sourceFormat,n=t.data;if(!Df(e)){ao("")}if(e===Pp){for(var r=[],o=0,a=n.length;o65535?Lf:Pf}function zf(t,e,n,i,r){var o=Nf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;ug[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=z(o,(function(t){return t.property})),u=0;uy[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e=0&&e=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r=u&&x<=h||isNaN(x))&&(a[s++]=d),d++;p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;gt[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return sy[1]&&(y[1]=g)}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Ef(this._rawCount))(Math.min(2*(Math.ceil(s/u)+2),s));c[l++]=h;for(var p=1;pn&&(n=i,r=I)}M>0&&M<_-x&&(c[l++]=Math.min(S,r),r=Math.max(S,r)),c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Ef(this._rawCount))(Math.ceil(u/s)),p=0,d=0;du-d&&(s=u-d,a.length=s);for(var f=0;fh[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();ra&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return df(t[i],this._dimensions[i])}Af={arrayRows:t,objectRows:function(t,e,n,i){return df(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return df(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Bf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Gf(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=$(a=o.get("data",!0))?Np:Lp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=rt(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=rt(h.sourceHeader,c.sourceHeader),f=rt(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Wd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else t=[Wd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){1!==t.length&&Wf("")}var a,s=[],l=[];return E(t,(function(t){t.prepareSource();var e=t.getSource(r||0);null==r||e||Wf(""),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=ho(t),r=i.length;r||ao("");for(var a=0,s=r;a1||n>0&&!t.noHeader;return E(t.blocks,(function(t){var n=qf(t);n>=e&&(e=n+ +(i&&(!n||Zf(t)&&!t.noHeader)))})),e}return 0}function Kf(t,e,n,i){var r,o=e.noHeader,a=(r=qf(e),{html:Yf[r],richText:Uf[r]}),s=[],l=e.blocks||[];lt(!l||Y(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(mt(h,u)){var c=new mf(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}E(l,(function(n,r){var o=e.valueFormatter,l=jf(n)(o?A(A({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):Qf(s.join(""),o?n:a.html);if(o)return p;var d=sp(e.header,"ordinal",t.useUTC),f=Hf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?tg(t,d,f)+a.richText+p:Qf('
'+ap(d)+"
"+p,n)}function $f(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return z(t=Y(t)?t:[t],(function(t,e){return sp(t,Y(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":sp(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value),g=!s||!o,y=!s&&o,v=Hf(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":tg(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(Y(e)?e.join(" "):e,o)}(t,f,g,y,x)):Qf((s?"":c)+(o?"":function(t,e,n){return''+ap(t)+""}(p,!s,m))+(a?"":function(t,e,n,i){return''+z(t=Y(t)?t:[t],(function(t){return ap(t)})).join("  ")+""}(f,g,y,x)),n)}}function Jf(t,e,n,i,r,o){if(t)return jf(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function Qf(t,e){return'
'+t+'
'}function tg(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function eg(t,e){return pp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function ng(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var ig=function(){function t(){this.richTextStyles={},this._nextStyleNameId=no()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=cp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};Y(e)?E(e,(function(t){return A(n,t)})):A(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function rg(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=Y(c),d=eg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=V(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(Xf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?E(i,(function(t){h(af(o,n,t),t)})):E(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=af(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=_o(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return Xf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[Xf("nameValue",{markerType:"item",markerColor:d,name:x,noName:!ut(x),value:e,valueType:n})].concat(i||[])})}var og=So();function ag(t,e){return t.getName(e)||t.getId(e)}var sg=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=hf({count:ug,reset:hg}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(og(this).sourceManager=new Bf(this)).prepareSource();var i=this.getInitialData(t,n);pg(i,this),this.dataTask.context.data=i,og(this).dataBeforeProcessed=i,lg(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{},r=this.subType;Tp.hasClass(r)&&(r+="Series"),C(t,e.getTheme().get(this.subType)),C(t,this.getDefaultOption()),co(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&wp(t,i,n)},e.prototype.mergeOption=function(t,e){t=C(this.option,t,!0),this.fillDataTextStyle(t.data);var n=bp(this);n&&wp(this.option,t,n);var i=og(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);pg(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,og(this).dataBeforeProcessed=r,lg(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!$(t))for(var e=["show"],n=0;nthis.getShallow("animationThreshold")&&(e=!1),!!e},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=td.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[ag(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){q(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Tp.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Tp);function lg(t){var e=t.name;_o(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return E(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function ug(t){return t.model.getRawData().count()}function hg(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),cg}function cg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function pg(t,e){E(gt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,H(dg,e))}))}function dg(t,e){var n=fg(t);return n&&n.setOutputEnd((e||this).count()),e}function fg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}R(sg,lf),R(sg,td),zo(sg,Tp);var gg=function(){function t(){this.group=new Cr,this.uid=gc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.toggleBlurSeries=function(t,e,n){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function yg(){var t=So();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Eo(gg),Go(gg);var vg=So(),mg=yg(),xg=function(){function t(){this.group=new Cr,this.uid=gc("viewChart"),this.renderTask=hf({plan:wg,reset:Sg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&bg(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&bg(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){Vh(this.group,t)},t.markUpdateMethod=function(t,e){vg(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function _g(t,e,n){t&&Fl(t)&&("emphasis"===e?_l:bl)(t,n)}function bg(t,e,n){var i=wo(t,e),r=e&&null!=e.highlightKey?function(t){var e=Xs[t];return null==e&&Us<=32&&(e=Xs[t]=Us++),e}(e.highlightKey):null;null!=i?E(ho(i),(function(e){_g(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){_g(t,n,r)}))}function wg(t){return mg(t.model)}function Sg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&vg(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),Mg[l]}Eo(xg),Go(xg);var Mg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Ig="\0__throttleOriginMethod",Tg="\0__throttleRate",Cg="\0__throttleType";function Dg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Ag(t,e,n,i){var r=t[e];if(r){var o=r[Ig]||r,a=r[Cg];if(r[Tg]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Dg(o,n,"debounce"===i))[Ig]=o,r[Cg]=i,r[Tg]=n}return r}}function kg(t,e){var n=t[e];n&&n[Ig]&&(n.clear&&n.clear(),t[e]=n[Ig])}var Lg=So(),Pg={itemStyle:Wo(hc,!0),lineStyle:Wo(sc,!0)},Og={lineStyle:"stroke",itemStyle:"fill"};function Rg(t,e){return t.visualStyleMapper||Pg[e]||(console.warn("Unkown style type '"+e+"'."),Pg.itemStyle)}function Ng(t,e){return t.visualDrawType||Og[e]||(console.warn("Unkown style type '"+e+"'."),"fill")}var Eg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=Rg(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=Ng(t,i),l=o[s],u=U(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||U(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||U(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=A({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},zg=new dc,Vg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Rg(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){zg.option=n[i];var a=r(zg);A(t.ensureUniqueItemVisual(e,"style"),a),zg.option.decal&&(t.setItemVisual(e,"decal",zg.option.decal),zg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Bg={performRawSeries:!0,overallReset:function(t){var e=ft();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),Lg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=Lg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=Ng(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Fg=Math.PI,Gg=function(){function t(t,e,n,i){this._stageTaskMap=ft(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ft();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;E(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{});lt(!(i.reset&&i.overallReset),""),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ft(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||hf({plan:Xg,reset:Zg,count:Kg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||hf({reset:Wg});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ft(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1;function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,hf({reset:Hg,onDirty:Ug})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}lt(!t.createOnAllSeries,""),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,E(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return U(t)&&(t={overallReset:t,seriesType:$g(t)}),t.uid=gc("stageHandler"),e&&(t.visualType=e),t},t}();function Wg(t){t.overallReset(t.ecModel,t.api,t.payload)}function Hg(t){return t.overallProgress&&Yg}function Yg(){this.agent.dirty(),this.getDownstream().dirty()}function Ug(){this.agent&&this.agent.dirty()}function Xg(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Zg(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=ho(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?z(e,(function(t,e){return qg(e)})):jg}var jg=qg(0);function qg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),hy=["symbol","symbolSize","symbolRotate","symbolOffset"],cy=hy.concat(["symbolKeepAspect"]),py={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a=0&&Ry(l)?l:.5,t.createRadialGradient(a,s,0,a,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=Ry(i)?i:0,r=Ry(r)?r:1,o=Ry(o)?o:0,a=Ry(a)?a:0,t.createLinearGradient(i,o,r,a)}(t,e,n),r=e.colorStops,o=0;o0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:j(e)?[e]:Y(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=z(r,(function(t){return t/a})),o/=a)}return[r,o]}var By=new qa(!0);function Fy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function Gy(t){return"string"==typeof t&&"none"!==t}function Wy(t){var e=t.fill;return null!=e&&"none"!==e}function Hy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Yy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function Uy(t,e,n){var i=Zo(e.image,e.__image,n);if(qo(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*_t),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var Xy=["shadowBlur","shadowOffsetX","shadowOffsetY"],Zy=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function jy(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){$y(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?ua.opacity:a}(i||e.blend!==n.blend)&&(o||($y(t,r),o=!0),t.globalCompositeOperation=e.blend||ua.blend);for(var s=0;s0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,e,n){if(!this.__flagInMainProcess)if(this._disposed)Hv(this.id);else{var i,r,o;if(q(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new pd(this._api),s=this._theme,l=this._model=new id;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},Zv);var u={seriesTransition:o,optionChanged:!0};if(n)this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp();else{try{_v(this),Sv.update.call(this,null,u)}catch(t){throw this.__pendingUpdate=null,this.__flagInMainProcess=!1,t}this._ssr||this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,Cv.call(this,i),Dv.call(this,i)}}},e.prototype.setTheme=function(){},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||cv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){return t=t||{},this._zr.painter.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){return t=t||{},this._zr.painter.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(r.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;E(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return E(i,(function(t){t.group.ignore=!1})),o}Hv(this.id)},e.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(Jv[n]){var a=o,s=o,l=-1/0,u=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();E($v,(function(o,h){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(T(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),u=r(d.bottom,u),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(u*=p)-(s*=p),g=h.createCanvas(),y=Lr(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return E(c,(function(t){var e=t.left-a,n=t.top-s;v+=''+t.dom+""})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Cs({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),E(c,(function(t){var e=new _s({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}Hv(this.id)},e.prototype.convertToPixel=function(t,e){return Mv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return Mv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return E(Io(this._model,t),(function(t,i){i.indexOf("Models")>=0&&E(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}}),this)}),this),!!n;Hv(this.id)},e.prototype.getVisual=function(t,e){var n=Io(this._model,t,{defaultMainType:"series"}),r=n.seriesModel.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?fy(r,o,e):gy(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;E(Wv,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target;if("globalout"===t?n={}:o&&xy(o,(function(t){var e=Hs(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=A({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),E(Uv,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),E(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(my("map","selectchanged",e,i,t),my("pie","selectchanged",e,i,t)):"select"===t.fromAction?(my("map","selected",e,i,t),my("pie","selected",e,i,t)):"unselect"===t.fromAction&&(my("map","unselected",e,i,t),my("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?Hv(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)Hv(this.id);else{this._disposed=!0,this.getDom()&&ko(this.getDom(),em,"");var t=this,e=t._api,n=t._model;E(t._componentsViews,(function(t){t.dispose(n,e)})),E(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete $v[t.id]}},e.prototype.resize=function(t){if(!this.__flagInMainProcess)if(this._disposed)Hv(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0;try{n&&_v(this),Sv.update.call(this,{type:"resize",animation:A({duration:0},t&&t.animation)})}catch(t){throw this.__flagInMainProcess=!1,t}this.__flagInMainProcess=!1,Cv.call(this,i),Dv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)Hv(this.id);else if(q(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Kv[t]){var n=Kv[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?Hv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=Uv[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)Hv(this.id);else if(q(e)||(e={silent:!!e}),Yv[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Tv.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&r.browser.weChat&&this._throttledZrFlush(),Cv.call(this,n),Dv.call(this,n)}},e.prototype.updateLabelLayout=function(){lv.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)Hv(this.id);else{var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function e(t){for(var e=[],n=t.currentStates,i=0;i0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.eachRendered((function(t){if(t.states&&t.states.emphasis){if(ah(t))return;if(t instanceof gs&&function(t){var e=Zs(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var n=t.prevStates;n&&t.useStates(n)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&e(t)}}))}_v=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),bv(t,!0),bv(t,!1),e.plan()},bv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;le.get("hoverLayerThreshold")&&!r.node&&!r.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),lv.trigger("series:afterupdate",e,n,l)},Ev=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},zv=function(t){t.__needsUpdateStatus&&(t.getZr().storage.traverse((function(t){ah(t)||e(t)})),t.__needsUpdateStatus=!1)},Rv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){_l(e,n),Ev(t)},i.prototype.leaveEmphasis=function(e,n){bl(e,n),Ev(t)},i.prototype.enterBlur=function(e){wl(e),Ev(t)},i.prototype.leaveBlur=function(e){Sl(e),Ev(t)},i.prototype.enterSelect=function(e){Ml(e),Ev(t)},i.prototype.leaveSelect=function(e){Il(e),Ev(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(ld))(t)},Nv=function(t){function e(t,e){for(var n=0;n=0)){gm.push(n);var o=Gg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function vm(t,e){Kv[t]=e}function mm(t,e,n){var i=hv("registerMap");i&&i(t,e,n)}var xm=function(t){var e=(t=T(t)).type;e||ao("");var i=e.split(":");2!==i.length&&ao("");var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,Tf.set(e,t)};fm(2e3,Eg),fm(4500,Vg),fm(4500,Bg),fm(2e3,py),fm(4500,dy),fm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=rv(n,e))}));var r=i.getVisual("decal");r&&(i.getVisual("style").decal=rv(r,e))}}))})),am(Od),sm(900,(function(t){var e=ft();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(Rd)})),vm("default",(function(t,e){k(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Cr,i=new Cs({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new ks({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Cs({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new Hu({shape:{startAngle:-Fg/2,endAngle:-Fg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Fg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Fg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),cm({type:Js,event:Js,update:Js},xt),cm({type:Qs,event:Qs,update:Qs},xt),cm({type:tl,event:tl,update:tl},xt),cm({type:el,event:el,update:el},xt),cm({type:nl,event:nl,update:nl},xt),om("light",iy),om("dark",ly);var _m=[],bm={registerPreprocessor:am,registerProcessor:sm,registerPostInit:lm,registerPostUpdate:um,registerUpdateLifecycle:hm,registerAction:cm,registerCoordinateSystem:pm,registerLayout:dm,registerVisual:fm,registerTransform:xm,registerLoading:vm,registerMap:mm,registerImpl:function(t,e){uv[t]=e},PRIORITY:fv,ComponentModel:Tp,ComponentView:gg,SeriesModel:sg,ChartView:xg,registerComponentModel:function(t){Tp.registerClass(t)},registerComponentView:function(t){gg.registerClass(t)},registerSeriesModel:function(t){sg.registerClass(t)},registerChartView:function(t){xg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Tp.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Pr(t,e)}};function wm(t){Y(t)?E(t,(function(t){wm(t)})):P(_m,t)>=0||(_m.push(t),U(t)&&(t={install:t}),t.install(bm))}function Sm(t){return null==t?0:t.length||1}function Mm(t){return t}var Im=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||Mm,this._newKeyGetter=i||Mm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p1)for(var a=0;a30}var zm,Vm,Bm,Fm,Gm,Wm,Hm,Ym=q,Um=z,Xm="undefined"==typeof Int32Array?Array:Int32Array,Zm=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],jm=["_approximateExtent"],qm=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Om(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===Lp&&!n.pure)for(var o=[],a=t;a0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(Y(r=this.getVisual(e))?r=r.slice():Ym(r)&&(r=A({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,Ym(e)?A(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){Ym(t)?A(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;Ys(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){E(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:Um(this.dimensions,this._getDimInfo,this),this.hostModel)),Gm(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];U(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(at(arguments)))})},t.internalField=(zm=function(t){var e=t._invertedIndicesMap;E(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new Xm(o.categories.length);for(var s=0;s1&&(s+="__ec__"+u),i[e]=s}})),t}();function Km(t,e){Gd(t)||(t=Hd(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ft(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return E(e,(function(t){var e;q(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&Em(a),l=i===t.dimensionsDefine,u=l?Nm(t):Rm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ft(h),p=new Of(a),d=0;d0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new Pm({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function $m(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var Jm=function(t){this.coordSysDims=[],this.axisMap=ft(),this.categoryAxisMap=ft(),this.coordSysName=t},Qm={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Co).models[0],o=t.getReferringComponents("yAxis",Co).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),tx(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),tx(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Co).models[0];e.coordSysDims=["single"],n.set("single",r),tx(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Co).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),tx(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),tx(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();E(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),tx(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function tx(t){return"category"===t.get("type")}function ex(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Om(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(E(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;E(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function nx(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function ix(t,e){return nx(t,e)?t.getCalculationInfo("stackResultDimension"):e}function rx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=Hd(t)):o=(i=r.getSource()).sourceFormat===Lp;var a=function(t){var e=t.get("coordinateSystem"),n=new Jm(e),i=Qm[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=hd.get(i);return e&&e.coordSysDims&&(n=z(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Dm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=U(l)?l:l?H(Hp,s,e):null,h=Km(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&E(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=ex(e,{schema:h,store:p}),f=new qm(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===Lp)return!Y(fo(function(t){for(var e=0;ee[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Go(ox);var ax=0,sx=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++ax}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&z(i,lx);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ft(this.categories))},t}();function lx(t){return q(t)&&null!=t.value?t.value:t+""}function ux(t){return"interval"===t.type||"log"===t.type}function cx(t){var e=Math.pow(10,Kr(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,zr(n*e)}function px(t){return Br(t)+2}function dx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function fx(t,e){return t>=e[0]&&t<=e[1]}function gx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function yx(t,e){return t*(e[1]-e[0])+e[0]}var vx=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new sx({})),Y(i)&&(i=new sx({categories:z(i,(function(t){return q(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return null==t?NaN:X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return fx(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return gx(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(yx(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r=0&&t=0&&t=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type="ordinal",e}(ox);ox.registerClass(vx);var mx=zr,xx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return fx(t,this._extent)},e.prototype.normalize=function(t){return gx(t,this._extent)},e.prototype.scale=function(t){return yx(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=px(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:mx(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;ri[0]&&hi&&(a=r.interval=i);var s=r.intervalPrecision=px(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),dx(t,0,e),dx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[zr(Math.ceil(t[0]/a)*a,s),zr(Math.floor(t[1]/a)*a,s)],t),r}(i,t,e,n);this._intervalPrecision=o.intervalPrecision,this._interval=o.interval,this._niceExtent=o.niceTickExtent}},e.prototype.calcNiceExtent=function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax||(e[1]+=n/2),e[0]-=n/2}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=mx(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=mx(Math.ceil(e[1]/r)*r))},e.prototype.setNiceExtent=function(t,e){this._niceExtent=[t,e]},e.type="interval",e}(ox);ox.registerClass(xx);var _x="undefined"!=typeof Float32Array,bx=_x?Float32Array:Array;function Sx(t){return Y(t)?_x?new Float32Array(t):t:new bx(t)}var Mx="__ec_stack_";function Ix(t){return t.get("stack")||Mx+t.seriesIndex}function Tx(t){return t.dim+t.index}function Cx(t,e){var n=[];return e.eachSeriesByType(t,(function(t){Px(t)&&n.push(t)})),n}function Dx(t){var e=function(t){var e={};E(t,(function(t){var n=t.coordinateSystem.getBaseAxis();if("time"===n.type||"value"===n.type)for(var i=t.getData(),r=n.dim+"_"+n.index,o=i.getDimensionIndex(i.mapDimension(n.dim)),a=i.getStore(),s=0,l=a.count();s0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return E(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Er(t.get("barWidth"),i),d=Er(t.get("barMaxWidth"),i),f=Er(t.get("barMinWidth")||(Ox(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:Tx(r),stackId:Ix(t)})})),Ax(n)}function Ax(t){var e={};E(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=G(i).length;o=Math.max(35-4*a,15)+"%"}var s=Er(o,r),l=Er(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),E(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width)i=t.width,e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--;else{var i=c;e&&ei&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;E(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;E(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function kx(t,e){var n=Cx(t,e),i=Dx(n);E(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Ix(t),o=i[Tx(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function Lx(t){return{seriesType:t,plan:yg(),reset:function(t){if(Px(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=nx(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}(0,r),d=Ox(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&Sx(3*r),u=d&&s&&Sx(3*r),m=d&&Sx(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);h&&(I=n.dataToPoint([T,M])[0]),C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)0)for(var s=0;s=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(Y(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return Vc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var o=Rc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}var x=B(z(u,(function(t){return B(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;dn&&(this._approxInterval=n);var o=Nx.length,a=Math.min(function(t,e,n,i){for(;n>>1;t[r][1]16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function zx(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Vx(t){return(t/=36e5)>12?12:t>6?6:t>3.5?4:t>2?2:1}function Bx(t,e){return(t/=e?6e4:1e3)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Fx(t){return $r(t,!0)}function Gx(t,e,n){var i=new Date(t);switch(Ec(e)){case"year":case"month":i[qc(n)](0);case"day":i[Kc(n)](1);case"hour":i[$c(n)](0);case"minute":i[Jc(n)](0);case"second":i[Qc(n)](0),i[tp(n)](0)}return i.getTime()}ox.registerClass(Rx);var Wx=ox.prototype,Hx=xx.prototype,Yx=zr,Ux=Math.floor,Xx=Math.ceil,Zx=Math.pow,jx=Math.log,qx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new xx,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return z(Hx.getTicks.call(this,t),(function(t){var e=t.value,r=zr(Zx(this.base,e));return r=e===n[0]&&this._fixMin?$x(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?$x(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=jx(t)/jx(n),e=jx(e)/jx(n),Hx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Wx.getExtent.call(this);e[0]=Zx(t,e[0]),e[1]=Zx(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=$x(e[0],n[0])),this._fixMax&&(e[1]=$x(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=jx(t[0])/jx(e),t[1]=jx(t[1])/jx(e),Wx.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=qr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[zr(Xx(e[0]/i)*i),zr(Ux(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.calcNiceExtent=function(t){Hx.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return fx(t=jx(t)/jx(this.base),this._extent)},e.prototype.normalize=function(t){return gx(t=jx(t)/jx(this.base),this._extent)},e.prototype.scale=function(t){return t=yx(t,this._extent),Zx(this.base,t)},e.type="log",e}(ox),Kx=qx.prototype;function $x(t,e){return Yx(t,Br(e))}Kx.getMinorTicks=Hx.getMinorTicks,Kx.getLabel=Hx.getLabel,ox.registerClass(qx);var Jx=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[t_[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){this[Qx[t]]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),Qx={min:"_determinedMin",max:"_determinedMax"},t_={min:"_dataMin",max:"_dataMax"};function e_(t,e,n){var i=t.rawExtentInfo;return i||(i=new Jx(t,e,n),t.rawExtentInfo=i,i)}function n_(t,e){return null==e?null:nt(e)?NaN:t.parse(e)}function i_(t,e){var n=t.type,i=e_(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=Cx("bar",a),l=!1;if(E(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Dx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[Tx(e)];return i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;E(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;E(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function r_(t,e){var n=e,i=i_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof qx&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function o_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new vx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Rx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(ox.getClass(e)||xx)}}function a_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):U(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(s_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function s_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function l_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new sr(t.x,t.y,o,a)}function u_(t){var e=t.get("interval");return null==e?"auto":e}function h_(t){return"category"===t.type&&0===u_(t.getLabelModel())}function c_(t,e){var n={};return E(t.mapDimensionsAll(e),(function(e){n[ix(t,e)]=!0})),G(n)}var p_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}(),d_={isDimensionStacked:nx,enableDataStack:ex,getStackedDimension:ix},f_=Object.freeze({__proto__:null,createList:function(t){return rx(null,t)},getLayoutRect:xp,dataStack:d_,createScale:function(t,e){var n=e;e instanceof dc||(n=new dc(e));var i=o_(n);return i.setExtent(t[0],t[1]),r_(i,n),i},mixinAxisModelCommonMethods:function(t){R(t,p_)},getECData:Hs,createTextStyle:function(t,e){return Uh(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return Km(t,e).dimensions},createSymbol:Ly,enableHoverEmphasis:Ol});function g_(t,e){return Math.abs(t-e)<1e-8}function y_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;on&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function C_(t,e){return z(B((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),E(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=T_(r,i,n);break;case"Polygon":case"MultiLineString":I_(r,i,n);break;case"MultiPolygon":E(r,(function(t,e){return I_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new b_(o[0],o.slice(1)));break;case"MultiPolygon":E(i.coordinates,(function(t){t[0]&&r.push(new b_(t[0],t.slice(1)))}));break;case"LineString":r.push(new w_([i.coordinates]));break;case"MultiLineString":r.push(new w_(i.coordinates))}var a=new S_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var D_=Object.freeze({__proto__:null,linearMap:Nr,round:zr,asc:Vr,getPrecision:Br,getPrecisionSafe:Fr,getPixelPrecision:Gr,getPercentWithPrecision:Wr,MAX_SAFE_INTEGER:Yr,remRadian:Ur,isRadianAroundZero:Xr,parseDate:jr,quantity:qr,quantityExponent:Kr,nice:$r,quantile:Jr,reformIntervals:Qr,isNumeric:eo,numericToNumber:to}),A_=Object.freeze({__proto__:null,parse:jr,format:Vc}),k_=Object.freeze({__proto__:null,extendShape:fh,extendPath:yh,makePath:xh,makeImage:_h,mergePath:wh,resizePath:Sh,createIcon:Ph,updateProps:rh,initProps:oh,getTransform:Ih,clipPointsByRect:kh,clipRectByRect:Lh,registerShape:vh,getShapeClass:mh,Group:Cr,Image:_s,Text:ks,Circle:hu,Ellipse:pu,Sector:Cu,Ring:Au,Polygon:Pu,Polyline:Ru,Rect:Cs,Line:zu,BezierCurve:Gu,Arc:Hu,IncrementalDisplayable:th,CompoundPath:Yu,LinearGradient:Xu,RadialGradient:Zu,BoundingRect:sr}),L_=Object.freeze({__proto__:null,addCommas:ep,toCamelCase:np,normalizeCssArray:ip,encodeHTML:ap,formatTpl:hp,getTooltipMarker:cp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=jr(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t.replace("MM",Nc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",Nc(o%100+"",2)).replace("dd",Nc(s,2)).replace("d",s).replace("hh",Nc(l,2)).replace("h",l).replace("mm",Nc(u,2)).replace("m",u).replace("ss",Nc(h,2)).replace("s",h).replace("SSS",Nc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:$o,getTextRect:function(t,e,n,i,r,o,a,s){return new ks({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),P_=Object.freeze({__proto__:null,map:z,each:E,indexOf:P,inherits:O,reduce:V,filter:B,bind:W,curry:H,isArray:Y,isString:X,isObject:q,isFunction:U,extend:A,defaults:k,clone:T,merge:C}),O_=So();function E_(t,e){var n,i,r=z_(t,"labels"),o=u_(e);return V_(r,o)||(U(o)?n=G_(t,o):(i="auto"===o?function(t){var e=O_(t).autoInterval;return null!=e?e:O_(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=F_(t,i)),B_(r,o,{labels:n,labelCategoryInterval:i}))}function z_(t,e){return O_(t)[e]||(O_(t)[e]=[])}function V_(t,e){for(var n=0;n1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=h_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function G_(t,e,n){var i=t.scale,r=a_(t),o=[];return E(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var W_=[0,1],H_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Gr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Y_(n=n.slice(),i.count()),Nr(t,W_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Y_(n=n.slice(),i.count());var r=Nr(t,n,W_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=z(function(t,e){return"category"===t.type?function(t,e){var n,i,r=z_(t,"ticks"),o=u_(e),a=V_(r,o);if(a)return a;if(e.get("show")&&!t.scale.isBlank()||(n=[]),U(o))n=G_(t,o,!0);else if("auto"===o){var s=E_(t,t.getLabelModel());i=s.labelCategoryInterval,n=z(s.labels,(function(t){return t.tickValue}))}else n=F_(t,i=o,!0);return B_(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:z(t.scale.getTicks(),(function(t){return t.value}))}}(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(t.onBand&&!n&&r){var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;E(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift()),i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]}),c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop()),i&&c(o.coord,s[1])&&e.push({coord:s[1]})}function c(t,e){return t=zr(t),e=zr(e),h?t>e:t0&&t<100||(t=5),z(this.scale.getMinorTicks(t),(function(t){return z(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return function(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=E_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=a_(t);return{labels:z(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=a_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=cr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=O_(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function Y_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var U_=2*Math.PI,X_=qa.CMD,Z_=["top","right","bottom","left"];function j_(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function q_(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%U_<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=ts(r),r=ts(p)}else i=ts(i),r=ts(r);i>r&&(r+=U_);var d=Math.atan2(s,a);if(d<0&&(d+=U_),d>=i&&d<=r||d+U_>=i&&d+U_<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m0){e=e/180*Math.PI,eb.fromArray(t[0]),nb.fromArray(t[1]),ib.fromArray(t[2]),Ji.sub(rb,eb,nb),Ji.sub(ob,ib,nb);var n=rb.len(),i=ob.len();if(!(n<.001||i<.001)){rb.scale(1/n),ob.scale(1/i);var r=rb.dot(ob);if(Math.cos(e)1&&Ji.copy(lb,ib),lb.toArray(t[1])}}}}function hb(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,eb.fromArray(t[0]),nb.fromArray(t[1]),ib.fromArray(t[2]),Ji.sub(rb,nb,eb),Ji.sub(ob,ib,nb);var i=rb.len(),r=ob.len();if(!(i<.001||r<.001)&&(rb.scale(1/i),ob.scale(1/r),rb.dot(e)=a)Ji.copy(lb,ib);else{lb.scaleAndAdd(ob,o/Math.tan(Math.PI/2-s));var l=ib.x!==nb.x?(lb.x-nb.x)/(ib.x-nb.x):(lb.y-nb.y)/(ib.y-nb.y);if(isNaN(l))return;l<0?Ji.copy(lb,nb):l>1&&Ji.copy(lb,ib)}lb.toArray(t[1])}}}function cb(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function pb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Et(i[0],i[1]),o=Et(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Bt([],i[1],i[0],a/r),l=Bt([],i[1],i[2],a/o),u=Bt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o0)for(l=0;l0;l--)_(-o[l-1]*c,l,a)}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function vb(t,e,n,i){return yb(t,"y","height",e,n,i)}function mb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new sr(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r=0&&n.attr(d.oldLayoutSelect),P(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),rh(n,s,e,a)}else if(n.attr(s),!Jh(n).valueAnimation){var h=rt(n.style.opacity,1);n.style.opacity=0,oh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Ib(c,s,Tb),Ib(c,n.states.select,Tb)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Ib(p,s,Tb),Ib(p,n.states.emphasis,Tb)}tc(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=Mb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),rh(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,oh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Db=So(),Ab=Math.sin,kb=Math.cos,Lb=Math.PI,Pb=2*Math.PI,Ob=180/Lb,Rb=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var d,l=a-o,u=!s,h=Math.abs(l),c=En(h-Pb)||(u?l>=Pb:-l>=Pb),p=l>0?l%Pb:l%Pb+Pb;d=!!c||!En(h)&&p>=Lb==!!u;var f=t+n*kb(o),g=e+i*Ab(o);this._start&&this._add("M",f,g);var y=Math.round(r*Ob);if(c){var v=1/this._p,m=(u?1:-1)*(Pb-v);this._add("A",n,i,y,1,+u,t+n*kb(o+m),e+i*Ab(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*kb(a),_=e+i*Ab(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c"}(r,e.attrs)+(e.text||"")+(i?""+n+z(i,(function(e){return t(e)})).join(n)+n:"")+""}(t)}function Ub(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Xb(t,e,n,i){return Hb("svg","root",{width:t,height:e,xmlns:Fb,"xmlns:xlink":Gb,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Zb={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},jb="transform-origin";function qb(t,e,n){var i=A({},t.shape);A(i,e),t.buildPath(n,i);var r=new Rb;return r.reset(Yn(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function Kb(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[jb]=n+"px "+i+"px")}var $b={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function Jb(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function Qb(t){return X(t)?Zb[t]?"cubic-bezier("+Zb[t]+")":rn(t)?t:"":""}function tw(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof Yu){if(y=function(t,e,n){var i,r,o=t.shape.paths,a={};if(E(o,(function(t){var e=Ub(n.zrId);e.animation=!0,tw(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=G(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=Jb(a,n);return i.replace(r,s)}}(t,e,n))a.push(y);else if(!o)return}else if(!o)return;for(var s={},l=0;l0})).length)return Jb(h,n)+" "+r[0]+" both"}for(var g in s){var y;(y=f(s[g]))&&a.push(y)}if(a.length){var v=n.zrId+"-cls-"+n.cssClassIdx++;n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}var ew=Math.round;function nw(t){return t&&X(t.src)}function iw(t){return t&&U(t.toDataURL)}function rw(t,e,n,i){(function(t,e,n,i){var r=null==e.opacity?1:e.opacity;if(n instanceof _s)t("opacity",r);else{if(function(t){var e=t.fill;return null!=e&&e!==Nb}(e)){var o=Rn(e.fill);t("fill",o.color);var a=null!=e.fillOpacity?e.fillOpacity*o.opacity*r:o.opacity*r;(i||a<1)&&t("fill-opacity",a)}else t("fill",Nb);if(function(t){var e=t.stroke;return null!=e&&e!==Nb}(e)){var s=Rn(e.stroke);t("stroke",s.color);var l=e.strokeNoScale?n.getLineScale():1,u=l?(e.lineWidth||0)/l:0,h=null!=e.strokeOpacity?e.strokeOpacity*s.opacity*r:s.opacity*r,c=e.strokeFirst;if((i||1!==u)&&t("stroke-width",u),(i||c)&&t("paint-order",c?"stroke":"fill"),(i||h<1)&&t("stroke-opacity",h),e.lineDash){var p=Vy(n),d=p[0],f=p[1];d&&(f=Eb(f||0),t("stroke-dasharray",d.join(",")),(f||i)&&t("stroke-dashoffset",f))}else i&&t("stroke-dasharray",Nb);for(var g=0;gl?Dw(t,null==n[c+1]?null:n[c+1].elm,n,s,c):Aw(t,e,a,l))}(n,i,r):Mw(r)?(Mw(t.text)&&bw(n,""),Dw(n,null,r,0,r.length-1)):Mw(i)?Aw(n,i,0,i.length-1):Mw(t.text)&&bw(n,""):t.text!==e.text&&(Mw(i)&&Aw(n,i,0,i.length-1),bw(n,e.text)))}var Pw=0,Ow=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=function(){},this.configLayer=function(){},this.storage=e,this._opts=n=A({},n),this.root=t,this._id="zr"+Pw++,this._oldVNode=Xb(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=Wb("svg");kw(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(Tw(t,e))Lw(t,e);else{var n=t.elm,i=xw(n);Cw(e),null!==i&&(yw(i,e.elm,_w(n)),Aw(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return dw(t,Ub(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._backgroundColor,i=this._width,r=this._height,o=Ub(this._id);o.animation=t.animation,o.willUpdate=t.willUpdate,o.compress=t.compress;var a=[];if(n&&"none"!==n){var s=Rn(n),l=s.color,u=s.opacity;this._bgVNode=Hb("rect","bg",{width:i,height:r,x:"0",y:"0",id:"0",fill:l,"fill-opacity":u}),a.push(this._bgVNode)}else this._bgVNode=null;var h=t.compress?null:this._mainVNode=Hb("g","main",{},[]);this._paintList(e,o,h?h.children:a),h&&a.push(h);var c=z(G(o.defs),(function(t){return o.defs[t]}));if(c.length&&a.push(Hb("defs","defs",{},c)),t.animation){var p=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=z(G(t),(function(e){return e+r+z(G(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=z(G(e),(function(t){return"@keyframes "+t+r+z(G(e[t]),(function(n){return n+r+z(G(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?[""].join(i):""}(o.cssNodes,o.cssAnims,{newline:!0});if(p){var d=Hb("style","stl",{},[],p);a.push(d)}}return Xb(i,r,a,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},Yb(this.renderToVNode({animation:rt(t.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:rt(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t;var e=this._bgVNode;if(e&&e.elm){var n=Rn(t),i=n.color,r=n.opacity;e.elm.setAttribute("fill",i),r<1&&e.elm.setAttribute("fill-opacity",r)}},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y=a)}}for(var h=this.__startIndex;h15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b0&&t>i[0]){for(s=0;st);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i0?.01:0),this._needsManuallyCompositing),u.__builtin__||I("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?C(n[t],e,!0):n[t]=e;for(var i=0;i-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},e}(sg);function Ww(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=af(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a=0&&i.push(e[o])}return i.join(" ")}var Yw=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=Ly(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=Uw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){_l(this.childAt(0))},e.prototype.downplay=function(){bl(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t,e){var n=this.childAt(0);n.draggable=t,n.cursor=!e&&t?"move":n.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):rh(p,c,a,n),hh(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);u||(c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}},p.scaleX=p.scaleY=0,p.style.opacity=0,oh(p,c,a,n))}u&&this.childAt(0).stopAnimation("leave")},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=Yh(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Oy(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof _s){var w=f.style;f.useStyle(A({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(A({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;Hh(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):Ww(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");if(T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a,p){var C=Math.max(j(p)?p:1.1,3/this._sizeY);T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C}this.setSymbolScale(1),Rl(this,l,u,h)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e,n){var i=this.childAt(0),r=Hs(this).dataIndex,o=n&&n.animation;if(this.silent=i.silent=!0,n&&n.fadeLabel){var a=i.getTextContent();a&&sh(a,{style:{opacity:0}},e,{dataIndex:r,removeOpt:o,cb:function(){i.removeTextContent()}})}else i.removeTextContent();sh(i,{style:{opacity:0},scaleX:0,scaleY:0},e,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return Py(t.getItemVisual(e,"symbolSize"))},e}(Cr);function Uw(t,e){this.parent.drift(t,e)}function Xw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Zw(t){return null==t||q(t)||(t={isIgnore:t}),t||{}}function jw(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:Yh(e),cursorStyle:e.get("cursor")}}var qw=function(){function t(t){this.group=new Cr,this._SymbolCtor=t||Yw}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=Zw(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=jw(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(Xw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(Xw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):rh(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}),i)})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=jw(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=Zw(n);for(var r=t.start;r0?n=i[0]:i[1]<0&&(n=i[1]),n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=z(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return nx(e,c[0])&&(p=!0,c[0]=d),nx(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function $w(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var Jw=Math.min,Qw=Math.max;function tS(t,e){return isNaN(t)||isNaN(e)}function eS(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y=r||g<0)break;if(tS(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y=i||tS(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=Jw(D=v+T*a*I,Qw(w,v)),A=Jw(A,Qw(S,m)),D=Qw(D,Jw(w,v)),f=m-(C=(A=Qw(A,Jw(S,m)))-m)*R/N,d=Jw(d=v-(T=D-v)*R/N,Qw(u,v)),f=Jw(f,Qw(h,m)),D=v+(T=v-(d=Qw(d,Jw(u,v))))*N/R,A=m+(C=m-(f=Qw(f,Jw(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var nS=function(){this.smooth=0,this.smoothConstraint=!0},iS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new nS},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&tS(n[2*r-2],n[2*r-1]);r--);for(;i=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?Ue(n,u,c,d,t,s):Ue(i,h,p,f,t,s);if(v>0)for(var m=0;m=0)return y=a?He(i,h,p,f,x):He(n,u,c,d,x),a?[t,y]:[y,t]}n=d,i=f}}},e}(gs),rS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(nS),oS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new rS},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&tS(n[2*o-2],n[2*o-1]);o--);for(;r=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=z(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:Tn((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;se){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";E(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new Xu(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function yS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;ai)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return E(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function vS(t,e){return[t[2*e],t[2*e+1]]}function mS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e0&&"bolder"===t.get(["emphasis","lineStyle","width"])&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1),Hs(d).seriesIndex=t.seriesIndex,Rl(d,L,P,O);var R=dS(t.get("smooth")),N=t.get("smoothMonotone");if(d.setShape({smooth:R,smoothMonotone:N,connectNulls:w}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(k(l.getAreaStyle(),{fill:C,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=dS(E.get("smooth"))),f.setShape({smooth:R,stackedOnSmooth:z,smoothMonotone:N,connectNulls:w}),Vl(f,t,"areaStyle"),Hs(f).seriesIndex=t.seriesIndex,Rl(f,L,P,O)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=T,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},e.prototype.packEventData=function(t,e){Hs(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel"),c=t.get("z");(s=new Yw(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else xg.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else xg.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;gl(this._polyline,t),e&&gl(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new iS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new oS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");U(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=U(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=U(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(mS(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new ks({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(Hh(o,Yh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?Hw(r,n):Ww(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=vS(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Po(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=vS(u,A),r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}r&&Jh(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o,a){var s=this._polyline,l=this._polygon,u=t.hostModel,h=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=Kw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x3e3||l&&pS(p,f)>3e3)return s.stopAnimation(),s.setShape({points:d}),void(l&&(l.stopAnimation(),l.setShape({points:d,stackedOnPoints:f})));s.shape.__points=h.current,s.shape.points=c;var g={shape:{points:d}};h.current!==c&&(g.shape.__points=h.next),s.stopAnimation(),rh(s,g,u),l&&(l.setShape({points:c,stackedOnPoints:p}),l.stopAnimation(),rh(l,{shape:{stackedOnPoints:f}},u),s.shape.points!==l.shape.points&&(l.shape.points=s.shape.points));for(var y=[],v=h.status,m=0;me&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(isFinite(p)&&p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=wS[r]:U(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,SS))}}}}}var IS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(sg);sg.registerClass(IS);var TS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return rx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=yc(IS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(IS),CS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},DS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new CS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-lo)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){uh(e,t,Hs(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(xg),RS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=LS(e.x,t.x),s=PS(e.x+e.width,r),l=LS(e.y,t.y),u=PS(e.y+e.height,o),h=sr?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=PS(e.r,t.r),o=LS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;return n<0&&(i=e.r,e.r=e.r0,e.r0=i),a}},NS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Cs({shape:A({},i),z2:1});return u.__dataIndex=n,u.name="item",o&&(u.shape[r?"height":"width"]=0),u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?DS:Cu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=WS(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===DS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return yr(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+AS(f,o+v,!1),b=l+d*x(f)+kS(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+AS(f,-o+v,!1),b=l+d*x(f)+kS(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+AS(g,o+v,!0),b=l+d*x(g)+kS(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+AS(g,-o+v,!0),b=l+d*x(g)+kS(g,-o+v,!0),w="right",S="middle";break;default:return yr(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?rh:oh)(h,{shape:g},o)}return h}};function ES(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?rh:oh)(n,{shape:l},e,r,null),(a?rh:oh)(n,{shape:u},e?t.baseAxis.model:null,r)}function zS(t,e){for(var n=0;n0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function WS(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function HS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=Yh(i);Hh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Ww(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if(j(i))t.setTextConfig({rotation:i});else if(Y(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===d?h:d,WS(a),i.get(["label","rotate"]))}Qh(p,c,o.getRawValue(n),(function(t){return Hw(e,t)}));var f=i.getModel(["emphasis"]);Rl(t,f.get("focus"),f.get("blurScope"),f.get("disabled")),Vl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",E(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var YS=function(){},US=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new YS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);Hs(this).dataIndex=e>=0?e:null}),30,!1);function jS(t,e,n){if(uS(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var qS=2*Math.PI,KS=Math.PI/180;function $S(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function JS(t,e){var n=$S(t,e),i=t.get("center"),r=t.get("radius");Y(r)||(r=[0,r]),Y(i)||(i=[i,i]);var o=Er(n.width,e.getWidth()),a=Er(n.height,e.getHeight()),s=Math.min(o,a);return{cx:Er(i[0],o)+n.x,cy:Er(i[1],a)+n.y,r0:Er(r[0],s/2),r:Er(r[1],s/2)}}function QS(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=$S(t,n),o=JS(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*KS,c=t.get("minAngle")*KS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var x=qS,_=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:qS/p)n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function rM(t){return"center"===t.position}function aM(t,e,n){var i=t.get("borderRadius");if(null==i)return n?{cornerRadius:0}:null;Y(i)||(i=[i,i,i,i]);var r=Math.abs(e.r||0-e.r0||0);return{cornerRadius:z(i,(function(t){return gr(t,r)}))}}var sM=function(t){function e(e,n,i){var r=t.call(this)||this;r.z2=2;var o=new ks;return r.setTextContent(o),r.updateData(e,n,i,!0),r}return n(e,t),e.prototype.updateData=function(t,e,n,i){var r=this,o=t.hostModel,a=t.getItemModel(e),s=a.getModel("emphasis"),l=t.getItemLayout(e),u=A(aM(a.getModel("itemStyle"),l,!0),l);if(isNaN(u.startAngle))r.setShape(u);else{if(i){r.setShape(u);var h=o.getShallow("animationType");o.ecModel.ssr?(oh(r,{scaleX:0,scaleY:0},o,{dataIndex:e,isFrom:!0}),r.originX=u.cx,r.originY=u.cy):"scale"===h?(r.shape.r=l.r0,oh(r,{shape:{r:l.r}},o,e)):null!=n?(r.setShape({startAngle:n,endAngle:n}),oh(r,{shape:{startAngle:l.startAngle,endAngle:l.endAngle}},o,e)):(r.shape.endAngle=l.startAngle,rh(r,{shape:{endAngle:l.endAngle}},o,e))}else hh(r),rh(r,{shape:u},o,e);r.useStyle(t.getItemVisual(e,"style")),Vl(r,a);var c=(l.startAngle+l.endAngle)/2,p=o.get("selectedOffset"),d=Math.cos(c)*p,f=Math.sin(c)*p,g=a.getShallow("cursor");g&&r.attr("cursor",g),this._updateLabel(o,t,e),r.ensureState("emphasis").shape=A({r:l.r+(s.get("scale")&&s.get("scaleSize")||0)},aM(s.getModel("itemStyle"),l)),A(r.ensureState("select"),{x:d,y:f,shape:aM(a.getModel(["select","itemStyle"]),l)}),A(r.ensureState("blur"),{shape:aM(a.getModel(["blur","itemStyle"]),l)});var y=r.getTextGuideLine(),v=r.getTextContent();y&&A(y.ensureState("select"),{x:d,y:f}),A(v.ensureState("select"),{x:d,y:f}),Rl(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))}},e.prototype._updateLabel=function(t,e,n){var i=this,r=e.getItemModel(n),o=r.getModel("labelLine"),a=e.getItemVisual(n,"style"),s=a&&a.fill,l=a&&a.opacity;Hh(i,Yh(r),{labelFetcher:e.hostModel,labelDataIndex:n,inheritColor:s,defaultOpacity:l,defaultText:t.getFormattedLabel(n,"normal")||e.getName(n)});var u=i.getTextContent();i.setTextConfig({position:null,rotation:null}),u.attr({z2:10});var h=t.get(["label","position"]);if("outside"!==h&&"outer"!==h)i.removeTextGuideLine();else{var c=this.getTextGuideLine();c||(c=new Ru,this.setTextGuideLine(c)),db(this,fb(r),{stroke:s,opacity:ot(o.get(["lineStyle","opacity"]),l,1)})}},e}(Cu),lM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.ignoreLabelLineUpdate=!0,e}return n(e,t),e.prototype.render=function(t,e,n,i){var r,o=t.getData(),a=this._data,s=this.group;if(!a&&o.count()>0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G)F=k<0?-A+B:-A;else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;Y.y-=U/2,Y.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ji(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p=n.r0}},e.type="pie",e}(xg);function uM(t,e,n){e=Y(e)&&{coordDimensions:e}||A({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=Km(i,e).dimensions,o=new qm(r,t);return o.initData(i,n),o}var hM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),cM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=Wr(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(sg),pM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(sg),dM=function(){},fM=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.getDefaultShape=function(){return new dM},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),yM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=bS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new gM:new qw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(xg),vM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Tp),mM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Co).models[0]},e.type="cartesian2dAxis",e}(Tp);R(mM,p_);var xM={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},_M=C({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},xM),bM=C({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},xM),wM={category:_M,value:bM,time:C({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},bM),log:k({logBase:10},bM)},SM={value:1,category:1,time:1,log:1};function MM(t,e,i,r){E(SM,(function(o,a){var s=C(C({},wM[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{};C(t,e.getTheme().get(a+"Axis")),C(t,this.getDefaultOption()),t.type=IM(t),n&&wp(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=sx.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",IM)}function IM(t){return t.type||(t.data?"category":"value")}var TM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return z(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),B(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),CM=["x","y"];function DM(t){return"interval"===t.type||"time"===t.type}var AM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=CM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(DM(t)&&DM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=Bi([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.containZone=function(t,e){var n=this.dataToPoint(t),i=this.dataToPoint(e),r=this.getArea(),o=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]);return r.intersect(o)},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Ft(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Ft(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new sr(n,i,r,o)},e}(TM),kM=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(H_);function LM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1),o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),it(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function PM(t){return"cartesian2d"===t.get("coordinateSystem")}function OM(t){var e={xAxisModel:null,yAxisModel:null};return E(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Co).models[0];e[i]=o})),e}var RM=Math.log;function NM(t,e,n){var i=xx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=i_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=RM(t.base);u=[RM(u[0])/p,RM(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;yu[0]&&isFinite(g)&&isFinite(u[0]);)f=cx(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=cx(f));var v=f*a;(g=zr((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=zr(v)):y>0&&u[1]<=0&&(y=0,g=-zr(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var EM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=CM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=G(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;ux(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(r_(l,s),ux(l)&&(e=a))}r.length&&(e||r_((e=r.pop()).scale,e.model),E(r,(function(t){NM(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};E(n.x,(function(t){VM(n,"y",t,r)})),E(n.y,(function(t){VM(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=xp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){E(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(E(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof vx?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=a_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h0&&i>0||n<0&&i<0)}(t)}var FM=Math.PI,GM=function(){function t(t,e){this.group=new Cr,this.opt=e,this.axisModel=t,k(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Cr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!WM[t]},t.prototype.add=function(t){WM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=Ur(e-t);return Xr(o)?(r=n>0?"top":"bottom",i="center"):Xr(o-FM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),WM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0];a&&(Ft(s,s,a),Ft(l,l,a));var u=A({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new zu({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]);if(null!=c){var p=e.get(["axisLine","symbolSize"]);X(c)&&(c=[c,c]),(X(p)||j(p))&&(p=[p,p]);var d=Oy(e.get(["axisLine","symbolOffset"])||0,p),f=p[0],g=p[1];E([{rotate:t.rotation+Math.PI/2,offset:d[0],r:0},{rotate:t.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=Ly(c[i],-f/2,-g/2,f,g,u.stroke,!0),o=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+o*Math.cos(t.rotation),y:s[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");if("auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick")),a&&!r.scale.isBlank()){for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=XM(r.getTicksCoords(),e.transform,l,k(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;hc[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,UM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*FM/180),UM(s)?o=GM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=Ur(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return Xr(a-FM/2)?(o=l?"bottom":"top",r="center"):Xr(a-1.5*FM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*FM&&a>FM/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=it(t.nameTruncateMaxWidth,y.maxWidth,a),x=new ks({x:d[0],y:d[1],rotation:o.rotation,silent:GM.isLabelSilent(e),style:Uh(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(Eh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=GM.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,Hs(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function HM(t){t&&(t.ignore=!0)}function YM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Oi([]);return zi(r,r,-t.rotation),n.applyTransform(Ni([],r,t.getLocalTransform())),i.applyTransform(Ni([],r,e.getLocalTransform())),n.intersect(i)}}function UM(t){return"middle"===t||"center"===t}function XM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l=0||t===e}function KM(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[JM(t)]}function $M(t){return!!t.get(["handle","show"])}function JM(t){return t.type+"||"+t.id}var QM={},tI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(e,n,i,r){this.axisPointerClass&&function(t){var e=KM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=$M(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=k({color:c.color},a));var d=C(T(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else U(l)&&(d.name=l(d.name,d));var g=new dc(d,null,this.ecModel);return R(g,p_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:C({lineStyle:{color:"#bbb"}},xI.axisLine),axisLabel:_I(xI.axisLabel,!1),axisTick:_I(xI.axisTick,!1),splitLine:_I(xI.splitLine,!0),splitArea:_I(xI.splitArea,!0),indicator:[]},e}(Tp),wI=["axisLine","axisTickLabel","axisName"],SI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;E(z(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new GM(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){E(wI,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=Y(h)?h:[h],d=Y(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x3?1.4:r>1?1.2:1.1;LI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);LI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){DI(this._zr,"globalPan")||LI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Xt);function LI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(se(i.event),PI(t,e,n,i,r))}function PI(t,e,n,i,r){r.isAvailableBehavior=W(OI,null,n,i),t.trigger(e,r)}function OI(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function RI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function NI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var EI,zI={axisPointer:1,tooltip:1,brush:1};function VI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!zI.hasOwnProperty(i.mainType)&&r&&r.model!==n}function BI(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var FI={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},GI=G(FI),WI={"alignment-baseline":"textBaseline","stop-color":"stopColor"},HI=G(WI),YI=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=BI(t);this._defsUsePending=[];var i=new Cr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),KI(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=oT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Cr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Cs({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=EI[s];if(u&&mt(EI,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=UI[s];if(p&&mt(UI,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new vs({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});jI(e,n),KI(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(EI={g:function(t,e){var n=new Cr;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Cs;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new hu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new zu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new pu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=qI(i));var r=new Pu({shape:{points:n||[]},silent:!0});return jI(e,r),KI(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=qI(i));var r=new Ru({shape:{points:n||[]},silent:!0});return jI(e,r),KI(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new _s;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Cr;return jI(e,a),KI(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Cr;return jI(e,a),KI(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=su(t.getAttribute("d")||"");return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),UI={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new Xu(e,n,i,r);return XI(t,o),ZI(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Zu(e,n,i);return XI(t,r),ZI(t,r),r}};function XI(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function ZI(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var r,i=n.getAttribute("offset");r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};rT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function jI(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),k(e.__inheritedStyle,t.__inheritedStyle))}function qI(t){for(var e=tT(t),n=[],i=0;i0;o-=2){var a=i[o],s=i[o-1],l=tT(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":Ei(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Vi(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":zi(r,r,-parseFloat(l[0])*nT);break;case"skewX":Ni(r,[1,0,Math.tan(parseFloat(l[0])*nT),1,0,0],r);break;case"skewY":Ni(r,[1,Math.tan(parseFloat(l[0])*nT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),rT(t,a,s),i||function(t,e,n){for(var i=0;i0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ft(),n=ft(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;Hh(e,Yh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(TT(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function PT(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):Hs(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function OT(t,e,n,i,r){t.data||Eh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function RT(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Rl(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=Hs(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function NT(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),E(t,(function(t){s.lineStart();for(var e=0;e-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(sg);function VT(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),E(e,(function(t,e){for(var n,i,r,o=(n=z(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},E(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=xp(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center"),e),this.setZoom(t.get("zoom"))}R(UT,GT);var jT=new(function(){function t(){this.dimensions=YT}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new UT(o+r,o,A({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=ZT,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),E(r,(function(t,r){var o=z(t,(function(t){return t.get("nameMap")})),a=new UT(r,r,A({nameMap:D(o)},i(t[0])));a.zoomLimit=it.apply(null,z(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=ZT,a.resize(t[0],e),E(t,(function(t){t.coordinateSystem=a,function(t,e){E(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ft(),a=0;a=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=oC(s),o=aC(o),s&&o;){r=oC(r),a=aC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(lC(sC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!oC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!aC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function nC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function iC(t){return arguments.length?t:uC}function rC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function oC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function aC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function sC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function lC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function uC(t,e){return t.parentNode===e.parentNode?1:2}var hC=function(){this.parentPoint=[],this.childPoints=[]},cC=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new hC},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Er(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;pm.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),A="relative"===D?gt(a.getAncestorsIndices(),a.getDescendantIndices()):"ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;A&&(Hs(n).focus=A),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Gu({shape:mC(h,c,p,r,r)})),rh(g,{shape:mC(h,c,p,o,a)},t));else if("polyline"===u&&"orthogonal"===h&&e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;me&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function LC(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function PC(t,e){return P(LC(t),e)>=0}function OC(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var RC=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new dc(n,this,this.ecModel),r=AC.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))})),o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return Xf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=OC(i,this),n.collapsed=!i.isExpand,n},e.type="series.tree",e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(sg);function NC(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function EC(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=iC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=iC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;sh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),NC(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=rC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),NC(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),NC(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function zC(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();A(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var VC=["treemapZoomToNode","treemapRender","treemapMove"];function BC(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=ed(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var FC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};GC(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new dc({itemStyle:r},this,e),a=z((i=t.levels=function(t,e){var n,i,r=ho(e.get("color")),o=ho(e.get(["aria","decal","decals"]));if(r){E(t=t||[],(function(t){var e=new dc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});return n||(a.color=r.slice()),!i&&o&&(a.decal=o.slice()),t}}(i,e))||[],(function(t){return new dc(t,o,e)}),this),s=AC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return Xf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=OC(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},A(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ft(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BC(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(sg);function GC(t){var e=0;E(t.children,(function(t){GC(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var WC=function(){function t(t){this.group=new Cr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=a.getModel("textStyle"),l={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,l,s),this._renderContent(t,l,a,s,i),_p(o,l.pos,l.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=xo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r){for(var o,a,s,l,u,h,c,p,d,f=0,g=e.emptyItemWidth,y=t.get(["breadcrumb","height"]),v=(o=e.pos,l=(a=e.box).width,u=a.height,h=Er(o.left,l),c=Er(o.top,u),p=Er(o.right,l),d=Er(o.bottom,u),(isNaN(h)||isNaN(parseFloat(o.left)))&&(h=0),(isNaN(p)||isNaN(parseFloat(o.right)))&&(p=l),(isNaN(c)||isNaN(parseFloat(o.top)))&&(c=0),(isNaN(d)||isNaN(parseFloat(o.bottom)))&&(d=u),s=ip(s||0),{width:Math.max(p-h-s[1]-s[3],0),height:Math.max(d-c-s[0]-s[2],0)}),m=e.totalWidth,x=e.renderList,_=x.length-1;_>=0;_--){var b=x[_],w=b.node,S=b.width,M=b.text;m>v.width&&(m-=S-g,S=g,M=null);var I=new Pu({shape:{points:HC(f,0,S,y,_===x.length-1,0===_)},style:k(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new ks({style:{text:M,fill:i.getTextColor(),font:i.getFont()}}),textConfig:{position:"inside"},z2:1e5,onclick:H(r,w)});I.disableLabelAnimation=!0,this.group.add(I),YC(I,t,w),f+=S+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function HC(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function YC(t,e,n){Hs(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&OC(n,e)}}var UC=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new sr(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];Ei(s,s,[-(e-=a.x),-(n-=a.y)]),Vi(s,s,[t.scale,t.scale]),Ei(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&dp(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new WC(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(PC(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(xg),tD=E,eD=q,nD=-1,iD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=T(e);this.type=i,this.mappingMethod=n,this._normalizeData=dD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(rD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,E(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(tD(e,(function(t,e){n[t]=e})),!Y(i)){var r=[];q(i)?tD(i,(function(t,e){var i=n[e];r[null!=i?i:nD]=t})):r[-1]=i,i=pD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):rD(r,!0):(lt("linear"!==n||r.dataExtent),rD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return W(this._normalizeData,this)},t.listVisualTypes=function(){return G(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){q(t)?E(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=Y(e)?[]:q(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&tD(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(Y(t))t=t.slice();else{if(!eD(t))return[];var e=[];tD(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;ou[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new iD(c);return gD(p).drColorMappingBy=h,p}}}(0,r,o,0,u,d);E(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=A({},e);if(r){var s=r.type,l="color"===s&&gD(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);vD(t,o,n,i)}}))}else s=mD(u),h.fill=s}}function mD(t){var e=xD(t,"color");if(e){var n=xD(t,"colorAlpha"),i=xD(t,"colorSaturation");return i&&(e=Dn(e,null,null,i)),n&&(e=An(e,n)),e}}function xD(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function _D(t,e){var n=t.get(e);return Y(n)&&n.length?{name:e,range:n}:null}var bD=Math.max,wD=Math.min,SD=it,MD=E,ID=["itemStyle","borderWidth"],TD=["itemStyle","gapWidth"],CD=["upperLabel","show"],DD=["upperLabel","height"],AD={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=xp(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Er(SD(s.width,l[0]),r),h=Er(SD(s.height,l[1]),o),c=i&&i.type,p=kC(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=LC(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;for(var l=i*r,u=l*t.option.zoomToNodeRatio;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;pYr&&(u=Yr),a=o}ua[1]&&(a[1]=e)}))):a=[NaN,NaN],{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*ei&&(i=a));var l=t.area*t.area,u=e*e*n;return l?bD(u*i/l,l/(u*r)):1/0}function PD(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;ci&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0].8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Cr),gA=function(){function t(t){this.group=new Cr,this._LineCtor=t||fA}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=yA(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=yA(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function TA(t,e){var n=[],i=Qe,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[Mt(l[0]),Mt(l[1])],l[2]&&l.__original.push(Mt(l[2])));var c=l.__original;if(null!=l[2]){if(St(r[0],c[0]),St(r[1],c[2]),St(r[2],c[1]),u&&"none"!==u){var p=KD(t.node1),d=IA(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}h&&"none"!==h&&(p=KD(t.node2),d=IA(r,c[1],p*e),i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]),St(l[0],r[0]),St(l[1],r[2]),St(l[2],r[1])}else St(o[0],c[0]),St(o[1],c[1]),Dt(a,o[1],o[0]),Rt(a,a),u&&"none"!==u&&(p=KD(t.node1),Ct(o[0],o[0],a,p*e)),h&&"none"!==h&&(p=KD(t.node2),Ct(o[1],o[1],a,-p*e)),St(l[0],o[0]),St(l[1],o[1])}))}function CA(t){return"view"===t.type}var DA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new qw,i=new gA,r=this.group;this._controller=new kI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(CA(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):rh(s,l,t)}TA(t.getGraph(),qD(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p),u.graph.eachNode((function(t){var e=t.dataIndex,n=t.getGraphicEl(),r=t.getModel();if(n){n.off("drag").off("dragend");var o=r.get("draggable");o&&n.on("drag",(function(){c&&(c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(e),u.setItemLayout(e,[n.x,n.y]))})).on("dragend",(function(){c&&c.setUnfixed(e)})),n.setDraggable(o&&!!c,!!r.get("cursor")),"adjacency"===r.get(["emphasis","focus"])&&(Hs(n).focus=t.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(Hs(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var d="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),f=u.getLayout("cx"),g=u.getLayout("cy");u.eachItemGraphicEl((function(t,e){var n=u.getItemModel(e).get(["label","rotate"])||0,i=t.getSymbolPath();if(d){var r=u.getItemLayout(e),o=Math.atan2(r[1]-g,r[0]-f);o<0&&(o=2*Math.PI+o);var a=r[0]=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof LA||(e=this._nodesMap[AA(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o=0&&n.node2.dataIndex>=0})),r=0,o=i.length;r=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function RA(t,e,n,i,r){for(var o=new kA(i),a=0;a "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=rx(t,n);else{var g=hd.get(f),y=g&&g.dimensions||[];P(y,"value")<0&&y.concat(["value"]);var v=Km(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new qm(v,n)).initData(t)}var m=new qm(["value"],n);return m.initData(l,s),r&&r(d,m),_C({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}R(LA,OA("hostGraph","data")),R(PA,OA("hostGraph","edgeData"));var NA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new hM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),co(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){FD(n=this)&&(n.__curvenessList=[],n.__edgeMap={},GD(n));var a=RA(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=dc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return E(a.edges,(function(t){!function(t,e,n,i){if(FD(n)){var r=WD(t,e,n),o=n.__edgeMap,a=o[HD(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),Xf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return rg({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=z(this.option.categories||[],(function(t){return null!=t.value?t:A({value:0},t)})),e=new qm(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(sg),EA={type:"graphRoam",event:"graphRoam",update:"none"},zA=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},VA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new zA},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(gs);function BA(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):U(e)&&(n=e(t))),n}var FA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Er(n[0],e.getWidth()),cy:Er(n[1],e.getHeight()),r:Er(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?DS:Cu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=[s,l];ja(f,!a);for(var g=(l=f[1])-(s=f[0]),y=s,v=0;c&&v=t&&(0===e?0:i[e-1][0]).8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var N=0;N<=b;N++){u=Math.cos(M),h=Math.sin(M);var E=new zu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&E.setStyle({stroke:i((k+N/b)/_)}),c.add(E),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Er(o.get("width"),r.r),s=Er(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Er(u[0],r.r),c=Er(u[1],r.r),p=o.get("keepAspect");return(i=l?Ly(l,h-a/2,c-s,a,s,null,p):new VA({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?DS:Cu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);oh(i,{rotation:-((isNaN(+n)?b[0]:Nr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");oh(r,{shape:{endAngle:Nr(n,_,b,a)}},t),u.add(r),Ys(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,rh(s,{rotation:-((isNaN(+i)?b[0]:Nr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");rh(m,{shape:{endAngle:Nr(i,_,b,x)}},t),u.add(m),Ys(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof _s){var h=s.style;s.useStyle(A({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(Nr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,Vl(s,e),Rl(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,Vl(c,e),Rl(c,r,o,a)}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=Ly(r,e.cx-i/2+Er(o[0],e.r),e.cy-i/2+Er(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Cr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new ks({silent:!0}),p[t]=new ks({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Cr,y=i(Nr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Er(m[0],r.r),_=r.cy+Er(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:Uh(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Er(w[0],r.r),M=r.cy+Er(w[1],r.r),I=Er(b.get("width"),r.r),T=Er(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:Uh(b,{x:S,y:M,text:BA(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),Qh(D,{normal:b},o,(function(t){return BA(t,A)})),d&&tc(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return BA(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(xg),GA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return uM(this,["value"])},e.type="series.gauge",e.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(sg),WA=["itemStyle","opacity"],HA=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new Ru,a=new ks;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(WA);l=null==l?1:l,n||hh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,oh(i,{style:{opacity:l}},r,e)):rh(i,{style:{opacity:l},shape:{points:a.points}},r,e),Vl(i,o),this._updateLabel(t,e),Rl(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;Hh(r,Yh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ji(h[0][0],h[0][1]):null},rh(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),db(n,fb(a),{stroke:u})},e}(Pu),YA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new HA(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){uh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(xg),UA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)})},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(sg);function XA(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&ok(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function ok(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var ak=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&C(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){E(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];E(B(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(Tp),sk=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(H_);function lk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=hk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=hk(s,[0,a]),r=o=hk(s,[r,o]),i=0}e[0]=hk(e[0],n),e[1]=hk(e[1],n);var l=uk(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=hk(e[i],c),u=uk(e,i),null!=r&&(u.sign!==l.sign||u.spano&&(e[1-i]=e[i]+u.sign*o),e}function uk(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function hk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var ck=E,pk=Math.min,dk=Math.max,fk=Math.floor,gk=Math.ceil,yk=zr,vk=Math.PI,mk=function(){function t(t,e,n){this.type="parallel",this._axesMap=ft(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;ck(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new sk(t,o_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();ck(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),r_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=xk(e.get("axisExpandWidth"),l),c=xk(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=xk(d[1]-d[0],l),d[1]=d[0]+t):(t=xk(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||fk(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[fk(yk(d[0]/h,1))+1,gk(yk(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),ck(n,(function(e,n){var o=(i.axisExpandable?bk:_k)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:vk/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];zi(h,h,u),Ei(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];E(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;ur*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?lk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[dk(0,o[1]*s/p-p/2)])[1]=pk(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function xk(t,e){return pk(dk(t,e[0]),e[1])}function _k(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function bk(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t=0;n--)Vr(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i6}(t)||o){if(a&&!o){"single"===s.brushMode&&Wk(t);var l=T(s);l.brushType=oL(l.brushType,a),l.panelId=a===Mk?null:a.panelId,o=t._creatingCover=Rk(t,l),t._covers.push(o)}if(o){var u=lL[oL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(eL(t,o,t._track)),i&&(Nk(t,o),u.updateCommon(t,o)),Ek(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&Fk(t,e,n)&&Wk(t)&&(r={isEnd:i,removeOnClick:!0});return r}function oL(t,e){return"auto"===t?e.defaultBrushType:t}var aL={mousedown:function(t){if(this._dragging)sL(this,t);else if(!t.target||!t.target.draggable){nL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Fk(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=Fk(t,e,n);if(!t._dragging)for(var a=0;a=0&&(o[r[a].depth]=new dc(r[a],this,e));if(i&&n)return RA(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))})).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return Xf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return Xf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(sg);function SL(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){E(t,(function(t){var e=OL(t.outEdges,PL),n=OL(t.inEdges,PL),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;mc-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s0;o--)TL(s,l*=.99,a),IL(s,r,n,i,a),RL(s,l,a),IL(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";E(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),E(t,(function(t){var e=0,n=0;E(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),E(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==B(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function ML(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function IL(t,e,n,i,r){var o="vertical"===r?"x":"y";E(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0)for(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a,p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}))}function TL(t,e,n){E(t.slice().reverse(),(function(t){E(t,(function(t){if(t.outEdges.length){var i=OL(t.outEdges,CL,n)/OL(t.outEdges,PL);if(isNaN(i)){var r=t.outEdges.length;i=r?OL(t.outEdges,DL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-LL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-LL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function CL(t,e){return LL(t.node2,e)*t.getValue()}function DL(t,e){return LL(t.node2,e)}function AL(t,e){return LL(t.node1,e)*t.getValue()}function kL(t,e){return LL(t.node1,e)}function LL(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function PL(t){return t.getValue()}function OL(t,e,n){for(var i=0,r=t.length,o=-1;++oi&&(i=e)})),E(e,(function(e){var r=new iD({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var EL=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];E(g,(function(t,e){var n;Y(t)?(n=t.slice(),t.unshift(e)):Y(t.value)?((n=A({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Dm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Dm(f),dimsDef:v.slice()}];return uM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:H(Hp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),zL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(sg);R(zL,EL,!0);var VL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=GL(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(hh(n),WL(s,n,i,t)):n=GL(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(xg),BL=function(){},FL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new BL},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();ig){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}},jL=["color","borderColor"],qL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&QL(s,a))return;var l=JL(a,n,!0);oh(l,{shape:{points:a.ends}},t,n),tP(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&QL(s,h)?i.remove(u):(u?(rh(u,{shape:{points:h.ends}},t,a),hh(u)):u=JL(h),tP(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),rP(t,this.group);var e=t.get("clip",!0)?lS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=JL(i.getItemLayout(n));tP(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},e.prototype._incrementalRenderLarge=function(t,e){rP(e,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(xg),KL=function(){},$L=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new KL},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(gs);function JL(t,e,n){var i=t.ends;return new $L({shape:{points:n?eP(i,t):i},z2:100})}function QL(t,e){for(var n=!0,i=0;i0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(jL);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var aP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(sg);function sP(t){t&&Y(t.series)&&E(t.series,(function(t){q(t)&&"k"===t.type&&(t.type="candlestick")}))}R(aP,EL,!0);var lP=["itemStyle","borderColor"],uP=["itemStyle","borderColor0"],hP=["itemStyle","color"],cP=["itemStyle","color0"],pP={seriesType:"candlestick",plan:yg(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?hP:cP)}function i(t,e){return e.get(t>0?lP:uP)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,A(e.ensureUniqueItemVisual(r,"style"),s)}}}}},dP={seriesType:"candlestick",plan:yg(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Er(rt(t.get("barMaxWidth"),r),r),a=Er(rt(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Er(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=z(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){for(var i,r,a=Sx(4*t.count),c=0,p=[],d=[],f=n.getStore();null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),x=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(x)?(a[c++]=NaN,c+=3):(a[c++]=fP(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=x,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){for(var r,a=n.getStore();null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),x=S(v,c),_=S(f,c),b=S(g,c),w=[];M(w,x,0),M(w,m,1),w.push(T(b),T(x),T(_),T(m)),n.setItemLayout(r,{sign:fP(a,r,p,d,l),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=Mh(r[0]+i/2,1,!1),o[0]=Mh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=Mh(t[0],1),t}}}}};function fP(t,e,n,i,r){return n>i?-1:n0?t.get(r,e-1)<=i?1:-1:1}function gP(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var yP=function(t){function e(e,n){var i=t.call(this)||this,r=new Yw(e,n),o=new Cr;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o0&&(o=this._getLineLength(i)/s*1e3),o!==this._period||a!==this._loop){i.stopAnimation();var u=void 0;u=U(l)?l(n):l,i.__t>0&&(u=-o*i.__t),this._animateSymbol(i,o,u,a)}this._period=o,this._loop=a}},e.prototype._animateSymbol=function(t,e,n,i){if(e>0){t.__t=0;var r=this,o=t.animate("",i).when(e,{__t:1}).delay(n).during((function(){r._updateSymbolPosition(t)}));i||o.done((function(){r.remove(t)})),o.start()}},e.prototype._getLineLength=function(t){return Et(t.__p1,t.__cp1)+Et(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t,o=[t.x,t.y],a=o.slice(),s=Ke,l=$e;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=l(e[0],i[0],n[0],r),h=l(e[1],i[1],n[1],r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;oe);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=u[0]-l[0],c=u[1]-l[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(xP),wP=function(){this.polyline=!1,this.curveness=0,this.segs=[]},SP=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new wP},e.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n0){t.moveTo(i[n++],i[n++]);for(var a=1;a0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s0)for(var u=i[s++],h=i[s++],c=1;c0){if(Ja(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(Ka(u,h,p,d,o,t,e))return a;a++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),IP={seriesType:"lines",plan:yg(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&lS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=IP.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new MP:new gA(r?i?bP:_P:i?xP:fA),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get(["effect","show"])},e.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.type="lines",e}(xg),CP="undefined"==typeof Uint32Array?Array:Uint32Array,DP="undefined"==typeof Float64Array?Array:Float64Array;function AP(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=z(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),D([e,t[0],t[1]])})))}var kP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.init=function(e){e.data=e.data||[],AP(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(e){if(AP(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=gt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=gt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t);return e.option instanceof Array?e.option:e.getShallow("coords")},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(sg);function LP(t){return t instanceof Array||(t=[t,t]),t}var PP={seriesType:"lines",reset:function(t){var e=LP(t.get("symbol")),n=LP(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=LP(n.getShallow("symbol",!0)),r=LP(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}},OP=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=h.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=h.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function RP(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var NP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):RP(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(RP(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem,h=uS(u,"cartesian2d");if(h){var c=u.getAxis("x"),p=u.getAxis("y");o=c.getBandWidth()+.5,a=p.getBandWidth()+.5,s=c.scale.getExtent(),l=p.scale.getExtent()}for(var d=this.group,f=t.getData(),g=t.getModel(["emphasis","itemStyle"]).getItemStyle(),y=t.getModel(["blur","itemStyle"]).getItemStyle(),v=t.getModel(["select","itemStyle"]).getItemStyle(),m=t.get(["itemStyle","borderRadius"]),x=Yh(t),_=t.getModel("emphasis"),b=_.get("focus"),w=_.get("blurScope"),S=_.get("disabled"),M=h?[f.mapDimension("x"),f.mapDimension("y"),f.mapDimension("value")]:[f.mapDimension("time"),f.mapDimension("value")],I=n;Is[1]||Al[1])continue;var k=u.dataToPoint([D,A]);T=new Cs({shape:{x:k[0]-o/2,y:k[1]-a/2,width:o,height:a},style:C})}else{if(isNaN(f.get(M[1],I)))continue;T=new Cs({z2:1,shape:u.dataToRect([f.get(M[0],I)]).contentShape,style:C})}if(f.hasItemOption){var L=f.getItemModel(I),P=L.getModel("emphasis");g=P.getModel("itemStyle").getItemStyle(),y=L.getModel(["blur","itemStyle"]).getItemStyle(),v=L.getModel(["select","itemStyle"]).getItemStyle(),m=L.get(["itemStyle","borderRadius"]),b=P.get("focus"),w=P.get("blurScope"),S=P.get("disabled"),x=Yh(L)}T.shape.r=m;var O=t.getRawValue(I),R="-";O&&null!=O[2]&&(R=O[2]+""),Hh(T,x,{labelFetcher:t,labelDataIndex:I,defaultOpacity:C.opacity,defaultText:R}),T.ensureState("emphasis").style=g,T.ensureState("blur").style=y,T.ensureState("select").style=v,Rl(T,b,w,S),T.incremental=r,r&&(T.states.emphasis.hoverLayer=!0),d.add(T),f.setItemGraphicEl(I,T),this._progressiveEls&&this._progressiveEls.push(T)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new OP;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=z(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");(h=Y(f)?f.slice():null==f?["100%","100%"]:[f,f])[p.index]=Er(h[p.index],d),h[c.index]=Er(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(zP)||0;o&&(BP.attr({scaleX:e[0],scaleY:e[1],rotation:n}),BP.updateTransform(),o/=BP.getLineScale(),o*=e[i.valueDim.index]),r.valueLineWidth=o||0}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Oy(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=it(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Er(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=eo(i),M=S?i:iO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?iO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var D=c.barRectShape=A({},n);D[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),D[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function WP(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function HP(t){var e=t.symbolPatternSize,n=Ly(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function YP(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(tO(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function UP(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?eO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=HP(n),r.add(o),eO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function XP(t,e,n){var i=A({},e.barRectShape),r=t.__pictorialBarRect;r?eO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Cs({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function ZP(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=A({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)rh(r,{shape:o},s,l);else{o[a.wh]=0,r=new Cs({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Bh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function jP(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=qP,n.isAnimationEnabled=KP,n}function qP(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function KP(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function $P(t,e,n,i){var r=new Cr,o=new Cr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?YP(r,e,n):UP(r,0,n),XP(r,n,i),ZP(r,e,n,i),r.__pictorialShapeStr=QP(t,n),r.__pictorialSymbolMeta=n,r}function JP(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];tO(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),E(o,(function(t){sh(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function QP(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function tO(t,e,n){E(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function eO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Bh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function nO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");tO(t,(function(t){if(t instanceof _s){var e=t.style;t.useStyle(A({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];Hh(t.__pictorialBarRect,Yh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Ww(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Rl(t,h,c,o.get("disabled"))}function iO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var rO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=yc(IS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(IS),oO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Im(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;go&&(o=s),i.push(s)}for(var u=0;uo&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;fMath.PI/2?"right":"left"):S&&"center"!==S?"left"===S?(m=r.r0+w,a>Math.PI/2&&(S="right")):"right"===S&&(m=r.r-w,a>Math.PI/2&&(S="left")):(m=o===2*Math.PI&&0===r.r0?0:(r.r+r.r0)/2,S="center"),g.style.align=S,g.style.verticalAlign=f(p,"verticalAlign")||"middle",g.x=m*s+r.cx,g.y=m*l+r.cy;var M=f(p,"rotate"),I=0;"radial"===M?(I=-a)<-Math.PI/2&&(I+=Math.PI):"tangential"===M?(I=Math.PI/2-a)>Math.PI/2?I-=Math.PI:I<-Math.PI/2&&(I+=Math.PI):j(M)&&(I=M*Math.PI/180),g.rotation=I})),h.dirtyStyle()},e}(Cu),hO="sunburstRootToNode",cO="sunburstHighlight",pO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){function s(t){return t.getId()}function h(s,h){!function(i,r){if(u||!i||i.getValue()||(i=null),i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){t&&t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new uO(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}0===i.length&&0===r.length||new Im(r,i,s,s).add(h).update(h).remove(H(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new uO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");a&&dp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:hO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(xg),dO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};fO(n);var i=this._levelModels=z(t.levels||[],(function(t){return new dc(t,this,e)}),this),r=AC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=OC(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BC(this)},e.type="series.sunburst",e.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(sg);function fO(t){var e=0;E(t.children,(function(t){fO(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var gO=Math.PI/180;function yO(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");Y(i)||(i=[0,i]),Y(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Er(e[0],r),l=Er(e[1],o),u=Er(i[0],a/2),h=Er(i[1],a/2),c=-t.get("startAngle")*gO,p=t.get("minAngle")*gO,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&vO(f,y);var v=0;E(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=Sn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),A(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var xO={color:"fill",borderColor:"stroke"},_O={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},bO=So(),wO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return rx(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=bO(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},e}(sg);function SO(t,e){return e=e||[0,0],z(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function MO(t,e){return e=e||[0,0],z([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function IO(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function TO(t,e){return e=e||[0,0],z(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function CO(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||mt(t,"text")))}function DO(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},mt(a,"text")&&(o.text=a.text),mt(a,"rich")&&(o.rich=a.rich),mt(a,"textFill")&&(o.fill=a.textFill),mt(a,"textStroke")&&(o.stroke=a.textStroke),mt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),mt(a,"fontSize")&&(o.fontSize=a.fontSize),mt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),mt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=mt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),mt(a,"textPosition")&&(i.position=a.textPosition),mt(a,"textOffset")&&(i.offset=a.textOffset),mt(a,"textRotation")&&(i.rotation=a.textRotation),mt(a,"textDistance")&&(i.distance=a.textDistance)}return AO(o,t),E(o.rich,(function(t){AO(t,t)})),{textConfig:i,textContent:r}}function AO(t,e){e&&(e.font=e.textFont||e.font,mt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),mt(e,"textAlign")&&(t.align=e.textAlign),mt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),mt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),mt(e,"textWidth")&&(t.width=e.textWidth),mt(e,"textHeight")&&(t.height=e.textHeight),mt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),mt(e,"textPadding")&&(t.padding=e.textPadding),mt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),mt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),mt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),mt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),mt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),mt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),mt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function kO(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";LO(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,E(e.rich,(function(t){LO(t,t)})),i}function LO(t,e){e&&(mt(e,"fill")&&(t.textFill=e.fill),mt(e,"stroke")&&(t.textStroke=e.fill),mt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),mt(e,"font")&&(t.font=e.font),mt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),mt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),mt(e,"fontSize")&&(t.fontSize=e.fontSize),mt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),mt(e,"align")&&(t.textAlign=e.align),mt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),mt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),mt(e,"width")&&(t.textWidth=e.width),mt(e,"height")&&(t.textHeight=e.height),mt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),mt(e,"padding")&&(t.textPadding=e.padding),mt(e,"borderColor")&&(t.textBorderColor=e.borderColor),mt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),mt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),mt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),mt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),mt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),mt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),mt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),mt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),mt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),mt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var PO={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},OO=G(PO),RO=(V(Ki,(function(t,e){return t[e]=1,t}),{}),Ki.join(", "),["","style","shape","extra"]),NO=So();function EO(t,e,n,i,r){var o=t+"Animation",a=nh(t,i,r)||{},s=NO(e).userDuring;return a.duration>0&&(a.during=s?W(HO,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),A(a,n[o]),a}function zO(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=NO(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=G(n);for(u=0;u0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=EO("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);VO(t,e),u?t.dirty():t.markRedraw()}function VO(t,e){for(var n=NO(t).leaveToProps,i=0;i=0){!o&&(o=i[t]={});var p=G(a);for(h=0;hi[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:W(TO,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function sR(t){return t instanceof gs}function lR(t){return t instanceof da}var uR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=fR(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){yR(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);BO(n,bO(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);yR(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?lS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=fR(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){null==i&&(i=s);var r=m(i,$O).getItemStyle(),o=x(i,$O),a=Uh(o,null,null,!0,!0);a.text=o.getShallow("show")?ot(t.getFormattedLabel(i,$O),t.getFormattedLabel(i,JO),Ww(e,i)):null;var l=Xh(o,null,!0);return b(n,r),r=kO(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),mt(xO,t)){var i=e.getItemVisual(n,"style");return i?i[xO[t]]:null}if(mt(_O,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type)return function(t){var e=[],n=t.axis;if("category"===n.type){for(var r=n.getBandWidth(),o=0;o=c;p--)BO(e.childAt(p),bO(e).option,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function mR(t,e,n){var i,r=bO(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&(i=a)&&(mt(i,"pathData")||mt(i,"d"))&&IR(a)!==r.customPathData||"image"===o&&mt(s,"image")&&s.image!==r.customImagePath}function xR(t,e,n){var i=e?_R(t,e):t,r=e?bR(t,i,$O):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?_R(s,e):s:null;if(r&&(n.isLegacy||CO(r,o,!!a,!!l))){n.isLegacy=!0;var u=DO(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function _R(t,e){return e?t?t[e]:null:t}function bR(t,e,n){var i=e&&e.style;return null==i&&n===$O&&t&&(i=t.styleEmphasis),i}function wR(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function SR(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;vR(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function MR(t){var e=this.context,n=e.oldChildren[t];BO(n,bO(n).option,e.seriesModel)}function IR(t){return t&&(t.pathData||t.d)}var TR=So(),CR=T,DR=W,AR=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=H(kR,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Cr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);RR(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=KM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=TR(t).pointerEl=new Bh[r.type](CR(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=TR(t).labelEl=new ks(CR(e.label));t.add(r),PR(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=TR(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=TR(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),PR(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Ph(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){se(t.event)},onmousedown:DR(this._onHandleDragMove,this,0,0),drift:DR(this._onHandleDragMove,this),ondragend:DR(this._onHandleDragEnd,this)}),i.add(r)),RR(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");Y(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Ag(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){kR(this._axisPointerModel,!e&&this._moveAnimation,this._handle,OR(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(OR(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(OR(i)),TR(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),kg(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function kR(t,e,n,i){LR(TR(n).lastProp,i)||(TR(n).lastProp=i,e?rh(n,i,t):(n.stopAnimation(),n.attr(i)))}function LR(t,e){if(q(t)&&q(e)){var n=!0;return E(e,(function(e,i){n=n&&LR(t[i],e)})),!!n}return t===e}function PR(t,e){t[e.get(["label","show"])?"show":"hide"]()}function OR(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function RR(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function NR(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function ER(t,e,n,i,r){var o=zR(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=ip(a.get("padding")||0),l=a.getFont(),u=cr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:Uh(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function zR(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:s_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};E(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):U(a)&&(o=a(s))}return o}function VR(t,e,n){var i=[1,0,0,1,0,0];return zi(i,i,n.rotation),Ei(i,i,n.position),Th([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function BR(t,e,n,i,r,o){var a=GM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),ER(e,i,r,o,{position:VR(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function FR(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function GR(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function WR(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var HR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=YR(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=NR(i),c=UR[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}BR(e,t,LM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=LM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=VR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=YR(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];return c[l]=u[l],{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(AR);function YR(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var UR={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:FR([e,n[0]],[e,n[1]],XR(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:GR([e-i/2,n[0]],[i,r],XR(t))}}};function XR(t){return"x"===t.dim?0:1}var ZR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Tp),jR=So(),qR=E;function KR(t,e,n){if(!r.node){var i=e.getZr();jR(i).records||(jR(i).records={}),function(t,e){function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);qR(jR(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]),n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}jR(t).initialized||(jR(t).initialized=!0,n("click",H(JR,"click")),n("mousemove",H(JR,"mousemove")),n("globalout",$R))}(i,e),(jR(i).records[t]||(jR(i).records[t]={})).handler=n}}function $R(t,e,n){t.handler("leave",null,n)}function JR(t,e,n,i){e.handler(t,n,i)}function QR(t,e){if(!r.node){var n=e.getZr();(jR(n).records||{})[t]&&(jR(n).records[t]=null)}}var tN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";KR("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){QR("axisPointer",e)},e.prototype.dispose=function(t,e){QR("axisPointer",e)},e.type="axisPointer",e}(gg);function eN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=wo(o,t);if(null==a||a<0||Y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(z(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var nN=So();function iN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||W(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){lN(r)&&(r=eN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=lN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||lN(r),p={},d={},f={list:[],map:{}},g={showPointer:H(oN,d),showTooltip:H(aN,f)};E(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);E(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&rN(t,a,g,!1,p)}}))}));var y={};return E(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&E(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,sN(e),sN(t)))),y[t.key]=o}}))})),E(y,(function(t,e){rN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];E(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(!lN(e)&&t.list.length){var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}else i({type:"hideTip"})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=nN(i)[r]||{},a=nN(i)[r]={};E(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&E(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];E(o,(function(t,e){!a[e]&&l.push(t)})),E(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function rN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return E(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f=0&&s<0)&&(a=f,s=d,r=u,o.length=0),E(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&A(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function oN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function aN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=JM(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function sN(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function lN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function uN(t){tI.registerAxisPointerClass("CartesianAxisPointer",HR),t.registerComponentModel(ZR),t.registerComponentView(tN),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!Y(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=function(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return function(t,e,n){var i=e.getComponent("tooltip"),r=e.getComponent("axisPointer"),o=r.get("link",!0)||[],a=[];E(n.getCoordinateSystems(),(function(n){if(n.axisPointerEnabled){var s=JM(n.model),l=t.coordSysAxesInfo[s]={};t.coordSysMap[s]=n;var u=n.model.getModel("tooltip",i);if(E(n.getAxes(),H(d,!1,null)),n.getTooltipAxes&&i&&u.get("show")){var h="axis"===u.get("trigger"),c="cross"===u.get(["axisPointer","type"]),p=n.getTooltipAxes(u.get(["axisPointer","axis"]));(h||c)&&E(p.baseAxes,H(d,!c||"cross",h)),c&&E(p.otherAxes,H(d,"cross",!1))}}function d(i,s,h){var c=h.model.getModel("axisPointer",r),p=c.get("show");if(p&&("auto"!==p||i||$M(c))){null==s&&(s=c.get("triggerTooltip"));var d=(c=i?function(t,e,n,i,r,o){var a=e.getModel("axisPointer"),s={};E(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],(function(t){s[t]=T(a.get(t))})),s.snap="category"!==t.type&&!!o,"cross"===a.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r){var u=a.get(["label","show"]);if(l.show=null==u||u,!o){var h=s.lineStyle=a.get("crossStyle");h&&k(l,h.textStyle)}}return t.model.getModel("axisPointer",new dc(s,n,i))}(h,u,r,e,i,s):c).get("snap"),f=JM(h.model),g=s||d||"category"===h.type,y=t.axesInfo[f]={key:f,axis:h,coordSys:n,axisPointerModel:c,triggerTooltip:s,involveSeries:g,snap:d,useHandle:$M(c),seriesModels:[],linkGroup:null};l[f]=y,t.seriesInvolved=t.seriesInvolved||g;var v=function(t,e){for(var n=e.model,i=e.dim,r=0;ry?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));ER(t,n,i,r,p)},e}(AR),cN={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:FR(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:WR(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:WR(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},pN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={z:0,center:["50%","50%"],radius:"80%"},e}(Tp),dN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Co).models[0]},e.type="polarAxis",e}(Tp);R(dN,p_);var fN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(dN),gN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(dN),yN=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(H_);yN.prototype.dataToRadius=H_.prototype.dataToCoord,yN.prototype.radiusToData=H_.prototype.coordToData;var vN=So(),mN=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=cr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=vN(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(H_);mN.prototype.dataToAngle=H_.prototype.dataToCoord,mN.prototype.angleToData=H_.prototype.coordToData;var xN=["radius","angle"],_N=function(){function t(t){this.dimensions=xN,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new yN,this._angleAxis=new mN,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=la;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return bN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return bN(e)===this?this.pointToData(n):null},t}();function bN(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function wN(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();E(c_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),E(c_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),r_(i.scale,i.model),r_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function SN(t,e){if(t.type=e.get("type"),t.scale=o_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var MN={dimensions:xN,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new _N(i+"");r.update=wN;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");SN(o,s),SN(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Er(i[0],r),t.cy=Er(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:Y(l)||(l=[0,l]);var u=[Er(l[0],s),Er(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Co).models[0];t.coordinateSystem=e.coordinateSystem}})),n}},IN=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function TN(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function CN(t){return t.getRadiusAxis().inverse?0:1}function DN(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var AN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=z(n.getViewLabels(),(function(t){t=T(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));DN(s),DN(o),E(IN,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||kN[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(tI),kN={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=CN(n),u=l?0:1;(a=0===o[u]?new hu({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new Au({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[CN(n)],u=z(i,(function(t){return new zu({shape:TN(n,[l,l+s],t.coord)})}));t.add(wh(u,{style:k(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[CN(n)],h=[],c=0;cf?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];q(m)&&m.textStyle&&(a=new dc(m.textStyle,l,l.ecModel))}var x=new ks({silent:GM.isLabelSilent(e),style:Uh(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=GM.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,Hs(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h=0?"p":"n",T=_;m&&(i[s][M]||(i[s][M]={p:_,n:_}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-_,P=o.dataToCoord(M);Math.abs(L)=k})}}}))}var VN={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},BN={splitNumber:5},FN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(gg);function GN(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]],r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a],r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),it(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var WN=["axisLine","axisTickLabel","axisName"],HN=["splitArea","splitLine"],YN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Cr;var s=GN(e),l=new GM(e,s);E(WN,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),E(HN,(function(t){e.get([t,"show"])&&UN[t](this,this.group,this._axisGroup,e)}),this),Ah(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){iI(this)},e.type="singleAxis",e}(tI),UN={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=[],c=0,p=r.getTicksCoords({tickModel:o}),d=[],f=[],g=0;g=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return KN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return KN(e)===this?this.pointToData(n):null},t}();function KN(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var $N={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new qN(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Co).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:jN},JN=["x","y"],QN=["width","height"],tE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=iE(a,1-nE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=NR(i),c=eE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}BR(e,t,GN(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=GN(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=VR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=nE(r),s=iE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=iE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(AR),eE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:FR([e,n[0]],[e,n[1]],nE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:GR([e-i/2,n[0]],[i,r],nE(t))}}};function nE(t){return t.isHorizontal()?0:1}function iE(t,e){var n=t.getRect();return[n[JN[e]],n[JN[e]]+n[QN[e]]]}var rE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(gg),oE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=Sp(e);t.prototype.init.apply(this,arguments),aE(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),aE(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(Tp);function aE(t,e){var n,i=t.cellSize;1===(n=Y(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=z([0,1],(function(t){return function(t,e){return null!=t[yp[e][0]]||null!=t[yp[e][1]]&&null!=t[yp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));wp(t,e,{type:"box",ignoreSize:r})}var sE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Cs({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new Ru({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,E(e,(function(t,e){n=n.replace("{"+e+"}",t)})),n):U(t)?t(e):e.nameMap;var n},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new ks({z2:30,style:Uh(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=Mc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d=i.start.time&&n.timea.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/lE)-Math.floor(n[0].time/lE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&ei.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function hE(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function cE(t,e){var n;return E(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var pE=["transition","enterFrom","leaveTo"],dE=pE.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function fE(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?pE:dE,r=0;r=0;l--){var p,d,f;if(f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=vE(g),{}),v=_p(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!vE(f).isNew&&v){for(var m=p.transition,x={},_=0;_=0)?x[b]=w:f[b]=w}rh(f,x,t,0)}else f.attr(y)}}},e.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){bE(n,vE(n).option,e,t._lastGraphicModel)})),this._elMap=ft()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(gg);function xE(t){var n=new(mt(yE,t)?yE[t]:mh(t))({});return vE(n).type=t,n}function _E(t,e,n,i){var r=xE(n);return e.add(r),i.set(t,r),vE(r).id=t,vE(r).isNew=!0,r}function bE(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){bE(t,e,n,i)})),BO(t,e,i),n.removeKey(vE(t).id))}function wE(t,e,n,i){t.isGroup||E([["cursor",da.prototype.cursor],["zlevel",i||0],["z",n||0],["z2",0]],(function(n){var i=n[0];mt(e,i)?t[i]=rt(e[i],n[1]):null==t[i]&&(t[i]=n[1])})),E(G(e),(function(n){if(0===n.indexOf("on")){var i=e[n];t[n]=U(i)?i:null}})),mt(e,"draggable")&&(t.draggable=e.draggable),null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var SE=["x","y","radius","angle","single"],ME=["cartesian2d","polar","singleAxis"];function IE(t){return t+"Axis"}function CE(t){var e=t.ecModel,n={infoList:[],infoMap:ft()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(IE(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var DE=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),AE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=kE(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=kE(t);C(this.option,t,!0),C(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ft();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return E(SE,(function(n){var i=this.getReferringComponents(IE(n),Do);if(i.specified){e=!0;var r=new DE;E(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}function o(e,n){var r=e[0];if(r){var o=new DE;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Co).models[0];a&&E(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Co).models[0]&&o.add(t.componentIndex)}))}}}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single"),i&&E(SE,(function(e){if(i){var r=n.findComponents({mainType:IE(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new DE;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(IE(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){E(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(IE(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;E(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i=0}(e)){var n=IE(this._dimName),i=e.getReferringComponents(n,Co).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return T(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];RE(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(Nr(h,o,n))):(e=!0,h=Nr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),NE(s),NE(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";lk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=Nr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];RE(n,(function(t){!function(t,e,n){e&&E(c_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=e_(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&RE(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=z(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;lo[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else RE(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));RE(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;RE(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=Nr(n[0]+o,n,[0,100],!0):null!=r&&(o=Nr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=Gr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}(),zE={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(IE(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new EE(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ft();return E(n,(function(t){E(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}},VE=!1;function BE(t){VE||(VE=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,zE),function(t){t.registerAction("dataZoom",(function(t,e){E(function(t,e){var n,i=ft(),r=[],o=ft();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function FE(t){t.registerComponentModel(LE),t.registerComponentView(OE),BE(t)}var GE=function(){},WE={};function HE(t,e){WE[t]=e}function YE(t){return WE[t]}var UE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;E(this.option.feature,(function(t,n){var i=YE(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),C(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(Tp);function XE(t,e){var n=ip(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),new Cs({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var ZE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a="vertical"===t.get("orient"),s=t.get("feature")||{},l=this._features||(this._features={}),u=[];E(s,(function(t,e){u.push(e)})),new Im(this._featureNames||[],u).add(h).update(h).remove(H(h,null)).execute(),this._featureNames=u,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=xp(i,o,r);mp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),_p(t,i,o,r)}(r,t,n),r.add(XE(r.getBoundingRect(),t)),a||r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.ensureState("emphasis");if(l&&!U(l)&&e){var u=l.style||(l.style={}),h=cr(e,ks.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+10;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function h(h,c){var p,d=u[h],f=u[c],g=s[d],y=new dc(g,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===d&&(g.title=i.newTitle),d&&!f){if(function(t){return 0===t.indexOf("my")}(d))p={onclick:y.option.onclick,featureName:d};else{var v=YE(d);if(!v)return;p=new v}l[d]=p}else if(!(p=l[f]))return;p.uid=gc("toolbox-feature"),p.model=y,p.ecModel=e,p.api=n;var m=p instanceof GE;d||!f?!y.get("show")||m&&p.unusable?m&&p.remove&&p.remove(e,n):(function(i,s,l){var u,h,c=i.getModel("iconStyle"),p=i.getModel(["emphasis","iconStyle"]),d=s instanceof GE&&s.getIcons?s.getIcons():i.get("icon"),f=i.get("title")||{};X(d)?(u={})[l]=d:u=d,X(f)?(h={})[l]=f:h=f;var g=i.iconPaths={};E(u,(function(l,u){var d=Ph(l,{},{x:-o/2,y:-o/2,width:o,height:o});d.setStyle(c.getItemStyle()),d.ensureState("emphasis").style=p.getItemStyle();var f=new ks({style:{text:h[u],align:p.get("textAlign"),borderRadius:p.get("textBorderRadius"),padding:p.get("textPadding"),fill:null},ignore:!0});d.setTextContent(f),Eh({el:d,componentModel:t,itemName:u,formatterParamsExtra:{title:h[u]}}),d.__title=h[u],d.on("mouseover",(function(){var e=p.getItemStyle(),i=a?null==t.get("right")&&"right"!==t.get("left")?"right":"left":null==t.get("bottom")&&"bottom"!==t.get("top")?"bottom":"top";f.setStyle({fill:p.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:p.get("textBackgroundColor")}),d.setTextConfig({position:p.get("textPosition")||i}),f.ignore=!t.get("showTitle"),n.enterEmphasis(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",u])&&n.leaveEmphasis(this),f.hide()})),("emphasis"===i.get(["iconStatus",u])?_l:bl)(d),r.add(d),d.on("click",W(s.onclick,s,e,n,u)),g[u]=d}))}(y,p,d),y.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?_l:bl)(i[t])},p instanceof GE&&p.render&&p.render(y,e,n,i)):m&&p.dispose&&p.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){E(this._features,(function(t){t instanceof GE&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){E(this._features,(function(n){n instanceof GE&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){E(this._features,(function(n){n instanceof GE&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(gg),jE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=r.browser;if(U(MouseEvent)&&(l.newEdge||!l.ie&&!l.edge)){var u=document.createElement("a");u.download=i+"."+a,u.target="_blank",u.href=s;var h=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});u.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var c=s.split(","),p=c[0].indexOf("base64")>-1,d=o?decodeURIComponent(c[1]):c[1];p&&(d=window.atob(d));var f=i+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var v=new Blob([y]);window.navigator.msSaveOrOpenBlob(v,f)}else{var m=document.createElement("iframe");document.body.appendChild(m);var x=m.contentWindow,_=x.document;_.open("image/svg+xml","replace"),_.write(d),_.close(),x.focus(),_.execCommand("SaveAs",!0,f),document.body.removeChild(m)}}else{var b=n.get("lang"),w='',S=window.open();S.document.write(w),S.document.title=i}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(GE),qE="__ec_magicType_stack__",KE=[["line","bar"],["stack"]],$E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if(JE[n]){var o,a={series:[]};E(KE,(function(t){P(t,n)>=0&&E(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=JE[n](e,r,t,i);o&&(k(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Co).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=C({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(GE),JE={line:function(t,e,n,i){if("bar"===t)return C({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return C({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===qE;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),C({id:e,stack:r?"":qE},i.get(["option","stack"])||{},!0)}};cm({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var QE=new Array(60).join("-");function ez(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var nz=new RegExp("[\t]+","g");var rz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){setTimeout((function(){e.dispatchAction({type:"hideTip"})}));var n=e.getDom(),i=this.model;this._dom&&n.removeChild(this._dom);var r=document.createElement("div");r.style.cssText="position:absolute;top:0;bottom:0;left:0;right:0;padding:5px",r.style.backgroundColor=i.get("backgroundColor")||"#fff";var o=document.createElement("h4"),a=i.get("lang")||[];o.innerHTML=a[0]||i.get("title"),o.style.cssText="margin:10px 20px",o.style.color=i.get("textColor");var s=document.createElement("div"),l=document.createElement("textarea");s.style.cssText="overflow:auto";var u=i.get("optionToContent"),h=i.get("contentToOption"),c=function(t){var e,n,i,r=function(t){var e={},n=[],i=[];return t.eachRawSeries((function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}})),{seriesGroupByCategoryAxis:e,other:n,meta:i}}(t);return{value:B([(n=r.seriesGroupByCategoryAxis,i=[],E(n,(function(t,e){var n=t.categoryAxis,r=t.valueAxis.dim,o=[" "].concat(z(t.series,(function(t){return t.name}))),a=[n.model.getCategories()];E(t.series,(function(t){var e=t.getRawData();a.push(t.getRawData().mapArray(e.mapDimension(r),(function(t){return t})))}));for(var s=[o.join("\t")],l=0;l=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=z(ez(e.shift()).split(nz),(function(t){return{name:t,data:[]}})),r=0;r=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=vz[t.brushType](0,n,e);t.__rangeOffset={offset:xz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){E(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&E(i.coordSyses,(function(i){var r=vz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){E(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=vz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?xz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=bz(n),o=bz(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return z(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:hL(i),isTargetByCursor:pL(i,t,n.coordSysModel),getLinearBrushOtherExtent:cL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&P(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=dz(e,t),r=0;rt[1]&&t.reverse(),t}function dz(t,e){return Io(t,e,{includeMainTypes:hz})}var fz={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ft(),a={},s={};(n||i||r)&&(E(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),E(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),E(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];E(r.getCartesians(),(function(t,e){(P(n,t.getAxis("x").model)>=0||P(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:yz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){E(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:yz.geo})}))}},gz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],yz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Ih(t)),e}},vz={lineX:H(mz,0),lineY:H(mz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[pz([r[0],o[0]]),pz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:z(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function mz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=pz(z([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var xz={lineX:H(_z,0),lineY:H(_z,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return z(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function _z(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function bz(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var wz,Sz,Mz=E,Iz=uo+"toolbox-dataZoom_",Tz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new Ok(n.getZr()),this._brushController.on("brush",W(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive),n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new cz(Dz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return lz(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){Cz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new cz(Dz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=lz(t);az(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=lk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];Mz(t,(function(t,n){e.push(T(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(GE),Cz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=lz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return az(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function Dz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}wz="dataZoom",Sz=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=Io(t,Dz(i));return Mz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),Mz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:Iz+e+o};a[n]=o,r.push(a)}},lt(null==jp.get(wz)&&Sz),jp.set(wz,Sz);var Az=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(Tp);function kz(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function Lz(t){if(r.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'
'}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",Y(t)||(t=[t]);for(var s=0;s=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api,i=t.get("triggerOn");if(null!=this._lastX&&null!=this._lastY&&"none"!==i&&"click"!==i){var r=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&r.manuallyShowTip(t,e,n,{x:r._lastX,y:r._lastY,dataByCoordSys:r._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!r.node&&n.getDom()){var o=jz(i,n);this._ticket="";var a=i.dataByCoordSys,s=function(t,e,n){var i=To(t).queryOptionMap,r=i.keys()[0];if(r&&"series"!==r){var o,a=Ao(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(a)return n.getViewOfComponentModel(a).group.traverse((function(e){var n=Hs(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o?{componentMainType:r,componentIndex:a.componentIndex,el:o}:void 0}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},o)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=Uz;u.x=i.x,u.y=i.y,u.update(),Hs(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=eN(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(jz(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s&&"axis"===Zz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,xy(n,(function(t){return null!=Hs(t).dataIndex?(r=t,!0):null!=Hs(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=W(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Zz([e.tooltipOption],i),a=this._renderMode,s=[],l=Xf("section",{blocks:[],noHeader:!0}),u=[],h=new ig;E(t,(function(t){E(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=zR(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=Xf("section",{header:o,noHeader:!ut(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),E(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=s_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",pp(f.color),a);var g=uf(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=Zz([p],i).get("valueFormatter");c.blocks.push(v?A({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=Jf(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"
",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=Hs(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Zz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new ig;g.marker=y.makeTooltipMarker("item",pp(g.color),c);var v=uf(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?Jf(x?A({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=Hs(e),r=i.tooltipConfig.option||{};X(r)&&(r={content:r,formatter:r});var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Zz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new ig;this._showOrMove(l,(function(){var n=T(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent;u.setEnterable(t.get("enterable"));var h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=Y(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=Vc(f.axisValue,c,d)),c=hp(c,n,!0)}else if(U(h)){var g=W((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||Y(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:Y(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),U(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),Y(e))n=Er(e[0],s),i=Er(e[1],l);else if(q(e)){var d=e;d.width=u[0],d.height=u[1];var f=xp(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];return null!=o&&(t+l+o+2>i?t-=l+o:t+=o),null!=a&&(e+u+a>r?e-=u+a:e+=a),[t,e]}(n,i,r,s,l,h?null:20,c?null:20),n=g[0],i=g[1];h&&(n-=qz(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=qz(c)?u[1]/2:"bottom"===c?u[1]:0),kz(t)&&(g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,[t=Math.max(t,0),e=Math.max(e,0)]}(n,i,r,s,l),n=g[0],i=g[1]),r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&E(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&E(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&E(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&E(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){!r.node&&e.getDom()&&(kg(this,"_updatePosition"),this._tooltipContent.dispose(),QR("itemTooltip",e))},e.type="tooltip",e}(gg);function Zz(t,e,n){var i,r=e.ecModel;n?(i=new dc(n,r,r),i=new dc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof dc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new dc(a,i,r)))}return i}function jz(t,e){return t.dispatchAction||W(e.dispatchAction,e)}function qz(t){return"center"===t||"middle"===t}var Kz=["rect","polygon","keep","clear"];function $z(t,e){var n=ho(t?t.brush:[]);if(n.length){var i=[];E(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;Y(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};E(t,(function(t){e[t]=1})),t.length=0,E(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,Kz)}}var Jz=E;function Qz(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function tV(t,e,n){var i={};return Jz(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);Jz(t[e],(function(t,i){if(iD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new iD(r),"opacity"===i&&((r=T(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new iD(r))}}))})),i}function eV(t,e,n){var i;E(n,(function(t){e.hasOwnProperty(t)&&Qz(e[t])&&(i=!0)})),i&&E(n,(function(n){e.hasOwnProperty(n)&&Qz(e[n])?t[n]=T(e[n]):delete t[n]}))}var nV={lineX:iV(0),lineY:iV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&y_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(y_(i,r,o)||y_(i,r+a,o)||y_(i,r,o+s)||y_(i,r+a,o+s)||sr.create(t).contain(l[0],l[1])||Oh(r,o,r+a,o,i)||Oh(r,o,r,o+s,i)||Oh(r+a,o,r+a,o+s,i)||Oh(r,o+s,r+a,o+s,i))||void 0}}};function iV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return rV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]e[0][1]&&(e[0][1]=o[0]),o[1]e[1][1]&&(e[1][1]=o[1])}return e&&dV(e)}};function dV(t){return new sr(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var fV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Ok(e.getZr())).on("brush",W(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){lV(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:T(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:T(n),$from:e})},e.type="brush",e}(gg),gV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&eV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=z(t,(function(t){return yV(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=yV(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Tp);function yV(t,e){return C({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new dc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var vV=["rect","polygon","lineX","lineY","keep","clear"],mV=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,E(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return E(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:vV.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(GE),xV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(Tp),_V=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=rt(t.get("textBaseline"),t.get("textVerticalAlign")),l=new ks({style:Uh(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new ks({style:Uh(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){dp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){dp(d,"_"+t.get("subtarget"))})),Hs(l).eventData=Hs(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=xp(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Cs({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(gg),bV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],E(n,(function(e,n){var i,o=xo(fo(e),"");q(e)?(i=T(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new qm([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(Tp),wV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=yc(bV.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(bV);R(wV,lf.prototype);var SV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(gg),MV=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(H_),IV=Math.PI,TV=So(),CV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return Xf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},E(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:IV/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*IV/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;Ei(o,o,[-a,-s]),zi(o,o,-IV/2),Ei(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f),n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new vx({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new Rx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new xx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new MV("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Cr;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new zu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:A({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new zu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:k({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],E(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:W(r._changeTimeline,r,t.value)},p=DV(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Ol(p);var d=Hs(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],E(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new ks({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:W(r._changeTimeline,r,a),silent:!1,style:Uh(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=Uh(u),p.ensureState("progress").style=Uh(h),e.add(p),Ol(p),TV(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=gr(rt(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Ph(t.get(["controlStyle",e]),i||{},new sr(n[0],n[1],n[2],n[3]));return r&&o.setStyle(r),o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Ol(c)}}h(t.nextBtnPosition,"next",W(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",W(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",W(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=W(s._handlePointerDrag,s),t.ondragend=W(s._handlePointerDragend,s),AV(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){AV(t,s._progressLine,o,n,i)}};this._currentPointer=DV(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Vr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var FV={min:H(BV,"min"),max:H(BV,"max"),average:H(BV,"average"),median:H(BV,"median")};function GV(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!Y(e.coord)&&i){var r=i.dimensions,o=WV(e,n,i,t);if((e=T(e)).type&&FV[e.type]&&o.baseAxis&&o.valueAxis){var a=P(r,o.baseAxis.dim),s=P(r,o.valueAxis.dim),l=FV[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)FV[u[h]]&&(u[h]=UV(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function WV(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function HV(t,e){return!(t&&t.containData&&e.coord&&!VV(e))||t.containData(e.coord)}function YV(t,e){return t?function(t,n,i,r){return df(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return df(t.value,e[r])}}function UV(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var XV=So(),ZV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ft()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){XV(t).keep=!1})),e.eachSeries((function(t){var r=EV.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!XV(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){XV(t).keep=!0},e.prototype.toggleBlurSeries=function(t,e){var n=this;E(t,(function(t){var i=EV.getMarkerModelFromSeries(t,n.type);i&&i.getData().eachItemGraphicEl((function(t){t&&(e?wl(t):Sl(t))}))}))},e.type="marker",e}(gg);function jV(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Er(a.get("x"),n.getWidth()),l=Er(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var qV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markPoint");e&&(jV(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new qw),u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new qm(i,n),o=z(n.get("data"),H(GV,e));t&&(o=B(o,H(HV,t)));var a=YV(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),jV(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(U(i)||U(r)||U(o)||U(s)){var h=e.getRawValue(t),c=e.getDataParams(t);U(i)&&(i=i(h,c)),U(r)&&(r=r(h,c)),U(o)&&(o=o(h,c)),U(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=gy(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){Hs(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(ZV),KV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(EV),$V=So(),JV=function(t,e,n,i){var r,o=t.getData();if(Y(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=it(i.yAxis,i.xAxis);else{var u=WV(i,o,e,t);s=u.valueAxis,l=UV(o,ix(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=T(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&j(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[GV(t,r[0]),GV(t,r[1]),A({},r[2])];return g[2].type=g[2].type||null,C(g[2],g[0]),C(g[2],g[1]),g};function QV(t){return!isNaN(t)&&!isFinite(t)}function tB(t,e,n,i){var r=1-t,o=i.dimensions[t];return QV(e[r])&&QV(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function eB(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(tB(1,n,i,t)||tB(0,n,i,t)))return!0}return HV(t,e[0])&&HV(t,e[1])}function nB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get("x"),r.getWidth()),u=Er(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(uS(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions,QV(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):QV(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var iB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=$V(e).from,o=$V(e).to;r.each((function(e){nB(r,e,!0,t,n),nB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new gA);this.group.add(l.group);var u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new qm(i,n),o=new qm(i,n),a=new qm([],n),s=z(n.get("data"),H(JV,e,t,n));t&&(s=B(s,H(eB,t)));var l=YV(!!t,i);return r.initData(z(s,(function(t){return t[0]})),null,l),o.initData(z(s,(function(t){return t[1]})),null,l),a.initData(z(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;$V(e).from=h,$V(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);nB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=gy(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:rt(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:rt(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:rt(o.get("symbolSize"),f[r?0:1]),symbol:rt(o.get("symbol",!0),d[r?0:1]),style:s})}Y(d)||(d=[d,d]),Y(f)||(f=[f,f]),Y(g)||(g=[g,g]),Y(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t){Hs(t).dataModel=e,t.traverse((function(t){Hs(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(ZV),rB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(EV),oB=So(),aB=function(t,e,n,i){var r=GV(t,i[0]),o=GV(t,i[1]),a=r.coord,s=o.coord;a[0]=it(a[0],-1/0),a[1]=it(a[1],-1/0),s[0]=it(s[0],1/0),s[1]=it(s[1],1/0);var l=D([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function sB(t){return!isNaN(t)&&!isFinite(t)}function lB(t,e,n,i){var r=1-t;return sB(e[r])&&sB(n[r])}function uB(t,e){var n=e.coord[0],i=e.coord[1],r={coord:n,x:e.x0,y:e.y0},o={coord:i,x:e.x1,y:e.y1};return uS(t,"cartesian2d")?!(!n||!i||!lB(1,n,i)&&!lB(0,n,i))||function(t,e,n){return!(t&&t.containZone&&e.coord&&n.coord&&!VV(e)&&!VV(n))||t.containZone(e.coord,n.coord)}(t,r,o):HV(t,r)||HV(t,o)}function hB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get(n[0]),r.getWidth()),u=Er(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(uS(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);sB(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):sB(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var cB=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],pB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=z(cB,(function(r){return hB(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Cr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r;if(t){var a=z(t&&t.dimensions,(function(t){var n=e.getData();return A(A({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=z(["x0","y0","x1","y1"],(function(t,e){return{name:t,type:a[e%2].type}})),i=new qm(r,n)}else i=new qm(r=[{name:"value",type:"float"}],n);var s=z(n.get("data"),H(aB,e,t,n));t&&(s=B(s,H(uB,t)));var l=t?function(t,e,n,i){return df(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return df(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=z(cB,(function(n){return hB(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Vr(c),Vr(p);var d=!!(l[0]>c[1]||l[1]p[1]||h[1]=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Tp),fB=H,gB=E,yB=Cr,vB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new yB),this.group.add(this._selectorGroup=new yB),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=xp(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=xp(k({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=XE(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ft(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),gB(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new yB;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a))if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u,i).on("click",fB(mB,a,null,i,h)).on("mouseover",fB(_B,p.name,null,i,h)).on("mouseout",fB(bB,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=bn(p.fill);f&&0===f[3]&&(f[3]=.2,p=A(A({},p),{fill:kn(f,"rgba")})),this._createItem(n,a,o,r,e,t,{},p,d,u,i).on("click",fB(mB,null,a,i,h)).on("mouseover",fB(_B,null,a,i,h)).on("mouseout",fB(bB,null,a,i,h)),l.set(a,!0)}}),this)}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();gB(t,(function(t){var i=t.type,r=new ks({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),Hh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Ol(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u,h){var c=t.visualDrawType,p=r.get("itemWidth"),d=r.get("itemHeight"),f=r.isSelected(e),g=i.get("symbolRotate"),y=i.get("symbolKeepAspect"),v=i.get("icon"),m=function(t,e,n,i,r,o,a){function s(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),gB(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var l=e.getModel("itemStyle"),u=l.getItemStyle(),h=0===t.lastIndexOf("empty",0)?"fill":"stroke",c=l.getShallow("decal");u.decal=c&&"inherit"!==c?rv(c,a):i.decal,"inherit"===u.fill&&(u.fill=i[r]),"inherit"===u.stroke&&(u.stroke=i[h]),"inherit"===u.opacity&&(u.opacity=("fill"===r?i:n).opacity),s(u,i);var p=e.getModel("lineStyle"),d=p.getLineStyle();if(s(d,n),"auto"===u.fill&&(u.fill=i.fill),"auto"===u.stroke&&(u.stroke=i.fill),"auto"===d.stroke&&(d.stroke=i.fill),!o){var f=e.get("inactiveBorderWidth"),g=u[h];u.lineWidth="auto"===f?i.lineWidth>0&&g?2:0:u.lineWidth,u.fill=e.get("inactiveColor"),u.stroke=e.get("inactiveBorderColor"),d.stroke=p.get("inactiveColor"),d.lineWidth=p.get("inactiveWidth")}return{itemStyle:u,lineStyle:d}}(l=v||l||"roundRect",i,a,s,c,f,h),x=new yB,_=i.getModel("textStyle");if(!U(t.getLegendIcon)||v&&"inherit"!==v){var b="inherit"===v&&t.getData().getVisual("symbol")?"inherit"===g?t.getData().getVisual("symbolRotate"):g:0;x.add(function(t){var e=t.icon||"roundRect",n=Ly(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);return n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n}({itemWidth:p,itemHeight:d,icon:l,iconRotate:b,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}))}else x.add(t.getLegendIcon({itemWidth:p,itemHeight:d,icon:l,iconRotate:g,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}));var w="left"===o?p+5:-5,S=o,M=r.get("formatter"),I=e;X(M)&&M?I=M.replace("{name}",null!=e?e:""):U(M)&&(I=M(e));var T=i.get("inactiveColor");x.add(new ks({style:Uh(_,{text:I,x:w,y:d/2,fill:f?_.getTextColor():T,align:S,verticalAlign:"middle"})}));var C=new Cs({shape:x.getBoundingRect(),invisible:!0}),D=i.getModel("tooltip");return D.get("show")&&Eh({el:C,componentModel:r,itemName:e,itemTooltipOption:D.option}),x.add(C),x.eachChild((function(t){t.silent=!0})),C.silent=!u,this.getContentGroup().add(x),Ol(x),x.__legendDataIndex=n,x},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();mp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){mp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(gg);function mB(t,e,n,i){bB(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),_B(t,e,n,i)}function xB(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;in[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=rt(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v),y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Cs({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&rh(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;E(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=DB[r],a=AB[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(vB);function LB(t){wm(MB),t.registerComponentModel(IB),t.registerComponentView(kB),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var PB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=yc(AE.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(AE),OB=So();function NB(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function EB(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function zB(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}var BB=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),function(t,e,n){OB(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}(i,e,{pan:W(FB.pan,this),zoom:W(FB.zoom,this),scrollMove:W(FB.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=OB(t).coordSysRecordMap,i=n.keys(),r=0;r0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return lk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:GB((function(t,e,n,i,r,o){var a=WB[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:GB((function(t,e,n,i,r,o){return WB[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function GB(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return lk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var WB={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function HB(t){BE(t),t.registerComponentModel(PB),t.registerComponentView(BB),function(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=OB(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ft());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){E(CE(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:H(zB,e),dispatchAction:H(EB,t),dataZoomInfoMap:null,controller:null},i=n.controller=new kI(t.getZr());return E(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ft())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Ag(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else NB(i,t)}))}))}(t)}var YB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=yc(AE.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(AE),UB=Cs,XB="horizontal",ZB="vertical",jB=["line","bar","candlestick","scatter"],qB={easing:"cubicOut",duration:100,delay:0},KB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=W(this._onBrush,this),this._onBrushEnd=W(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Ag(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){kg(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Cr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===XB?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Sp(t.option);E(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=xp(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===ZB&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==XB||r?n===XB&&r?{scaleY:a?1:-1,scaleX:-1}:n!==ZB||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new UB({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new UB({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:W(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=this._shadowPolygonPts,s=this._shadowPolylinePts;if(r!==this._shadowData||o!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var l=r.getDataExtent(o),u=.3*(l[1]-l[0]);l=[l[0]-u,l[1]+u];var h,c=[0,e[1]],p=[0,e[0]],d=[[e[0],0],[0,0]],f=[],g=p[1]/(r.count()-1),y=0,v=Math.round(r.count()/e[0]);r.each([o],(function(t,e){if(v>0&&e%v)y+=g;else{var n=null==t||isNaN(t)||""===t,i=n?0:Nr(t,l,c,!0);n&&!h&&e?(d.push([d[d.length-1][0],0]),f.push([f[f.length-1][0],0])):!n&&h&&(d.push([y,0]),f.push([y,0])),d.push([y,i]),f.push([y,i]),y+=g,h=n}})),a=this._shadowPolygonPts=d,s=this._shadowPolylinePts=f}this._shadowData=r,this._shadowDim=o,this._shadowSize=[e[0],e[1]];for(var m=this.dataZoomModel,x=0;x<3;x++){var _=b(1===x);this._displayables.sliderGroup.add(_),this._displayables.dataShadowSegs.push(_)}}}function b(t){var e=m.getModel(t?"selectedDataBackground":"dataBackground"),n=new Cr,i=new Pu({shape:{points:a},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Ru({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){E(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&P(jB,t.get("type"))<0)){var a,s=i.getComponent(IE(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new UB({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new UB({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],(function(e){var o=a.get("handleIcon");!Dy[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=Ly(o,-1,0,2,2,null,!0);s.attr({cursor:$B(this._orient),draggable:!0,drift:W(this._onDragMove,this,e),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Er(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Ol(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new ks({silent:!0,invisible:!0,style:Uh(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Er(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Cs({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=Ly(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Cs({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:$B(this._orient),drift:W(this._onDragMove,this,"all"),ondragstart:W(this._showDataInfo,this,!0),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Nr(t[0],[0,100],e,!0),Nr(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];lk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Nr(o.minSpan,a,r,!0):null,null!=o.maxSpan?Nr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Vr([Nr(i[0],r,a,!0),Nr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Vr(n.slice()),r=this._size;E([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;le[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ji(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Vr([Nr(n.x,i,r,!0),Nr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(se(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new UB({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?qB:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=CE(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(PE);function $B(t){return"vertical"===t?"ns-resize":"ew-resize"}function JB(t){t.registerComponentModel(YB),t.registerComponentView(KB),BE(t)}var QB=function(t,e,n){var i=T((tF[t]||{})[e]);return n&&Y(i)?i[i.length-1]:i},tF={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},eF=iD.mapVisual,nF=iD.eachVisual,iF=Y,rF=E,oF=Vr,aF=Nr,sF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&eV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=W(t,this),this.controllerVisuals=tV(this.option.controller,e,t),this.targetVisuals=tV(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=ho(t),e},e.prototype.eachTargetSeries=function(t,e){E(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],Y(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):U(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=oF([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});C(i,n),C(r,n);var o=this.isCategory();function a(n){iF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},rF(i,(function(t,e){if(iD.isValidType(e)){var n=QB(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";rF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&T(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&T(n)||(o?s[0]:[s[0],s[0]])),l.symbol=eF(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;nF(u,(function(t){t>h&&(h=t)})),l.symbolSize=eF(u,(function(t){return aF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(Tp),lF=[20,140],uF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=lF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=lF[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):Y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=Vr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=hF(this,"outOfRange",this.getExtent()),n=hF(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;at[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Cr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();yF([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=gF(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Th(n.handleLabelPoints[l],Ih(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=gF(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Th(l.indicatorLabelPoint,Ih(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;Sr[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||bF(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function TF(t,e,n,i){for(var r=e.targetVisuals[i],o=iD.prepareVisualTypes(r),a={color:gy(t.getData(),"color")},s=0,l=o.length;s0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(SF,MF),E(IF,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(DF))}function PF(t){t.registerComponentModel(uF),t.registerComponentView(xF),LF(t)}var OF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],RF[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=T(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=z(this._pieceList,(function(t){return t=T(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=iD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}E(e.pieces,(function(t){E(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),E(n,(function(t,n){var i=!1;E(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&E(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=QB(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,E(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;E(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=T(t)},e.prototype.getValueState=function(t){var e=iD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){iD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return E(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=yc(sF.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(sF),RF={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function NF(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var EF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=it(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),E(l.viewPieceList,(function(i){var l=i.piece,u=new Cr;u.onclick=W(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new ks({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),mp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:fF(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return dF(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Cr,a=this.visualMapModel.textStyleModel;o.add(new ks({style:Uh(a,{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e})})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=z(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(Ly(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=n.selectedMode;if(i){var r=T(n.selected),o=e.getSelectedMapKey(t);"single"===i||!0===i?(r[o]=!0,E(r,(function(t,e){r[e]=e===o}))):r[o]=!r[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:r})}},e.type="visualMap.piecewise",e}(cF);function zF(t){t.registerComponentModel(OF),t.registerComponentView(EF),LF(t)}var VF={label:{enabled:!0},decal:{show:!1}},BF=So(),FF={};function GF(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=T(VF);C(i.label,t.getLocaleModel().get("aria"),!1),C(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ft();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),BF(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(U(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=ed(e.ecModel,e.name,FF,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=BF(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=ed(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?A(A({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=k(o.option,i),o.get("enabled")){var a=e.getZr().dom;if(o.get("description"))a.setAttribute("aria-label",o.get("description"));else{var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(!(l<1)){var p=function(){var e=t.get("title");return e&&e.length&&(e=e[0]),e&&e.text}();if(p)s=r(o.get(["general","withTitle"]),{title:p});else s=o.get(["general","withoutTitle"]);var f=[];s+=r(l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]),{seriesCount:l}),t.eachSeries((function(e,n){if(n1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,t.getLocaleModel().get(["series","typeNames"])[x]||"自定义图")});var s=e.getData();s.count()>u?i+=r(o.get(["data","partialData"]),{displayCnt:u}):i+=o.get(["data","allData"]);for(var h=o.get(["data","separator","middle"]),p=o.get(["data","separator","end"]),d=[],g=0;g":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},YF=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):et(t)?t:null)){ao("")}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!j(e)&&this._condVal.test(t+"")},t}(),UF=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),XF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e2&&l.push(e),e=[t,n]}function f(t,n,i,r){oG(t,i)&&oG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=nM:C2&&l.push(e),l}function sG(t,e,n,i,r,o,a,s,l,u){if(oG(t,n)&&oG(e,i)&&oG(r,a)&&oG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x=0&&_-w*w=0)l.push(a,s);else{var S=[],M=[];Ze(t,n,r,a,.5,S),Ze(e,i,o,s,.5,M),sG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),sG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function lG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u0)for(u=0;uMath.abs(u),c=lG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d1?null:new Ji(d*l+t,d*u+e)}function pG(t,e,n){var i=new Ji;Ji.sub(i,n,e),i.normalize();var r=new Ji;return Ji.sub(r,t,e),r.dot(i)}function dG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function fG(t){var e=t.points,n=[],i=[];Ma(e,n,i);var r=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ji,h=new Ji;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;o0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function LG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=z(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return z(o,(function(o,a){return{cp:o,z:kG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function PG(t){return function(t,e){var n,i=[],r=t.shape;switch(t.type){case"rect":!function(t,e,n){for(var i=t.width,r=t.height,o=i>r,a=lG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var NG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);OG(t)&&(s=t,l=e),OG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?RG(l,s):RG(c?e:t,[c?t:e]),d=0,f=0;f1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n0&&i.group.traverse((function(t){t instanceof gs&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function UG(t){return t.getModel("universalTransition").get("seriesKey")||t.id}function XG(t){return Y(t)?t.sort().join(","):t}function ZG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function jG(t,e){for(var n=0;n=0&&r.push({data:e.oldData[n],divide:ZG(e.oldData[n]),dim:t.dimension})})),E(ho(t.to),(function(t){var e=jG(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:ZG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&YG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ft(),i=ft(),r=ft();return E(t.oldSeries,(function(e,n){var o=t.oldData[n],a=UG(e),s=XG(a);i.set(s,o),Y(a)&&E(a,(function(t){r.set(t,{data:o,key:s})}))})),E(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=UG(t),a=XG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:ZG(s),data:s}],newSeries:[{divide:ZG(e),data:e}]});else if(Y(o)){var l=[];E(o,(function(t){var e=i.get(t);e&&l.push({divide:ZG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:ZG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:ZG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:ZG(e)})}}}})),n}(i,n);E(o.keys(),(function(t){var n=o.get(t);YG(n.oldSeries,n.newSeries,e)}))}E(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u { + return ctx.createCircularGradient(arguments); + }; + } + + _initEvent() { + this.event = {}; + const eventNames = [{ + wxName: 'touchStart', + ecName: 'mousedown' + }, { + wxName: 'touchMove', + ecName: 'mousemove' + }, { + wxName: 'touchEnd', + ecName: 'mouseup' + }, { + wxName: 'touchEnd', + ecName: 'click' + }]; + eventNames.forEach(name => { + this.event[name.wxName] = e => { + const touch = e.touches[0]; + this.chart.getZr().handler.dispatch(name.ecName, { + zrX: name.wxName === 'tap' ? touch.clientX : touch.x, + zrY: name.wxName === 'tap' ? touch.clientY : touch.y, + preventDefault: () => {}, + stopImmediatePropagation: () => {}, + stopPropagation: () => {} + }); + }; + }); + } + + set width(w) { + if (this.canvasNode) this.canvasNode.width = w + } + set height(h) { + if (this.canvasNode) this.canvasNode.height = h + } + + get width() { + if (this.canvasNode) + return this.canvasNode.width + return 0 + } + get height() { + if (this.canvasNode) + return this.canvasNode.height + return 0 + } +} diff --git a/src/components/login/index.json b/src/components/login/index.json new file mode 100644 index 0000000..074f50b --- /dev/null +++ b/src/components/login/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/components/login/index.scss b/src/components/login/index.scss new file mode 100644 index 0000000..1b4824a --- /dev/null +++ b/src/components/login/index.scss @@ -0,0 +1,60 @@ +.login1 { + .logo { + position: relative; + z-index: 1; + display: block; + margin: 0 auto -82rpx; + width: 164rpx; + height: 164rpx; + } + .container { + width: 100%; + box-sizing: border-box; + border-radius: 32rpx 0; + padding: 136rpx 60rpx calc(env(safe-area-inset-bottom) + 64rpx); + background: linear-gradient(6deg, #ffffff 0%, #ffe6e4 100%); + .title { + text-align: center; + color: rgba(1, 1, 5, 1); + font-size: 40rpx; + font-weight: bold; + } + .content { + margin-top: 16rpx; + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + text-align: center; + } + .btn { + margin-top: 64rpx; + height: 88rpx; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: none; + outline: none; + font-size: 32rpx; + color: rgba(247, 247, 247, 1); + display: flex; + align-items: center; + justify-content: center; + &::after { + border: none; + } + } + .check { + margin-top: 40rpx; + display: flex; + align-items: center; + .checkbox { + transform: scale(0.8); + } + .check-content { + font-size: 32rpx; + color: rgba(1, 1, 5, 0.3); + .link { + color: rgba(242, 58, 47, 1); + } + } + } + } +} diff --git a/src/components/login/index.ts b/src/components/login/index.ts new file mode 100644 index 0000000..2d784da --- /dev/null +++ b/src/components/login/index.ts @@ -0,0 +1,28 @@ +const app = getApp() + +Component({ + properties: { + show: { + type: Boolean, + value: false, + }, + }, + data: { + imageUrl: app.globalData.imageUrl, + Timestamp:app.globalData.Timestamp + }, + methods: { + handleOk() { + this.setData({ + show: false, + }) + this.triggerEvent('ok') + }, + handleCancel() { + this.setData({ + show: false, + }) + this.triggerEvent('cancel') + }, + }, +}) diff --git a/src/components/login/index.wxml b/src/components/login/index.wxml new file mode 100644 index 0000000..0f3730d --- /dev/null +++ b/src/components/login/index.wxml @@ -0,0 +1,25 @@ + + + + + 立即授权 + 解锁更多基因治疗知识 + + + + + 我已阅读并同意 + 《个人信息及隐私政策》 + + + + + diff --git a/src/components/navbar/index.json b/src/components/navbar/index.json new file mode 100644 index 0000000..9017265 --- /dev/null +++ b/src/components/navbar/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-nav-bar": "@vant/weapp/nav-bar/index" + } +} diff --git a/src/components/navbar/index.scss b/src/components/navbar/index.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/components/navbar/index.ts b/src/components/navbar/index.ts new file mode 100644 index 0000000..0cb5894 --- /dev/null +++ b/src/components/navbar/index.ts @@ -0,0 +1,50 @@ +const app = getApp() + +Component({ + options: { + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + }, + properties: { + title: String, + fixed: Boolean, + placeholder: Boolean, + leftText: String, + rightText: String, + customStyle: String, + leftArrow: Boolean, + border: { + type: Boolean, + value: false, + }, + zIndex: { + type: Number, + value: 1, + }, + + back: { + type: Boolean, + value: true, + }, + }, + + /** + * 组件的初始数据 + */ + data: { + imageUrl: app.globalData.imageUrl, + Timestamp:app.globalData.Timestamp + }, + + /** + * 组件的方法列表 + */ + methods: { + onClickLeft() { + if(this.data.back) + this.triggerEvent('clickLeft', {}, {}) + }, + onClickRight() { + this.triggerEvent('clickRight', {}, {}) + }, + }, +}) diff --git a/src/components/navbar/index.wxml b/src/components/navbar/index.wxml new file mode 100644 index 0000000..26fabe6 --- /dev/null +++ b/src/components/navbar/index.wxml @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/pagination/index.js b/src/components/pagination/index.js new file mode 100644 index 0000000..60d4803 --- /dev/null +++ b/src/components/pagination/index.js @@ -0,0 +1,21 @@ +const app = getApp(); + +Component({ + properties: { + pagination: { + type: Object, + value() { + return {}; + }, + }, + }, + data: { + imageUrl: app.globalData.imageUrl, + Timestamp:app.globalData.Timestamp + }, + methods: { + handleTouchmove() { + return false; + }, + }, +}); diff --git a/src/components/pagination/index.json b/src/components/pagination/index.json new file mode 100644 index 0000000..24029b0 --- /dev/null +++ b/src/components/pagination/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-divider": "@vant/weapp/divider/index" + } +} diff --git a/src/components/pagination/index.scss b/src/components/pagination/index.scss new file mode 100644 index 0000000..08a9dea --- /dev/null +++ b/src/components/pagination/index.scss @@ -0,0 +1,6 @@ +/* components/pagination/index.wxss */ +.none { + display: block; + margin: 30rpx auto; + width: 80%; +} diff --git a/src/components/pagination/index.wxml b/src/components/pagination/index.wxml new file mode 100644 index 0000000..6bf20b8 --- /dev/null +++ b/src/components/pagination/index.wxml @@ -0,0 +1,6 @@ + + + + 加载中... + +没有更多了 diff --git a/src/components/pickerArea/index.json b/src/components/pickerArea/index.json new file mode 100644 index 0000000..cf286db --- /dev/null +++ b/src/components/pickerArea/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "@vant/weapp/popup/index", + "van-icon": "@vant/weapp/icon/index" + } +} diff --git a/src/components/pickerArea/index.scss b/src/components/pickerArea/index.scss new file mode 100644 index 0000000..cbd27b5 --- /dev/null +++ b/src/components/pickerArea/index.scss @@ -0,0 +1,128 @@ +.aside-share { + position: fixed; + right: 22rpx; + bottom: 120rpx; + width: 136rpx; + height: 136rpx; +} + +.popup { + position: relative; + background-color: #fff; + .close { + position: absolute; + top: 52rpx; + right: 32rpx; + color: rgba(72, 72, 72, 1); + font-size: 34rpx; + } + .p-header { + padding: 46rpx 30rpx 0; + .title { + text-align: center; + font-size: 36rpx; + color: rgba(72, 72, 72, 1); + font-weight: bold; + } + .tip { + text-align: center; + margin-top: 16rpx; + font-size: 32rpx; + color: rgba(72, 72, 72, 1); + } + .area { + margin-top: 48rpx; + display: flex; + align-items: center; + justify-content: space-between; + gap: 14rpx; + .item { + flex: 1; + padding: 18rpx 30rpx; + box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.11); + border-radius: 12rpx 12rpx 12rpx 12rpx; + border: 2rpx solid #f23a2f; + display: flex; + align-items: center; + justify-content: space-between; + .content { + font-size: 32rpx; + color: rgba(72, 72, 72, 1); + max-width: 5em; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .icon { + width: 32rpx; + height: 32rpx; + } + } + .picker { + flex: 1; + } + .btn { + width: 126rpx; + height: 76rpx; + font-size: 32rpx; + color: rgba(255, 255, 255, 1); + display: flex; + align-items: center; + justify-content: center; + background: #f23a2f; + border-radius: 12rpx 12rpx 12rpx 12rpx; + } + } + } + .select { + margin-top: 44rpx; + padding: 0 30rpx 0; + display: grid; + grid-template-columns: repeat(auto-fit, 68rpx); + gap: 26rpx 20rpx; + .s-item { + width: 68rpx; + height: 68rpx; + text-align: center; + line-height: 68rpx; + font-size: 28rpx; + color: rgba(158, 158, 158, 1); + border-radius: 50%; + background: #f7f8f9; + &.active { + color: #fff; + background-color: #f23a2f; + } + } + } + .scroll { + padding: 0 30rpx; + height: 45vh; + box-sizing: border-box; + .item { + padding: 32rpx 0; + font-size: 28rpx; + color: rgba(72, 72, 72, 1); + border-bottom: 2px solid #fbfbfb; + display: flex; + align-items: center; + justify-content: space-between; + .word { + margin-right: 24rpx; + display: inline-block; + width: 1em; + color: rgba(158, 158, 158, 1); + } + .icon { + width: 36rpx; + height: 36rpx; + } + &.active { + color: #f23a2f; + .word { + color: #f23a2f; + } + } + } + } +} diff --git a/src/components/pickerArea/index.ts b/src/components/pickerArea/index.ts new file mode 100644 index 0000000..eeccd32 --- /dev/null +++ b/src/components/pickerArea/index.ts @@ -0,0 +1,316 @@ +const app = getApp() + +Component({ + properties: { + // 省份名称 + pname: { + type: String, + value: '', + }, + // 省份ID + pid: { + type: String, + value: '', + }, + // 城市名称 + cname: { + type: String, + value: '', + }, + // 城市ID + cid: { + type: String, + value: '', + }, + }, + observers: { + show(newVal: boolean) { + this.triggerEvent('show', newVal) + }, + }, + data: { + show: false, + word: '', + imageUrl: app.globalData.imageUrl, + Timestamp: app.globalData.Timestamp, + + active: 0, + ProvinceName: '', + ProvinceId: '', + CityName: '', + CityId: '', + proList: { + A: [ + { + name: '安徽省', + code: '340000', + }, + { + name: '澳门特别行政区', + code: '820000', + }, + ], + B: [ + { + name: '北京市', + code: '110000', + }, + ], + C: [ + { + name: '重庆市', + code: '500000', + }, + ], + F: [ + { + name: '福建省', + code: '350000', + }, + ], + G: [ + { + name: '甘肃省', + code: '620000', + }, + { + name: '广东省', + code: '440000', + }, + { + name: '广西壮族自治区', + code: '450000', + }, + { + name: '贵州省', + code: '520000', + }, + ], + H: [ + { + name: '海南省', + code: '460000', + }, + { + name: '河北省', + code: '130000', + }, + { + name: '河南省', + code: '410000', + }, + { + name: '黑龙江省', + code: '230000', + }, + { + name: '湖北省', + code: '420000', + }, + { + name: '湖南省', + code: '430000', + }, + ], + J: [ + { + name: '吉林省', + code: '220000', + }, + { + name: '江苏省', + code: '320000', + }, + { + name: '江西省', + code: '360000', + }, + ], + L: [ + { + name: '辽宁省', + code: '210000', + }, + ], + N: [ + { + name: '宁夏回族自治区', + code: '640000', + }, + { + name: '内蒙古自治区', + code: '150000', + }, + ], + Q: [ + { + name: '青海省', + code: '630000', + }, + ], + S: [ + { + name: '山东省', + code: '370000', + }, + { + name: '山西省', + code: '140000', + }, + { + name: '陕西省', + code: '610000', + }, + { + name: '上海市', + code: '310000', + }, + { + name: '四川省', + code: '510000', + }, + ], + T: [ + { + name: '天津市', + code: '120000', + }, + { + name: '台湾省', + code: '710000', + }, + ], + X: [ + { + name: '西藏自治区', + code: '540000', + }, + { + name: '新疆维吾尔自治区', + code: '650000', + }, + { + name: '香港特别行政区', + code: '810000', + }, + ], + Y: [ + { + name: '云南省', + code: '530000', + }, + ], + Z: [ + { + name: '浙江省', + code: '330000', + }, + ], + }, + area: [] as any, + range: [], + + scrollIntoView0: '', + scrollIntoView1: '', + }, + methods: { + handleShow() { + this.setData({ + show: true, + ProvinceName: this.data.pname || '', + ProvinceId: this.data.pid || '', + CityName: this.data.cname || '', + CityId: this.data.cid || '', + + scrollIntoView0: this.data.pid || '', + scrollIntoView1: this.data.cid || '', + }) + this.getArea() + }, + getArea() { + wx.ajax({ + method: 'GET', + url: '/js/area.json', + isJSON: true, + }).then((res) => { + this.setData({ + area: res, + }) + this.getRangeList() + }) + }, + handleItem(e: any) { + const { code, name } = e.currentTarget.dataset + this.setData({ + ProvinceId: code, + ProvinceName: name, + CityId: '', + CityName: '', + }) + this.getRangeList() + }, + handleChangeCity(e: any) { + const { code, name } = e.currentTarget.dataset + this.setData({ + CityId: code, + CityName: name, + }) + }, + handleShare() { + this.setData({ + show: false, + }) + this.triggerEvent('change', [ + { + label: this.data.ProvinceName, + value: this.data.ProvinceId, + }, + { + label: this.data.CityName, + value: this.data.CityId, + }, + ]) + }, + handleSelect(e) { + const { id } = e.currentTarget.dataset + this.setData({ + word: id, + scrollIntoView0: id, + }) + }, + getRangeList() { + const { area, ProvinceId } = this.data + if (!ProvinceId) return + const range = area.filter((item: any) => item.value == ProvinceId)[0].children + this.setData({ + range, + active: 1, + scrollIntoView0: '', + scrollIntoView1: `id${this.data.CityId}`, + }) + }, + handleProvince() { + this.setData({ + active: 0, + scrollIntoView0: this.data.word || `id${this.data.ProvinceId}`, + scrollIntoView1: '', + }) + }, + handleCity() { + const { ProvinceId } = this.data + if (!ProvinceId) { + wx.showToast({ + title: '请先选择省份', + icon: 'none', + }) + return + } + this.getRangeList() + }, + handleClose() { + this.setData({ + show: false, + }) + }, + }, +}) diff --git a/src/components/pickerArea/index.wxml b/src/components/pickerArea/index.wxml new file mode 100644 index 0000000..f4b30a8 --- /dev/null +++ b/src/components/pickerArea/index.wxml @@ -0,0 +1,81 @@ + + + + + + + 选择省份和地区 + + + + {{ProvinceName || '请选择省份'}} + + + + {{CityName || '请选择城市'}} + + + 确定 + + + + + + {{item.label}} + + + + + + + {{index}} + + + + + + + + + {{index===0 ? key : ''}} + {{item.name}} + + + + + + + + diff --git a/src/components/pickerAreaBak/index.json b/src/components/pickerAreaBak/index.json new file mode 100644 index 0000000..9a0f641 --- /dev/null +++ b/src/components/pickerAreaBak/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "@vant/weapp/popup/index", + "van-cascader": "@vant/weapp/cascader/index" + } +} diff --git a/src/components/pickerAreaBak/index.scss b/src/components/pickerAreaBak/index.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/components/pickerAreaBak/index.ts b/src/components/pickerAreaBak/index.ts new file mode 100644 index 0000000..9aa5bbc --- /dev/null +++ b/src/components/pickerAreaBak/index.ts @@ -0,0 +1,76 @@ +const app = getApp() + +Component({ + properties: { + level: { + type: Number, + value: 3, + }, + value: { + type: String, + value: '', + }, + }, + + data: { + imageUrl: app.globalData.imageUrl, + Timestamp: app.globalData.Timestamp, + + show: false, + options: [], + fieldNames: { + text: 'label', + value: 'value', + children: 'children', + }, + }, + lifetimes: { + attached() { + this.getArea() + }, + }, + methods: { + handleShow() { + this.setData({ + show: true, + }) + }, + getArea() { + const { level } = this.data + wx.ajax({ + method: 'GET', + url: '/js/area.json', + data: {}, + isJSON: true, + }).then((res) => { + if (level === 1) { + res.forEach((item: any) => { + delete item.children + }) + } + if (level === 2) { + res.forEach((item: any) => { + item.children.forEach((child: any) => { + delete child.children + }) + }) + } + this.setData({ + options: res, + }) + }) + }, + onFinish(e: any) { + this.triggerEvent('change', e.detail.selectedOptions) + this.setData({ + show: false, + }) + }, + onClose() { + this.setData({ + show: false, + }) + this.triggerEvent('cancel') + }, + }, +}) diff --git a/src/components/pickerAreaBak/index.wxml b/src/components/pickerAreaBak/index.wxml new file mode 100644 index 0000000..1f92857 --- /dev/null +++ b/src/components/pickerAreaBak/index.wxml @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/popup/index.json b/src/components/popup/index.json new file mode 100644 index 0000000..074f50b --- /dev/null +++ b/src/components/popup/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/components/popup/index.scss b/src/components/popup/index.scss new file mode 100644 index 0000000..caf8149 --- /dev/null +++ b/src/components/popup/index.scss @@ -0,0 +1,1225 @@ +.popup1 { + padding: 84rpx 60rpx; + background: linear-gradient(6deg, #ffffff 0%, #ffe6e4 100%); + max-height: 75vh; + overflow-y: auto; + overflow-x: hidden; + .logo { + display: block; + margin: 0 auto; + width: 164rpx; + height: 164rpx; + border-radius: 32rpx; + } + .title { + margin-top: 32rpx; + font-size: 48rpx; + color: #f23a2f; + font-weight: bold; + text-align: center; + } + .content { + margin-top: 30rpx; + font-size: 32rpx; + color: #010105; + line-height: 52rpx; + } + .check { + margin-top: 64rpx; + font-size: 32rpx; + color: rgba(1, 1, 5, 0.3); + display: flex; + .checkbox { + transform: scale(0.8); + } + .c-content { + padding-top: 5rpx; + line-height: 48rpx; + } + } + .link { + color: #f23a2f; + } + .btn1 { + margin-top: 40rpx; + height: 88rpx; + border-radius: 84rpx; + font-size: 32rpx; + color: #ffffff; + text-align: center; + line-height: 88rpx; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + } + .btn2 { + margin-top: 20rpx; + height: 88rpx; + text-align: center; + line-height: 88rpx; + font-size: 32rpx; + color: rgba(1, 1, 5, 0.4); + } +} + +.popup2 { + padding: 36rpx 34rpx 58rpx; + background-color: #fff; + .photo { + width: 492rpx; + height: 492rpx; + } + .content { + font-size: 40rpx; + color: rgba(0, 0, 0, 1); + text-align: center; + } +} + +.popup3 { + .icon { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -94rpx; + padding: 124rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + text-align: center; + font-size: 36rpx; + font-weight: bold; + transform: skew(-10deg); + color: transparent; + background: linear-gradient(356deg, rgba(225, 36, 42, 1) 0%, rgba(255, 116, 64, 1) 100%); + background-clip: text; + -webkit-background-clip: text; + } + .card { + position: relative; + margin-top: 32rpx; + padding: 32rpx; + background: #ffffff; + display: flex; + gap: 16rpx; + justify-content: space-between; + box-shadow: 0rpx 4rpx 32rpx 0rpx rgba(0, 0, 0, 0.05); + border-radius: 24rpx 24rpx 24rpx 24rpx; + &::after { + position: absolute; + bottom: -24rpx; + left: 32rpx; + content: ''; + width: 476rpx; + height: 24rpx; + background: #ffebea; + border-radius: 0 0 24rpx 24rpx; + } + .avatar { + flex-shrink: 0; + width: 92rpx; + height: 92rpx; + border-radius: 50%; + } + .wrap { + flex: 1; + .name { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .hostipal { + margin-top: 16rpx; + line-height: 28rpx; + .content { + display: inline; + margin-right: 8rpx; + font-size: 28rpx; + color: rgba(161, 164, 172, 1); + } + .tag { + vertical-align: 2rpx; + display: inline-block; + font-size: 20rpx; + color: rgba(255, 255, 255, 1); + padding: 0 8rpx; + background-color: rgba(255, 186, 1, 1); + border-radius: 6rpx; + } + } + } + } + .btn { + margin-top: 66rpx; + height: 88rpx; + line-height: 88rpx; + font-size: 32rpx; + color: rgba(255, 255, 255, 1); + text-align: center; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx 84rpx 84rpx 84rpx; + } + } +} + +.popup4 { + .icon { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -94rpx; + padding: 124rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 146rpx; + height: 34rpx; + } + .content { + margin-top: 16rpx; + font-size: 32rpx; + color: rgba(161, 164, 172, 1); + text-align: center; + } + .btn { + margin-top: 32rpx; + height: 88rpx; + line-height: 88rpx; + font-size: 32rpx; + color: rgba(255, 255, 255, 1); + text-align: center; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx 84rpx 84rpx 84rpx; + } + } +} + +.popup5 { + .container { + padding: 36rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(4deg, #f7f7fa 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 242rpx; + height: 38rpx; + } + .row { + margin-top: 32rpx; + padding: 26rpx 32rpx; + display: flex; + gap: 22rpx; + align-items: center; + background: #ffffff; + border-radius: 16rpx 16rpx 16rpx 16rpx; + &:last-of-type { + margin-top: 24rpx; + } + .avatar { + flex-shrink: 0; + width: 96rpx; + height: 103rpx; + } + .wrap { + flex: 1; + line-height: 44rpx; + .name { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .content { + font-size: 32rpx; + color: rgba(161, 164, 172, 1); + } + } + .icon { + width: 40rpx; + height: 40rpx; + } + } + } +} + +.popup6 { + .container { + padding: 420rpx 0 0; + width: 610rpx; + height: 600rpx; + box-sizing: border-box; + text-align: center; + .title { + font-size: 40rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .content { + margin-top: 20rpx; + font-size: 36rpx; + color: rgba(1, 1, 5, 1); + } + } +} + +.popup7 { + .container { + padding: 64rpx 66rpx 136rpx; + background: linear-gradient(6deg, #ffffff 0%, #ffdcd9 100%); + .title { + font-size: 36rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + text-align: center; + } + .content { + margin-top: 24rpx; + font-size: 28rpx; + color: rgba(167, 169, 177, 1); + text-align: center; + } + .status-wrap { + margin-top: 28rpx; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20rpx; + .s-item { + .icon { + display: block; + width: 192rpx; + height: 192rpx; + } + .s-content { + position: relative; + margin: 0 auto; + padding: 16rpx; + font-size: 28rpx; + color: rgba(137, 141, 151, 1); + background: rgba(247, 247, 250, 1); + line-height: 36rpx; + border-radius: 12rpx; + text-align: center; + border: 1px solid rgba(247, 247, 250, 1); + .radio { + display: none; + position: absolute; + right: -1px; + bottom: -1px; + width: 32rpx; + height: 32rpx; + border-radius: 12rpx 0 12rpx 0; + background-color: rgba(246, 74, 58, 1); + .r-icon { + width: 24rpx; + height: 24rpx; + } + } + } + &.active { + .s-content { + background-color: rgba(255, 242, 240, 1); + border-color: rgba(246, 74, 58, 1); + color: rgba(246, 74, 58, 1); + .radio { + display: block; + } + } + } + } + } + } +} + +.popup8 { + .bg { + position: relative; + margin: 0 auto; + width: 492rpx; + height: 434rpx; + .header { + position: absolute; + top: 0; + left: 0; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + gap: 12rpx; + .icon1 { + width: 36rpx; + height: 36rpx; + } + .icon2 { + width: 35rpx; + height: 43rpx; + } + .name { + font-size: 48rpx; + color: rgba(255, 255, 255, 1); + font-weight: bold; + line-height: 64rpx; + text-align: center; + } + } + } + .container { + margin-top: -180rpx; + position: relative; + padding: 178rpx 36rpx 36rpx; + width: 610rpx; + height: 390rpx; + box-sizing: border-box; + background: linear-gradient(180deg, #ffd6d4 0%, #ffffff 100%); + border-radius: 32rpx; + .icon { + position: absolute; + top: -110rpx; + left: 50%; + transform: translateX(-50%); + width: 280rpx; + height: 280rpx; + } + .title { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + text-align: center; + } + .footer { + margin-top: 48rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup9 { + .container { + width: 630rpx; + padding: 48rpx 32rpx 34rpx; + box-sizing: border-box; + background: linear-gradient(to top, #ffffff 0%, #ffffff 86%, #ffedeb 100%); + .title { + font-size: 36rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + text-align: center; + } + .list { + .list-item { + padding: 32rpx 0; + display: flex; + align-items: center; + gap: 24rpx; + border-bottom: 1px solid rgba(247, 247, 250, 1); + &:last-of-type { + border: none; + } + .radio { + flex-shrink: 0; + width: 32rpx; + height: 32rpx; + background-color: rgba(247, 247, 250, 1); + border-radius: 50%; + .r-icon { + width: 100%; + height: 100%; + border-radius: 50%; + } + } + .content { + font-size: 32rpx; + color: rgba(137, 141, 151, 1); + line-height: 1; + } + } + } + .footer { + margin-top: 48rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup10 { + .status { + position: relative; + z-index: 1; + display: block; + margin: 0 auto; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -72rpx; + padding: 106rpx 0 0; + width: 604rpx; + height: 244rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 306rpx; + height: 40rpx; + } + } +} + +.popup11 { + .container { + width: 630rpx; + padding: 48rpx 32rpx 34rpx; + box-sizing: border-box; + background: linear-gradient(to top, #ffffff 0%, #ffffff 86%, #ffedeb 100%); + .title { + font-size: 36rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + text-align: center; + } + .list { + margin-top: 20rpx; + max-height: 40vh; + overflow-y: ayto; + overflow-x: hidden; + .list-item { + padding: 32rpx 0; + display: flex; + align-items: center; + gap: 24rpx; + border-bottom: 1px solid rgba(247, 247, 250, 1); + &:last-of-type { + border: none; + } + .radio { + width: 32rpx; + height: 32rpx; + background-color: rgba(247, 247, 250, 1); + border-radius: 50%; + .r-icon { + width: 100%; + height: 100%; + border-radius: 50%; + } + } + .content { + font-size: 32rpx; + color: rgba(137, 141, 151, 1); + line-height: 1; + } + } + } + .texcarea { + padding: 24rpx 32rpx; + border-radius: 12rpx; + width: 100%; + height: 150rpx; + box-sizing: border-box; + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + background-color: rgba(247, 247, 250, 1); + } + .footer { + margin-top: 48rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup12 { + .icon { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -94rpx; + padding: 108rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 308rpx; + height: 34rpx; + } + .content { + margin-top: 16rpx; + font-size: 32rpx; + line-height: 48rpx; + color: rgba(161, 164, 172, 1); + text-align: center; + } + .tip { + margin-top: 24rpx; + padding: 10rpx 22rpx; + font-size: 28rpx; + color: rgba(246, 74, 58, 1); + text-align: center; + border-radius: 24rpx; + background-color: rgba(255, 231, 228, 1); + } + .footer { + margin-top: 32rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup13 { + .icon { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -94rpx; + padding: 106rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 495rpx; + height: 78rpx; + } + .card { + position: relative; + margin-top: 32rpx; + padding: 32rpx; + background: #ffffff; + display: flex; + gap: 16rpx; + justify-content: space-between; + box-shadow: 0rpx 4rpx 32rpx 0rpx rgba(0, 0, 0, 0.05); + border-radius: 24rpx 24rpx 24rpx 24rpx; + &::after { + position: absolute; + bottom: -24rpx; + left: 32rpx; + content: ''; + width: 476rpx; + height: 24rpx; + background: #ffebea; + border-radius: 0 0 24rpx 24rpx; + } + .avatar { + flex-shrink: 0; + width: 92rpx; + height: 92rpx; + border-radius: 50%; + } + .wrap { + flex: 1; + .name { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .hostipal { + margin-top: 16rpx; + line-height: 28rpx; + .content { + margin-right: 8rpx; + display: inline-block; + font-size: 28rpx; + color: rgba(161, 164, 172, 1); + } + .tag { + display: inline-block; + font-size: 20rpx; + color: rgba(255, 255, 255, 1); + padding: 0 8rpx; + background-color: rgba(255, 186, 1, 1); + border-radius: 6rpx; + } + } + } + } + .footer { + margin-top: 52rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup14 { + .container { + padding: 48rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 365rpx; + height: 34rpx; + } + .picker-content { + margin-top: 24rpx; + padding: 28rpx; + background-color: rgba(255, 255, 255, 1); + border-radius: 24rpx; + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + text-align: center; + &:empty::after { + color: rgba(161, 164, 172, 0.5); + content: attr(data-place); + } + } + .footer { + margin-top: 32rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup15 { + .icon { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -94rpx; + padding: 106rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 495rpx; + height: 78rpx; + } + .card { + position: relative; + margin-top: 32rpx; + padding: 32rpx; + background: #ffffff; + display: flex; + gap: 16rpx; + justify-content: space-between; + box-shadow: 0rpx 4rpx 32rpx 0rpx rgba(0, 0, 0, 0.05); + border-radius: 24rpx 24rpx 24rpx 24rpx; + &::after { + position: absolute; + bottom: -24rpx; + left: 32rpx; + content: ''; + width: 476rpx; + height: 24rpx; + background: #ffebea; + border-radius: 0 0 24rpx 24rpx; + } + .avatar { + flex-shrink: 0; + width: 92rpx; + height: 92rpx; + border-radius: 50%; + } + .wrap { + flex: 1; + .name { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .hostipal { + margin-top: 16rpx; + line-height: 28rpx; + .content { + margin-right: 8rpx; + display: inline-block; + font-size: 28rpx; + color: rgba(161, 164, 172, 1); + } + .tag { + vertical-align: 2rpx; + display: inline-block; + font-size: 20rpx; + color: rgba(255, 255, 255, 1); + padding: 0 8rpx; + background-color: rgba(255, 186, 1, 1); + border-radius: 6rpx; + } + } + } + } + .footer { + margin-top: 52rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup16 { + .container { + width: 630rpx; + padding: 48rpx 32rpx 34rpx; + box-sizing: border-box; + background: linear-gradient(to top, rgba(247, 247, 250, 1) 0%, rgba(247, 247, 250, 1) 86%, #ffedeb 100%); + .title { + display: block; + margin: 0 auto; + width: 320rpx; + height: 38rpx; + } + .list { + margin-top: 20rpx; + max-height: 50vh; + overflow-y: auto; + &::-webkit-scrollbar { + display: none; + } + .list-item { + position: relative; + margin-top: 32rpx; + padding: 32rpx; + background: rgba(255, 255, 255, 1); + display: flex; + align-items: center; + gap: 16rpx; + justify-content: space-between; + box-shadow: 0rpx 4rpx 32rpx 0rpx rgba(0, 0, 0, 0.05); + border-radius: 24rpx 24rpx 24rpx 24rpx; + &:last-of-type { + border: none; + } + .radio { + width: 32rpx; + height: 32rpx; + background-color: rgba(247, 247, 250, 1); + border-radius: 50%; + .r-icon { + width: 100%; + height: 100%; + border-radius: 50%; + } + } + .avatar { + flex-shrink: 0; + width: 92rpx; + height: 92rpx; + border-radius: 50%; + } + .wrap { + flex: 1; + .name { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .hostipal { + margin-top: 16rpx; + line-height: 36rpx; + .content { + margin-right: 8rpx; + display: inline; + font-size: 28rpx; + color: rgba(161, 164, 172, 1); + } + .tag { + vertical-align: 2rpx; + display: inline-block; + font-size: 20rpx; + color: rgba(255, 255, 255, 1); + padding: 0 8rpx; + background-color: rgba(255, 186, 1, 1); + border-radius: 6rpx; + } + } + } + } + } + .footer { + margin-top: 48rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup17 { + .icon { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 144rpx; + height: 144rpx; + } + .container { + margin-top: -94rpx; + padding: 108rpx 32rpx 32rpx; + width: 604rpx; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + text-align: center; + } + .hostipal { + margin-top: 32rpx; + font-size: 36rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + text-align: center; + } + .address { + margin-top: 12rpx; + text-align: center; + font-size: 28rpx; + color: rgba(161, 164, 172, 1); + } + .footer { + margin-top: 32rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.popup18 { + .container { + padding: 54rpx 32rpx 32rpx; + width: 590rpx; + height: 688rpx; + background: linear-gradient(5deg, #ffffff 0%, #ffe7e2 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + box-sizing: border-box; + .title { + display: block; + margin: 0 auto; + width: 287rpx; + height: 98rpx; + } + .code-wrap { + margin: 40rpx auto 0; + padding-top: 60rpx; + width: 382rpx; + height: 430rpx; + .code { + margin: 0 auto; + display: block; + width: 296rpx; + height: 296rpx; + border-radius: 36rpx; + } + } + } +} + +.popup19 { + .badge { + position: relative; + z-index: 1; + margin: 0 auto; + display: block; + width: 194rpx; + height: 167rpx; + } + .container { + margin-top: -87rpx; + padding: 116rpx 36rpx 34rpx; + width: 610rpx; + height: 370rpx; + box-sizing: border-box; + background: linear-gradient(7deg, #ffffff 19%, #ffe8e4 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 2rpx solid #ffffff; + .title { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + line-height: 48rpx; + font-weight: bold; + text-align: center; + } + .footer { + margin-top: 32rpx; + display: flex; + gap: 26rpx; + .cancel { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + .submit { + flex: 1; + padding: 22rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #fff; + background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%); + border-radius: 84rpx; + border: 1px solid #f64a3a; + } + } + } +} + +.close { + margin: 32rpx auto 0; + display: block; + width: 64rpx; + height: 64rpx; +} diff --git a/src/components/popup/index.ts b/src/components/popup/index.ts new file mode 100644 index 0000000..1e69b34 --- /dev/null +++ b/src/components/popup/index.ts @@ -0,0 +1,165 @@ +const app = getApp() + +Component({ + properties: { + show: { + type: Boolean, + value: false, + }, + type: String, + params: { + type: Object, + value() { + return {} + }, + }, + top: { + type: Number, + value: 50, + }, + }, + observers: { + show(val) { + if (val) { + if (this.data.type === 'TCenter') { + this.setData({ + TCenterId: this.data.params.hospitalId, + }) + } + if (this.data.type === 'inhibitors') { + this.setData({ + inhibitorsId: this.data.params.drugId || '', + inhibitorsName: this.data.params.drugName || '', + inhibitorsContent: this.data.params.content || '', + }) + } + if (this.data.type === 'publicCard') { + this.getCodeImg() + } + } + }, + }, + + data: { + popup1Check1: false, + + TCenterId: '', + + inhibitorsId: '', + inhibitorsName: '', + inhibitorsContent: '', + + selectDoctorId: '', + + codeImg: '', + + imageUrl: app.globalData.imageUrl, + Timestamp: app.globalData.Timestamp, + }, + methods: { + handleOk() { + const { type, inhibitorsId, inhibitorsName, inhibitorsContent } = this.data + if (type === 'argument' && !this.data.popup1Check1) { + wx.showToast({ + title: '请同意隐私政策', + icon: 'none', + }) + return + } + if (type === 'TCenter') { + if (!this.data.TCenterId) { + wx.showToast({ + title: '请选择治疗中心', + icon: 'none', + }) + return + } + this.triggerEvent('ok', { id: this.data.TCenterId }) + return + } + + if (type === 'inhibitors') { + if (!inhibitorsId) { + wx.showToast({ + title: '请选择抑制剂', + icon: 'none', + }) + return + } + if (inhibitorsName === '其他' && !inhibitorsContent) { + wx.showToast({ + title: '请填写其他抑制剂', + icon: 'none', + }) + return + } + + this.triggerEvent('ok', { id: inhibitorsId, name: inhibitorsName, content: inhibitorsContent }) + return + } + + if (type === 'selectDoctor') { + if (!this.data.selectDoctorId) { + wx.showToast({ + title: '请选择医生', + icon: 'none', + }) + return + } + this.triggerEvent('ok', { id: this.data.selectDoctorId }) + return + } + this.triggerEvent('ok') + }, + handleCancel() { + this.triggerEvent('cancel') + }, + routerTo(e: any) { + const { url } = e.currentTarget.dataset + wx.navigateTo({ + url, + }) + }, + handlePopup1Check1() { + if (this.data.popup1Check1) { + app.mpBehavior({ PageName: 'BTN_PATIENTPRIVACY' }) + } + }, + handleSelectStatus(e) { + const { status } = e.currentTarget.dataset + this.triggerEvent('ok', { type: 'selectStatusComplete', status }) + }, + handleSelectTCenter(e) { + const { id } = e.currentTarget.dataset + this.setData({ + TCenterId: id, + }) + }, + handleSelectDoctor(e) { + const { id } = e.currentTarget.dataset + this.setData({ + selectDoctorId: id, + }) + }, + handleSelectInhibitors(e) { + const { id, name } = e.currentTarget.dataset + this.setData({ + inhibitorsId: id, + inhibitorsName: name, + }) + }, + getCodeImg() { + wx.ajax({ + method: 'GET', + url: '?r=wtx/common/get-channel-wx-code', + data: { + ChannelType: 2, + }, + }).then((res) => { + this.setData({ + codeImg: res, + }) + }) + }, + }, +}) diff --git a/src/components/popup/index.wxml b/src/components/popup/index.wxml new file mode 100644 index 0000000..ba8338a --- /dev/null +++ b/src/components/popup/index.wxml @@ -0,0 +1,389 @@ + + + + 欢迎加入“愈见守护” + + 亲爱的用户,为了更好地向您提供平台服务保护您的权益,我们完善了 + 《个人信息及隐私政策》 + ,请您仔细阅读。一旦您开始使用,即表示您已充分理解并同意协议内容。 + + + + + 我特此同意 + 《个人信息及隐私政策》 + 规定收集我的相关敏感个人信息 + + + 同意并继续 + 不同意 + + + + + + 努力建设中 + 敬请期待 + + + + + + + 绑定成功 + + + + {{params.name}} + + {{params.hostipal}} + {{params.className}}{{params.levelName}} + + + + 确定 + + + + + + + {{params.msg}} + 重新扫码 + + + + + + + + + 还未开启基因治疗 + 随便看看 + + + + + + + 还未开启基因治疗 + 随便看看 + + + + + + + + 你真棒! + 就诊医院选择成功! + + + + + 你真棒! + 您的病史信息已填写完成! + + + + + 你真棒! + 您的信息已填写完成! + + + + + 你真棒! + 信息录入完成! + + + + + 记录下您此次的检查情况吧 + 请基于您的实际检查结果点选合适的检查状态 + + + + + 多项不达标 + 需要关注 + + + + + + + + + 少量不达标 + 但无需担心 + + + + + + + + + 整体不错 + 保持住! + + + + + + + + + + + + + + 整体不错 + 保持住! + + + + + + + 您选择的:诊前筛查结果 + + 重新选择 + 提交 + + + + + + 请选择您的基因治疗中心 + + + + + + {{item.hospitalName}} + + + + 取消 + 提交 + + + + + + + + + + + + 请选择您的免疫抑制剂 + + + + + + {{item}} + + + + + 取消 + 提交 + + + + + + + + + 绑定医生后 + + 医生可以实时看到您的检查进展 + + 您可以扫描不同医生邀约码绑定多个医生 + + 重新选择 + 提交 + + + + + + + + + + + {{params.name}} + + {{params.hostipal}} + {{params.className}}{{params.levelName}} + + + + + 取消 + 确定 + + + + + + + + + + + 取消 + 提交 + + + + + + + + + + + {{params.name}} + + {{params.hostipal}} + {{params.className}}{{params.levelName}} + + + + + 暂不绑定 + 注册并绑定> + + + + + + + + + + + + + + {{item.doctorName}} + + {{item.hospitalName}} + {{item.hospitalClassificationName}}{{item.hospitalLevelName}} + + + + + + 取消 + 确定 + + + + + + + 确认为您的检查医院? + {{params.hospitalName}} + {{params.provinceName}}{{params.cityName}}{{params.countyName}}{{params.address}} + + 取消 + 确定 + + + + + + + + + + + + + + + + 凝血因子数据 + + 通过您的复诊随访档案生成 + + + 好的 + 去看档案 + + + + + diff --git a/src/components/popupDoctor/index.json b/src/components/popupDoctor/index.json new file mode 100644 index 0000000..074f50b --- /dev/null +++ b/src/components/popupDoctor/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/components/popupDoctor/index.scss b/src/components/popupDoctor/index.scss new file mode 100644 index 0000000..b1a33bb --- /dev/null +++ b/src/components/popupDoctor/index.scss @@ -0,0 +1,92 @@ +.popup { + .container { + width: 630rpx; + padding: 48rpx 32rpx 0; + box-sizing: border-box; + background: linear-gradient(to top, #ffffff 0%, #ffffff 86%, #ffedeb 100%); + .title { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + font-weight: bold; + text-align: center; + } + .user { + position: relative; + margin-top: 32rpx; + display: flex; + align-items: center; + gap: 24rpx; + justify-content: space-between; + .avatar { + flex-shrink: 0; + width: 92rpx; + height: 92rpx; + border-radius: 50%; + } + .wrap { + flex: 1; + .name { + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + font-weight: bold; + } + .content { + padding-top: 12rpx; + font-size: 28rpx; + color: rgba(1, 1, 5, 1); + display: flex; + align-items: center; + gap: 10rpx; + .line { + color: rgba(205, 205, 205, 0.6); + } + } + } + } + .row { + padding: 26rpx 0; + display: flex; + gap: 24rpx; + border-bottom: 1px solid rgba(247, 247, 250, 1); + .label { + flex-shrink: 0; + font-size: 32rpx; + color: rgba(161, 164, 172, 1); + } + .col { + .content { + margin-right: 8rpx; + display: inline; + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + max-height: 30vh; + overflow-y: auto; + &::-webkit-scrollbar { + display: none; + } + } + .tag { + vertical-align: 2rpx; + display: inline-block; + font-size: 20rpx; + color: rgba(255, 255, 255, 1); + padding: 0 8rpx; + background-color: rgba(255, 186, 1, 1); + border-radius: 6rpx; + } + } + } + .footer { + padding: 32rpx; + font-size: 32rpx; + color: rgba(246, 74, 58, 1); + text-align: center; + } + } +} +.close { + margin: 32rpx auto 0; + display: block; + width: 64rpx; + height: 64rpx; +} diff --git a/src/components/popupDoctor/index.ts b/src/components/popupDoctor/index.ts new file mode 100644 index 0000000..f356bb6 --- /dev/null +++ b/src/components/popupDoctor/index.ts @@ -0,0 +1,66 @@ +const app = getApp() + +Component({ + properties: { + did: { + type: String, + value: '', + }, + }, + + data: { + show: false, + doctorInfo: {}, + + imageUrl: app.globalData.imageUrl, + Timestamp: app.globalData.Timestamp, + }, + methods: { + handleShow() { + wx.ajax({ + method: 'GET', + url: '?r=wtx/doctor/get-info', + data: { + doctorId: this.data.did, + }, + }).then((res) => { + this.setData({ + doctorInfo: res, + show: true, + }) + }) + }, + handleCancel() { + this.setData({ + show: false, + }) + }, + handleUnbind() { + const { did } = this.data + wx.showModal({ + title: '确认解绑?', + confirmColor: '#F64A3A', + success: (res) => { + if (res.confirm) { + wx.ajax({ + method: 'POST', + url: '?r=wtx/account/unbind-doctor', + data: { + doctorId: did, + }, + }).then(() => { + wx.showToast({ + title: '解绑成功', + icon: 'none', + }) + this.setData({ + show: false, + }) + this.triggerEvent('update') + }) + } + }, + }) + }, + }, +}) diff --git a/src/components/popupDoctor/index.wxml b/src/components/popupDoctor/index.wxml new file mode 100644 index 0000000..51a6fc5 --- /dev/null +++ b/src/components/popupDoctor/index.wxml @@ -0,0 +1,45 @@ + + + + + + 医生介绍 + + + + {{doctorInfo.doctorName}} + + + + 所在医院 + + {{doctorInfo.hospitalName}} + {{doctorInfo.hospitalClassificationName}}{{doctorInfo.hospitalLevelName}} + + + + 医生简介 + + {{doctorInfo.doctorIntroduce || '--'}} + + + 解绑此医生 + + + + + diff --git a/src/components/star/index.json b/src/components/star/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/src/components/star/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/src/components/star/index.scss b/src/components/star/index.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/components/star/index.ts b/src/components/star/index.ts new file mode 100644 index 0000000..2e82a63 --- /dev/null +++ b/src/components/star/index.ts @@ -0,0 +1,204 @@ +const app = getApp(); +/** + * >=min && <=max + * @param min + * @param max + */ +function getRandom(min, max) { + return min + Math.floor(Math.random() * (max - min + 1)); +} +Component({ + options: {}, + lifetimes: { + attached() { + const query = wx.createSelectorQuery().in(this); + query + .select("#thumsCanvas") + .fields({ node: true, size: true }) + .exec((res) => { + const canvas = res[0].node; + const context = canvas.getContext("2d"); + this.setData({ + context: context, + }); + + const dpr = wx.getSystemInfoSync().pixelRatio; + canvas.width = res[0].width * dpr; + canvas.height = res[0].height * dpr; + this.data.width = res[0].width * dpr; + this.data.height = res[0].height * dpr; + // context.fillStyle = "rgba(255, 255, 255, 0)"; + const images = [ + "star/icon1.png?r=1", + "star/icon2.png?r=1", + "star/icon3.png?r=1", + "star/icon4.png?r=1", + "star/icon5.png?r=1", + "star/icon6.png?r=1", + "star/icon7.png?r=1", + "star/icon8.png?r=1", + ]; + const promiseAll = [] as Array>; + images.forEach((src) => { + const p = new Promise(function (resolve) { + const img = canvas.createImage(); + img.onerror = img.onload = resolve.bind(null, img); + img.src = app.globalData.imageUrl + src; + }); + promiseAll.push(p); + }); + Promise.all(promiseAll).then((imgsList) => { + const imgsLists = imgsList.filter((d) => { + if (d && d.width > 0) return true; + return false; + }); + this.setData({ + imgsList: imgsLists, + }); + if (this.data.imgsList.length == 0) { + // logger.error("imgsList load all error"); + wx.showToast({ + icon: "none", + title: "imgsList load all error", + }); + return; + } + }); + }); + }, + }, + properties: {}, + data: { + imgsList: [] as WechatMiniprogram.ImageData[], + width: 0, + height: 0, + context: null as any, + scanning: false, + renderList: [], + scaleTime: 0.1, // 百分比 + }, + methods: { + handleTap() { + this.start(); + }, + createRender() { + if (this.data.imgsList.length == 0) return null; + const basicScale = [0.4, 0.5, 0.6][getRandom(0, 2)]; + + const getScale = (diffTime) => { + if (diffTime < this.data.scaleTime) { + return +(diffTime / this.data.scaleTime).toFixed(2) * basicScale; + } else { + return basicScale; + } + }; + const context = this.data.context; + // 随机读取一个图片来渲染 + const image: any = this.data.imgsList[getRandom(0, this.data.imgsList.length - 1)]; + const offset = 20; + const basicX = this.data.width / 2 + getRandom(-offset, offset); + const angle = getRandom(2, 10); + let ratio = getRandom(10, 30) * (getRandom(0, 1) ? 1 : -1); + const getTranslateX = (diffTime) => { + if (diffTime < this.data.scaleTime) { + // 放大期间,不进行摇摆位移 + return basicX; + } else { + return basicX + ratio * Math.sin(angle * (diffTime - this.data.scaleTime)); + } + }; + + const getTranslateY = (diffTime) => { + return image.height / 2 + (this.data.height - image.height / 2) * (1 - diffTime); + }; + + const fadeOutStage = getRandom(14, 18) / 100; + const getAlpha = (diffTime) => { + let left = 1 - +diffTime; + if (left > fadeOutStage) { + return 1; + } else { + return 1 - +((fadeOutStage - left) / fadeOutStage).toFixed(2); + } + }; + + return (diffTime) => { + // 差值满了,即结束了 0 ---》 1 + if (diffTime >= 1) return true; + context.save(); + const scale = getScale(diffTime); + // const rotate = getRotate(); + const translateX = getTranslateX(diffTime); + const translateY = getTranslateY(diffTime); + context.translate(translateX, translateY); + context.scale(scale, scale); + // context.rotate(rotate * Math.PI / 180); + context.globalAlpha = getAlpha(diffTime); + context.drawImage(image, -image.width / 2, -image.height / 2, image.width, image.height); + context.restore(); + }; + }, + scan() { + this.data.context.clearRect(0, 0, this.data.width, this.data.height); + this.data.context.fillStyle = "rgba(255, 255, 255, 0)"; + this.data.context.fillRect(0, 0, 200, 400); + let index = 0; + let length = this.data.renderList.length; + if (length > 0) { + this.requestFrame(this.scan.bind(this)); + this.setData({ + scanning: true, + }); + } else { + this.setData({ + scanning: false, + }); + } + while (index < length) { + const child = this.data.renderList[index]; + if (!child || !child.render || child.render.call(null, (Date.now() - child.timestamp) / child.duration)) { + // 结束了,删除该动画 + this.setData({ + renderList: [...this.data.renderList].filter((_item, fIndex) => fIndex != index), + }); + length--; + } else { + // continue + index++; + } + } + }, + start() { + const render = this.createRender(); + const duration = getRandom(1500, 3000); + this.setData({ + renderList: [ + ...this.data.renderList, + { + render, + duration, + timestamp: Date.now(), + }, + ], + }); + + if (!this.data.scanning) { + this.setData({ + scanning: true, + }); + + this.requestFrame(this.scan.bind(this)); + // this.scan.bind(this)(); + } + return this; + }, + requestFrame(cb) { + return ( + this.data.context.requestAnimationFrame || + (function (callback) { + setTimeout(callback, 1000 / 60); + })(cb) + ); + }, + }, +}); diff --git a/src/components/star/index.wxml b/src/components/star/index.wxml new file mode 100644 index 0000000..e056d7b --- /dev/null +++ b/src/components/star/index.wxml @@ -0,0 +1 @@ + diff --git a/src/components/uploadFile/index.js b/src/components/uploadFile/index.js new file mode 100644 index 0000000..7a38772 --- /dev/null +++ b/src/components/uploadFile/index.js @@ -0,0 +1,289 @@ +// components/uploadFile/index.js +const app = getApp() +Component({ + /** + * 组件的属性列表 + */ + properties: { + // 是否可以上传 + upload: { + type: Boolean, + value: true, + }, + // 是否可以删除 + delete: { + type: Boolean, + value: true, + }, + // 附件data + fileList: { + type: Array, + value: [], + }, + // 最大上传数量, -1为不限制 + maxNum: { + type: Number, + value: -1, + }, + isSlot: { + type: Boolean, + value: false, + }, + count: { + type: Number, + value: 0, + }, + }, + + /** + * 组件的初始数据 + */ + data: { + Timestamp: app.globalData.Timestamp, + imageUrl: app.globalData.imageUrl, + + show: false, + actions: [ + { + id: 1, + name: '选择视频或图片', + }, + { + id: 2, + name: '选择聊天文件', + }, + ], + }, + + /** + * 组件的方法列表 + */ + methods: { + viewFile(e) { + const { index } = e.currentTarget.dataset + const { fileList } = this.properties + const params = fileList[index] + if (['image', 'video'].includes(params.fileType)) { + let sources = [] + + fileList.forEach((item) => { + let obj = {} + if (item.fileType === 'image') { + obj = { + url: item.url, + type: item.fileType, + poster: item.url, + } + } + if (item.fileType === 'video') { + obj = { + url: item.vidoeUrl, + type: item.fileType, + poster: item.url, + } + } + sources.push(obj) + }) + wx.previewMedia({ + current: index, + sources: sources, + }) + } else if (params.fileType !== 'audio') { + wx.downloadFile({ + url: params.url, + success(res) { + wx.openDocument({ + filePath: res.tempFilePath, + showMenu: true, + fail() { + wx.showToast({ + title: '该文件无法预览', + icon: 'none', + }) + }, + }) + }, + }) + } + }, + deleteFile(e) { + const { index, item } = e.currentTarget.dataset + this.triggerEvent('deleteFile', { + index, + item, + }) + }, + downFile(e) { + const { item } = e.currentTarget.dataset + wx.showToast({ + title: '正在下载,请稍后...', + icon: 'none', + }) + wx.downloadFile({ + url: item.fileUrl, + success(res) { + if (item.type === 'image') { + wx.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + wx.showToast({ + title: '下载成功', + }) + }, + }) + } else if (item.type === 'video') { + wx.saveVideoToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + wx.showToast({ + title: '下载成功', + }) + }, + }) + } else { + wx.showToast({ + title: '附件请到pc端下载!', + icon: 'none', + }) + } + }, + }) + }, + uploadFile(item) { + return new Promise((resolve, resject) => { + let url = `${app.globalData.upFileUrl}?r=file-service/upload-` + if (item.type === 'image') { + url += 'img' + } + if (item.type === 'video') { + url += 'video' + } + if (item.type === 'file') { + url += 'doc' + } + wx.uploadFile({ + filePath: item.tempFilePath, + name: 'file', + url: url, + success: (res) => { + let data = JSON.parse(res.data) + let expandJson = { + name: item.name, + fileType: item.fileType, + } + if (item.type === 'image') { + expandJson.url = data.data.Url + } + if (item.type === 'video') { + expandJson.url = data.data.SnapshotUrl + expandJson.videoUrl = data.data.Url + expandJson.duration = data.data.Duration + } + if (item.type === 'file') { + expandJson.url = data.data.Url + } + resolve(expandJson) + }, + fail() { + resject() + }, + }) + }) + }, + GetExtensionFileName(pathfilename) { + var reg = /(\\+)/g + var pString = pathfilename.replace(reg, '#') //用正则表达式来将\或\\替换成# + var arr = pString.split('#') // 以“#”为分隔符,将字符分解为数组 例如 D Program Files bg.png + var lastString = arr[arr.length - 1] //取最后一个字符 + var arr2 = lastString.split('.') // 再以"."作为分隔符 + return arr2[arr2.length - 1] //将后缀名返回出来 + }, + upFile(data) { + wx.showLoading({ + title: '正在上传', + }) + let apiArr = [] + data.map((e) => { + apiArr.push(this.uploadFile(e)) + }) + Promise.all(apiArr) + .then((res) => { + wx.hideLoading({ + success: () => { + this.triggerEvent('setData', res) + }, + }) + }) + .catch(() => { + wx.showToast({ + title: '上传失败', + icon: 'error', + }) + }) + }, + handleAction() { + this.setData({ + show: true, + }) + }, + onSelect(e) { + const { id } = e.currentTarget.dataset + if (id == 1) { + this.setData({ + show: false, + }) + this.selectMedia() + } + if (id == 2) { + this.setData({ + show: false, + }) + this.selectFiles() + } + }, + selectMedia() { + let { fileList, maxNum, count = 0 } = this.properties + if (maxNum >= 0 && count == 0) { + count = maxNum - fileList.length + } + wx.chooseMedia({ + mediaType: ['image', 'video'], + count: count, + sourceType: ['album', 'camera'], + sizeType: ['original'], + success: (res) => { + res.tempFiles.map((e) => { + e.name = e.tempFilePath + e.extend = this.GetExtensionFileName(e.tempFilePath) + e.tempFilePath = e.tempFilePath + e.type = e.fileType + e.fileType = e.fileType + }) + this.upFile(res.tempFiles) + }, + }) + }, + selectFiles() { + let { fileList, maxNum, count = 0 } = this.properties + if (maxNum >= 0 && count == 0) { + count = maxNum - fileList.length + } + wx.chooseMessageFile({ + count: count, + type: 'file', + extension: ['doc', 'docx', 'pdf', 'xlsx', 'xls', 'ppt', 'pptx'], + success: (res) => { + res.tempFiles.map((e) => { + e.type = 'file' + e.tempFilePath = e.path + e.fileType = this.GetExtensionFileName(e.path) + }) + this.upFile(res.tempFiles) + }, + }) + }, + onClose() { + this.setData({ show: false }) + }, + }, +}) diff --git a/src/components/uploadFile/index.json b/src/components/uploadFile/index.json new file mode 100644 index 0000000..5e9e3fd --- /dev/null +++ b/src/components/uploadFile/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "van-icon": "@vant/weapp/icon/index", + "van-image": "@vant/weapp/image/index", + "van-action-sheet": "@vant/weapp/action-sheet/index", + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/components/uploadFile/index.scss b/src/components/uploadFile/index.scss new file mode 100644 index 0000000..3c63d8c --- /dev/null +++ b/src/components/uploadFile/index.scss @@ -0,0 +1,91 @@ +/* components/uploadFile/index.wxss */ +.upload-list { + display: grid; + grid-template-columns: repeat(3, minmax(160rpx, 200rpx)); + gap: 18rpx; + + .item { + height: 180rpx; + position: relative; + line-height: 0; + background-color: rgba(247, 247, 250, 1); + border-radius: 12rpx; + display: flex; + align-items: center; + justify-content: center; + .item_mask { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + display: flex; + justify-content: center; + align-items: center; + .item_mask_icon { + border-radius: 100%; + overflow: hidden; + background: #fff; + font-size: 0; + } + } + .image { + width: 100%; + height: 100%; + border-radius: 12rpx; + } + .sub-image { + width: 104rpx; + height: 104rpx; + } + .clear { + position: absolute; + right: 0; + top: 0; + width: 36rpx; + height: 36rpx; + z-index: 9; + } + } + + .btn { + width: 188rpx; + height: 188rpx; + border-radius: 12rpx; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: rgba(247, 247, 250, 1); + .name { + margin-top: 12rpx; + font-size: 28rpx; + color: rgba(207, 209, 213, 1); + } + } +} + +.popup { + padding: 102rpx 48rpx calc(102rpx + env(safe-area-inset-bottom)); + display: flex; + align-items: center; + gap: 30rpx; + justify-content: space-between; + background-color: rgba(247, 247, 250, 1); + .item { + padding: 32rpx; + flex: 1; + border-radius: 36rpx; + background-color: #fff; + text-align: center; + .title { + margin-top: 16rpx; + font-size: 32rpx; + color: rgba(1, 1, 5, 1); + } + .icon { + width: 136rpx; + height: 136rpx; + } + } +} diff --git a/src/components/uploadFile/index.wxml b/src/components/uploadFile/index.wxml new file mode 100644 index 0000000..95a9367 --- /dev/null +++ b/src/components/uploadFile/index.wxml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + 请上传 + + + + + + + + + + 选择视频或图片 + + + + 选择聊天文件 + + + + diff --git a/src/custom-tab-bar/index.json b/src/custom-tab-bar/index.json new file mode 100644 index 0000000..4573acb --- /dev/null +++ b/src/custom-tab-bar/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "van-tabbar": "@vant/weapp/tabbar/index", + "van-tabbar-item": "@vant/weapp/tabbar-item/index" + } +} diff --git a/src/custom-tab-bar/index.scss b/src/custom-tab-bar/index.scss new file mode 100644 index 0000000..5459edc --- /dev/null +++ b/src/custom-tab-bar/index.scss @@ -0,0 +1,19 @@ +/* custom-tab-bar/index.wxss */ + + +.tab-item { + .icon { + width: 50rpx; + height: 50rpx; + } + .name { + font-size: 24rpx; + color: #010105; + &.active{ + color: #F23A2F; + } + &.drug-active{ + color: #25D9C8; + } + } +} diff --git a/src/custom-tab-bar/index.ts b/src/custom-tab-bar/index.ts new file mode 100644 index 0000000..c72287f --- /dev/null +++ b/src/custom-tab-bar/index.ts @@ -0,0 +1,55 @@ +import { getCurrentPageUrl } from '@/utils/util' +const app = getApp() + +Component({ + properties: {}, + data: { + imageUrl: app.globalData.imageUrl, + Timestamp: app.globalData.Timestamp, + + isChild: 0, + active: 0, + list: [ + { + pagePath: '/pages/index/index', + text: '首页', + icon: 'tabbar1-1', + iconActive: 'tabbar1-1-active', + }, + { + pagePath: '/pages/knowledge/index', + text: '知识库', + icon: 'tabbar1-2', + iconActive: 'tabbar1-2-active', + }, + { + pagePath: '/pages/my/index', + text: '我的', + icon: 'tabbar1-3', + iconActive: 'tabbar1-3-active', + }, + ], + }, + observers: {}, + lifetimes: { + ready() { + const pagePath = getCurrentPageUrl() + const active = this.data.list.findIndex((item) => item.pagePath === pagePath) + this.setData({ + active, + anyWhere: app.globalData.anyWhere, + }) + }, + }, + methods: { + onChange() {}, + handleNav(e) { + const { index } = e.currentTarget.dataset + const { list } = this.data + const pagePath = list[index].pagePath + wx.switchTab({ + url: pagePath, + }) + }, + }, +}) diff --git a/src/custom-tab-bar/index.wxml b/src/custom-tab-bar/index.wxml new file mode 100644 index 0000000..f61df59 --- /dev/null +++ b/src/custom-tab-bar/index.wxml @@ -0,0 +1,14 @@ + + + + {{item.text}} + + + + diff --git a/src/doc/pages/doc1/index.json b/src/doc/pages/doc1/index.json new file mode 100644 index 0000000..2be56ec --- /dev/null +++ b/src/doc/pages/doc1/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "个人信息及隐私政策", + "usingComponents": { + "mp-html": "mp-html" + } +} diff --git a/src/doc/pages/doc1/index.scss b/src/doc/pages/doc1/index.scss new file mode 100644 index 0000000..0b69ddc --- /dev/null +++ b/src/doc/pages/doc1/index.scss @@ -0,0 +1,3 @@ +.page{ + padding: 0 40rpx; +} diff --git a/src/doc/pages/doc1/index.ts b/src/doc/pages/doc1/index.ts new file mode 100644 index 0000000..bd632eb --- /dev/null +++ b/src/doc/pages/doc1/index.ts @@ -0,0 +1,10 @@ +const _app = getApp(); + +Page({ + data: { + doc:`


生效日期:2025年6月

【血友病B患者支持项目“愈见守护”】(以下简称“我们”)非常注重保护用户(“您”)的个人信息及隐私。我们希望通过本《个人信息及隐私保护政策》(以下简称本“隐私政策”或本“政策”)向您清晰地介绍在使用我们的产品/服务时,我们如何处理您的个人信息的方式。

我们提供的服务包括愈见守护医生端小程序、微信公众号向您提供的各项服务(以下简称“本服务”),适用本隐私政策。

请您在使用本服务前,务必仔细阅读并充分理解本隐私政策。我们将逐一说明我们收集您的个人信息的类型及其对应的用途,以便您了解我们针对某一特定功能或服务所收集的具体个人信息的类别、使用理由及收集方式。

本隐私政策将帮您了解以下信息:

1. 我们如何收集和使用您的个人信息

2. 我们基于何种目的或场景,收集和使用您的个人信息

3. 我们如何使用Cookie等同类技术

4. 我们如何委托处理、共享、转让、公开披露您的个人信息

5. 我们如何保存、保护您的个人信息

6. 您查阅、更正、删除、注销个人信息的权利

7. 未成年人保护

8. 本隐私政策变更及通知

9. 如何联系我们

10. 名词定义和解释

一、 我们如何收集和使用您的个人信息

(一) 我们会根据本隐私政策的约定,为实现本平台服务而对所收集的个人信息进行使用。

(二) 我们深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:合法、正当、必要和诚信原则,目的明确和直接相关原则,公开透明原则、准确性原则、问责性原则、数据安全原则等。同时,我们承诺采取必要的措施保障您的个人信息的安全。

二、 我们基于何种目的或场景,收集和使用您的个人信息

出于本隐私政策所描述的目的或场景,当您使用本平台服务时,我们可能会收集有关您的如下个人信息。若您不同意提供下列信息,有权拒绝提供或撤回同意,但您可能无法继续使用本平台的全部或部分服务:

(一) 注册登录账号

1. 当您关注愈见守护微信公众号时,我们会收集您的微信openID以及您关注、取消关注本公众号的行为数据,以便我们识别用户身份。

2. 当您登录使用愈见守护小程序时,您需要输入您的手机号码,通过手机号码加短信验证码的方式进行登录;或通过您的微信openID获取手机号进行手机号快捷登录。

(二) 向您提供本平台服务

1. 注册成为用户:

为完成创建账号,您需提供您的姓名、手机号码,年龄,所在地,完成账号注册,您后续可以自主在【我的】-【个人信息】中填写或更正您的信息;

2. 常见问题解答

平台提供您的常见问题解答功能,当您点击特定问题后,系统会通过已有问答库自动回答,帮助您提供知识内容;

3. 基因全知道:教育服务:

我们为您提供疾病知识服务,我们将记录您在使用本服务期间的内容浏览状态;

4. 预报名

平台为您提供患者教育活动的的报名服务,您需提供您的姓名、年龄、所在地、

5. 医患互动

您在绑定专属医生后,您可使用医患互动服务。您可以从统提供的标准问答库内选择问题发送给医生,并接收医生从标准问答库内选择的问答回复;

(三) 如果您对我们收集和使用您的个人信息的法律依据有任何疑问或需要提供进一步的信息,请通过本隐私政策第九章节「如何联系我们」提供的联系方式与我们联系。

(四) 本平台向您提供的服务可能将不断更新和发展,如果您选择使用本隐私政策中尚未列明的其他功能或服务时,我们会在收集您的个人信息前通过推送通知、更为显著的弹窗等方式向您详细说明信息收集的目的、方式、范围并征求您的同意。

三、 我们如何使用小程序原生能力技术

(一) 依托于微信小程序提供的原生能力

为了帮助提升您的产品体验,我们会使用微信提供的账号体系能力来避免您重复登录。所有的信息获取都会经过您的授权同意才会使用。

四、 我们如何委托处理、共享、转让、公开披露您的个人信息

(一) 委托处理

我们会聘请服务提供商来协助我们提供客户支持。对我们委托的公司、组织和个人,我们会要求他们按照本个人信息保护政策来处理您的个人信息。

(二) 共享

我们不会将任何个人信息出售给第三方。我们不会向愈见守护小程序、微信公众号运营公司以外的任何公司、组织和个人提供您的个人信息,但以下情况除外:

a) 在向您进行明确告知并获取您的单独同意的情况下共享:获得您的单独同意后,我们会与我们所披露的有关个人信息处理者共享您的相关个人信息;

(三) 转让

我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:

a) 在向您进行明确告知并获取您的单独同意的情况下转让:获得您的单独同意后,我们会向我们所披露的有关个人信息处理者转让您的相关个人信息;

(四) 公开披露

我们仅会在获得您明确同意后,公开披露您的个人信息。

五、 我们如何保存、保护您的个人信息

(一) 保存地点

我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息存储于中华人民共和国境内。目前,我们不会将上述信息传输至其他地区。

(二) 保存时间

我们会采取一切合理可行的措施,确保未收集无关的个人信息。 愈见守护小程序、微信公众号中个人信息储存必要期限是愈见守护小程序、微信公众号为您终止服务后3年。超出必要期限后,我们将对您的个人信息进行删除或匿名化处理,但法律法规另有规定的除外。

(三) 保护措施

我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。我们会部署访问控制机制,确保只有授权人员才可访问个人信息。

(四) 安全事件处理

在发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您。

六、 您查阅、更正、删除、注销个人信息的权利

我们非常重视并保护您对于个人信息处理活动中的知情权、决定权、限制权、拒绝权等权利,并为您提供了行使在个人信息处理活动中相关权利的方法。

(一) 查阅权和更正权

除法律法规规定的情形除外,您有权随时查阅和更正您的个人信息,您可以通过在本平台的【我的】-【个人信息】查阅或更正您的个人信息,包括手机号、姓名、头像等信息。

(二) 删除权

1. 您可通过微信的缓存清理功能,删除您在本平台的缓存记录提供的相关个人信息。

2. 如果您需要删除您在使用本平台过程中产生的其他个人信息,在您的合理要求并经验证核实您的身份后,我们会处理您的请求。您可以通过本隐私政策「第九章节、如何联系我们」方式向我们进行反馈。

3. 在以下情形中,您可以向我们提出删除个人信息的请求:

(1) 我们永久不再为您提供产品或服务;

(2) 您撤回对我们收集、使用您的个人信息的同意;

(3) 我们处理个人信息的行为违反法律、行政法规;

(4) 我们处理个人信息的行为违反了与您的约定;

(5) 您注销了用户帐号;

(6) 法律、行政法规规定的其他情形。

4. 您同意并理解,您删除某些您已提交的个人信息可能导致您无法使用本平台的部分或者全部服务。

(三) 注销权

如您希望注销本平台及服务,您可以通过发送邮件到supportpr@hbraas.com进行账号的注销。

一旦您注销账户,我们将停止为您提供服务。请您谨慎操作,否则,因注销账号产生的数据丢失问题均由您自行承担。当您选择注销账户后,我们将停止为您提供服务,并依据您的要求,删除您的个人信息。

七、 未成年人保护

我们非常重视对未成年人个人信息的保护,本平台的注册用户仅包括供医疗卫生专业人士。不涉及18周岁以下的未成年人注册为本平台账户。若您是未成年人,不得予以注册。

八、 本隐私政策变更及通知

(一) 为了向您提供更好的功能与/或服务,我们的产品/服务将不时更新与变化,因此,我们将适时修订及变更隐私政策。

(二) 未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。

(三) 对于重大变更,我们可能还会提供本平台公告、推送通知或更为显著的弹窗等方式,向您发送隐私政策的最新版本。

九、 如何联系我们

若您对本服务有任何疑问、意见或建议,您可以通过以下方式与我们联系:

邮箱:supportpr@hbraas.com

一般情况下,我们将在7天内回复。

十、 名词定义与解释

本平台:通过电子化信息平台运营和提供的数字化产品和服务,电子化信息平台包括但不限于 愈见守护小程序、微信公众号提供数字化产品和服务的系统或平台等,具体以用户实际注册、访问或使用为准(对于该等数字化产品和服务,本协议统称为“电子化信息平台”或“平台”或“本平台”)

个人信息:以电子或者其他方式记录的与已识别或可识别的自然人有关的各种信息,不包括匿名化处理后的信息。如姓名等;

OPENID:OPENID是微信用户在注册公众号后的唯一独立加密用户身份标识,此处OPENID是指本平台用户注册后的唯一加密用户身份标识。

` + }, + onLoad() {}, +}); + +export {} diff --git a/src/doc/pages/doc1/index.wxml b/src/doc/pages/doc1/index.wxml new file mode 100644 index 0000000..68e15cb --- /dev/null +++ b/src/doc/pages/doc1/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/src/doctor/components/doctor-tab-bar/index.json b/src/doctor/components/doctor-tab-bar/index.json new file mode 100644 index 0000000..4573acb --- /dev/null +++ b/src/doctor/components/doctor-tab-bar/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "van-tabbar": "@vant/weapp/tabbar/index", + "van-tabbar-item": "@vant/weapp/tabbar-item/index" + } +} diff --git a/src/doctor/components/doctor-tab-bar/index.scss b/src/doctor/components/doctor-tab-bar/index.scss new file mode 100644 index 0000000..319ff99 --- /dev/null +++ b/src/doctor/components/doctor-tab-bar/index.scss @@ -0,0 +1,16 @@ +/* custom-tab-bar/index.wxss */ + + +.tab-item { + .icon { + width: 50rpx; + height: 50rpx; + } + .name { + font-size: 24rpx; + color: #010105; + &.active{ + color: rgba(28, 107, 255, 1); + } + } +} diff --git a/src/doctor/components/doctor-tab-bar/index.ts b/src/doctor/components/doctor-tab-bar/index.ts new file mode 100644 index 0000000..afeb28f --- /dev/null +++ b/src/doctor/components/doctor-tab-bar/index.ts @@ -0,0 +1,59 @@ +import { getCurrentPageUrl } from '@/utils/util' +const app = getApp() + +Component({ + properties: {}, + data: { + imageUrl: app.globalData.imageUrl, + isChild: 0, + active: 0, + list: [ + { + pagePath: '/doctor/pages/index/index', + text: '基因疗法', + pageName: 'BTN_HOME_NAV_CLICK', + icon: 'tabbar3-1', + iconActive: 'tabbar3-1-active', + }, + { + pagePath: '/doctor/pages/knowledge/index', + text: '小助手', + pageName: 'BTN_ASSISTANT_NAV_CLICK', + icon: 'tabbar3-3', + iconActive: 'tabbar3-3-active', + }, + { + pagePath: '/doctor/pages/my/index', + text: '我的', + pageName: 'BTN_MY_NAV_CLICK', + icon: 'tabbar3-2', + iconActive: 'tabbar3-2-active', + }, + ], + }, + observers: {}, + lifetimes: { + ready() { + const pagePath = getCurrentPageUrl() + const active = this.data.list.findIndex((item) => item.pagePath === pagePath) + this.setData({ + active, + anyWhere: app.globalData.anyWhere, + }) + }, + }, + methods: { + onChange() {}, + handleNav(e) { + const { index } = e.currentTarget.dataset + const { list } = this.data + const { pagePath, pageName } = list[index] + if (pageName) { + app.mpBehavior({ PageName: pageName }) + } + wx.reLaunch({ + url: pagePath, + }) + }, + }, +}) diff --git a/src/doctor/components/doctor-tab-bar/index.wxml b/src/doctor/components/doctor-tab-bar/index.wxml new file mode 100644 index 0000000..290af27 --- /dev/null +++ b/src/doctor/components/doctor-tab-bar/index.wxml @@ -0,0 +1,14 @@ + + + + {{item.text}} + + + + diff --git a/src/images/tabbar/tabbar1-1-active.png b/src/images/tabbar/tabbar1-1-active.png new file mode 100644 index 0000000000000000000000000000000000000000..95af75162e005dc8552f7f9c71e061b9483ea3d7 GIT binary patch literal 2044 zcmVPx+wn;=mRA@upnSXE`Wf{l6&+aC7B)Q!r#f1K%?bs$2(%YkVD98ko#f$6rON zBb^avRM1gjQ1}BKg>mW(o#|kwV;LA72Lzp3b^O_)f~LaVC4~IgOHC=D(4w`iB)K1H zN$zg_#Rf4Az+;JKMp%jJo7@6iu#re<>NL+m0Qj{W(LeE? zgJ6K-K{Y@EI*93td&XjXdGTc0ty}nd{mYXN~Lu0s<9?n8`wD zZHNpXbK|3;k(dazUnz3tFoAqUjhg@-1s{!Sp{9jj#)YJGOH=o;d`p;n*A^y(n2ax`j*|6z7Uy65fY`1l9gmP=W2Cjp;w zZn(r4GDzB19~u0|`9LN$^>ZTOAuv1yzRwql-R~MAuK6DkKwoe~o@vt*wkmzYR#FEm zLZ!68X8~SIrue9@Z|F#|u(;;`k_cfBgU^i$!`k$I0y2N(Q{EV&gD=mV-f-0w)m73a z0k{jGpulc>QVRq`@UZ=y$rx8I8aVt~F-TJL z?+56U?=*$x{h!eb8Patfw9W$^;iRk%rf%QHSRKHCGD`MpeGZIFvw4(8; z!ch9smero-MD6PU>dFFP^ooLTOKo`gMA;CD;MI*p(zv6+xE#?NiUo{!bja1>^eF~r zH?`Sv%BP%JVNDTd{iLS$1K3y^1RY_*j-jgheVcoGvzATy5L#dZfuD2q@RLeZ-*Qs( zH`M^v)L4`?aC>9F{%pKseY+qU&liYegnfxjw=>~O1pRjq(f93o1m10ehzQG=;S-4B zV2m;GQ@$lFQQE)XaQZA8!di?1Xm1{Z%nvK!(E~}%-wV+7bMLchM(FaW{#lZ zOJRr6Z+uJF++>T1huW?cSRBYhlzGA{8zK=@_Yma{_OtUtIpbY(@a36gQ2i|kA93_h zb~=+;-ZU_FGNq|sWni}xgc%RYQT^)#aD1bGl_1eS9k$<)Bf52gP*N!yBB`lAe)DGH z);aHKIilxM>QfzU&6kPdi_UWbGbUtD!&2()olbPB-z5PBmjDEA_C;c+Q=zLjGfUQJ z;`>QCsR0_vYy8`v@Nfy5|0;jAK|1gtS=?NOa|3ofsjwT zjcRJJcIZ^d{~$BndCtz%>`%-l_cRxoM-SP|tI195Uh5|i-h z`mmlqFHdx+n6fR~y^yISG4cqp^NNVZ>0JSpF!%BE|V@zo3D+H{xZL*YE(HI^p z?2NY|Dj12l*7kl8;$8-NO6>(OdgZ9T*;zl)dCe9Q%malW^b0vUa&xiYWN_VDkZ{<} zr5Jo%?uo6U`(ULoC6zqHWT(1S6!18J%Sy7e=Pz(JYj_tg>hDiF?cyQ--2&52=R4nw zR9$=}lho9sz`08UX8w#4js2_~4LOL3_I5?`WdAb{fOQ8n0?-M-YyxQAd3M&n$`QTW z*>Em*3i=-a(cN?JpYcWX>#b;H*GmS~UxKhTzo3Dsnd;2qrrxos@*!?)SERF9YwMTh zj87BcJ9X32W8}CC;;t?!o*v&WvT!d5Ya9(RGxjP`Js*0{2@QOl$n@4lV*6|W-m==0 zO4R%uppO=So7}1N#jM@CtdgHjiO#?+B$(d>(-A3KeP_+Uz*~|v+w*K1?)e=kzq#3e zodDxDIjaADJ{7NYt@Jid*WW|}TYEsWvkrkC@I0v{sgKa{LGUy-6&Hg0Q-j*gaZTWC=+#AH{XUQF|(?Uq0WgRNA( z=`GU+e4IdsOjCGF=^K998L27(sTjfvrAf`7$WJN889A!gvJ| zb~F!LiRfb6iXkkANlpD1fTh-N2F@xG-AYsbZ>3@gYwt*nzA%80~4G@r@{|tUwiNtPnBcu`=*AOX9{bSL&BbhP0%ZpR;O2n0F z>lz}VskPx*M@d9MRA@upntQBVRTaj+Z_n(x*V57|ky4;M0@6xiLKF*>COk@-fI*=ZG(w^z zDqv8E0)HT(G^8XnX@E39N+5)n1W@7=e4(vKYFk8&k5Y&NRcmRq+ycVw>~r=<*S%+E z_DpZd%$W&&tpDcB-g~Xz+Uu;n)}A5u1L1zafV}|1FDG#YfLEk&CV+qU>exLD;cqAL zjfT;ZmIB%J`w&ER0m-KTxE2I11H#IE27>he1#nQqU=rVnF?l5;$yVPK4U1>ky8&jA=Np1&Z4kM2bfL&rH6zbfI&0H$_p zm=vY~u=k{t3@SSfJ6ByI@!B$0NW2)RKU`++px%iYq<<2Cg-==8A%$50UM;ggzdLaR z>Hh*?N{8}D;(ijp$#c8_U=+|)=Qvx^0)U?ZQ0bWSq7+U7FwzBxrDxMQRxI`dF@^Mh z0&sMq)QrC;#$aLfUNJt?IloN8=Q?b7UJ4fi`1|fbDwmM%E=$ppZUnL=r6HX2cT4z6 zqHI)(3xV8#cBM|@!5DQfkUbAz2Y^F>$~@A26Tm6S zI++xFNr<6i$@o&TST1QkkgaY#^Cyt_L*uhlJpy>=pPe9N^>Kio?IMIG8nRXjCzpiq zkCL!$A9p#iBF50{3&x*TZy>oO(Y##>M@|rCLq$b9xkr#yQn(1f<}wf;BK`jog(Fh< z-~IM>l+7qOjWp|MfMgV{7&bYrS z*@?MD?02;pyMgd?oYMso?Hyg^YMd`^e+QAss&Lw5*Y1p#_oAKAcl@1^E&}9=*k7-d$CH&&Pc~sDnn<- z7_BHwgx{6w7fi73?4tf^)KZ(IV5Lm#)`kS4vXFESSxj_0xfu7h6lMT;Bc115^%{xG z(q~erbzaHrdTGEf0QE#vL4-{$)9(9t!; z!)K&mDOjyRweOKym`r-BaL8L_A?z}%T1?(bVsVV&fsVVNYNg^YjuF=Z_(-B?XF+La zM`)(r#&?xU?L0fRixaj1Fa*>dBlYR_ox;gLu+zIINy4di5vgwj+#pr1ny6SyR<<(y zN6FzeLU|7{H#oQ z-((OwQ6+u)!-ySNrC;Px)+(|@1RA@u(SzTycRS^E>?A^P&*Q?W!*w0%*r6@}tU zD~Lq|8*J4IMNvW22c?DjpyE#-x>V2yE3HT@wWUf*nunkmt(2rGOFX%zX3B%(>?~gqy(VCcuCih#Q5)8WX|<12h&4dR&HKlxF5K7JD)l z_5D3rZ3gGe1Op0tfcW7x0Zop*P`DpJ2_T$is4r6!*6zU2P@)77rfhC1w^@OZtfRHn z8L20qGR!4uqzyx>PB480z+cWS0~1Qq<52n%h^7T<0Z?qk(k5LF1lp1m3fbk>l;p>C!GNB|5zK_CePOi-+OIT0eHDryyhINP(ry?D~!OAfUQ3~#QVvyLWT<__Xooa; zg&<7rK24MZ!Hgdgao)6Ka4slw>=Ac1EmIeVPdkm{0NuWjCp*!Uz6Y@aqhU4zTxDR$LEyCva%Xj{1v;Ke zELm}^`T(+m5XpHwzj%h3kNPcV)rEq}5?Y<7EHHl&hWCYKCr>7;DHOi@+TUN4;)-E)ce^8$d|!dL=GBsz zo3Y;6ylSv&(!Qt}6YDzK9pGbf2SFlZ0*5qbw%-!wSjE8>d$7TFMYZd7fL;W_WJX+( z-sofBuV`+zDgjcK3Gp2X2Ajy08DL;(u7o)Xs6&czhKVb>2q}g^GdYORM&M`iOlW}q zVzv)3=vWlq6Q!EE;t|QMt!AXbxt$nqtjtuSKGzqhk_l#wdJTfwA>(*VW5dZ*uV zeop=U;%`Q)hzXJRFLZV`dFyyDG;c(aOO|<;*7OC^L>%&I?>3sxh%KxuKw|6K1Auy# z!P^*UBH5M}(ijO_mI2Mh*G<91zb|@3 UZX~b%3jhEB07*qoM6N<$fPx(jY&j7RA@u(nM;TqRTPH5zox5aqBBZx20}yx4JZbK+33okq6ltObfFO37(omo zID?6=jiLe3jWU6_Q1Ow4A%ZSMq8mj75khn)qC$vCz*lr8G1FC3$DH&nXxr)P>X!+z zE;Q3Uef!??ombs+t~dvV&H)B0h_l6tl_i2DToJ2)S_#WEfRiQW^)zJ=OGII(8K})m zy0HsLV#eE$JO!L6kkSBul^(r9`1}}{1lBZ#9@{8IuK-gec0FchcS8D0fuM`PufSix za)~v2%1*BN8Hn$dYz}k*oc{e7FcIGSp6wg^oZM=zVYfn&rc+?QnLQ8b=fF}okg}HW zd267)OR}4Q^IC*%-NOa=0`R{+T=+}FD+lQ&Q?7{L&9aAJ`F+4+spBXMF#)wXN!x+* zgC3rBHn5+~(oMj3VXqZI%0T#>wNiWl zm<|97pnZ}Z0$procZ67Rh)W!%1>*4l?+^`%*MUXQ3NB?eGj0H`4sLqVjK?6^Rb-7a z5D~=JNPHRsI+3(H%Nmb17p~td**n3-x3++UQ@%0P@k z?OI9u0>qM;JqPIv%^)7XRm$FNfw&y_Etr25)Si?y7u?Aqt^$54fS8iv{eZ8tY^IN) zarZDFt_u(z4-WAxq%W=j;ot3m=sjp0g4&gmb^;qhkoN=eNq{)sDYDC2q6p#^DcchQ z-uLm8xMaq`Q~vLn$upU!VIO~(CF{GmQ@bTb4$*+|byD^r-~nB4Nxh!A^0eyj9qxOx zZ39~k95u69NWTonh;GjaU+auPw0eg>`0`_jTcY$CC@gYTK$JOF6wRq1I%&rr zcAZje*Ar$RW~nSuS)vcO>GYGzoho;#-07bhsAA%O7ZW=meK{2GWeTfaLS|Bmz29_M zC{IUH6s2bR2(n0$AGe1M;Z>k_JNzW^4Zh3MsrRNEu7Gl+#lE0NC1) zQWu&ad|mb;qyW`Z>UxR$0z?M-!7SSiuDH~%3JNV=7NQRER*7dqKh|YRh5(SWc}jIx z%7-ToU*BD88zgUr&wXd7JaW-Hz1N&Cn0*RUSoa*at88pS_>$=ruqNx6W z8C$^ouA;0Z`-MAUmOTi|AGADR|Fu@HLil_)`xM0Mz%CpiNCwdnXnZ@Y>#mhF=>gfR x5_+*neiiKTQ8-2^M7O<%_I(90G*u3`(BFWBi%?oz`D6e9002ovPDHLkV1j5ULIeN+ literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar1-3-active.png b/src/images/tabbar/tabbar1-3-active.png new file mode 100644 index 0000000000000000000000000000000000000000..96163affef1adfc4e55458faceb2e78598de9a54 GIT binary patch literal 1406 zcmV-^1%djBP)Px)I7vi7RA@u(m|bjBWf;f*&)YLgX?Io-4VnSF07eG%luaFN7aS%kesLp0jLt;O zydVT`G{)csm|zSs!31v<4DlmD#}yg^BwkED&OTykdq`9g4WdMl&-IiI=-Ts`BUyV| zy7hED+YH%z)1>G5`2XJL{U+Q6jqU;lOhf!%syJPV=}I`*1C9?T1}GI;79tWG81yKB zMgTJa{KG&(Fn#AsyFR06bl52lM@o`*?gGZG}-SjAIa2 zBQ5h?oH<2+Y*!R9e|)H3du#oEWbOKtvU3C?8Cp6UB%P@QASZ_DBe^I3_LM?&y#Uvm zbIJ)2TCGADP{DX#c2gg9#|QLCpph9J1bPR6WVOv^L~vGrEHPe?sw;85ZG~bOM!ZPC z4p~i@V((}dTZ4<-f@4JRj(j9$&DW!?AdGK*R1J{~2fidw$A};X|5>MM3&!fz!IgpL zte`$?MY0eLv((tx@l>NK2ySneQt4|2OQkF8ddS;%GFnbdGOYYTKn|8zwAc2;ek|wb z_{6^2(o!e6GXwd+d{b66j~yY&P~Zz9dL?H|yhT2tePGA8*ruvVn5zofuUM8 zksIq{2}*{PT}0TF_vLN1sCkVt%85yal_&wt7Q5GE zHLDKZ=P7|mMU)N9 z_{K7%hKI9wY<6Gb_-KNXVdV$`PguUEuHTa8J{XM-O$o%s_9mYvU2~ZMw?#n4fU(i9 zp4x2{bv4p7UovVw1!0Z#e+D+!sfk_V0Wf{4n%E;r^_79O5Okn~i1Q2_1@lcJnh(G{ z)rvwp{x!+o=6O9mH>MQg_VGKo9mMZeC`2F5^3r?zv~v~u6_`6x2{R%CVlWciY%uS% zDX4eQCDuN0EOyDJ{itS+L5yTbg#-69#C8I|%(pK?MU8(Vrro~!#h=su{Z$>oEsIID z{ZQK99AbK;xs}+sz5FsKYic;|IjWs;I-}#2a9W_9c+(JedTBCj9IeD(p^(SVsRlz5 z3t+$x5_7E(#27H=#xNNdj2r2*_r*^C?F3|15a#O!46GxFRRjb9EUQq|B?ElQ1<{-4 z%t6gPr+;;Kcc#J^mG9VR+8bufNz2b>8Jh(C_pan*JI{;*oaG(Hpa3LdaKgL5)KpRUneXH8H|1+`ku)+S}PCr z+qn>p_+MGIY@U>rR)P6R0-iGgOT*AU9iG=mJ0y+?k!n>|vkON6)D#83#f0515_^2d z$NyebELaaKuL5`zfO5xSh53*S@AFjRv^y%qwYC+CFbtJ|nMDB)x?EDH_gM6Nxv@Il z?*rjrrvUFLt_(Bnlj|3C6c4SE5Zu&skM5TeWVv<{Fw6$MC-=t9;1k~TP|FffrVGIG zf@H*<@(FEE!TwW9O)8?SXU4Y$-wb*~?u{4R)FztbLLlJv_$W@m!h9~iBCFb*iXqs> z<$t1p^hcD%?83?Xv!_i64uw2A4ecdh9l*zjuH%`xnwEc>nJC4h#7%|*FAAca=JDPz z#7q9(*bikZG07UMPFHrHs5-+W1ek`Hgif}VV!9Hxx@i)O?uttM3vWTvK&}}ifdBvi M07*qoM6N<$f)|pDNdN!< literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar1-3.png b/src/images/tabbar/tabbar1-3.png new file mode 100644 index 0000000000000000000000000000000000000000..26093503319e6a3cab8a9ce488fd513ec4ef7e03 GIT binary patch literal 1170 zcmV;D1a13?P)Px(Oi4sRRA@u(m|KWdRT#&A|2=1)adb$Hh+a}3N(Bo`3JJn44;5W}Ns=go3VRT- zmmnE-7E(eliHS-VOX%_tWkeb#jFvjiKC}L{_2}$#oSD7PoPB0O zX1yFZ`&-}l|E+J`z9lY!rb~c-09_!IoC zt&bpi3rNc1C>vs?RCynCZ;rqdwpPKwRv@$sQzpbLDLx2XR#cSa*F&g10}K}JGn`#n z5SL5wFRcKa7bE%A5Ngj(G(?vae*r9R60*nkOVGOy`ud=IUKDwS?dO0>*4E|*NWL8_ zNC}yU7fKvx6r~L?kcu6yT`R@k0Mjxbzq6AY$GSesfOuD8#gHKVW)I9BeN^K`68o|l zvAgC#|DmyDqg{xK6gO;@Ha9`?Rh}3r{uQ_YYx{PneV*5^6AOE~6!&Eu_uENNF(L6g z5|5p?wY?Thof+FjW7xZO*ou>E2YJ}hY$&~JMdD81E2O?E%pNxC*pPcQ_EqUw6v&$lS#gk4zx zr+;s;UxRr`nKX1&d$^XAaR(qSXcokaySk`vzdAlR7#)EA^vYgp>m)>}LPv8p2{CR%ofD|+O!Po? z4rn%b1~@&1v#k$w9KsQ(9)eSUlra$PLd=ACSroD4T#3nbEs8n{J}5A^8y8N-oCYz-lKa->UQ4n*Y+NjrhK z$@!UcR|ht?^ImkZ;P`Qgr-6kRf72)Sz=Okqi~@1?J!ub+mYbQT9rnOV;Bekt9sBoq zr9`^88!}VRNcud~@a#DfL{*B@7r6^%XZngQ`GpW_sq=AY)%lXsb$ER?n9WK^Ha86G z@M@|LN&c{@^HY#CS8APxnI^^Q>*6&-fqcxaUC}ax#I_J}i~kM*b9O>x=%uk!yp$5 kF`0=%!!!;?mqaH11tmgXK%R~t_y7O^07*qoM6N<$f__F8a{vGU literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar2-1-active.png b/src/images/tabbar/tabbar2-1-active.png new file mode 100644 index 0000000000000000000000000000000000000000..18c2adb779fdb0d4cecb5d2b6c79a6f92770e8c1 GIT binary patch literal 2021 zcmVPx+pGibPRA@upnSX3sR~5&<=RU_yllVDFOFP=pAE@o7ZShO%vGhH+EUPB5u3}@- zG++!=KnSD?0@5gB)zC6fJ3s~0{X%F+{MZJg(ijuk#u!kbc}}vr@pD7lQAS%q8Er}G zXQxdZzxNJ2Cw5-kX2f=ytUG^2*XQ1IKIfi$-nln~cYx44fB|z3kycy3%*0K3 zE;vk}C-(arzi`vuz1C#`k=9yNK#L`D{QPwFOZ8@?I_-}{YE}j8?F7CLK%iV_9Oj!FW69r@J8#Ag_L=Ba z!GKfyTM*hRb%KEm*jipm-&A#p9gIXmlHckh!iq@%jB_CT0_?mXNIEY0k+Llc*{~I2 zdOsMS08rzd!_0BZnYVF%Pfz;)1%uTq=Vk1MI=T1AKvfX`ibU$_1GzsE=z5P)n;AO> z1LlqudykJy<;>XG$v#Zr&jJv|v|t<%aIc*v8NBNpM-rY_?Tg|V}3%1uI|8^O8V7fY3l7QT}~&v?!s6)8omllN5;2% zWJnTA-~H#lGo=wutICrge0qw=kAiR>jG(vM_2~Xu){PHV1YxS-?-5Z)aWSTE%dx~Z zuOq3b@?pXFd0~thrflXG(xF46UcIB6Rt6TC^)8(2XgTt{Rp;B%{A%1R8{%~PH4U|+ zH5re!L0LEEms;mYq$X2qod%=P^V`8-))y)5R!vQLnSc*WkAMz4#GQ>@#_W z#YZAJu?zfTIhNew!udyiKN6rtmW{7A_Za*Bqbf`MgnyP)uHOeoeYbc)%xKHUh{aPA zPI0HhL?mdL8w3JQGC9X=7Oys4q}wffC(f$M9TMTWfO#!i=t6M{K)yhoUWJJSxYG4gwrk|4ekv;s84*C#n?P6^teJOmAl@xKE_C@OAyB)Qvj#@A0$p27ra0R2z_E$pv{xt#!Kqe|-{&6<8qm_6`iT zT^IIAl2I%IM4Llhi5D*!M9EIrvTpba#?GtC5{ux16#FLv5)HbsmH^JE;qNlh7Yq7X z8j;`C^?D|ywQLg*#a9l;cCK&iIT)`BBDKEdz2t~bGV=x^x`qffV7T|+*8#XCa%0he zjSX^-;l5hr#Z=d>B(jfs9bm>Qa?IG|o&hted-;UzGLaX0N`fhHoLFm%L++gI$f?#=WKMrq!0KL88C#F=HSR z(v3CKx9>UFDJ{HFfPOjNla#Z@(5cY51*=~ATh==%wNAN92o!6%`&)3yY9H;{V|(?| zn&JXnTNtaPEzg%dZg2NxM$fw4|Y7cuMXzK0ay3H07rRxEH7~VH_O@nBli-9xoQ%JjAi~<+bxiL#GR$egeJ8!2Q9j z^tAV*M|3z^Rq@C4b`{?!u30P5B9cNl*@n z_ceC)?Jp+{T;1Xa$ZTu96_V3Qpu<+y_xa{{+?;B$@s{EdFx*z!6G-&>h&t=vqC5_% zt#{kRJLrPzD}6=Q6W=NqU=l>Rlk*_{+%q7$^CIc>_y1L}KM`<*iL%5TVBl&1w-L~M zfj;9g`O4KDrRQb3K9${eOp3hQ=LameJT958!BRZ}cQok9N4%+4?pjqrxW+Q-nj4v% zz2zDP<7LNkwl=-eP+GwVO`o>**nM!YUrWM&{#rMviK!#F3$jD}0$ z>{M%34Z#4VwXjK`{PmK7bVxVc596#!)exq7Z8MQC|Nb*3^oFb_R?Zs1O#G9@R9m+a z@uLN&8Qc-lle;e)h{0%NsjuYeCa4?vC;QoyiqmPR?Yc#dPwEFFe{;(x66j|^J#qJJ z0*u+MP*Pg>2Lkk&2>_f5>c$lnE?3pG$|0i4PQl3EwV82_$)_~xarbIE>ryd<`=swj z?M^qHgd=qZyAK?mb?=L5JXe-y&~C*$F@ru-z0`jJw>aWYK>6}Y00000NkvXXu0mjf Dr&93R literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar2-1.png b/src/images/tabbar/tabbar2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd1e1cba0412297b0bd424db59f9bea662b0e25 GIT binary patch literal 1674 zcmV;526g#~P)Px*L`g(JRA@upnR$#{#SzB8uV;F8F&L9XU<{Z;5bQ*Xgn)3x5~nOd#AS{|0SO`{ zfpClK4?qwL83`l{kU0bbAwvKeNW|$Rki!lju7o7YVGQCj;MfSvnsYtd8_zmddw4WlK^ z0kSJLA&BZslD`AsS`auB2)AuA5TySAz_%I(lejO&a5{jni9l3NCf$O>*rig~8^Gt? z0@(NsawbT>6u_QI80`y$zn1~nkPxc@Y~6wg0|4rq8pJRFGaP`Pm9iOS0XF1LG$ABC z3}nY|j1UC;UI6xYj@vg3j8Sg^e2LWG01Ou2Uy;IhHX?|DJ)Micknl4AlR7m_3flm% zb5ctBm7NBitIn2qX&Eado(k0OEi<=YXJQKJ7Xq;GDJyHFFb%-lWftglCw3m>ZB&4!nya58|`*AG(pDd}#t6fNmjKsLKHgmeCO2|rJi4NGwr zkXun#ILM!7-j5OUf%=kl4fDSwF|Tb`>Ll)oQFj8_%K+8@*dD0NAl-!k4oud`q~J?J z4D3P1*OJ9@Nrwa3;?_667m0r~{+6mc17Ez;4nkHR1bAWxAvE5Q7o>1NNeI7ygl+q% z%ZYh0hGt(d`n7r`$=QkK)l%4HoG=?GD%!2O1X(17QvfV41MyALf0!s7lEOE}F<@)b zuS_mA8?v$hu@Gqr>0bb_UxyG&oa3B4uUi$I6>;0))aEe%eG)IWX6g4*b|ir9NdKVq z2$IeOvS$Fl4+*=SQ+c*%Lz9BfpHJe3WM^-*4VJVMz=@<~EdDRX_(vdn4nRJ}3Ed(9 zBZu*p#ylzh5Xcvjei49!i|?6)9{}OSYIX3CJkS3;HVg3)seVGs7{4!xms)Ff*Wr~2 zr^-CiSz|vUQm`6m4Ox2>(9wxgEOSf+umbSsk{I!B%iFp>#_S?n0vOzl%-?9Osf&SZ zZl?||0paf=VQr*IT^i{HOeT~5)wE9lv`Wf$9KGynSCbm^2q1;Y0Nw|xhmy42Djd^Y z8BzkGI+vv7>&8yl?fJ>*Ut3Hivt?sF$Q4rEKq654EvaVNT_l7dz+b;M?k`Ao;-Dh- zJKBu(K=}Qf(@7HT9mr~$EsIOXY8xvHnwdn3KL+xoU#`v|`E;B1#Zoxj&VX~ZYo$2N zIo+1$qZcFT-vqF03!<_MFx=*h_4Bkr4D3$kw*Z{kkqbumVv&>`nvSnj29As|T2Yt? zACl@PjkE6bqW)^sQp==ZrA+M9h6JKAi*&!XnCNtJG469IOabt5I?uW4B@(Yoze%Ci z{v@;RqXB;c)bH=ch6cnW(*J)P0DA-aC!pm3w*&A!0OQ@Pe<^bR7}t-6jxH%aJ}m`H z!D*Ehz2o2+h>n z_+O<`JI-$H;)ZPi3;?wUNF6hFr*Hre?DpLh5pWOQgyL;}vVk%2tLymRxSd zzqDM^89@H{daM`(DkqSf3((SQQ%KwzV>qiT>x;o9QfyPr1kyhR;GlICYZb{S0WOVE zL(Xxs6sH5QhG;_jcoH|q7|w4mCprb{1;TXLS+erFy|e37KS*8`V|`9p08`W}g!MB= zk?x6(t!@o`PU0Cr{of_#j+xR22y8?8kCIib!n9J|vRRvO8L7q2Rpw{eu$37}rYeup z4+xUp`sqeUeI|vifC*CoYl1Wga0r<2Hn2K{EpK(ZYx=PgS$!9v)kh|F`B|CrwMjpA zqDuPohY`E5N+0wxPx&U`a$lRA@u(nM+7iQ5eVn-@Q5#G&4Ss3WaD95!zg30-eDYMvI6Rt)!JiEusem zElPTj1tkShn>G=owXCQXVlPT4N2Rox5h5c{qJqfRj24Q{`SO;dGu6yJ(_9^~dw0Y6 z&j0)W&UYT1GlV7Z(Gp;Q1+iGFXjMY51XolzM%D3$04j|uL$@Ck`FGabLc};$KH{G$ z!ESf z2nHV@DBlyC;#vUJbGi7Kqb=BwHpHmcRmz~As1Px(*xLgK_1|NaRY?PPR z>K{pFD(uztcIQk?v%?qIo;Jj=M=Mte-Lnwj6Lw$l>^wqz2C!;o=XqxL1vW1zgaF@B zm>TWvf#y-KwrhG9I|s(fs0qnRWELW3#J&Jn@%so)O=RWfcXfpfrqjYg{Mvfe7XYm{ z+JT7aNlUSRtI>%a_G$|Yp&RFVDB(x08Uh^$Q2GZ9(G9_(Dc2X&&l$rnBM?znjA@`=2ZO)FK z7P;P%uj2E4p9p)jYar~2nx3M`)%k62K9~wI;L(a~gxLQK-c8W>#=^GVQQ1Vv;zAzR zAtJgw7ehxKKK}(-ZK(%kT`c5ry&@v_tS}=)gg)6s$>Nwf2NeHq#f&~8?j}{;XMg_s zYual<7Z|Q8*Hj_=W|&S<Kz}uR`Tzg`07*qo IM6N<$g81;S1ONa4 literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar2-2.png b/src/images/tabbar/tabbar2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..7efa211333c40a17c5abe1016efcbd8b32d5ba60 GIT binary patch literal 808 zcmV+@1K0eCP)Px%;z>k7RA@u(nNNsKVHn1r=iK{U6vmJcWhKcJ8Vd^+WFc8t$!Zb{`BTb*$)60x zM2U@!lo_^!#Uv3M3!+KcpsA5iBANWV%{lixI?cWAncLiZzU!VdSGRL^xAT0@`~Ked z{qE^}hiHL|Ex>>j;(zI4+KFN(W|HO}fHl#b(GAJl4xkXNwO9OWCk$Yg7sIR|(PtY{ z(mH@Ys_U~~fZy+J{Q_OR5N(c=?UA?_K(3xZb!uNpem79KW3#Rvh}ooh2w+7mV-o%0 z`w~`0t*PcGVJF~TjRL6y!ki~@Fv?JJD?GD3Bu_-Gs}ABW0WegvaF*unr1=`s{v_E; z>Vw3klDbRxq991@Bk`+RT;E3*fc0fR9Ra-F7$9;Tq+XVdaS3qukNuvyku2P|g^=8K z0N-klqzUe~1sX{MfVU+E2(yaBV5mCB0Pl2i5ZR9a7mPvR5#Vl^R0u#fCG`P?0l@4a zc?Qt@P^T<9(R7HvHTwi$US$O(cNTz=+T%3o5D5Ny9|Krs@h9;>ayLaivB}AY2y%Ba zncOzt*HHi+l`tf(IZmeE^YX!SCh}?)L@6-`Fr6fi1O8f)w|zfz3dp~W%seD$HbgzS zR@J5u)yr7xIT1_o$C;#^NIMbZRHfsTj#D~L<13KviF8k-d!h+@qIiT7ytU1Uu>liW zCH9V;bmC$E7J*<7FnTif(~hFy6B4iE=!&E{04vUxbc=MJ`Tpny0Qn>!o=UF8QNAr= z?kuT8CAH*l1`2m=S6iONCjC-mu8`POhR7@i^6z4Xz(Uf5zZtxd+|>ZS+XkwwGY3dq zENMs`_I>Z1t+!<-0Ma}M&{;Ot2*6?6KoPnr6P#NO0~(aPJpew(uqOfw6MPYR5mVCE zHWDra?(Uc%0-M}cQr7`Yx6YzLVFD0AM$;BKPN7Ru@C{*ZgE>Yl*HFyklx(_td0 literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar2-3-active.png b/src/images/tabbar/tabbar2-3-active.png new file mode 100644 index 0000000000000000000000000000000000000000..74e05a0d262943ccbe7d1c448c9dba4f5d723db3 GIT binary patch literal 903 zcmV;219<$2P)Px&K}keGRA@u(na^v}U>L`r=dE4ak*0M_!GkhH8E$Uf=w|KeUO8-z`8;U-{!{|{oOr-`#K)zq(7^*&~7UphucGDh`Es>Ix(maR-;w*lak z(S)k_BqP?xMdO1;bTuK!@3*HMSvg6!kwnE}iJ;dL6`$$V*MwLI`r2~{@AM`pHI8z4 z+!ISYEp@$eohHP5sO1=X%N5v=QYL^Yc0NXhsktjEj zdj0o6fVbP0L;z?gyoV=wA@R5zeaj$ZlX;Lh0PI#(q>qn^k4gox6hbyhp^!U8Kjb~P zr?Agi*e%2#mI7iqgluv))aZ7Q^9=wrDoslgoc0cj_q9MO0%8@!5d*+|1p|QC87>;X zR}7?LAeLLJr-@6Y?ZW`jT+Y<0CBc3!VxuhTn)Lql21+9`Fg?J6<4t`}fAj$ndGxgZxC|7QBeCcnQn<;X4=0>}q5 zhG)4~iM!@Q0ARAq7ejzfqaYHpPH!as)^rFt;Y3e^vp&tAmyqcmv5cfqw=nv`vOQt6 z0&B&aKAkoKqza*as#>4o8&L&Wvs#I2CDyUGs_j&5r+=lLh~O45{Jf5S|0;zGcbKMZjZ%@C! zo*dbm2yo71f*C}(rD+NT_$Ak`Ix|3|45n+3#HX9tb-xN> d)st7}{SBnZAy1V6=Pv*N002ovPDHLkV1k(2pk)96 literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar2-3.png b/src/images/tabbar/tabbar2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f4460adef345372b4c82dfc00e4654190be74a GIT binary patch literal 753 zcmVPx%t4TybRA@u(nM-REQ51l`bK4u+5(9=JxKKm{5usS{feUvciU?8>L~)@TcM5J@ z=)#Q~{Q+ILQv^W-5k%@vX|2>3uEi&6cY>vvne@msjV5WDOy;JU5GTu-^ZM?2ZMYsM0f#!M{6Dq<&r zy(z@M)KyXg$U*z?WCVB`1t0)ppNb>6{D^oiKe`5re2P?Ztz-j(fivYZA*?3^pW zV(TjBz`vCQ1jb~ps_GRt5c#I+?F42Mfhaj0+5ih{;)Be828v1bMEtm$Xm+wEdI=(z z2QL?&X#NWjBv?-Umqp}Se1JvG532q?;71aTJtSg(I|7t$M=GbmyPX7th}bD$w=0Nh zXv2S*1Vrd_z!-ZLh&^JB(YHYmJWa4CTys!gKOM2l&!y=tc2!c5W+Kf*8w)Efr?i~X za;iRoRqhGB3G%6phhEo|2p55+t)KJq% z^Ej&JAQYasK!m!(#@HLGoar#aPh;dlvDo+Px)TuDShRA@u(m|JWVWfaH%XJ)spw0mh)jHplzXl!w(1q$8WqK#1^4@A^}Q8Dsh zi18YOiHaB0KqUHLA|Xb7@WE&V)JTj1(P*W1mMY6$tVR$~AVCPU-Pr{~+nw*&Dc!QH zdzsxGs3H9x=R24G@0{K5%r}IKV9`aufC-5IOBW|PG0_PND{x+ZPDd7aswbVGrObQ_ z5$Xx#62MUcA|k18cK_6~%R&ZgPbXfoL_TqN?JPbtJ%3sOV_7Hu zYOk-V9dK=x2<>Kt=>qrE?u>kH);^b=B@llsoL)Iuo76#|)+~wk05}a`DuCL|eVuS? zZCB*`azHGBhLG_Ue15ndim&H{X!TaA8KNKC?~9Aw~{G>FNL&d{+!e%bcR?nIxzVXBSo zW3vE2UvGtW)wLae8v`!uiu;t60F1dZnxA($)o4p80HX&=sjg@I7@&mD^8-Nh$4(mX zL0uP%>biTPnbBij0*hop(YS{f=235+Oh<~NZsGs)GkY0)H@I}ecM+VTa@poX9mkM2qRhV zyygbGEH(m|StvOH>-P-UR?Z0qhYHyi+P4(KNVaJS(wfbdsxV65J^fNr4yyV(y*cg9L~|;>_-s1z`w2?)O|@0lJ+SbBS1CCgbYq zDkOk`Ljdn3l0w9yduYJ^O__b_x&7kcAGBFHIL5$pqq-8Zfh9dcjQ4k_Azxi^Zi){qV z$`Z)<%CT9H{;A7(dIxRYH&ATlwf0%lF_>HcV3`DJVZfFdLkNDwQ5+?eh+{9k#*5s18-87pTe;y%SNUXkX|mn2?X z*A?w7Mo>AnabMH>06&}-V<@TXb22YmSt0t{8WmaC#%@~12LN4{{dL{D|8r9-N2D2F z&D-=b5#Kjv%h>D;M3$b@p=^N?ex;EaJ*hncKjl!PZ<|SKwGGdnZBJAte*tjAXzVYX zYUHkh5Qc%)*7O*dAC#E3In?kgR*NepUSeKzgOJ5r1e~(jDxRFQPx(Oi4sRRA@u(m|KWdRT#&A|2=1)adb$Hh+a}3N(Bo`3JJn44;5W}Ns=go3VRT- zmmnE-7E(eliHS-VOX%_tWkeb#jFvjiKC}L{_2}$#oSD7PoPB0O zX1yFZ`&-}l|E+J`z9lY!rb~c-09_!IoC zt&bpi3rNc1C>vs?RCynCZ;rqdwpPKwRv@$sQzpbLDLx2XR#cSa*F&g10}K}JGn`#n z5SL5wFRcKa7bE%A5Ngj(G(?vae*r9R60*nkOVGOy`ud=IUKDwS?dO0>*4E|*NWL8_ zNC}yU7fKvx6r~L?kcu6yT`R@k0Mjxbzq6AY$GSesfOuD8#gHKVW)I9BeN^K`68o|l zvAgC#|DmyDqg{xK6gO;@Ha9`?Rh}3r{uQ_YYx{PneV*5^6AOE~6!&Eu_uENNF(L6g z5|5p?wY?Thof+FjW7xZO*ou>E2YJ}hY$&~JMdD81E2O?E%pNxC*pPcQ_EqUw6v&$lS#gk4zx zr+;s;UxRr`nKX1&d$^XAaR(qSXcokaySk`vzdAlR7#)EA^vYgp>m)>}LPv8p2{CR%ofD|+O!Po? z4rn%b1~@&1v#k$w9KsQ(9)eSUlra$PLd=ACSroD4T#3nbEs8n{J}5A^8y8N-oCYz-lKa->UQ4n*Y+NjrhK z$@!UcR|ht?^ImkZ;P`Qgr-6kRf72)Sz=Okqi~@1?J!ub+mYbQT9rnOV;Bekt9sBoq zr9`^88!}VRNcud~@a#DfL{*B@7r6^%XZngQ`GpW_sq=AY)%lXsb$ER?n9WK^Ha86G z@M@|LN&c{@^HY#CS8APxnI^^Q>*6&-fqcxaUC}ax#I_J}i~kM*b9O>x=%uk!yp$5 kF`0=%!!!;?mqaH11tmgXK%R~t_y7O^07*qoM6N<$f__F8a{vGU literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar3-1-active.png b/src/images/tabbar/tabbar3-1-active.png new file mode 100644 index 0000000000000000000000000000000000000000..960b63fe0ddee2a1874c9d350a5eb606bff552a3 GIT binary patch literal 1885 zcmV-j2cr0iP)Px+7fD1xRA@upnR|>>R~^Sczq@bB0#%k}cV>1$(M1yzqSZbm5y6nC^;In~wuwY5 zuybb%@xdR}*d>M-nvha=?=0O|wLWSPHO83MN7Z6&kYcOG3dO$Y&YcAorBH$H?#$eu zb7p5|@7{o&xwDbN*?)G4 zVaZ$;5D{C~3G6A0RgQRB-aa}k=c@%U?Jvohh}wDtcyoChd0aCxBu|6^xRelQfO#d+ z^Tud8v{xoCH;8ed$%s~u$I?TxGAzKQT!}J-C_hUjrNSCBEO>rc%sB~FX2m-#S+C96xokt( z8cKz7tDBS`gtDCt7rStab~I;r5Lgjb1Tc|b1gHzx{IkA+Yme@d)2{{+{j9!@23ktNVrYnkpV8Ll7XAh- z^$qF)-)zjV^?&X0&bY?vgu4{h`C})6C$U(U8j$BM1`@T^oVUS(V^I3tq-+Zf(V5U; zOZl8{uyH(Ya)-nOb;j>VEY7FR?B^P||JW`$926F_wO3&vuqu-%-&5hf7Kt5g!ueOCQ^8EqVk?TT1L~Pw7Q(K`_23$wVd4Z{n_Uc!$*j8?#oH^G@_e(owy3%ER z+BEKABHFoCf;=L^EvZ2nts0_msG9k=Z@|;8BUc9nEbG&G6CNiNn#;>CoM;ic%@*;u zk0$g0%DXCo5IAg-CwEak3htMzv8fs&7T0&G@VIY=A99oO0drU_;rk{>C?+?5?CRBb zcou*5ixYUPwT;z>`lkcFuDEXYgk8Qq??DQGQIuv8&gGrJAD8s zCSq%^K+cg_1hw>FAgy2I#LMa-ndB@P1f;@`tpSQBfzQpHX=v+ zWjto<*YYlL#v?!`NBfE0G8T#JdqoPXHC3t%L#l=-Jh4#l*M)M`E6h9cE%}f6zj!W2 z0yB8rZ6iXzcu`w_3Y5d{`Ub8xH+0O_yA`%fGjK!Nk^METL}a60PXjlbJuX5I%2j|# z;9metSWxyPqI@!ylybh@71x!X@aPNy!anx|Ys?vlCUgf%55m3f;MBz!vGoOkB_$g# zL-**g1SjL7Ofy!ZvsZhpI=+Fjw$fQZ+2rIPZ)YBUre-mpREPd0Gu0stA5zaoqRi-5OX&WVv1FLk|?C`+A7{BzW zJ7`?6XsKN^u0KJz$!B+VLg_e}l(S(W%++6Sj1|T#;m+J7-}S!*t?JkM=f=2I;SPj1 z`35q=?sFaS2ZV*MV+sAJxv)}$>@n`NP}!$V5sx3`qt*`x#9rq*a-bT3srf0EXk2d* z;mfKV_F&6}g0)iHVi^7aaARP=QO&V2y<2{9K_Tn4IXZ`rtFTj`-QOnvc_`&byjp-6 z5Y-xYZqPYa1HS=oxPa{`g#+wC;xxn_B{5$QKFk{+N)dEs81ga9TIU`cuQs-Pp=5}w;j%+>cVzEFy zPS+_fjtq$(wiey9yAr0ieDdy^=%Lv2dDjsWru^SZ?JLo*_0f}sxT;jnx{lOx(5r^8 z8Di;XZO>#m?i=}(>qz+*psE#xFsK4MvON{z$HNfX%O*8JEbh~{)_eTJ zCm_?9p{|vAv!l}k7PMG;|Wvwt(%nhg%MJVO=yT{LVxAYI|N>CvWPt!2+3;^ zSE+4ih(Mb9idw8r56GV?9e6g|g@#zTRa;xm7LuM06}}!Ogq|&s&=9jFU^e=>A|U3^_00000NkvXXu0mjf>V%up literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar3-1.png b/src/images/tabbar/tabbar3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b5fb995dd5777e8792f471dc2781875e0f7f9b GIT binary patch literal 1660 zcmV-?27~#DP)Px*Hc3Q5RA@upnR$#?h5)^{b81RbXt?@=dB&aCf;t>^4@rWYpfy?xJ{YmecqoCvgdYm6AOIz>oDBwud3i3=)@>m6kLO2(R0MAoAl# zz5pPoLf`_x&e>uhNb@Uz9m@)nc*r?>HUPVYK;%v%gGUm|ej(Wd0IaVUz|ZfIGeMd! z01Qcl(Fnl4mj$3FA=&`+sY2Km0L3j0q8)%&9DtTc;pnUYJ?V)Ggrui{@TAQVf`Azg zU}O+*Kv_ZOv=ZPlQa=7;Pv9fT?!Os9v(X8y$8U*>N z60gppg~T&~;)7Y%HtS66LYn6R`0&X(Hb{0406%5fpixf@BF!fNdZ&at5_3ts5k>eM zKs%tmLBL^>#sNG5KrXfBOUaG|u&xFWpPs$U9~$*UZ_<1SV9$h5ulzmESszya72^Yg zz}za~^i;uJF4@xneBC`r?i@0h?GuBf8-Z|YW={lxxm&_{31RJ$8xKUjsf!I{&hplG z4s(IxicJ-3nL@hTQeG*NxZgS53xvx7YydC-$c-k0%K;pc*e8^%$q3Q1H|f4gY!*ox z3xtcR-^_3l@0b6U@`HeXzDt9U`S}1(sUd{An)0?}M`eUCkC571?H3rb(} z*OQ!@klZHO!Ciz|OWe_JS0~6q$xZ~YCJV$4r1>o&aGhkg??Qn-r1=>@YvO-D#~?mL zDuXm{130)wh!sJ=X;D=4U2qu3ZH-GS)6796-l?wAi&A(DfSpM*-`^1=T>yk{0_H#x z@1`Uyk?fex4WF4z;*Nx8XLtuo+8tnT(q}Aw=A3&K2$uqgIvJr}1i)NKVpcWQ-LXLQ zJZTmJI6VFyN;nL#@8t8XM?_KdTIVdpr={Y_Rb|Ww63eQ4)_23p5Kg(7WZ*CM9YeA{ zTsDw}X8;|SFpAF{14{+WTuP$Dx>alIcIUz?{1!m#o@De*bx&Ohgwty^a0Uo-9|?br z^rI+s+y(sTPns{2_XI#|rEs@Wu`Ap}s?#HYWcvg71;`&A-?wAK)Ypb&fXGiL>GO5j z6TW)>S^8_6fn>P4vjzE+RP-PYC_F)`(ssuQVI5#@-x&8(5}r6Tj{TaP(G7$-I0$sA zM1KH>0@yY#I;-Ngppr=>cLoq8?#ubnBp0WoFOuw7e+Gh}aEs)I27%^8QK>MJ=34;1 zcZv;@8w|9kjL|($3Zi8%GMWW&Tumk@iCid!M<(aza)lF}(~~KWJSG)S?PA|yasO5B zrB+MUw=%9)9TE_^@nrCTkBM3r$Me=pb{7DDB-aH&;W|k-CBI3wkbaWc^wEG5fa1gT z=un2}OB(-tmm`vK^xvc4YY{-kV{LPuA{9~Vp3r(jhl6&@!wKC$Sp z*dTvph47DA`FQa!ByMod&P%-o6>>QngD@*r1?D|!*`gzRrlE}HMpA8q9Dl43&ZvWoikN-lx9GXH2ywa4ynH-yB*NF z2M`Sa)CzDN&}$XYmW0i&b=ow|*on-45775Ve)!_&+m!!pG{X~l(j(!Z-##vk#Wx>HNuh;p^AZ2-dDN#f#I&_5E! z0QRj~1vhhE0}$w4dKA{K5^v7ZLN^Pf5r}5#(C|K61;oEZg+@;wIWhwP0000Px((@8`@RA@u(m}_j4WfaGM=jq1AAc90EcI{Za01*vHG{nSs`=G`PU%U{bGb-7l zZ8s#r7=s^%3C0i-h+Rh*DDje@@Cgl35qFkUbyY_dMtPf6sZYN4N%>TmuY@L;PQ|IG%~|Ot?4#WtdJX-T?O*VG-~kFbk+w zI4;UTTlnhcIGy`DCGHl7s}S{X==HYYbKr?Q0?(oZtXekHCU&VXu0eQPwcaE-1YB3B zD227%Cs@W-Nfz2Co1H5VzNI>iOZ;67zhaa`Be1|JM3vpf@SdlF zy+_u{Y3~x9et50*taM+94^i!x89|+&guTv;B%$G0M7lckXr5yT#`WrCYF)g-qM2g;+4E%qNf!StR^IX@;4HwJWa zwQy3Q${`?;z8iJO2B#=*v(}qR)&q|Z5i7J>?GhdhK&nqk3%ft4Kcov)*)~jsa7=A> z8sVZs{gqp-$*}vK3Cy?F$b~V5Kvn!LtW@QlVuT2swGDH+!(tWFFVohQOr)K*si}+6 zDzK&?LBgJdu&_5Qv4ZS#7`X>=CCII>Yi*y0l>#p*RA-6(lfs7X6MR(a6};cK>kxxG zj!Hv-1xdNQ{i@9wPX!0M+9h>mceRxd!d02MosC0W#lg-Q%GFHxmg>Z09}OOuA;MG} zraPk><+KWCG(oS4({=P?>2YHqN`gpNH-u+_2Y`79cNQZ`AtrE0U{6xn-gB6Jd@qS& ze2nVEZg@qj<25`b5JJ**CHLCp6MkF5u4dW}QWd#@XQx11ly{>Y zl5$@5))3O!31tg#S4OZVDn#jbzUX7kW@R7Yf P00000NkvXXu0mjf*?MF( literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar3-2.png b/src/images/tabbar/tabbar3-2.png new file mode 100644 index 0000000000000000000000000000000000000000..26093503319e6a3cab8a9ce488fd513ec4ef7e03 GIT binary patch literal 1170 zcmV;D1a13?P)Px(Oi4sRRA@u(m|KWdRT#&A|2=1)adb$Hh+a}3N(Bo`3JJn44;5W}Ns=go3VRT- zmmnE-7E(eliHS-VOX%_tWkeb#jFvjiKC}L{_2}$#oSD7PoPB0O zX1yFZ`&-}l|E+J`z9lY!rb~c-09_!IoC zt&bpi3rNc1C>vs?RCynCZ;rqdwpPKwRv@$sQzpbLDLx2XR#cSa*F&g10}K}JGn`#n z5SL5wFRcKa7bE%A5Ngj(G(?vae*r9R60*nkOVGOy`ud=IUKDwS?dO0>*4E|*NWL8_ zNC}yU7fKvx6r~L?kcu6yT`R@k0Mjxbzq6AY$GSesfOuD8#gHKVW)I9BeN^K`68o|l zvAgC#|DmyDqg{xK6gO;@Ha9`?Rh}3r{uQ_YYx{PneV*5^6AOE~6!&Eu_uENNF(L6g z5|5p?wY?Thof+FjW7xZO*ou>E2YJ}hY$&~JMdD81E2O?E%pNxC*pPcQ_EqUw6v&$lS#gk4zx zr+;s;UxRr`nKX1&d$^XAaR(qSXcokaySk`vzdAlR7#)EA^vYgp>m)>}LPv8p2{CR%ofD|+O!Po? z4rn%b1~@&1v#k$w9KsQ(9)eSUlra$PLd=ACSroD4T#3nbEs8n{J}5A^8y8N-oCYz-lKa->UQ4n*Y+NjrhK z$@!UcR|ht?^ImkZ;P`Qgr-6kRf72)Sz=Okqi~@1?J!ub+mYbQT9rnOV;Bekt9sBoq zr9`^88!}VRNcud~@a#DfL{*B@7r6^%XZngQ`GpW_sq=AY)%lXsb$ER?n9WK^Ha86G z@M@|LN&c{@^HY#CS8APxnI^^Q>*6&-fqcxaUC}ax#I_J}i~kM*b9O>x=%uk!yp$5 kF`0=%!!!;?mqaH11tmgXK%R~t_y7O^07*qoM6N<$f__F8a{vGU literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar3-3-active.png b/src/images/tabbar/tabbar3-3-active.png new file mode 100644 index 0000000000000000000000000000000000000000..eebe0b73a23ee778fe3b144d4afa56e3df7e6ad6 GIT binary patch literal 894 zcmV-^1A+XBP)Px&I7vi7RA@u(nN4g=Q5462XWAhVpA{+TOeGQ#(WImn7A%N`h=r9{H9~?86JbH) zBT9mhh$hT5X@r&~f`y0>HWq}~*dPs!zG-MhD!!`KcX*@IOsn(W9evYE^X_hP&;6hC zJO6v%o4F&5gCXO9fdJxvaWQbhaiS!yQz!Lt2Vt3)GYVHz9c<)^^m)bRGyhLcRBhGp zyJ8ll6A6_9O{Ph0Wre_(obf$;NSznURPRp-d5n2mb=r?GbpkP9LLN)=3RQTaP}`o6 znMV3RsBguZg7wMn`Q z0rA*Mi04(lDPSa~ClU4z#M`X38sxU=`hRjlvM$d|6S>7jVtO87OD4wdWo~<;yfxJ} zf{1L_GK$Fl&)`+}cb0y*AfHVWxy6;obeApE55y?@tfZVW)i#1~#G)~MszOzkuyXnHR{B>{TXg~WIqUPOM=^XKya0G@u+wP6aM@MDoT5dqi0Zyf}a;aD$EI$AuHW01u%m UPgHpBApigX07*qoM6N<$f^0;XrvLx| literal 0 HcmV?d00001 diff --git a/src/images/tabbar/tabbar3-3.png b/src/images/tabbar/tabbar3-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d607c6be8be7a5cdb537c4914838fd5f51a652 GIT binary patch literal 806 zcmV+>1KIqEP)Px%;7LS5RA@u(nNNsKVHn1r=iGZP3S&r!vXW$KXe=yPkcDJnC96p+)=rs4bXKr)v`L6lSy}F&VyPfBI-uL&u z?{`nGK5 zN?H%_M|FMn3-J5Bsb8q87oyE^vb_@b0m#)8s7~!GDd+(TcTLvS12LC$9|7pBWlUlq zdSAk-xHZ-MB#Boz%K!}5ES#ZvJL!InXn&II zBlSVza!EafQ!Z<@EGtmHWUKTElK@AVGwY4 zk~|A&VWd+AooG75-6EknhjA; zu2r=uMD;S(dQMm={sfb>6KN+bPE|Ti={Tk1G_eBdo=EpZx+j{jCyGZX;al4*iw&66 zDzSI$q!W+&w+IA#fw5E8Pdkc+Pf5JC(G^Ma09KqW={D&+4}!6a0P;ydJd-?wqkL1u z+&NN*OKK_D0u=6yh%mDmOB|=rEh+qlFyB(HRcthDd7P3>cPj428+$52 kl3traBwb-s|CZ>)ALW0^KrSq=umAu607*qoM6N<$g1X{mIsgCw literal 0 HcmV?d00001 diff --git a/src/miniprogram_npm/@galacean/effects/index.js b/src/miniprogram_npm/@galacean/effects/index.js new file mode 100644 index 0000000..d5912a0 --- /dev/null +++ b/src/miniprogram_npm/@galacean/effects/index.js @@ -0,0 +1,37435 @@ +module.exports = (function() { +var __MODS__ = {}; +var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; }; +var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; +var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; +var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; +__DEFINE__(1748338798564, function(require, module, exports) { +/*! + * Name: @galacean/effects + * Description: Galacean Effects runtime player for the web + * Author: Ant Group CO., Ltd. + * Contributors: 燃然,飂兮,十弦,云垣,茂安,意绮 + * Version: v2.4.3 + */ + + + +Object.defineProperty(exports, '__esModule', { value: true }); + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) resolve(value); + else Promise.resolve(value).then(_next, _throw); +} +function _async_to_generator(fn) { + return function() { + var self = this, args = arguments; + return new Promise(function(resolve, reject) { + var gen = fn.apply(self, args); + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + _next(undefined); + }); + }; +} + +function _array_like_to_array(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; + return arr2; +} + +function _unsupported_iterable_to_array(o, minLen) { + if (!o) return; + if (typeof o === "string") return _array_like_to_array(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(n); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen); +} + +function _create_for_of_iterator_helper_loose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + // Fallback for engines without symbol support + if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function() { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +function _instanceof1(left, right) { + if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { + return !!right[Symbol.hasInstance](left); + } else return _instanceof1(left, right); +} + +function _type_of(obj) { + "@swc/helpers - typeof"; + return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} +function __generator(thisArg, body) { + var _ = { + label: 0, + sent: function sent() { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [] + }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { + return this; + }), g; + function verb(n) { + return function(v) { + return step([ + n, + v + ]); + }; + } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while(g && (g = 0, op[0] && (_ = 0)), _)try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [ + op[0] & 2, + t.value + ]; + switch(op[0]){ + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { + value: op[1], + done: false + }; + case 5: + _.label++; + y = op[1]; + op = [ + 0 + ]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } catch (e) { + op = [ + 6, + e + ]; + y = 0; + } finally{ + f = t = 0; + } + if (op[0] & 5) throw op[1]; + return { + value: op[0] ? op[1] : void 0, + done: true + }; + } +} +typeof SuppressedError === "function" ? SuppressedError : function _SuppressedError(error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. + getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); + if (!getRandomValues) { + throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported"); + } + } + return getRandomValues(rnds8); +} + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ var byteToHex = []; +for(var i = 0; i < 256; ++i){ + byteToHex.push((i + 0x100).toString(16).slice(1)); +} +function unsafeStringify(arr, offset) { + if (offset === void 0) offset = 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]; +} + +var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto); +var native = { + randomUUID: randomUUID +}; + +function v4(options, buf, offset) { + if (native.randomUUID && !buf && !options) { + return native.randomUUID(); + } + options = options || {}; + var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + if (buf) { + offset = offset || 0; + for(var i = 0; i < 16; ++i){ + buf[offset + i] = rnds[i]; + } + return buf; + } + return unsafeStringify(rnds); +} + +function addItem(arr, value) { + if (!arr.includes(value)) { + arr.push(value); + } + return arr; +} +/** + * 性能测试:https://blog.mutoe.com/2019/compare-filter-vs-splice-in-javascript/ + * @param arr + * @param value + * @returns + */ function removeItem(arr, value) { + var index = arr.indexOf(value); + if (index > -1) { + arr.splice(index, 1); + } + return arr; +} +/** + * 原 arrAddWithOrder 根据property的大小在arr中插入item + * @param arr + * @param item + * @param property + * @param descending + * @returns + */ function addItemWithOrder(arr, item, property, descending) { + if (descending === void 0) descending = false; + if (arr.includes(item)) { + return; + } + arr.push(item); + if (arr.length === 1) { + return; + } + //单次插入排序 + var index = arr.length - 1; + if (index) { + var currentItem = arr[index]; + if (descending) { + while(arr[index - 1][property] < currentItem[property]){ + arr[index] = arr[index - 1]; + index--; + if (index === 0) { + break; + } + } + } else { + while(arr[index - 1][property] > currentItem[property]){ + arr[index] = arr[index - 1]; + index--; + if (index === 0) { + break; + } + } + } + arr[index] = currentItem; + } +} +function enlargeBuffer(typeArray, length, maxSize, increase) { + if (increase === void 0) increase = 1; + var buffer = typeArray.buffer; + if (buffer.byteLength < typeArray.BYTES_PER_ELEMENT * length) { + var size = Math.ceil(length * increase); + if (!Number.isNaN(maxSize)) { + size = Math.min(size, maxSize); + } + var nbuffer = new ArrayBuffer(typeArray.BYTES_PER_ELEMENT * size); + var nArr = new typeArray.constructor(nbuffer); + nArr.set(typeArray); + return nArr; + } + return typeArray; +} + +function colorToArr$1(hex, normalized) { + var ret = [ + 0, + 0, + 0, + 0 + ]; + if (isString(hex)) { + hex = hex.replace(/[\s\t\r\n]/g, ""); + var m = /rgba?\(([.\d]+),([.\d]+),([.\d]+),?([.\d]+)?\)/.exec(hex); + if (m) { + var a = +m[4]; + ret = [ + +m[1], + +m[2], + +m[3], + isNaN(a) ? 255 : a * 255 + ]; + } else if (/^#[a-f\d]{3}$/i.test(hex)) { + ret = [ + parseInt(hex[1] + hex[1], 16), + parseInt(hex[2] + hex[2], 16), + parseInt(hex[3] + hex[3], 16), + 255 + ]; + // eslint-disable-next-line no-cond-assign + } else if (m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)) { + ret = [ + parseInt(m[1], 16), + parseInt(m[2], 16), + parseInt(m[3], 16), + 255 + ] || [ + 0, + 0, + 0, + 255 + ]; + } + } else if (_instanceof1(hex, Array)) { + ret = [ + hex[0], + hex[1], + hex[2], + isNaN(hex[3]) ? 255 : hex[3] + ]; + } + if (normalized) { + for(var i = 0; i < 4; i++){ + ret[i] /= 255; + } + } + return ret; +} +function getColorFromGradientStops(stops, key, normalize) { + if (stops.length) { + var color; + for(var j = 1; j <= stops.length - 1; j++){ + var s0 = stops[j - 1]; + var s1 = stops[j]; + if (s0.stop <= key && key <= s1.stop) { + color = interpolateColor(s0.color, s1.color, (key - s0.stop) / (s1.stop - s0.stop)); + break; + } + } + if (!color) { + color = stops[stops.length - 1].color; + } + return normalize ? color.map(function(n) { + return n / 255; + }) : color; + } + return [ + 0, + 0, + 0, + 0 + ]; +} +function colorStopsFromGradient(gradient) { + var stops = []; + if (_instanceof1(gradient, Array)) { + gradient.forEach(function(val) { + var s = val[0], r = val[1], g = val[2], b = val[3], a = val[4]; + stops.push({ + // TODO + // @ts-expect-error + stop: parsePercent$1(s), + color: [ + r, + g, + b, + a + ] + }); + }); + } else { + Object.keys(gradient).forEach(function(stop) { + var colorRGB = gradient[stop]; + var color = colorToArr$1(colorRGB); + stops.push({ + stop: parsePercent$1(stop), + color: color + }); + }); + } + stops = stops.sort(function(a, b) { + return a.stop - b.stop; + }); + if (stops.length) { + if (stops[0].stop !== 0) { + stops.unshift({ + stop: 0, + color: stops[0].color.slice() + }); + } + var lastStop = stops[stops.length - 1]; + if (lastStop.stop !== 1) { + stops.push({ + stop: 1, + color: lastStop.color.slice() + }); + } + } + return stops; +} +function interpolateColor(a, b, s, origin) { + var ret = []; + var ms = 1 - s; + if (origin) { + for(var i = 0; i < 4; i++){ + ret[i] = a[i] * ms + b[i] * s; + } + } else { + for(var i1 = 0; i1 < 3; i1++){ + ret[i1] = Math.round(Math.sqrt(a[i1] * a[i1] * ms + b[i1] * b[i1] * s)); + } + ret[3] = Math.round(a[3] * ms + b[3] * s); + } + return ret; +} +function parsePercent$1(c) { + var match = /^(-)?([\d+.]+)%$/.exec(c); + if (match) { + return +match[2] / 100 * (match[1] ? -1 : 1); + } + return +c; +} + +function getPixelRatio() { + if (typeof screen === "object" && typeof document === "object") { + var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + var screenWidth = screen.width; + var viewportScale = screenWidth / viewportWidth; + return Math.min(2 * viewportScale, 2); + } + return 1; +} +function isIOS() { + // real ios device not in simulator + return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform); +} +function isIOSByUA() { + var str = navigator.userAgent.toLowerCase(); + var ver = str.match(/cpu (iphone )?os (.*?) like mac os/); + return ver ? parseInt(ver[2], 10) : 0; +} +function isAndroid() { + return /\b[Aa]ndroid\b/.test(navigator.userAgent); +} +function isOpenHarmony() { + return /\bOpenHarmony\b/.test(navigator.userAgent); +} +function isSimulatorCellPhone() { + return isAndroid() || isOpenHarmony() || /\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent); +} +function isMiniProgram() { + return isAlipayMiniApp() || isWechatMiniApp(); +} +function isAlipayMiniApp() { + var _my; + return typeof my !== "undefined" && ((_my = my) == null ? void 0 : _my.renderTarget) === "web"; +} +function isWechatMiniApp() { + return window.__wxjs_environment === "miniprogram"; +} + +function imageDataFromColor(value) { + if (isString(value)) { + value = colorToArr$1(value); + } + var color = value; + var image = { + width: 1, + height: 1, + data: new Uint8Array(1 * 1 * 4) + }; + var data = image.data; + for(var i = 0; i < 4; i++){ + data[i] = color[i]; + } + return image; +} +function imageDataFromGradient(gradient) { + var width = 128; + var image = { + width: width, + height: 1, + data: new Uint8Array(width * 1 * 4) + }; + var data = image.data; + var stops = colorStopsFromGradient(gradient); + if (stops.length) { + data.set(stops[0].color, 0); + for(var i = 1, cursor = 0; i < width - 1; i++){ + var index = i / width; + var s0 = void 0; + var s1 = void 0; + for(var j = cursor; j < stops.length; j++){ + s0 = stops[j]; + s1 = stops[j + 1]; + if (s0.stop <= index && s1.stop > index) { + break; + } + } + var color = interpolateColor(s0.color, s1.color, (index - s0.stop) / (s1.stop - s0.stop)); + data.set(color, i * 4); + } + data.set(stops[stops.length - 1].color, (width - 1) * 4); + } + return image; +} + +exports.OrderType = void 0; +(function(OrderType) { + OrderType[OrderType["none"] = 1] = "none"; + OrderType[OrderType["ascending"] = 2] = "ascending"; + OrderType[OrderType["descending"] = 3] = "descending"; +})(exports.OrderType || (exports.OrderType = {})); +/** + * 按照指定排序方式对数组排序 + * @param arr - 要排序的数组 + * @param order - 排序方式 + * @returns + */ function sortByOrder(arr, order) { + if (order === void 0) order = 2; + var length = arr.length; + if (length <= 1 || order === 1) { + return arr; + } + if (length <= 30) { + for(var i = 1; i < length; i++){ + insertionSort(arr, i, order); + } + return arr; + } else { + return fastSort(arr, order); + } +} +/** + * 按照指定排序方式往Sortable数组中添加成员 + * @param arr - 被添加的数组 + * @param item - 要添加的成员 + * @param order - 排序方式 + * @returns + */ function addByOrder(arr, item, order) { + if (order === void 0) order = 2; + if (arr.includes(item)) { + return arr; + } + arr.push(item); + if (arr.length === 1) { + return arr; + } + if (order !== 1) { + insertionSort(arr, arr.length - 1, order); + } + return arr; +} +function insertionSort(array, index, order) { + var currentItem = array[index]; + if (order !== 2) { + while(index >= 1 && array[index - 1].priority < currentItem.priority){ + array[index] = array[index - 1]; + index--; + if (index === 0) { + break; + } + } + } else { + while(index >= 1 && array[index - 1].priority > currentItem.priority){ + array[index] = array[index - 1]; + index--; + if (index === 0) { + break; + } + } + } + array[index] = currentItem; +} +function fastSort(arr, order, start, end) { + if (start === void 0) start = 0; + if (end === void 0) end = arr.length - 1; + // 终止条件 + if (start >= end) { + return arr; + } + var base = arr[start]; + var left = start; + var right = end; + while(left < right){ + if (order === 2) { + // 从右向左,寻找第一个小于base的值 + while(arr[right].priority > base.priority && right >= left){ + right--; + } + // 从左向右,寻找第一个大于base的值 + while(arr[left].priority <= base.priority && left < right){ + left++; + } + } else { + // 从右向左,寻找第一个大于base的值 + while(arr[right].priority < base.priority && right >= left){ + right--; + } + // 从左向右,寻找第一个小于base的值 + while(arr[left].priority >= base.priority && left < right){ + left++; + } + } + var ref; + // 将两个值交换位置 + ref = [ + arr[right], + arr[left] + ], arr[left] = ref[0], arr[right] = ref[1]; + } + var ref1; + // 将最后两个游标相遇的位置的值与base值交换 + ref1 = [ + arr[left], + arr[start] + ], arr[start] = ref1[0], arr[left] = ref1[1]; + fastSort(arr, order, start, left - 1); + fastSort(arr, order, right + 1, end); + return arr; +} + +function assertExist(item, msg) { + if (msg === void 0) msg = "item doesn't exist"; + if (item === undefined || item === null) { + throw new Error(msg); + } +} +function asserts(condition, msg) { + if (msg === void 0) msg = "asserts failed"; + if (!condition) { + throw new Error(msg); + } +} + +/** + * 判断是否为可解析的字体 + * - 首字母不能为数字或 `.` + * - 不能包含特殊字符,`_-` 是被允许的 + * @param fontFamily - 字体名称 + * @returns + */ function isValidFontFamily(fontFamily) { + // iOS 11/12 不支持自定义字体开头为数字的名称,特殊字符也有风险 + return /^[^\d.][\w-]*$/.test(fontFamily); +} + +var prefix = "[Galacean Effects]"; +var localLogger; +function format(message) { + return [ + "%c" + prefix, + "color: #AA0100", + "" + message + ]; +} +function error(message) { + for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ + args[_key - 1] = arguments[_key]; + } + var _console; + (_console = console).error.apply(_console, [].concat(format(message), [ + args + ])); + localLogger == null ? void 0 : localLogger("error", message, args); +} +/** + * info 会转换成浏览器的 console.debug + * @param message + * @param args + */ function info(message) { + for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ + args[_key - 1] = arguments[_key]; + } + var _console; + (_console = console).debug.apply(_console, [].concat(format(message))); + localLogger == null ? void 0 : localLogger("info", message, args); +} +function warn(message) { + for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ + args[_key - 1] = arguments[_key]; + } + var _console; + (_console = console).warn.apply(_console, [].concat(format(message))); + localLogger == null ? void 0 : localLogger("warn", message, args); +} +/** + * 注册自定义埋点函数 + * + * @param fn + */ function register(fn) { + if (fn && isFunction(fn)) { + localLogger = fn; + } +} +var logger = { + error: error, + info: info, + warn: warn, + register: register +}; + +exports.DestroyOptions = void 0; +(function(DestroyOptions) { + DestroyOptions[DestroyOptions["destroy"] = 0] = "destroy"; + DestroyOptions[DestroyOptions["keep"] = 1] = "keep"; + DestroyOptions[DestroyOptions["force"] = 0] = "force"; +})(exports.DestroyOptions || (exports.DestroyOptions = {})); +function noop() {} +/** + * 判断对象是否是`String`类型 + * + * @static + * @function isString + * @param obj - 要判断的对象 + * @return + */ function isString(obj) { + return typeof obj === "string"; +} +/** + * 判断对象是否是`Array`类型 + * + * @static + * @function isArray + * @param obj - 要判断的对象 + * @return + */ var isArray = Array.isArray || function(obj) { + return Object.prototype.toString.call(obj) === "[object Array]"; +}; +/** + * 判断对象是否是函数类型 + * + * @static + * @function isFunction + * @param obj - 要判断的对象 + * @return + */ function isFunction(obj) { + return Object.prototype.toString.call(obj) === "[object Function]"; +} +/** + * 判断对象是否是`Object`类型 + * + * @static + * @function isObject + * @param obj - 要判断的对象 + * @return + */ function isObject(obj) { + return Object.prototype.toString.call(obj) === "[object Object]"; +} +function isCanvas(canvas) { + var _canvas_tagName; + // 小程序 Canvas 无法使用 instanceof HTMLCanvasElement 判断 + return typeof canvas === "object" && canvas !== null && ((_canvas_tagName = canvas.tagName) == null ? void 0 : _canvas_tagName.toUpperCase()) === "CANVAS"; +} +/** + * 生成一个位于 min 和 max 之间的随机数 + * @param min + * @param max + * @returns + */ function randomInRange(min, max) { + return min + Math.random() * (max - min); +} +function throwDestroyedError() { + throw new Error("Destroyed item cannot be used again."); +} +function generateGUID() { + return v4().replace(/-/g, ""); +} +function base64ToFile(base64, filename, contentType) { + if (filename === void 0) filename = "base64File"; + if (contentType === void 0) contentType = ""; + // 去掉 Base64 字符串的 Data URL 部分(如果存在) + var base64WithoutPrefix = base64.split(",")[1] || base64; + // 将 base64 编码的字符串转换为二进制字符串 + var byteCharacters = atob(base64WithoutPrefix); + // 创建一个 8 位无符号整数值的数组,即“字节数组” + var byteArrays = []; + // 切割二进制字符串为多个片段,并将每个片段转换成一个字节数组 + for(var offset = 0; offset < byteCharacters.length; offset += 512){ + var slice = byteCharacters.slice(offset, offset + 512); + var byteNumbers = new Array(slice.length); + for(var i = 0; i < slice.length; i++){ + byteNumbers[i] = slice.charCodeAt(i); + } + var byteArray = new Uint8Array(byteNumbers); + byteArrays.push(byteArray); + } + // 使用字节数组创建 Blob 对象 + var blob = new Blob(byteArrays, { + type: contentType + }); + // 创建 File 对象 + var file = new File([ + blob + ], filename, { + type: contentType + }); + return file; +} +function applyMixins(derivedCtrl, baseCtrls) { + baseCtrls.forEach(function(baseCtrl) { + Object.getOwnPropertyNames(baseCtrl.prototype).forEach(function(name) { + var propertyDescriptor = Object.getOwnPropertyDescriptor(baseCtrl.prototype, name); + if (!propertyDescriptor) { + throw new Error("Cannot find property descriptor of class " + baseCtrl); + } + Object.defineProperty(derivedCtrl.prototype, name, propertyDescriptor); + }); + }); +} + +var pluginLoaderMap = {}; +var defaultPlugins = []; +var pluginCtrlMap = {}; +/** + * 注册 plugin + * @param name + * @param pluginClass class of plugin + * @param itemClass class of item + * @param isDefault load + */ function registerPlugin(name, pluginClass, itemClass) { + if (pluginCtrlMap[name]) { + logger.error("Duplicate registration for plugin " + name + "."); + } + pluginCtrlMap[name] = itemClass; + pluginLoaderMap[name] = pluginClass; + addItem(defaultPlugins, name); +} +function unregisterPlugin(name) { + delete pluginCtrlMap[name]; + delete pluginLoaderMap[name]; + removeItem(defaultPlugins, name); +} +var PluginSystem = /*#__PURE__*/ function() { + function PluginSystem(pluginNames) { + var loaders = {}; + var loaded = []; + var addLoader = function(name) { + var loader = pluginLoaderMap[name]; + if (!loaded.includes(loader)) { + loaded.push(loader); + loaders[name] = loader; + } + }; + defaultPlugins.forEach(addLoader); + for(var _iterator = _create_for_of_iterator_helper_loose(pluginNames), _step; !(_step = _iterator()).done;){ + var customPluginName = _step.value; + if (!pluginLoaderMap[customPluginName]) { + throw new Error("The plugin '" + customPluginName + "' not found." + getPluginUsageInfo(customPluginName)); + } + } + this.plugins = Object.keys(loaders).map(function(name) { + var pluginConstructor = pluginLoaderMap[name]; + var loader = new pluginConstructor(); + loader.name = name; + return loader; + }).sort(function(a, b) { + return a.order - b.order; + }); + } + var _proto = PluginSystem.prototype; + _proto.initializeComposition = function initializeComposition(composition, scene) { + this.plugins.forEach(function(loader) { + return loader.onCompositionConstructed(composition, scene); + }); + }; + _proto.destroyComposition = function destroyComposition(comp) { + this.plugins.forEach(function(loader) { + return loader.onCompositionDestroyed(comp); + }); + }; + _proto.resetComposition = function resetComposition(comp, renderFrame) { + this.plugins.forEach(function(loader) { + return loader.onCompositionReset(comp, renderFrame); + }); + }; + _proto.processRawJSON = function processRawJSON(json, options) { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + _this.callStatic("processRawJSON", json, options) + ]; + }); + })(); + }; + _proto.processAssets = function processAssets(json, options) { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + _this.callStatic("processAssets", json, options) + ]; + }); + })(); + }; + _proto.precompile = function precompile(compositions, renderer) { + for(var _iterator = _create_for_of_iterator_helper_loose(this.plugins), _step; !(_step = _iterator()).done;){ + var plugin = _step.value; + plugin.precompile(compositions, renderer); + } + }; + _proto.loadResources = function loadResources(scene, options) { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + _this.callStatic("prepareResource", scene, options) + ]; + }); + })(); + }; + _proto.callStatic = function callStatic(name) { + for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ + args[_key - 1] = arguments[_key]; + } + var _this = this; + return _async_to_generator(function() { + var pendings, plugins, i, plugin, ctrl, _ctrl_name, _ctrl_name1; + return __generator(this, function(_state) { + pendings = []; + plugins = _this.plugins; + for(i = 0; i < plugins.length; i++){ + plugin = plugins[i]; + ctrl = pluginLoaderMap[plugin.name]; + if (name in ctrl) { + pendings.push(Promise.resolve((_ctrl_name1 = ctrl[name]) == null ? void 0 : (_ctrl_name = _ctrl_name1).call.apply(_ctrl_name, [].concat([ + ctrl + ], args)))); + } + } + return [ + 2, + Promise.all(pendings) + ]; + }); + })(); + }; + return PluginSystem; +}(); +var pluginInfoMap = { + "alipay-downgrade": "@galacean/effects-plugin-alipay-downgrade", + "downgrade": "@galacean/effects-plugin-downgrade", + "editor-gizmo": "@galacean/effects-plugin-editor-gizmo", + "model": "@galacean/effects-plugin-model", + "video": "@galacean/effects-plugin-multimedia", + "audio": "@galacean/effects-plugin-multimedia", + "orientation-transformer": "@galacean/effects-plugin-orientation-transformer", + "rich-text": "@galacean/effects-plugin-rich-text", + "spine": "@galacean/effects-plugin-spine" +}; +function getPluginUsageInfo(name) { + var info = pluginInfoMap[name]; + if (info) { + return "\n请按如下命令进行操作(Please follow the commands below to proceed):\n1、使用 npm 安装插件(Install Plugin):npm i " + info + "@latest --save\n2、导入插件(Import Plugin):import '" + info + "'"; + } else { + return ""; + } +} + +/** + * 抽象插件类 + * 注册合成不同生命周期的回调函数 + */ var AbstractPlugin = /*#__PURE__*/ function() { + function AbstractPlugin() { + this.order = 100; + this.name = ""; + } + var _proto = AbstractPlugin.prototype; + /** + * 在加载到 JSON 后,就可以进行提前编译 + * @param json + * @param player + */ _proto.precompile = function precompile(compositions, renderer) {}; + _proto.onCompositionConstructed = function onCompositionConstructed(composition, scene) {}; + _proto.onCompositionItemLifeBegin = function onCompositionItemLifeBegin(composition, item) {}; + _proto.onCompositionItemLifeEnd = function onCompositionItemLifeEnd(composition, item) {}; + _proto.onCompositionItemRemoved = function onCompositionItemRemoved(composition, item) {}; + _proto.onCompositionReset = function onCompositionReset(composition, frame) {}; + _proto.onCompositionWillReset = function onCompositionWillReset(composition, frame) {}; + _proto.onCompositionDestroyed = function onCompositionDestroyed(composition) {}; + _proto.onCompositionUpdate = function onCompositionUpdate(composition, dt) {}; + _proto.prepareRenderFrame = function prepareRenderFrame(composition, frame) { + return false; + }; + _proto.postProcessFrame = function postProcessFrame(composition, frame) {}; + return AbstractPlugin; +}(); + +function _set_prototype_of(o, p) { + _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _set_prototype_of(o, p); +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _set_prototype_of(subClass, superClass); +} + +/** + * JSON 版本 + */ var JSONSceneVersion; +(function(JSONSceneVersion) { + JSONSceneVersion["1_0"] = "1.0"; + JSONSceneVersion["1_1"] = "1.1"; + JSONSceneVersion["1_2"] = "1.2"; + JSONSceneVersion["1_3"] = "1.3"; + JSONSceneVersion["1_5"] = "1.5"; + JSONSceneVersion["1_8"] = "1.8"; + JSONSceneVersion["2_0"] = "2.0"; + JSONSceneVersion["2_1"] = "2.1"; + JSONSceneVersion["2_2"] = "2.2"; + JSONSceneVersion["2_3"] = "2.3"; + JSONSceneVersion["2_4"] = "2.4"; + JSONSceneVersion["3_0"] = "3.0"; + JSONSceneVersion["3_1"] = "3.1"; + JSONSceneVersion["3_2"] = "3.2"; + JSONSceneVersion["3_3"] = "3.3"; + JSONSceneVersion["LATEST"] = "3.3"; +})(JSONSceneVersion || (JSONSceneVersion = {})); + +/*********************************************/ /* 元素属性参数类型 */ /*********************************************/ /** + * 渲染等级 + */ var RenderLevel; +(function(RenderLevel) { + RenderLevel["S"] = "S"; + RenderLevel["APlus"] = "A+"; + RenderLevel["A"] = "A"; + RenderLevel["BPlus"] = "B+"; + RenderLevel["B"] = "B"; +})(RenderLevel || (RenderLevel = {})); +/** + * 混合模式 + */ var BlendingMode; +(function(BlendingMode) { + /** + * 普通混合模式 + */ BlendingMode[BlendingMode["ALPHA"] = 0] = "ALPHA"; + /** + * 叠加混合模式 + */ BlendingMode[BlendingMode["ADD"] = 1] = "ADD"; + /** + * 相乘混合模式 + */ BlendingMode[BlendingMode["MULTIPLY"] = 2] = "MULTIPLY"; + /** + * 亮度混合模式 + */ BlendingMode[BlendingMode["BRIGHTNESS"] = 3] = "BRIGHTNESS"; + /** + * 减色混合模式 + */ BlendingMode[BlendingMode["SUBTRACTION"] = 4] = "SUBTRACTION"; + /** + * 强光混合模式 + */ BlendingMode[BlendingMode["STRONG_LIGHT"] = 5] = "STRONG_LIGHT"; + /** + * 弱光混合模式 + */ BlendingMode[BlendingMode["WEAK_LIGHT"] = 6] = "WEAK_LIGHT"; + /** + * 亮度叠加混合模式 + */ BlendingMode[BlendingMode["SUPERPOSITION"] = 7] = "SUPERPOSITION"; +})(BlendingMode || (BlendingMode = {})); +/** + * 单双面模式 + */ var SideMode; +(function(SideMode) { + /** + * 双面模式 + */ SideMode[SideMode["DOUBLE"] = 1032] = "DOUBLE"; + /** + * 正面模式 + */ SideMode[SideMode["FRONT"] = 1028] = "FRONT"; + /** + * 背面模式 + */ SideMode[SideMode["BACK"] = 1029] = "BACK"; +})(SideMode || (SideMode = {})); +/** + * 元素是否被蒙版遮挡/反向遮挡 + */ var ObscuredMode; +(function(ObscuredMode) { + /** + * 无 + */ // NONE = 0, + // /** + // * 蒙版 + // */ + // MASK = 1, + /** + * 被遮挡 + */ ObscuredMode[ObscuredMode["OBSCURED"] = 2] = "OBSCURED"; + /** + * 被反向遮挡 + */ ObscuredMode[ObscuredMode["REVERSE_OBSCURED"] = 3] = "REVERSE_OBSCURED"; +})(ObscuredMode || (ObscuredMode = {})); +/** + * 发射器形状 + */ var ParticleEmitterShapeType; +(function(ParticleEmitterShapeType) { + /** + * 没有类型 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["NONE"] = 0] = "NONE"; + /** + * 圆球 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["SPHERE"] = 1] = "SPHERE"; + /** + * 圆锥 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["CONE"] = 2] = "CONE"; + /** + * 半球 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["HEMISPHERE"] = 3] = "HEMISPHERE"; + /** + * 圆 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["CIRCLE"] = 4] = "CIRCLE"; + /** + * 圆环 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["DONUT"] = 5] = "DONUT"; + /** + * 矩形 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["RECTANGLE"] = 6] = "RECTANGLE"; + /** + * 矩形框 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["RECTANGLE_EDGE"] = 7] = "RECTANGLE_EDGE"; + /** + * 直线 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["EDGE"] = 8] = "EDGE"; + /** + * 贴图 + */ ParticleEmitterShapeType[ParticleEmitterShapeType["TEXTURE"] = 9] = "TEXTURE"; +})(ParticleEmitterShapeType || (ParticleEmitterShapeType = {})); +/** + * 插件类型 + */ var PluginType; +(function(PluginType) { + /** + * 陀螺仪 + */ PluginType[PluginType["GYROSCOPE"] = 0] = "GYROSCOPE"; + /** + * Spine + */ PluginType[PluginType["SPINE"] = 1] = "SPINE"; +})(PluginType || (PluginType = {})); +/** + * 交互类型 + */ var InteractType; +(function(InteractType) { + /** + * 点击 + */ InteractType[InteractType["CLICK"] = 0] = "CLICK"; + /** + * 消息 + * 前端收到 onMessageItem 回调 + */ InteractType[InteractType["MESSAGE"] = 1] = "MESSAGE"; + /** + * 拖拽 + */ InteractType[InteractType["DRAG"] = 2] = "DRAG"; +})(InteractType || (InteractType = {})); +/** + * 交互行为 + */ var InteractBehavior; +(function(InteractBehavior) { + /** + * 无 + */ InteractBehavior[InteractBehavior["NONE"] = 0] = "NONE"; + /** + * 通知 + */ InteractBehavior[InteractBehavior["NOTIFY"] = 1] = "NOTIFY"; + /** + * 重置播放器 + */ InteractBehavior[InteractBehavior["RESUME_PLAYER"] = 2] = "RESUME_PLAYER"; + /** + * 清除元素 + */ InteractBehavior[InteractBehavior["REMOVE"] = 3] = "REMOVE"; + /** + * 暂停播放器 + */ InteractBehavior[InteractBehavior["PAUSE"] = 4] = "PAUSE"; +})(InteractBehavior || (InteractBehavior = {})); +/** + * 元素类型 + */ var ItemType; +(function(ItemType) { + /** + * 错误元素 + */ ItemType["base"] = "0"; + /** + * 图层元素 + */ ItemType["sprite"] = "1"; + /** + * 粒子元素 + */ ItemType["particle"] = "2"; + /** + * 空节点元素 + */ ItemType["null"] = "3"; + /** + * 交互元素 + */ ItemType["interact"] = "4"; + /** + * 插件元素 + */ ItemType["plugin"] = "5"; + /** + * 相机元素 + */ ItemType["camera"] = "6"; + /** + * 预合成元素 + */ ItemType["composition"] = "7"; + /** + * Spine 元素 + */ ItemType["spine"] = "spine"; + /** + * Mesh 元素 + */ ItemType["mesh"] = "mesh"; + /** + * 节点树元素 + */ ItemType["tree"] = "tree"; + /** + * 文本元素 + */ ItemType["text"] = "text"; + /** + * 灯光元素 + */ ItemType["light"] = "light"; + /** + * 天空盒元素 + */ ItemType["skybox"] = "skybox"; + /** + * 特效元素 + */ ItemType["effect"] = "effect"; + /** + * 形状元素 + */ ItemType["shape"] = "shape"; + /** + * 后处理元素 + */ ItemType["postProcessVolume"] = "postProcessVolume"; + /** + * 节点元素 + */ ItemType["node"] = "node"; + /** + * 视频元素 + */ ItemType["video"] = "video"; + /** + * 音频元素 + */ ItemType["audio"] = "audio"; + /** + * 富文本元素 + */ ItemType["richtext"] = "richtext"; +})(ItemType || (ItemType = {})); +/** + * 渲染模式 + */ var RenderMode; +(function(RenderMode) { + /** + * 广告牌模式 + */ RenderMode[RenderMode["BILLBOARD"] = 0] = "BILLBOARD"; + /** + * 网格模式 + */ RenderMode[RenderMode["MESH"] = 1] = "MESH"; + /** + * 垂直广告牌模式 + */ RenderMode[RenderMode["VERTICAL_BILLBOARD"] = 2] = "VERTICAL_BILLBOARD"; + /** + * 水平广告牌模式 + */ RenderMode[RenderMode["HORIZONTAL_BILLBOARD"] = 3] = "HORIZONTAL_BILLBOARD"; +})(RenderMode || (RenderMode = {})); +/** + * 变换中心 + */ var ParticleOrigin; +(function(ParticleOrigin) { + /** + * 水平和垂直中点 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_CENTER"] = 0] = "PARTICLE_ORIGIN_CENTER"; + /** + * 水平左侧 垂直顶部 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_LEFT_TOP"] = 1] = "PARTICLE_ORIGIN_LEFT_TOP"; + /** + * 水平左侧 垂直中间 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_LEFT_CENTER"] = 2] = "PARTICLE_ORIGIN_LEFT_CENTER"; + /** + * 水平左侧 垂直底部 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_LEFT_BOTTOM"] = 3] = "PARTICLE_ORIGIN_LEFT_BOTTOM"; + /** + * 水平中间 垂直顶部 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_CENTER_TOP"] = 4] = "PARTICLE_ORIGIN_CENTER_TOP"; + /** + * 水平中间 垂直底部 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_CENTER_BOTTOM"] = 5] = "PARTICLE_ORIGIN_CENTER_BOTTOM"; + /** + * 水平右侧 垂直顶部 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_RIGHT_TOP"] = 6] = "PARTICLE_ORIGIN_RIGHT_TOP"; + /** + * 水平右侧 垂直中间 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_RIGHT_CENTER"] = 7] = "PARTICLE_ORIGIN_RIGHT_CENTER"; + /** + * 水平右侧 垂直底部 + */ ParticleOrigin[ParticleOrigin["PARTICLE_ORIGIN_RIGHT_BOTTOM"] = 8] = "PARTICLE_ORIGIN_RIGHT_BOTTOM"; +})(ParticleOrigin || (ParticleOrigin = {})); +var RenderType; +(function(RenderType) { + RenderType["Opaque"] = "Opaque"; + RenderType["Transparent"] = "Transparent"; +})(RenderType || (RenderType = {})); +var RenderFace; +(function(RenderFace) { + RenderFace["Both"] = "Both"; + RenderFace["Back"] = "Back"; + RenderFace["Front"] = "Front"; +})(RenderFace || (RenderFace = {})); + +/** + * 销毁 + */ var END_BEHAVIOR_DESTROY = 0; +/** + * 暂停 + * @deprecated since 2.0 - use `END_BEHAVIOR_FREEZE` instead + */ var END_BEHAVIOR_PAUSE = 1; +/** + * 无限播放 + */ var END_BEHAVIOR_FORWARD = 2; +/** + * 销毁并保留最后一帧 + * @deprecated since 2.0 + */ var END_BEHAVIOR_PAUSE_AND_DESTROY = 3; +/** + * 冻结 + */ var END_BEHAVIOR_FREEZE = 4; +/** + * 重播 + */ var END_BEHAVIOR_RESTART = 5; +/** + * + */ var END_BEHAVIOR_DESTROY_CHILDREN = 6; +var CAMERA_CLIP_MODE_VERTICAL = 1; +var CAMERA_CLIP_MODE_NORMAL = 0; +/** + * 消息开始 + */ var MESSAGE_ITEM_PHRASE_BEGIN = 2; +/** + * 消息结束 + */ var MESSAGE_ITEM_PHRASE_END = 1; + +var CameraClipMode; +(function(CameraClipMode) { + /** + * 剪裁上下 + */ CameraClipMode[CameraClipMode["portrait"] = 1] = "portrait"; + /** + * 剪裁左右 + */ CameraClipMode[CameraClipMode["landscape"] = 0] = "landscape"; +})(CameraClipMode || (CameraClipMode = {})); + +/*********************************************/ /* 基本数值属性参数 */ /*********************************************/ var ValueType; +(function(ValueType) { + /** + * 常数 + */ ValueType[ValueType["CONSTANT"] = 0] = "CONSTANT"; + /** + * 二维常数向量 + */ ValueType[ValueType["CONSTANT_VEC2"] = 1] = "CONSTANT_VEC2"; + /** + * 三维常数向量 + */ ValueType[ValueType["CONSTANT_VEC3"] = 2] = "CONSTANT_VEC3"; + /** + * 四维常数向量 + */ ValueType[ValueType["CONSTANT_VEC4"] = 3] = "CONSTANT_VEC4"; + /** + * 随机数 + */ ValueType[ValueType["RANDOM"] = 4] = "RANDOM"; + /** + * 直线 + */ ValueType[ValueType["LINE"] = 5] = "LINE"; + /** + * 曲线 + */ ValueType[ValueType["CURVE"] = 6] = "CURVE"; + /** + * 贝塞尔路径 + */ ValueType[ValueType["BEZIER_PATH"] = 7] = "BEZIER_PATH"; + /** + * 颜色 + */ ValueType[ValueType["RGBA_COLOR"] = 8] = "RGBA_COLOR"; + /** + * 渐变色 + */ ValueType[ValueType["GRADIENT_COLOR"] = 9] = "GRADIENT_COLOR"; + /** + * 蒙版形状点集 + */ ValueType[ValueType["SHAPE_POINTS"] = 10] = "SHAPE_POINTS"; + /** + * 蒙版形状切分 + */ ValueType[ValueType["SHAPE_SPLITS"] = 11] = "SHAPE_SPLITS"; + /** + * 直线路径 + */ ValueType[ValueType["LINEAR_PATH"] = 12] = "LINEAR_PATH"; + /** + * 多色 + */ ValueType[ValueType["COLORS"] = 13] = "COLORS"; + /** + * 二进制指针 + */ ValueType[ValueType["BINARY"] = 20] = "BINARY"; + /** + * 贝塞尔曲线 + */ ValueType[ValueType["BEZIER_CURVE"] = 21] = "BEZIER_CURVE"; + /** + * 贝塞尔曲线路径 + */ ValueType[ValueType["BEZIER_CURVE_PATH"] = 22] = "BEZIER_CURVE_PATH"; + /** + * 贝塞尔曲线四元数 + */ ValueType[ValueType["BEZIER_CURVE_QUAT"] = 23] = "BEZIER_CURVE_QUAT"; + /** + * 颜色曲线 + */ ValueType[ValueType["COLOR_CURVE"] = 24] = "COLOR_CURVE"; + /** + * Vector4 曲线 + */ ValueType[ValueType["VECTOR4_CURVE"] = 25] = "VECTOR4_CURVE"; + /** + * Vector2 曲线 + */ ValueType[ValueType["VECTOR2_CURVE"] = 26] = "VECTOR2_CURVE"; +})(ValueType || (ValueType = {})); +/** + * 关键帧类型 + */ var BezierKeyframeType; +(function(BezierKeyframeType) { + BezierKeyframeType[BezierKeyframeType["AUTO"] = 0] = "AUTO"; + BezierKeyframeType[BezierKeyframeType["EASE"] = 1] = "EASE"; + BezierKeyframeType[BezierKeyframeType["EASE_IN"] = 2] = "EASE_IN"; + BezierKeyframeType[BezierKeyframeType["EASE_OUT"] = 3] = "EASE_OUT"; + BezierKeyframeType[BezierKeyframeType["LINE"] = 4] = "LINE"; + BezierKeyframeType[BezierKeyframeType["HOLD"] = 5] = "HOLD"; + BezierKeyframeType[BezierKeyframeType["LINE_OUT"] = 6] = "LINE_OUT"; +})(BezierKeyframeType || (BezierKeyframeType = {})); + +/** + * 结束行为 + */ var EndBehavior; +(function(EndBehavior) { + /** + * 销毁 + */ EndBehavior[EndBehavior["destroy"] = 0] = "destroy"; + /** + * 重播 + */ EndBehavior[EndBehavior["restart"] = 5] = "restart"; + /** + * 无限播放 + */ EndBehavior[EndBehavior["forward"] = 2] = "forward"; + /** + * 冻结 + */ EndBehavior[EndBehavior["freeze"] = 4] = "freeze"; +})(EndBehavior || (EndBehavior = {})); + +/** + * 粒子交互行为 + */ var ParticleInteractionBehavior; +(function(ParticleInteractionBehavior) { + /** + * 无 + */ ParticleInteractionBehavior[ParticleInteractionBehavior["none"] = 0] = "none"; + /** + * 移出粒子 + */ ParticleInteractionBehavior[ParticleInteractionBehavior["removeParticle"] = 1] = "removeParticle"; +})(ParticleInteractionBehavior || (ParticleInteractionBehavior = {})); + +var ShapeArcMode; +(function(ShapeArcMode) { + /** + * 随机 + */ ShapeArcMode[ShapeArcMode["RANDOM"] = 0] = "RANDOM"; + /** + * 单向循环 + */ ShapeArcMode[ShapeArcMode["UNIDIRECTIONAL_CYCLE"] = 1] = "UNIDIRECTIONAL_CYCLE"; + /** + * 双向循环 + */ ShapeArcMode[ShapeArcMode["BIDIRECTIONAL_CYCLE"] = 2] = "BIDIRECTIONAL_CYCLE"; + /** + * 均匀爆发 + */ ShapeArcMode[ShapeArcMode["UNIFORM_BURST"] = 3] = "UNIFORM_BURST"; +})(ShapeArcMode || (ShapeArcMode = {})); + +var LightType; +(function(LightType) { + /** + * 点光源 + */ LightType["point"] = "point"; + /** + * 聚光灯 + */ LightType["spot"] = "spot"; + /** + * 方向光 + */ LightType["directional"] = "directional"; + /** + * 环境光 + */ LightType["ambient"] = "ambient"; +})(LightType || (LightType = {})); + +var ModelBoundingType; +(function(ModelBoundingType) { + ModelBoundingType[ModelBoundingType["box"] = 2] = "box"; + ModelBoundingType[ModelBoundingType["sphere"] = 3] = "sphere"; +})(ModelBoundingType || (ModelBoundingType = {})); + +var CameraType; +(function(CameraType) { + CameraType["orthographic"] = "orthographic"; + CameraType["perspective"] = "perspective"; +})(CameraType || (CameraType = {})); + +// 材质类型 +var MaterialType; +(function(MaterialType) { + MaterialType["unlit"] = "unlit"; + MaterialType["pbr"] = "pbr"; + // 头发材质,在 pbr 材质基础上扩展 + MaterialType["hair"] = "hair"; +})(MaterialType || (MaterialType = {})); +// 混合模式 +var MaterialBlending; +(function(MaterialBlending) { + MaterialBlending[MaterialBlending["opaque"] = 100] = "opaque"; + MaterialBlending[MaterialBlending["masked"] = 101] = "masked"; + MaterialBlending[MaterialBlending["translucent"] = 102] = "translucent"; + MaterialBlending[MaterialBlending["additive"] = 103] = "additive"; +})(MaterialBlending || (MaterialBlending = {})); + +/** + * 3D渲染模式:将渲染过程中的中间结果输出,主要用于排查渲染效果问题,支持 pbr 和 unlit 材质 + */ var RenderMode3D; +(function(RenderMode3D) { + /** + * 正常渲染 + */ RenderMode3D["none"] = "none"; + /** + * 纹理坐标 + */ RenderMode3D["uv"] = "uv"; + /** + * 世界坐标法线 + */ RenderMode3D["normal"] = "normal"; + /** + * 基础颜色 + */ RenderMode3D["basecolor"] = "basecolor"; + /** + * 基础颜色 Alpha + */ RenderMode3D["alpha"] = "alpha"; + /** + * 金属度 + */ RenderMode3D["metallic"] = "metallic"; + /** + * 粗超度 + */ RenderMode3D["roughness"] = "roughness"; + /** + * 环境遮蔽 + */ RenderMode3D["ao"] = "ao"; + /** + * 自发光 + */ RenderMode3D["emissive"] = "emissive"; + /** + * 漫反射 + */ RenderMode3D["diffuse"] = "diffuse"; +})(RenderMode3D || (RenderMode3D = {})); + +var TextOverflow; +(function(TextOverflow) { + /** + * display 模式下,会显示所有文本,文本大小会根据边界框调整。 + */ TextOverflow[TextOverflow["display"] = 0] = "display"; + /** + * clip 模式下,当文本内容超出边界框时,多余的会被截断。 + */ TextOverflow[TextOverflow["clip"] = 1] = "clip"; + /** + * ellipsis 模式下,会使用(...)来代替超出边界框的内容。 + */ TextOverflow[TextOverflow["ellipsis"] = 2] = "ellipsis"; +})(TextOverflow || (TextOverflow = {})); +var TextBaseline; +(function(TextBaseline) { + /** + * 文本顶对齐。 + */ TextBaseline[TextBaseline["top"] = 0] = "top"; + /** + * 文本垂直居中对齐。 + */ TextBaseline[TextBaseline["middle"] = 1] = "middle"; + /** + * 文本底对齐。 + */ TextBaseline[TextBaseline["bottom"] = 2] = "bottom"; +})(TextBaseline || (TextBaseline = {})); +var TextAlignment; +(function(TextAlignment) { + /** + * text alignment starts from(x,y) to right direction + * 从 (x,y) 开始第一个字符,向右边延伸 + */ TextAlignment[TextAlignment["left"] = 0] = "left"; + /** + * (x,y) is middle position of text, where (left + right)/2 =(x,y) + * (x,y) 为文字中间位置,(最左位置 + 最右位置)/2 = (x,y) + */ TextAlignment[TextAlignment["middle"] = 1] = "middle"; + /** + * text alignment ends with(x,y) from left direction + * 从 (x,y) 结束最后一个字符,向左边延伸 + */ TextAlignment[TextAlignment["right"] = 2] = "right"; +})(TextAlignment || (TextAlignment = {})); +/** + * 文本字重 + */ var TextWeight; +(function(TextWeight) { + /** + * 正常 + */ TextWeight["normal"] = "normal"; + /** + * 粗体 + */ TextWeight["bold"] = "bold"; + /** + * 瘦体 + */ TextWeight["lighter"] = "lighter"; +})(TextWeight || (TextWeight = {})); +/** + * 文本样式 + */ var FontStyle; +(function(FontStyle) { + /** + * 正常 + */ FontStyle["normal"] = "normal"; + /** + * 斜体 + */ FontStyle["italic"] = "italic"; + /** + * 倾斜体 + */ FontStyle["oblique"] = "oblique"; +})(FontStyle || (FontStyle = {})); + +var BuiltinObjectGUID = { + WhiteTexture: "whitetexture00000000000000000000", + TransparentTexture: "transparenttexture00000000000000000000", + PBRShader: "pbr00000000000000000000000000000", + UnlitShader: "unlit000000000000000000000000000" +}; + +/** + * 矢量图形类型 + */ var ShapePrimitiveType; +(function(ShapePrimitiveType) { + /** + * 自定义图形 + */ ShapePrimitiveType[ShapePrimitiveType["Custom"] = 0] = "Custom"; + /** + * 矩形 + */ ShapePrimitiveType[ShapePrimitiveType["Rectangle"] = 1] = "Rectangle"; + /** + * 椭圆 + */ ShapePrimitiveType[ShapePrimitiveType["Ellipse"] = 2] = "Ellipse"; + /** + * 多边形 + */ ShapePrimitiveType[ShapePrimitiveType["Polygon"] = 3] = "Polygon"; + /** + * 星形 + */ ShapePrimitiveType[ShapePrimitiveType["Star"] = 4] = "Star"; +})(ShapePrimitiveType || (ShapePrimitiveType = {})); + +var LineCap; +(function(LineCap) { + /** 默认值。向线条的每个末端添加平直的边缘 */ LineCap[LineCap["Butt"] = 0] = "Butt"; + /** 向线条的每个末端添加圆形线帽 */ LineCap[LineCap["Round"] = 1] = "Round"; + /** 向线条的每个末端添加正方形线帽 */ LineCap[LineCap["Square"] = 2] = "Square"; +})(LineCap || (LineCap = {})); +var LineJoin; +(function(LineJoin) { + /** 创建圆角 */ LineJoin[LineJoin["Round"] = 0] = "Round"; + /** 创建斜角 */ LineJoin[LineJoin["Bevel"] = 1] = "Bevel"; + /** 创建尖角 */ LineJoin[LineJoin["Miter"] = 2] = "Miter"; +})(LineJoin || (LineJoin = {})); + +/** + * 动态换图类型 + * @since 1.1.0 + */ var BackgroundType; +(function(BackgroundType) { + BackgroundType["video"] = "video"; + BackgroundType["image"] = "image"; +})(BackgroundType || (BackgroundType = {})); +/** + * 多媒体资源类型 + * @since 2.1.0 + */ var MultimediaType; +(function(MultimediaType) { + MultimediaType["video"] = "video"; + MultimediaType["audio"] = "audio"; +})(MultimediaType || (MultimediaType = {})); + +var DataType; +(function(DataType) { + DataType["VFXItemData"] = "VFXItemData"; + // Assets + DataType["Material"] = "Material"; + DataType["Shader"] = "Shader"; + DataType["Geometry"] = "Geometry"; + DataType["Texture"] = "Texture"; + DataType["Image"] = "Image"; + DataType["AnimationClip"] = "AnimationClip"; + DataType["BinaryAsset"] = "BinaryAsset"; + // Timeline + DataType["TrackAsset"] = "TrackAsset"; + DataType["TimelineAsset"] = "TimelineAsset"; + DataType["ObjectBindingTrack"] = "ObjectBindingTrack"; + DataType["TransformTrack"] = "TransformTrack"; + DataType["SpriteColorTrack"] = "SpriteColorTrack"; + DataType["ActivationTrack"] = "ActivationTrack"; + DataType["SubCompositionTrack"] = "SubCompositionTrack"; + DataType["FloatPropertyTrack"] = "FloatPropertyTrack"; + DataType["ColorPropertyTrack"] = "ColorPropertyTrack"; + DataType["Vector2PropertyTrack"] = "Vector2PropertyTrack"; + DataType["Vector4PropertyTrack"] = "Vector4PropertyTrack"; + DataType["TransformPlayableAsset"] = "TransformPlayableAsset"; + DataType["SpriteColorPlayableAsset"] = "SpriteColorPlayableAsset"; + DataType["ActivationPlayableAsset"] = "ActivationPlayableAsset"; + DataType["SubCompositionPlayableAsset"] = "SubCompositionPlayableAsset"; + DataType["FloatPropertyPlayableAsset"] = "FloatPropertyPlayableAsset"; + DataType["ColorPropertyPlayableAsset"] = "ColorPropertyPlayableAsset"; + DataType["Vector2PropertyPlayableAsset"] = "Vector2PropertyPlayableAsset"; + DataType["Vector4PropertyPlayableAsset"] = "Vector4PropertyPlayableAsset"; + // Components + DataType["MeshComponent"] = "MeshComponent"; + DataType["SkyboxComponent"] = "SkyboxComponent"; + DataType["LightComponent"] = "LightComponent"; + DataType["CameraComponent"] = "CameraComponent"; + DataType["ModelPluginComponent"] = "ModelPluginComponent"; + DataType["TreeComponent"] = "TreeComponent"; + DataType["AnimationComponent"] = "AnimationComponent"; + DataType["SpineComponent"] = "SpineComponent"; + DataType["VideoComponent"] = "VideoComponent"; + DataType["AudioComponent"] = "AudioComponent"; + DataType["RichTextComponent"] = "RichTextComponent"; + DataType["OrientationComponent"] = "OrientationComponent"; + DataType["ShapeComponent"] = "ShapeComponent"; + DataType["SpriteComponent"] = "SpriteComponent"; + DataType["ParticleSystem"] = "ParticleSystem"; + DataType["InteractComponent"] = "InteractComponent"; + DataType["CameraController"] = "CameraController"; + DataType["PostProcessVolume"] = "PostProcessVolume"; + DataType["EffectComponent"] = "EffectComponent"; + DataType["TextComponent"] = "TextComponent"; + // Non-EffectObject + DataType["TimelineClip"] = "TimelineClip"; +})(DataType || (DataType = {})); + +var GeometryType; +(function(GeometryType) { + /** + * Draw single points. + */ GeometryType[GeometryType["POINTS"] = 0] = "POINTS"; + /** + * Draw lines. Each vertex connects to the one after it. + */ GeometryType[GeometryType["LINES"] = 1] = "LINES"; + /** + * Draw lines. Each set of two vertices is treated as a separate line segment. + */ GeometryType[GeometryType["LINE_LOOP"] = 2] = "LINE_LOOP"; + /** + * Draw a connected group of line segments from the first vertex to the last. + */ GeometryType[GeometryType["LINE_STRIP"] = 3] = "LINE_STRIP"; + /** + * Draw triangles. Each set of three vertices creates a separate triangle. + */ GeometryType[GeometryType["TRIANGLES"] = 4] = "TRIANGLES"; + /** + * Draw a connected strip of triangles. + */ GeometryType[GeometryType["TRIANGLE_STRIP"] = 5] = "TRIANGLE_STRIP"; + /** + * Draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan. + */ GeometryType[GeometryType["TRIANGLE_FAN"] = 6] = "TRIANGLE_FAN"; +})(GeometryType || (GeometryType = {})); +var VertexFormatType; +(function(VertexFormatType) { + VertexFormatType[VertexFormatType["Float16"] = 0] = "Float16"; + VertexFormatType[VertexFormatType["Float32"] = 1] = "Float32"; + VertexFormatType[VertexFormatType["Int8"] = 2] = "Int8"; + VertexFormatType[VertexFormatType["Int16"] = 3] = "Int16"; + VertexFormatType[VertexFormatType["Int32"] = 4] = "Int32"; + VertexFormatType[VertexFormatType["UInt8"] = 5] = "UInt8"; + VertexFormatType[VertexFormatType["UInt16"] = 6] = "UInt16"; + VertexFormatType[VertexFormatType["UInt32"] = 7] = "UInt32"; +})(VertexFormatType || (VertexFormatType = {})); +var IndexFormatType; +(function(IndexFormatType) { + IndexFormatType[IndexFormatType["None"] = -1] = "None"; + IndexFormatType[IndexFormatType["UInt8"] = 0] = "UInt8"; + IndexFormatType[IndexFormatType["UInt16"] = 1] = "UInt16"; + IndexFormatType[IndexFormatType["UInt32"] = 2] = "UInt32"; +})(IndexFormatType || (IndexFormatType = {})); +// BINORMAL[n] Binormal float4 +// BLENDINDICES[n] 混合索引 uint +// BLENDWEIGHT[n] 混合权重 FLOAT +// COLOR[n] 漫射和反射颜色 float4 +// NORMAL[n] 法向矢量 float4 +// POSITION[n] 对象空间中的顶点位置。 float4 +// POSITIONT 变换的顶点位置。 float4 +// PSIZE[n] 点大小 FLOAT +// TANGENT[n] 正切 float4 +// TEXCOORD[n] 纹理坐标 float4 +// POSITION_BS[n] Blend Shape 空间中的顶点位置 float4 +// NORMAL_BS[n] Blend Shape 空间中的法向矢量 float4 +// TANGENT_BS[n] Blend Shape 空间中的正切矢量 float4 +var VertexBufferSemantic; +(function(VertexBufferSemantic) { + VertexBufferSemantic["Position"] = "POSITION"; + VertexBufferSemantic["Uv"] = "TEXCOORD0"; + VertexBufferSemantic["Uv2"] = "TEXCOORD1"; + VertexBufferSemantic["Normal"] = "NORMAL"; + VertexBufferSemantic["Tangent"] = "TANGENT"; + VertexBufferSemantic["Color"] = "COLOR"; + VertexBufferSemantic["Joints"] = "JOINTS"; + VertexBufferSemantic["Weights"] = "WEIGHTS"; + // + VertexBufferSemantic["PositionBS0"] = "POSITION_BS0"; + VertexBufferSemantic["PositionBS1"] = "POSITION_BS1"; + VertexBufferSemantic["PositionBS2"] = "POSITION_BS2"; + VertexBufferSemantic["PositionBS3"] = "POSITION_BS3"; + VertexBufferSemantic["PositionBS4"] = "POSITION_BS4"; + VertexBufferSemantic["PositionBS5"] = "POSITION_BS5"; + VertexBufferSemantic["PositionBS6"] = "POSITION_BS6"; + VertexBufferSemantic["PositionBS7"] = "POSITION_BS7"; + VertexBufferSemantic["NormalBS0"] = "NORMAL_BS0"; + VertexBufferSemantic["NormalBS1"] = "NORMAL_BS1"; + VertexBufferSemantic["NormalBS2"] = "NORMAL_BS2"; + VertexBufferSemantic["NormalBS3"] = "NORMAL_BS3"; + VertexBufferSemantic["TangentBS0"] = "TANGENT_BS0"; + VertexBufferSemantic["TangentBS1"] = "TANGENT_BS1"; + VertexBufferSemantic["TangentBS2"] = "TANGENT_BS2"; + VertexBufferSemantic["TangentBS3"] = "TANGENT_BS3"; +})(VertexBufferSemantic || (VertexBufferSemantic = {})); + +var LATEST_VERSION = JSONSceneVersion.LATEST; + +var index$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + LATEST_VERSION: LATEST_VERSION, + get RenderLevel () { return RenderLevel; }, + get BlendingMode () { return BlendingMode; }, + get SideMode () { return SideMode; }, + get ObscuredMode () { return ObscuredMode; }, + get ParticleEmitterShapeType () { return ParticleEmitterShapeType; }, + get PluginType () { return PluginType; }, + get InteractType () { return InteractType; }, + get InteractBehavior () { return InteractBehavior; }, + get ItemType () { return ItemType; }, + get RenderMode () { return RenderMode; }, + get ParticleOrigin () { return ParticleOrigin; }, + get RenderType () { return RenderType; }, + get RenderFace () { return RenderFace; }, + get CameraClipMode () { return CameraClipMode; }, + END_BEHAVIOR_DESTROY: END_BEHAVIOR_DESTROY, + END_BEHAVIOR_PAUSE: END_BEHAVIOR_PAUSE, + END_BEHAVIOR_FORWARD: END_BEHAVIOR_FORWARD, + END_BEHAVIOR_PAUSE_AND_DESTROY: END_BEHAVIOR_PAUSE_AND_DESTROY, + END_BEHAVIOR_FREEZE: END_BEHAVIOR_FREEZE, + END_BEHAVIOR_RESTART: END_BEHAVIOR_RESTART, + END_BEHAVIOR_DESTROY_CHILDREN: END_BEHAVIOR_DESTROY_CHILDREN, + CAMERA_CLIP_MODE_VERTICAL: CAMERA_CLIP_MODE_VERTICAL, + CAMERA_CLIP_MODE_NORMAL: CAMERA_CLIP_MODE_NORMAL, + MESSAGE_ITEM_PHRASE_BEGIN: MESSAGE_ITEM_PHRASE_BEGIN, + MESSAGE_ITEM_PHRASE_END: MESSAGE_ITEM_PHRASE_END, + get ValueType () { return ValueType; }, + get BezierKeyframeType () { return BezierKeyframeType; }, + get JSONSceneVersion () { return JSONSceneVersion; }, + get EndBehavior () { return EndBehavior; }, + get ParticleInteractionBehavior () { return ParticleInteractionBehavior; }, + get ShapeArcMode () { return ShapeArcMode; }, + get LightType () { return LightType; }, + get ModelBoundingType () { return ModelBoundingType; }, + get CameraType () { return CameraType; }, + get MaterialType () { return MaterialType; }, + get MaterialBlending () { return MaterialBlending; }, + get RenderMode3D () { return RenderMode3D; }, + get TextOverflow () { return TextOverflow; }, + get TextBaseline () { return TextBaseline; }, + get TextAlignment () { return TextAlignment; }, + get TextWeight () { return TextWeight; }, + get FontStyle () { return FontStyle; }, + BuiltinObjectGUID: BuiltinObjectGUID, + get ShapePrimitiveType () { return ShapePrimitiveType; }, + get LineCap () { return LineCap; }, + get LineJoin () { return LineJoin; }, + get BackgroundType () { return BackgroundType; }, + get MultimediaType () { return MultimediaType; }, + get DataType () { return DataType; }, + get GeometryType () { return GeometryType; }, + get VertexFormatType () { return VertexFormatType; }, + get IndexFormatType () { return IndexFormatType; }, + get VertexBufferSemantic () { return VertexBufferSemantic; } +}); + +function _defineProperties(target, props) { + for(var i = 0; i < props.length; i++){ + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} +function _create_class(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +var decoratorInitialStore = new Map(); +var mergedStore = new Map(); +var effectsClassStore = {}; +function effectsClass(className) { + return function(target, context) { + if (effectsClassStore[className]) { + console.warn("Class " + className + " is already registered."); + } + // TODO: three修改json dataType, 这边重复注册直接 return + effectsClassStore[className] = target; + }; +} +function serialize(type, sourceName) { + return generateSerializableMember(type, sourceName); // value member +} +function getMergedStore(target) { + var classKey = target.constructor; + if (mergedStore.get(classKey)) { + return mergedStore.get(classKey); + } + var store = {}; + mergedStore.set(classKey, store); + var currentTarget = target; + var currentKey = classKey; + while(currentKey){ + var initialStore = decoratorInitialStore.get(currentKey); + for(var property in initialStore){ + store[property] = initialStore[property]; + } + var parent = Object.getPrototypeOf(currentTarget); + currentKey = Object.getPrototypeOf(parent).constructor; + if (currentKey === Object) { + break; + } + currentTarget = parent; + } + return store; +} +function generateSerializableMember(type, sourceName) { + return function(target, propertyKey) { + var classStore = getDirectStore(target); + if (!classStore) { + return; + } + if (!classStore[propertyKey]) { + classStore[propertyKey] = { + type: type, + sourceName: sourceName + }; + } + }; +} +function getDirectStore(target) { + var classKey = target.constructor; + if (!decoratorInitialStore.get(classKey)) { + decoratorInitialStore.set(classKey, {}); + } + return decoratorInitialStore.get(classKey); +} + +/** + * @since 2.0.0 + */ var EffectsObject = /*#__PURE__*/ function() { + function EffectsObject(engine) { + this.engine = engine; + this.guid = generateGUID(); + this.defination = {}; + this.engine.addInstance(this); + } + var _proto = EffectsObject.prototype; + /** + * + * @returns + */ _proto.getInstanceId = function getInstanceId() { + return this.guid; + }; + /** + * + * @param guid + */ _proto.setInstanceId = function setInstanceId(guid) { + this.engine.removeInstance(this.guid); + this.guid = guid; + this.engine.addInstance(this); + }; + /** + * + */ _proto.toData = function toData() {}; + /** + * 反序列化函数 + * + * @param data - 对象的序列化的数据 + */ _proto.fromData = function fromData(data) {}; + /** + * + */ _proto.dispose = function dispose() {}; + /** + * + * @param obj + * @returns + */ EffectsObject.is = function is(obj) { + return _instanceof1(obj, EffectsObject) && "guid" in obj; + }; + return EffectsObject; +}(); + +/** + * @since 2.0.0 + */ var Component = /*#__PURE__*/ function(EffectsObject) { + _inherits(Component, EffectsObject); + function Component() { + var _this; + _this = EffectsObject.apply(this, arguments) || this; + _this.isAwakeCalled = false; + _this.isStartCalled = false; + _this.isEnableCalled = false; + _this._enabled = true; + return _this; + } + var _proto = Component.prototype; + /** + * 生命周期函数,初始化后调用,生命周期内只调用一次 + */ _proto.onAwake = function onAwake() { + // OVERRIDE + }; + /** + * 在 enabled 变为 true 时触发 + */ _proto.onEnable = function onEnable() { + // OVERRIDE + }; + /** + * 在 enabled 变为 false 时触发 + */ _proto.onDisable = function onDisable() { + // OVERRIDE + }; + /** + * 生命周期函数,在第一次 update 前调用,生命周期内只调用一次 + */ _proto.onStart = function onStart() { + // OVERRIDE + }; + /** + * 生命周期函数,每帧调用一次 + */ _proto.onUpdate = function onUpdate(dt) { + // OVERRIDE + }; + /** + * 生命周期函数,每帧调用一次,在 update 之后调用 + */ _proto.onLateUpdate = function onLateUpdate(dt) { + // OVERRIDE + }; + /** + * 生命周期函数,在组件销毁时调用 + */ _proto.onDestroy = function onDestroy() { + // OVERRIDE + }; + /** + * @internal + */ _proto.enable = function enable() { + if (this.item.composition) { + this.item.composition.sceneTicking.addComponent(this); + this.isEnableCalled = true; + } + this.onEnable(); + }; + /** + * @internal + */ _proto.disable = function disable() { + this.onDisable(); + if (this.item.composition) { + this.isEnableCalled = false; + this.item.composition.sceneTicking.removeComponent(this); + } + }; + _proto.setVFXItem = function setVFXItem(item) { + this.item = item; + if (item.isDuringPlay) { + if (!this.isAwakeCalled) { + this.onAwake(); + this.isAwakeCalled = true; + } + if (item.isActive && this.enabled) { + this.start(); + this.enable(); + } + } + }; + _proto.fromData = function fromData(data) { + EffectsObject.prototype.fromData.call(this, data); + }; + _proto.dispose = function dispose() { + if (this.isEnableCalled) { + this.disable(); + } + if (this.isAwakeCalled) { + this.isAwakeCalled = false; + this.onDestroy(); + } + if (this.item) { + removeItem(this.item.components, this); + } + }; + _proto.start = function start() { + if (this.isStartCalled) { + return; + } + this.isStartCalled = true; + this.onStart(); + }; + _create_class(Component, [ + { + key: "transform", + get: /** + * 附加到的 VFXItem 对象 Transform 组件 + */ function get() { + return this.item.transform; + } + }, + { + key: "isActiveAndEnabled", + get: /** + * 组件是否可以更新,true 更新,false 不更新 + */ function get() { + return this.item.isActive && this.enabled; + } + }, + { + key: "enabled", + get: function get() { + return this._enabled; + }, + set: function set(value) { + if (this.enabled !== value) { + this._enabled = value; + if (value) { + if (this.isActiveAndEnabled) { + this.enable(); + if (!this.isStartCalled) { + this.onStart(); + this.isStartCalled = true; + } + } + } else { + if (this.isEnableCalled) { + this.disable(); + } + } + } + } + } + ]); + return Component; +}(EffectsObject); +__decorate([ + serialize() +], Component.prototype, "item", void 0); +__decorate([ + serialize() +], Component.prototype, "_enabled", void 0); +/** + * @since 2.0.0 + * @deprecated 2.4.0 Please use Component instead + */ var Behaviour = /*#__PURE__*/ function(Component) { + _inherits(Behaviour, Component); + function Behaviour() { + return Component.apply(this, arguments); + } + var _proto = Behaviour.prototype; + _proto.setVFXItem = function setVFXItem(item) { + Component.prototype.setVFXItem.call(this, item); + }; + _proto.dispose = function dispose() { + Component.prototype.dispose.call(this); + }; + return Behaviour; +}(Component); + +/** + * 所有渲染组件的基类 + * @since 2.0.0 + */ var RendererComponent = /*#__PURE__*/ function(Component) { + _inherits(RendererComponent, Component); + function RendererComponent() { + var _this; + _this = Component.apply(this, arguments) || this; + _this.materials = []; + _this._priority = 0; + return _this; + } + var _proto = RendererComponent.prototype; + _proto.render = function render(renderer) {}; + _proto.onEnable = function onEnable() { + var _this_item_composition; + (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.renderFrame.addMeshToDefaultRenderPass(this); + }; + _proto.onDisable = function onDisable() { + var _this_item_composition; + (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.renderFrame.removeMeshFromDefaultRenderPass(this); + }; + _create_class(RendererComponent, [ + { + key: "priority", + get: function get() { + return this._priority; + }, + set: function set(value) { + this._priority = value; + } + }, + { + key: "material", + get: function get() { + return this.materials[0]; + }, + set: function set(material) { + if (this.materials.length === 0) { + this.materials.push(material); + } else { + this.materials[0] = material; + } + } + } + ]); + return RendererComponent; +}(Component); +__decorate([ + serialize() +], RendererComponent.prototype, "materials", void 0); +__decorate([ + serialize() +], RendererComponent.prototype, "_priority", void 0); + +var PI2 = Math.PI * 2; +var DEG2RAD = Math.PI / 180; +var RAD2DEG = 180 / Math.PI; +var NumberEpsilon = 1e-6; +function isZero(v) { + return isNaN(v) || Math.abs(v) < NumberEpsilon; +} +function isEqual(a, b) { + return Math.abs(a - b) < NumberEpsilon || a === Infinity && b === Infinity || a === -Infinity && b === -Infinity; +} +// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/ +var damp = function(x, y, lambda, dt) { + return lerp(x, y, 1 - Math.exp(-lambda * dt)); +}; +// https://en.wikipedia.org/wiki/Linear_interpolation +var lerp = function(x, y, t) { + return (1 - t) * x + t * y; +}; +var degToRad = function(degrees) { + return degrees * DEG2RAD; +}; +var radToDeg = function(radians) { + return radians * RAD2DEG; +}; +function clamp$1(value, min, max) { + var fixedMin = isNaN(min) ? -Infinity : min; + var fixedMax = isNaN(max) ? Infinity : max; + var lower = Math.min(fixedMin, fixedMax); + var upper = Math.max(fixedMin, fixedMax); + return Math.min(Math.max(value, lower), upper); +} + +/** + * 二维向量 + */ var Vector2 = /*#__PURE__*/ function() { + function Vector2(x, y) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + this.x = x; + this.y = y; + } + var _proto = Vector2.prototype; + /** + * 设置向量 + * @param x - x 轴分量 + * @param y - y 轴分量 + * @returns + */ _proto.set = function set(x, y) { + this.x = x; + this.y = y; + return this; + }; + /** + * 设置零向量 + * @returns 向量 + */ _proto.setZero = function setZero() { + this.x = 0; + this.y = 0; + return this; + }; + /** + * 通过标量数值创建向量 + * @param num - 数值 + * @returns 向量 + */ _proto.setFromNumber = function setFromNumber(num) { + this.x = num; + this.y = num; + return this; + }; + /** + * 通过数组创建向量 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 向量 + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + var _array_offset; + this.x = (_array_offset = array[offset]) != null ? _array_offset : 0; + var _array_; + this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0; + return this; + }; + /** + * 拷贝向量 + * @param src - 要拷贝的对象 + * @returns 向量 + */ _proto.copyFrom = function copyFrom(src) { + this.x = src.x; + this.y = src.y; + return this; + }; + /** + * 克隆向量 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Vector2(this.x, this.y); + }; + /** + * 根据下标设置元素值 + * @param index - 下标值 + * @param value - 数字 + * @returns 向量 + */ _proto.setElement = function setElement(index, value) { + switch(index){ + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + default: + console.error("index is out of range: " + index); + } + return this; + }; + /** + * 根据下标获取值 + * @param index - 下标 + * @returns 值 + */ _proto.getElement = function getElement(index) { + switch(index){ + case 0: + return this.x; + case 1: + return this.y; + default: + console.error("index is out of range: " + index); + } + return 0; + }; + /** + * 向量相加 + * @param right - 向量 | 数字 + * @returns 向量 + */ _proto.add = function add(right) { + if (typeof right === "number") { + this.x += right; + this.y += right; + } else if (_instanceof1(right, Array)) { + this.x += right[0]; + this.y += right[1]; + } else { + this.x += right.x; + this.y += right.y; + } + return this; + }; + /** + * 向量相加 + * @param left - 向量 + * @param right - 向量 + * @returns 相加结果 + */ _proto.addVectors = function addVectors(left, right) { + this.x = left.x + right.x; + this.y = left.y + right.y; + return this; + }; + /** + * 向量相减 + * @param right - 向量 | 数字 + * @returns 相减结果 + */ _proto.subtract = function subtract(right) { + if (typeof right === "number") { + this.x -= right; + this.y -= right; + } else if (_instanceof1(right, Array)) { + this.x -= right[0]; + this.y -= right[1]; + } else { + this.x -= right.x; + this.y -= right.y; + } + return this; + }; + /** + * 向量相减 + * @param left - 向量 + * @param right - 向量 + * @returns 相减结果 + */ _proto.subtractVectors = function subtractVectors(left, right) { + this.x = left.x - right.x; + this.y = left.y - right.y; + return this; + }; + /** + * 向量相乘 + * @param right - 向量 | 数字 + * @returns 相乘结果 + */ _proto.multiply = function multiply(right) { + if (typeof right === "number") { + this.x *= right; + this.y *= right; + } else if (_instanceof1(right, Array)) { + this.x *= right[0]; + this.y *= right[1]; + } else { + this.x *= right.x; + this.y *= right.y; + } + return this; + }; + /** + * 向量相乘 + * @param left - 向量 + * @param right - 向量 + * @returns 相乘结果 + */ _proto.multiplyVectors = function multiplyVectors(left, right) { + this.x = left.x * right.x; + this.y = left.y * right.y; + return this; + }; + /** + * 向量相除 + * @param right - 向量 | 数字 + * @returns 相除结果 + */ _proto.divide = function divide(right) { + if (typeof right === "number") { + this.x /= right; + this.y /= right; + } else if (_instanceof1(right, Array)) { + this.x /= right[0]; + this.y /= right[1]; + } else { + this.x /= right.x; + this.y /= right.y; + } + return this; + }; + /** + * 向量缩放 + * @param v - 数字 + * @returns 缩放结果 + */ _proto.scale = function scale(v) { + this.x *= v; + this.y *= v; + return this; + }; + /** + * 分量求和 + * @returns 求和结果 + */ _proto.sum = function sum() { + return this.x + this.y; + }; + /** + * 向量求最小值 + * @param v - 向量 + * @returns 最小值 + */ _proto.min = function min(v) { + if (typeof v === "number") { + this.x = Math.min(this.x, v); + this.y = Math.min(this.y, v); + } else { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + } + return this; + }; + /** + * 向量求最大值 + * @param v - 向量 + * @returns 最大值 + */ _proto.max = function max(v) { + if (typeof v === "number") { + this.x = Math.max(this.x, v); + this.y = Math.max(this.y, v); + } else { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + } + return this; + }; + /** + * 向量阈值约束 + * @param min - 极小值 + * @param max - 极大值 + * @returns 向量 + */ _proto.clamp = function clamp(min, max) { + return this.max(min).min(max); + }; + /** + * 向量向下取整 + * @returns 取整结果 + */ _proto.floor = function floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; + }; + /** + * 向量向上取整 + * @returns 取整结果 + */ _proto.ceil = function ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; + }; + /** + * 向量取四舍五入 + * @returns 四舍五入结果 + */ _proto.round = function round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + }; + /** + * 向量取绝对值 + * @returns 向量 + */ _proto.abs = function abs() { + this.x = Math.abs(this.x); + this.y = Math.abs(this.y); + return this; + }; + /** + * 向量取反 + * @returns 取反结果 + */ _proto.negate = function negate() { + this.x = -this.x; + this.y = -this.y; + return this; + }; + /** + * 向量长度 + * @returns 求值结果 + */ _proto.length = function length() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + /** + * 向量长度平方 + * @returns 求值结果 + */ _proto.lengthSquared = function lengthSquared() { + return this.x * this.x + this.y * this.y; + }; + /** + * 向量归一化 + * @returns 归一化结果 + */ _proto.normalize = function normalize() { + return this.divide(this.length() || 1); + }; + /** + * 设置向量长度 + * @param length - 长度 + * @returns 向量 + */ _proto.setLength = function setLength(length) { + return this.normalize().multiply(length); + }; + /** + * 向量线性插值 + * @param other - 向量 + * @param alpha - 插值比 + * @returns 计算结果 + */ _proto.lerp = function lerp(other, alpha) { + this.x += (other.x - this.x) * alpha; + this.y += (other.y - this.y) * alpha; + return this; + }; + /** + * 向量线性插值 + * @param v1 - 向量 + * @param v2 - 向量 + * @param alpha - 插值比 + * @returns 计算结果 + */ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + return this; + }; + /** + * 向量点乘 + * @param v - 向量 + * @returns 点乘结果 + */ _proto.dot = function dot(v) { + return this.x * v.x + this.y * v.y; + }; + /** + * 向量叉乘 + * @param v - 向量 + * @returns 叉乘结果 + */ _proto.cross = function cross(v) { + return this.x * v.y - this.y * v.x; + }; + /** + * 点距离 + * @param v - 点 + * @returns 距离 + */ _proto.distance = function distance(v) { + var dx = this.x - v.x; + var dy = this.y - v.y; + return Math.sqrt(dx * dx + dy * dy); + }; + /** + * 点距离平方 + * @param v - 点 + * @returns 距离平方 + */ _proto.distanceSquared = function distanceSquared(v) { + var dx = this.x - v.x; + var dy = this.y - v.y; + return dx * dx + dy * dy; + }; + /** + * 向量判等 + * @param v - 向量 + * @returns 判等结果 + */ _proto.equals = function equals(v) { + return this.x === v.x && this.y === v.y; + }; + /** + * 是否零向量 + * @returns 是否零向量 + */ _proto.isZero = function isZero() { + var eps = NumberEpsilon; + var _this = this, x = _this.x, y = _this.y; + return Math.abs(x) <= eps && Math.abs(y) <= eps; + }; + /** + * 向量转数组 + * @returns 数组 + */ _proto.toArray = function toArray() { + return [ + this.x, + this.y + ]; + }; + _proto.fill = function fill(array, offset) { + if (offset === void 0) offset = 0; + array[offset] = this.x; + array[offset + 1] = this.y; + }; + /** + * 随机生成向量 + * @returns 向量 + */ _proto.random = function random() { + this.x = Math.random(); + this.y = Math.random(); + return this; + }; + /** + * 通过标量创建向量 + * @param num - 数值 + * @returns 向量 + */ Vector2.fromNumber = function fromNumber(num) { + return new Vector2().setFromNumber(num); + }; + /** + * 通过数组创建向量 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 向量 + */ Vector2.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Vector2().setFromArray(array, offset); + }; + return Vector2; +}(); +/** + * 二维向量的常量 + */ Vector2.ONE = new Vector2(1.0, 1.0); +Vector2.ZERO = new Vector2(0.0, 0.0); + +/** + * 三维向量 + */ var Vector3 = /*#__PURE__*/ function() { + function Vector3(x, y, z) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + if (z === void 0) z = 0; + this.x = x; + this.y = y; + this.z = z; + } + var _proto = Vector3.prototype; + /** + * 设置向量 + * @param x - x 轴分量 + * @param y - y 轴分量 + * @param z - z 轴分量 + * @returns 向量 + */ _proto.set = function set(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + /** + * 设置零向量 + * @returns 向量 + */ _proto.setZero = function setZero() { + this.x = 0; + this.y = 0; + this.z = 0; + return this; + }; + /** + * 通过标量数值设置向量 + * @param num - 数值 + * @returns 向量 + */ _proto.setFromNumber = function setFromNumber(num) { + this.x = num; + this.y = num; + this.z = num; + return this; + }; + /** + * 通过数组设置向量 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 向量 + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + var _array_offset; + this.x = (_array_offset = array[offset]) != null ? _array_offset : 0; + var _array_; + this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0; + var _array_1; + this.z = (_array_1 = array[offset + 2]) != null ? _array_1 : 0; + return this; + }; + /** + * 拷贝向量 + * @param v - 要拷贝的对象 + * @returns 向量 + */ _proto.copyFrom = function copyFrom(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + return this; + }; + /** + * 克隆向量 + * @returns 向量 + */ _proto.clone = function clone() { + return new Vector3(this.x, this.y, this.z); + }; + /** + * 根据下标设置向量分量 + * @param index - 下标值 + * @param value - 数字 + * @returns 向量 + */ _proto.setElement = function setElement(index, value) { + switch(index){ + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + default: + console.error("index is out of range: " + index); + } + return this; + }; + /** + * 根据下标获取向量分量 + * @param index - 下标 + * @returns + */ _proto.getElement = function getElement(index) { + switch(index){ + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + default: + console.error("index is out of range: " + index); + } + return 0; + }; + /** + * 向量相加 + * @param right - 向量 | 数字 + * @returns 相加结果 + */ _proto.add = function add(right) { + if (typeof right === "number") { + this.x += right; + this.y += right; + this.z += right; + } else if (_instanceof1(right, Array)) { + this.x += right[0]; + this.y += right[1]; + this.z += right[2]; + } else { + this.x += right.x; + this.y += right.y; + this.z += right.z; + } + return this; + }; + /** + * 向量相加 + * @param left - 向量 + * @param right - 向量 + * @returns 相加结果 + */ _proto.addVectors = function addVectors(left, right) { + this.x = left.x + right.x; + this.y = left.y + right.y; + this.z = left.z + right.z; + return this; + }; + /** + * 向量乘比例后相加 + * @param right - 向量 + * @param s - 比例 + * @returns 相加结果 + */ _proto.addScaledVector = function addScaledVector(right, s) { + this.x += right.x * s; + this.y += right.y * s; + this.z += right.z * s; + return this; + }; + /** + * 向量相减 + * @param right - 向量 | 数字 + * @returns 相减 + */ _proto.subtract = function subtract(right) { + if (typeof right === "number") { + this.x -= right; + this.y -= right; + this.z -= right; + } else if (_instanceof1(right, Array)) { + this.x -= right[0]; + this.y -= right[1]; + this.z -= right[2]; + } else { + this.x -= right.x; + this.y -= right.y; + this.z -= right.z; + } + return this; + }; + /** + * 向量相减 + * @param left - 向量 + * @param right - 向量 + * @returns 相减结果 + */ _proto.subtractVectors = function subtractVectors(left, right) { + this.x = left.x - right.x; + this.y = left.y - right.y; + this.z = left.z - right.z; + return this; + }; + /** + * 向量相乘 + * @param right - 向量 | 数字 + * @returns 相乘结果 + */ _proto.multiply = function multiply(right) { + if (typeof right === "number") { + this.x *= right; + this.y *= right; + this.z *= right; + } else if (_instanceof1(right, Array)) { + this.x *= right[0]; + this.y *= right[1]; + this.z *= right[2]; + } else { + this.x *= right.x; + this.y *= right.y; + this.z *= right.z; + } + return this; + }; + /** + * 向量相乘 + * @param left - 向量 + * @param right - 向量 + * @returns 相乘结果 + */ _proto.multiplyVectors = function multiplyVectors(left, right) { + this.x = left.x * right.x; + this.y = left.y * right.y; + this.z = left.z * right.z; + return this; + }; + /** + * 向量相除 + * @param right - 向量 | 数字 + * @returns 相除结果 + */ _proto.divide = function divide(right) { + if (typeof right === "number") { + this.x /= right; + this.y /= right; + this.z /= right; + } else if (_instanceof1(right, Array)) { + this.x /= right[0]; + this.y /= right[1]; + this.z /= right[2]; + } else { + this.x /= right.x; + this.y /= right.y; + this.z /= right.z; + } + return this; + }; + /** + * 向量缩放 + * @param v - 数字 + * @returns 缩放结果 + */ _proto.scale = function scale(v) { + this.x *= v; + this.y *= v; + this.z *= v; + return this; + }; + /** + * 分量求和 + * @returns 求和结果 + */ _proto.sum = function sum() { + return this.x + this.y + this.z; + }; + /** + * 向量求最小值 + * @param v - 向量或数值 + * @returns 求值结果 + */ _proto.min = function min(v) { + if (typeof v === "number") { + this.x = Math.min(this.x, v); + this.y = Math.min(this.y, v); + this.z = Math.min(this.z, v); + } else { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + this.z = Math.min(this.z, v.z); + } + return this; + }; + /** + * 向量求最大值 + * @param v - 向量或数值 + * @returns 求值结果 + */ _proto.max = function max(v) { + if (typeof v === "number") { + this.x = Math.max(this.x, v); + this.y = Math.max(this.y, v); + this.z = Math.max(this.z, v); + } else { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + this.z = Math.max(this.z, v.z); + } + return this; + }; + /** + * 向量阈值约束 + * @param min - 向量 + * @param max - 向量 + * @returns 求值结果 + */ _proto.clamp = function clamp(min, max) { + return this.max(min).min(max); + }; + /** + * 向量向下取整 + * @returns 取整结果 + */ _proto.floor = function floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + return this; + }; + /** + * 向量向上取整 + * @returns 取整结果 + */ _proto.ceil = function ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + this.z = Math.ceil(this.z); + return this; + }; + /** + * 向量四舍五入 + * @returns 计算结果 + */ _proto.round = function round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + this.z = Math.round(this.z); + return this; + }; + /** + * 向量取绝对值 + * @returns 向量 + */ _proto.abs = function abs() { + this.x = Math.abs(this.x); + this.y = Math.abs(this.y); + this.z = Math.abs(this.z); + return this; + }; + /** + * 向量取反 + * @returns 向量 + */ _proto.negate = function negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + /** + * 向量长度 + * @returns 长度 + */ _proto.length = function length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + }; + /** + * 向量长度平方 + * @returns 长度平方 + */ _proto.lengthSquared = function lengthSquared() { + return this.x * this.x + this.y * this.y + this.z * this.z; + }; + /** + * 向量归一化 + * @returns 向量 + */ _proto.normalize = function normalize() { + return this.divide(this.length() || 1); + }; + /** + * 设置向量长度 + * @param length - 长度 + * @returns 向量 + */ _proto.setLength = function setLength(length) { + return this.normalize().multiply(length); + }; + /** + * 向量间求线性插值 + * @param other - 向量 + * @param alpha - 插值比例 + * @returns 插值结果 + */ _proto.lerp = function lerp(other, alpha) { + this.x += (other.x - this.x) * alpha; + this.y += (other.y - this.y) * alpha; + this.z += (other.z - this.z) * alpha; + return this; + }; + /** + * 向量间求线性插值 + * @param v1 - 第一个向量 + * @param v2 - 第二个向量 + * @param alpha - 插值比例 + * @returns 求值结果 + */ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + this.z = v1.z + (v2.z - v1.z) * alpha; + return this; + }; + /** + * 向量求点积,点积为零表示两向量垂直 + * @param v - 向量 + * @returns 点积结果 + */ _proto.dot = function dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z; + }; + /** + * 向量求叉积 + * @param right - 向量 + * @returns 叉积结果 + */ _proto.cross = function cross(right) { + return this.crossVectors(this, right); + }; + /** + * 向量(a 与 b)求叉积 + * @param left - 向量 + * @param right - 向量 + * @returns 叉积结果 + */ _proto.crossVectors = function crossVectors(left, right) { + var ax = left.x, ay = left.y, az = left.z; + var bx = right.x, by = right.y, bz = right.z; + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + return this; + }; + /** + * 向量反射 + * @param normal - 法线 + * @returns 反射结果 + */ _proto.reflect = function reflect(normal) { + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + return this.subtract(normal.clone().multiply(2 * this.dot(normal))); + }; + /** + * 计算向量距离 + * @param v - 向量 + * @returns 距离 + */ _proto.distance = function distance(v) { + return Math.sqrt(this.distanceSquared(v)); + }; + /** + * 计算向量距离平方 + * @param v - 向量 + * @returns 距离平方 + */ _proto.distanceSquared = function distanceSquared(v) { + var dx = this.x - v.x; + var dy = this.y - v.y; + var dz = this.z - v.z; + return dx * dx + dy * dy + dz * dz; + }; + /** + * 向量判等 + * @param v - 向量 + * @returns 判等结果 + */ _proto.equals = function equals(v) { + return v.x === this.x && v.y === this.y && v.z === this.z; + }; + /** + * 是否零向量 + * @returns 是否零向量 + */ _proto.isZero = function isZero() { + var eps = NumberEpsilon; + var _this = this, x = _this.x, y = _this.y, z = _this.z; + return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps; + }; + /** + * 向量转数组 + * @param array - 目标保存对象 + * @returns 数组 + */ _proto.toArray = function toArray() { + return [ + this.x, + this.y, + this.z + ]; + }; + _proto.toVector2 = function toVector2() { + return new Vector2(this.x, this.y); + }; + _proto.fill = function fill(array, offset) { + if (offset === void 0) offset = 0; + array[offset] = this.x; + array[offset + 1] = this.y; + array[offset + 2] = this.z; + }; + /** + * 获取随机向量 + * @returns + */ _proto.random = function random() { + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + return this; + }; + /** + * 用欧拉角旋转向量 + * @param euler - 欧拉角 + * @param [out] - 输出结果,如果没有就覆盖当前向量值 + * @returns 旋转结果 + */ _proto.applyEuler = function applyEuler(euler, out) { + return euler.rotateVector3(this, out); + }; + /** + * 用四元数旋转向量 + * @param q - 四元数 + * @param [out] - 输出结果,如果没有就覆盖当前向量值 + * @returns 旋转结果 + */ _proto.applyQuaternion = function applyQuaternion(q, out) { + return q.rotateVector3(this, out); + }; + /** + * 用矩阵变换点 + * @param m - 变换矩阵 + * @param [out] - 输出结果,如果没有就覆盖当前向量值 + * @returns 结果点 + */ _proto.applyMatrix = function applyMatrix(m, out) { + return m.transformPoint(this, out); + }; + /** + * 用法向量矩阵变换法向量 + * @param m - 法向量矩阵 + * @param [out] - 输出结果,如果没有就覆盖当前向量值 + * @returns 向量 + */ _proto.applyNormalMatrix = function applyNormalMatrix(m, out) { + return m.transformNormal(this, out); + }; + /** + * 用投影矩阵变换点 + * @param m - 投影矩阵 + * @param [out] - 输出结果,如果没有就覆盖当前向量值 + * @returns 结果点 + */ _proto.applyProjectionMatrix = function applyProjectionMatrix(m, out) { + return m.projectPoint(this, out); + }; + /** + * 通过标量数值创建向量 + * @param num - 数值 + * @returns 向量 + */ Vector3.fromNumber = function fromNumber(num) { + return new Vector3().setFromNumber(num); + }; + /** + * 通过数组创建向量 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 向量 + */ Vector3.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Vector3().setFromArray(array, offset); + }; + return Vector3; +}(); +/** + * 三维向量的常量 + */ Vector3.X = new Vector3(1.0, 0.0, 0.0); +Vector3.Y = new Vector3(0.0, 1.0, 0.0); +Vector3.Z = new Vector3(0.0, 0.0, 1.0); +Vector3.ONE = new Vector3(1.0, 1.0, 1.0); +Vector3.ZERO = new Vector3(0.0, 0.0, 0.0); + +/** + * 四维向量 + */ var Vector4$1 = /*#__PURE__*/ function() { + function Vector4(x, y, z, w) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + if (z === void 0) z = 0; + if (w === void 0) w = 0; + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + var _proto = Vector4.prototype; + /** + * 设置向量 + * @param x - x 轴分量 + * @param y - y 轴分量 + * @param z - z 轴分量 + * @param w - w 轴分量 + * @returns + */ _proto.set = function set(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + return this; + }; + /** + * 设置零向量 + * @returns 向量 + */ _proto.setZero = function setZero() { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + return this; + }; + /** + * 通过标量数值设置向量 + * @param num - 数值 + * @returns 向量 + */ _proto.setFromNumber = function setFromNumber(num) { + this.x = num; + this.y = num; + this.z = num; + this.w = num; + return this; + }; + /** + * 通过数组创建向量 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 向量 + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + var _array_offset; + this.x = (_array_offset = array[offset]) != null ? _array_offset : 0; + var _array_; + this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0; + var _array_1; + this.z = (_array_1 = array[offset + 2]) != null ? _array_1 : 0; + var _array_2; + this.w = (_array_2 = array[offset + 3]) != null ? _array_2 : 0; + return this; + }; + /** + * 拷贝向量 + * @param v - 复制对象 + * @returns 拷贝结果 + */ _proto.copyFrom = function copyFrom(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w; + return this; + }; + /** + * 克隆向量 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Vector4(this.x, this.y, this.z, this.w); + }; + /** + * 根据下标设置向量分量 + * @param index - 下标值 + * @param value - 分量值 + * @returns 向量 + */ _proto.setElement = function setElement(index, value) { + switch(index){ + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + case 3: + this.w = value; + break; + default: + console.error("index is out of range: " + index); + } + return this; + }; + /** + * 根据下标获取向量分量 + * @param index - 下标 + * @returns 分量值 + */ _proto.getElement = function getElement(index) { + switch(index){ + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + case 3: + return this.w; + default: + console.error("index is out of range: " + index); + } + return 0; + }; + /** + * 向量相加 + * @param right - 相加对象,向量 | 数字 + * @returns 相加结果 + */ _proto.add = function add(right) { + if (typeof right === "number") { + this.x += right; + this.y += right; + this.z += right; + this.w += right; + } else if (_instanceof1(right, Array)) { + this.x += right[0]; + this.y += right[1]; + this.z += right[2]; + this.w += right[3]; + } else { + this.x += right.x; + this.y += right.y; + this.z += right.z; + this.w += right.w; + } + return this; + }; + /** + * 向量相加 + * @param left - 向量 + * @param right - 向量 + * @returns 求和结果 + */ _proto.addVectors = function addVectors(left, right) { + this.x = left.x + right.x; + this.y = left.y + right.y; + this.z = left.z + right.z; + this.w = left.w + right.w; + return this; + }; + /** + * 向量比例缩放后相加 + * @param right - 向量 + * @param s - 比例 + * @returns 求和结果 + */ _proto.addScaledVector = function addScaledVector(right, s) { + this.x += right.x * s; + this.y += right.y * s; + this.z += right.z * s; + this.w += right.w * s; + return this; + }; + /** + * 向量相减 + * @param right - 相减对象,向量 | 数字 + * @returns 相减结果 + */ _proto.subtract = function subtract(right) { + if (typeof right === "number") { + this.x -= right; + this.y -= right; + this.z -= right; + this.w -= right; + } else if (_instanceof1(right, Array)) { + this.x -= right[0]; + this.y -= right[1]; + this.z -= right[2]; + this.w -= right[3]; + } else { + this.x -= right.x; + this.y -= right.y; + this.z -= right.z; + this.w -= right.w; + } + return this; + }; + /** + * 向量相减 + * @param left - 向量 + * @param right - 向量 + * @returns 向量 + */ _proto.subtractVectors = function subtractVectors(left, right) { + this.x = left.x - right.x; + this.y = left.y - right.y; + this.z = left.z - right.z; + this.w = left.w - right.w; + return this; + }; + /** + * 向量相乘 + * @param right - 相乘对象,对象 | 数字 + * @returns 向量 + */ _proto.multiply = function multiply(right) { + if (typeof right === "number") { + this.x *= right; + this.y *= right; + this.z *= right; + this.w *= right; + } else if (_instanceof1(right, Array)) { + this.x *= right[0]; + this.y *= right[1]; + this.z *= right[2]; + this.w *= right[3]; + } else { + this.x *= right.x; + this.y *= right.y; + this.z *= right.z; + this.w *= right.w; + } + return this; + }; + /** + * 向量相乘 + * @param left - 向量 + * @param right - 向量 + * @returns 向量 + */ _proto.multiplyVectors = function multiplyVectors(left, right) { + this.x = left.x * right.x; + this.y = left.y * right.y; + this.z = left.z * right.z; + this.w = left.w * right.w; + return this; + }; + /** + * 向量相除 + * @param right - 相除对象,对象 | 数字 + * @returns 向量 + */ _proto.divide = function divide(right) { + if (typeof right === "number") { + this.x /= right; + this.y /= right; + this.z /= right; + this.w /= right; + } else if (_instanceof1(right, Array)) { + this.x /= right[0]; + this.y /= right[1]; + this.z /= right[2]; + this.w /= right[3]; + } else { + this.x /= right.x; + this.y /= right.y; + this.z /= right.z; + this.w /= right.w; + } + return this; + }; + /** + * 向量缩放 + * @param v - 数字 + * @returns 缩放结果 + */ _proto.scale = function scale(v) { + this.x *= v; + this.y *= v; + this.z *= v; + this.w *= v; + return this; + }; + /** + * 分量求和 + * @returns 求和结果 + */ _proto.sum = function sum() { + return this.x + this.y + this.z + this.w; + }; + /** + * 向量求最小值 + * @param v - 向量或数值 + * @returns 最小值 + */ _proto.min = function min(v) { + if (typeof v === "number") { + this.x = Math.min(this.x, v); + this.y = Math.min(this.y, v); + this.z = Math.min(this.z, v); + this.w = Math.min(this.w, v); + } else { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + this.z = Math.min(this.z, v.z); + this.w = Math.min(this.w, v.w); + } + return this; + }; + /** + * 向量求最大值 + * @param v - 向量或数值 + * @returns 最大值 + */ _proto.max = function max(v) { + if (typeof v === "number") { + this.x = Math.max(this.x, v); + this.y = Math.max(this.y, v); + this.z = Math.max(this.z, v); + this.w = Math.max(this.w, v); + } else { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + this.z = Math.max(this.z, v.z); + this.w = Math.max(this.w, v.w); + } + return this; + }; + /** + * 向量阈值约束 + * @param min - 最小值 + * @param max - 最大值 + * @returns 向量 + */ _proto.clamp = function clamp(min, max) { + return this.max(min).min(max); + }; + /** + * 向量向下取整 + * @returns 取整结果 + */ _proto.floor = function floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + this.w = Math.floor(this.w); + return this; + }; + /** + * 向量向上取整 + * @returns 取整结果 + */ _proto.ceil = function ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + this.z = Math.ceil(this.z); + this.w = Math.ceil(this.w); + return this; + }; + /** + * 向量四舍五入 + * @returns 求值结果 + */ _proto.round = function round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + this.z = Math.round(this.z); + this.w = Math.round(this.w); + return this; + }; + /** + * 向量取绝对值 + * @returns 向量 + */ _proto.abs = function abs() { + this.x = Math.abs(this.x); + this.y = Math.abs(this.y); + this.z = Math.abs(this.z); + this.w = Math.abs(this.w); + return this; + }; + /** + * 向量取反 + * @returns 取反结果 + */ _proto.negate = function negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + this.w = -this.w; + return this; + }; + /** + * 向量长度平方 + * @returns 长度平方 + */ _proto.lengthSquared = function lengthSquared() { + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + }; + /** + * 向量长度 + * @returns 长度 + */ _proto.length = function length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + }; + /** + * 向量归一化 + * @returns 归一化结果 + */ _proto.normalize = function normalize() { + return this.divide(this.length() || 1); + }; + /** + * 设置向量长度 + * @param length - 长度 + * @returns 向量 + */ _proto.setLength = function setLength(length) { + return this.normalize().multiply(length); + }; + /** + * 向量求线性插值 + * @param v - 向量 + * @param alpha - 插值比例 + * @returns 插值结果 + */ _proto.lerp = function lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + this.z += (v.z - this.z) * alpha; + this.w += (v.w - this.w) * alpha; + return this; + }; + /** + * 两向量求线性插值 + * @param v1 - 第一个向量 + * @param v2 - 第二个向量 + * @param alpha - 插值比例 + * @returns 插值结果 + */ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + this.z = v1.z + (v2.z - v1.z) * alpha; + this.w = v1.w + (v2.w - v1.w) * alpha; + return this; + }; + /** + * 向量求点积 + * @param v - 向量 + * @returns 点积结果 + */ _proto.dot = function dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + }; + /** + * 向量判等 + * @param v - 向量 + * @returns 判等结果 + */ _proto.equals = function equals(v) { + return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w; + }; + /** + * 是否零向量 + * @returns 是否零向量 + */ _proto.isZero = function isZero() { + var eps = NumberEpsilon; + var _this = this, x = _this.x, y = _this.y, z = _this.z, w = _this.w; + return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps && Math.abs(w) <= eps; + }; + /** + * 向量转数组 + * @returns 数组 + */ _proto.toArray = function toArray() { + return [ + this.x, + this.y, + this.z, + this.w + ]; + }; + _proto.toVector3 = function toVector3() { + return new Vector3(this.x, this.y, this.z); + }; + _proto.fill = function fill(array, offset) { + if (offset === void 0) offset = 0; + array[offset] = this.x; + array[offset + 1] = this.y; + array[offset + 2] = this.z; + array[offset + 3] = this.w; + }; + /** + * 生成随机向量 + * @returns 向量 + */ _proto.random = function random() { + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); + return this; + }; + /** + * 变换矩阵作用于向量 + * @param m - 变换矩阵 + * @param [out] - 输出结果,如果没有设置就直接覆盖当前值 + * @returns 向量 + */ _proto.applyMatrix = function applyMatrix(m, out) { + return m.transformVector4(this, out); + }; + /** + * 通过标量数值创建向量 + * @param num - 数值 + * @returns 向量 + */ Vector4.fromNumber = function fromNumber(num) { + return new Vector4().setFromNumber(num); + }; + /** + * 通过数组创建向量 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 向量 + */ Vector4.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Vector4().setFromArray(array, offset); + }; + return Vector4; +}(); +/** + * 四维向量的常量 + */ Vector4$1.ONE = new Vector4$1(1.0, 1.0, 1.0, 1.0); +Vector4$1.ZERO = new Vector4$1(0.0, 0.0, 0.0, 0.0); + +/** + * Mesh 组件 + */ var MeshComponent = /*#__PURE__*/ function(RendererComponent) { + _inherits(MeshComponent, RendererComponent); + function MeshComponent() { + var _this; + _this = RendererComponent.apply(this, arguments) || this; + /** + * 用于点击测试的碰撞器 + */ _this.meshCollider = new MeshCollider(); + // TODO 点击测试后续抽象一个 Collider 组件 + _this.getHitTestParams = function(force) { + var worldMatrix = _this.transform.getWorldMatrix(); + _this.meshCollider.setGeometry(_this.geometry, worldMatrix); + var area = _this.meshCollider.getBoundingBoxData(); + if (area) { + return { + type: area.type, + triangles: area.area + }; + } + }; + return _this; + } + var _proto = MeshComponent.prototype; + _proto.render = function render(renderer) { + if (renderer.renderingData.currentFrame.globalUniforms) { + renderer.setGlobalMatrix("effects_ObjectToWorld", this.transform.getWorldMatrix()); + } + for(var i = 0; i < this.materials.length; i++){ + renderer.drawGeometry(this.geometry, this.materials[i], i); + } + }; + _proto.getBoundingBox = function getBoundingBox() { + var worldMatrix = this.transform.getWorldMatrix(); + this.meshCollider.setGeometry(this.geometry, worldMatrix); + var boundingBox = this.meshCollider.getBoundingBox(); + return boundingBox; + }; + return MeshComponent; +}(RendererComponent); +__decorate([ + serialize() +], MeshComponent.prototype, "geometry", void 0); + +exports.EffectComponent = /*#__PURE__*/ function(MeshComponent) { + _inherits(EffectComponent, MeshComponent); + function EffectComponent(engine) { + var _this; + _this = MeshComponent.call(this, engine) || this; + _this.name = "EffectComponent"; + return _this; + } + var _proto = EffectComponent.prototype; + _proto.onStart = function onStart() { + this.item.getHitTestParams = this.getHitTestParams; + }; + _proto.onUpdate = function onUpdate(dt) { + var time = this.item.time; + var _this_material_getVector4; + var _Time = (_this_material_getVector4 = this.material.getVector4("_Time")) != null ? _this_material_getVector4 : new Vector4$1(); + this.material.setVector4("_Time", _Time.set(time / 20, time, time * 2, time * 3)); + }; + _proto.fromData = function fromData(data) { + MeshComponent.prototype.fromData.call(this, data); + this.material = this.materials[0]; + }; + return EffectComponent; +}(MeshComponent); +exports.EffectComponent = __decorate([ + effectsClass(DataType.EffectComponent) +], exports.EffectComponent); + +exports.PostProcessVolume = /*#__PURE__*/ function(Component) { + _inherits(PostProcessVolume, Component); + function PostProcessVolume(engine) { + var _this; + _this = Component.call(this, engine) || this; + _this.bloom = { + threshold: 0, + intensity: 0, + active: false + }; + _this.vignette = { + intensity: 0, + smoothness: 0, + roundness: 0, + active: false + }; + _this.tonemapping = { + active: false + }; + _this.colorAdjustments = { + brightness: 0, + saturation: 0, + contrast: 0, + active: false + }; + return _this; + } + var _proto = PostProcessVolume.prototype; + _proto.onStart = function onStart() { + var composition = this.item.composition; + if (composition) { + composition.renderFrame.globalVolume = this; + } + }; + return PostProcessVolume; +}(Component); +__decorate([ + serialize() +], exports.PostProcessVolume.prototype, "bloom", void 0); +__decorate([ + serialize() +], exports.PostProcessVolume.prototype, "vignette", void 0); +__decorate([ + serialize() +], exports.PostProcessVolume.prototype, "tonemapping", void 0); +__decorate([ + serialize() +], exports.PostProcessVolume.prototype, "colorAdjustments", void 0); +exports.PostProcessVolume = __decorate([ + effectsClass(DataType.PostProcessVolume) +], exports.PostProcessVolume); + +var Color = /*#__PURE__*/ function() { + function Color(r, g, b, a) { + if (r === void 0) r = 0; + if (g === void 0) g = 0; + if (b === void 0) b = 0; + if (a === void 0) a = 0; + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + var _proto = Color.prototype; + /** + * 设置颜色 + * @param r - r 分量 + * @param g - g 分量 + * @param b - b 分量 + * @param a - a 分量 + * @returns + */ _proto.set = function set(r, g, b, a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + return this; + }; + /** + * 设置零颜色 + * @returns + */ _proto.setZero = function setZero() { + this.r = 0; + this.g = 0; + this.b = 0; + this.a = 0; + return this; + }; + /** + * 通过标量数值设置颜色 + * @param num - 数值 + * @returns + */ _proto.setFromNumber = function setFromNumber(num) { + this.r = num; + this.g = num; + this.b = num; + this.a = num; + return this; + }; + /** + * 通过Vector4创建颜色 + * @param v - Vector4 + * @returns + */ _proto.setFromVector4 = function setFromVector4(v) { + this.r = v.x; + this.g = v.y; + this.b = v.z; + this.a = v.w; + return this; + }; + /** + * 通过数组创建颜色 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + var _array_offset; + this.r = (_array_offset = array[offset]) != null ? _array_offset : 0; + var _array_; + this.g = (_array_ = array[offset + 1]) != null ? _array_ : 0; + var _array_1; + this.b = (_array_1 = array[offset + 2]) != null ? _array_1 : 0; + var _array_2; + this.a = (_array_2 = array[offset + 3]) != null ? _array_2 : 0; + return this; + }; + _proto.setFromHSV = function setFromHSV(hue, saturation, value, alpha) { + if (alpha === void 0) alpha = 1; + var chroma = value * saturation; + var h = hue / 60; + var x = chroma * (1 - Math.abs(h % 2 - 1)); + var r = 0; + var g = 0; + var b = 0; + if (h >= 0 && h <= 1) { + r = chroma; + g = x; + } else if (h >= 1 && h <= 2) { + r = x; + g = chroma; + } else if (h >= 2 && h <= 3) { + g = chroma; + b = x; + } else if (h >= 3 && h <= 4) { + g = x; + b = chroma; + } else if (h >= 4 && h <= 5) { + r = x; + b = chroma; + } else if (h >= 5 && h <= 6) { + r = chroma; + b = x; + } + var m = value - chroma; + return this.set(r + m, g + m, b + m, alpha); + }; + _proto.setFromHexString = function setFromHexString(hex) { + if (hex.substring(0, 1) !== "#" || hex.length !== 9 && hex.length !== 7) { + return this; + } + var r = parseInt(hex.substring(1, 3), 16) / 255.0; + var g = parseInt(hex.substring(3, 5), 16) / 255.0; + var b = parseInt(hex.substring(5, 7), 16) / 255.0; + var a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) / 255.0 : 1.0; + return this.set(r, g, b, a); + }; + /** + * 拷贝颜色 + * @param v - 复制对象 + * @returns 拷贝结果 + */ _proto.copyFrom = function copyFrom(v) { + this.r = v.r; + this.g = v.g; + this.b = v.b; + this.a = v.a; + return this; + }; + /** + * 克隆颜色 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Color(this.r, this.g, this.b, this.a); + }; + /** + * 根据下标设置颜色分量 + * @param index - 下标值 + * @param value - 分量值 + * @returns + */ _proto.setElement = function setElement(index, value) { + switch(index){ + case 0: + this.r = value; + break; + case 1: + this.g = value; + break; + case 2: + this.b = value; + break; + case 3: + this.a = value; + break; + default: + console.error("index is out of range: " + index); + } + return this; + }; + /** + * 根据下标获取颜色分量 + * @param index - 下标 + * @returns 分量值 + */ _proto.getElement = function getElement(index) { + switch(index){ + case 0: + return this.r; + case 1: + return this.g; + case 2: + return this.b; + case 3: + return this.a; + default: + console.error("index is out of range: " + index); + } + return 0; + }; + /** + * 颜色相加 + * @param right - 相加对象,颜色 | 数字 + * @returns 相加结果 + */ _proto.add = function add(right) { + if (typeof right === "number") { + this.r += right; + this.g += right; + this.b += right; + this.a += right; + } else if (_instanceof1(right, Array)) { + this.r += right[0]; + this.g += right[1]; + this.b += right[2]; + this.a += right[3]; + } else { + this.r += right.r; + this.g += right.g; + this.b += right.b; + this.a += right.a; + } + return this; + }; + /** + * 颜色相减 + * @param right - 相减对象,颜色 | 数字 + * @returns 相减结果 + */ _proto.subtract = function subtract(right) { + if (typeof right === "number") { + this.r -= right; + this.g -= right; + this.b -= right; + this.a -= right; + } else if (_instanceof1(right, Array)) { + this.r -= right[0]; + this.g -= right[1]; + this.b -= right[2]; + this.a -= right[3]; + } else { + this.r -= right.r; + this.g -= right.g; + this.b -= right.b; + this.a -= right.a; + } + return this; + }; + /** + * 颜色相乘 + * @param right - 相乘对象,对象 | 数字 + * @returns 颜色 + */ _proto.multiply = function multiply(right) { + if (typeof right === "number") { + this.r *= right; + this.g *= right; + this.b *= right; + this.a *= right; + } else if (_instanceof1(right, Array)) { + this.r *= right[0]; + this.g *= right[1]; + this.b *= right[2]; + this.a *= right[3]; + } else { + this.r *= right.r; + this.g *= right.g; + this.b *= right.b; + this.a *= right.a; + } + return this; + }; + /** + * 颜色相除 + * @param right - 相除对象,对象 | 数字 + * @returns 颜色 + */ _proto.divide = function divide(right) { + if (typeof right === "number") { + this.r /= right; + this.g /= right; + this.b /= right; + this.a /= right; + } else if (_instanceof1(right, Array)) { + this.r /= right[0]; + this.g /= right[1]; + this.b /= right[2]; + this.a /= right[3]; + } else { + this.r /= right.r; + this.g /= right.g; + this.b /= right.b; + this.a /= right.a; + } + return this; + }; + /** + * 颜色缩放 + * @param v - 数字 + * @returns 缩放结果 + */ _proto.scale = function scale(v) { + this.r *= v; + this.g *= v; + this.b *= v; + this.a *= v; + return this; + }; + /** + * 颜色求最小值 + * @param v - 颜色或数值 + * @returns 最小值 + */ _proto.min = function min(v) { + if (typeof v === "number") { + this.r = Math.min(this.r, v); + this.g = Math.min(this.g, v); + this.b = Math.min(this.b, v); + this.a = Math.min(this.a, v); + } else { + this.r = Math.min(this.r, v.r); + this.g = Math.min(this.g, v.g); + this.b = Math.min(this.b, v.b); + this.a = Math.min(this.a, v.a); + } + return this; + }; + /** + * 颜色求最大值 + * @param v - 颜色或数值 + * @returns 最大值 + */ _proto.max = function max(v) { + if (typeof v === "number") { + this.r = Math.max(this.r, v); + this.g = Math.max(this.g, v); + this.b = Math.max(this.b, v); + this.a = Math.max(this.a, v); + } else { + this.r = Math.max(this.r, v.r); + this.g = Math.max(this.g, v.g); + this.b = Math.max(this.b, v.b); + this.a = Math.max(this.a, v.a); + } + return this; + }; + /** + * 颜色阈值约束 + * @param min - 最小值 + * @param max - 最大值 + * @returns 颜色 + */ _proto.clamp = function clamp(min, max) { + return this.max(min).min(max); + }; + /** + * 颜色求线性插值 + * @param v - 颜色 + * @param alpha - 插值比例 + * @returns 插值结果 + */ _proto.lerp = function lerp(v, alpha) { + this.r += (v.r - this.r) * alpha; + this.g += (v.g - this.g) * alpha; + this.b += (v.b - this.b) * alpha; + this.a += (v.a - this.a) * alpha; + return this; + }; + /** + * 计算颜色亮度值 + * @returns 亮度值 + */ _proto.luminance = function luminance() { + return this.r * 0.3 + this.g * 0.59 + this.b * 0.11; + }; + /** + * 颜色判等 + * @param v - 颜色 + * @returns 判等结果 + */ _proto.equals = function equals(v) { + return v.r === this.r && v.g === this.g && v.b === this.b && v.a === this.a; + }; + _proto.toLinear = function toLinear() { + this.r = Color.gammaToLinear(this.r); + this.g = Color.gammaToLinear(this.g); + this.b = Color.gammaToLinear(this.b); + return this; + }; + _proto.toGamma = function toGamma() { + this.r = Color.linearToGamma(this.r); + this.g = Color.linearToGamma(this.g); + this.b = Color.linearToGamma(this.b); + return this; + }; + /** + * 颜色转数组 + * @returns 数组 + */ _proto.toArray = function toArray() { + return [ + this.r, + this.g, + this.b, + this.a + ]; + }; + _proto.toVector4 = function toVector4() { + return new Vector4$1(this.r, this.g, this.b, this.a); + }; + /** + * RGB 颜色空间转 HSV + * @param result HSV 值 + */ _proto.toHSV = function toHSV() { + var _this = this, r = _this.r, g = _this.g, b = _this.b, a = _this.a; + var max = Math.max(r, g, b); + var min = Math.min(r, g, b); + var v = max; + var dm = max - min; + var h = 0; + var s = 0; + if (max !== 0) { + s = dm / max; + } + if (max != min) { + if (max == r) { + h = (g - b) / dm; + if (g < b) { + h += 6; + } + } else if (max == g) { + h = (b - r) / dm + 2; + } else if (max == b) { + h = (r - g) / dm + 4; + } + h *= 60; + } + return new Color(h, s, v, a); + }; + _proto.toHexString = function toHexString(includeAlpha) { + if (includeAlpha === void 0) includeAlpha = true; + var R = Color.ToHex(Math.round(this.r * 255)); + var G = Color.ToHex(Math.round(this.g * 255)); + var B = Color.ToHex(Math.round(this.b * 255)); + var A = Color.ToHex(Math.round(this.a * 255)); + if (includeAlpha) { + return "#" + R + G + B + A; + } else { + return "#" + R + G + B; + } + }; + _proto.fill = function fill(array, offset) { + if (offset === void 0) offset = 0; + array[offset] = this.r; + array[offset + 1] = this.g; + array[offset + 2] = this.b; + array[offset + 3] = this.a; + }; + /** + * 通过标量数值创建颜色 + * @param num - 数值 + * @returns + */ Color.fromNumber = function fromNumber(num) { + return new Color().setFromNumber(num); + }; + /** + * 通过数组创建颜色 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns + */ Color.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Color().setFromArray(array, offset); + }; + /** + * 通过 hex 字符串创建颜色 + * @param hex - hex 字符串 + * @returns + */ Color.fromHexString = function fromHexString(hex) { + return new Color().setFromHexString(hex); + }; + Color.fromHSV = function fromHSV(hue, saturation, value, alpha) { + if (alpha === void 0) alpha = 1; + return new Color().setFromHSV(hue, saturation, value, alpha); + }; + /** + * 颜色值从 Gamma 空间转到线性空间 + * @param v - Gamma 空间颜色值 + * @returns 线性空间颜色值 + */ Color.gammaToLinear = function gammaToLinear(v) { + if (v <= 0.0) { + return 0.0; + } else if (v <= 0.04045) { + return v / 12.92; + } else if (v < 1.0) { + return Math.pow((v + 0.055) / 1.055, 2.4); + } else { + return Math.pow(v, 2.4); + } + }; + /** + * 颜色值从线性空间转到 Gamma 空间 + * @param value - 线性空间颜色值 + * @returns Gamma 空间颜色值 + */ Color.linearToGamma = function linearToGamma(value) { + if (value <= 0.0) { + return 0.0; + } else if (value < 0.0031308) { + return 12.92 * value; + } else if (value < 1.0) { + return 1.055 * Math.pow(value, 0.41666) - 0.055; + } else { + return Math.pow(value, 0.41666); + } + }; + Color.ToHex = function ToHex(i) { + var str = i.toString(16); + if (i <= 15) { + return ("0" + str).toUpperCase(); + } + return str.toUpperCase(); + }; + return Color; +}(); +/** + * 颜色的常量 + */ Color.BLACK = new Color(0, 0, 0, 1) // 纯黑色 +; +Color.BLUE = new Color(0, 0, 1, 1) // 纯蓝色 +; +Color.CLEAR = new Color(0, 0, 0, 0) // 完全透明 +; +Color.CYAN = new Color(0, 1, 1, 1) // 青色 +; +Color.GRAY = new Color(0.5, 0.5, 0.5, 1) // 灰色 +; +Color.GREEN = new Color(0, 1, 0, 1) // 纯绿色 +; +Color.MAGENTA = new Color(1, 0, 1, 1) // 洋红色 +; +Color.RED = new Color(1, 0, 0, 1) // 纯红色 +; +Color.WHITE = new Color(1, 1, 1, 1) // 纯白色 +; +Color.YELLOW = new Color(1, 0.92, 0.016, 1) // 黄色 +; + +/** + * 四元数 + */ var Quaternion = /*#__PURE__*/ function() { + function Quaternion(x, y, z, w) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + if (z === void 0) z = 0; + if (w === void 0) w = 1; + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + var _proto = Quaternion.prototype; + /** + * 四元数设置 + * @param x - x 分量 + * @param y - y 分量 + * @param z - z 分量 + * @param w - w 分量 + * @returns 四元数 + */ _proto.set = function set(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + return this; + }; + /** + * 通过欧拉角设置四元数 + * @param euler - 欧拉角 + * @returns + */ _proto.setFromEuler = function setFromEuler(euler) { + euler.toQuaternion(this); + return this; + }; + /** + * 通过旋转轴和旋转角度设置四元数 + * @param axis - 旋转轴 + * @param angle - 旋转角度(弧度) + * @returns + */ _proto.setFromAxisAngle = function setFromAxisAngle(axis, angle) { + var halfAngle = angle / 2; + var s = Math.sin(halfAngle); + var v = Quaternion.tempVec0; + v.copyFrom(axis).normalize(); + this.x = v.x * s; + this.y = v.y * s; + this.z = v.z * s; + this.w = Math.cos(halfAngle); + return this; + }; + /** + * 通过 Vector4Like 创建四元数 + * @param v - Vector4Like + * @returns + */ _proto.setFromVector4 = function setFromVector4(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w; + return this; + }; + /** + * 通过数组设置四元数 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + this.x = array[offset]; + this.y = array[offset + 1]; + this.z = array[offset + 2]; + this.w = array[offset + 3]; + return this; + }; + /** + * 通过矩阵设置四元数 + * @param m - 矩阵 + * @returns + */ _proto.setFromRotationMatrix = function setFromRotationMatrix(m) { + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + var te = m.elements; + var m11 = te[0]; + var m12 = te[4]; + var m13 = te[8]; + var m21 = te[1]; + var m22 = te[5]; + var m23 = te[9]; + var m31 = te[2]; + var m32 = te[6]; + var m33 = te[10]; + var trace = m11 + m22 + m33; + if (trace > 0) { + var s = 0.5 / Math.sqrt(trace + 1.0); + this.w = 0.25 / s; + this.x = (m32 - m23) * s; + this.y = (m13 - m31) * s; + this.z = (m21 - m12) * s; + } else if (m11 > m22 && m11 > m33) { + var s1 = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33); + this.w = (m32 - m23) / s1; + this.x = 0.25 * s1; + this.y = (m12 + m21) / s1; + this.z = (m13 + m31) / s1; + this.negate(); + } else if (m22 > m33) { + var s2 = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33); + this.w = (m13 - m31) / s2; + this.x = (m12 + m21) / s2; + this.y = 0.25 * s2; + this.z = (m23 + m32) / s2; + this.negate(); + } else { + var s3 = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22); + this.w = (m21 - m12) / s3; + this.x = (m13 + m31) / s3; + this.y = (m23 + m32) / s3; + this.z = 0.25 * s3; + this.negate(); + } + // 兼容原先数学库 + return this; + }; + /** + * 通过开始和结束向量设置四元数 + * @param from - 开始向量 + * @param to - 结束向量 + * @returns + */ _proto.setFromUnitVectors = function setFromUnitVectors(from, to) { + // assumes direction vectors vFrom and vTo are normalized + var r = from.dot(to) + 1; + if (r < Number.EPSILON) { + r = 0; + if (Math.abs(from.x) > Math.abs(from.z)) { + this.x = -from.y; + this.y = from.x; + this.z = 0; + this.w = r; + } else { + this.x = 0; + this.y = -from.z; + this.z = from.y; + this.w = r; + } + } else { + this.x = from.y * to.z - from.z * to.y; + this.y = from.z * to.x - from.x * to.z; + this.z = from.x * to.y - from.y * to.x; + this.w = r; + } + return this.normalize(); + }; + /** + * 四元数拷贝 + * @param quat - 拷贝目标四元数 + * @returns 拷贝四元数 + */ _proto.copyFrom = function copyFrom(quat) { + this.x = quat.x; + this.y = quat.y; + this.z = quat.z; + this.w = quat.w; + return this; + }; + /** + * 四元数克隆 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Quaternion(this.x, this.y, this.z, this.w); + }; + /** + * 四元数间的夹角计算 + * @param other - 其他四元数 + * @returns 夹角 + */ _proto.angleTo = function angleTo(other) { + return 2 * Math.acos(Math.abs(clamp$1(this.dot(other), -1, 1))); + }; + /** + * 四元数向目标旋转 + * @param q - 四元数 + * @param step - 旋转弧度 + * @returns 目标四元数 + */ _proto.rotateTowards = function rotateTowards(q, step) { + var angle = this.angleTo(q); + if (angle === 0) { + return this; + } + var t = Math.min(1, step / angle); + this.slerp(q, t); + return this; + }; + /** + * 四元数单位化 + * @returns 单位四元数 + */ _proto.identity = function identity() { + return this.set(0, 0, 0, 1); + }; + /** + * 四元数求逆 + * @returns 四元数的逆 + */ _proto.invert = function invert() { + return this.conjugate(); + }; + /** + * 四元数取负 + * @returns 负四元数 + */ _proto.negate = function negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + this.w = -this.w; + return this; + }; + /** + * 四元数求共轭值 + * @returns 四元数的共轭值 + */ _proto.conjugate = function conjugate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + /** + * 四元数点乘结果 + * @param v + * @return + */ _proto.dot = function dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + }; + /** + * 四元数的模平方 + * @return + */ _proto.lengthSquared = function lengthSquared() { + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + }; + /** + * 四元数的欧式长度 + * @returns 长度 + */ _proto.length = function length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + }; + /** + * 四元数归一化 + * @returns 归一化值 + */ _proto.normalize = function normalize() { + var l = this.length(); + if (l === 0) { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 1; + } else { + l = 1 / l; + this.x = this.x * l; + this.y = this.y * l; + this.z = this.z * l; + this.w = this.w * l; + } + return this; + }; + /** + * 四元数右乘 + * @param right - 右乘的四元数 + * @returns + */ _proto.multiply = function multiply(right) { + return this.multiplyQuaternions(this, right); + }; + /** + * 四元数左乘 + * @param left - 左乘的四元数 + * @returns + */ _proto.premultiply = function premultiply(left) { + return this.multiplyQuaternions(left, this); + }; + /** + * 四元数乘法 + * @param left - 四元数 + * @param right - 四元数 + * @returns 四元数 + */ _proto.multiplyQuaternions = function multiplyQuaternions(left, right) { + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + var qax = left.x; + var qay = left.y; + var qaz = left.z; + var qaw = left.w; + var qbx = right.x; + var qby = right.y; + var qbz = right.z; + var qbw = right.w; + this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + return this; + }; + /** + * 四元数线性插值 + * @see http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + * @param other - 四元数 + * @param t - 插值比 + * @returns 插值结果 + */ _proto.slerp = function slerp(other, t) { + if (t === 0) { + return this; + } + if (t === 1) { + return this.copyFrom(other); + } + var _this = this, x = _this.x, y = _this.y, z = _this.z, w = _this.w; + var cosHalfTheta = w * other.w + x * other.x + y * other.y + z * other.z; + if (cosHalfTheta < 0) { + this.w = -other.w; + this.x = -other.x; + this.y = -other.y; + this.z = -other.z; + cosHalfTheta = -cosHalfTheta; + } else { + this.copyFrom(other); + } + if (cosHalfTheta >= 1.0) { + this.w = w; + this.x = x; + this.y = y; + this.z = z; + return this; + } + var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + if (sqrSinHalfTheta <= Number.EPSILON) { + var s = 1 - t; + this.w = s * w + t * this.w; + this.x = s * x + t * this.x; + this.y = s * y + t * this.y; + this.z = s * z + t * this.z; + this.normalize(); + return this; + } + var sinHalfTheta = Math.sqrt(sqrSinHalfTheta); + var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta); + var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta; + var ratioB = Math.sin(t * halfTheta) / sinHalfTheta; + this.w = w * ratioA + this.w * ratioB; + this.x = x * ratioA + this.x * ratioB; + this.y = y * ratioA + this.y * ratioB; + this.z = z * ratioA + this.z * ratioB; + return this; + }; + /** + * 两个四元数的线性插值 + * @param qa - 四元数 + * @param qb - 四元数 + * @param t - 插值比 + */ _proto.slerpQuaternions = function slerpQuaternions(qa, qb, t) { + this.copyFrom(qa).slerp(qb, t); + }; + /** + * 通过四元数旋转向量 + * @param v - 待旋转向量 + * @param [out] - 旋转结果,如果没有传入直接覆盖输入值 + * @returns + */ _proto.rotateVector3 = function rotateVector3(v, out) { + var _this = this, qx = _this.x, qy = _this.y, qz = _this.z, qw = _this.w; + var vx = v.x, vy = v.y, vz = v.z; + var ix = qw * vx + qy * vz - qz * vy; + var iy = qw * vy + qz * vx - qx * vz; + var iz = qw * vz + qx * vy - qy * vx; + var iw = -qx * vx - qy * vy - qz * vz; + var res = out != null ? out : v; + res.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; + res.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; + res.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; + return res; + }; + /** + * 四元数判等 + * @param quaternion - 四元数 + * @returns 判等结果 + */ _proto.equals = function equals(quaternion) { + return quaternion.x === this.x && quaternion.y === this.y && quaternion.z === this.z && quaternion.w === this.w; + }; + /** + * 四元数保存为数组 + * @returns + */ _proto.toArray = function toArray() { + return [ + this.x, + this.y, + this.z, + this.w + ]; + }; + /** + * 四元数转四维向量数组 + * @param vec - 目标保存对象 + * @returns 保存结果 + */ _proto.toVector4 = function toVector4(vec) { + return vec.set(this.x, this.y, this.z, this.w); + }; + /** + * 四元数转欧拉角 + * @param euler - 目标欧拉角 + * @returns 欧拉角 + */ _proto.toEuler = function toEuler(euler) { + return euler.setFromQuaternion(this); + }; + /** + * 四元数转矩阵 + * @param mat - 目标矩阵 + * @returns + */ _proto.toMatrix4 = function toMatrix4(mat) { + return mat.compose(Vector3.ZERO, this, Vector3.ONE); + }; + /** + * 通过欧拉角创建四元数 + * @param euler - 欧拉角 + * @returns 四元数 + */ Quaternion.fromEuler = function fromEuler(euler) { + return new Quaternion().setFromEuler(euler); + }; + /** + * 通过旋转轴和旋转角度创建四元数 + * @param axis - 旋转轴 + * @param angle - 旋转角(弧度值) + * @returns 四元数 + */ Quaternion.fromAxisAngle = function fromAxisAngle(axis, angle) { + return new Quaternion().setFromAxisAngle(axis, angle); + }; + /** + * 通过 Vector4Like 创建四元数 + * @param v - Vector4Like + * @returns 四元数 + */ Quaternion.fromVector4 = function fromVector4(v) { + return new Quaternion().setFromVector4(v); + }; + /** + * 通过数组创建四元数 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 四元数 + */ Quaternion.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Quaternion().setFromArray(array, offset); + }; + /** + * 通过旋转矩阵创建四元数 + * @param m - 旋转矩阵 + * @returns 四元数 + */ Quaternion.fromRotationMatrix = function fromRotationMatrix(m) { + return new Quaternion().setFromRotationMatrix(m); + }; + /** + * 通过开始和结束向量创建四元数 + * @param from - 开始向量 + * @param to - 结束向量 + * @returns + */ Quaternion.fromUnitVectors = function fromUnitVectors(from, to) { + return new Quaternion().setFromUnitVectors(from, to); + }; + return Quaternion; +}(); +Quaternion.tempVec0 = new Vector3(); + +/** + * 四阶矩阵(列优先矩阵) + */ var Matrix4$1 = /*#__PURE__*/ function() { + function Matrix4(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44) { + if (m11 === void 0) m11 = 1; + if (m21 === void 0) m21 = 0; + if (m31 === void 0) m31 = 0; + if (m41 === void 0) m41 = 0; + if (m12 === void 0) m12 = 0; + if (m22 === void 0) m22 = 1; + if (m32 === void 0) m32 = 0; + if (m42 === void 0) m42 = 0; + if (m13 === void 0) m13 = 0; + if (m23 === void 0) m23 = 0; + if (m33 === void 0) m33 = 1; + if (m43 === void 0) m43 = 0; + if (m14 === void 0) m14 = 0; + if (m24 === void 0) m24 = 0; + if (m34 === void 0) m34 = 0; + if (m44 === void 0) m44 = 1; + this.elements = [ + m11, + m21, + m31, + m41, + m12, + m22, + m32, + m42, + m13, + m23, + m33, + m43, + m14, + m24, + m34, + m44 + ]; + } + var _proto = Matrix4.prototype; + /** + * 设置矩阵 + * @param m11 - 第 1 行,第 1 列 + * @param m21 - 第 2 行,第 1 列 + * @param m31 - 第 3 行,第 1 列 + * @param m41 - 第 4 行,第 1 列 + * @param m12 - 第 1 行,第 2 列 + * @param m22 - 第 2 行,第 2 列 + * @param m32 - 第 3 行,第 2 列 + * @param m42 - 第 4 行,第 2 列 + * @param m13 - 第 1 行,第 3 列 + * @param m23 - 第 2 行,第 3 列 + * @param m33 - 第 3 行,第 3 列 + * @param m43 - 第 4 行,第 3 列 + * @param m14 - 第 1 行,第 4 列 + * @param m24 - 第 2 行,第 4 列 + * @param m34 - 第 3 行,第 4 列 + * @param m44 - 第 4 行,第 4 列 + * @returns 矩阵 + */ _proto.set = function set(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44) { + var e = this.elements; + e[0] = m11; + e[1] = m21; + e[2] = m31; + e[3] = m41; + e[4] = m12; + e[5] = m22; + e[6] = m32; + e[7] = m42; + e[8] = m13; + e[9] = m23; + e[10] = m33; + e[11] = m43; + e[12] = m14; + e[13] = m24; + e[14] = m34; + e[15] = m44; + return this; + }; + /** + * 通过行优先数据设置矩阵 + * @param m11 - 第 1 行,第 1 列 + * @param m12 - 第 1 行,第 2 列 + * @param m13 - 第 1 行,第 3 列 + * @param m14 - 第 1 行,第 4 列 + * @param m21 - 第 2 行,第 1 列 + * @param m22 - 第 2 行,第 2 列 + * @param m23 - 第 2 行,第 3 列 + * @param m24 - 第 2 行,第 4 列 + * @param m31 - 第 3 行,第 1 列 + * @param m32 - 第 3 行,第 2 列 + * @param m33 - 第 3 行,第 3 列 + * @param m34 - 第 3 行,第 4 列 + * @param m41 - 第 4 行,第 1 列 + * @param m42 - 第 4 行,第 2 列 + * @param m43 - 第 4 行,第 3 列 + * @param m44 - 第 4 行,第 4 列 + * @returns 矩阵 + */ _proto.setFromRowMajorData = function setFromRowMajorData(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) { + var e = this.elements; + e[0] = m11; + e[4] = m12; + e[8] = m13; + e[12] = m14; + e[1] = m21; + e[5] = m22; + e[9] = m23; + e[13] = m24; + e[2] = m31; + e[6] = m32; + e[10] = m33; + e[14] = m34; + e[3] = m41; + e[7] = m42; + e[11] = m43; + e[15] = m44; + return this; + }; + /** + * 通过四个列向量设置矩阵 + * @param c1 - 第一列 + * @param c2 - 第二列 + * @param c3 - 第三列 + * @param c4 - 第四列 + * @returns 矩阵 + */ _proto.setFromColumnVectors = function setFromColumnVectors(c1, c2, c3, c4) { + return this.set(c1.x, c1.y, c1.z, c1.w, c2.x, c2.y, c2.z, c2.w, c3.x, c3.y, c3.z, c3.w, c4.x, c4.y, c4.z, c4.w); + }; + /** + * 通过三维矩阵设置矩阵 + * @param m - 三维矩阵 + * @returns 设置结果 + */ _proto.setFromMatrix3 = function setFromMatrix3(m) { + var me = m.elements; + this.set(me[0], me[1], me[2], 0, me[3], me[4], me[5], 0, me[6], me[7], me[8], 0, 0, 0, 0, 1); + return this; + }; + /** + * 通过数组设置矩阵 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 矩阵 + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + for(var i = 0; i < 16; i++){ + this.elements[i] = array[offset + i]; + } + return this; + }; + /** + * 通过缩放设置矩阵 + * @param x - x 方向缩放 + * @param y - y 方向缩放 + * @param z - z 方向缩放 + * @returns 缩放矩阵 + */ _proto.setFromScale = function setFromScale(x, y, z) { + return this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1); + }; + /** + * 通过平移设置矩阵 + * @param x - x 方向平移 + * @param y - y 方向平移 + * @param z - z 方向平移 + * @returns 平移矩阵 + */ _proto.setFromTranslation = function setFromTranslation(x, y, z) { + return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1); + }; + /** + * 通过 x 轴旋转角度设置矩阵 + * @param theta - x 轴旋转弧度 + * @returns 矩阵 + */ _proto.setFromRotationX = function setFromRotationX(theta) { + var c = Math.cos(theta); + var s = Math.sin(theta); + return this.set(1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1); + }; + /** + * 通过 y 轴旋转角度设置矩阵 + * @param theta - y 轴旋转弧度 + * @returns 矩阵 + */ _proto.setFromRotationY = function setFromRotationY(theta) { + var c = Math.cos(theta); + var s = Math.sin(theta); + return this.set(c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1); + }; + /** + * 通过 z 轴旋转角度设置矩阵 + * @param theta - z 轴旋转弧度 + * @returns 矩阵 + */ _proto.setFromRotationZ = function setFromRotationZ(theta) { + var c = Math.cos(theta); + var s = Math.sin(theta); + return this.set(c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + }; + /** + * 根据三维旋转轴与弧度设置矩阵 + * @param axis - 三维旋转轴 + * @param angle - 旋转弧度 + * @returns 矩阵 + */ _proto.setFromRotationAxis = function setFromRotationAxis(axis, angle) { + // Based on http://www.gamedev.net/reference/articles/article1199.asp + var v = Matrix4.tempVec0; + v.copyFrom(axis).normalize(); + var c = Math.cos(angle); + var s = Math.sin(angle); + var t = 1 - c; + var x = v.x, y = v.y, z = v.z; + var tx = t * x; + var ty = t * y; + return this.set(tx * x + c, tx * y + s * z, tx * z - s * y, 0, tx * y - s * z, ty * y + c, ty * z + s * x, 0, tx * z + s * y, ty * z - s * x, t * z * z + c, 0, 0, 0, 0, 1); + }; + /** + * 通过欧拉角设置矩阵 + * @param euler - 欧拉角 + * @returns 矩阵 + */ _proto.setFromEuler = function setFromEuler(euler) { + euler.toMatrix4(this); + return this; + }; + /** + * 通过四元数设置矩阵 + * @param quat - 四元数 + * @returns 矩阵 + */ _proto.setFromQuaternion = function setFromQuaternion(quat) { + return this.compose(Vector3.ZERO, quat, Vector3.ONE); + }; + /** + * 通过倾斜参数设置矩阵 + * @param x - x 方向倾斜分量 + * @param y - y 方向倾斜分量 + * @param z - z 方向倾斜分量 + * @returns 倾斜矩阵 + */ _proto.setFromShear = function setFromShear(x, y, z) { + return this.set(1, x, x, 0, y, 1, y, 0, z, z, 1, 0, 0, 0, 0, 1); + }; + /** + * 通过基轴设置矩阵 + * @param xAxis - x 轴 + * @param yAxis - y 轴 + * @param zAxis - z 轴 + * @returns 倾斜矩阵 + */ _proto.setFromBasis = function setFromBasis(xAxis, yAxis, zAxis) { + return this.set(xAxis.x, xAxis.y, xAxis.z, 0, yAxis.x, yAxis.y, yAxis.z, 0, zAxis.x, zAxis.y, zAxis.z, 0, 0, 0, 0, 1); + }; + /** + * 矩阵清零 + * @returns 零矩阵 + */ _proto.setZero = function setZero() { + for(var i = 0; i < 16; i++){ + this.elements[i] = 0; + } + return this; + }; + /** + * 矩阵单位化 + * @returns 单位矩阵 + */ _proto.identity = function identity() { + return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + }; + /** + * 单位阵判断 + * @returns 判断结果 + */ _proto.isIdentity = function isIdentity() { + var e = this.elements; + return e[0] === 1 && e[4] === 0 && e[8] === 0 && e[12] === 0 && e[1] === 0 && e[5] === 1 && e[9] === 0 && e[13] === 0 && e[2] === 0 && e[6] === 0 && e[10] === 1 && e[14] === 0 && e[3] === 0 && e[7] === 0 && e[11] === 0 && e[15] === 1; + }; + /** + * 矩阵克隆 + * @returns 克隆结果 + */ _proto.clone = function clone() { + var e = this.elements; + return new Matrix4(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], e[10], e[11], e[12], e[13], e[14], e[15]); + }; + /** + * 矩阵复制 + * @param m - 复制对象 + * @returns 复制结果 + */ _proto.copyFrom = function copyFrom(m) { + this.elements = [].concat(m.elements); + return this; + }; + /** + * 得到列向量 + * @param i - 列向量索引,从 0 开始 + * @param v + * @returns 矩阵 + */ _proto.getColumnVector = function getColumnVector(i, v) { + return v.set(this.elements[i * 4], this.elements[i * 4 + 1], this.elements[i * 4 + 2], this.elements[i * 4 + 3]); + }; + /** + * 设置相机矩阵 + * @param eye - 相机位置 + * @param target - 目标位置 + * @param up - 相机方向 + * @returns 矩阵 + */ _proto.lookAt = function lookAt(eye, target, up) { + var vX = Matrix4.tempVec0; + var vY = Matrix4.tempVec1; + var vZ = Matrix4.tempVec2; + vZ.subtractVectors(eye, target); + vZ.normalize(); + vX.crossVectors(up, vZ); + vX.normalize(); + vY.crossVectors(vZ, vX); + var te = this.elements; + te[0] = vX.x; + te[1] = vY.x; + te[2] = vZ.x; + te[3] = 0; + te[4] = vX.y; + te[5] = vY.y; + te[6] = vZ.y; + te[7] = 0; + te[8] = vX.z; + te[9] = vY.z; + te[10] = vZ.z; + te[11] = 0; + te[12] = -vX.dot(eye); + te[13] = -vY.dot(eye); + te[14] = -vZ.dot(eye); + te[15] = 1; + return this; + }; + /** + * 矩阵乘比例后相加 + * @param right - 矩阵 + * @param s - 比例 + * @returns 相加结果 + */ _proto.addScaledMatrix = function addScaledMatrix(right, s) { + var te = this.elements; + var re = right.elements; + for(var i = 0; i < 16; i++){ + te[i] += re[i] * s; + } + return this; + }; + /** + * 矩阵右乘 + * @param right - 右侧矩阵或数值 + * @returns 右乘结果 + */ _proto.multiply = function multiply(right) { + if (typeof right === "number") { + for(var i = 0; i < 16; i++){ + this.elements[i] *= right; + } + return this; + } else { + return this.multiplyMatrices(this, right); + } + }; + /** + * 矩阵左乘 + * @param left - 左侧矩阵 + * @returns 左乘结果 + */ _proto.premultiply = function premultiply(left) { + return this.multiplyMatrices(left, this); + }; + /** + * 矩阵相乘 + * @param left - 矩阵 + * @param right - 矩阵 + * @returns 相乘结果 + */ _proto.multiplyMatrices = function multiplyMatrices(left, right) { + var ae = left.elements; + var be = right.elements; + var te = this.elements; + var a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; + var a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; + var a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; + var a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; + var b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; + var b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; + var b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; + var b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; + te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + return this; + }; + /** + * 矩阵缩放 + * @param s - 缩放比例 + * @returns 缩放结果 + */ _proto.multiplyScalar = function multiplyScalar(s) { + var e = this.elements; + e[0] *= s; + e[4] *= s; + e[8] *= s; + e[12] *= s; + e[1] *= s; + e[5] *= s; + e[9] *= s; + e[13] *= s; + e[2] *= s; + e[6] *= s; + e[10] *= s; + e[14] *= s; + e[3] *= s; + e[7] *= s; + e[11] *= s; + e[15] *= s; + return this; + }; + /** + * 矩阵求行列式值 + * @returns 行列式值 + */ _proto.determinant = function determinant() { + var e = this.elements; + var m11 = e[0], m12 = e[4], m13 = e[8], m14 = e[12]; + var m21 = e[1], m22 = e[5], m23 = e[9], m24 = e[13]; + var m31 = e[2], m32 = e[6], m33 = e[10], m34 = e[14]; + var m41 = e[3], m42 = e[7], m43 = e[11], m44 = e[15]; + return m41 * (+m14 * m23 * m32 - m13 * m24 * m32 - m14 * m22 * m33 + m12 * m24 * m33 + m13 * m22 * m34 - m12 * m23 * m34) + m42 * (+m11 * m23 * m34 - m11 * m24 * m33 + m14 * m21 * m33 - m13 * m21 * m34 + m13 * m24 * m31 - m14 * m23 * m31) + m43 * (+m11 * m24 * m32 - m11 * m22 * m34 - m14 * m21 * m32 + m12 * m21 * m34 + m14 * m22 * m31 - m12 * m24 * m31) + m44 * (-m13 * m22 * m31 - m11 * m23 * m32 + m11 * m22 * m33 + m13 * m21 * m32 - m12 * m21 * m33 + m12 * m23 * m31); + }; + /** + * 矩阵转置 + * @returns 转置结果 + */ _proto.transpose = function transpose() { + var e = this.elements; + var t; + t = e[1]; + e[1] = e[4]; + e[4] = t; + t = e[2]; + e[2] = e[8]; + e[8] = t; + t = e[3]; + e[3] = e[12]; + e[12] = t; + // + t = e[6]; + e[6] = e[9]; + e[9] = t; + t = e[7]; + e[7] = e[13]; + e[13] = t; + t = e[11]; + e[11] = e[14]; + e[14] = t; + return this; + }; + /** + * 矩阵求逆 + * @returns 逆矩阵 + */ _proto.invert = function invert() { + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var e = this.elements; + var m11 = e[0], m21 = e[1], m31 = e[2], m41 = e[3]; + var m12 = e[4], m22 = e[5], m32 = e[6], m42 = e[7]; + var m13 = e[8], m23 = e[9], m33 = e[10], m43 = e[11]; + var m14 = e[12], m24 = e[13], m34 = e[14], m44 = e[15]; + var t11 = m23 * m34 * m42 - m24 * m33 * m42 + m24 * m32 * m43 - m22 * m34 * m43 - m23 * m32 * m44 + m22 * m33 * m44; + var t12 = m14 * m33 * m42 - m13 * m34 * m42 - m14 * m32 * m43 + m12 * m34 * m43 + m13 * m32 * m44 - m12 * m33 * m44; + var t13 = m13 * m24 * m42 - m14 * m23 * m42 + m14 * m22 * m43 - m12 * m24 * m43 - m13 * m22 * m44 + m12 * m23 * m44; + var t14 = m14 * m23 * m32 - m13 * m24 * m32 - m14 * m22 * m33 + m12 * m24 * m33 + m13 * m22 * m34 - m12 * m23 * m34; + var det = m11 * t11 + m21 * t12 + m31 * t13 + m41 * t14; + if (det === 0) { + return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + var detInv = 1 / det; + e[0] = t11 * detInv; + e[1] = (m24 * m33 * m41 - m23 * m34 * m41 - m24 * m31 * m43 + m21 * m34 * m43 + m23 * m31 * m44 - m21 * m33 * m44) * detInv; + e[2] = (m22 * m34 * m41 - m24 * m32 * m41 + m24 * m31 * m42 - m21 * m34 * m42 - m22 * m31 * m44 + m21 * m32 * m44) * detInv; + e[3] = (m23 * m32 * m41 - m22 * m33 * m41 - m23 * m31 * m42 + m21 * m33 * m42 + m22 * m31 * m43 - m21 * m32 * m43) * detInv; + e[4] = t12 * detInv; + e[5] = (m13 * m34 * m41 - m14 * m33 * m41 + m14 * m31 * m43 - m11 * m34 * m43 - m13 * m31 * m44 + m11 * m33 * m44) * detInv; + e[6] = (m14 * m32 * m41 - m12 * m34 * m41 - m14 * m31 * m42 + m11 * m34 * m42 + m12 * m31 * m44 - m11 * m32 * m44) * detInv; + e[7] = (m12 * m33 * m41 - m13 * m32 * m41 + m13 * m31 * m42 - m11 * m33 * m42 - m12 * m31 * m43 + m11 * m32 * m43) * detInv; + e[8] = t13 * detInv; + e[9] = (m14 * m23 * m41 - m13 * m24 * m41 - m14 * m21 * m43 + m11 * m24 * m43 + m13 * m21 * m44 - m11 * m23 * m44) * detInv; + e[10] = (m12 * m24 * m41 - m14 * m22 * m41 + m14 * m21 * m42 - m11 * m24 * m42 - m12 * m21 * m44 + m11 * m22 * m44) * detInv; + e[11] = (m13 * m22 * m41 - m12 * m23 * m41 - m13 * m21 * m42 + m11 * m23 * m42 + m12 * m21 * m43 - m11 * m22 * m43) * detInv; + e[12] = t14 * detInv; + e[13] = (m13 * m24 * m31 - m14 * m23 * m31 + m14 * m21 * m33 - m11 * m24 * m33 - m13 * m21 * m34 + m11 * m23 * m34) * detInv; + e[14] = (m14 * m22 * m31 - m12 * m24 * m31 - m14 * m21 * m32 + m11 * m24 * m32 + m12 * m21 * m34 - m11 * m22 * m34) * detInv; + e[15] = (m12 * m23 * m31 - m13 * m22 * m31 + m13 * m21 * m32 - m11 * m23 * m32 - m12 * m21 * m33 + m11 * m22 * m33) * detInv; + return this; + }; + /** + * 提取基轴 + * @param xAxis - 提取的 x 轴 + * @param yAxis - 提取的 y 轴 + * @param zAxis - 提取的 z 轴 + * @returns + */ _proto.extractBasis = function extractBasis(xAxis, yAxis, zAxis) { + var te = this.elements; + xAxis.set(te[0], te[1], te[2]); + yAxis.set(te[4], te[5], te[6]); + zAxis.set(te[8], te[9], te[10]); + return this; + }; + /** + * 根据基础信息组装矩阵 + * @param translation - 位置信息 + * @param rotation - 旋转信息 + * @param scale - 缩放信息 + * @param [anchor] - 锚点信息 + * @returns 矩阵 + */ _proto.compose = function compose(translation, rotation, scale, anchor) { + if (anchor === void 0) anchor = Vector3.ZERO; + var te = this.elements; + var x = rotation.x, y = rotation.y, z = rotation.z, w = rotation.w; + var l = -anchor.x; + var m = -anchor.y; + var n = -anchor.z; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = scale.x, sy = scale.y, sz = scale.z; + te[0] = (1 - (yy + zz)) * sx; + te[1] = (xy + wz) * sx; + te[2] = (xz - wy) * sx; + te[3] = 0; + te[4] = (xy - wz) * sy; + te[5] = (1 - (xx + zz)) * sy; + te[6] = (yz + wx) * sy; + te[7] = 0; + te[8] = (xz + wy) * sz; + te[9] = (yz - wx) * sz; + te[10] = (1 - (xx + yy)) * sz; + te[11] = 0; + te[12] = l * te[0] + m * te[4] + n * te[8] - l + translation.x; + te[13] = l * te[1] + m * te[5] + n * te[9] - m + translation.y; + te[14] = l * te[2] + m * te[6] + n * te[10] - n + translation.z; + return this; + }; + /** + * 矩阵拆分为基础信息 + * @param translation - 位置信息 + * @param rotation - 旋转信息 + * @param scale - 缩放信息 + * @returns 矩阵 + */ _proto.decompose = function decompose(translation, rotation, scale) { + var v = Matrix4.tempVec0; + var te = this.elements; + var sx = v.set(te[0], te[1], te[2]).length(); + var sy = v.set(te[4], te[5], te[6]).length(); + var sz = v.set(te[8], te[9], te[10]).length(); + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if (det < 0) { + sx = -sx; + } + translation.x = te[12]; + translation.y = te[13]; + translation.z = te[14]; + // scale the rotation part + var m = Matrix4.tempMat0; + m.copyFrom(this); + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + m.elements[0] *= invSX; + m.elements[1] *= invSX; + m.elements[2] *= invSX; + m.elements[4] *= invSY; + m.elements[5] *= invSY; + m.elements[6] *= invSY; + m.elements[8] *= invSZ; + m.elements[9] *= invSZ; + m.elements[10] *= invSZ; + rotation.setFromRotationMatrix(m); + scale.x = sx; + scale.y = sy; + scale.z = sz; + return this; + }; + _proto.getTranslation = function getTranslation(translation) { + var te = this.elements; + return translation.set(te[12], te[13], te[14]); + }; + _proto.getScale = function getScale(scale) { + var te = this.elements; + return scale.set(Math.hypot(te[0], te[1], te[2]), Math.hypot(te[4], te[5], te[6]), Math.hypot(te[8], te[9], te[10])); + }; + /** + * 获得矩阵分解的结果 + * @returns 分解的结果 + */ _proto.getTransform = function getTransform() { + var translation = new Vector3(); + var rotation = new Quaternion(); + var scale = new Vector3(); + this.decompose(translation, rotation, scale); + return { + translation: translation, + rotation: rotation, + scale: scale + }; + }; + /** + * 根据视窗信息设置正交相机投影矩阵 + * @param left - 视窗左平面位置 + * @param right - 视窗右平面位置 + * @param top - 视窗上平面位置 + * @param bottom - 视窗下平面位置 + * @param near - 视窗近平面位置 + * @param far - 视窗远平面位置 + * @returns 矩阵 + */ _proto.orthographic = function orthographic(left, right, top, bottom, near, far) { + var a = 1.0 / (right - left); + var b = 1.0 / (top - bottom); + var c = 1.0 / (far - near); + var tx = -(right + left) * a; + var ty = -(top + bottom) * b; + var tz = -(far + near) * c; + a *= 2.0; + b *= 2.0; + c *= -2.0; + var te = this.elements; + te[0] = a; + te[1] = 0.0; + te[2] = 0.0; + te[3] = 0.0; + // + te[4] = 0.0; + te[5] = b; + te[6] = 0.0; + te[7] = 0.0; + // + te[8] = 0.0; + te[9] = 0.0; + te[10] = c; + te[11] = 0.0; + // + te[12] = tx; + te[13] = ty; + te[14] = tz; + te[15] = 1.0; + return this; + }; + /** + * 通过透视相机基础参数设置投影矩阵 + * @param fov - 视角(弧度) + * @param aspect - 视窗比例 + * @param near - 近平面 + * @param far - 远平面 + * @param [reverse] - 视锥体长宽反转(3D这里反了?) + * @returns 投影矩阵 + */ _proto.perspective = function perspective(fov, aspect, near, far, reverse) { + var f = 1.0 / Math.tan(fov * 0.5); + var nf = 1 / (near - far); + var te = this.elements; + te[0] = reverse ? f : f / aspect; + te[1] = 0; + te[2] = 0; + te[3] = 0; + // + te[4] = 0; + te[5] = reverse ? f * aspect : f; + te[6] = 0; + te[7] = 0; + // + te[8] = 0; + te[9] = 0; + te[10] = (far + near) * nf; + te[11] = -1; + // + te[12] = 0; + te[13] = 0; + te[14] = 2 * far * near * nf; + te[15] = 0; + if (far === null || far === Infinity) { + te[10] = -1; + te[14] = -2 * near; + } + return this; + }; + /** + * 对点进行投影变换 + * @param v - 输入点 + * @param [out] - 输出点,如果没有就覆盖输入的数据 + * @returns 投影后的点 + */ _proto.projectPoint = function projectPoint(v, out) { + var x = v.x, y = v.y, z = v.z; + var e = this.elements; + var res = out != null ? out : v; + res.x = e[0] * x + e[4] * y + e[8] * z + e[12]; + res.y = e[1] * x + e[5] * y + e[9] * z + e[13]; + res.z = e[2] * x + e[6] * y + e[10] * z + e[14]; + var w = e[3] * x + e[7] * y + e[11] * z + e[15]; + return res.multiply(1 / w); + }; + /** + * 对点进行矩阵变换 + * @param v - 输入点 + * @param [out] - 输出点,如果没有就覆盖输入的数据 + * @returns 变换后的点 + */ _proto.transformPoint = function transformPoint(v, out) { + var x = v.x, y = v.y, z = v.z; + var e = this.elements; + var res = out != null ? out : v; + res.x = e[0] * x + e[4] * y + e[8] * z + e[12]; + res.y = e[1] * x + e[5] * y + e[9] * z + e[13]; + res.z = e[2] * x + e[6] * y + e[10] * z + e[14]; + return res; + }; + /** + * 对法向量进行矩阵变换 + * @param v - 输入法向量 + * @param [out] - 输出法向量,如果没有就覆盖输入的数据 + * @returns 变换后的法向量 + */ _proto.transformNormal = function transformNormal(v, out) { + var x = v.x, y = v.y, z = v.z; + var e = this.elements; + var res = out != null ? out : v; + res.x = e[0] * x + e[4] * y + e[8] * z; + res.y = e[1] * x + e[5] * y + e[9] * z; + res.z = e[2] * x + e[6] * y + e[10] * z; + return res.normalize(); + }; + /** + * 对四维向量进行矩阵变换 + * @param v - 输入向量 + * @param [out] - 输出向量,如果没有就覆盖输入的数据 + * @returns 变换后向量 + */ _proto.transformVector4 = function transformVector4(v, out) { + var x = v.x, y = v.y, z = v.z, w = v.w; + var e = this.elements; + var res = out != null ? out : v; + res.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; + res.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; + res.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; + res.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; + return res; + }; + /** + * 矩阵判等 + * @param matrix - 矩阵 + * @returns 判等结果 + */ _proto.equals = function equals(matrix) { + var te = this.elements; + var me = matrix.elements; + for(var i = 0; i < 16; i++){ + if (!isEqual(te[i], me[i])) { + return false; + } + } + return true; + }; + /** + * 矩阵转数组 + * @returns + */ _proto.toArray = function toArray() { + return [].concat(this.elements); + }; + _proto.fill = function fill(array, offset) { + if (offset === void 0) offset = 0; + var te = this.elements; + array[offset] = te[0]; + array[offset + 1] = te[1]; + array[offset + 2] = te[2]; + array[offset + 3] = te[3]; + array[offset + 4] = te[4]; + array[offset + 5] = te[5]; + array[offset + 6] = te[6]; + array[offset + 7] = te[7]; + array[offset + 8] = te[8]; + array[offset + 9] = te[9]; + array[offset + 10] = te[10]; + array[offset + 11] = te[11]; + array[offset + 12] = te[12]; + array[offset + 13] = te[13]; + array[offset + 14] = te[14]; + array[offset + 15] = te[15]; + }; + /** + * 创建单位阵 + * @returns 单位矩阵 + */ Matrix4.fromIdentity = function fromIdentity() { + return new Matrix4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + }; + /** + * 创建相机矩阵 + * @param eye - 相机位置 + * @param target - 目标位置 + * @param up - 相机方向 + * @returns 矩阵 + */ Matrix4.fromLookAt = function fromLookAt(eye, target, up) { + return new Matrix4().lookAt(eye, target, up); + }; + /** + * 创建投影矩阵 + * @param fov - 视角 + * @param aspect - 视窗比例 + * @param near - 近平面 + * @param far - 远平面 + * @param [reverse] - 视锥体长宽反转 + * @returns 投影矩阵 + */ Matrix4.fromPerspective = function fromPerspective(fov, aspect, near, far, reverse) { + return new Matrix4().perspective(fov, aspect, near, far, reverse); + }; + /** + * 通过四个列向量创建矩阵 + * @param c1 - 第一列 + * @param c2 - 第二列 + * @param c3 - 第三列 + * @param c4 - 第四列 + * @returns + */ Matrix4.fromColumnVectors = function fromColumnVectors(c1, c2, c3, c4) { + return new Matrix4().setFromColumnVectors(c1, c2, c3, c4); + }; + /** + * 通过三阶矩阵创建矩阵 + * @param m - 三阶矩阵 + * @returns 创建的矩阵 + */ Matrix4.fromMatrix3 = function fromMatrix3(m) { + return new Matrix4().setFromMatrix3(m); + }; + /** + * 通过数组创建矩阵 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 矩阵 + */ Matrix4.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Matrix4().setFromArray(array, offset); + }; + /** + * 通过缩放创建矩阵 + * @param x - x 缩放 + * @param y - y 缩放 + * @param z - z 缩放 + * @returns 缩放结果 + */ Matrix4.fromScale = function fromScale(x, y, z) { + return new Matrix4().setFromScale(x, y, z); + }; + /** + * 通过平移创建矩阵 + * @param x - x 平移 + * @param y - y 平移 + * @param z - z 平移 + * @returns 平移结果 + */ Matrix4.fromTranslation = function fromTranslation(x, y, z) { + return new Matrix4().setFromTranslation(x, y, z); + }; + /** + * 通过 x 轴旋转创建矩阵 + * @param theta - x 轴旋转弧度 + * @returns 矩阵 + */ Matrix4.fromRotationX = function fromRotationX(theta) { + return new Matrix4().setFromRotationX(theta); + }; + /** + * 通过 y 轴旋转创建矩阵 + * @param theta - y 轴旋转弧度 + * @returns 矩阵 + */ Matrix4.fromRotationY = function fromRotationY(theta) { + return new Matrix4().setFromRotationY(theta); + }; + /** + * 通过 z 轴旋转创建矩阵 + * @param theta - z 轴旋转弧度 + * @returns + */ Matrix4.fromRotationZ = function fromRotationZ(theta) { + return new Matrix4().setFromRotationZ(theta); + }; + /** + * 通过旋转轴与旋转弧度创建矩阵 + * @param axis - 旋转轴 + * @param angle - 旋转弧度 + * @returns + */ Matrix4.fromRotationAxis = function fromRotationAxis(axis, angle) { + return new Matrix4().setFromRotationAxis(axis, angle); + }; + /** + * 通过欧拉角创建矩阵 + * @param euler - 欧拉角 + * @returns + */ Matrix4.fromEuler = function fromEuler(euler) { + return new Matrix4().setFromEuler(euler); + }; + /** + * 通过四元数创建矩阵 + * @param quat - 四元数 + * @returns + */ Matrix4.fromQuaternion = function fromQuaternion(quat) { + return new Matrix4().setFromQuaternion(quat); + }; + /** + * 通过倾斜创建矩阵 + * @param x - x 方向倾斜分量 + * @param y - y 方向倾斜分量 + * @param z - z 方向倾斜分量 + * @returns 倾斜矩阵 + */ Matrix4.fromShear = function fromShear(x, y, z) { + return new Matrix4().setFromShear(x, y, z); + }; + /** + * 通过基轴创建矩阵 + * @param xAxis - x 轴 + * @param yAxis - y 轴 + * @param zAxis - z 轴 + * @returns + */ Matrix4.fromBasis = function fromBasis(xAxis, yAxis, zAxis) { + return new Matrix4().setFromBasis(xAxis, yAxis, zAxis); + }; + /** + * 通过行优先数据设置矩阵 + * @param m11 - 第 1 行,第 1 列 + * @param m12 - 第 1 行,第 2 列 + * @param m13 - 第 1 行,第 3 列 + * @param m14 - 第 1 行,第 4 列 + * @param m21 - 第 2 行,第 1 列 + * @param m22 - 第 2 行,第 2 列 + * @param m23 - 第 2 行,第 3 列 + * @param m24 - 第 2 行,第 4 列 + * @param m31 - 第 3 行,第 1 列 + * @param m32 - 第 3 行,第 2 列 + * @param m33 - 第 3 行,第 3 列 + * @param m34 - 第 3 行,第 4 列 + * @param m41 - 第 4 行,第 1 列 + * @param m42 - 第 4 行,第 2 列 + * @param m43 - 第 4 行,第 3 列 + * @param m44 - 第 4 行,第 4 列 + * @returns + */ Matrix4.fromRowMajorData = function fromRowMajorData(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) { + return new Matrix4(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44); + }; + return Matrix4; +}(); +Matrix4$1.IDENTITY = new Matrix4$1(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); +Matrix4$1.ZERO = new Matrix4$1(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); +Matrix4$1.tempVec0 = new Vector3(); +Matrix4$1.tempVec1 = new Vector3(); +Matrix4$1.tempVec2 = new Vector3(); +Matrix4$1.tempMat0 = new Matrix4$1(); + +/** + * Helper class to create a WebGL Context + * + * @param canvas + * @param glType + * @param options + * @returns + */ function createGLContext(canvas, glType, options) { + if (glType === void 0) glType = "webgl"; + var context; + if (glType === "webgl2") { + context = canvas.getContext("webgl2", options); + if (!context) { + console.debug("WebGL2 context retrieval failed, falling back to WebGL context."); + } + } + if (!context || glType === "webgl") { + context = canvas.getContext("webgl", options); + } + if (!context) { + throw new Error("This browser does not support WebGL or the WebGL version is incorrect. Please check your WebGL version."); + } + return context; +} + +function gpuTimer(gl) { + var ext = gl.getExtension("EXT_disjoint_timer_query_webgl2"); + if (ext) { + var query = gl.createQuery(); + var getTime = /*#__PURE__*/ _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + new Promise(function(resolve, reject) { + if (query) { + var available = gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE); + var disjoint = gl.getParameter(ext.GPU_DISJOINT_EXT); + if (available && !disjoint) { + // See how much time the rendering of the object took in nanoseconds. + var timeElapsed = gl.getQueryParameter(query, gl.QUERY_RESULT); // Do something useful with the time. Note that care should be + // taken to use all significant bits of the result, not just the + // least significant 32 bits. + resolve(timeElapsed / 1000 / 1000); + } + if (available || disjoint) { + // Clean up the query object. + gl.deleteQuery(query); // Don't re-enter this polling loop. + query = null; + } + available !== null && query && window.setTimeout(function() { + getTime().then(resolve).catch; + }, 1); + } + }) + ]; + }); + }); + if (!query) { + return; + } + return { + begin: function() { + query && gl.beginQuery(ext.TIME_ELAPSED_EXT, query); + }, + end: function() { + gl.endQuery(ext.TIME_ELAPSED_EXT); + }, + getTime: getTime + }; + } +} + +var initErrors = []; +var glContext = {}; +if (!initErrors.length) { + initGLContext(); +} +function initGLContext() { + // 重要:iOS 9/10 低版本需要拷贝 gl context 的 prototype,要不然会有属性值的缺失 + if (typeof WebGL2RenderingContext === "function") { + copy(WebGL2RenderingContext); + } else if (typeof WebGLRenderingContext !== "undefined") { + copy(WebGLRenderingContext); + copy(WebGLRenderingContext.prototype); + } else { + initErrors.push(// iOS 16 lockdown mode + "iOS16 lockdown mode, WebGL Constants not in global"); + } + if (!initErrors.length && !("HALF_FLOAT" in glContext)) { + // @ts-expect-error set default value + glContext["HALF_FLOAT"] = 5131; + } +} +function isWebGL2(gl) { + return typeof WebGL2RenderingContext !== "undefined" && gl.constructor.name === "WebGL2RenderingContext"; +} +function copy(target) { + for(var name in target){ + if (/^[A-Z_]/.test(name)) { + // @ts-expect-error safe to assign + glContext[name] = target[name]; + } + } +} +function vertexFormatType2GLType(formatType) { + switch(formatType){ + case VertexFormatType.Float32: + return WebGLRenderingContext["FLOAT"]; + case VertexFormatType.Int16: + return WebGLRenderingContext["SHORT"]; + case VertexFormatType.Int8: + return WebGLRenderingContext["BYTE"]; + case VertexFormatType.UInt16: + return WebGLRenderingContext["UNSIGNED_SHORT"]; + case VertexFormatType.UInt8: + return WebGLRenderingContext["UNSIGNED_BYTE"]; + default: + return WebGLRenderingContext["FLOAT"]; + } +} +function glType2VertexFormatType(webglType) { + switch(webglType){ + case WebGLRenderingContext["FLOAT"]: + return VertexFormatType.Float32; + case WebGLRenderingContext["SHORT"]: + return VertexFormatType.Int16; + case WebGLRenderingContext["BYTE"]: + return VertexFormatType.Int8; + case WebGLRenderingContext["UNSIGNED_SHORT"]: + return VertexFormatType.UInt16; + case WebGLRenderingContext["UNSIGNED_BYTE"]: + return VertexFormatType.UInt8; + default: + return VertexFormatType.Float32; + } +} + +exports.ShaderType = void 0; +(function(ShaderType) { + ShaderType[ShaderType["vertex"] = 0] = "vertex"; + ShaderType[ShaderType["fragment"] = 1] = "fragment"; +})(exports.ShaderType || (exports.ShaderType = {})); +exports.MaskMode = void 0; +(function(MaskMode) { + /** + * 无 + */ MaskMode[MaskMode["NONE"] = 0] = "NONE"; + /** + * 蒙版 + */ MaskMode[MaskMode["MASK"] = 1] = "MASK"; + /** + * 被遮挡 + */ MaskMode[MaskMode["OBSCURED"] = 2] = "OBSCURED"; + /** + * 被反向遮挡 + */ MaskMode[MaskMode["REVERSE_OBSCURED"] = 3] = "REVERSE_OBSCURED"; +})(exports.MaskMode || (exports.MaskMode = {})); + +function valIfUndefined(val, def) { + if (val === undefined || val === null) { + return def; + } + return val; +} +function getPreMultiAlpha(blending) { + switch(blending){ + case BlendingMode.ALPHA: + return 1; + case BlendingMode.ADD: + return 1; + case BlendingMode.SUBTRACTION: + return 1; + case BlendingMode.STRONG_LIGHT: + return 1; + case BlendingMode.WEAK_LIGHT: + return 1; + case BlendingMode.SUPERPOSITION: + return 2; + case BlendingMode.BRIGHTNESS: + return 3; + case BlendingMode.MULTIPLY: + return 0; + default: + // 处理undefined + return 1; + } +} +function setBlendMode(material, blendMode) { + switch(blendMode){ + case undefined: + material.blendFunction = [ + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA, + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA + ]; + break; + case BlendingMode.ALPHA: + material.blendFunction = [ + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA, + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA + ]; + break; + case BlendingMode.ADD: + material.blendFunction = [ + glContext.ONE, + glContext.ONE, + glContext.ONE, + glContext.ONE + ]; + break; + case BlendingMode.SUBTRACTION: + material.blendFunction = [ + glContext.ONE, + glContext.ONE, + glContext.ZERO, + glContext.ONE + ]; + material.blendEquation = [ + glContext.FUNC_REVERSE_SUBTRACT, + glContext.FUNC_REVERSE_SUBTRACT + ]; + break; + case BlendingMode.SUPERPOSITION: + material.blendFunction = [ + glContext.ONE, + glContext.ONE, + glContext.ONE, + glContext.ONE + ]; + break; + case BlendingMode.MULTIPLY: + material.blendFunction = [ + glContext.DST_COLOR, + glContext.ONE_MINUS_SRC_ALPHA, + glContext.DST_COLOR, + glContext.ONE_MINUS_SRC_ALPHA + ]; + break; + case BlendingMode.BRIGHTNESS: + material.blendFunction = [ + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA, + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA + ]; + break; + case BlendingMode.STRONG_LIGHT: + material.blendFunction = [ + glContext.DST_COLOR, + glContext.DST_ALPHA, + glContext.ZERO, + glContext.ONE + ]; + break; + case BlendingMode.WEAK_LIGHT: + material.blendFunction = [ + glContext.DST_COLOR, + glContext.ZERO, + glContext.ZERO, + glContext.ONE + ]; + break; + default: + console.warn("BlendMode " + blendMode + " not in specification, please set blend params separately."); + } +} +function setSideMode(material, side) { + if (side === SideMode.DOUBLE) { + material.culling = false; + } else { + material.culling = true; + material.frontFace = glContext.CW; + material.cullFace = side === SideMode.BACK ? glContext.BACK : glContext.FRONT; + } +} +function setMaskMode(material, maskMode) { + switch(maskMode){ + case undefined: + material.stencilTest = false; + break; + case exports.MaskMode.MASK: + material.stencilTest = true; + material.stencilFunc = [ + glContext.ALWAYS, + glContext.ALWAYS + ]; + material.stencilOpZPass = [ + glContext.REPLACE, + glContext.REPLACE + ]; + break; + case exports.MaskMode.OBSCURED: + material.stencilTest = true; + material.stencilFunc = [ + glContext.EQUAL, + glContext.EQUAL + ]; + break; + case exports.MaskMode.REVERSE_OBSCURED: + material.stencilTest = true; + material.stencilFunc = [ + glContext.NOTEQUAL, + glContext.NOTEQUAL + ]; + break; + case exports.MaskMode.NONE: + material.stencilTest = false; + break; + default: + console.warn("MaskMode " + maskMode + " not in specification, please set stencil params seperately."); + } +} + +function _extends() { + _extends = Object.assign || function assign(target) { + for(var i = 1; i < arguments.length; i++){ + var source = arguments[i]; + for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key]; + } + return target; + }; + return _extends.apply(this, arguments); +} + +exports.TextureLoadAction = void 0; +(function(TextureLoadAction) { + TextureLoadAction[TextureLoadAction["whatever"] = 0] = "whatever"; + //preserve previous attachment + //load = 1, + //clear attachment + TextureLoadAction[TextureLoadAction["clear"] = 2] = "clear"; +})(exports.TextureLoadAction || (exports.TextureLoadAction = {})); +exports.TextureSourceType = void 0; +(function(TextureSourceType) { + TextureSourceType[TextureSourceType["none"] = 0] = "none"; + TextureSourceType[TextureSourceType["data"] = 1] = "data"; + TextureSourceType[TextureSourceType["image"] = 2] = "image"; + TextureSourceType[TextureSourceType["compressed"] = 3] = "compressed"; + TextureSourceType[TextureSourceType["video"] = 4] = "video"; + TextureSourceType[TextureSourceType["canvas"] = 5] = "canvas"; + TextureSourceType[TextureSourceType["framebuffer"] = 6] = "framebuffer"; + TextureSourceType[TextureSourceType["mipmaps"] = 7] = "mipmaps"; +})(exports.TextureSourceType || (exports.TextureSourceType = {})); + +/** + * 负责下载各种资源,并提供了一些异步加载和缓存管理的功能 + */ var Downloader = /*#__PURE__*/ function() { + function Downloader() { + /** + * 存储多个回调函数的对象 + */ this.callbacks = {}; + } + var _proto = Downloader.prototype; + /** + * 下载一个 JSON 文件 + * @param url - 要下载的 JSON 文件的 URL + * @param onSuccess - 下载成功后的回调函数 + * @param onError - 下载失败后的回调函数 + */ _proto.downloadJSON = function downloadJSON(url, onSuccess, onError) { + this.download(url, "json", onSuccess, onError); + }; + /** + * 下载一个二进制文件 + * @param url - 要下载的二进制文件的 URL + * @param onSuccess - 下载成功后的回调函数 + * @param onError - 下载失败后的回调函数 + */ _proto.downloadBinary = function downloadBinary(url, onSuccess, onError) { + this.download(url, "arraybuffer", onSuccess, onError); + }; + /** + * 下载一个 Blob 文件 + * @param url - 要下载的 Blob 文件的 URL + * @param onSuccess - 下载成功后的回调函数 + * @param onError - 下载失败后的回调函数 + */ _proto.downloadBlob = function downloadBlob(url, onSuccess, onError) { + this.download(url, "blob", onSuccess, onError); + }; + _proto.download = function download(url, responseType, onSuccess, onError) { + var _this = this; + if (responseType === void 0) responseType = "json"; + if (this.start(url, onSuccess, onError)) { + return; + } + var xhr = new XMLHttpRequest(); + var handleError = function() { + _this.finish(url, xhr.status, xhr.response); + }; + var handleLoad = function() { + if (xhr.status == 200) { + _this.finish(url, 200, xhr.response); + } else { + handleError(); + } + }; + xhr.responseType = responseType; + xhr.addEventListener("load", handleLoad); + xhr.addEventListener("error", handleError); + xhr.open("GET", url, true); + xhr.send(); + }; + _proto.start = function start(url, onSuccess, onError) { + var callbacks = this.callbacks[url]; + try { + if (callbacks) { + return true; + } + this.callbacks[url] = callbacks = []; + } finally{ + callbacks.push(onSuccess, onError); + } + }; + _proto.finish = function finish(url, status, data) { + var callbacks = this.callbacks[url]; + delete this.callbacks[url]; + var args = status == 200 ? [ + data + ] : [ + status, + data + ]; + for(var i = args.length - 1, n = callbacks.length; i < n; i += 2){ + callbacks[i].apply(null, args); + } + }; + return Downloader; +}(); +var webPFailed = false; +var avifFailed = false; +/** + * 异步加载一个 WebP 图片文件,如果不支持 WebP,则加载 PNG 图片文件 + * @param png - PNG 图片文件的 URL + * @param webp - WebP 图片文件的 URL + */ function loadWebPOptional(png, webp) { + return _loadWebPOptional.apply(this, arguments); +} +function _loadWebPOptional() { + _loadWebPOptional = _async_to_generator(function(png, webp) { + var image, image1, image2; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!(webPFailed || !webp)) return [ + 3, + 2 + ]; + return [ + 4, + loadImage(png) + ]; + case 1: + image = _state.sent(); + return [ + 2, + { + image: image, + url: png + } + ]; + case 2: + _state.trys.push([ + 2, + 4, + , + 6 + ]); + return [ + 4, + loadImage(webp) + ]; + case 3: + image1 = _state.sent(); + return [ + 2, + { + image: image1, + url: webp + } + ]; + case 4: + _state.sent(); + webPFailed = true; + return [ + 4, + loadImage(png) + ]; + case 5: + image2 = _state.sent(); + return [ + 2, + { + image: image2, + url: png + } + ]; + case 6: + return [ + 2 + ]; + } + }); + }); + return _loadWebPOptional.apply(this, arguments); +} +/** + * 异步加载一个 AVIF 图片文件,如果不支持 AVIF,则加载 PNG 图片文件 + * @param png - PNG 图片文件的 URL + * @param avif - AVIF 图片文件的 URL + */ function loadAVIFOptional(png, avif) { + return _loadAVIFOptional.apply(this, arguments); +} +function _loadAVIFOptional() { + _loadAVIFOptional = _async_to_generator(function(png, avif) { + var image, image1, image2; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!(avifFailed || !avif)) return [ + 3, + 2 + ]; + return [ + 4, + loadImage(png) + ]; + case 1: + image = _state.sent(); + return [ + 2, + { + image: image, + url: png + } + ]; + case 2: + _state.trys.push([ + 2, + 4, + , + 6 + ]); + return [ + 4, + loadImage(avif) + ]; + case 3: + image1 = _state.sent(); + return [ + 2, + { + image: image1, + url: avif + } + ]; + case 4: + _state.sent(); + avifFailed = true; + return [ + 4, + loadImage(png) + ]; + case 5: + image2 = _state.sent(); + return [ + 2, + { + image: image2, + url: png + } + ]; + case 6: + return [ + 2 + ]; + } + }); + }); + return _loadAVIFOptional.apply(this, arguments); +} +/** + * 异步加载一个图片文件 + * @param source - 图片文件的 URL、Blob 或 HTMLImageElement 对象 + */ function loadImage(source) { + return _loadImage.apply(this, arguments); +} +function _loadImage() { + _loadImage = _async_to_generator(function(source) { + var url, revokeURL; + return __generator(this, function(_state) { + url = ""; + // 1. string | Blob | HTMLImageElement 处理逻辑 + if (_instanceof1(source, HTMLImageElement)) { + if (source.complete) { + return [ + 2, + source + ]; + } + url = source.src; + } else if (_instanceof1(source, Blob)) { + url = URL.createObjectURL(source); + revokeURL = true; + } else if (typeof source === "string") { + url = source; + } + // 2. 非法类型 + if (!url) { + throw new Error("Invalid url type: " + JSON.stringify(source) + "."); + } + return [ + 2, + new Promise(function(resolve, reject) { + var img = new Image(); + if (!/^data:/.test(url)) { + img.crossOrigin = "*"; + } + img.onload = function() { + img.onload = null; + if (revokeURL) { + URL.revokeObjectURL(url); + } + return resolve(img); + }; + img.onerror = function(e) { + img.onerror = null; + if (revokeURL) { + URL.revokeObjectURL(url); + } + return reject("Load image fail: " + url + ", reason: " + JSON.stringify(e)); + }; + img.src = url; + }) + ]; + }); + }); + return _loadImage.apply(this, arguments); +} +/** + * 异步加载一个二进制文件 + * @param url - 二进制文件的 URL + */ function loadBinary(url) { + return _loadBinary.apply(this, arguments); +} +function _loadBinary() { + _loadBinary = _async_to_generator(function(url) { + return __generator(this, function(_state) { + return [ + 2, + new Promise(function(resolve, reject) { + new Downloader().downloadBinary(url, resolve, function(status, responseText) { + reject("Couldn't load bins " + url + ": status " + status + ", " + responseText); + }); + }) + ]; + }); + }); + return _loadBinary.apply(this, arguments); +} +/** + * 异步加载一个 Blob 文件 + * @param url - Blob 文件的 URL + */ function loadBlob(url) { + return _loadBlob.apply(this, arguments); +} +function _loadBlob() { + _loadBlob = _async_to_generator(function(url) { + return __generator(this, function(_state) { + return [ + 2, + new Promise(function(resolve, reject) { + new Downloader().downloadBlob(url, resolve, function(status, responseText) { + reject("Couldn't load blob " + url + ": status " + status + ", " + responseText); + }); + }) + ]; + }); + }); + return _loadBlob.apply(this, arguments); +} +/** + * 异步加载一个视频文件 + * @param url - 视频文件的 URL 或 MediaProvider 对象 + */ function loadVideo(url) { + return _loadVideo.apply(this, arguments); +} +function _loadVideo() { + _loadVideo = _async_to_generator(function(url) { + var video; + return __generator(this, function(_state) { + video = document.createElement("video"); + if (typeof url === "string") { + video.src = url; + } else { + video.srcObject = url; + } + video.crossOrigin = "anonymous"; + video.muted = true; + if (isAndroid()) { + video.setAttribute("renderer", "standard"); + } + video.setAttribute("playsinline", "playsinline"); + return [ + 2, + new Promise(function(resolve, reject) { + var pending = video.play(); + if (pending) { + void pending.then(function() { + return resolve(video); + }); + } else { + video.addEventListener("loadeddata", function listener() { + resolve(video); + video.removeEventListener("loadeddata", listener); + }, true); + } + video.addEventListener("error", function(e) { + reject("Load video fail."); + }); + }) + ]; + }); + }); + return _loadVideo.apply(this, arguments); +} +/** + * 异步加载一个媒体文件 + * @param url + * @param loadFn + * @returns + */ function loadMedia(url, loadFn) { + return _loadMedia.apply(this, arguments); +} +function _loadMedia() { + _loadMedia = _async_to_generator(function(url, loadFn) { + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!Array.isArray(url)) return [ + 3, + 5 + ]; + _state.label = 1; + case 1: + _state.trys.push([ + 1, + 3, + , + 5 + ]); + return [ + 4, + loadFn(url[0]) + ]; + case 2: + return [ + 2, + _state.sent() + ]; + case 3: + _state.sent(); + return [ + 4, + loadFn(url[1]) + ]; + case 4: + return [ + 2, + _state.sent() + ]; + case 5: + return [ + 2, + loadFn(url) + ]; + } + }); + }); + return _loadMedia.apply(this, arguments); +} + +function deserializeMipmapTexture(textureOptions, bins, assets) { + return _deserializeMipmapTexture.apply(this, arguments); +} +function _deserializeMipmapTexture() { + _deserializeMipmapTexture = _async_to_generator(function(textureOptions, bins, assets, files) { + var mipmaps, target, jobs, loadedMipmaps, mipmaps1, target1, jobs1, loadedMipmaps1, bin; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (files === void 0) files = []; + if (!(textureOptions.target === 34067)) return [ + 3, + 2 + ]; + mipmaps = textureOptions.mipmaps, target = textureOptions.target; + jobs = mipmaps.map(function(mipmap) { + return Promise.all(mipmap.map(function(pointer) { + // @ts-expect-error + if (pointer.id) { + // @ts-expect-error + var loadedImage = assets[pointer.id]; + return loadedImage; + } else { + return loadMipmapImage(pointer, bins); + } + })); + }); + return [ + 4, + Promise.all(jobs) + ]; + case 1: + loadedMipmaps = _state.sent(); + return [ + 2, + _extends({ + keepImageSource: false + }, textureOptions, { + mipmaps: loadedMipmaps, + sourceFrom: { + target: target, + // bin, + type: exports.TextureSourceType.mipmaps + } + }) + ]; + case 2: + // TODO: 补充测试用例 + mipmaps1 = textureOptions.mipmaps, target1 = textureOptions.target; + jobs1 = mipmaps1.map(function(pointer) { + return loadMipmapImage(pointer, bins); + }); + return [ + 4, + Promise.all(jobs1) + ]; + case 3: + loadedMipmaps1 = _state.sent(); + bin = files[mipmaps1[0][1][0]].url; + return [ + 2, + _extends({ + keepImageSource: false + }, textureOptions, { + mipmaps: loadedMipmaps1, + sourceType: exports.TextureSourceType.mipmaps, + sourceFrom: { + target: target1, + bin: bin, + type: exports.TextureSourceType.mipmaps, + mipmaps: mipmaps1.map(function(pointer) { + return [ + pointer[1][1], + pointer[1][2] + ]; + }) + } + }) + ]; + case 4: + return [ + 2 + ]; + } + }); + }); + return _deserializeMipmapTexture.apply(this, arguments); +} +function loadMipmapImage(pointer, bins) { + return _loadMipmapImage.apply(this, arguments); +} +function _loadMipmapImage() { + _loadMipmapImage = _async_to_generator(function(pointer, bins) { + var _pointer_, index, start, length, bin; + return __generator(this, function(_state) { + _pointer_ = pointer[1], index = _pointer_[0], start = _pointer_[1], length = _pointer_[2]; + bin = bins[index]; + if (!bin) { + throw new Error("Invalid bin pointer: " + JSON.stringify(pointer) + "."); + } + return [ + 2, + loadImage(new Blob([ + new Uint8Array(bin, start, length) + ])) + ]; + }); + }); + return _loadMipmapImage.apply(this, arguments); +} + +var seed$d = 1; +/** + * Texture 抽象类 + */ var Texture = /*#__PURE__*/ function(EffectsObject) { + _inherits(Texture, EffectsObject); + function Texture(engine) { + var _this; + _this = EffectsObject.call(this, engine) || this; + _this.destroyed = false; + _this.id = "Tex" + seed$d++; + return _this; + } + var _proto = Texture.prototype; + /** + * 获取 Texture 的宽度。 + */ _proto.getWidth = function getWidth() { + return this.width || 0; + }; + /** + * 获取 Texture 的高度。 + */ _proto.getHeight = function getHeight() { + return this.height || 0; + }; + _proto.uploadCurrentVideoFrame = function uploadCurrentVideoFrame() { + // OVERRIDE + }; + /** + * 释放 Texture GPU 资源。 + * 注意:该方法只释放资源,并不销毁 GPU textureBuffer 对象。 + * @override + */ _proto.offloadData = function offloadData() { + // OVERRIDE + }; + /** + * 重新加载 Texture GPU 资源。 + * @override + */ _proto.reloadData = function reloadData() { + // OVERRIDE + }; + /** + * 初始化 GPU 资源 + * @override + */ _proto.initialize = function initialize() { + // OVERRIDE + }; + _proto.assembleOptions = function assembleOptions(options) { + var _options_target = options.target, target = _options_target === void 0 ? glContext.TEXTURE_2D : _options_target, tmp = options.format, internalFormat = tmp === void 0 ? glContext.RGBA : tmp; + if (!options.sourceType) { + if ("image" in options) { + options.sourceType = exports.TextureSourceType.image; + } else if ("data" in options) { + options.sourceType = exports.TextureSourceType.data; + } else if ("video" in options) { + options.sourceType = exports.TextureSourceType.video; + } else { + options.sourceType = 0; // TextureSourceType.none + } + } + return _extends({ + minFilter: glContext.NEAREST, + magFilter: glContext.NEAREST, + wrapS: glContext.CLAMP_TO_EDGE, + wrapT: glContext.CLAMP_TO_EDGE, + target: target, + format: glContext.RGBA, + internalFormat: internalFormat, + type: glContext.UNSIGNED_BYTE + }, options); + }; + /** + * 通过 URL 创建 Texture 对象。 + * @param url - 要创建的 Texture URL + * @since 2.0.0 + */ Texture.fromImage = function fromImage(url, engine, options) { + return _async_to_generator(function() { + var image, texture; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + return [ + 4, + loadImage(url) + ]; + case 1: + image = _state.sent(); + texture = Texture.create(engine, _extends({ + sourceType: exports.TextureSourceType.image, + image: image, + target: glContext.TEXTURE_2D, + id: generateGUID(), + flipY: true + }, options)); + texture.initialize(); + return [ + 2, + texture + ]; + } + }); + })(); + }; + /** + * 通过视频 URL 创建 Texture 对象。 + * @param url - 要创建的 Texture URL + * @param engine - 引擎对象 + * @param options - 可选的 Texture 选项 + * @since 2.1.0 + * @returns + */ Texture.fromVideo = function fromVideo(url, engine, options) { + return _async_to_generator(function() { + var video, texture; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + return [ + 4, + loadVideo(url) + ]; + case 1: + video = _state.sent(); + texture = Texture.create(engine, _extends({ + sourceType: exports.TextureSourceType.video, + video: video, + id: generateGUID(), + flipY: true + }, options)); + texture.initialize(); + return [ + 2, + texture + ]; + } + }); + })(); + }; + _create_class(Texture, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return Texture; +}(EffectsObject); +function generateHalfFloatTexture(engine, data, width, height) { + var channel = data.length / width / height; + var format; + var internalFormat; + if (channel === 4 || channel === 0) { + internalFormat = format = glContext.RGBA; + } else if (channel === 3) { + internalFormat = format = glContext.RGB; + } else if (channel === 2) { + internalFormat = format = glContext.LUMINANCE_ALPHA; + } else { + internalFormat = format = glContext.LUMINANCE; + } + return Texture.createWithData(engine, { + data: data, + width: width, + height: height + }, { + type: glContext.HALF_FLOAT, + format: format, + internalFormat: internalFormat, + wrapS: glContext.CLAMP_TO_EDGE, + wrapT: glContext.CLAMP_TO_EDGE + }); +} +var sourceOptions = { + type: glContext.UNSIGNED_BYTE, + format: glContext.RGBA, + internalFormat: glContext.RGBA, + wrapS: glContext.MIRRORED_REPEAT, + wrapT: glContext.MIRRORED_REPEAT, + minFilter: glContext.NEAREST, + magFilter: glContext.NEAREST +}; +function generateWhiteTexture(engine) { + return Texture.create(engine, _extends({ + id: BuiltinObjectGUID.WhiteTexture, + data: { + width: 1, + height: 1, + data: new Uint8Array([ + 255, + 255, + 255, + 255 + ]) + }, + sourceType: exports.TextureSourceType.data + }, sourceOptions)); +} +function generateTransparentTexture(engine) { + return Texture.create(engine, _extends({ + id: BuiltinObjectGUID.TransparentTexture, + data: { + width: 1, + height: 1, + data: new Uint8Array([ + 0, + 0, + 0, + 0 + ]) + }, + sourceType: exports.TextureSourceType.data + }, sourceOptions)); +} + +var HEADER_LEN = 12 + 13 * 4; // identifier + header elements (not including key value meta-data pairs) +var COMPRESSED_2D = 0; // uses a gl.compressedTexImage2D() +//const COMPRESSED_3D = 1; // uses a gl.compressedTexImage3D() +var TEX_2D = 2; // uses a gl.texImage2D() +//const TEX_3D = 3; // uses a gl.texImage3D() +var KTXTexture = /*#__PURE__*/ function() { + function KTXTexture(arrayBuffer, facesExpected, baseOffset) { + if (baseOffset === void 0) baseOffset = 0; + this.arrayBuffer = arrayBuffer; + this.baseOffset = baseOffset; + // Test that it is a ktx formatted file, based on the first 12 bytes, character representation is: + // '´', 'K', 'T', 'X', ' ', '1', '1', 'ª', '\r', '\n', '\x1A', '\n' + // 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A + var identifier = new Uint8Array(this.arrayBuffer, this.baseOffset, 12); + if (identifier[0] !== 0xab || identifier[1] !== 0x4b || identifier[2] !== 0x54 || identifier[3] !== 0x58 || identifier[4] !== 0x20 || identifier[5] !== 0x31 || identifier[6] !== 0x31 || identifier[7] !== 0xbb || identifier[8] !== 0x0d || identifier[9] !== 0x0a || identifier[10] !== 0x1a || identifier[11] !== 0x0a) { + throw new Error("Texture missing KTX identifier."); + } + // load the reset of the header in native 32 bit uint + var dataSize = Uint32Array.BYTES_PER_ELEMENT; + var headerDataView = new DataView(this.arrayBuffer, this.baseOffset + 12, 13 * dataSize); + var endianness = headerDataView.getUint32(0, true); + var littleEndian = endianness === 0x04030201; + this.glType = headerDataView.getUint32(1 * dataSize, littleEndian); // must be 0 for compressed textures + this.glTypeSize = headerDataView.getUint32(2 * dataSize, littleEndian); // must be 1 for compressed textures + this.glFormat = headerDataView.getUint32(3 * dataSize, littleEndian); // must be 0 for compressed textures + this.glInternalFormat = headerDataView.getUint32(4 * dataSize, littleEndian); // the value of arg passed to gl.compressedTexImage2D(,,x,,,,) + this.glBaseInternalFormat = headerDataView.getUint32(5 * dataSize, littleEndian); // specify GL_RGB, GL_RGBA, GL_ALPHA, etc (un-compressed only) + this.pixelWidth = headerDataView.getUint32(6 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,x,,,) + this.pixelHeight = headerDataView.getUint32(7 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,,x,,) + this.pixelDepth = headerDataView.getUint32(8 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage3D(,,,,,x,,) + this.numberOfArrayElements = headerDataView.getUint32(9 * dataSize, littleEndian); // used for texture arrays + this.numberOfFaces = headerDataView.getUint32(10 * dataSize, littleEndian); // used for cubemap textures, should either be 1 or 6 + this.numberOfMipmapLevels = headerDataView.getUint32(11 * dataSize, littleEndian); // number of levels; disregard possibility of 0 for compressed textures + this.bytesOfKeyValueData = headerDataView.getUint32(12 * dataSize, littleEndian); // the amount of space after the header for meta-data + // value of zero is an indication to generate mipmaps @ runtime. Not usually allowed for compressed, so disregard. + this.numberOfMipmapLevels = Math.max(1, this.numberOfMipmapLevels); + if (this.pixelHeight === 0 || this.pixelDepth !== 0) { + logger.warn("Only 2D textures currently supported."); + return; + } + if (this.numberOfArrayElements !== 0) { + logger.warn("Texture arrays not currently supported."); + return; + } + if (this.numberOfFaces !== facesExpected) { + logger.warn("Number of faces expected " + facesExpected + ", but found " + this.numberOfFaces + "."); + return; + } + // we now have a completely validated file, so could use existence of loadType as success + // would need to make this more elaborate & adjust checks above to support more than one load type + if (this.glType === 0) { + this.loadType = COMPRESSED_2D; + } else { + this.loadType = TEX_2D; + } + } + var _proto = KTXTexture.prototype; + _proto.mipmaps = function mipmaps(loadMipmaps) { + var mipmaps = []; + // initialize width & height for level 1 + var dataOffset = HEADER_LEN + this.bytesOfKeyValueData; + var width = this.pixelWidth; + var height = this.pixelHeight; + var mipmapCount = loadMipmaps ? this.numberOfMipmapLevels : 1; + for(var level = 0; level < mipmapCount; level++){ + var imageSize = new Int32Array(this.arrayBuffer, this.baseOffset + dataOffset, 1)[0]; // size per face, since not supporting array cubemaps + for(var face = 0; face < this.numberOfFaces; face++){ + var data = new Uint8Array(this.arrayBuffer, this.baseOffset + dataOffset + 4, imageSize); + mipmaps.push({ + data: data, + width: width, + height: height + }); + dataOffset += imageSize + 4; // size of the image + 4 for the imageSize field + dataOffset += 3 - (imageSize + 3) % 4; // add padding for odd sized image + } + width = Math.max(1.0, width * 0.5); + height = Math.max(1.0, height * 0.5); + } + return mipmaps; + }; + return KTXTexture; +}(); +function getKTXTextureOptions(data) { + var tex = new KTXTexture(data, 1); + var numberOfMipmapLevels = tex.numberOfMipmapLevels, pixelWidth = tex.pixelWidth, pixelHeight = tex.pixelHeight, glType = tex.glType, numberOfFaces = tex.numberOfFaces, glInternalFormat = tex.glInternalFormat, glFormat = tex.glFormat; + var useMipmaps = numberOfMipmapLevels >= Math.floor(Math.log2(Math.max(pixelWidth, pixelHeight)) + 1); + return { + sourceType: exports.TextureSourceType.compressed, + type: glType, + target: numberOfFaces === 6 ? glContext.TEXTURE_CUBE_MAP : glContext.TEXTURE_2D, + internalFormat: glInternalFormat, + format: glFormat, + mipmaps: tex.mipmaps(useMipmaps) + }; +} + +var TextureFactory = /*#__PURE__*/ function() { + function TextureFactory() { + this.reloadPending = {}; + } + var _proto = TextureFactory.prototype; + _proto.reload = function reload(texture) { + var _this = this; + return _async_to_generator(function() { + var id, sourceOpts; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + id = texture.id; + if (_this.reloadPending[id]) { + return [ + 2 + ]; + } + if (!texture.sourceFrom) return [ + 3, + 2 + ]; + _this.reloadPending[id] = true; + return [ + 4, + _this.loadSource(texture.sourceFrom) + ]; + case 1: + sourceOpts = _state.sent(); + texture.updateSource(sourceOpts); + _this.reloadPending[id] = false; + return [ + 3, + 3 + ]; + case 2: + throw new Error("No source from."); + case 3: + return [ + 2 + ]; + } + }); + })(); + }; + _proto.canOffloadTexture = function canOffloadTexture(sourceFrom) { + if (sourceFrom) { + var type = sourceFrom.type; + if (type === exports.TextureSourceType.compressed || type === exports.TextureSourceType.image) { + var target = sourceFrom.target, map = sourceFrom.map; + var url = sourceFrom.url; + if (target === glContext.TEXTURE_CUBE_MAP) { + return typeof map === "object" && !!map; + } + return isString(url) && url.length > 0; + } + if (type === exports.TextureSourceType.mipmaps) { + var bin = sourceFrom.bin, mipmaps = sourceFrom.mipmaps; + var target1 = sourceFrom.target, maps = sourceFrom.maps; + var urls = sourceFrom.urls; + if (bin) { + return mipmaps.length > 0; + } + if (target1 === glContext.TEXTURE_CUBE_MAP) { + return maps.every(function(map) { + return typeof map === "object" && map; + }); + } + return urls.every(function(url) { + return isString(url) && url.length > 0; + }); + } + } + return false; + }; + _proto.loadSource = function loadSource(sourceFrom, config) { + var _this = this; + return _async_to_generator(function() { + var type, target, map, url, bin, mipmaps, urls, maps, cube, image, video, buffer, data, newTarget, newMipmaps, loadedMipmaps, loadedMipmaps1, loadedMipmaps2; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + type = sourceFrom.type, target = sourceFrom.target; + map = sourceFrom.map; + url = sourceFrom.url; + bin = sourceFrom.bin, mipmaps = sourceFrom.mipmaps; + urls = sourceFrom.urls; + maps = sourceFrom.maps; + if (!(target === glContext.TEXTURE_CUBE_MAP && type !== exports.TextureSourceType.mipmaps)) return [ + 3, + 2 + ]; + return [ + 4, + _this.loadCubeMap(map) + ]; + case 1: + cube = _state.sent(); + return [ + 2, + _extends({}, config, { + cube: cube, + target: glContext.TEXTURE_CUBE_MAP, + sourceType: exports.TextureSourceType.image, + sourceFrom: { + type: exports.TextureSourceType.image, + map: _extends({}, map), + target: glContext.TEXTURE_CUBE_MAP + } + }) + ]; + case 2: + if (!(type === exports.TextureSourceType.image)) return [ + 3, + 4 + ]; + return [ + 4, + loadImage(url) + ]; + case 3: + image = _state.sent(); + return [ + 2, + _extends({}, config, { + image: image, + sourceType: exports.TextureSourceType.image, + sourceFrom: { + type: type, + url: url, + target: glContext.TEXTURE_2D + } + }) + ]; + case 4: + if (!(type === exports.TextureSourceType.video)) return [ + 3, + 6 + ]; + return [ + 4, + loadVideo(url) + ]; + case 5: + video = _state.sent(); + return [ + 2, + _extends({}, config, { + video: video, + sourceType: exports.TextureSourceType.video + }) + ]; + case 6: + if (!(type === exports.TextureSourceType.compressed)) return [ + 3, + 8 + ]; + return [ + 4, + loadBinary(url) + ]; + case 7: + buffer = _state.sent(); + return [ + 2, + _extends({}, getKTXTextureOptions(buffer), config, { + sourceFrom: { + url: url, + type: exports.TextureSourceType.compressed + } + }) + ]; + case 8: + if (!(type === exports.TextureSourceType.mipmaps)) return [ + 3, + 17 + ]; + if (!bin) return [ + 3, + 13 + ]; + return [ + 4, + loadBinary(bin) + ]; + case 9: + data = _state.sent(); + newTarget = target != null ? target : glContext.TEXTURE_2D; + newMipmaps = newTarget === glContext.TEXTURE_2D ? mipmaps.slice() : mipmaps.map(function(s) { + return s.slice(); + }); + if (!(target === glContext.TEXTURE_CUBE_MAP)) return [ + 3, + 11 + ]; + return [ + 4, + Promise.all(mipmaps.map(function(mipmap) { + return _this.loadMipmapImages(mipmap, data); + })) + ]; + case 10: + loadedMipmaps = _state.sent(); + return [ + 3, + 12 + ]; + case 11: + loadedMipmaps = _this.loadMipmapImages(mipmaps, data); + _state.label = 12; + case 12: + return [ + 2, + _extends({}, config, { + mipmaps: loadedMipmaps, + target: newTarget, + sourceType: exports.TextureSourceType.mipmaps, + sourceFrom: { + bin: bin, + mipmaps: newMipmaps, + target: newTarget, + type: exports.TextureSourceType.mipmaps + } + }) + ]; + case 13: + if (!(target === glContext.TEXTURE_2D || !target)) return [ + 3, + 15 + ]; + return [ + 4, + Promise.all(urls.map(function(url) { + return loadImage(url); + })) + ]; + case 14: + loadedMipmaps1 = _state.sent(); + return [ + 2, + _extends({}, config, { + mipmaps: loadedMipmaps1, + target: glContext.TEXTURE_2D, + sourceType: exports.TextureSourceType.mipmaps, + sourceFrom: { + type: type, + urls: urls.slice(), + target: glContext.TEXTURE_2D + } + }) + ]; + case 15: + if (!(target === glContext.TEXTURE_CUBE_MAP)) return [ + 3, + 17 + ]; + return [ + 4, + Promise.all(maps.map(function(map) { + return _this.loadCubeMap(map); + })) + ]; + case 16: + loadedMipmaps2 = _state.sent(); + return [ + 2, + _extends({}, config, { + mipmaps: loadedMipmaps2, + target: glContext.TEXTURE_CUBE_MAP, + sourceType: exports.TextureSourceType.mipmaps, + sourceFrom: { + type: type, + maps: maps.map(function(map) { + return _extends({}, map); + }), + target: glContext.TEXTURE_CUBE_MAP + } + }) + ]; + case 17: + throw new Error("Invalid resource type: " + type + "."); + } + }); + })(); + }; + _proto.loadMipmapImages = function loadMipmapImages(pointers, bin) { + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + Promise.all(pointers.map(function(pointer) { + var blob = new Blob([ + new Uint8Array(bin, pointer[0], pointer[1]) + ]); + return loadImage(blob); + })) + ]; + }); + })(); + }; + _proto.loadCubeMap = function loadCubeMap(cubemap) { + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + Promise.all(cubemap.map(function(key) { + return loadImage(key); + })) + ]; + }); + })(); + }; + return TextureFactory; +}(); +var g; +function getDefaultTextureFactory() { + if (!g) { + g = new TextureFactory(); + } + return g; +} +function setDefaultTextureFactory(factory) { + g = factory; +} + +/** + * 引擎接入暂时不需要实现 + */ var MaterialDataBlock = /*#__PURE__*/ function() { + function MaterialDataBlock(props) { + this.destroyed = false; + var _props_name = props.name, name = _props_name === void 0 ? "defaultDataBlock" : _props_name; + this.name = name; + } + var _proto = MaterialDataBlock.prototype; + _proto.setUniformValues = function setUniformValues(uniformValue) { + var _this = this; + Object.keys(uniformValue).forEach(function(key) { + _this.setUniformValue(key, uniformValue[key]); + }); + }; + _proto.invalidAllFlags = function invalidAllFlags() { + // OVERRIDE + }; + _proto.updateUniformSubData = function updateUniformSubData(name, start, count) { + // OVERRIDE + }; + return MaterialDataBlock; +}(); +function isUniformStruct(value) { + return typeof value === "object" && value && value.length === undefined && _instanceof1(value, Texture); +} +function isUniformStructArray(value) { + return value && value.length !== undefined && isUniformStruct(value[0]); +} + +exports.MaterialRenderType = void 0; +(function(MaterialRenderType) { + MaterialRenderType[MaterialRenderType["normal"] = 0] = "normal"; + MaterialRenderType[MaterialRenderType["transformFeedback"] = 1] = "transformFeedback"; +})(exports.MaterialRenderType || (exports.MaterialRenderType = {})); +/** + * 用于设置材质默认名称的自增序号 + * @internal + */ var seed$c = 1; +/** + * Material 抽象类 + */ var Material = /*#__PURE__*/ function(EffectsObject) { + _inherits(Material, EffectsObject); + function Material(engine, props) { + var _this; + _this = EffectsObject.call(this, engine) || this; + _this.stringTags = {}; + _this.enabledMacros = {}; + _this.destroyed = false; + _this.initialized = false; + _this.shaderDirty = true; + if (props) { + var _props_name = props.name, name = _props_name === void 0 ? "Material" + seed$c++ : _props_name, _props_renderType = props.renderType, renderType = _props_renderType === void 0 ? 0 : _props_renderType, shader = props.shader, uniformSemantics = props.uniformSemantics; + _this.name = name; + _this.renderType = renderType; // TODO 没有地方用到 + _this.shaderSource = shader; + _this.props = props; + _this.uniformSemantics = _extends({}, uniformSemantics); // TODO 废弃,待移除 + } else { + _this.name = "Material" + seed$c++; + _this.renderType = 0; + } + return _this; + } + var _proto = Material.prototype; + /** + * 初始化 GPU 资源 + * @override + */ _proto.initialize = function initialize() { + // OVERRIDE + }; + _proto.createShaderVariant = function createShaderVariant() { + // OVERRIDE + }; + _proto.use = function use(render, globalUniforms) { + // OVERRIDE + }; + _create_class(Material, [ + { + key: "shader", + get: function get() { + return this._shader; + }, + set: function set(value) { + if (this._shader === value) { + return; + } + this._shader = value; + this.shaderDirty = true; + } + }, + { + key: "mainTexture", + get: /** + * 材质的主纹理 + */ function get() { + return this.getTexture("_MainTex"); + }, + set: function set(value) { + this.setTexture("_MainTex", value); + } + }, + { + key: "color", + get: /** + * 材质的主颜色 + */ function get() { + return this.getColor("_Color"); + }, + set: function set(value) { + this.setColor("_Color", value); + } + }, + { + key: "blending", + set: /******** effects-core 中会调用 引擎必须实现 ***********************/ /** + * 设置 Material 的颜色融合开关 + * @param blending - 是否开启混合效果 + */ function set(blending) {} + }, + { + key: "blendFunction", + set: /** + * 分别指定 Material 的颜色混合函数乘数 + * @param func - 混合函数参数 + */ function set(func) {} + }, + { + key: "blendEquation", + set: /** + * 分别指定 Material 的颜色混合方式 + * @param equation - 混合方程参数 + */ function set(equation) {} + }, + { + key: "depthTest", + set: /** + * 设置 Material 的深度测试开关 + * @param value - 是否开启深度测试 + */ function set(value) {} + }, + { + key: "depthMask", + set: /** + * 设置 Material 的写入深度缓冲开关 + * @param value - 是否开启深度写入 + */ function set(value) {} + }, + { + key: "stencilTest", + set: /** + * 设置 Material 的模板测试开关 + * @param value - 是否开启模板测试 + */ function set(value) {} + }, + { + key: "stencilRef", + set: /** + * 分别指定 Material 的模板测试参考值 + * @param value - 模板测试参考值参数 + */ function set(value) {} + }, + { + key: "stencilFunc", + set: /** + * 分别指定 Material 的模板测试函数 + * @param value - 模板测试函数参数 + */ function set(value) {} + }, + { + key: "stencilOpZPass", + set: /** + * 分别指定 Material 的模板测试和深度测试都通过时使用的函数 + * @param value - 模板测试深度测试通过时的操作参数 + */ function set(value) {} + }, + { + key: "culling", + set: /** + * 设置 Material 的正反面剔除开关 + * @param value - 是否开启剔除 + */ function set(value) {} + }, + { + key: "frontFace", + set: /** + * 设置 Material 的正反面计算方向 + * @param value + */ function set(value) {} + }, + { + key: "cullFace", + set: /** + * 设置 Material 要剔除的面 + * @param value - 剔除面参数 + */ function set(value) {} + }, + { + key: "blendColor", + set: /***************************************************/ /******** effects-core 中暂无调用 引擎可以先不实现 ***********************/ /** + * 设置 Material 的源和目标混合因子 + * @param color + */ function set(color) {} + }, + { + key: "depthRange", + set: /** + * 设置 Material 的深度映射范围 + * @param value + */ function set(value) {} + }, + { + key: "depthFunc", + set: /** + * 设置 Material 的深度比较函数 + * @param value - 深度测试函数参数 + */ function set(value) {} + }, + { + key: "polygonOffsetFill", + set: /** + * 设置 Material 的多边形偏移(实现类似深度偏移的效果) + * @param value - 多边形偏移参数 + */ function set(value) {} + }, + { + key: "polygonOffset", + set: /** + * 指定 Material 计算深度值的比例因子 factor 和单位 units + * @param value + */ function set(value) {} + }, + { + key: "sampleAlphaToCoverage", + set: /** + * 设置 Material 的通过 alpha 值决定临时覆盖值计算的开关 + * @param value - 是否开启 alpha 抖动 + */ function set(value) {} + }, + { + key: "stencilMask", + set: /** + * 分别指定 Material 的模板测试掩码 + * @param value - 模板测试写入掩码参数 + */ function set(value) {} + }, + { + key: "stencilOpFail", + set: /** + * 分别指定 Material 模板测试失败时要使用的函数 + * @param value - 模板测试失败时的操作参数 + */ function set(value) {} + }, + { + key: "stencilOpZFail", + set: /** + * 分别指定 Material 模板测试通过但深度测试失败时要使用的函数 + * @param value - 模板测试深度测试失败时的操作参数 + */ function set(value) {} + } + ]); + return Material; +}(EffectsObject); + +var MaskProcessor = /*#__PURE__*/ function() { + function MaskProcessor(engine) { + this.engine = engine; + this.maskable = null; + this.stencilClearAction = { + stencilAction: exports.TextureLoadAction.clear + }; + } + var _proto = MaskProcessor.prototype; + _proto.getRefValue = function getRefValue() { + return 1; + }; + _proto.getMaskMode = function getMaskMode(data) { + var maskMode = exports.MaskMode.NONE; + if (data.mask) { + var _data_mask = data.mask, _data_mask_mask = _data_mask.mask, mask = _data_mask_mask === void 0 ? false : _data_mask_mask, _data_mask_mode = _data_mask.mode, mode = _data_mask_mode === void 0 ? exports.MaskMode.NONE : _data_mask_mode, ref = _data_mask.ref; + if (mask) { + maskMode = exports.MaskMode.MASK; + } else if (mode === ObscuredMode.OBSCURED || mode === ObscuredMode.REVERSE_OBSCURED) { + maskMode = mode === ObscuredMode.OBSCURED ? exports.MaskMode.OBSCURED : exports.MaskMode.REVERSE_OBSCURED; + if (ref) { + this.maskable = ref; + } + } + } + return maskMode; + }; + _proto.drawStencilMask = function drawStencilMask(renderer) { + if (this.maskable) { + renderer.clear(this.stencilClearAction); + this.maskable.drawStencilMask(renderer); + } + }; + return MaskProcessor; +}(); + +exports.ShaderCompileResultStatus = void 0; +(function(ShaderCompileResultStatus) { + ShaderCompileResultStatus[ShaderCompileResultStatus["noShader"] = 0] = "noShader"; + ShaderCompileResultStatus[ShaderCompileResultStatus["success"] = 1] = "success"; + ShaderCompileResultStatus[ShaderCompileResultStatus["fail"] = 2] = "fail"; + ShaderCompileResultStatus[ShaderCompileResultStatus["compiling"] = 3] = "compiling"; +})(exports.ShaderCompileResultStatus || (exports.ShaderCompileResultStatus = {})); +exports.GLSLVersion = void 0; +(function(GLSLVersion) { + GLSLVersion["GLSL1"] = "100"; + GLSLVersion["GLSL3"] = "300 es"; +})(exports.GLSLVersion || (exports.GLSLVersion = {})); +var ShaderVariant = /*#__PURE__*/ function(EffectsObject) { + _inherits(ShaderVariant, EffectsObject); + function ShaderVariant(engine, source) { + var _this; + _this = EffectsObject.call(this, engine) || this; + _this.source = source; + return _this; + } + return ShaderVariant; +}(EffectsObject); +exports.Shader = /*#__PURE__*/ function(EffectsObject) { + _inherits(Shader, EffectsObject); + function Shader() { + return EffectsObject.apply(this, arguments); + } + var _proto = Shader.prototype; + _proto.createVariant = function createVariant(macros) { + var shaderMacros = []; + if (macros) { + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(macros)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + shaderMacros.push([ + key, + macros[key] + ]); + } + } + var shaderVariant = this.engine.getShaderLibrary().createShader(this.shaderData, shaderMacros); + shaderVariant.shader = this; + return shaderVariant; + }; + _proto.fromData = function fromData(data) { + EffectsObject.prototype.fromData.call(this, data); + this.shaderData = data; + }; + return Shader; +}(EffectsObject); +exports.Shader = __decorate([ + effectsClass(DataType.Shader) +], exports.Shader); + +var EFFECTS_COPY_MESH_NAME = "effects-internal-copy"; +var COPY_MESH_SHADER_ID = "effects-internal-copy-mesh"; +var COPY_VERTEX_SHADER = "\nprecision highp float;\nattribute vec2 aPos;\nvarying vec2 vTex;\nvoid main(){\n gl_Position = vec4(aPos,0.,1.0);\n vTex = (aPos + vec2(1.0))/2.;\n}"; +var COPY_FRAGMENT_SHADER = "precision mediump float;\nvarying vec2 vTex;\n\n#ifdef DEPTH_TEXTURE\nuniform sampler2D uDepth;\n#extension GL_EXT_frag_depth : enable\n#endif\nvoid main(){\n #ifdef DEPTH_TEXTURE\n gl_FragDepthEXT = texture2D(uDepth,vTex).r;\n #endif\n}\n"; +function createCopyShader(level, writeDepth) { + var webgl2 = level === 2; + return { + name: EFFECTS_COPY_MESH_NAME, + vertex: COPY_VERTEX_SHADER, + fragment: COPY_FRAGMENT_SHADER, + glslVersion: webgl2 ? exports.GLSLVersion.GLSL3 : exports.GLSLVersion.GLSL1, + macros: [ + [ + "DEPTH_TEXTURE", + !!writeDepth + ] + ], + // @ts-expect-error + cacheId: COPY_MESH_SHADER_ID + +writeDepth + }; +} + +var def = { + format: glContext.RGBA, + type: glContext.UNSIGNED_BYTE, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR, + wrapS: glContext.CLAMP_TO_EDGE, + wrapT: glContext.CLAMP_TO_EDGE +}; +var disposeSymbol = Symbol("dispose"); +var PassTextureCache = /*#__PURE__*/ function() { + function PassTextureCache(engine) { + this.textureCache = {}; + this.textureRef = {}; + this.engine = engine; + } + var _proto = PassTextureCache.prototype; + _proto.requestColorAttachmentTexture = function requestColorAttachmentTexture(request) { + var _this = this; + var width = request.width, height = request.height, name = request.name; + var options = { + sourceType: exports.TextureSourceType.framebuffer, + data: { + width: width, + height: height + }, + name: name + }; + var keys = [ + name + ]; + Object.getOwnPropertyNames(def).forEach(function(name) { + var _request_name; + var value = (_request_name = request[name]) != null ? _request_name : def[name]; + options[name] = value; + keys.push(name, value); + }); + var cacheId = keys.join(":"); + var tex = this.textureCache[cacheId]; + if (tex) { + this.textureRef[cacheId]++; + } else { + var engine = this.engine; + assertExist(engine); + tex = Texture.create(engine, options); + this.textureCache[cacheId] = tex; + this.textureRef[cacheId] = 1; + // @ts-expect-error + tex[disposeSymbol] = tex.dispose; + tex.dispose = function() { + return _this.removeTexture(cacheId); + }; + } + return tex; + }; + _proto.removeTexture = function removeTexture(id) { + var refCount = this.textureRef[id]; + if (refCount <= 1) { + if (refCount < 0) { + console.error("Ref count < 0."); + } + var tex = this.textureCache[id]; + if (tex) { + // @ts-expect-error + tex[disposeSymbol](); + // @ts-expect-error + tex.dispose = tex[disposeSymbol]; + } + delete this.textureCache[id]; + delete this.textureRef[id]; + } else { + this.textureRef[id] = refCount - 1; + } + }; + _proto.dispose = function dispose() { + var _this = this; + Object.keys(this.textureCache).forEach(function(key) { + var texture = _this.textureCache[key]; + // @ts-expect-error + texture[disposeSymbol](); + // @ts-expect-error + texture.dispose = texture[disposeSymbol]; + }); + this.textureCache = {}; + this.textureRef = {}; + this.engine = undefined; + }; + return PassTextureCache; +}(); + +var SemanticMap = /*#__PURE__*/ function() { + function SemanticMap(semantics) { + if (semantics === void 0) semantics = {}; + this.semantics = _extends({}, semantics); + } + var _proto = SemanticMap.prototype; + _proto.toObject = function toObject() { + return _extends({}, this.semantics); + }; + _proto.setSemantic = function setSemantic(name, value) { + if (value === undefined) { + delete this.semantics[name]; + } else { + this.semantics[name] = value; + } + }; + _proto.getSemanticValue = function getSemanticValue(name, state) { + var ret = this.semantics[name]; + if (isFunction(ret)) { + return ret(state); + } + return ret; + }; + _proto.hasSemanticValue = function hasSemanticValue(name) { + return name in this.semantics; + }; + _proto.dispose = function dispose() { + var _this = this; + Object.keys(this.semantics).forEach(function(name) { + delete _this.semantics[name]; + }); + }; + return SemanticMap; +}(); + +var _obj$9; +var BYTES_TYPE_MAP = (_obj$9 = {}, _obj$9[glContext.FLOAT] = Float32Array.BYTES_PER_ELEMENT, _obj$9[glContext.INT] = Int32Array.BYTES_PER_ELEMENT, _obj$9[glContext.SHORT] = Int16Array.BYTES_PER_ELEMENT, _obj$9[glContext.BYTE] = Int8Array.BYTES_PER_ELEMENT, _obj$9); +/** + * Geometry 抽象类 + */ var Geometry = /*#__PURE__*/ function(EffectsObject) { + _inherits(Geometry, EffectsObject); + function Geometry() { + var _this; + _this = EffectsObject.apply(this, arguments) || this; + /** + * Geometry 的名称 + */ _this.name = ""; + /** + * 子网格数据 + */ _this.subMeshes = []; + return _this; + } + var _proto = Geometry.prototype; + /** + * 初始化 GPU 资源 + * @override + */ _proto.initialize = function initialize() { + // OVERRIDE + }; + /** + * 几何数据刷新 + */ _proto.flush = function flush() { + // OVERRIDE + }; + return Geometry; +}(EffectsObject); +function generateEmptyTypedArray(type) { + if (type === glContext.INT) { + return new Int32Array(0); + } + if (type === glContext.SHORT) { + return new Int16Array(0); + } + return new Float32Array(0); +} + +/** + * 欧拉角顺序 + */ var EulerOrder; +(function(EulerOrder) { + EulerOrder[EulerOrder["XYZ"] = 0] = "XYZ"; + EulerOrder[EulerOrder["XZY"] = 1] = "XZY"; + EulerOrder[EulerOrder["YXZ"] = 2] = "YXZ"; + EulerOrder[EulerOrder["YZX"] = 3] = "YZX"; + EulerOrder[EulerOrder["ZXY"] = 4] = "ZXY"; + EulerOrder[EulerOrder["ZYX"] = 5] = "ZYX"; +})(EulerOrder || (EulerOrder = {})); +/** + * 欧拉角 + */ var Euler = /*#__PURE__*/ function() { + function Euler(x, y, z, order) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + if (z === void 0) z = 0; + if (order === void 0) order = Euler.DEFAULT_ORDER; + this.x = x; + this.y = y; + this.z = z; + this.order = order; + } + var _proto = Euler.prototype; + /** + * 设置欧拉角 + * @param x - x 方向分量 + * @param y - y 方向分量 + * @param z - z 方向分量 + * @param [order] - 欧拉角顺序 + * @returns + */ _proto.set = function set(x, y, z, order) { + if (order === void 0) order = this.order; + this.x = x; + this.y = y; + this.z = z; + this.order = order; + return this; + }; + _proto.setZero = function setZero(order) { + if (order === void 0) order = this.order; + return this.set(0, 0, 0, order); + }; + /** + * 通过矩阵设置欧拉角 + * @param m - 矩阵 + * @param [order] - 欧拉角顺序 + * @returns + */ _proto.setFromRotationMatrix4 = function setFromRotationMatrix4(m, order) { + if (order === void 0) order = this.order; + var te = m.elements; + var m11 = te[0]; + var m12 = te[4]; + var m13 = te[8]; + var m21 = te[1]; + var m22 = te[5]; + var m23 = te[9]; + var m31 = te[2]; + var m32 = te[6]; + var m33 = te[10]; + switch(order){ + case EulerOrder.XYZ: + this.y = Math.asin(clamp$1(m13, -1, 1)); + if (Math.abs(m13) < 0.9999999) { + this.x = Math.atan2(-m23, m33); + this.z = Math.atan2(-m12, m11); + } else { + this.x = Math.atan2(m32, m22); + this.z = 0; + } + break; + case EulerOrder.YXZ: + this.x = Math.asin(-clamp$1(m23, -1, 1)); + if (Math.abs(m23) < 0.9999999) { + this.y = Math.atan2(m13, m33); + this.z = Math.atan2(m21, m22); + } else { + this.y = Math.atan2(-m31, m11); + this.z = 0; + } + break; + case EulerOrder.ZXY: + this.x = Math.asin(clamp$1(m32, -1, 1)); + if (Math.abs(m32) < 0.9999999) { + this.y = Math.atan2(-m31, m33); + this.z = Math.atan2(-m12, m22); + } else { + this.y = 0; + this.z = Math.atan2(m21, m11); + } + break; + case EulerOrder.ZYX: + this.y = Math.asin(-clamp$1(m31, -1, 1)); + if (Math.abs(m31) < 0.9999999) { + this.x = Math.atan2(m32, m33); + this.z = Math.atan2(m21, m11); + } else { + this.x = 0; + this.z = Math.atan2(-m12, m22); + } + break; + case EulerOrder.YZX: + this.z = Math.asin(clamp$1(m21, -1, 1)); + if (Math.abs(m21) < 0.9999999) { + this.x = Math.atan2(-m23, m22); + this.y = Math.atan2(-m31, m11); + } else { + this.x = 0; + this.y = Math.atan2(m13, m33); + } + break; + case EulerOrder.XZY: + this.z = Math.asin(-clamp$1(m12, -1, 1)); + if (Math.abs(m12) < 0.9999999) { + this.x = Math.atan2(m32, m22); + this.y = Math.atan2(m13, m11); + } else { + this.x = Math.atan2(-m23, m33); + this.y = 0; + } + break; + default: + console.error("setFromRotationMatrix: unknown order: " + order); + } + this.x *= RAD2DEG; + this.y *= RAD2DEG; + this.z *= RAD2DEG; + this.order = order; + return this; + }; + /** + * 通过四元数设置欧拉角 + * @param quat - 四元数 + * @param [order] - 欧拉角顺序 + * @returns + */ _proto.setFromQuaternion = function setFromQuaternion(quat, order) { + if (order === void 0) order = this.order; + var matrix = Euler.tempMat0; + matrix.setFromQuaternion(quat); + return this.setFromRotationMatrix4(matrix, order); + }; + /** + * 通过三维向量设置欧拉角 + * @param v - 三维向量 + * @param [order] - 欧拉角顺序 + * @returns + */ _proto.setFromVector3 = function setFromVector3(v, order) { + if (order === void 0) order = this.order; + return this.set(v.x, v.y, v.z, order); + }; + /** + * 通过数组设置欧拉角 + * @param array - 数组 + * @param [offset=0] - 偏移 + * @param [order] - 欧拉角顺序 + * @returns + */ _proto.setFromArray = function setFromArray(array, offset, order) { + if (offset === void 0) offset = 0; + if (order === void 0) order = this.order; + var _array_offset; + this.x = (_array_offset = array[offset]) != null ? _array_offset : 0; + var _array_; + this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0; + var _array_1; + this.z = (_array_1 = array[offset + 2]) != null ? _array_1 : 0; + var _array_2; + this.order = (_array_2 = array[offset + 3]) != null ? _array_2 : order; + return this; + }; + /** + * 克隆欧拉角 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Euler(this.x, this.y, this.z, this.order); + }; + /** + * 复制欧拉角 + * @param euler - 复制对象 + * @returns 复制结果 + */ _proto.copyFrom = function copyFrom(euler) { + this.x = euler.x; + this.y = euler.y; + this.z = euler.z; + this.order = euler.order; + return this; + }; + _proto.add = function add(euler) { + if (this.order != euler.order) { + console.error("add euler with different order"); + return this; + } + this.x += euler.x; + this.y += euler.y; + this.z += euler.z; + return this; + }; + _proto.addEulers = function addEulers(left, right) { + if (left.order != right.order) { + console.error("add euler with different order"); + return this; + } + this.x = left.x + right.x; + this.y = left.y + right.y; + this.z = left.z + right.z; + this.order = left.order; + return this; + }; + _proto.negate = function negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + /** + * 修改欧拉角顺序 + * @param newOrder - 欧拉角顺序 + * @returns 修改结果 + */ _proto.reorder = function reorder(newOrder) { + var quaternion = new Quaternion(); + quaternion.setFromEuler(this); + return this.setFromQuaternion(quaternion, newOrder); + }; + /** + * 通过四元数旋转向量 + * @param v - 待旋转向量 + * @param out - 旋转结果,如果没有传入直接覆盖输入值 + * @returns + */ _proto.rotateVector3 = function rotateVector3(v, out) { + var q = Euler.tempQuat0; + return q.setFromEuler(this).rotateVector3(v, out); + }; + /** + * 欧拉角相等判断 + * @param euler - 欧拉角 + * @returns 判断结果 + */ _proto.equals = function equals(euler) { + return euler.x === this.x && euler.y === this.y && euler.z === this.z && euler.order === this.order; + }; + /** + * 欧拉角保存于三维向量 + * @param vec - 目标保存对象 + * @returns 保存结果 + */ _proto.toVector3 = function toVector3(vec) { + return vec.set(this.x, this.y, this.z); + }; + /** + * 欧拉角转数组 + * @returns 保存结果 + */ _proto.toArray = function toArray() { + return [ + this.x, + this.y, + this.z + ]; + }; + /** + * 欧拉角转四元数 + * @param quat - 目标四元数 + * @returns 目标四元数 + */ _proto.toQuaternion = function toQuaternion(quat) { + var _this = this, x = _this.x, y = _this.y, z = _this.z, order = _this.order; + var c1 = Math.cos(x * DEG2RAD * 0.5); + var c2 = Math.cos(y * DEG2RAD * 0.5); + var c3 = Math.cos(z * DEG2RAD * 0.5); + var s1 = Math.sin(x * DEG2RAD * 0.5); + var s2 = Math.sin(y * DEG2RAD * 0.5); + var s3 = Math.sin(z * DEG2RAD * 0.5); + switch(order){ + case EulerOrder.XYZ: + quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3); + break; + case EulerOrder.YXZ: + quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3); + break; + case EulerOrder.ZXY: + quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3); + break; + case EulerOrder.ZYX: + quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3); + break; + case EulerOrder.YZX: + quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3); + break; + case EulerOrder.XZY: + quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3); + break; + default: + console.error("unknown euler order: " + order); + } + return quat; + }; + /** + * 欧拉角转矩阵 + * @param mat - 目标矩阵 + * @returns 返回目标矩阵 + */ _proto.toMatrix4 = function toMatrix4(mat) { + var me = mat.elements; + var _this = this, x = _this.x, y = _this.y, z = _this.z, order = _this.order; + var cosX = Math.cos(x * DEG2RAD), sinX = Math.sin(x * DEG2RAD); + var cosY = Math.cos(y * DEG2RAD), sinY = Math.sin(y * DEG2RAD); + var cosZ = Math.cos(z * DEG2RAD), sinZ = Math.sin(z * DEG2RAD); + if (order === EulerOrder.XYZ) { + var cosXcosZ = cosX * cosZ; + var cosXsinZ = cosX * sinZ; + var sinXcosZ = sinX * cosZ; + var sinXsinZ = sinX * sinZ; + me[0] = cosY * cosZ; + me[4] = -cosY * sinZ; + me[8] = sinY; + me[1] = cosXsinZ + sinXcosZ * sinY; + me[5] = cosXcosZ - sinXsinZ * sinY; + me[9] = -sinX * cosY; + me[2] = sinXsinZ - cosXcosZ * sinY; + me[6] = sinXcosZ + cosXsinZ * sinY; + me[10] = cosX * cosY; + } else if (order === EulerOrder.YXZ) { + var cosYcosZ = cosY * cosZ; + var cosYsinZ = cosY * sinZ; + var sinYcosZ = sinY * cosZ; + var sinYsinZ = sinY * sinZ; + me[0] = cosYcosZ + sinYsinZ * sinX; + me[4] = sinYcosZ * sinX - cosYsinZ; + me[8] = cosX * sinY; + me[1] = cosX * sinZ; + me[5] = cosX * cosZ; + me[9] = -sinX; + me[2] = cosYsinZ * sinX - sinYcosZ; + me[6] = sinYsinZ + cosYcosZ * sinX; + me[10] = cosX * cosY; + } else if (order === EulerOrder.ZXY) { + var cosYcosZ1 = cosY * cosZ; + var cosYsinZ1 = cosY * sinZ; + var sinYcosZ1 = sinY * cosZ; + var sinYsinZ1 = sinY * sinZ; + me[0] = cosYcosZ1 - sinYsinZ1 * sinX; + me[4] = -cosX * sinZ; + me[8] = sinYcosZ1 + cosYsinZ1 * sinX; + me[1] = cosYsinZ1 + sinYcosZ1 * sinX; + me[5] = cosX * cosZ; + me[9] = sinYsinZ1 - cosYcosZ1 * sinX; + me[2] = -cosX * sinY; + me[6] = sinX; + me[10] = cosX * cosY; + } else if (order === EulerOrder.ZYX) { + var cosXcosZ1 = cosX * cosZ; + var cosXsinZ1 = cosX * sinZ; + var sinXcosZ1 = sinX * cosZ; + var sinXsinZ1 = sinX * sinZ; + me[0] = cosY * cosZ; + me[4] = sinXcosZ1 * sinY - cosXsinZ1; + me[8] = cosXcosZ1 * sinY + sinXsinZ1; + me[1] = cosY * sinZ; + me[5] = sinXsinZ1 * sinY + cosXcosZ1; + me[9] = cosXsinZ1 * sinY - sinXcosZ1; + me[2] = -sinY; + me[6] = sinX * cosY; + me[10] = cosX * cosY; + } else if (order === EulerOrder.YZX) { + var cosXcosY = cosX * cosY; + var cosXsinY = cosX * sinY; + var sinXcosY = sinX * cosY; + var sinXsinY = sinX * sinY; + me[0] = cosY * cosZ; + me[4] = sinXsinY - cosXcosY * sinZ; + me[8] = sinXcosY * sinZ + cosXsinY; + me[1] = sinZ; + me[5] = cosX * cosZ; + me[9] = -sinX * cosZ; + me[2] = -sinY * cosZ; + me[6] = cosXsinY * sinZ + sinXcosY; + me[10] = cosXcosY - sinXsinY * sinZ; + } else if (order === EulerOrder.XZY) { + var cosXcosY1 = cosX * cosY; + var cosXsinY1 = cosX * sinY; + var sinXcosY1 = sinX * cosY; + var sinXsinY1 = sinX * sinY; + me[0] = cosY * cosZ; + me[4] = -sinZ; + me[8] = sinY * cosZ; + me[1] = cosXcosY1 * sinZ + sinXsinY1; + me[5] = cosX * cosZ; + me[9] = cosXsinY1 * sinZ - sinXcosY1; + me[2] = sinXcosY1 * sinZ - cosXsinY1; + me[6] = sinX * cosZ; + me[10] = sinXsinY1 * sinZ + cosXcosY1; + } else { + console.error("toMatrix4: Invalid order " + order); + } + // bottom row + me[3] = 0; + me[7] = 0; + me[11] = 0; + // last column + me[12] = 0; + me[13] = 0; + me[14] = 0; + me[15] = 1; + return mat; + }; + /** + * 通过矩阵创建欧拉角 + * @param m - 矩阵 + * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序 + * @returns 创建结果 + */ Euler.fromRotationMatrix4 = function fromRotationMatrix4(m, order) { + if (order === void 0) order = Euler.DEFAULT_ORDER; + return new Euler().setFromRotationMatrix4(m, order); + }; + /** + * 通过四元数创建欧拉角 + * @param quat - 四元数 + * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序 + * @returns 创建结果 + */ Euler.fromQuaternion = function fromQuaternion(quat, order) { + if (order === void 0) order = Euler.DEFAULT_ORDER; + return new Euler().setFromQuaternion(quat, order); + }; + /** + * 通过三维向量创建欧拉角 + * @param v - 三维向量 + * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序 + * @returns 创建结果 + */ Euler.fromVector3 = function fromVector3(v, order) { + if (order === void 0) order = Euler.DEFAULT_ORDER; + return new Euler().setFromVector3(v, order); + }; + /** + * 通过数组创建欧拉角 + * @param array - 数组 + * @param [offset=0] - 偏移 + * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序 + * @returns 创建结果 + */ Euler.fromArray = function fromArray(array, offset, order) { + if (offset === void 0) offset = 0; + if (order === void 0) order = Euler.DEFAULT_ORDER; + return new Euler().setFromArray(array, offset, order); + }; + return Euler; +}(); +Euler.DEFAULT_ORDER = EulerOrder.ZYX; +Euler.tempQuat0 = new Quaternion(); +Euler.tempMat0 = new Matrix4$1(); + +/** + * 三维矩阵(列优先矩阵) + */ var Matrix3 = /*#__PURE__*/ function() { + function Matrix3(m11, m21, m31, m12, m22, m32, m13, m23, m33) { + if (m11 === void 0) m11 = 1; + if (m21 === void 0) m21 = 0; + if (m31 === void 0) m31 = 0; + if (m12 === void 0) m12 = 0; + if (m22 === void 0) m22 = 1; + if (m32 === void 0) m32 = 0; + if (m13 === void 0) m13 = 0; + if (m23 === void 0) m23 = 0; + if (m33 === void 0) m33 = 1; + this.elements = [ + m11, + m21, + m31, + m12, + m22, + m32, + m13, + m23, + m33 + ]; + } + var _proto = Matrix3.prototype; + /** + * 设置矩阵 + * @param m11 - 第 1 行,第 1 列 + * @param m21 - 第 2 行,第 1 列 + * @param m31 - 第 3 行,第 1 列 + * @param m12 - 第 1 行,第 2 列 + * @param m22 - 第 2 行,第 2 列 + * @param m32 - 第 3 行,第 2 列 + * @param m13 - 第 1 行,第 3 列 + * @param m23 - 第 2 行,第 3 列 + * @param m33 - 第 3 行,第 3 列 + * @returns + */ _proto.set = function set(m11, m21, m31, m12, m22, m32, m13, m23, m33) { + var e = this.elements; + e[0] = m11; + e[3] = m12; + e[6] = m13; + e[1] = m21; + e[4] = m22; + e[7] = m23; + e[2] = m31; + e[5] = m32; + e[8] = m33; + return this; + }; + /** + * 设置矩阵通过行优先数据 + * @param m11 - 第 1 行,第 1 列 + * @param m12 - 第 1 行,第 2 列 + * @param m13 - 第 1 行,第 3 列 + * @param m21 - 第 2 行,第 1 列 + * @param m22 - 第 2 行,第 2 列 + * @param m23 - 第 2 行,第 3 列 + * @param m31 - 第 3 行,第 1 列 + * @param m32 - 第 3 行,第 2 列 + * @param m33 - 第 3 行,第 3 列 + * @returns 矩阵 + */ _proto.setFromRowMajorData = function setFromRowMajorData(m11, m12, m13, m21, m22, m23, m31, m32, m33) { + var e = this.elements; + e[0] = m11; + e[3] = m12; + e[6] = m13; + e[1] = m21; + e[4] = m22; + e[7] = m23; + e[2] = m31; + e[5] = m32; + e[8] = m33; + return this; + }; + /** + * 通过列向量设置矩阵 + * @param c1 - 第一列 + * @param c2 - 第二列 + * @param c3 - 第三列 + * @returns 矩阵 + */ _proto.setFromColumnVectors = function setFromColumnVectors(c1, c2, c3) { + return this.set(c1.x, c1.y, c1.z, c2.x, c2.y, c2.z, c3.x, c3.y, c3.z); + }; + /** + * 通过四阶矩阵设置三阶矩阵 + * @param m - 四阶矩阵 + * @returns 矩阵 + */ _proto.setFromMatrix4 = function setFromMatrix4(m) { + var me = m.elements; + return this.set(me[0], me[1], me[2], me[4], me[5], me[6], me[8], me[9], me[10]); + }; + /** + * 通过数组设置矩阵 + * @param array - 数组 + * @param [offset=0] - 起始偏移值 + * @returns 矩阵 + */ _proto.setFromArray = function setFromArray(array, offset) { + if (offset === void 0) offset = 0; + for(var i = 0; i < 9; i++){ + this.elements[i] = array[offset + i]; + } + return this; + }; + /** + * 通过四元数设置矩阵 + * @param quat - 四元数 + * @returns 矩阵 + */ _proto.setFromQuaternion = function setFromQuaternion(quat) { + var x = quat.x, y = quat.y, z = quat.z, w = quat.w; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var te = this.elements; + te[0] = 1 - (yy + zz); + te[1] = xy + wz; + te[2] = xz - wy; + te[3] = xy - wz; + te[4] = 1 - (xx + zz); + te[5] = yz + wx; + te[6] = xz + wy; + te[7] = yz - wx; + te[8] = 1 - (xx + yy); + return this; + }; + /** + * 矩阵清零 + * @returns 零矩阵 + */ _proto.setZero = function setZero() { + for(var i = 0; i < 9; i++){ + this.elements[i] = 0; + } + return this; + }; + /** + * 矩阵单位化 + * @returns 单位矩阵 + */ _proto.identity = function identity() { + return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1); + }; + /** + * 矩阵克隆 + * @returns 克隆结果 + */ _proto.clone = function clone() { + var e = this.elements; + return new Matrix3(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8]); + }; + /** + * 矩阵复制 + * @param m - 复制对象 + * @returns 复制结果 + */ _proto.copyFrom = function copyFrom(m) { + this.elements = [].concat(m.elements); + return this; + }; + /** + * 得到列向量 + * @param i - 列向量索引,从 0 开始 + * @returns 列向量 + */ _proto.getColumnVector = function getColumnVector(i, v) { + return v.set(this.elements[i * 3], this.elements[i * 3 + 1], this.elements[i * 3 + 2]); + }; + /** + * 矩阵缩放 + * @param sx - x 轴缩放分量 + * @param sy - y 轴缩放分量 + * @returns 缩放结果 + */ _proto.scale = function scale(sx, sy) { + var e = this.elements; + e[0] *= sx; + e[3] *= sx; + e[6] *= sx; + e[1] *= sy; + e[4] *= sy; + e[7] *= sy; + return this; + }; + /** + * 矩阵旋转 + * @param theta - 旋转角度(弧度) + * @returns 旋转结果 + */ _proto.rotate = function rotate(theta) { + var c = Math.cos(theta); + var s = Math.sin(theta); + var e = this.elements; + var m11 = e[0], m12 = e[3], m13 = e[6]; + var m21 = e[1], m22 = e[4], m23 = e[7]; + e[0] = c * m11 + s * m21; + e[3] = c * m12 + s * m22; + e[6] = c * m13 + s * m23; + e[1] = -s * m11 + c * m21; + e[4] = -s * m12 + c * m22; + e[7] = -s * m13 + c * m23; + return this; + }; + /** + * 矩阵平移 + * @param x - x 轴平移分量 + * @param y - y 轴平移分量 + * @returns 平移结果 + */ _proto.translate = function translate(x, y) { + var e = this.elements; + e[0] += x * e[2]; + e[3] += x * e[5]; + e[6] += x * e[8]; + e[1] += y * e[2]; + e[4] += y * e[5]; + e[7] += y * e[8]; + return this; + }; + /** + * 矩阵右乘 + * @param right - 相乘矩阵 + * @returns 右乘结果 + */ _proto.multiply = function multiply(right) { + if (typeof right === "number") { + for(var i = 0; i < 9; i++){ + this.elements[i] *= right; + } + return this; + } else { + return this.multiplyMatrices(this, right); + } + }; + /** + * 矩阵左乘 + * @param left - 相乘矩阵 + * @returns 左乘结果 + */ _proto.premultiply = function premultiply(left) { + return this.multiplyMatrices(left, this); + }; + /** + * 矩阵乘法 + * @param left - 矩阵 + * @param right - 矩阵 + * @returns 相乘结果 + */ _proto.multiplyMatrices = function multiplyMatrices(left, right) { + var ae = left.elements; + var be = right.elements; + var te = this.elements; + var a11 = ae[0], a12 = ae[3], a13 = ae[6]; + var a21 = ae[1], a22 = ae[4], a23 = ae[7]; + var a31 = ae[2], a32 = ae[5], a33 = ae[8]; + var b11 = be[0], b12 = be[3], b13 = be[6]; + var b21 = be[1], b22 = be[4], b23 = be[7]; + var b31 = be[2], b32 = be[5], b33 = be[8]; + te[0] = a11 * b11 + a12 * b21 + a13 * b31; + te[3] = a11 * b12 + a12 * b22 + a13 * b32; + te[6] = a11 * b13 + a12 * b23 + a13 * b33; + te[1] = a21 * b11 + a22 * b21 + a23 * b31; + te[4] = a21 * b12 + a22 * b22 + a23 * b32; + te[7] = a21 * b13 + a22 * b23 + a23 * b33; + te[2] = a31 * b11 + a32 * b21 + a33 * b31; + te[5] = a31 * b12 + a32 * b22 + a33 * b32; + te[8] = a31 * b13 + a32 * b23 + a33 * b33; + return this; + }; + /** + * 矩阵求行列式值 + * @returns 行列式结果 + */ _proto.determinant = function determinant() { + var e = this.elements; + var m11 = e[0], m21 = e[3], m31 = e[6]; + var m12 = e[1], m22 = e[4], m32 = e[7]; + var m13 = e[2], m23 = e[5], m33 = e[8]; + return m11 * (m22 * m33 - m23 * m32) + m12 * (m23 * m31 - m21 * m33) + m13 * (m21 * m32 - m22 * m31); + }; + /** + * 矩阵求逆 + * @returns 逆矩阵 + */ _proto.invert = function invert() { + var e = this.elements; + var m11 = e[0], m12 = e[3], m13 = e[6]; + var m21 = e[1], m22 = e[4], m23 = e[7]; + var m31 = e[2], m32 = e[5], m33 = e[8]; + var t11 = m33 * m22 - m32 * m23; + var t12 = m32 * m13 - m33 * m12; + var t13 = m23 * m12 - m22 * m13; + var det = m11 * t11 + m21 * t12 + m31 * t13; + if (det === 0) { + return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); + } + var detInv = 1 / det; + e[0] = t11 * detInv; + e[1] = (m31 * m23 - m33 * m21) * detInv; + e[2] = (m32 * m21 - m31 * m22) * detInv; + e[3] = t12 * detInv; + e[4] = (m33 * m11 - m31 * m13) * detInv; + e[5] = (m31 * m12 - m32 * m11) * detInv; + e[6] = t13 * detInv; + e[7] = (m21 * m13 - m23 * m11) * detInv; + e[8] = (m22 * m11 - m21 * m12) * detInv; + return this; + }; + /** + * 矩阵转置 + * @returns 转置结果 + */ _proto.transpose = function transpose() { + var t; + var m = this.elements; + t = m[1]; + m[1] = m[3]; + m[3] = t; + t = m[2]; + m[2] = m[6]; + m[6] = t; + t = m[5]; + m[5] = m[7]; + m[7] = t; + return this; + }; + /** + * 对点进行矩阵变换 + * @param v - 输入点 + * @param out - 输出点,如果没有会覆盖输入的数据 + * @returns 变换后的结果 + */ _proto.transformPoint = function transformPoint(v, out) { + var x = v.x, y = v.y, z = v.z; + var e = this.elements; + var res = out != null ? out : v; + res.x = e[0] * x + e[3] * y + e[6] * z; + res.y = e[1] * x + e[4] * y + e[7] * z; + res.z = e[2] * x + e[5] * y + e[8] * z; + return res; + }; + /** + * 对法向量进行矩阵变换 + * @param v - 输入向量 + * @param out - 输出向量,如果没有会覆盖输入的数据 + * @returns 变换后的结果 + */ _proto.transformNormal = function transformNormal(v, out) { + return this.transformPoint(v, out).normalize(); + }; + /** + * 矩阵判等 + * @param matrix - 矩阵 + * @returns 判等结果 + */ _proto.equals = function equals(matrix) { + var te = this.elements; + var me = matrix.elements; + for(var i = 0; i < 9; i++){ + if (!isEqual(te[i], me[i])) { + return false; + } + } + return true; + }; + /** + * 矩阵转为数组 + * @returns + */ _proto.toArray = function toArray() { + return [].concat(this.elements); + }; + _proto.fill = function fill(array, offset) { + if (offset === void 0) offset = 0; + var e = this.elements; + array[offset] = e[0]; + array[offset + 1] = e[1]; + array[offset + 2] = e[2]; + array[offset + 3] = e[3]; + array[offset + 4] = e[4]; + array[offset + 5] = e[5]; + array[offset + 6] = e[6]; + array[offset + 7] = e[7]; + array[offset + 8] = e[8]; + }; + /** + * 创建单位阵 + * @returns 单位矩阵 + */ Matrix3.fromIdentity = function fromIdentity() { + return new Matrix3(1, 0, 0, 0, 1, 0, 0, 0, 1); + }; + /** + * 通过列向量创建矩阵 + * @param c1 - 第一列 + * @param c2 - 第二列 + * @param c3 - 第三列 + * @returns 矩阵 + */ Matrix3.fromColumnVectors = function fromColumnVectors(c1, c2, c3) { + return new Matrix3().setFromColumnVectors(c1, c2, c3); + }; + /** + * 通过四阶矩阵创建矩阵(获取空间变换矩阵旋转缩放部分) + * @param m - 四阶矩阵 + * @returns 矩阵 + */ Matrix3.fromMatrix4 = function fromMatrix4(m) { + return new Matrix3().setFromMatrix4(m); + }; + /** + * 通过数组创建矩阵 + * @param array - 数组(列优先) + * @param [offset=0] - 起始偏移值 + * @returns 矩阵 + */ Matrix3.fromArray = function fromArray(array, offset) { + if (offset === void 0) offset = 0; + return new Matrix3().setFromArray(array, offset); + }; + /** + * 通过四元数创建矩阵 + * @param quat - 四元数 + * @returns 矩阵 + */ Matrix3.fromQuaternion = function fromQuaternion(quat) { + return new Matrix3().setFromQuaternion(quat); + }; + /** + * 设置矩阵通过行优先数据 + * @param m11 - 第 1 行,第 1 列 + * @param m12 - 第 1 行,第 2 列 + * @param m13 - 第 1 行,第 3 列 + * @param m21 - 第 2 行,第 1 列 + * @param m22 - 第 2 行,第 2 列 + * @param m23 - 第 2 行,第 3 列 + * @param m31 - 第 3 行,第 1 列 + * @param m32 - 第 3 行,第 2 列 + * @param m33 - 第 3 行,第 3 列 + * @returns 矩阵 + */ Matrix3.fromRowMajorData = function fromRowMajorData(m11, m12, m13, m21, m22, m23, m31, m32, m33) { + return new Matrix3(m11, m21, m31, m12, m22, m32, m13, m23, m33); + }; + return Matrix3; +}(); + +/** + * 光线类 + */ var Ray = /*#__PURE__*/ function() { + function Ray(origin, direction) { + if (origin === void 0) origin = Vector3.ZERO; + if (direction === void 0) direction = Vector3.X; + /** + * 光线的原点 + */ this.origin = new Vector3(); + /** + * 光线的方向 + */ this.direction = new Vector3(); + // 注意这里必须拷贝 + this.origin.copyFrom(origin); + this.direction.copyFrom(direction).normalize(); + } + var _proto = Ray.prototype; + /** + * 光线设置 + * @param origin - 原点 + * @param direction - 方向 + * @returns + */ _proto.set = function set(origin, direction) { + this.origin.copyFrom(origin); + this.direction.copyFrom(direction).normalize(); + return this; + }; + /** + * 光线克隆 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Ray(this.origin, this.direction); + }; + /** + * 光线拷贝 + * @param ray - 要拷贝对象 + * @returns 拷贝结果 + */ _proto.copyFrom = function copyFrom(ray) { + return this.set(ray.origin, ray.direction); + }; + /** + * 根据t计算新的光线原点 + * @param t - 光线的系数 t + * @returns + */ _proto.recast = function recast(t) { + this.origin.copyFrom(this.at(t, Ray.tempVec0)); + return this; + }; + /** + * 根据t值计算光线上的点 + * @param t - 光线的系数 t + * @param [out] - 计算的点 + * @returns + */ _proto.at = function at(t, out) { + var ret = out ? out : new Vector3(); + ret.copyFrom(this.origin); + return ret.addScaledVector(this.direction, t); + }; + /** + * 光线相等判断 + * @param other - 其他对象 + * @returns + */ _proto.equals = function equals(other) { + return this.origin.equals(other.origin) && this.direction.equals(other.direction); + }; + /** + * 根据矩阵对光线进行变换 + * @param m - 变换矩阵 + * @returns + */ _proto.applyMatrix = function applyMatrix(m) { + this.origin.applyProjectionMatrix(m); + this.direction.applyNormalMatrix(m); + return this; + }; + /** + * 光线和包围盒求交 + * @param box - 类包围盒对象 + * @param [out] - 交点 + * @returns + */ _proto.intersectBox = function intersectBox(box, out) { + var _this_origin = this.origin, ox = _this_origin.x, oy = _this_origin.y, oz = _this_origin.z; + var _this_direction = this.direction, dx = _this_direction.x, dy = _this_direction.y, dz = _this_direction.z; + var _box_min = box.min, bxmin = _box_min.x, bymin = _box_min.y, bzmin = _box_min.z; + var _box_max = box.max, bxmax = _box_max.x, bymax = _box_max.y, bzmax = _box_max.z; + var tmin, tmax, tymin, tymax, tzmin, tzmax; + var invdirx = 1 / dx; + var invdiry = 1 / dy; + var invdirz = 1 / dz; + if (invdirx >= 0) { + tmin = (bxmin - ox) * invdirx; + tmax = (bxmax - ox) * invdirx; + } else { + tmin = (bxmax - ox) * invdirx; + tmax = (bxmin - ox) * invdirx; + } + if (invdiry >= 0) { + tymin = (bymin - oy) * invdiry; + tymax = (bymax - oy) * invdiry; + } else { + tymin = (bymax - oy) * invdiry; + tymax = (bymin - oy) * invdiry; + } + if (tmin > tymax || tymin > tmax) { + return; + } + if (tymin > tmin || tmin !== tmin) { + tmin = tymin; + } + if (tymax < tmax || tmax !== tmax) { + tmax = tymax; + } + if (tymin > tmin || tmin !== tmin) { + tmin = tymin; + } + if (tymax < tmax || tmax !== tmax) { + tmax = tymax; + } + if (invdirz >= 0) { + tzmin = (bzmin - oz) * invdirz; + tzmax = (bzmax - oz) * invdirz; + } else { + tzmin = (bzmax - oz) * invdirz; + tzmax = (bzmin - oz) * invdirz; + } + if (tmin > tzmax || tzmin > tmax) { + return; + } + if (tzmin > tmin || tmin !== tmin) { + tmin = tzmin; + } + if (tzmax < tmax || tmax !== tmax) { + tmax = tzmax; + } + if (tmax < 0) { + return; + } + return tmin >= 0 ? this.at(tmin, out) : this.at(tmax, out); + }; + /** + * 光线和平面求交 + * @param plane - 类平面对象 + * @param [out] - 交点 + * @returns + */ _proto.intersectPlane = function intersectPlane(plane, out) { + var normal = plane.normal; + var distance = plane.distance; + var denominator = normal.dot(this.direction); + if (denominator === 0) { + // line is coplanar, return origin + var t = normal.dot(this.origin) + distance; + if (t === 0) { + var ret = out ? out : new Vector3(); + return ret.copyFrom(this.origin); + } + // Null is preferable to undefined since undefined means.... it is undefined + return; + } + var t1 = -(this.origin.dot(normal) + distance) / denominator; + // Return if the ray never intersects the plane + return t1 >= 0 ? this.at(t1, out) : undefined; + }; + /** + * 光线和圆求交 + * @param sphere - 类球对象 + * @param [out] - 交点 + * @returns + */ _proto.intersectSphere = function intersectSphere(sphere, out) { + var center = sphere.center; + var vector = Ray.tempVec0.subtractVectors(center, this.origin); + var tca = vector.dot(this.direction); + var d2 = vector.dot(vector) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + if (d2 > radius2) { + return; + } + var thc = Math.sqrt(radius2 - d2); + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + // test to see if t1 is behind the ray - if so, return null + if (t1 < 0) { + return; + } + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return t0 >= 0 ? this.at(t0, out) : this.at(t1, out); + }; + /** + * 光线和三角形求交 + * @param triangle - 类三角形对象 + * @param [out] - 交点 + * @param [backfaceCulling] - 是否背面剔除 + * @returns + */ _proto.intersectTriangle = function intersectTriangle(triangle, out, backfaceCulling) { + // FIXME: 交换out和backfaceCulling + // Compute the offset origin, edges, and normal. + // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + var a = triangle.p0; + var b = triangle.p1; + var c = triangle.p2; + var edge1 = Ray.tempVec0.subtractVectors(b, a); + var edge2 = Ray.tempVec1.subtractVectors(c, a); + var diff = Ray.tempVec2.subtractVectors(this.origin, a); + var normal = Ray.tempVec3.crossVectors(edge1, edge2); + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot(normal); + var sign; + if (DdN > 0) { + if (backfaceCulling) { + return; + } + sign = 1; + } else if (DdN < 0) { + sign = -1; + DdN = -DdN; + } else { + return; + } + edge2.crossVectors(diff, edge2); + var DdQxE2 = sign * this.direction.dot(edge2); + // b1 < 0, no intersection + if (DdQxE2 < 0) { + return; + } + edge1.cross(diff); + var DdE1xQ = sign * this.direction.dot(edge1); + // b2 < 0, no intersection + if (DdE1xQ < 0) { + return; + } + // b1+b2 > 1, no intersection + if (DdQxE2 + DdE1xQ > DdN) { + return; + } + // Line intersects triangle, check if ray does. + var QdN = -sign * diff.dot(normal); + // t < 0, no intersection + if (QdN < 0) { + return; + } + // Ray intersects triangle. + return this.at(QdN / DdN, out); + }; + return Ray; +}(); +Ray.tempVec0 = new Vector3(); +Ray.tempVec1 = new Vector3(); +Ray.tempVec2 = new Vector3(); +Ray.tempVec3 = new Vector3(); + +/** + * 三维包围盒 + */ var Box3 = /*#__PURE__*/ function() { + function Box3(min, max) { + if (min === void 0) min = new Vector3(Infinity, Infinity, Infinity); + if (max === void 0) max = new Vector3(-Infinity, -Infinity, -Infinity); + this.min = min.clone(); + this.max = max.clone(); + } + var _proto = Box3.prototype; + /** + * 设置三维包围盒的值 + * @param min - 三维包围盒最小点 + * @param max - 三维包围盒最大点 + * @returns + */ _proto.set = function set(min, max) { + this.min.copyFrom(min); + this.max.copyFrom(max); + return this; + }; + /** + * 通过数组构建三维包围盒 + * @param array - 数组集合(每三个数视为一个三维空间点) + * @returns 三维包围盒 + */ _proto.setFromArray = function setFromArray(array) { + var minX = Number(Infinity); + var minY = Number(Infinity); + var minZ = Number(Infinity); + var maxX = -Infinity; + var maxY = -Infinity; + var maxZ = -Infinity; + for(var i = 0, l = array.length; i < l; i += 3){ + var x = array[i]; + var y = array[i + 1]; + var z = array[i + 2]; + if (x < minX) { + minX = x; + } + if (y < minY) { + minY = y; + } + if (z < minZ) { + minZ = z; + } + if (x > maxX) { + maxX = x; + } + if (y > maxY) { + maxY = y; + } + if (z > maxZ) { + maxZ = z; + } + } + this.min.set(minX, minY, minZ); + this.max.set(maxX, maxY, maxZ); + return this; + }; + /** + * 通过三维空间点构建三维包围盒 + * @param points - 三维空间点集合 + * @returns 三维包围盒 + */ _proto.setFromPoints = function setFromPoints(points) { + this.makeEmpty(); + for(var i = 0, il = points.length; i < il; i++){ + this.expandByPoint(points[i]); + } + return this; + }; + /** + * 通过三维空间点(包围盒中心)和大小确定包围盒 + * @param center - 三维包围盒中心点 + * @param size - 三维包围盒大小值 + * @returns 三维包围盒 + */ _proto.setFromCenterAndSize = function setFromCenterAndSize(center, size) { + var halfSize = size.clone().multiply(0.5); + this.min.copyFrom(center).subtract(halfSize); + this.max.copyFrom(center).add(halfSize); + return this; + }; + // TODO + /** + * 通过实体构建包围盒 + * @param object - 构件实体 + * @returns 三维包围盒 + */ _proto.setFromObject = function setFromObject(object) { + this.makeEmpty(); + return this.expandByObject(object); + }; + /** + * 克隆三维包围盒 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Box3().copyFrom(this); + }; + /** + * 复制三维包围盒 + * @param box - 复制对象 + * @returns 复制结果 + */ _proto.copyFrom = function copyFrom(box) { + this.min.copyFrom(box.min); + this.max.copyFrom(box.max); + return this; + }; + /** + * 三维包围盒置空 + * @returns 置空结果 + */ _proto.makeEmpty = function makeEmpty() { + this.min.x = this.min.y = this.min.z = Number(Infinity); + this.max.x = this.max.y = this.max.z = -Infinity; + return this; + }; + /** + * 三维包围盒判空 + * @returns 判空结果 + */ _proto.isEmpty = function isEmpty() { + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z; + }; + /** + * 获取三维包围盒中心 + * @param [target=new Vector3()] + * @returns + */ _proto.getCenter = function getCenter(target) { + if (target === void 0) target = new Vector3(); + return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiply(0.5); + }; + /** + * 获取三维包围盒大小 + * @param [target=new Vector3()] - 结果保存对象 + * @returns 三维包围盒大小 + */ _proto.getSize = function getSize(target) { + if (target === void 0) target = new Vector3(); + return this.isEmpty() ? target.set(0, 0, 0) : target.subtractVectors(this.max, this.min); + }; + /** + * 通过三维空间点扩展三维包围盒 + * @param point - 三维空间点 + * @returns 扩展结果 + */ _proto.expandByPoint = function expandByPoint(point) { + this.min.min(point); + this.max.max(point); + return this; + }; + /** + * 通过三维向量扩展三维包围盒 + * @param vector - 三维向量 + * @returns 扩展结果 + */ _proto.expandByVector = function expandByVector(vector) { + this.min.subtract(vector); + this.max.add(vector); + return this; + }; + /** + * 通过实数扩展三维包围盒 + * @param scalar - 扩展大小 + * @returns 扩展结果 + */ _proto.expandByScalar = function expandByScalar(scalar) { + this.min.add(-scalar); + this.max.add(scalar); + return this; + }; + /** + * 通过包围盒扩展三维包围盒 + * @param box + * @returns + */ _proto.expandByBox = function expandByBox(box) { + this.min.min(box.min); + this.max.max(box.max); + return this; + }; + // TODO + /** + * 通过实体扩展三维包围盒 + * @param object - 构件实体 + * @returns 扩展结果 + */ _proto.expandByObject = function expandByObject(object) { + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + object.updateWorldMatrix(false, false); + var geometry = object.geometry; + if (geometry !== undefined) { + if (geometry.boundingBox === null) { + geometry.computeBoundingBox(); + } + var box3 = new Box3(); + box3.copyFrom(geometry.boundingBox); + box3.applyMatrix4(object.matrixWorld); + this.union(box3); + } + var children = object.children; + for(var i = 0, l = children.length; i < l; i++){ + this.expandByObject(children[i]); + } + return this; + }; + /** + * 判断三维包围盒相交关系(if this intersect other) + * @param point - 三维空间点 + * @returns 点包含判断结果 + */ _proto.containsPoint = function containsPoint(point) { + return !(point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z); + }; + /** + * 判断三维包围盒与三维包围盒的包含关系 + * @param other - 三维包围盒 + * @returns 包围盒包含结果(true 表示包含 other, false 表示不包含 other) + */ _proto.containsBox = function containsBox(other) { + return this.min.x <= other.min.x && this.max.x >= other.max.x && this.min.y <= other.min.y && this.max.y >= other.max.y && this.min.z <= other.min.z && this.max.z >= other.max.z; + }; + // TODO + /** + * 获取点在三维包围盒的比例位置 + * @param point - 三维空间点 + * @param [target=new Vector3()] - 结果保存对象 + * @returns 点在包围盒比例位置 + */ _proto.getParameter = function getParameter(point, target) { + if (target === void 0) target = new Vector3(); + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y), (point.z - this.min.z) / (this.max.z - this.min.z)); + }; + /** + * 判断三维包围盒相交关系(if this intersect other) + * @param other - 三维包围盒 + * @returns 相交判断结果 + */ _proto.intersectsBox = function intersectsBox(other) { + // using 6 splitting planes to rule out intersections. + return !(other.max.x < this.min.x || other.min.x > this.max.x || other.max.y < this.min.y || other.min.y > this.max.y || other.max.z < this.min.z || other.min.z > this.max.z); + }; + /** + * 判断三维包围盒和球是否相交 + * @param sphere + * @returns + */ _proto.intersectsSphere = function intersectsSphere(sphere) { + // Find the point on the AABB closest to the sphere center. + var vector = new Vector3(); + this.clampPoint(sphere.center, vector); + // If that point is inside the sphere, the AABB and sphere intersect. + return vector.distanceSquared(sphere.center) <= sphere.radius * sphere.radius; + }; + /** + * 求点与三维包围盒的最近点 + * @param point - 三维空间点 + * @param [target=new Vector3()] - 结果存放对象 + * @returns 计算结果 + */ _proto.clampPoint = function clampPoint(point, target) { + if (target === void 0) target = new Vector3(); + return target.copyFrom(point).clamp(this.min, this.max); + }; + /** + * 三维空间点到三维包围盒的距离 + * @param point - 三维包围盒 + * @returns 距离结果 + */ _proto.distanceToPoint = function distanceToPoint(point) { + var clampedPoint = point.clone().clamp(this.min, this.max); + return clampedPoint.subtract(point).length(); + }; + /** + * 三维包围盒求交集 + * @param box - 三维包围盒 + * @returns 求交结果 + */ _proto.intersect = function intersect(box) { + this.min.max(box.min); + this.max.min(box.max); + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if (this.isEmpty()) { + this.makeEmpty(); + } + return this; + }; + /** + * 三维包围盒求并集 + * @param box - 三维包围盒 + * @returns 求并结果 + */ _proto.union = function union(box) { + this.min.min(box.min); + this.max.max(box.max); + return this; + }; + /** + * 通过三维变换矩阵变化三维包围盒 + * @param matrix - 三维变换矩阵 + * @returns 变换结果 + */ _proto.applyMatrix4 = function applyMatrix4(matrix, center) { + if (center === void 0) center = new Vector3(); + // transform of empty box is an empty box. + if (this.isEmpty()) { + return this; + } + var points = this.getOBBPoints(matrix, center); + this.setFromPoints(points); + return this; + }; + _proto.getOBBPoints = function getOBBPoints(matrix, center) { + if (center === void 0) center = new Vector3(); + // transform of empty box is an empty box. + if (this.isEmpty()) { + return []; + } + var points = []; + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[0] = new Vector3(this.min.x, this.min.y, this.min.z); // 000 + points[1] = new Vector3(this.min.x, this.min.y, this.max.z); // 001 + points[2] = new Vector3(this.min.x, this.max.y, this.min.z); // 010 + points[3] = new Vector3(this.min.x, this.max.y, this.max.z); // 011 + points[4] = new Vector3(this.max.x, this.min.y, this.min.z); // 100 + points[5] = new Vector3(this.max.x, this.min.y, this.max.z); // 101 + points[6] = new Vector3(this.max.x, this.max.y, this.min.z); // 110 + points[7] = new Vector3(this.max.x, this.max.y, this.max.z); // 111 + points.forEach(function(p) { + p.subtract(center); + p.applyMatrix(matrix); + p.add(center); + }); + return points; + }; + /** + * 通过包围盒获取包围球 + * @param target + * @returns + */ _proto.getBoundingSphere = function getBoundingSphere(target) { + this.getCenter(target.center); + var vector = new Vector3(); + target.radius = this.getSize(vector).length() * 0.5; + return target; + }; + /** + * 三维包围盒位移 + * @param offset - 三维位移向量 + * @returns 位移结果 + */ _proto.translate = function translate(offset) { + this.min.add(offset); + this.max.add(offset); + return this; + }; + /** + * 三维包围盒判等 + * @param other - 三维包围盒 + * @returns 判等结果 + */ _proto.equals = function equals(other) { + return other.min.equals(this.min) && other.max.equals(this.max); + }; + return Box3; +}(); + +/** + * 球 + */ var Sphere$1 = /*#__PURE__*/ function() { + function Sphere(center, radius) { + if (center === void 0) center = Vector3.ZERO; + if (radius === void 0) radius = -1; + this.center = center.clone(); + this.radius = radius; + } + var _proto = Sphere.prototype; + /** + * 通过参数设置球 + * @param center - 球心 + * @param radius - 半径 + * @returns + */ _proto.set = function set(center, radius) { + this.center.copyFrom(center); + this.radius = radius; + return this; + }; + /** + * 通过空间点与球心设置球 + * @param points - 三维空间点 + * @param [optionalCenter] - 指定球心 + * @returns + */ _proto.setFromPoints = function setFromPoints(points, optionalCenter) { + var center = this.center; + if (optionalCenter !== undefined) { + center.copyFrom(optionalCenter); + var maxRadiusSq = 0; + for(var i = 0; i < points.length; i++){ + maxRadiusSq = Math.max(maxRadiusSq, center.distanceSquared(points[i])); + } + this.radius = Math.sqrt(maxRadiusSq); + } else { + var box = new Box3().setFromPoints(points); + box.getCenter(center); + this.radius = box.getSize().length() / 2; + } + return this; + }; + /** + * 复制球 + * @param sphere - 球信息 + * @returns 复制结果 + */ _proto.copyFrom = function copyFrom(sphere) { + this.center.copyFrom(sphere.center); + this.radius = sphere.radius; + return this; + }; + /** + * 球判空 + * @returns 判空结果 + */ _proto.isEmpty = function isEmpty() { + return this.radius < 0; + }; + /** + * 球置空 + * @returns 置空结果 + */ _proto.makeEmpty = function makeEmpty() { + this.center.set(0, 0, 0); + this.radius = -1; + return this; + }; + /** + * 三维空间点包围判断 + * @param point - 三维空间点 + * @returns 空间点包含判断 + */ _proto.containsPoint = function containsPoint(point) { + return point.distanceSquared(this.center) <= this.radius * this.radius; + }; + /** + * 空间点与球表面的最短距离 + * @param point - 三维空间点 + * @returns 距离结果 + */ _proto.distanceToPoint = function distanceToPoint(point) { + return point.distance(this.center) - this.radius; + }; + /** + * 与球相交判断 + * @param sphere - 球 + * @returns 相交判断结果 + */ _proto.intersectsSphere = function intersectsSphere(sphere) { + var radiusSum = this.radius + sphere.radius; + return sphere.center.distanceSquared(this.center) <= radiusSum * radiusSum; + }; + /** + * 与包围盒相交判断 + * @param box - 三维包围盒 + * @returns 相交判断结果 + */ _proto.intersectsBox = function intersectsBox(box) { + return box.intersectsSphere(this); + }; + /** + * 收敛空间点在球范围内 + * 注:乘法的效率要比开方高很多 + * @param point - 三维空间点 + * @param [target] - 结果保存对象 + * @returns 收敛结果 + */ _proto.clampPoint = function clampPoint(point, target) { + var deltaLengthSq = this.center.distanceSquared(point); + if (target === undefined) { + target = new Vector3(); + } + target.copyFrom(point); + if (deltaLengthSq > this.radius * this.radius) { + target.subtract(this.center).normalize(); + target.multiply(this.radius).add(this.center); + } + return target; + }; + /** + * 根据包围盒获取球 + * @param target - 包围盒 + * @returns 球 + */ _proto.getBoundingBox = function getBoundingBox(target) { + if (target === undefined) { + target = new Box3(); + } + if (this.isEmpty()) { + // Empty sphere produces empty bounding box + target.makeEmpty(); + return target; + } + target.set(this.center, this.center); + target.expandByScalar(this.radius); + return target; + }; + /** + * 球空间变换 + * @param matrix - 空间变化矩阵 + * @returns 变换结果 + */ _proto.applyMatrix4 = function applyMatrix4(matrix) { + var mt = matrix.elements; + var scaleXSq = mt[0] * mt[0] + mt[1] * mt[1] + mt[2] * mt[2]; + var scaleYSq = mt[4] * mt[4] + mt[5] * mt[5] + mt[6] * mt[6]; + var scaleZSq = mt[8] * mt[8] + mt[9] * mt[9] + mt[10] * mt[10]; + var maxScale = Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); + this.center.applyMatrix(matrix); + this.radius = this.radius * maxScale; + return this; + }; + /** + * 球位移 + * @param offset - 位移信息 + * @returns 位移结果 + */ _proto.translate = function translate(offset) { + this.center.add(offset); + return this; + }; + /** + * 通过三维空间点对球进行扩展 + * @param point - 扩展点 + * @returns 扩展结果 + */ _proto.expandByPoint = function expandByPoint(point) { + var vector = new Vector3().subtractVectors(point, this.center); + var lengthSquared = vector.lengthSquared(); + if (lengthSquared > this.radius * this.radius) { + var length = Math.sqrt(lengthSquared); + var missingRadiusHalf = (length - this.radius) * 0.5; + // Nudge this sphere towards the target point. Add half the missing distance to radius, + // and the other half to position. This gives a tighter enclosure, instead of if + // the whole missing distance were just added to radius. + this.center.add(vector.multiply(missingRadiusHalf / length)); + this.radius += missingRadiusHalf; + } + return this; + }; + /** + * 包围球求并集 + * @param sphere - 包围球 + * @returns 求并结果 + */ _proto.union = function union(sphere) { + // To enclose another sphere into this sphere, we only need to enclose two points: + // 1) Enclose the farthest point on the other sphere into this sphere. + // 2) Enclose the opposite point of the farthest point into this sphere. + var v1 = new Vector3(); + var toFarthestPoint = new Vector3(); + toFarthestPoint.subtractVectors(sphere.center, this.center).normalize().multiply(sphere.radius); + this.expandByPoint(v1.copyFrom(sphere.center).add(toFarthestPoint)); + this.expandByPoint(v1.copyFrom(sphere.center).subtract(toFarthestPoint)); + return this; + }; + /** + * 包围球求交集 + * @param other - 其它包围球 + * @returns 求交结果 + */ _proto.intersect = function intersect(other) { + var vector = new Vector3().subtractVectors(this.center, other.center); + var distance = vector.length(); + var radiusSum = this.radius + other.radius; + if (distance > radiusSum) { + return this.makeEmpty(); + } + this.center = this.center.add(vector.normalize().multiply(distance / 2)); + this.radius = this.radius + other.radius - distance; + return this; + }; + /** + * 包围球判等 + * @param sphere - 包围球 + * @returns 判等结果 + */ _proto.equals = function equals(sphere) { + return sphere.center.equals(this.center) && sphere.radius === this.radius; + }; + /** + * 包围球克隆 + * @returns 克隆结果 + */ _proto.clone = function clone() { + return new Sphere().copyFrom(this); + }; + return Sphere; +}(); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + get EulerOrder () { return EulerOrder; }, + Euler: Euler, + Quaternion: Quaternion, + Vector2: Vector2, + Vector3: Vector3, + Vector4: Vector4$1, + Matrix3: Matrix3, + Matrix4: Matrix4$1, + Ray: Ray, + PI2: PI2, + DEG2RAD: DEG2RAD, + RAD2DEG: RAD2DEG, + NumberEpsilon: NumberEpsilon, + isZero: isZero, + isEqual: isEqual, + damp: damp, + lerp: lerp, + degToRad: degToRad, + radToDeg: radToDeg, + clamp: clamp$1, + Color: Color, + Box3: Box3, + Sphere: Sphere$1 +}); + +var seed$b = 1; +/** + * Mesh 抽象类 + */ var Mesh = /*#__PURE__*/ function(RendererComponent) { + _inherits(Mesh, RendererComponent); + function Mesh(engine, props) { + var _this; + _this = RendererComponent.call(this, engine) || this; + _this.destroyed = false; + _this.visible = true; + if (props) { + var material = props.material, geometry = props.geometry, _props_name = props.name, name = _props_name === void 0 ? "" : _props_name, _props_priority = props.priority, priority = _props_priority === void 0 ? 0 : _props_priority, _props_worldMatrix = props.worldMatrix, worldMatrix = _props_worldMatrix === void 0 ? Matrix4$1.fromIdentity() : _props_worldMatrix; + _this.id = "Mesh" + seed$b++; + _this.name = name; + _this.geometry = geometry; + _this.material = material; + _this.priority = priority; + _this.worldMatrix = worldMatrix; + } else { + _this.id = "Mesh" + seed$b++; + _this.name = ""; + _this.worldMatrix = Matrix4$1.fromIdentity(); + _this._priority = 0; + } + return _this; + } + var _proto = Mesh.prototype; + /** + * 设置当前 Mesh 的可见性。 + * @param visible - true:可见,false:不可见 + */ _proto.setVisible = function setVisible(visible) { + this.visible = visible; + }; + /** + * 获取当前 Mesh 的可见性。 + */ _proto.getVisible = function getVisible() { + return this.visible; + }; + _proto.render = function render(renderer) { + if (this.isDestroyed) { + // console.error(`mesh ${mesh.name} destroyed`, mesh); + return; + } + if (!this.getVisible()) { + return; + } + if (renderer.renderingData.currentFrame.globalUniforms) { + renderer.setGlobalMatrix("effects_ObjectToWorld", this.worldMatrix); + } + renderer.drawGeometry(this.geometry, this.material); + }; + /** + * 获取当前 Mesh 的第一个 geometry。 + */ _proto.firstGeometry = function firstGeometry() { + return this.geometry; + }; + /** + * 设置当前 Mesh 的材质 + * @param material - 要设置的材质 + * @param destroy - 可选的材质销毁选项 + */ _proto.setMaterial = function setMaterial(material, destroy) { + if (destroy !== exports.DestroyOptions.keep) { + this.material.dispose(destroy); + } + this.material = material; + }; + _proto.restore = function restore() {}; + /** + * 销毁当前资源 + * @param options - 可选的销毁选项 + */ _proto.dispose = function dispose(options) { + if (this.destroyed) { + //console.error('call mesh.destroy multiple times', this); + return; + } + if ((options == null ? void 0 : options.geometries) !== exports.DestroyOptions.keep) { + this.geometry.dispose(); + } + var materialDestroyOption = options == null ? void 0 : options.material; + if (materialDestroyOption !== exports.DestroyOptions.keep) { + this.material.dispose(materialDestroyOption); + } + this.destroyed = true; + if (this.engine !== undefined) { + this.engine.removeMesh(this); + // @ts-expect-error + this.engine = undefined; + } + }; + _create_class(Mesh, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return Mesh; +}(RendererComponent); + +var RenderPassPriorityPrepare = 0; +var RenderPassPriorityNormal = 1000; +var RenderPassPriorityPostprocess = 3000; +exports.RenderPassAttachmentStorageType = void 0; +(function(RenderPassAttachmentStorageType) { + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["none"] = 0] = "none"; + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["color"] = 1] = "color"; + //stencil 8 render buffer + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["stencil_8_opaque"] = 2] = "stencil_8_opaque"; + //stencil 16 render buffer + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["depth_16_opaque"] = 3] = "depth_16_opaque"; + //depth 16 & stencil 8 render buffer + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["depth_stencil_opaque"] = 4] = "depth_stencil_opaque"; + //depth 16 texture, need gpu.capability.readableDepthStencilTextures + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["depth_16_texture"] = 5] = "depth_16_texture"; + //depth 24 texture, need gpu.capability.readableDepthStencilTextures + RenderPassAttachmentStorageType[RenderPassAttachmentStorageType["depth_24_stencil_8_texture"] = 6] = "depth_24_stencil_8_texture"; +})(exports.RenderPassAttachmentStorageType || (exports.RenderPassAttachmentStorageType = {})); +exports.TextureStoreAction = void 0; +(function(TextureStoreAction) { + /** + * 不清除 Attachment + */ TextureStoreAction[TextureStoreAction["store"] = 0] = "store"; + /** + * 清除 Attachment + */ TextureStoreAction[TextureStoreAction["clear"] = 2] = "clear"; +})(exports.TextureStoreAction || (exports.TextureStoreAction = {})); +var RenderTargetHandle = /*#__PURE__*/ function() { + function RenderTargetHandle(engine, options) { + this.destroyed = false; + if (!options) { + return; + } + var texture = options.texture, size = options.size; + if (_instanceof1(texture, Texture)) { + this.texture = texture; + this.externalTexture = true; + } else if (texture) { + var wrapT = texture.wrapT, wrapS = texture.wrapS, minFilter = texture.minFilter, magFilter = texture.magFilter, internalFormat = texture.internalFormat, _texture_format = texture.format, format = _texture_format === void 0 ? glContext.RGBA : _texture_format, _texture_type = texture.type, type = _texture_type === void 0 ? glContext.UNSIGNED_BYTE : _texture_type; + this.externalTexture = false; + this.textureOptions = { + size: size, + format: format, + type: type, + internalFormat: internalFormat || format, + wrapT: wrapT, + wrapS: wrapS, + minFilter: minFilter, + magFilter: magFilter, + name: options.name + }; + this.texture = Texture.create(engine, _extends({}, this.textureOptions, { + sourceType: exports.TextureSourceType.framebuffer, + data: { + width: size[0], + height: size[1] + } + })); + } else ; + } + var _proto = RenderTargetHandle.prototype; + _proto.dispose = function dispose() { + if (this.destroyed) { + return; + } + this.texture.dispose(); + this.destroyed = true; + }; + _create_class(RenderTargetHandle, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + }, + { + key: "storageType", + get: function get() { + return 1; + } + }, + { + key: "size", + get: function get() { + var tex = this.texture; + return tex ? [ + tex.getWidth(), + tex.getHeight() + ] : [ + 0, + 0 + ]; + } + }, + { + key: "width", + get: function get() { + return this.texture.getWidth() || 0; + } + }, + { + key: "height", + get: function get() { + return this.texture.getHeight() || 0; + } + } + ]); + return RenderTargetHandle; +}(); +exports.RenderPassDestroyAttachmentType = void 0; +(function(RenderPassDestroyAttachmentType) { + /** + * 强制销毁 + */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType["force"] = 0] = "force"; + /** + * 保留,不销毁 + */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType["keep"] = 1] = "keep"; + /** + * 如果是外部传入的 Attachment,就不销毁 + */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType["keepExternal"] = 2] = "keepExternal"; + /** + * 强制销毁 + */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType["destroy"] = 0] = "destroy"; +})(exports.RenderPassDestroyAttachmentType || (exports.RenderPassDestroyAttachmentType = {})); +var seed$a = 1; +/** + * RenderPass 抽象类 + */ var RenderPass = /*#__PURE__*/ function() { + function RenderPass(renderer, options) { + /** + * ColorAttachment 数组 + */ this.attachments = []; + this.destroyed = false; + this.initialized = false; + var _options_name = options.name, name = _options_name === void 0 ? "RenderPass_" + seed$a++ : _options_name, clearAction = options.clearAction, semantics = options.semantics, depthStencilAttachment = options.depthStencilAttachment, storeAction = options.storeAction, _options_priority = options.priority, priority = _options_priority === void 0 ? 0 : _options_priority, _options_meshOrder = options.meshOrder, meshOrder = _options_meshOrder === void 0 ? exports.OrderType.ascending : _options_meshOrder, _options_meshes = options.meshes, meshes = _options_meshes === void 0 ? [] : _options_meshes, _options_delegate = options.delegate, delegate = _options_delegate === void 0 ? {} : _options_delegate; + this.name = name; + this.renderer = renderer; + this.priority = priority; + this.meshOrder = meshOrder; + this.meshes = sortByOrder(meshes.slice(), this.meshOrder); + this.depthStencilType = (depthStencilAttachment == null ? void 0 : depthStencilAttachment.storageType) || 0; + this.clearAction = _extends({}, clearAction); + this.storeAction = _extends({ + colorAction: 0, + depthAction: 0, + stencilAction: 0 + }, storeAction); + this.semantics = new SemanticMap(semantics); + this.options = options; + this.delegate = delegate; + this.setViewportOptions(options); + } + var _proto = RenderPass.prototype; + _proto.addMesh = function addMesh(mesh) { + addByOrder(this.meshes, mesh, this.meshOrder); + }; + _proto.removeMesh = function removeMesh(mesh) { + removeItem(this.meshes, mesh); + }; + _proto.setMeshes = function setMeshes(meshes) { + var _this_meshes; + this.meshes.length = 0; + (_this_meshes = this.meshes).splice.apply(_this_meshes, [].concat([ + 0, + 0 + ], meshes)); + sortByOrder(this.meshes, this.meshOrder); + return this.meshes; + }; + /** + * 获取当前 Attachment 数组,注意 RenderPass 可能没有创建完成 + */ _proto.getInitAttachments = function getInitAttachments() { + if (this.attachments.length > 0) { + return this.attachments; + } else { + return this.options.attachments; + } + }; + // TODO 所有pass在子类配置 + /** + * 配置当前pass的RT,在每帧渲染前调用 + */ _proto.configure = function configure(renderer) { + if (this.framebuffer) { + renderer.setFramebuffer(this.framebuffer); + } else { + var _this_getViewport = this.getViewport(), x = _this_getViewport[0], y = _this_getViewport[1], width = _this_getViewport[2], height = _this_getViewport[3]; + renderer.setViewport(x, y, width, height); + } + }; + /** + * 执行当前pass,每帧调用一次 + */ _proto.execute = function execute(renderer) { + renderer.clear(this.clearAction); + renderer.renderMeshes(this.meshes); + renderer.clear(this.storeAction); + }; + /** + * 每帧所有的pass渲染完后调用,通常用于清空临时的RT资源 + */ _proto.frameCleanup = function frameCleanup(renderer) {}; + /** + * 重置 ColorAttachment 数组,会直接替换掉 + * @param colors - 纹理数组,作为新的 ColorAttachment + */ _proto.resetColorAttachments = function resetColorAttachments(colors) { + var _this = this; + if (!colors.length) { + this.resetAttachments({ + attachments: [] + }); + } + if (!this.attachments.length) { + this.resetAttachments({ + attachments: colors.map(function(t) { + return { + texture: t + }; + }) + }); + } else { + var attachments = colors.map(function(texture) { + texture.updateSource({ + sourceType: exports.TextureSourceType.framebuffer + }); + return new RenderTargetHandle(_this.renderer.engine, { + texture: texture + }); + }); + this.attachments.forEach(function(att) { + return !att.externalTexture && att.dispose(); + }); + this.attachments = attachments; + if (this.framebuffer) { + this.framebuffer.bind(); + this.framebuffer.resetColorTextures(colors.map(function(color) { + return color; + })); + } + } + }; + /** + * 重置所有 Attachment,会替换掉所有 Attachment + * @param options - Attachment 和视口数据 + */ _proto.resetAttachments = function resetAttachments(options) { + this.options = options; + this.setViewportOptions(options); + if (this.renderer) { + this._resetAttachments(); + } + }; + _proto.setViewportOptions = function setViewportOptions(options) { + if (options.viewport) { + this.isCustomViewport = true; + this.viewportScale = 1; + this.customViewport = options.viewport.slice(0, 4); + if (this.framebuffer) { + var vp = this.customViewport; + // TODO 为什么framebuffer和renderpass的isCustomViewport不一样? + this.framebuffer.isCustomViewport = false; + this.framebuffer.resize(vp[0], vp[1], vp[2], vp[3]); + } + } else { + this.isCustomViewport = false; + this.viewportScale = options.viewportScale || 1; + if (this.framebuffer) { + this.framebuffer.isCustomViewport = true; + this.framebuffer.viewportScale = this.viewportScale; + } + } + }; + _proto._resetAttachments = function _resetAttachments() { + var _this = this; + var _options_attachments; + var renderer = this.renderer; + var options = this.options; + if (this.attachments.length) { + var _this_framebuffer; + this.attachments.forEach(function(att) { + return !att.externalTexture && att.dispose(); + }); + this.attachments.length = 0; + (_this_framebuffer = this.framebuffer) == null ? void 0 : _this_framebuffer.dispose({ + depthStencilAttachment: 2 + }); + this.framebuffer = null; + } + var vs = this.viewportScale; + // renderpass 的 viewport 相关参数都需要动态的修改 + var viewport = this.isCustomViewport ? this.customViewport : [ + 0, + 0, + renderer.getWidth() * vs, + renderer.getHeight() * vs + ]; + var size = [ + viewport[2], + viewport[3] + ]; + var name = this.name; + if ((_options_attachments = options.attachments) == null ? void 0 : _options_attachments.length) { + var attachments = options.attachments.map(function(attr, index) { + var _attr_texture; + var attachment = new RenderTargetHandle(_this.renderer.engine, _extends({ + size: size, + name: ((_attr_texture = attr.texture) == null ? void 0 : _attr_texture.name) || name + "##color_" + index + }, attr)); + return attachment; + }); + this.attachments = attachments; + var framebuffer = Framebuffer.create({ + storeAction: this.storeAction, + name: name, + viewport: viewport, + viewportScale: this.viewportScale, + isCustomViewport: this.isCustomViewport, + attachments: attachments.map(function(att) { + return att.texture; + }), + depthStencilAttachment: options.depthStencilAttachment || { + storageType: 0 + } + }, renderer); + framebuffer.bind(); + framebuffer.unbind(); + this.framebuffer = framebuffer; + } else { + this.attachments.length = 0; + } + }; + /** + * 获取当前视口大小,格式:[x偏移,y偏移,宽度,高度] + */ _proto.getViewport = function getViewport() { + var _this_framebuffer; + var ret = ((_this_framebuffer = this.framebuffer) == null ? void 0 : _this_framebuffer.viewport) || this.customViewport; + if (ret) { + return ret; + } + var renderer = this.renderer; + var vs = this.viewportScale; + return renderer ? [ + 0, + 0, + renderer.getWidth() * vs, + renderer.getHeight() * vs + ] : [ + 0, + 0, + 0, + 0 + ]; + }; + /** + * 获取深度 Attachment,可能没有 + */ _proto.getDepthAttachment = function getDepthAttachment() { + var framebuffer = this.framebuffer; + if (framebuffer) { + var depthTexture = framebuffer.getDepthTexture(); + var texture = depthTexture ? this.getDepthTexture(depthTexture, framebuffer.externalStorage) : undefined; + return { + storageType: framebuffer.depthStencilStorageType, + storage: framebuffer.depthStorage, + texture: texture + }; + } + }; + /** + * 获取蒙版 Attachment,可能没有 + */ _proto.getStencilAttachment = function getStencilAttachment() { + var framebuffer = this.framebuffer; + if (framebuffer) { + var stencilTexture = framebuffer.getStencilTexture(); + var texture = stencilTexture ? this.getDepthTexture(stencilTexture, framebuffer.externalStorage) : undefined; + return { + storageType: framebuffer.depthStencilStorageType, + storage: framebuffer.stencilStorage, + texture: texture + }; + } + }; + _proto.getDepthTexture = function getDepthTexture(texture, external) { + if (!this.depthTexture) { + var _this_options_depthStencilAttachment; + var outTex = (_this_options_depthStencilAttachment = this.options.depthStencilAttachment) == null ? void 0 : _this_options_depthStencilAttachment.texture; + var tex = texture === outTex ? outTex : texture; + // TODO 为什么要initialize? + //tex.initialize(this.renderer.glRenderer.pipelineContext); + if (!external) { + this.depthTexture = tex; + } + return tex; + } + return this.depthTexture; + }; + _proto.getStencilTexture = function getStencilTexture(texture, external) { + if (!this.stencilTexture) { + var _this_options_depthStencilAttachment; + var outTex = (_this_options_depthStencilAttachment = this.options.depthStencilAttachment) == null ? void 0 : _this_options_depthStencilAttachment.texture; + var tex = texture === outTex ? outTex : texture; + if (!external) { + this.stencilTexture = tex; + } + return tex; + } + return this.stencilTexture; + }; + // 生成并初始化帧缓冲 + _proto.initialize = function initialize(renderer) { + if (!this.initialized) { + this._resetAttachments(); + this.initialized = true; + } + return this; + }; + /** + * 销毁 RenderPass + * @param options - 有选择销毁内部对象 + */ _proto.dispose = function dispose(options) { + if (this.destroyed) { + return; + } + var destroyMeshOption = (options == null ? void 0 : options.meshes) || undefined; + if (destroyMeshOption !== exports.DestroyOptions.keep) { + this.meshes.forEach(function(mesh) { + mesh.dispose(destroyMeshOption); + }); + } + this.meshes.length = 0; + var colorOpt = (options == null ? void 0 : options.colorAttachment) ? options.colorAttachment : 0; + this.attachments.forEach(function(att) { + var keep = att.externalTexture && colorOpt === 2 || colorOpt === 1; + if (!keep) { + att.dispose(); + } + }); + this.attachments.length = 0; + if ((options == null ? void 0 : options.semantics) !== exports.DestroyOptions.keep) { + this.semantics.dispose(); + } + this.destroyed = true; + var depthStencilOpt = (options == null ? void 0 : options.depthStencilAttachment) ? options.depthStencilAttachment : 0; + var fbo = this.framebuffer; + if (fbo) { + fbo.dispose({ + depthStencilAttachment: depthStencilOpt + }); + var keep = fbo.externalStorage && depthStencilOpt === 2 || depthStencilOpt === 1; + if (!keep) { + var _this_stencilTexture, _this_depthTexture; + (_this_stencilTexture = this.stencilTexture) == null ? void 0 : _this_stencilTexture.dispose(); + (_this_depthTexture = this.depthTexture) == null ? void 0 : _this_depthTexture.dispose(); + } + } + // @ts-expect-error safe to assign + this.options = this.renderer = null; + this.initialize = throwDestroyedError; + }; + _create_class(RenderPass, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + }, + { + key: "viewport", + get: function get() { + return this.getViewport(); + } + }, + { + key: "stencilAttachment", + get: function get() { + return this.getStencilAttachment(); + } + }, + { + key: "depthAttachment", + get: function get() { + return this.getDepthAttachment(); + } + } + ]); + return RenderPass; +}(); + +var blend = "vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}"; + +var itemFrame_frag = "#version 100\nprecision highp float;vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}varying vec4 vColor;varying vec4 vTexCoord;varying highp vec2 vParams;uniform vec3 uFrameColor;void main(){gl_FragColor=vec4(uFrameColor.xyz,1.0);}"; + +var integrate = "float calculateMovement(float t,vec2 p1,vec2 p2,vec2 p3,vec2 p4){float movement=0.0;float h=(t-p1.x)*0.05;for(int i=0;i<=20;i++){float t=float(i)*h;float nt=binarySearchT(t,p1.x,p2.x,p3.x,p4.x);float y=cubicBezier(nt,p1.y,p2.y,p3.y,p4.y);float weight=(i==0||i==20)? 1.0 :(mod(float(i),2.)!=0.)? 4.0 : 2.0;movement+=weight*y;}movement*=h/3.;return movement;}float integrateFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;i=k1.x){ret+=calculateMovement(k1.x,p1,p2,p3,p4);}if(time>=k0.x&&timecount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateLineSeg(time,k0,k1);}ret+=integrateLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateLineSeg(time,k1,k2);}ret+=integrateLineSeg(k2.x,k1,k2);}return ret;}float integrateByTimeFromLineSeg(float time,float frameStart,float frameCount){if(time==0.){return 0.;}int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;icount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateByTimeLineSeg(time,k0,k1);}ret+=integrateByTimeLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateByTimeLineSeg(time,k1,k2);}ret+=integrateByTimeLineSeg(k2.x,k1,k2);}return ret;}float getIntegrateFromTime0(float t1,vec4 value){float type=value.x;if(type==0.){return value.y*t1;}if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateLineSeg(t1,p0,p1);}if(type==3.){return integrateFromLineSeg(t1,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*t1;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w);}return 0.;}float getIntegrateByTimeFromTime(float t0,float t1,vec4 value){float type=value.x;if(type==0.){return value.y*(t1*t1-t0*t0)/2.;}else if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateByTimeLineSeg(t1,p0,p1)-integrateByTimeLineSeg(t0,p0,p1);}if(type==3.){return integrateByTimeFromLineSeg(t1,value.y,value.z)-integrateByTimeFromLineSeg(t0,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*(t1*t1-t0*t0)/2.;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w)-integrateFromBezierCurveFrames(t0,value.z,value.w);}return 0.;}"; + +var itemVert = "precision highp float;attribute vec2 atlasOffset;attribute vec3 aPos;varying vec2 vTexCoord;varying vec3 vParams;varying vec4 vColor;uniform vec2 _Size;uniform vec3 _Scale;uniform vec4 _Color;uniform vec4 _TexParams;uniform vec4 _TexOffset;uniform mat4 effects_MatrixVP;uniform mat4 effects_ObjectToWorld;uniform mat4 effects_MatrixV;\n#ifdef ENV_EDITOR\nuniform vec4 uEditorTransform;\n#endif\nvoid main(){vec4 texParams=_TexParams;vTexCoord=vec2(atlasOffset.xy*_TexOffset.zw+_TexOffset.xy);vColor=_Color;vParams=vec3(texParams.w,texParams.y,texParams.x);if(texParams.z==1.0){vec4 pos=vec4(aPos.xy*_Size,aPos.z,1.0);gl_Position=effects_MatrixVP*effects_ObjectToWorld*pos;}else{mat4 view=effects_MatrixV;vec3 camRight=vec3(view[0][0],view[1][0],view[2][0]);vec3 camUp=vec3(view[0][1],view[1][1],view[2][1]);vec3 worldPosition=vec3(effects_ObjectToWorld*vec4(0.0,0.0,0.0,1.0));vec3 vertexPosition=worldPosition+camRight*aPos.x*_Size.x*_Scale.x+camUp*aPos.y*_Size.y*_Scale.y;gl_Position=effects_MatrixVP*vec4(vertexPosition,1.0);}\n#ifdef ENV_EDITOR\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\n#endif\n}"; + +var itemFrag = "precision highp float;varying vec4 vColor;varying vec2 vTexCoord;varying vec3 vParams;uniform sampler2D _MainTex;vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}void main(){vec4 color=vec4(0.);\n#ifdef TRANSPARENT_VIDEO\nfloat halfX=vTexCoord.x*0.5;vec2 uv_rgb=vec2(halfX,vTexCoord.y);vec2 uv_alpha=vec2(halfX+0.5,vTexCoord.y);vec3 rgb=texture2D(_MainTex,uv_rgb).rgb;float alpha=max(texture2D(_MainTex,uv_alpha).r,1e-5);vec4 texColor=vec4(rgb/alpha,alpha);\n#else\nvec4 texColor=texture2D(_MainTex,vTexCoord.xy);\n#endif\ncolor=blendColor(texColor,vColor,floor(0.5+vParams.y));\n#ifdef ALPHA_CLIP\nif(color.a<0.04){discard;}\n#endif\ncolor.a=clamp(color.a,0.0,1.0);gl_FragColor=color;}"; + +var particleFrag = "#version 100\nprecision mediump float;vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}\n#define PATICLE_SHADER 1\nvarying float vLife;varying vec2 vTexCoord;varying vec4 vColor;uniform vec3 emissionColor;uniform float emissionIntensity;uniform sampler2D uMaskTex;uniform vec4 uColorParams;uniform vec2 uTexOffset;\n#ifdef COLOR_OVER_LIFETIME\nuniform sampler2D uColorOverLifetime;\n#endif\n#ifdef USE_SPRITE\nvarying vec4 vTexCoordBlend;\n#endif\nvarying float vSeed;\n#ifdef PREVIEW_BORDER\nuniform vec4 uPreviewColor;\n#endif\n#ifdef USE_SPRITE\nvec4 getTextureColor(sampler2D tex,vec2 texCoord){if(vTexCoordBlend.w>0.){return mix(texture2D(tex,texCoord),texture2D(tex,vTexCoordBlend.xy+texCoord),vTexCoordBlend.z);}return texture2D(tex,texCoord);}\n#else\n#define getTextureColor texture2D\n#endif\n#ifndef WEBGL2\n#define round(a) floor(0.5+a)\n#endif\n#ifdef PREVIEW_BORDER\nvoid main(){gl_FragColor=uPreviewColor;}\n#else\nvoid main(){vec4 color=vec4(1.0);vec4 tempColor=vColor;vec2 texOffset=uTexOffset;if(vLife<0.){discard;}if(uColorParams.x>0.0){color=getTextureColor(uMaskTex,vTexCoord);}\n#ifdef COLOR_OVER_LIFETIME\n#ifndef ENABLE_VERTEX_TEXTURE\ntempColor*=texture2D(uColorOverLifetime,vec2(vLife,0.));\n#endif\n#endif\ncolor=blendColor(color,tempColor,round(uColorParams.y));if(color.a<=0.01&&uColorParams.w>0.){float _at=texture2D(uMaskTex,vTexCoord+texOffset).a+texture2D(uMaskTex,vTexCoord+texOffset*-1.).a;if(_at<=0.02){discard;}}vec3 emission=emissionColor*pow(2.0,emissionIntensity);color=vec4(pow(pow(color.rgb,vec3(2.2))+emission,vec3(1.0/2.2)),color.a);gl_FragColor=color;}\n#endif\n"; + +var particleVert = "#version 100\nprecision mediump float;\n#define SHADER_VERTEX 1\n#define PATICLE_SHADER 1\n#ifdef SHADER_VERTEX\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\n#define CURVE_VALUE_ARRAY uVCurveValues\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\n#define FRAG_CURVE_VALUE_COUNT 0\n#else\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\n#define CURVE_VALUE_ARRAY uFCurveValues\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\n#define VERT_CURVE_VALUE_COUNT 0\n#endif\n#if CURVE_VALUE_COUNT > 0\n#if LOOKUP_TEXTURE_CURVE\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\n#else\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\n#endif\n#else\n#define lookup_curve(i) vec4(0.)\n#endif\n#ifdef WEBGL2\n#define ITR_END (count + 1)\n#else\n#define ITR_END MAX_C\n#endif\n#define NONE_CONST_INDEX 1\n#ifdef SHADER_VERTEX\nattribute float aSeed;varying float vSeed;\n#endif\n#ifdef SHADER_VERTEX\n#define MAX_C VERT_MAX_KEY_FRAME_COUNT\n#else\n#define MAX_C FRAG_MAX_KEY_FRAME_COUNT\n#endif\nmat4 cubicBezierMatrix=mat4(1.0,-3.0,3.0,-1.0,0.0,3.0,-6.0,3.0,0.0,0.0,3.0,-3.0,0.0,0.0,0.0,1.0);float cubicBezier(float t,float y1,float y2,float y3,float y4){vec4 tVec=vec4(1.0,t,t*t,t*t*t);vec4 yVec=vec4(y1,y2,y3,y4);vec4 result=tVec*cubicBezierMatrix*yVec;return result.x+result.y+result.z+result.w;}float binarySearchT(float x,float x1,float x2,float x3,float x4){float left=0.0;float right=1.0;float mid=0.0;float computedX;for(int i=0;i<8;i++){mid=(left+right)*0.5;computedX=cubicBezier(mid,x1,x2,x3,x4);if(abs(computedX-x)<0.0001){break;}else if(computedX>x){right=mid;}else{left=mid;}}return mid;}float valueFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);for(int i=0;i=count){break;}vec4 k0=lookup_curve(i+start);vec4 k1=lookup_curve(i+1+start);if(i==0&&time=k1.x){return k1.y;}if(time>=k0.x&&time<=k1.x){float t=(time-k0.x)/(k1.x-k0.x);float nt=binarySearchT(time,k0.x,k0.z,k1.z,k1.x);return cubicBezier(nt,k0.y,k0.w,k1.w,k1.y);}}}float evaluteLineSeg(float t,vec2 p0,vec2 p1){return p0.y+(p1.y-p0.y)*(t-p0.x)/(p1.x-p0.x);}float valueFromLineSegs(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);int end=start+count;for(int i=0;icount){return lookup_curve(i).w;}vec4 seg=lookup_curve(i+start);vec2 p0=seg.xy;vec2 p1=seg.zw;if(time>=p0.x&&time<=p1.x){return evaluteLineSeg(time,p0,p1);}vec2 p2=lookup_curve(i+start+1).xy;if(time>p1.x&&time<=p2.x){return evaluteLineSeg(time,p1,p2);}}return lookup_curve(0).y;}float getValueFromTime(float time,vec4 value){float type=value.x;if(type==0.){return value.y;}if(type==1.){return mix(value.y,value.z,time/value.w);}if(type==3.){return valueFromLineSegs(time,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed);}if(type==5.){return valueFromBezierCurveFrames(time,value.z,value.w);}return 0.;}float calculateMovement(float t,vec2 p1,vec2 p2,vec2 p3,vec2 p4){float movement=0.0;float h=(t-p1.x)*0.05;for(int i=0;i<=20;i++){float t=float(i)*h;float nt=binarySearchT(t,p1.x,p2.x,p3.x,p4.x);float y=cubicBezier(nt,p1.y,p2.y,p3.y,p4.y);float weight=(i==0||i==20)? 1.0 :(mod(float(i),2.)!=0.)? 4.0 : 2.0;movement+=weight*y;}movement*=h/3.;return movement;}float integrateFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;i=k1.x){ret+=calculateMovement(k1.x,p1,p2,p3,p4);}if(time>=k0.x&&timecount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateLineSeg(time,k0,k1);}ret+=integrateLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateLineSeg(time,k1,k2);}ret+=integrateLineSeg(k2.x,k1,k2);}return ret;}float integrateByTimeFromLineSeg(float time,float frameStart,float frameCount){if(time==0.){return 0.;}int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;icount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateByTimeLineSeg(time,k0,k1);}ret+=integrateByTimeLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateByTimeLineSeg(time,k1,k2);}ret+=integrateByTimeLineSeg(k2.x,k1,k2);}return ret;}float getIntegrateFromTime0(float t1,vec4 value){float type=value.x;if(type==0.){return value.y*t1;}if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateLineSeg(t1,p0,p1);}if(type==3.){return integrateFromLineSeg(t1,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*t1;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w);}return 0.;}float getIntegrateByTimeFromTime(float t0,float t1,vec4 value){float type=value.x;if(type==0.){return value.y*(t1*t1-t0*t0)/2.;}else if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateByTimeLineSeg(t1,p0,p1)-integrateByTimeLineSeg(t0,p0,p1);}if(type==3.){return integrateByTimeFromLineSeg(t1,value.y,value.z)-integrateByTimeFromLineSeg(t0,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*(t1*t1-t0*t0)/2.;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w)-integrateFromBezierCurveFrames(t0,value.z,value.w);}return 0.;}const float d2r=3.141592653589793/180.;attribute vec3 aPos;attribute vec4 aOffset;attribute vec4 aColor;attribute vec3 aDirX;attribute vec3 aDirY;attribute vec3 aTranslation;attribute vec3 aRotation0;attribute vec3 aRotation1;attribute vec3 aRotation2;attribute vec3 aLinearMove;\n#ifdef USE_SPRITE\nattribute vec3 aSprite;uniform vec4 uSprite;struct UVDetail{vec2 uv0;vec3 uv1;};UVDetail getSpriteUV(vec2 uv,float lifeTime);varying vec4 vTexCoordBlend;\n#endif\n#ifdef FINAL_TARGET\nuniform vec3 uFinalTarget;uniform vec4 uForceCurve;\n#endif\nuniform mat4 effects_ObjectToWorld;uniform mat4 effects_MatrixV;uniform mat4 effects_MatrixVP;uniform vec4 uParams;uniform vec4 uOpacityOverLifetimeValue;\n#ifdef COLOR_OVER_LIFETIME\nuniform sampler2D uColorOverLifetime;\n#endif\nuniform vec4 uOrbXByLifetimeValue;uniform vec4 uOrbYByLifetimeValue;uniform vec4 uOrbZByLifetimeValue;uniform vec3 uOrbCenter;uniform vec4 uSizeByLifetimeValue;\n#ifdef SIZE_Y_BY_LIFE\nuniform vec4 uSizeYByLifetimeValue;\n#endif\nvarying float vLife;varying vec4 vColor;varying vec2 vTexCoord;\n#ifdef ENV_EDITOR\nuniform vec4 uEditorTransform;\n#endif\nvec3 calOrbitalMov(float _life,float _dur){vec3 orb=vec3(0.0);\n#ifdef AS_ORBITAL_MOVEMENT\n#define FUNC(a) getValueFromTime(_life,a)\n#else\n#define FUNC(a) getIntegrateFromTime0(_life,a) * _dur\n#endif\n#if ORB_VEL_X\norb.x=FUNC(uOrbXByLifetimeValue);\n#endif\n#if ORB_VEL_Y\norb.y=FUNC(uOrbYByLifetimeValue);\n#endif\n#if ORB_VEL_Z\norb.z=FUNC(uOrbZByLifetimeValue);\n#endif\n#undef FUNC\nreturn orb;}mat3 mat3FromRotation(vec3 rotation){vec3 sinR=sin(rotation*d2r);vec3 cosR=cos(rotation*d2r);return mat3(cosR.z,-sinR.z,0.,sinR.z,cosR.z,0.,0.,0.,1.)*mat3(cosR.y,0.,sinR.y,0.,1.,0.,-sinR.y,0,cosR.y)*mat3(1.,0.,0.,0,cosR.x,-sinR.x,0.,sinR.x,cosR.x);}\n#ifdef USE_SPRITE\nUVDetail getSpriteUV(vec2 uv,float lifeTime){float t=fract(clamp((lifeTime-aSprite.x)/aSprite.y,0.0,1.)*aSprite.z);float frame=uSprite.z*t;float frameIndex=max(ceil(frame)-1.,0.);float row=floor((frameIndex+0.1)/uSprite.x);float col=frameIndex-row*uSprite.x;vec2 retUV=(vec2(col,row)+uv)/uSprite.xy;UVDetail ret;if(uSprite.w>0.){float blend=frame-frameIndex;float frameIndex1=min(ceil(frame),uSprite.z-1.);float row1=floor((frameIndex1+0.1)/uSprite.x);float col1=frameIndex1-row1*uSprite.x;vec2 coord=(vec2(col1,row1)+uv)/uSprite.xy-retUV;ret.uv1=vec3(coord.x,1.-coord.y,blend);}ret.uv0=vec2(retUV.x,1.-retUV.y);return ret;}\n#endif\nvoid main(){float time=uParams.x-aOffset.z;float dur=aOffset.w;if(time<0.||time>dur){gl_Position=vec4(-3.,-3.,-3.,1.);}else{float life=clamp(time/dur,0.0,1.0);vLife=life;\n#ifdef USE_SPRITE\nUVDetail uvD=getSpriteUV(aOffset.xy,time);vTexCoord=uvD.uv0;vTexCoordBlend=vec4(uvD.uv1,uSprite.w);\n#else\nvTexCoord=aOffset.xy;\n#endif\nvColor=aColor;\n#ifdef COLOR_OVER_LIFETIME\n#ifdef ENABLE_VERTEX_TEXTURE\nvColor*=texture2D(uColorOverLifetime,vec2(life,0.));\n#endif\n#endif\nvColor.a*=clamp(getValueFromTime(life,uOpacityOverLifetimeValue),0.,1.);vec3 size=vec3(vec2(getValueFromTime(life,uSizeByLifetimeValue)),1.0);\n#ifdef SIZE_Y_BY_LIFE\nsize.y=getValueFromTime(life,uSizeYByLifetimeValue);\n#endif\nmat3 aRotation=mat3(aRotation0,aRotation1,aRotation2);vec3 point=aRotation*(aDirX*size.x+aDirY*size.y);vec3 _pos=aPos+aTranslation;\n#if ORB_VEL_X + ORB_VEL_Y + ORB_VEL_Z\n_pos=mat3FromRotation(calOrbitalMov(life,dur))*(_pos-uOrbCenter);_pos+=uOrbCenter;\n#endif\n_pos.xyz+=aLinearMove;\n#ifdef FINAL_TARGET\nfloat force=getValueFromTime(life,uForceCurve);vec4 pos=vec4(mix(_pos,uFinalTarget,force),1.);\n#else\nvec4 pos=vec4(_pos,1.0);\n#endif\n#if RENDER_MODE == 1\npos.xyz+=point;pos=effects_ObjectToWorld*pos;\n#elif RENDER_MODE == 3\npos=effects_ObjectToWorld*pos;pos.xyz+=effects_MatrixV[0].xyz*point.x+effects_MatrixV[2].xyz*point.y;\n#elif RENDER_MODE == 2\npos=effects_ObjectToWorld*pos;pos.xy+=point.xy;\n#elif RENDER_MODE == 0\npos=effects_ObjectToWorld*pos;pos.xyz+=effects_MatrixV[0].xyz*point.x+effects_MatrixV[1].xyz*point.y;\n#endif\ngl_Position=effects_MatrixVP*pos;vSeed=aSeed;gl_PointSize=6.0;\n#ifdef ENV_EDITOR\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\n#endif\n}}"; + +var trailVert = "#version 100\nprecision mediump float;\n#define SHADER_VERTEX 1\n#ifdef SHADER_VERTEX\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\n#define CURVE_VALUE_ARRAY uVCurveValues\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\n#define FRAG_CURVE_VALUE_COUNT 0\n#else\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\n#define CURVE_VALUE_ARRAY uFCurveValues\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\n#define VERT_CURVE_VALUE_COUNT 0\n#endif\n#if CURVE_VALUE_COUNT > 0\n#if LOOKUP_TEXTURE_CURVE\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\n#else\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\n#endif\n#else\n#define lookup_curve(i) vec4(0.)\n#endif\n#ifdef WEBGL2\n#define ITR_END (count + 1)\n#else\n#define ITR_END MAX_C\n#endif\n#define NONE_CONST_INDEX 1\n#ifdef SHADER_VERTEX\nattribute float aSeed;varying float vSeed;\n#endif\n#ifdef SHADER_VERTEX\n#define MAX_C VERT_MAX_KEY_FRAME_COUNT\n#else\n#define MAX_C FRAG_MAX_KEY_FRAME_COUNT\n#endif\nmat4 cubicBezierMatrix=mat4(1.0,-3.0,3.0,-1.0,0.0,3.0,-6.0,3.0,0.0,0.0,3.0,-3.0,0.0,0.0,0.0,1.0);float cubicBezier(float t,float y1,float y2,float y3,float y4){vec4 tVec=vec4(1.0,t,t*t,t*t*t);vec4 yVec=vec4(y1,y2,y3,y4);vec4 result=tVec*cubicBezierMatrix*yVec;return result.x+result.y+result.z+result.w;}float binarySearchT(float x,float x1,float x2,float x3,float x4){float left=0.0;float right=1.0;float mid=0.0;float computedX;for(int i=0;i<8;i++){mid=(left+right)*0.5;computedX=cubicBezier(mid,x1,x2,x3,x4);if(abs(computedX-x)<0.0001){break;}else if(computedX>x){right=mid;}else{left=mid;}}return mid;}float valueFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);for(int i=0;i=count){break;}vec4 k0=lookup_curve(i+start);vec4 k1=lookup_curve(i+1+start);if(i==0&&time=k1.x){return k1.y;}if(time>=k0.x&&time<=k1.x){float t=(time-k0.x)/(k1.x-k0.x);float nt=binarySearchT(time,k0.x,k0.z,k1.z,k1.x);return cubicBezier(nt,k0.y,k0.w,k1.w,k1.y);}}}float evaluteLineSeg(float t,vec2 p0,vec2 p1){return p0.y+(p1.y-p0.y)*(t-p0.x)/(p1.x-p0.x);}float valueFromLineSegs(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);int end=start+count;for(int i=0;icount){return lookup_curve(i).w;}vec4 seg=lookup_curve(i+start);vec2 p0=seg.xy;vec2 p1=seg.zw;if(time>=p0.x&&time<=p1.x){return evaluteLineSeg(time,p0,p1);}vec2 p2=lookup_curve(i+start+1).xy;if(time>p1.x&&time<=p2.x){return evaluteLineSeg(time,p1,p2);}}return lookup_curve(0).y;}float getValueFromTime(float time,vec4 value){float type=value.x;if(type==0.){return value.y;}if(type==1.){return mix(value.y,value.z,time/value.w);}if(type==3.){return valueFromLineSegs(time,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed);}if(type==5.){return valueFromBezierCurveFrames(time,value.z,value.w);}return 0.;}attribute vec4 aPos;attribute vec3 aDir;attribute vec3 aInfo;attribute vec4 aColor;attribute float aTime;\n#ifdef ATTR_TRAIL_START\nattribute float aTrailStart;\n#else\nuniform float uTrailStart[64];attribute float aTrailStartIndex;\n#endif\nuniform mat4 effects_MatrixInvV;uniform mat4 effects_ObjectToWorld;uniform mat4 effects_MatrixVP;uniform vec4 uTextureMap;uniform float uTime;uniform vec4 uParams;uniform vec4 uColorParams;uniform vec4 uOpacityOverLifetimeValue;uniform vec4 uWidthOverTrail;\n#ifdef COLOR_OVER_TRAIL\nuniform sampler2D uColorOverTrail;\n#endif\n#ifdef COLOR_OVER_LIFETIME\nuniform sampler2D uColorOverLifetime;\n#endif\nvarying float vLife;varying vec2 vTexCoord;varying vec4 vColor;\n#ifdef ENV_EDITOR\nuniform vec4 uEditorTransform;\n#endif\nvoid main(){vec4 _pa=effects_MatrixVP*vec4(aPos.xyz,1.);vec4 _pb=effects_MatrixVP*vec4(aPos.xyz+aDir,1.);vec2 dir=normalize(_pb.xy/_pb.w-_pa.xy/_pa.w);vec2 screen_xy=vec2(-dir.y,dir.x);vec4 pos=effects_ObjectToWorld*vec4(aPos.xyz,1.);\n#ifdef ATTR_TRAIL_START\nfloat ts=aTrailStart;\n#else\nfloat ts=uTrailStart[int(aTrailStartIndex)];\n#endif\nfloat trail=(ts-aInfo.y)/uParams.y;float width=aPos.w*getValueFromTime(trail,uWidthOverTrail)/max(abs(screen_xy.x),abs(screen_xy.y));pos.xyz+=(effects_MatrixInvV[0].xyz*screen_xy.x+effects_MatrixInvV[1].xyz*screen_xy.y)*width;float time=min((uTime-aTime)/aInfo.x,1.0);gl_Position=effects_MatrixVP*pos;vColor=aColor;\n#ifdef COLOR_OVER_LIFETIME\n#ifdef ENABLE_VERTEX_TEXTURE\nvColor*=texture2D(uColorOverLifetime,vec2(time,0.));\n#endif\n#endif\n#ifdef COLOR_OVER_TRAIL\nvColor*=texture2D(uColorOverTrail,vec2(trail,0.));\n#endif\nvColor.a*=clamp(getValueFromTime(time,uOpacityOverLifetimeValue),0.,1.);vLife=time;vTexCoord=uTextureMap.xy+vec2(trail,aInfo.z)*uTextureMap.zw;vSeed=aSeed;\n#ifdef ENV_EDITOR\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\n#endif\n}"; + +var value = "#ifdef SHADER_VERTEX\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\n#define CURVE_VALUE_ARRAY uVCurveValues\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\n#define FRAG_CURVE_VALUE_COUNT 0\n#else\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\n#define CURVE_VALUE_ARRAY uFCurveValues\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\n#define VERT_CURVE_VALUE_COUNT 0\n#endif\n#if CURVE_VALUE_COUNT > 0\n#if LOOKUP_TEXTURE_CURVE\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\n#else\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\n#endif\n#else\n#define lookup_curve(i) vec4(0.)\n#endif\n#ifdef WEBGL2\n#define ITR_END (count + 1)\n#else\n#define ITR_END MAX_C\n#endif\n#define NONE_CONST_INDEX 1\n#ifdef SHADER_VERTEX\nattribute float aSeed;varying float vSeed;\n#endif\n#ifdef SHADER_VERTEX\n#define MAX_C VERT_MAX_KEY_FRAME_COUNT\n#else\n#define MAX_C FRAG_MAX_KEY_FRAME_COUNT\n#endif\nmat4 cubicBezierMatrix=mat4(1.0,-3.0,3.0,-1.0,0.0,3.0,-6.0,3.0,0.0,0.0,3.0,-3.0,0.0,0.0,0.0,1.0);float cubicBezier(float t,float y1,float y2,float y3,float y4){vec4 tVec=vec4(1.0,t,t*t,t*t*t);vec4 yVec=vec4(y1,y2,y3,y4);vec4 result=tVec*cubicBezierMatrix*yVec;return result.x+result.y+result.z+result.w;}float binarySearchT(float x,float x1,float x2,float x3,float x4){float left=0.0;float right=1.0;float mid=0.0;float computedX;for(int i=0;i<8;i++){mid=(left+right)*0.5;computedX=cubicBezier(mid,x1,x2,x3,x4);if(abs(computedX-x)<0.0001){break;}else if(computedX>x){right=mid;}else{left=mid;}}return mid;}float valueFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);for(int i=0;i=count){break;}vec4 k0=lookup_curve(i+start);vec4 k1=lookup_curve(i+1+start);if(i==0&&time=k1.x){return k1.y;}if(time>=k0.x&&time<=k1.x){float t=(time-k0.x)/(k1.x-k0.x);float nt=binarySearchT(time,k0.x,k0.z,k1.z,k1.x);return cubicBezier(nt,k0.y,k0.w,k1.w,k1.y);}}}float evaluteLineSeg(float t,vec2 p0,vec2 p1){return p0.y+(p1.y-p0.y)*(t-p0.x)/(p1.x-p0.x);}float valueFromLineSegs(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);int end=start+count;for(int i=0;icount){return lookup_curve(i).w;}vec4 seg=lookup_curve(i+start);vec2 p0=seg.xy;vec2 p1=seg.zw;if(time>=p0.x&&time<=p1.x){return evaluteLineSeg(time,p0,p1);}vec2 p2=lookup_curve(i+start+1).xy;if(time>p1.x&&time<=p2.x){return evaluteLineSeg(time,p1,p2);}}return lookup_curve(0).y;}float getValueFromTime(float time,vec4 value){float type=value.x;if(type==0.){return value.y;}if(type==1.){return mix(value.y,value.z,time/value.w);}if(type==3.){return valueFromLineSegs(time,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed);}if(type==5.){return valueFromBezierCurveFrames(time,value.z,value.w);}return 0.;}"; + +var valueDefine = "#ifdef SHADER_VERTEX\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\n#define CURVE_VALUE_ARRAY uVCurveValues\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\n#define FRAG_CURVE_VALUE_COUNT 0\n#else\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\n#define CURVE_VALUE_ARRAY uFCurveValues\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\n#define VERT_CURVE_VALUE_COUNT 0\n#endif\n#if CURVE_VALUE_COUNT > 0\n#if LOOKUP_TEXTURE_CURVE\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\n#else\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\n#endif\n#else\n#define lookup_curve(i) vec4(0.)\n#endif\n#ifdef WEBGL2\n#define ITR_END (count + 1)\n#else\n#define ITR_END MAX_C\n#endif\n"; + +var screenMeshVert = "precision highp float;attribute vec2 aPos;varying vec2 uv;void main(){gl_Position=vec4(aPos,0.,1.0);uv=(aPos+vec2(1.0))/2.;}"; + +var colorGradingFrag = "precision highp float;\n#define HALF_MAX 60000.0\n#define ACEScc_MIDGRAY 0.4135884\nvarying vec2 uv;uniform sampler2D _GaussianTex;uniform sampler2D _SceneTex;uniform float _BloomIntensity;uniform float _Brightness;uniform float _Saturation;uniform float _Contrast;uniform bool _UseBloom;uniform bool _UseToneMapping;uniform vec3 _VignetteColor;uniform vec2 _VignetteCenter;uniform float _VignetteIntensity;uniform float _VignetteSmoothness;uniform float _VignetteRoundness;mat3 LinearToACES=mat3(0.59719,0.07600,0.02840,0.35458,0.90834,0.13383,0.04823,0.01566,0.83777);mat3 ACESToLinear=mat3(1.60475,-0.10208,-0.00327,-0.53108,1.10813,-0.07276,-0.07367,-0.00605,1.07602);float log10(float x){return log(x)/log(10.0);}vec3 log10(vec3 v){return vec3(log10(v.x),log10(v.y),log10(v.z));}vec3 LinearToLogC(vec3 x){return 0.244161*log10(5.555556*x+0.047996)+0.386036;}vec3 LogCToLinear(vec3 x){return(pow(vec3(10.0),(x-0.386036)/0.244161)-0.047996)/5.555556;}vec3 rrt_and_odt_fit(vec3 col){vec3 a=col*(col+0.0245786)-0.000090537;vec3 b=col*(0.983729*col+0.4329510)+0.238081;return a/b;}vec3 ACESToneMapping(vec3 col){vec3 aces=LinearToACES*col;aces=rrt_and_odt_fit(aces);col=ACESToLinear*aces;return col;}vec3 LinearToSrgb(vec3 c){return mix(1.055*pow(c,vec3(1./2.4))-0.055,12.92*c,step(c,vec3(0.0031308)));}vec3 GammaCorrection(vec3 c){return pow(c,vec3(1.0/2.2));}vec3 ApplyVignette(vec3 inputColor,vec2 uv,vec2 center,float intensity,float roundness,float smoothness,vec3 color){vec2 dist=abs(uv-center)*intensity;dist.x*=roundness;float vfactor=pow(clamp((1.0-dot(dist,dist)),0.0,1.0),smoothness);return inputColor*mix(color,vec3(1.0),vfactor);}void main(){vec4 hdrColor=texture2D(_SceneTex,uv);hdrColor.rgb=pow(hdrColor.rgb,vec3(2.2));vec3 finalColor=hdrColor.rgb;if(_UseBloom){vec4 bloomColor=texture2D(_GaussianTex,uv);bloomColor.rgb*=_BloomIntensity;finalColor+=bloomColor.rgb;}if(_VignetteIntensity>0.0){finalColor=ApplyVignette(finalColor,uv,_VignetteCenter,_VignetteIntensity,_VignetteRoundness,_VignetteSmoothness,_VignetteColor);}finalColor=finalColor*_Brightness;vec3 colorLog=LinearToLogC(finalColor);colorLog=(colorLog-ACEScc_MIDGRAY)*_Contrast+ACEScc_MIDGRAY;finalColor=LogCToLinear(colorLog);finalColor=max(finalColor,0.0);float luminance=0.2125*finalColor.r+0.7154*finalColor.g+0.0721*finalColor.b;vec3 luminanceColor=vec3(luminance,luminance,luminance);finalColor=(finalColor-luminanceColor)*_Saturation+luminanceColor;finalColor=max(finalColor,0.0);if(_UseToneMapping){finalColor=max(vec3(0.0),ACESToneMapping(finalColor));}float alpha=min(hdrColor.a,1.0);gl_FragColor=vec4(clamp(GammaCorrection(finalColor),0.0,1.0),alpha);}"; + +var gaussianDown_frag = "precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform vec2 _TextureSize;float GaussWeight2D(float x,float y,float sigma){float PI=3.14159265358;float E=2.71828182846;float sigma_2=pow(sigma,2.0);float a=-(x*x+y*y)/(2.0*sigma_2);return pow(E,a)/(2.0*PI*sigma_2);}vec3 GaussNxN(sampler2D tex,vec2 uv,vec2 stride,float sigma){vec3 color=vec3(0.,0.,0.);const int r=5/2;float weight=0.0;for(int i=-r;i<=r;i++){for(int j=-r;j<=r;j++){float w=GaussWeight2D(float(i),float(j),sigma);vec2 coord=uv+vec2(i,j)*stride;color+=texture2D(tex,coord).rgb*w;weight+=w;}}color/=weight;return color;}void main(){vec4 mainColor=texture2D(_MainTex,uv);vec3 color=mainColor.rgb;color=GaussNxN(_MainTex,uv,1.0/_TextureSize,1.0);gl_FragColor=vec4(color,1.0);}"; + +var gaussianDownHFrag = "precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform vec2 _TextureSize;vec3 GaussH(sampler2D tex,vec2 uv){vec3 color=vec3(0.0);float offsets[9];offsets[0]=-4.0;offsets[1]=-3.0;offsets[2]=-2.0;offsets[3]=-1.0;offsets[4]=0.0;offsets[5]=1.0;offsets[6]=2.0;offsets[7]=3.0;offsets[8]=4.0;float weights[9];weights[0]=0.01621622;weights[1]=0.05405405;weights[2]=0.12162162;weights[3]=0.19459459;weights[4]=0.22702703;weights[5]=0.19459459;weights[6]=0.12162162;weights[7]=0.05405405;weights[8]=0.01621622;for(int i=0;i<9;i++){vec2 offset=vec2(offsets[i]*2.0*(1.0/_TextureSize.x),0);color+=texture2D(tex,uv+offset).rgb*weights[i];}return color;}void main(){vec3 color=GaussH(_MainTex,uv);gl_FragColor=vec4(color,1.0);}"; + +var gaussianDownVFrag = "precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform vec2 _TextureSize;vec3 GaussV(sampler2D tex,vec2 uv){vec3 color=vec3(0.0);float offsets[5];offsets[0]=-3.23076923;offsets[1]=-1.38461538;offsets[2]=0.0;offsets[3]=1.38461538;offsets[4]=3.23076923;float weights[5];weights[0]=0.07027027;weights[1]=0.31621622;weights[2]=0.22702703;weights[3]=0.31621622;weights[4]=0.07027027;for(int i=0;i<5;i++){vec2 offset=vec2(0,offsets[i]*(1.0/_TextureSize.y));color+=texture2D(tex,uv+offset).rgb*weights[i];}return color;}void main(){vec3 color=GaussV(_MainTex,uv);gl_FragColor=vec4(color,1.0);}"; + +var gaussianUpFrag = "precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform sampler2D _GaussianDownTex;uniform vec2 _GaussianDownTextureSize;float GaussWeight2D(float x,float y,float sigma){float PI=3.14159265358;float E=2.71828182846;float sigma_2=pow(sigma,2.0);float a=-(x*x+y*y)/(2.0*sigma_2);return pow(E,a)/(2.0*PI*sigma_2);}vec3 GaussNxN(sampler2D tex,vec2 uv,vec2 stride,float sigma){vec3 color=vec3(0.,0.,0.);const int r=1;float weight=0.0;for(int i=-r;i<=r;i++){for(int j=-r;j<=r;j++){float w=GaussWeight2D(float(i),float(j),sigma);vec2 coord=uv+vec2(i,j)*stride;color+=texture2D(tex,coord).rgb*w;weight+=w;}}color/=weight;return color;}void main(){vec3 lowResColor=GaussNxN(_MainTex,uv,0.5/_GaussianDownTextureSize,1.0);vec3 highResColor=GaussNxN(_GaussianDownTex,uv,1.0/_GaussianDownTextureSize,1.0);vec3 color=mix(highResColor,lowResColor,0.7);gl_FragColor=vec4(color,1.0);}"; + +var thresholdFrag = "precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform float _Threshold;void main(){vec4 mainTex=texture2D(_MainTex,uv);mainTex.rgb=pow(mainTex.rgb,vec3(2.2));float brightness=max(mainTex.r,max(mainTex.g,mainTex.b));float w=max(0.0,brightness-_Threshold)/max(brightness,0.00001);mainTex.rgb*=w;mainTex.rgb*=mainTex.a;gl_FragColor=vec4(mainTex.rgb,1.0);}"; + +var shaderLib = {}; +var ShaderFactory = /*#__PURE__*/ function() { + function ShaderFactory() {} + ShaderFactory.registerInclude = function registerInclude(includeName, includeSource) { + if (shaderLib[includeName]) { + logger.warn('The "' + includeName + '" shader include already exist.'); + } + shaderLib[includeName] = includeSource; + }; + ShaderFactory.unRegisterInclude = function unRegisterInclude(includeName) { + delete shaderLib[includeName]; + }; + ShaderFactory.unRegisterAllIncludes = function unRegisterAllIncludes() { + Object.keys(shaderLib).forEach(function(key) { + ShaderFactory.unRegisterInclude(key); + }); + }; + /** + * 生成 shader,检测到 WebGL1 上下文会降级 + * @param macros - 宏定义数组 + * @param shader - 原始 shader 文本 + * @param shaderType - shader 类型 + * @return 去除版本号的 shader 文本 + */ ShaderFactory.genFinalShaderCode = function genFinalShaderCode(options) { + var level = options.level, shaderType = options.shaderType, shader = options.shader, macros = options.macros, removeVersion = options.removeVersion; + var macroString = ShaderFactory.genMacroString(level, macros); + var versionString = ShaderFactory.genShaderVersion(level); + var source = ShaderFactory.parseIncludes(shader); + var isVersion300 = ShaderFactory.isVersion300(source); + source = ShaderFactory.removeWebGLVersion(source); + if (level === 2 && !isVersion300) { + source = ShaderFactory.convertTo300(source, shaderType === exports.ShaderType.fragment); + } + if (removeVersion) { + return macroString + source; + } + return versionString + macroString + source; + }; + /** + * Convert lower GLSL version to GLSL 300 es. + * @param source - code + * @param isFragment - Whether it is a fragment shader. + * */ ShaderFactory.convertTo300 = function convertTo300(source, isFragment) { + source = source.replace(/\bvarying\b/g, isFragment ? "in" : "out"); + source = source.replace(/\btexture(2D|Cube)\b/g, "texture"); + // Remove extensions + var regex = /#extension.+(GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g; + source = source.replace(regex, ""); + if (isFragment) { + source = source.replace(/\btexture(2D|Cube)LodEXT\b/g, "textureLod"); + source = source.replace(/\btexture(2D|Cube)GradEXT\b/g, "textureGrad"); + source = source.replace(/\bgl_FragDepthEXT\b/g, "gl_FragDepth"); + if (!ShaderFactory.has300Output(source)) { + var isMRT = /\bgl_FragData\[.+?\]/g.test(source); + if (isMRT) { + source = source.replace(/\bgl_FragColor\b/g, "gl_FragData[0]"); + var result = source.match(/\bgl_FragData\[.+?\]/g); + if (result) { + source = ShaderFactory.replaceMRTShader(source, result); + } + } else { + source = source.replace(/void\s+?main\s*\(/g, "out vec4 glFragColor;\nvoid main("); + source = source.replace(/\bgl_FragColor\b/g, "glFragColor"); + } + } + } else { + source = source.replace(/\battribute\b/g, "in"); + } + return source; + }; + ShaderFactory.parseIncludes = function parseIncludes(source, regex) { + if (regex === void 0) regex = /#include <(.+)>/gm; + var match; + while((match = regex.exec(source)) !== null){ + var shaderName = match[1]; + var replace = shaderLib[shaderName]; + if (replace === undefined) { + throw new Error("Can't find include shader name " + shaderName); + } + source = source.replace(match[0], replace); + } + return source; + }; + ShaderFactory.genMacroString = function genMacroString(level, macros, addRuntimeMacro) { + if (addRuntimeMacro === void 0) addRuntimeMacro = true; + var macroList = []; + var webGLVersion = "WEBGL" + level; + macroList.push("#ifndef " + webGLVersion); + macroList.push("#define " + webGLVersion); + macroList.push("#endif"); + if (addRuntimeMacro) { + macroList.push("#define GE_RUNTIME"); + } + if (macros && macros.length) { + macros.forEach(function(param) { + var key = param[0], value = param[1]; + if (value === true) { + macroList.push("#define " + key); + } else if (Number.isFinite(value)) { + macroList.push("#define " + key + " " + value); + } + }); + } + if (macroList.length) { + return macroList.join("\n") + "\n"; + } + return ""; + }; + ShaderFactory.genShaderVersion = function genShaderVersion(level) { + if (level === 1) { + return "#version 100\n"; + } + return "#version 300 es\n"; + }; + ShaderFactory.isVersion300 = function isVersion300(source) { + var versionTag = /#version\s+\b\d{3}\b\s*(es)?/; + var match = source.match(versionTag); + var version = match ? match[0] : ""; + return version.includes("300"); + }; + ShaderFactory.removeWebGLVersion = function removeWebGLVersion(source) { + var versionTag = /#version\s+\b\d{3}\b\s*(es)?/; + var match = source.match(versionTag); + if (match) { + return source.replace(match[0], ""); + } + return source; + }; + ShaderFactory.has300Output = function has300Output(fragmentShader) { + // [layout(location = 0)] out [highp] vec4 [color]; + var fragReg = /\bout\s+(?:\w+\s+)?(?:vec4)\s+(?:\w+)\s*;/; + return fragReg.test(fragmentShader); + }; + ShaderFactory.replaceMRTShader = function replaceMRTShader(source, result) { + var mrtIndexSet = new Set(); + var declaration = ""; + for(var i = 0; i < result.length; i++){ + var res = result[i].match(/\bgl_FragData\[(.+?)\]/); + if (res) { + mrtIndexSet.add(res[1]); + } + } + mrtIndexSet.forEach(function(index) { + declaration += "layout(location=" + index + ") out vec4 fragOutColor" + index + ";\n"; + }); + declaration += "void main("; + source = source.replace(/\bgl_FragData\[(.+?)\]/g, "fragOutColor$1"); + source = source.replace(/void\s+?main\s*\(/g, declaration); + return source; + }; + return ShaderFactory; +}(); + +// Bloom 阈值 Pass +var BloomThresholdPass = /*#__PURE__*/ function(RenderPass) { + _inherits(BloomThresholdPass, RenderPass); + function BloomThresholdPass(renderer, option) { + var _this; + _this = RenderPass.call(this, renderer, option) || this; + var engine = _this.renderer.engine; + var geometry = Geometry.create(engine, { + mode: glContext.TRIANGLE_STRIP, + attributes: { + aPos: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array([ + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1 + ]) + } + }, + drawCount: 4 + }); + var material = Material.create(engine, { + shader: { + vertex: screenMeshVert, + fragment: thresholdFrag, + glslVersion: exports.GLSLVersion.GLSL1 + } + }); + material.blending = false; + material.depthTest = false; + material.culling = false; + _this.screenMesh = Mesh.create(engine, { + geometry: geometry, + material: material, + priority: 0 + }); + _this.priority = 5000; + return _this; + } + var _proto = BloomThresholdPass.prototype; + _proto.configure = function configure(renderer) { + this.mainTexture = renderer.getFramebuffer().getColorTextures()[0]; + this.sceneTextureHandle.texture = this.mainTexture; + renderer.setFramebuffer(this.framebuffer); + }; + _proto.execute = function execute(renderer) { + var _renderer_renderingData_currentFrame_globalVolume_bloom, _renderer_renderingData_currentFrame_globalVolume; + renderer.clear({ + colorAction: exports.TextureStoreAction.clear, + depthAction: exports.TextureStoreAction.clear, + stencilAction: exports.TextureStoreAction.clear + }); + this.screenMesh.material.setTexture("_MainTex", this.mainTexture); + var _renderer_renderingData_currentFrame_globalVolume_bloom_threshold; + var threshold = (_renderer_renderingData_currentFrame_globalVolume_bloom_threshold = (_renderer_renderingData_currentFrame_globalVolume = renderer.renderingData.currentFrame.globalVolume) == null ? void 0 : (_renderer_renderingData_currentFrame_globalVolume_bloom = _renderer_renderingData_currentFrame_globalVolume.bloom) == null ? void 0 : _renderer_renderingData_currentFrame_globalVolume_bloom.threshold) != null ? _renderer_renderingData_currentFrame_globalVolume_bloom_threshold : 1.0; + this.screenMesh.material.setFloat("_Threshold", threshold); + renderer.renderMeshes([ + this.screenMesh + ]); + }; + return BloomThresholdPass; +}(RenderPass); +var HQGaussianDownSamplePass = /*#__PURE__*/ function(RenderPass) { + _inherits(HQGaussianDownSamplePass, RenderPass); + function HQGaussianDownSamplePass(renderer, type, options) { + var _this; + _this = RenderPass.call(this, renderer, options) || this; + _this.type = type; + var engine = _this.renderer.engine; + var name = "PostProcess"; + var geometry = Geometry.create(engine, { + name: name, + mode: glContext.TRIANGLE_STRIP, + attributes: { + aPos: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array([ + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1 + ]) + } + }, + drawCount: 4 + }); + var fragment = type == "H" ? gaussianDownHFrag : gaussianDownVFrag; + var shader = { + vertex: screenMeshVert, + fragment: fragment, + glslVersion: exports.GLSLVersion.GLSL1 + }; + var material = Material.create(engine, { + name: name, + shader: shader + }); + material.blending = false; + material.depthTest = false; + material.culling = false; + _this.screenMesh = Mesh.create(engine, { + name: name, + geometry: geometry, + material: material, + priority: 0 + }); + _this.priority = 5000; + return _this; + } + var _proto = HQGaussianDownSamplePass.prototype; + _proto.configure = function configure(renderer) { + this.mainTexture = renderer.getFramebuffer().getColorTextures()[0]; + renderer.setFramebuffer(this.framebuffer); + }; + _proto.execute = function execute(renderer) { + renderer.clear({ + colorAction: exports.TextureStoreAction.clear, + depthAction: exports.TextureStoreAction.clear, + stencilAction: exports.TextureStoreAction.clear + }); + this.screenMesh.material.setTexture("_MainTex", this.mainTexture); + this.screenMesh.material.setVector2("_TextureSize", getTextureSize(this.mainTexture)); + renderer.renderMeshes([ + this.screenMesh + ]); + if (this.type === "V") { + this.gaussianResult.texture = renderer.getFramebuffer().getColorTextures()[0]; + } + }; + return HQGaussianDownSamplePass; +}(RenderPass); +var HQGaussianUpSamplePass = /*#__PURE__*/ function(RenderPass) { + _inherits(HQGaussianUpSamplePass, RenderPass); + function HQGaussianUpSamplePass(renderer, options) { + var _this; + _this = RenderPass.call(this, renderer, options) || this; + var name = "PostProcess"; + var engine = _this.renderer.engine; + var geometry = Geometry.create(engine, { + name: name, + mode: glContext.TRIANGLE_STRIP, + attributes: { + aPos: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array([ + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1 + ]) + } + }, + drawCount: 4 + }); + var shader = { + vertex: screenMeshVert, + fragment: gaussianUpFrag + }; + var material = Material.create(engine, { + name: name, + shader: shader + }); + material.blending = false; + material.depthTest = false; + material.culling = false; + _this.screenMesh = Mesh.create(engine, { + name: name, + geometry: geometry, + material: material, + priority: 0 + }); + _this.priority = 5000; + return _this; + } + var _proto = HQGaussianUpSamplePass.prototype; + _proto.configure = function configure(renderer) { + this.mainTexture = renderer.getFramebuffer().getColorTextures()[0]; + renderer.setFramebuffer(this.framebuffer); + }; + _proto.execute = function execute(renderer) { + renderer.clear({ + colorAction: exports.TextureStoreAction.clear, + depthAction: exports.TextureStoreAction.clear, + stencilAction: exports.TextureStoreAction.clear + }); + this.screenMesh.material.setTexture("_MainTex", this.mainTexture); + this.screenMesh.material.setTexture("_GaussianDownTex", this.gaussianDownSampleResult.texture); + this.screenMesh.material.setVector2("_GaussianDownTextureSize", getTextureSize(this.gaussianDownSampleResult.texture)); + renderer.renderMeshes([ + this.screenMesh + ]); + }; + return HQGaussianUpSamplePass; +}(RenderPass); +// 合并Bloom的高斯模糊结果,并应用ACES Tonemapping +var ToneMappingPass = /*#__PURE__*/ function(RenderPass) { + _inherits(ToneMappingPass, RenderPass); + function ToneMappingPass(renderer, sceneTextureHandle) { + var _this; + _this = RenderPass.call(this, renderer, {}) || this; + var name = "PostProcess"; + var engine = _this.renderer.engine; + _this.sceneTextureHandle = sceneTextureHandle ? sceneTextureHandle : new RenderTargetHandle(engine); + var geometry = Geometry.create(engine, { + name: name, + mode: glContext.TRIANGLE_STRIP, + attributes: { + aPos: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array([ + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1 + ]) + } + }, + drawCount: 4 + }); + var material = Material.create(engine, { + name: name, + shader: { + vertex: screenMeshVert, + fragment: colorGradingFrag, + glslVersion: exports.GLSLVersion.GLSL1 + } + }); + material.blending = false; + material.depthTest = false; + material.culling = false; + _this.screenMesh = Mesh.create(engine, { + name: name, + geometry: geometry, + material: material, + priority: 0 + }); + _this.priority = 5000; + return _this; + } + var _proto = ToneMappingPass.prototype; + _proto.configure = function configure(renderer) { + this.mainTexture = renderer.getFramebuffer().getColorTextures()[0]; + if (!this.sceneTextureHandle.texture) { + this.sceneTextureHandle.texture = this.mainTexture; + } + renderer.setFramebuffer(null); + }; + _proto.execute = function execute(renderer) { + renderer.clear({ + colorAction: exports.TextureStoreAction.clear, + depthAction: exports.TextureStoreAction.clear, + stencilAction: exports.TextureStoreAction.clear + }); + var globalVolume = renderer.renderingData.currentFrame.globalVolume; + var bloom = _extends({ + threshold: 0, + intensity: 0, + active: false + }, globalVolume == null ? void 0 : globalVolume.bloom); + var vignette = _extends({ + intensity: 0, + smoothness: 0, + roundness: 0, + active: false + }, globalVolume == null ? void 0 : globalVolume.vignette); + var colorAdjustments = _extends({ + brightness: 0, + saturation: 0, + contrast: 0, + active: false + }, globalVolume == null ? void 0 : globalVolume.colorAdjustments); + var tonemapping = _extends({ + active: false + }, globalVolume == null ? void 0 : globalVolume.tonemapping); + this.screenMesh.material.setTexture("_SceneTex", this.sceneTextureHandle.texture); + this.screenMesh.material.setFloat("_Brightness", Math.pow(2, colorAdjustments.brightness)); + this.screenMesh.material.setFloat("_Saturation", colorAdjustments.saturation * 0.01 + 1); + this.screenMesh.material.setFloat("_Contrast", colorAdjustments.contrast * 0.01 + 1); + this.screenMesh.material.setInt("_UseBloom", Number(bloom.active)); + if (bloom.active) { + this.screenMesh.material.setTexture("_GaussianTex", this.mainTexture); + this.screenMesh.material.setFloat("_BloomIntensity", bloom.intensity); + } + if (vignette.intensity > 0) { + this.screenMesh.material.setFloat("_VignetteIntensity", vignette.intensity); + this.screenMesh.material.setFloat("_VignetteSmoothness", vignette.smoothness); + this.screenMesh.material.setFloat("_VignetteRoundness", vignette.roundness); + this.screenMesh.material.setVector2("_VignetteCenter", new Vector2(0.5, 0.5)); + this.screenMesh.material.setVector3("_VignetteColor", new Vector3(0.0, 0.0, 0.0)); + } + this.screenMesh.material.setInt("_UseToneMapping", Number(tonemapping.active)); + renderer.renderMeshes([ + this.screenMesh + ]); + }; + return ToneMappingPass; +}(RenderPass); + +var RENDER_PASS_NAME_PREFIX = "_effects_default_"; +var seed$9 = 1; +/** + * RenderFrame 抽象类 + */ var RenderFrame = /*#__PURE__*/ function() { + function RenderFrame(options) { + var _this_renderer_getShaderLibrary; + // TODO: 是否有用 + this.renderQueue = []; + this.destroyed = false; + this.renderPassInfoMap = new WeakMap(); + var camera = options.camera, keepColorBuffer = options.keepColorBuffer, renderer = options.renderer, _options_editorTransform = options.editorTransform, editorTransform = _options_editorTransform === void 0 ? [ + 1, + 1, + 0, + 0 + ] : _options_editorTransform, globalVolume = options.globalVolume, _options_postProcessingEnabled = options.postProcessingEnabled, postProcessingEnabled = _options_postProcessingEnabled === void 0 ? false : _options_postProcessingEnabled, _options_clearAction = options.clearAction, clearAction = _options_clearAction === void 0 ? { + colorAction: exports.TextureLoadAction.whatever, + stencilAction: exports.TextureLoadAction.clear, + depthAction: exports.TextureLoadAction.whatever + } : _options_clearAction; + var engine = renderer.engine; + if (globalVolume) { + this.globalVolume = globalVolume; + } + this.globalUniforms = new GlobalUniforms(); + var attachments = []; //渲染场景物体Pass的RT + var depthStencilAttachment; + var drawObjectPassClearAction = {}; + this.renderer = renderer; + if (postProcessingEnabled) { + var enableHDR = true; + if (!this.renderer.engine.gpuCapability.detail.halfFloatTexture) { + throw new Error("Half float texture is not supported."); + } + // 使用HDR浮点纹理,FLOAT在IOS上报错,使用HALF_FLOAT + var textureType = enableHDR ? glContext.HALF_FLOAT : glContext.UNSIGNED_BYTE; + attachments = [ + { + texture: { + format: glContext.RGBA, + type: textureType, + magFilter: glContext.LINEAR, + minFilter: glContext.LINEAR + } + } + ]; + depthStencilAttachment = { + storageType: exports.RenderPassAttachmentStorageType.depth_stencil_opaque + }; + drawObjectPassClearAction = { + colorAction: exports.TextureLoadAction.clear, + stencilAction: exports.TextureLoadAction.clear, + depthAction: exports.TextureLoadAction.clear + }; + } + this.drawObjectPass = new RenderPass(renderer, { + name: RENDER_PASS_NAME_PREFIX, + priority: RenderPassPriorityNormal, + meshOrder: exports.OrderType.ascending, + depthStencilAttachment: depthStencilAttachment, + attachments: attachments, + clearAction: drawObjectPassClearAction + }); + var renderPasses = [ + this.drawObjectPass + ]; + this.setRenderPasses(renderPasses); + if (postProcessingEnabled) { + var sceneTextureHandle = new RenderTargetHandle(engine); //保存后处理前的屏幕图像 + var gaussianStep = 7; // 高斯模糊的迭代次数,次数越高模糊范围越大 + var viewport = [ + 0, + 0, + this.renderer.getWidth() / 2, + this.renderer.getHeight() / 2 + ]; + var gaussianDownResults = new Array(gaussianStep); //存放多个高斯Pass的模糊结果,用于Bloom + var enableHDR1 = true; + var textureType1 = enableHDR1 ? glContext.HALF_FLOAT : glContext.UNSIGNED_BYTE; + var bloomThresholdPass = new BloomThresholdPass(renderer, { + name: "BloomThresholdPass", + attachments: [ + { + texture: { + format: glContext.RGBA, + type: textureType1, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR + } + } + ] + }); + bloomThresholdPass.sceneTextureHandle = sceneTextureHandle; + this.addRenderPass(bloomThresholdPass); + for(var i = 0; i < gaussianStep; i++){ + gaussianDownResults[i] = new RenderTargetHandle(engine); + var gaussianDownHPass = new HQGaussianDownSamplePass(renderer, "H", { + name: "GaussianDownPassH" + i, + viewport: viewport, + attachments: [ + { + texture: { + format: glContext.RGBA, + type: textureType1, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR + } + } + ] + }); + var gaussianDownVPass = new HQGaussianDownSamplePass(renderer, "V", { + name: "GaussianDownPassV" + i, + viewport: viewport, + attachments: [ + { + texture: { + format: glContext.RGBA, + type: textureType1, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR + } + } + ] + }); + gaussianDownVPass.gaussianResult = gaussianDownResults[i]; + this.addRenderPass(gaussianDownHPass); + this.addRenderPass(gaussianDownVPass); + viewport[2] /= 2; + viewport[3] /= 2; + // TODO 限制最大迭代 + } + viewport[2] *= 4; + viewport[3] *= 4; + for(var i1 = 0; i1 < gaussianStep - 1; i1++){ + var gaussianUpPass = new HQGaussianUpSamplePass(renderer, { + name: "GaussianUpPass" + i1, + viewport: viewport, + attachments: [ + { + texture: { + format: glContext.RGBA, + type: textureType1, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR + } + } + ] + }); + gaussianUpPass.gaussianDownSampleResult = gaussianDownResults[gaussianStep - 2 - i1]; + this.addRenderPass(gaussianUpPass); + viewport[2] *= 2; + viewport[3] *= 2; + } + var postProcessPass = new ToneMappingPass(renderer, sceneTextureHandle); + this.addRenderPass(postProcessPass); + } + this.semantics = new SemanticMap(options.semantics); + this.clearAction = clearAction; + this.name = "RenderFrame" + seed$9++; + var firstRP = renderPasses[0]; + this.emptyTexture = generateWhiteTexture(engine); + this.transparentTexture = generateTransparentTexture(engine); + this.camera = camera; + this.keepColorBuffer = keepColorBuffer; + this.renderPassInfoMap.set(firstRP, { + listStart: 0, + listEnd: 0, + renderPass: firstRP, + intermedia: false + }); + this.editorTransform = Vector4$1.fromArray(editorTransform); + if (!options.clearAction) { + this.resetClearActions(); + } + this.passTextureCache = new PassTextureCache(engine); + // FIXME: addShader是为了性能考虑,如果影响不大,下面代码可以删除 + var _engine_gpuCapability = engine.gpuCapability, detail = _engine_gpuCapability.detail, level = _engine_gpuCapability.level; + var writeDepth = detail.readableDepthStencilTextures && detail.writableFragDepth; + var shader = createCopyShader(level, writeDepth); + (_this_renderer_getShaderLibrary = this.renderer.getShaderLibrary()) == null ? void 0 : _this_renderer_getShaderLibrary.addShader(shader); + } + var _proto = RenderFrame.prototype; + /** + * 根据 Mesh 优先级添加到 RenderPass + * @param mesh - 要添加的 Mesh 对象 + */ _proto.addMeshToDefaultRenderPass = function addMeshToDefaultRenderPass(mesh) { + this.drawObjectPass.addMesh(mesh); + }; + /** + * 把 Mesh 从 RenderPass 中移除, + * 如果 renderPass 中没有 mesh,此 renderPass 会被删除 + * @param mesh - 要删除的 Mesh 对象 + */ _proto.removeMeshFromDefaultRenderPass = function removeMeshFromDefaultRenderPass(mesh) { + this.drawObjectPass.removeMesh(mesh); + }; + /** + * 销毁 RenderFrame + * @param options - 可以有选择销毁一些对象 + */ _proto.dispose = function dispose(options) { + if ((options == null ? void 0 : options.semantics) !== exports.DestroyOptions.keep) { + this.semantics.dispose(); + } + var pass = (options == null ? void 0 : options.passes) ? options.passes : undefined; + if (pass !== exports.DestroyOptions.keep) { + this._renderPasses.forEach(function(renderPass) { + renderPass.dispose(pass); + }); + } + this.passTextureCache.dispose(); + this._renderPasses.length = 0; + this.emptyTexture.dispose(); + this.transparentTexture.dispose(); + if (this.resource) { + var _this_resource_depthStencil_texture, _this_resource_depthStencil; + this.resource.color_a.dispose(); + this.resource.color_b.dispose(); + (_this_resource_depthStencil = this.resource.depthStencil) == null ? void 0 : (_this_resource_depthStencil_texture = _this_resource_depthStencil.texture) == null ? void 0 : _this_resource_depthStencil_texture.dispose(); + this.resource.finalCopyRP.dispose(); + this.resource.resRP.dispose(); + // @ts-expect-error + this.resource = null; + } + this.destroyed = true; + }; + /** + * 重置 RenderPass ColorAttachment,解决 Framebuffer 即读又写的问题 + * @param renderPasses - RenderPass 对象数组 + * @param startIndex - 开始重置的索引 + */ _proto.resetRenderPassDefaultAttachment = function resetRenderPassDefaultAttachment(renderPasses, startIndex) { + var pre; + var _this_resource = this.resource, color_a = _this_resource.color_a, color_b = _this_resource.color_b; + for(var i = startIndex; i < renderPasses.length; i++){ + var _rp_attachments_, _rp_attachments_1; + var rp = renderPasses[i]; + var tex = (_rp_attachments_ = rp.attachments[0]) == null ? void 0 : _rp_attachments_.texture; + // @ts-expect-error + if (tex && pre === tex) { + var next = tex === color_a ? color_b : color_a; + rp.resetColorAttachments([ + next + ]); + //this.renderer.extension.resetColorAttachments?.(rp as GLRenderPass, [next as GLTexture]); + } + tex = (_rp_attachments_1 = rp.attachments[0]) == null ? void 0 : _rp_attachments_1.texture; + if (tex) { + pre = tex; + } + } + }; + /** + * 查找 Mesh 所在的 RenderPass 索引,没找到是-1 + * @param mesh - 需要查找的 Mesh + */ _proto.findMeshRenderPassIndex = function findMeshRenderPassIndex(mesh) { + var index = -1; + this.renderPasses.every(function(rp, idx) { + if (rp.name.startsWith(RENDER_PASS_NAME_PREFIX) && rp.meshes.includes(mesh)) { + index = idx; + return false; + } + return true; + }); + return index; + }; + _proto.addToRenderPass = function addToRenderPass(renderPass, mesh) { + var info = this.renderPassInfoMap.get(renderPass); + var priority = mesh.priority; + if (!info) { + return; + } + if (renderPass.meshes.length === 0) { + info.listStart = info.listEnd = priority; + } else { + if (priority < info.listStart) { + info.listStart = priority; + } else if (priority > info.listEnd) { + info.listEnd = priority; + } + } + renderPass.addMesh(mesh); + }; + _proto.getRPAttachments = function getRPAttachments(attachments, preRP) { + if ((attachments == null ? void 0 : attachments.length) === 1) { + var _attachments_ = attachments[0], texture = _attachments_.texture, persistent = _attachments_.persistent; + var format = texture.format; + var _preRP_getInitAttachments; + var previousAttachmens = (_preRP_getInitAttachments = preRP == null ? void 0 : preRP.getInitAttachments()) != null ? _preRP_getInitAttachments : []; + if (format === glContext.RGBA && !persistent) { + var texA = this.resource.color_a; + if (previousAttachmens.length === 0) { + return [ + { + texture: texA + } + ]; + } + var texture1 = previousAttachmens[0].texture === texA ? this.resource.color_b : texA; + return [ + { + texture: texture1 + } + ]; + } + } + return attachments; + }; + _proto.resetClearActions = function resetClearActions() { + var action = this.renderPasses.length > 1 ? exports.TextureLoadAction.clear : exports.TextureLoadAction.whatever; + this.clearAction.stencilAction = action; + this.clearAction.depthAction = action; + this.clearAction.colorAction = action; + if (this.keepColorBuffer) { + this.clearAction.colorAction = exports.TextureLoadAction.whatever; + } + }; + /** + * 设置 RenderPass 数组,直接修改内部的 RenderPass 数组 + * @param passes - RenderPass 数组 + */ _proto.setRenderPasses = function setRenderPasses(passes) { + var _this = this; + if (this.renderer !== undefined) { + passes.forEach(function(pass) { + return pass.initialize(_this.renderer); + }); + } + this._renderPasses = passes.slice(); + }; + /** + * 添加 RenderPass + * @param pass - 需要添加的 RenderPass + */ _proto.addRenderPass = function addRenderPass(pass) { + if (this.renderer !== undefined) { + pass.initialize(this.renderer); + } + this._renderPasses.push(pass); + }; + /** + * 创建 RenderPass 切分时需要的 GPU 资源 + */ _proto.createResource = function createResource() { + var engine = this.renderer.engine; + if (!this.resource) { + var _resRP_getDepthAttachment; + var _engine_gpuCapability = engine.gpuCapability, detail = _engine_gpuCapability.detail, level = _engine_gpuCapability.level; + var width = this.renderer.getWidth(); + var height = this.renderer.getHeight(); + var filter = level === 2 ? glContext.LINEAR : glContext.NEAREST; + var texA = Texture.create(engine, { + sourceType: exports.TextureSourceType.framebuffer, + format: glContext.RGBA, + name: "frame_a", + minFilter: filter, + magFilter: filter + }); + var texB = Texture.create(engine, { + sourceType: exports.TextureSourceType.framebuffer, + format: glContext.RGBA, + data: { + width: width, + height: height + }, + minFilter: filter, + magFilter: filter, + name: "frame_b" + }); + var depthStencilType = detail.readableDepthStencilTextures && detail.writableFragDepth ? exports.RenderPassAttachmentStorageType.depth_24_stencil_8_texture : exports.RenderPassAttachmentStorageType.depth_stencil_opaque; + var resRP = new RenderPass(this.renderer, { + depthStencilAttachment: { + storageType: depthStencilType + }, + attachments: [ + { + texture: texA + } + ] + }).initialize(this.renderer); + var finalCopyRP = new FinalCopyRP(this.renderer, { + name: "effects-final-copy", + priority: RenderPassPriorityNormal + 600, + clearAction: { + depthAction: exports.TextureLoadAction.clear, + stencilAction: exports.TextureLoadAction.clear, + colorAction: exports.TextureLoadAction.clear + }, + meshOrder: exports.OrderType.ascending, + meshes: [ + this.createCopyMesh({ + blend: true, + depthTexture: (_resRP_getDepthAttachment = resRP.getDepthAttachment()) == null ? void 0 : _resRP_getDepthAttachment.texture + }) + ] + }); + this.resource = { + color_a: resRP.attachments[0].texture, + color_b: texB, + finalCopyRP: finalCopyRP, + depthStencil: resRP.depthAttachment, + resRP: resRP + }; + } + }; + // TODO tex和size没有地方用到。 + /** + * 创建拷贝 RenderPass 用到的 Mesh 对象 + * @param semantics - RenderPass 渲染时 Framebuffer 的颜色和深度纹理、大小和是否混合 + */ _proto.createCopyMesh = function createCopyMesh(semantics) { + var // FIXME: 如果不把shader添加进shaderLibrary,这里可以移到core中,有性能上的考虑 + _this_renderer_getShaderLibrary; + var name = EFFECTS_COPY_MESH_NAME; + var engine = this.renderer.engine; + var geometry = Geometry.create(engine, { + name: name, + mode: glContext.TRIANGLE_STRIP, + attributes: { + aPos: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array([ + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1 + ]) + } + }, + drawCount: 4 + }); + var shader = createCopyShader(engine.gpuCapability.level, !!(semantics == null ? void 0 : semantics.depthTexture)); + (_this_renderer_getShaderLibrary = this.renderer.getShaderLibrary()) == null ? void 0 : _this_renderer_getShaderLibrary.addShader(shader); + var material = Material.create(engine, { + uniformValues: { + // @ts-expect-error + uDepth: semantics == null ? void 0 : semantics.depthTexture + }, + name: name, + shader: shader + }); + material.blending = false; + material.depthTest = false; + material.culling = false; + if (semantics == null ? void 0 : semantics.blend) { + material.blending = true; + material.blendFunction = [ + glContext.SRC_ALPHA, + glContext.ONE_MINUS_SRC_ALPHA, + glContext.SRC_ALPHA, + glContext.ONE_MINUS_SRC_ALPHA + ]; + } + return Mesh.create(engine, { + name: name, + geometry: geometry, + material: material, + priority: 0 + }); + }; + /** + * 移除 RenderPass + * @param pass - 需要移除的 RenderPass + */ _proto.removeRenderPass = function removeRenderPass(pass) { + removeItem(this._renderPasses, pass); + }; + _create_class(RenderFrame, [ + { + key: "renderPasses", + get: function get() { + return this._renderPasses.slice(); + } + }, + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return RenderFrame; +}(); +function getTextureSize(tex) { + return tex ? new Vector2(tex.getWidth(), tex.getHeight()) : new Vector2(); +} +function findPreviousRenderPass(renderPasses, renderPass) { + var index = renderPasses.indexOf(renderPass); + return renderPasses[index - 1]; +} +var FinalCopyRP = /*#__PURE__*/ function(RenderPass) { + _inherits(FinalCopyRP, RenderPass); + function FinalCopyRP() { + return RenderPass.apply(this, arguments); + } + var _proto = FinalCopyRP.prototype; + _proto.configure = function configure(renderer) { + var framebuffer = renderer.getFramebuffer(); + if (framebuffer) { + this.prePassTexture = framebuffer.getColorTextures()[0]; + } + renderer.setFramebuffer(null); + }; + _proto.execute = function execute(renderer) { + renderer.clear(this.clearAction); + this.meshes[0].material.setTexture("uFilterSource", this.prePassTexture); + this.meshes[0].material.setVector2("uFilterSourceSize", getTextureSize(this.prePassTexture)); + renderer.renderMeshes(this.meshes); + if (this.storeAction) { + renderer.clear(this.storeAction); + } + }; + return FinalCopyRP; +}(RenderPass); +var GlobalUniforms = function GlobalUniforms() { + this.floats = {}; + this.ints = {}; + this.vector3s = {}; + this.vector4s = {}; + this.matrices = {}; + //... + this.samplers = [] // 存放的sampler名称。 + ; + this.uniforms = [] // 存放的uniform名称(不包括sampler)。 + ; +}; + +var Renderbuffer = /*#__PURE__*/ function() { + function Renderbuffer(props) { + this.size = [ + 0, + 0 + ]; + this.multiSample = 1; + this.destroyed = false; + var storageType = props.storageType, format = props.format, attachment = props.attachment; + this.storageType = storageType; + this.format = format; + this.attachment = attachment; + } + _create_class(Renderbuffer, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return Renderbuffer; +}(); + +var isWebGL2Available = typeof WebGL2RenderingContext === "function"; +var GPUCapability = /*#__PURE__*/ function() { + function GPUCapability(gl) { + this.setupCapability(gl); + } + var _proto = GPUCapability.prototype; + _proto.setupCapability = function setupCapability(gl) { + var _gl_getExtension; + var level = isWebGL2Available && _instanceof1(gl, WebGL2RenderingContext) ? 2 : 1; + var level2 = level === 2; + var textureAnisotropicExt = gl.getExtension("EXT_texture_filter_anisotropic") || gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic"); + var depthTextureExtension = gl.getExtension("WEBGL_depth_texture"); + var halfFloatLinear = !!gl.getExtension("OES_texture_half_float_linear"); + var floatLinear = !!gl.getExtension("OES_texture_float_linear"); + this.level = level; + this.type = level2 ? "webgl2" : "webgl"; + this.vaoExt = gl.getExtension("OES_vertex_array_object"); + this.glAsyncCompileExt = gl.getExtension("KHR_parallel_shader_compile"); + this.UNSIGNED_INT_24_8 = gl.UNSIGNED_INT_24_8; + this.drawBufferExtension = gl.getExtension("WEBGL_draw_buffers"); + if (depthTextureExtension) { + this.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL; + } + if (level2 && !halfFloatLinear) { + halfFloatLinear = checkLinearTextureFilter(gl, gl.HALF_FLOAT); + } + if (level2 && !floatLinear) { + floatLinear = checkLinearTextureFilter(gl, gl.FLOAT); + } + this.internalFormatDepth16 = level2 ? gl.DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT; + this.internalFormatDepth24_stencil8 = level2 ? gl.DEPTH24_STENCIL8 : gl.DEPTH_STENCIL; + var floatTexture = level2 || gl.getExtension("OES_texture_float") ? gl.FLOAT : 0; + var halfFloatTexture = level2 ? WebGL2RenderingContext.HALF_FLOAT : ((_gl_getExtension = gl.getExtension("OES_texture_half_float")) == null ? void 0 : _gl_getExtension.HALF_FLOAT_OES) || 0; + var detail = { + floatTexture: floatTexture, + halfFloatTexture: halfFloatTexture, + maxSample: level2 ? gl.getParameter(gl.MAX_SAMPLES) : 1, + maxVertexUniforms: gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS), + maxVertexTextures: gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), + maxFragmentUniforms: gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS), + maxFragmentTextures: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), + floatColorAttachment: level2 ? !!gl.getExtension("EXT_color_buffer_float") : floatTexture > 0 && !!gl.getExtension("WEBGL_color_buffer_float"), + halfFloatColorAttachment: level2 ? !!gl.getExtension("EXT_color_buffer_float") : halfFloatTexture > 0 && !!gl.getExtension("EXT_color_buffer_half_float"), + maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE), + maxShaderTexCount: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), + compressedTexture: registerCompressedTexture(gl), + halfFloatLinear: halfFloatLinear, + floatLinear: floatLinear, + maxTextureAnisotropy: textureAnisotropicExt ? gl.getParameter(textureAnisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0, + shaderTextureLod: level2 || !!gl.getExtension("EXT_shader_texture_lod"), + instanceDraw: level2 || !!gl.getExtension("ANGLE_instanced_arrays"), + drawBuffers: level2 || !!this.drawBufferExtension, + asyncShaderCompile: !!this.glAsyncCompileExt, + intIndexElementBuffer: !!gl.getExtension("OES_element_index_uint"), + standardDerivatives: level2 || !!gl.getExtension("OES_standard_derivatives"), + readableDepthStencilTextures: level2 || !!depthTextureExtension, + writableFragDepth: level2 || !!gl.getExtension("EXT_frag_depth") + }; + this["detail"] = detail; + if (textureAnisotropicExt) { + this.textureMaxAnisotropyExt = textureAnisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT; + } + }; + _proto.framebufferTexture2D = function framebufferTexture2D(gl, target, index, textarget, texture) { + var ext = this.drawBufferExtension; + if (this.level === 1 && !ext && index > 0) { + throw new Error("Draw multiple color buffers not available."); + } + var attachment = ext ? ext["COLOR_ATTACHMENT" + index + "_WEBGL"] : gl["COLOR_ATTACHMENT" + index]; + if (attachment) { + gl.framebufferTexture2D(target, attachment, textarget, texture, 0); + } else { + console.error("Invalid color attachment index: " + index + "."); + } + }; + _proto.drawBuffers = function drawBuffers(gl, bufferStates) { + var ext = this.drawBufferExtension; + if (this.level === 1 && !ext) { + if (bufferStates.length > 1) { + throw new Error("Draw buffers not available."); + } else { + return; + } + } + var buffers = bufferStates.map(function(enabled, index) { + if (enabled) { + return ext ? ext["COLOR_ATTACHMENT" + index + "_WEBGL"] : gl["COLOR_ATTACHMENT" + index]; + } + return gl.NONE; + }); + if (ext) { + ext.drawBuffersWEBGL(buffers); + } else { + gl.drawBuffers(buffers); + } + }; + _proto.setTextureAnisotropic = function setTextureAnisotropic(gl, target, level) { + var maxTextureAnisotropy = this.detail.maxTextureAnisotropy; + if (maxTextureAnisotropy) { + gl.texParameterf(target, this.textureMaxAnisotropyExt, Math.min(maxTextureAnisotropy, level || 4)); + } + }; + return GPUCapability; +}(); +function checkLinearTextureFilter(gl, type) { + var tex = gl.createTexture(); + var ret = false; + gl.getError(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.R16F, 1, 1, 0, gl.RED, type, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + if (!gl.getError()) { + ret = true; + } + gl.deleteTexture(tex); + return ret; +} +exports.COMPRESSED_TEXTURE = void 0; +(function(COMPRESSED_TEXTURE) { + COMPRESSED_TEXTURE[COMPRESSED_TEXTURE["NONE"] = 0] = "NONE"; + COMPRESSED_TEXTURE[COMPRESSED_TEXTURE["PVRTC"] = 1] = "PVRTC"; + COMPRESSED_TEXTURE[COMPRESSED_TEXTURE["ASTC"] = 2] = "ASTC"; +})(exports.COMPRESSED_TEXTURE || (exports.COMPRESSED_TEXTURE = {})); +function registerCompressedTexture(gl) { + if (gl.getExtension("WEBGL_compressed_texture_astc")) { + return 2; + } + if (gl.getExtension("WEBGL_compressed_texture_pvrtc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc")) { + return 1; + } + return 0; +} + +exports.FilterMode = void 0; +(function(FilterMode) { + FilterMode[FilterMode["Nearest"] = 0] = "Nearest"; + FilterMode[FilterMode["Linear"] = 1] = "Linear"; +})(exports.FilterMode || (exports.FilterMode = {})); +exports.RenderTextureFormat = void 0; +(function(RenderTextureFormat) { + RenderTextureFormat[RenderTextureFormat["RGBA32"] = 0] = "RGBA32"; + RenderTextureFormat[RenderTextureFormat["RGBAHalf"] = 1] = "RGBAHalf"; +})(exports.RenderTextureFormat || (exports.RenderTextureFormat = {})); +/** + * + */ var Framebuffer = /*#__PURE__*/ function() { + function Framebuffer() {} + var _proto = Framebuffer.prototype; + _proto.resize = function resize(x, y, width, height) { + // OVERRIDE + }; + _proto.resetColorTextures = function resetColorTextures(textures) { + // OVERRIDE + }; + _proto.unbind = function unbind() { + // OVERRIDE + }; + _proto.bind = function bind() { + // OVERRIDE + }; + _proto.getDepthTexture = function getDepthTexture() { + // OVERRIDE + return undefined; + }; + _proto.getStencilTexture = function getStencilTexture() { + // OVERRIDE + return undefined; + }; + _proto.getColorTextures = function getColorTextures() { + // OVERRIDE + return []; + }; + _proto.dispose = function dispose(options) { + // OVERRIDE + }; + _create_class(Framebuffer, [ + { + key: "stencilStorage", + get: function get() { + // OVERRIDE + return undefined; + } + }, + { + key: "depthStorage", + get: function get() { + // OVERRIDE + return undefined; + } + } + ]); + return Framebuffer; +}(); + +var Renderer = /*#__PURE__*/ function() { + function Renderer() {} + var _proto = Renderer.prototype; + _proto.setGlobalFloat = function setGlobalFloat(name, value) { + // OVERRIDE + }; + _proto.setGlobalInt = function setGlobalInt(name, value) { + // OVERRIDE + }; + _proto.setGlobalVector4 = function setGlobalVector4(name, value) { + // OVERRIDE + }; + _proto.setGlobalVector3 = function setGlobalVector3(name, value) { + // OVERRIDE + }; + _proto.setGlobalMatrix = function setGlobalMatrix(name, value) { + // OVERRIDE + }; + _proto.getFramebuffer = function getFramebuffer() { + // OVERRIDE + return null; + }; + _proto.setFramebuffer = function setFramebuffer(framebuffer) { + // OVERRIDE + }; + _proto.setViewport = function setViewport(x, y, width, height) { + // OVERRIDE + }; + _proto.resize = function resize(canvasWidth, canvasHeight) { + // OVERRIDE + }; + _proto.clear = function clear(action) { + // OVERRIDE + }; + _proto.getWidth = function getWidth() { + // OVERRIDE + return 0; + }; + _proto.getHeight = function getHeight() { + // OVERRIDE + return 0; + }; + /** + * 添加 webglcontextlost 事件回调 + * @override + * @param lostHandler + */ _proto.addLostHandler = function addLostHandler(lostHandler) { + // OVERRIDE + }; + /** + * 添加 webglContextrestored 事件的回调 + * @override + * @param restoreHandler + */ _proto.addRestoreHandler = function addRestoreHandler(restoreHandler) { + // OVERRIDE + }; + /** + * @override + * @param e + */ _proto.lost = function lost(e) { + // OVERRIDE + }; + /** + * @override + */ _proto.restore = function restore() { + // OVERRIDE + }; + /** + * + * @override + * @returns + */ _proto.getShaderLibrary = function getShaderLibrary() { + // OVERRIDE + return undefined; + }; + _proto.renderRenderFrame = function renderRenderFrame(renderFrame) { + // OVERRIDE + }; + _proto.renderMeshes = function renderMeshes(meshes) { + // OVERRIDE + }; + _proto.drawGeometry = function drawGeometry(geometry, material, subMeshIndex) { + // OVERRIDE + }; + _proto.getTemporaryRT = function getTemporaryRT(name, width, height, depthBuffer, filter, format) { + // OVERRIDE + return null; + }; + _proto.dispose = function dispose(haltGL) { + // OVERRIDE + }; + return Renderer; +}(); + +var Cone = /*#__PURE__*/ function() { + function Cone(props) { + var _this = this; + Object.keys(props).forEach(function(key) { + _this[key] = props[key]; + }); + } + var _proto = Cone.prototype; + _proto.generate = function generate(opt) { + var arc = getArcAngle(this.arc, this.arcMode, opt); + var a = arc * DEG2RAD; + var x = Math.cos(a) * this.radius; + var y = Math.sin(a) * this.radius; + var position = new Vector3(x, y, 0); + var l = Math.tan(this.angle * DEG2RAD); + var dir = position.clone().multiply(l); + // dir + [0,0,1] + dir.z += 1; + return { + position: position.multiply(randomInRange(0, 1)), + direction: dir.normalize() + }; + }; + return Cone; +}(); +function getArcAngle(arc, arcMode, opt) { + if (arcMode === ShapeArcMode.RANDOM) { + arc = randomInRange(0, arc); + } else if (arcMode === ShapeArcMode.UNIDIRECTIONAL_CYCLE) { + var d = opt.index % (opt.total + 1); + arc = arc / opt.total * d; + } else if (arcMode === ShapeArcMode.BIDIRECTIONAL_CYCLE) { + var d1 = opt.index / (opt.total + 1); + var i = d1 - Math.floor(d1); + arc = arc * (Math.floor(d1) % 2 ? 1 - i : i); + } else if (arcMode === ShapeArcMode.UNIFORM_BURST) { + arc = arc * opt.burstIndex / opt.burstCount; + } + return arc; +} + +var Circle = /*#__PURE__*/ function() { + function Circle(props) { + var _this = this; + Object.keys(props).forEach(function(key) { + _this[key] = props[key]; + }); + } + var _proto = Circle.prototype; + _proto.generate = function generate(opt) { + var arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD; + var direction = new Vector3(Math.cos(arc), Math.sin(arc), 0); + var radius = this.radius; + return { + direction: direction, + position: direction.clone().multiply(radius) + }; + }; + return Circle; +}(); +var Rectangle$1 = /*#__PURE__*/ function() { + function Rectangle(arg) { + this._d = (arg.width || 1) / 2; + this._h = (arg.height || 1) / 2; + } + var _proto = Rectangle.prototype; + _proto.generate = function generate(opt) { + var x = randomInRange(-this._d, this._d); + var y = randomInRange(-this._h, this._h); + return { + direction: new Vector3(0, 0, 1), + position: new Vector3(x, y, 0) + }; + }; + return Rectangle; +}(); +var RectangleEdge = /*#__PURE__*/ function() { + function RectangleEdge(arg) { + this._d = (arg.width || 1) / 2; + this._h = (arg.height || 1) / 2; + this.arcMode = arg.arcMode; + this.arc = arg.arc; + } + var _proto = RectangleEdge.prototype; + _proto.generate = function generate(opt) { + var arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD; + var direction = new Vector3(Math.cos(arc), Math.sin(arc), 0); + var w = this._d; + var h = this._h; + var r0 = Math.atan2(h, w); + var tan = Math.tan(arc); + var position = new Vector3(); + if (arc < r0) { + position.set(w, w * tan, 0); + } else if (arc >= r0 && arc < Math.PI - r0) { + position.set(h / tan, h, 0); + } else if (arc < Math.PI + r0) { + position.set(-w, -w * tan, 0); + } else if (arc < Math.PI * 2 - r0) { + position.set(-h / tan, -h, 0); + } else { + position.set(w, w * tan, 0); + } + return { + direction: direction, + position: position + }; + }; + return RectangleEdge; +}(); +var Edge = /*#__PURE__*/ function() { + function Edge(args) { + this._d = args.width || 1; + this.arcMode = args.arcMode; + } + var _proto = Edge.prototype; + _proto.generate = function generate(options) { + var x = this.arcMode === ShapeArcMode.UNIFORM_BURST ? options.burstIndex % options.burstCount / (options.burstCount - 1) : randomInRange(0, 1); + return { + direction: new Vector3(0, 1, 0), + position: new Vector3(this._d * (x - 0.5), 0, 0) + }; + }; + return Edge; +}(); + +var tempMat4$3 = new Matrix4$1(); +var Donut = /*#__PURE__*/ function() { + function Donut(props) { + var _this = this; + Object.keys(props).forEach(function(key) { + _this[key] = props[key]; + }); + } + var _proto = Donut.prototype; + _proto.generate = function generate(opt) { + var dradius = this.donutRadius; + var center = this.radius - dradius; + var angle = randomInRange(0, Math.PI * 2); + var arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD; + var rot = tempMat4$3.setFromRotationZ(arc); + var direction = new Vector3(Math.cos(angle), Math.sin(angle), 0); + var position = new Vector3(center + Math.cos(angle) * dradius, 0, Math.sin(angle) * dradius); + return { + direction: rot.transformNormal(direction), + position: rot.transformPoint(position) + }; + }; + return Donut; +}(); + +var tempMat4$2 = new Matrix4$1(); +var Sphere = /*#__PURE__*/ function() { + function Sphere(props) { + var _this = this; + Object.keys(props).forEach(function(key) { + _this[key] = props[key]; + }); + } + var _proto = Sphere.prototype; + _proto.getHorizontalAngle = function getHorizontalAngle() { + return randomInRange(-90, 90); + }; + _proto.generate = function generate(opt) { + var rz = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD; + var rh = this.getHorizontalAngle() * DEG2RAD; + var radius = this.radius; + var point = new Vector3(Math.cos(rh), 0, Math.sin(rh)); + var mat4 = tempMat4$2.setFromRotationZ(rz); + var p = mat4.transformNormal(point); + return { + position: p.clone().multiply(radius), + direction: p + }; + }; + return Sphere; +}(); +var Hemisphere = /*#__PURE__*/ function(Sphere) { + _inherits(Hemisphere, Sphere); + function Hemisphere() { + return Sphere.apply(this, arguments); + } + var _proto = Hemisphere.prototype; + _proto.getHorizontalAngle = function getHorizontalAngle() { + return randomInRange(0, 90); + }; + return Hemisphere; +}(Sphere); + +var TextureShape = /*#__PURE__*/ function() { + function TextureShape(arg) { + var detail = arg.detail || { + anchors: [ + 0.5, + 0.5 + ], + block: [ + 0, + 0 + ] + }; + this.anchors = new Float32Array(detail.anchors); + this.width = arg.width || 1; + this.height = arg.height || 1; + this.block = detail.block; + this.arcMode = arg.arcMode; + this.random = clamp$1(arg.random || 0, 0, 1); + } + var _proto = TextureShape.prototype; + _proto.generate = function generate(opt) { + var anchors = this.anchors; + var pointCount = anchors.length / 2 - 1; + var index = Math.floor(getArcAngle(pointCount, this.arcMode, opt)); + var pointX = (anchors[index * 2] + this.block[0] * this.random * Math.random()) % 1 - 0.5; + var pointY = (anchors[index * 2 + 1] + this.block[1] * this.random * Math.random()) % 1 - 0.5; + var dir = new Vector3(pointX, pointY, 0); + return { + position: new Vector3(pointX * this.width, pointY * this.height, 0), + direction: dir.normalize() + }; + }; + return TextureShape; +}(); + +var ShapeNone = /*#__PURE__*/ function() { + function ShapeNone() {} + var _proto = ShapeNone.prototype; + _proto.generate = function generate() { + return { + position: new Vector3(), + direction: new Vector3() + }; + }; + return ShapeNone; +}(); +var _obj$8; +var map$2 = (_obj$8 = {}, _obj$8[ParticleEmitterShapeType.NONE] = ShapeNone, _obj$8[ParticleEmitterShapeType.CONE] = Cone, _obj$8[ParticleEmitterShapeType.SPHERE] = Sphere, _obj$8[ParticleEmitterShapeType.HEMISPHERE] = Hemisphere, _obj$8[ParticleEmitterShapeType.CIRCLE] = Circle, _obj$8[ParticleEmitterShapeType.DONUT] = Donut, _obj$8[ParticleEmitterShapeType.RECTANGLE] = Rectangle$1, _obj$8[ParticleEmitterShapeType.EDGE] = Edge, _obj$8[ParticleEmitterShapeType.RECTANGLE_EDGE] = RectangleEdge, _obj$8[ParticleEmitterShapeType.TEXTURE] = TextureShape, _obj$8); +function createShape(shapeOptions) { + if (!shapeOptions) { + return new ShapeNone(); + } + var options = _extends({ + radius: 1, + arc: 360, + angle: 0, + arcMode: ShapeArcMode.RANDOM + }, shapeOptions); + var type = shapeOptions.type; + var Ctrl = map$2[type]; + if (!Ctrl) { + throw new Error("Invalid shape: " + type + "."); + } + var ctrl = new Ctrl(options); + if (type !== ParticleEmitterShapeType.NONE) { + var alignSpeedDirection = shapeOptions.alignSpeedDirection, _shapeOptions_upDirection = shapeOptions.upDirection, upDirection = _shapeOptions_upDirection === void 0 ? [ + 0, + 0, + 1 + ] : _shapeOptions_upDirection; + ctrl.alignSpeedDirection = alignSpeedDirection; + ctrl.upDirection = Vector3.fromArray(upDirection).normalize(); + } + return ctrl; +} + +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList(data, start, end, dim, clockwise) { + var i, last; + if (clockwise === signedArea(data, start, end, dim) > 0) { + for(i = start; i < end; i += dim)last = insertNode(i, data[i], data[i + 1], last); + } else { + for(i = end - dim; i >= start; i -= dim)last = insertNode(i, data[i], data[i + 1], last); + } + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } + return last; +} +// eliminate colinear or duplicate points +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; + var p = start, again; + do { + again = false; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) break; + again = true; + } else { + p = p.next; + } + }while (again || p !== end); + return end; +} +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar(ear) { + var a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + while(p !== ear.prev){ + if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + return true; +} +function isEarHashed(ear, minX, minY, invSize) { + var a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + // triangle bbox; min & max are calculated like this for speed + var minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x, minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y, maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x, maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y; + // z-order range for the current triangle bbox; + var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); + var p = ear.prevZ, n = ear.nextZ; + // look for points inside the triangle in both directions + while(p && p.z >= minZ && n && n.z <= maxZ){ + if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + // look for remaining points in decreasing z-order + while(p && p.z >= minZ){ + if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + // look for remaining points in increasing z-order + while(n && n.z <= maxZ){ + if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + return true; +} +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], i, len, start, end, list; + for(i = 0, len = holeIndices.length; i < len; i++){ + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); + } + queue.sort(compareX); + // process holes from left to right + for(i = 0; i < queue.length; i++){ + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode.next); + } + return outerNode; +} +function compareX(a, b) { + return a.x - b.x; +} +// find a bridge between vertices that connects hole with an outer ring and and link it +function eliminateHole(hole, outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + var b = splitPolygon(outerNode, hole); + // filter collinear points around the cuts + filterPoints(outerNode, outerNode.next); + filterPoints(b, b.next); + } +} +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge(hole, outerNode) { + var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m; + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + if (x === hx) { + if (hy === p.y) return p; + if (hy === p.next.y) return p.next; + } + m = p.x < p.next.x ? p : p.next; + } + } + p = p.next; + }while (p !== outerNode); + if (!m) return null; + if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan; + p = m; + do { + if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) { + m = p; + tanMin = tan; + } + } + p = p.next; + }while (p !== stop); + return m; +} +// whether sector in vertex m contains sector in vertex p in the same coordinates +function sectorContainsSector(m, p) { + return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; +} +// interlink polygon nodes in z-order +function indexCurve(start, minX, minY, invSize) { + var p = start; + do { + if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + }while (p !== start); + p.prevZ.nextZ = null; + p.prevZ = null; + sortLinked(p); +} +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked(list) { + var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; + do { + p = list; + list = null; + tail = null; + numMerges = 0; + while(p){ + numMerges++; + q = p; + pSize = 0; + for(i = 0; i < inSize; i++){ + pSize++; + q = q.nextZ; + if (!q) break; + } + qSize = inSize; + while(pSize > 0 || qSize > 0 && q){ + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + if (tail) tail.nextZ = e; + else list = e; + e.prevZ = tail; + tail = e; + } + p = q; + } + tail.nextZ = null; + inSize *= 2; + }while (numMerges > 1); + return list; +} +// z-order of a point given coords and inverse of the longer side of data bbox +function zOrder(x, y, minX, minY, invSize) { + // coords are transformed into non-negative 15-bit integer range + x = 32767 * (x - minX) * invSize; + y = 32767 * (y - minY) * invSize; + x = (x | x << 8) & 0x00FF00FF; + x = (x | x << 4) & 0x0F0F0F0F; + x = (x | x << 2) & 0x33333333; + x = (x | x << 1) & 0x55555555; + y = (y | y << 8) & 0x00FF00FF; + y = (y | y << 4) & 0x0F0F0F0F; + y = (y | y << 2) & 0x33333333; + y = (y | y << 1) & 0x55555555; + return x | y << 1; +} +// find the leftmost node of a polygon ring +function getLeftmost(start) { + var p = start, leftmost = start; + do { + if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p; + p = p.next; + }while (p !== start); + return leftmost; +} +// check if a point lies within a convex triangle +function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; +} +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges + (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible + (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors + equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case +} +// signed area of a triangle +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); +} +// check if two points are equal +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; +} +// check if two segments intersect +function intersects(p1, q1, p2, q2) { + var o1 = sign(area(p1, q1, p2)); + var o2 = sign(area(p1, q1, q2)); + var o3 = sign(area(p2, q2, p1)); + var o4 = sign(area(p2, q2, q1)); + if (o1 !== o2 && o3 !== o4) return true; // general case + if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + return false; +} +// for collinear points p, q, r, check if point q lies on segment pr +function onSegment(p, q, r) { + return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); +} +function sign(num) { + return num > 0 ? 1 : num < 0 ? -1 : 0; +} +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon(a, b) { + var p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; + p = p.next; + }while (p !== a); + return false; +} +// check if a polygon diagonal is locally inside the polygon +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside(a, b) { + var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; + do { + if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside; + p = p.next; + }while (p !== a); + return inside; +} +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; + a.next = b; + b.prev = a; + a2.next = an; + an.prev = a2; + b2.next = a2; + a2.prev = b2; + bp.next = b2; + b2.prev = bp; + return b2; +} +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode(i, x, y, last) { + var p = new Node(i, x, y); + if (!last) { + p.prev = p; + p.next = p; + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; +} +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; +} +function Node(i, x, y) { + // vertex index in coordinates array + this.i = i; + // vertex coordinates + this.x = x; + this.y = y; + // previous and next vertex nodes in a polygon ring + this.prev = null; + this.next = null; + // z-order curve value + this.z = null; + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + // indicates whether this is a steiner point + this.steiner = false; +} +function signedArea(data, start, end, dim) { + var sum = 0; + for(var i = start, j = end - dim; i < end; i += dim){ + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} + +var indexBase = 0; +function earcut(data, holeIndices, dim, ib) { + dim = dim || 2; + indexBase = ib || 0; + var hasHoles = holeIndices && holeIndices.length; + var outerLen = hasHoles ? holeIndices[0] * dim : data.length; + var outerNode = linkedList(data, 0, outerLen, dim, true); + var triangles = []; + if (!outerNode || outerNode.next === outerNode.prev) { + return triangles; + } + var minX, minY, maxX, maxY, x, y, invSize; + if (hasHoles) { + outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + } + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; + for(var i = dim; i < outerLen; i += dim){ + x = data[i]; + y = data[i + 1]; + if (x < minX) { + minX = x; + } + if (y < minY) { + minY = y; + } + if (x > maxX) { + maxX = x; + } + if (y > maxY) { + maxY = y; + } + } + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 1 / invSize : 0; + } + hackEarcutLinked(outerNode, triangles, dim, minX, minY, invSize); + return triangles; +} +// main ear slicing loop which triangulates a polygon (given as a linked list) +function hackEarcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) { + return; + } + // interlink polygon nodes in z-order + if (!pass && invSize) { + indexCurve(ear, minX, minY, invSize); + } + var stop = ear, prev, next; + // iterate through ears, slicing them one by one + while(ear.prev !== ear.next){ + prev = ear.prev; + next = ear.next; + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + // cut off the triangle + triangles.push(prev.i / dim + indexBase); + triangles.push(ear.i / dim + indexBase); + triangles.push(next.i / dim + indexBase); + removeNode(ear); + // skipping the next vertex leads to less sliver triangles + ear = next.next; + stop = next.next; + continue; + } + ear = next; + // if we looped through the whole remaining polygon and can't find any more ears + if (ear === stop) { + // try filtering triangles and slicing again + if (!pass) { + hackEarcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); + // if this didn't work, try curing all small self-intersections locally + } else if (pass === 1) { + ear = hackCureLocalIntersections(filterPoints(ear), triangles, dim); + hackEarcutLinked(ear, triangles, dim, minX, minY, invSize, 2); + // as a last resort, try splitting the remaining polygon into two + } else if (pass === 2) { + hackSplitEarcut(ear, triangles, dim, minX, minY, invSize); + } + break; + } + } +} +// go through all polygon nodes and cure small local self-intersections +function hackCureLocalIntersections(start, triangles, dim) { + var p = start; + do { + var a = p.prev, b = p.next.next; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + triangles.push(a.i / dim + indexBase); + triangles.push(p.i / dim + indexBase); + triangles.push(b.i / dim + indexBase); + // remove two nodes involved + removeNode(p); + removeNode(p.next); + p = start = b; + } + p = p.next; + }while (p !== start); + return filterPoints(p); +} +// try splitting polygon into two and triangulate them independently +function hackSplitEarcut(start, triangles, dim, minX, minY, invSize) { + // look for a valid diagonal that divides the polygon into two + var a = start; + do { + var b = a.next.next; + while(b !== a.prev){ + if (a.i !== b.i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + var c = splitPolygon(a, b); + // filter colinear triangles around the cuts + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + // run earcut on each half + hackEarcutLinked(a, triangles, dim, minX, minY, invSize); + hackEarcutLinked(c, triangles, dim, minX, minY, invSize); + return; + } + b = b.next; + } + a = a.next; + }while (a !== start); +} + +var SPRITE_VERTEX_STRIDE = 6; +var SEMANTIC_PRE_COLOR_ATTACHMENT_0 = "PRE_COLOR_0"; +var SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0 = "PRE_COLOR_SIZE_0"; +var SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0 = "PRE_MAIN_COLOR_0"; +var SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0 = "PRE_MAIN_COLOR_SIZE_0"; +var PLAYER_OPTIONS_ENV_EDITOR = "editor"; +var HELP_LINK$1 = { + "Item duration can't be less than 0": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#AOnQS", + "ValueType: 21/22 is not supported": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#smO1b" +}; + +var POINT_INDEX = 2; +function getGeometryTriangles(geometry, options) { + var s = geometry.s, p = geometry.p; + var segments = s[1]; + var points = p[1]; + var pointCount = 0; + for(var i = 0; i < segments.length; i++){ + var segment = segments[i]; + pointCount += segment.length - 1; + } + var pointData = new Float32Array(pointCount * SPRITE_VERTEX_STRIDE); + var _options_indexBase = options.indexBase, indexBase = _options_indexBase === void 0 ? 0 : _options_indexBase, uvTransform = options.uvTransform; + var index = 0; + var dx = 0, dy = 0, sw = 1, sh = 1, r; + if (uvTransform) { + dx = uvTransform[0]; + dy = uvTransform[1]; + r = uvTransform[4]; + sw = r ? uvTransform[3] : uvTransform[2]; + sh = r ? uvTransform[2] : uvTransform[3]; + } + var temp = [ + 0, + 0 + ]; + var angle = r === 0 ? 0 : -Math.PI / 2; + for(var i1 = 0; i1 < segments.length; i1++){ + var segment1 = segments[i1]; + var p0 = points[i1]; + var p1 = points[i1 + 1] || points[0]; + var keys = segment1; + var point = [ + 0, + 0 + ]; + for(var j = 0; j < keys.length - 1; j++){ + var key = keys[j]; + getBezier2DValue(point, key, p0, p1, p0[4], p0[5], p1[2], p1[3]); + setPoint(point[0], point[1]); + } + } + var indices = earcut(Array.from(pointData), null, SPRITE_VERTEX_STRIDE, indexBase); + return { + aPoint: pointData, + index: new Uint16Array(indices) + }; + function setPoint(x, y) { + pointData[index++] = x / 2; + pointData[index++] = y / 2; + if (uvTransform) { + temp[0] = x; + temp[1] = y; + rotateVec2(temp, temp, angle); + pointData[index++] = dx + (temp[0] + 1) / 2 * sw; + pointData[index++] = dy + (temp[1] + 1) / 2 * sh; + } else { + pointData[index++] = (x + 1) / 2; + pointData[index++] = (y + 1) / 2; + } + index += POINT_INDEX; + } +} +/** + * 根据新老版形状数据获取形状几何数据 + * @param shape 新老版形状数据 + */ function getGeometriesByShapeData(shape) { + var geometries = []; + // 该版本的单个形状数据可以包含多个形状,可以加个埋点,五福之后没有就可以下掉 + if ("gs" in shape) { + shape.gs.forEach(function(gs) { + geometries.push({ + p: [ + ValueType.SHAPE_POINTS, + gs.p + ], + s: [ + ValueType.SHAPE_SPLITS, + gs.s + ] + }); + }); + } else if ("g" in shape) { + geometries.push({ + p: [ + ValueType.SHAPE_POINTS, + shape.g.p + ], + s: [ + ValueType.SHAPE_SPLITS, + shape.g.s + ] + }); + } else { + geometries.push(shape); + } + return geometries; +} +function getGeometryByShape(shape, uvTransform) { + var datas = []; + // 老数据兼容处理 + var geometries = getGeometriesByShapeData(shape); + var indexBase = 0; + var aPoint = 0; + var index = 0; + for(var i = 0; i < geometries.length; i++){ + var geometry = geometries[i]; + var data = getGeometryTriangles(geometry, { + indexBase: indexBase, + uvTransform: uvTransform + }); + indexBase += data.aPoint.length / 5; + datas.push(data); + aPoint += data.aPoint.length; + index += data.index.length; + } + if (datas.length === 1) { + return datas[0]; + } + var aPointData = new Float32Array(aPoint); + var indexData = new Uint16Array(index); + // @ts-expect-error + for(var i1 = 0, pointIndex = 0, idx = 0; i1 < datas[i1]; i1++){ + var data1 = datas[i1]; + aPointData.set(data1.aPoint, pointIndex); + pointIndex += data1.aPoint.length; + indexData.set(data1.index, idx); + idx += data1.index.length; + } + return { + aPoint: aPointData, + index: indexData + }; +} +function rotateVec2(out, vec2, angleInRad) { + var c = Math.cos(angleInRad); + var s = Math.sin(angleInRad); + var x = vec2[0]; + var y = vec2[1]; + out[0] = c * x + s * y; + out[1] = -s * x + c * y; + return out; +} +function getBezier2DValue(out, t, p0, p1, cpx0, cpy0, cpx1, cpy1) { + var ddt = 1 - t; + var a = ddt * ddt * ddt; + var b = 3 * t * ddt * ddt; + var c = 3 * t * t * ddt; + var d = t * t * t; + out[0] = a * p0[0] + b * cpx0 + c * cpx1 + d * p1[0]; + out[1] = a * p0[1] + b * cpy0 + c * cpy1 + d * p1[1]; + return out; +} + +/** + * @since 2.1.0 + */ var BaseRenderComponent = /*#__PURE__*/ function(RendererComponent) { + _inherits(BaseRenderComponent, RendererComponent); + function BaseRenderComponent(engine) { + var _this; + _this = RendererComponent.call(this, engine) || this; + _this.color = new Color(1, 1, 1, 1); + _this.visible = true; + /** + * 用于点击测试的碰撞器 + */ _this.meshCollider = new MeshCollider(); + // TODO 点击测试后续抽象一个 Collider 组件 + _this.getHitTestParams = function(force) { + var sizeMatrix = Matrix4$1.fromScale(_this.transform.size.x, _this.transform.size.y, 1); + var worldMatrix = sizeMatrix.premultiply(_this.transform.getWorldMatrix()); + var ui = _this.interaction; + if (force || ui) { + _this.meshCollider.setGeometry(_this.geometry, worldMatrix); + var area = _this.meshCollider.getBoundingBoxData(); + if (area) { + var _this_interaction; + return { + behavior: ((_this_interaction = _this.interaction) == null ? void 0 : _this_interaction.behavior) || 0, + type: area.type, + triangles: area.area, + backfaceCulling: _this.renderer.side === SideMode.FRONT + }; + } + } + }; + _this.renderer = { + renderMode: RenderMode.MESH, + blending: BlendingMode.ALPHA, + texture: _this.engine.emptyTexture, + occlusion: false, + transparentOcclusion: false, + side: SideMode.DOUBLE, + maskMode: exports.MaskMode.NONE, + mask: 0 + }; + var material = Material.create(_this.engine, { + shader: { + fragment: itemFrag, + vertex: itemVert, + shared: true + } + }); + _this.material = material; + _this.material.setColor("_Color", new Color().setFromArray([ + 1, + 1, + 1, + 1 + ])); + _this.maskManager = new MaskProcessor(engine); + return _this; + } + var _proto = BaseRenderComponent.prototype; + /** + * 设置当前 Mesh 的可见性。 + * @param visible - true:可见,false:不可见 + * @deprecated 2.4.0 Please use enabled instead + */ _proto.setVisible = function setVisible(visible) { + this.visible = visible; + }; + /** + * 获取当前 Mesh 的可见性。 + * @deprecated 2.4.0 Please use enabled instead + */ _proto.getVisible = function getVisible() { + return this.visible; + }; + _proto.setColor = function setColor(color) { + if (_instanceof1(color, Color)) { + this.color.copyFrom(color); + } else { + this.color.setFromArray(color); + } + this.material.setColor("_Color", this.color); + }; + _proto.setTexture = function setTexture(input) { + var _this = this; + return _async_to_generator(function() { + var texture; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!(typeof input === "string")) return [ + 3, + 2 + ]; + return [ + 4, + Texture.fromImage(input, _this.item.engine) + ]; + case 1: + texture = _state.sent(); + return [ + 3, + 3 + ]; + case 2: + texture = input; + _state.label = 3; + case 3: + _this.renderer.texture = texture; + _this.material.setTexture("_MainTex", texture); + return [ + 2 + ]; + } + }); + })(); + }; + _proto.render = function render(renderer) { + if (!this.getVisible()) { + return; + } + this.maskManager.drawStencilMask(renderer); + this.draw(renderer); + }; + /** + * @internal + */ _proto.drawStencilMask = function drawStencilMask(renderer) { + if (!this.isActiveAndEnabled) { + return; + } + var previousColorMask = this.material.colorMask; + this.material.colorMask = false; + this.draw(renderer); + this.material.colorMask = previousColorMask; + }; + _proto.onStart = function onStart() { + this.item.getHitTestParams = this.getHitTestParams; + }; + _proto.getBoundingBox = function getBoundingBox() { + var worldMatrix = this.transform.getWorldMatrix(); + this.meshCollider.setGeometry(this.geometry, worldMatrix); + var boundingBox = this.meshCollider.getBoundingBox(); + return boundingBox; + }; + _proto.getItemGeometryData = function getItemGeometryData(geometry) { + var renderer = this.renderer; + if (renderer.shape) { + var _renderer_shape = renderer.shape, _renderer_shape_index = _renderer_shape.index, index = _renderer_shape_index === void 0 ? [] : _renderer_shape_index, _renderer_shape_aPoint = _renderer_shape.aPoint, aPoint = _renderer_shape_aPoint === void 0 ? [] : _renderer_shape_aPoint; + var point = new Float32Array(aPoint); + var position = []; + var atlasOffset = []; + for(var i = 0; i < point.length; i += 6){ + atlasOffset.push(aPoint[i + 2], aPoint[i + 3]); + position.push(point[i], point[i + 1], 0.0); + } + geometry.setAttributeData("aPos", new Float32Array(position)); + return { + index: index, + atlasOffset: atlasOffset + }; + } else { + geometry.setAttributeData("aPos", new Float32Array([ + -0.5, + 0.5, + 0, + -0.5, + -0.5, + 0, + 0.5, + 0.5, + 0, + 0.5, + -0.5, + 0 + ])); + return { + index: [ + 0, + 1, + 2, + 2, + 1, + 3 + ], + atlasOffset: [ + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ] + }; + } + }; + _proto.createGeometry = function createGeometry() { + var geometry = Geometry.create(this.engine, { + attributes: { + aPos: { + type: glContext.FLOAT, + size: 3, + data: new Float32Array([ + -0.5, + 0.5, + 0, + -0.5, + -0.5, + 0, + 0.5, + 0.5, + 0, + 0.5, + -0.5, + 0 + ]) + }, + atlasOffset: { + size: 2, + offset: 0, + releasable: true, + type: glContext.FLOAT, + data: new Float32Array(0) + } + }, + indices: { + data: new Uint16Array(0), + releasable: true + }, + mode: glContext.TRIANGLES + }); + var geoData = this.getItemGeometryData(geometry); + var index = geoData.index, atlasOffset = geoData.atlasOffset; + geometry.setIndexData(new Uint16Array(index)); + geometry.setAttributeData("atlasOffset", new Float32Array(atlasOffset)); + geometry.setDrawCount(index.length); + return geometry; + }; + _proto.configureMaterial = function configureMaterial(renderer) { + var side = renderer.side, occlusion = renderer.occlusion, blendMode = renderer.blending, maskMode = renderer.maskMode, mask = renderer.mask, texture = renderer.texture; + var material = this.material; + material.blending = true; + material.depthTest = true; + material.depthMask = occlusion; + material.stencilRef = mask !== undefined ? [ + mask, + mask + ] : undefined; + setBlendMode(material, blendMode); + // 兼容旧数据中模板需要渲染的情况 + setMaskMode(material, maskMode); + setSideMode(material, side); + material.shader.shaderData.properties = '_MainTex("_MainTex",2D) = "white" {}'; + material.setColor("_Color", new Color(0, 0, 0, 1)); + material.setVector4("_TexOffset", new Vector4$1(0, 0, 1, 1)); + material.setTexture("_MainTex", texture); + this.preMultiAlpha = getPreMultiAlpha(blendMode); + var texParams = new Vector4$1(); + texParams.x = renderer.occlusion ? +renderer.transparentOcclusion : 1; + texParams.y = +this.preMultiAlpha; + texParams.z = renderer.renderMode; + texParams.w = renderer.maskMode; + material.setVector4("_TexParams", texParams); + if (texParams.x === 0 || renderer.maskMode === exports.MaskMode.MASK && !renderer.shape) { + material.enableMacro("ALPHA_CLIP"); + } else { + material.disableMacro("ALPHA_CLIP"); + } + return material; + }; + _proto.draw = function draw(renderer) { + if (renderer.renderingData.currentFrame.globalUniforms) { + renderer.setGlobalMatrix("effects_ObjectToWorld", this.transform.getWorldMatrix()); + } + for(var i = 0; i < this.materials.length; i++){ + var material = this.materials[i]; + material.setVector2("_Size", this.transform.size); + if (this.renderer.renderMode === RenderMode.BILLBOARD || this.renderer.renderMode === RenderMode.VERTICAL_BILLBOARD || this.renderer.renderMode === RenderMode.HORIZONTAL_BILLBOARD) { + material.setVector3("_Scale", this.transform.scale); + } + renderer.drawGeometry(this.geometry, material, i); + } + }; + _proto.fromData = function fromData(data) { + RendererComponent.prototype.fromData.call(this, data); + var _data_renderer; + var renderer = (_data_renderer = data.renderer) != null ? _data_renderer : {}; + var maskProps = data.mask; + if (maskProps && maskProps.ref) { + maskProps.ref = this.engine.findObject(maskProps.ref); + } + var maskMode = this.maskManager.getMaskMode(data); + // TODO 新蒙板上线后移除 + //------------------------------------------------------------------------- + var shapeData = renderer.shape; + //@ts-expect-error + var split = data.splits && !data.textureSheetAnimation ? data.splits[0] : undefined; + var shapeGeometry = undefined; + if (shapeData !== undefined && shapeData !== null && !("aPoint" in shapeData && "index" in shapeData)) { + shapeGeometry = getGeometryByShape(shapeData, split); + } + var _renderer_renderMode, _renderer_blending, _renderer_side; + //------------------------------------------------------------------------- + this.renderer = { + renderMode: (_renderer_renderMode = renderer.renderMode) != null ? _renderer_renderMode : RenderMode.MESH, + blending: (_renderer_blending = renderer.blending) != null ? _renderer_blending : BlendingMode.ALPHA, + texture: renderer.texture ? this.engine.findObject(renderer.texture) : this.engine.emptyTexture, + occlusion: !!renderer.occlusion, + transparentOcclusion: !!renderer.transparentOcclusion || maskMode === exports.MaskMode.MASK, + side: (_renderer_side = renderer.side) != null ? _renderer_side : SideMode.DOUBLE, + mask: this.maskManager.getRefValue(), + shape: shapeGeometry, + maskMode: maskMode + }; + this.configureMaterial(this.renderer); + }; + return BaseRenderComponent; +}(RendererComponent); + +exports.ShapeComponent = /*#__PURE__*/ function(BaseRenderComponent) { + _inherits(ShapeComponent, BaseRenderComponent); + function ShapeComponent(engine) { + var _this; + _this = BaseRenderComponent.call(this, engine) || this; + _this.hasStroke = false; + _this.hasFill = false; + _this.shapeDirty = true; + _this.graphicsPath = new GraphicsPath(); + _this.vert = "\nprecision highp float;\n\nattribute vec3 aPos;//x y\n\nuniform mat4 effects_MatrixVP;\nuniform mat4 effects_MatrixInvV;\nuniform mat4 effects_ObjectToWorld;\n\nvoid main() {\n vec4 pos = vec4(aPos.xyz, 1.0);\n gl_Position = effects_MatrixVP * effects_ObjectToWorld * pos;\n}\n"; + _this.frag = "\nprecision highp float;\n\nuniform vec4 _Color;\n\nvoid main() {\n vec4 color = _Color;\n color.rgb *= color.a;\n gl_FragColor = color;\n}\n"; + // Create Geometry + //------------------------------------------------------------------------- + _this.geometry = Geometry.create(engine, { + attributes: { + aPos: { + type: glContext.FLOAT, + size: 3, + data: new Float32Array([ + -0.5, + 0.5, + 0, + -0.5, + -0.5, + 0, + 0.5, + 0.5, + 0, + 0.5, + -0.5, + 0 + ]) + }, + aUV: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array() + } + }, + mode: glContext.TRIANGLES, + drawCount: 4 + }); + _this.geometry.subMeshes.push({ + offset: 0, + indexCount: 0, + vertexCount: 0 + }, { + offset: 0, + indexCount: 0, + vertexCount: 0 + }); + // Create Material + //------------------------------------------------------------------------- + var materialProps = { + shader: { + vertex: _this.vert, + fragment: _this.frag, + glslVersion: exports.GLSLVersion.GLSL1 + } + }; + var fillMaterial = Material.create(engine, materialProps); + var strokeMaterial = Material.create(engine, materialProps); + fillMaterial.color = new Color(1, 1, 1, 1); + fillMaterial.depthMask = false; + fillMaterial.depthTest = true; + fillMaterial.blending = true; + _this.material = fillMaterial; + strokeMaterial.color = new Color(0.25, 0.25, 0.25, 1); + strokeMaterial.depthMask = false; + strokeMaterial.depthTest = true; + strokeMaterial.blending = true; + _this.materials[1] = strokeMaterial; + // Create Shape Attrributes + //------------------------------------------------------------------------- + _this.strokeAttributes = { + width: 1, + alignment: 0.5, + cap: LineCap.Butt, + join: LineJoin.Miter, + miterLimit: 10, + color: new Color(1, 1, 1, 1) + }; + _this.fillAttribute = { + color: new Color(1, 1, 1, 1) + }; + _this.shapeAttribute = { + type: ShapePrimitiveType.Custom, + points: [], + easingIns: [], + easingOuts: [], + shapes: [] + }; + return _this; + } + var _proto = ShapeComponent.prototype; + _proto.onStart = function onStart() { + this.item.getHitTestParams = this.getHitTestParams; + }; + _proto.onUpdate = function onUpdate(dt) { + this.material.color = this.fillAttribute.color; + this.materials[1].color = this.strokeAttributes.color; + if (this.shapeDirty) { + this.buildPath(this.shapeAttribute); + this.buildGeometryFromPath(this.graphicsPath.shapePath); + this.shapeDirty = false; + } + }; + _proto.buildGeometryFromPath = function buildGeometryFromPath(shapePath) { + var shapePrimitives = shapePath.shapePrimitives; + var vertices = []; + var indices = []; + // Triangulate shapePrimitive + //--------------------------------------------------- + if (this.hasFill) { + for(var _iterator = _create_for_of_iterator_helper_loose(shapePrimitives), _step; !(_step = _iterator()).done;){ + var shapePrimitive = _step.value; + var shape = shapePrimitive.shape; + var points = []; + var indexOffset = indices.length; + var vertOffset = vertices.length / 2; + shape.build(points); + shape.triangulate(points, vertices, vertOffset, indices, indexOffset); + } + } + var fillIndexCount = indices.length; + if (this.hasStroke) { + for(var _iterator1 = _create_for_of_iterator_helper_loose(shapePrimitives), _step1; !(_step1 = _iterator1()).done;){ + var shapePrimitive1 = _step1.value; + var shape1 = shapePrimitive1.shape; + var points1 = []; + indices.length; + var vertOffset1 = vertices.length / 2; + var lineStyle = this.strokeAttributes; + var close = true; + if (this.shapeAttribute.type === ShapePrimitiveType.Custom) { + close = shape1.closePath; + } + shape1.build(points1); + buildLine(points1, lineStyle, false, close, vertices, 2, vertOffset1, indices); + } + } + var strokeIndexCount = indices.length - fillIndexCount; + var vertexCount = vertices.length / 2; + // get the current attribute and index arrays from the geometry, avoiding re-creation + var positionArray = this.geometry.getAttributeData("aPos"); + var uvArray = this.geometry.getAttributeData("aUV"); + var indexArray = this.geometry.getIndexData(); + if (!positionArray || positionArray.length < vertexCount * 3) { + positionArray = new Float32Array(vertexCount * 3); + } + if (!uvArray || uvArray.length < vertexCount * 2) { + uvArray = new Float32Array(vertexCount * 2); + } + if (!indexArray || indexArray.length < indices.length) { + indexArray = new Uint16Array(indices.length); + } + // set position and uv attribute array + for(var i = 0; i < vertexCount; i++){ + var pointsOffset = i * 3; + var positionArrayOffset = i * 2; + var uvOffset = i * 2; + positionArray[pointsOffset] = vertices[positionArrayOffset]; + positionArray[pointsOffset + 1] = vertices[positionArrayOffset + 1]; + positionArray[pointsOffset + 2] = 0; + uvArray[uvOffset] = positionArray[pointsOffset]; + uvArray[uvOffset + 1] = positionArray[pointsOffset + 1]; + } + // set index array + indexArray.set(indices); + // rewrite to geometry + this.geometry.setAttributeData("aPos", positionArray); + this.geometry.setAttributeData("aUV", uvArray); + this.geometry.setIndexData(indexArray); + this.geometry.setDrawCount(indices.length); + var u16Size = 2; + var fillSubMesh = this.geometry.subMeshes[0]; + var strokeSubMesh = this.geometry.subMeshes[1]; + fillSubMesh.indexCount = fillIndexCount; + strokeSubMesh.offset = fillIndexCount * u16Size; + strokeSubMesh.indexCount = strokeIndexCount; + }; + _proto.buildPath = function buildPath(shapeAttribute) { + this.graphicsPath.clear(); + switch(shapeAttribute.type){ + case ShapePrimitiveType.Custom: + { + var customShapeAtribute = this.shapeAttribute; + var points = customShapeAtribute.points; + var easingIns = customShapeAtribute.easingIns; + var easingOuts = customShapeAtribute.easingOuts; + for(var _iterator = _create_for_of_iterator_helper_loose(customShapeAtribute.shapes), _step; !(_step = _iterator()).done;){ + var shape = _step.value; + var indices = shape.indexes; + var startPoint = points[indices[0].point]; + this.graphicsPath.moveTo(startPoint.x, startPoint.y); + for(var i = 1; i < indices.length; i++){ + var pointIndex = indices[i]; + var lastPointIndex = indices[i - 1]; + var point = points[pointIndex.point]; + var lastPoint = points[lastPointIndex.point]; + var control1 = easingOuts[lastPointIndex.easingOut]; + var control2 = easingIns[pointIndex.easingIn]; + this.graphicsPath.bezierCurveTo(control1.x + lastPoint.x, control1.y + lastPoint.y, control2.x + point.x, control2.y + point.y, point.x, point.y, 1); + } + if (shape.close) { + var pointIndex1 = indices[0]; + var lastPointIndex1 = indices[indices.length - 1]; + var point1 = points[pointIndex1.point]; + var lastPoint1 = points[lastPointIndex1.point]; + var control11 = easingOuts[lastPointIndex1.easingOut]; + var control21 = easingIns[pointIndex1.easingIn]; + this.graphicsPath.bezierCurveTo(control11.x + lastPoint1.x, control11.y + lastPoint1.y, control21.x + point1.x, control21.y + point1.y, point1.x, point1.y, 1); + this.graphicsPath.closePath(); + } + } + break; + } + case ShapePrimitiveType.Ellipse: + { + var ellipseData = shapeAttribute; + this.graphicsPath.ellipse(0, 0, ellipseData.xRadius, ellipseData.yRadius); + break; + } + case ShapePrimitiveType.Rectangle: + { + var rectangleData = shapeAttribute; + this.graphicsPath.rect(-rectangleData.width / 2, -rectangleData.height / 2, rectangleData.width, rectangleData.height, rectangleData.roundness); + break; + } + case ShapePrimitiveType.Star: + { + var starData = shapeAttribute; + this.graphicsPath.polyStar(starData.pointCount, starData.outerRadius, starData.innerRadius, starData.outerRoundness, starData.innerRoundness, exports.StarType.Star); + break; + } + case ShapePrimitiveType.Polygon: + { + var polygonData = shapeAttribute; + this.graphicsPath.polyStar(polygonData.pointCount, polygonData.radius, polygonData.radius, polygonData.roundness, polygonData.roundness, exports.StarType.Polygon); + break; + } + } + }; + _proto.fromData = function fromData(data) { + BaseRenderComponent.prototype.fromData.call(this, data); + this.shapeDirty = true; + var strokeParam = data.stroke; + if (strokeParam) { + this.hasStroke = true; + this.strokeAttributes.width = strokeParam.width; + this.strokeAttributes.color.copyFrom(strokeParam.color); + this.strokeAttributes.cap = strokeParam.cap; + this.strokeAttributes.join = strokeParam.join; + } + var fillParam = data.fill; + if (fillParam) { + this.hasFill = true; + this.fillAttribute.color.copyFrom(fillParam.color); + } + switch(data.type){ + case ShapePrimitiveType.Custom: + { + var customShapeData = data; + var customShapeAttribute = { + type: ShapePrimitiveType.Custom, + points: [], + easingIns: [], + easingOuts: [], + shapes: [], + fill: customShapeData.fill + }; + for(var _iterator = _create_for_of_iterator_helper_loose(customShapeData.points), _step; !(_step = _iterator()).done;){ + var point = _step.value; + customShapeAttribute.points.push(new Vector2(point.x, point.y)); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(customShapeData.easingIns), _step1; !(_step1 = _iterator1()).done;){ + var easingIn = _step1.value; + customShapeAttribute.easingIns.push(new Vector2(easingIn.x, easingIn.y)); + } + for(var _iterator2 = _create_for_of_iterator_helper_loose(customShapeData.easingOuts), _step2; !(_step2 = _iterator2()).done;){ + var easingOut = _step2.value; + customShapeAttribute.easingOuts.push(new Vector2(easingOut.x, easingOut.y)); + } + customShapeAttribute.shapes = customShapeData.shapes; + this.shapeAttribute = customShapeAttribute; + break; + } + case ShapePrimitiveType.Ellipse: + { + var ellipseData = data; + var ellipseAttribute = { + type: ShapePrimitiveType.Ellipse, + xRadius: ellipseData.xRadius, + yRadius: ellipseData.yRadius, + fill: ellipseData.fill + }; + this.shapeAttribute = ellipseAttribute; + break; + } + case ShapePrimitiveType.Rectangle: + { + var rectangleData = data; + var rectangleAttribute = { + type: ShapePrimitiveType.Rectangle, + width: rectangleData.width, + height: rectangleData.height, + roundness: rectangleData.roundness, + fill: rectangleData.fill + }; + this.shapeAttribute = rectangleAttribute; + break; + } + case ShapePrimitiveType.Star: + { + var starData = data; + var starAttribute = { + type: ShapePrimitiveType.Star, + pointCount: starData.pointCount, + innerRadius: starData.innerRadius, + outerRadius: starData.outerRadius, + innerRoundness: starData.innerRoundness, + outerRoundness: starData.outerRoundness, + fill: starData.fill + }; + this.shapeAttribute = starAttribute; + break; + } + case ShapePrimitiveType.Polygon: + { + var polygonData = data; + var polygonAttribute = { + type: ShapePrimitiveType.Polygon, + pointCount: polygonData.pointCount, + radius: polygonData.radius, + roundness: polygonData.roundness, + fill: polygonData.fill + }; + this.shapeAttribute = polygonAttribute; + break; + } + } + var maskProps = data.mask; + if (maskProps && maskProps.ref) { + maskProps.ref = this.engine.findObject(maskProps.ref); + } + var maskMode = this.maskManager.getMaskMode(data); + var maskRef = this.maskManager.getRefValue(); + this.material.stencilRef = maskRef !== undefined ? [ + maskRef, + maskRef + ] : undefined; + setMaskMode(this.material, maskMode); + }; + _create_class(ShapeComponent, [ + { + key: "shape", + get: function get() { + this.shapeDirty = true; + return this.shapeAttribute; + } + } + ]); + return ShapeComponent; +}(BaseRenderComponent); +exports.ShapeComponent = __decorate([ + effectsClass("ShapeComponent") +], exports.ShapeComponent); + +exports.Fake3DComponent = /*#__PURE__*/ function(Component) { + _inherits(Fake3DComponent, Component); + function Fake3DComponent() { + var _this; + _this = Component.apply(this, arguments) || this; + _this.loop = false; + _this.amountOfMotion = 1.0; + _this.animationLength = 2.0; + _this.mode = 1; + _this.startPositionX = 0; + _this.startPositionY = 0; + _this.startPositionZ = 0; + _this.endPositionX = 0; + _this.endPositionY = 0; + _this.endPositionZ = 0; + _this.amplitudeX = 0; + _this.amplitudeY = 0; + _this.amplitudeZ = 0; + _this.phaseX = 0; + _this.phaseY = 0; + _this.phaseZ = 0; + return _this; + } + var _proto = Fake3DComponent.prototype; + _proto.onStart = function onStart() { + this.effectComponent = this.item.getComponent(exports.EffectComponent); + }; + _proto.onUpdate = function onUpdate(dt) { + this.updateFake3D(); + }; + _proto.updateFake3D = function updateFake3D() { + if (!this.effectComponent) { + return; + } + var time = this.item.time % this.animationLength / this.animationLength; + var _PosX = 0; + var _PosY = 0; + var _PosZ = 0; + switch(this.mode){ + case 0: + { + var PI = Math.PI; + _PosX = Math.sin(2.0 * PI * (time + this.phaseX)) * this.amplitudeX; + _PosY = Math.sin(2.0 * PI * (time + this.phaseY)) * this.amplitudeY; + _PosZ = Math.sin(2.0 * PI * (time + this.phaseZ)) * this.amplitudeZ; + break; + } + case 1: + { + var localTime = time; + if (this.loop) { + if (localTime > 0.5) { + localTime = 1 - localTime; + } + localTime *= 2; + } + _PosX = this.startPositionX * (1 - localTime) + localTime * this.endPositionX; + _PosY = this.startPositionY * (1 - localTime) + localTime * this.endPositionY; + _PosZ = this.startPositionZ * (1 - localTime) + localTime * this.endPositionZ; + break; + } + } + var material = this.effectComponent.material; + material.setFloat("_PosX", _PosX * this.amountOfMotion); + material.setFloat("_PosY", _PosY * this.amountOfMotion); + material.setFloat("_PosZ", _PosZ * this.amountOfMotion); + }; + return Fake3DComponent; +}(Component); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "loop", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "amountOfMotion", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "animationLength", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "mode", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "startPositionX", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "startPositionY", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "startPositionZ", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "endPositionX", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "endPositionY", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "endPositionZ", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "amplitudeX", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "amplitudeY", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "amplitudeZ", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "phaseX", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "phaseY", void 0); +__decorate([ + serialize() +], exports.Fake3DComponent.prototype, "phaseZ", void 0); +exports.Fake3DComponent = __decorate([ + effectsClass("Fake3DComponent") +], exports.Fake3DComponent); +exports.Fake3DAnimationMode = void 0; +(function(Fake3DAnimationMode) { + Fake3DAnimationMode[Fake3DAnimationMode["Circular"] = 0] = "Circular"; + Fake3DAnimationMode[Fake3DAnimationMode["Linear"] = 1] = "Linear"; +})(exports.Fake3DAnimationMode || (exports.Fake3DAnimationMode = {})); + +exports.CameraController = /*#__PURE__*/ function(Component) { + _inherits(CameraController, Component); + function CameraController(engine, props) { + var _this; + _this = Component.call(this, engine) || this; + if (props) { + _this.fromData(props); + } + return _this; + } + var _proto = CameraController.prototype; + _proto.onUpdate = function onUpdate() { + if (this.item.composition && this.item.transform.getValid()) { + var camera = this.item.composition.camera; + camera.near = this.options.near; + camera.far = this.options.far; + camera.fov = this.options.fov; + camera.clipMode = this.options.clipMode; + camera.transform.parentTransform = this.transform.parentTransform; + camera.position = this.transform.position; + // TODO 修正 GE 四元数旋转共轭问题 + camera.setQuat(this.transform.getQuaternion().clone().conjugate()); + } + }; + _proto.fromData = function fromData(data) { + Component.prototype.fromData.call(this, data); + this.options = data.options; + }; + return CameraController; +}(Component); +exports.CameraController = __decorate([ + effectsClass(DataType.CameraController) +], exports.CameraController); + +var CameraVFXItemLoader = /*#__PURE__*/ function(AbstractPlugin) { + _inherits(CameraVFXItemLoader, AbstractPlugin); + function CameraVFXItemLoader() { + return AbstractPlugin.apply(this, arguments); + } + return CameraVFXItemLoader; +}(AbstractPlugin); + +exports.HitTestType = void 0; +(function(HitTestType) { + HitTestType[HitTestType["triangle"] = 1] = "triangle"; + HitTestType[HitTestType["box"] = 2] = "box"; + HitTestType[HitTestType["sphere"] = 3] = "sphere"; + HitTestType[HitTestType["custom"] = 4] = "custom"; +})(exports.HitTestType || (exports.HitTestType = {})); + +var EVENT_TYPE_CLICK = "click"; +var EVENT_TYPE_TOUCH_START = "touchstart"; +var EVENT_TYPE_TOUCH_MOVE = "touchmove"; +var EVENT_TYPE_TOUCH_END = "touchend"; +var EventSystem = /*#__PURE__*/ function() { + function EventSystem(target, allowPropagation) { + if (allowPropagation === void 0) allowPropagation = false; + this.target = target; + this.allowPropagation = allowPropagation; + this.enabled = true; + this.handlers = {}; + this.nativeHandlers = {}; + } + var _proto = EventSystem.prototype; + _proto.bindListeners = function bindListeners() { + var _this = this; + var x; + var y; + var currentTouch; + var lastTouch; + var getTouch; + getTouch = function(event) { + return event; + }; + var touchstart = "mousedown"; + var touchmove = "mousemove"; + var touchend = "mouseup"; + var getTouchEventValue = function(event, x, y, dx, dy) { + if (dx === void 0) dx = 0; + if (dy === void 0) dy = 0; + var vx = 0; + var vy = 0; + var ts = performance.now(); + if (!_this.target) { + logger.warn("Trigger TouchEvent after EventSystem is disposed."); + return { + x: x, + y: y, + vx: 0, + vy: vy, + dx: dx, + dy: dy, + ts: ts, + width: 0, + height: 0, + origin: event + }; + } + var _this_target = _this.target, width = _this_target.width, height = _this_target.height; + if (lastTouch) { + var dt = ts - lastTouch.ts; + vx = (dx - lastTouch.dx) / dt || 0; + vy = (dy - lastTouch.dy) / dt || 0; + lastTouch = { + dx: dx, + dy: dy, + ts: ts + }; + } + return { + x: x, + y: y, + vx: vx, + vy: vy, + dx: dx, + dy: dy, + ts: ts, + width: width, + height: height, + origin: event + }; + }; + if (isSimulatorCellPhone()) { + getTouch = function(event) { + var touches = event.touches, changedTouches = event.changedTouches; + return touches[0] || changedTouches[0]; + }; + touchstart = "touchstart"; + touchmove = "touchmove"; + touchend = "touchend"; + } + var _obj; + this.nativeHandlers = (_obj = {}, _obj[touchstart] = function(event) { + if (_this.enabled) { + var touch = getTouch(event); + var cood = getCoord(touch); + x = cood.x; + y = cood.y; + lastTouch = currentTouch = { + clientX: touch.clientX, + clientY: touch.clientY, + ts: performance.now(), + x: x, + y: y + }; + _this.dispatchEvent(EVENT_TYPE_TOUCH_START, getTouchEventValue(event, x, y)); + } + }, _obj[touchmove] = function(event) { + if (currentTouch && _this.enabled) { + var cood = getCoord(getTouch(event)); + x = cood.x; + y = cood.y; + _this.dispatchEvent(EVENT_TYPE_TOUCH_MOVE, getTouchEventValue(event, x, y, x - currentTouch.x, y - currentTouch.y)); + } + }, _obj[touchend] = function(event) { + if (currentTouch && _this.enabled) { + if (!_this.allowPropagation && event.cancelable) { + event.preventDefault(); + event.stopPropagation(); + } + var touch = getTouch(event); + var cood = getCoord(touch); + var dt = Math.abs(currentTouch.clientX - touch.clientX) + Math.abs(currentTouch.clientY - touch.clientY); + x = cood.x; + y = cood.y; + if (dt < 4) { + _this.dispatchEvent(EVENT_TYPE_CLICK, getTouchEventValue(event, x, y)); + } + _this.dispatchEvent(EVENT_TYPE_TOUCH_END, getTouchEventValue(event, x, y, x - currentTouch.x, y - currentTouch.y)); + } + currentTouch = 0; + }, _obj); + Object.keys(this.nativeHandlers).forEach(function(name) { + var _this_target; + (_this_target = _this.target) == null ? void 0 : _this_target.addEventListener(String(name), _this.nativeHandlers[name]); + }); + }; + _proto.dispatchEvent = function dispatchEvent(type, event) { + var handlers = this.handlers[type]; + handlers == null ? void 0 : handlers.forEach(function(fn) { + return fn(event); + }); + }; + _proto.addEventListener = function addEventListener(type, callback) { + var handlers = this.handlers[type]; + if (!handlers) { + handlers = this.handlers[type] = []; + } + addItem(handlers, callback); + return function() { + removeItem(handlers, callback); + }; + }; + _proto.removeEventListener = function removeEventListener(type, callback) { + var handlers = this.handlers[type]; + if (handlers) { + removeItem(handlers, callback); + } + }; + _proto.dispose = function dispose() { + var _this = this; + if (this.target) { + this.handlers = {}; + Object.keys(this.nativeHandlers).forEach(function(name) { + var _this_target; + (_this_target = _this.target) == null ? void 0 : _this_target.removeEventListener(String(name), _this.nativeHandlers[name]); + }); + this.nativeHandlers = {}; + this.target = null; + } + }; + return EventSystem; +}(); +function getCoord(event) { + var ele = event.target; + var clientX = event.clientX, clientY = event.clientY; + var _ele_getBoundingClientRect = ele.getBoundingClientRect(), left = _ele_getBoundingClientRect.left, top = _ele_getBoundingClientRect.top, width = _ele_getBoundingClientRect.width, height = _ele_getBoundingClientRect.height; + var x = (clientX - left) / width * 2 - 1; + var y = 1 - (clientY - top) / height * 2; + return { + x: x, + y: y + }; +} + +var InteractLoader = /*#__PURE__*/ function(AbstractPlugin) { + _inherits(InteractLoader, AbstractPlugin); + function InteractLoader() { + return AbstractPlugin.apply(this, arguments); + } + return InteractLoader; +}(AbstractPlugin); + +var toHalf = function() { + var floatView = new Float32Array(1); + var int32View = new Int32Array(floatView.buffer); + /* This method is faster than the OpenEXR implementation (very often + * used, eg. in Ogre), with the additional benefit of rounding, inspired + * by James Tursa?s half-precision code. */ return function toHalf(val) { + floatView[0] = val; + var x = int32View[0]; + var bits = x >> 16 & 0x8000; /* Get the sign */ + var m = x >> 12 & 0x07ff; /* Keep one extra bit for rounding */ + var e = x >> 23 & 0xff; /* Using int is faster here */ + /* If zero, or denormal, or exponent underflows too much for a denormal + * half, return signed zero. */ if (e < 103) { + return bits; + } + /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */ if (e > 142) { + bits |= 0x7c00; + /* If exponent was 0xff and one mantissa bit was set, it means NaN, + * not Inf, so make sure we set one mantissa bit too. */ bits |= (e == 255 ? 0 : 1) && x & 0x007fffff; + return bits; + } + /* If exponent underflows but not too much, return a denormal */ if (e < 113) { + m |= 0x0800; + /* Extra rounding may overflow and set mantissa to 0 and exponent + * to 1, which is OK. */ bits |= (m >> 114 - e) + (m >> 113 - e & 1); + return bits; + } + bits |= e - 112 << 10 | m >> 1; + /* Extra rounding. An overflow will set mantissa to 0 and increment + * the exponent, which is OK. */ bits += m & 1; + return bits; + }; +}(); +var Float16ArrayWrapper = /*#__PURE__*/ function() { + function Float16ArrayWrapper(num) { + if (Number.isInteger(num)) { + this.data = new Uint16Array(num); + } else if (num && typeof num === "object" && Number.isInteger(num.length)) { + var data = this.data = new Uint16Array(num.length); + for(var i = 0; i < data.length; i++){ + data[i] = toHalf(num[i]); + } + } + } + var _proto = Float16ArrayWrapper.prototype; + _proto.set = function set(number, startIndex) { + for(var i = 0; i < number.length; i++){ + this.data[i + startIndex] = toHalf(number[i]); + } + }; + return Float16ArrayWrapper; +}(); + +function translatePoint(x, y) { + var origin = [ + -.5, + .5, + -.5, + -.5, + .5, + .5, + .5, + -.5 + ]; + for(var i = 0; i < 8; i += 2){ + origin[i] += x; + origin[i + 1] += y; + } + return origin; +} +var tempEuler$1 = new Euler(); +var tempMat4$1 = new Matrix4$1(); +function calculateTranslation(out, target, acc, time, duration, posData, velData) { + var ret = out; + var lifetime = time / duration; + var speedIntegrate = time; + var speedOverLifetime = target.speedOverLifetime; + if (speedOverLifetime) { + speedIntegrate = speedOverLifetime.getIntegrateValue(0, time, duration); + } + var d = target.gravityModifier ? target.gravityModifier.getIntegrateByTime(0, time) : 0; + ret.copyFrom(posData); + ret.addScaledVector(velData, speedIntegrate); + ret.addScaledVector(acc, d); + var linearVelocityOverLifetime = target.linearVelOverLifetime || {}; + var orbVelOverLifetime = target.orbitalVelOverLifetime || {}; + var map = [ + "x", + "y", + "z" + ]; + if (orbVelOverLifetime.enabled) { + var center = new Vector3(); + if (orbVelOverLifetime.center) { + center.setFromArray(orbVelOverLifetime.center); + } + var pos = ret.clone().subtract(center); + var asRotation = orbVelOverLifetime.asRotation; + var orbVel = map.map(function(pro) { + var value = orbVelOverLifetime[pro]; + if (value) { + return asRotation ? value.getValue(lifetime) : value.getIntegrateValue(0, time, duration); + } + return 0; + }); + tempEuler$1.setFromArray(orbVel).negate(); + tempMat4$1.setFromEuler(tempEuler$1); + var rot = tempMat4$1.transformPoint(pos); + ret.addVectors(center, rot); + } + if (linearVelocityOverLifetime.enabled) { + var asMovement = linearVelocityOverLifetime.asMovement; + var velocityXCurve = linearVelocityOverLifetime.x; + var velocityYCurve = linearVelocityOverLifetime.y; + var velocityZCurve = linearVelocityOverLifetime.z; + if (velocityXCurve) { + var curveValue = asMovement ? velocityXCurve.getValue(lifetime) : velocityXCurve.getIntegrateValue(0, time, duration); + ret.x = ret.x + curveValue; + } + if (velocityYCurve) { + var curveValue1 = asMovement ? velocityYCurve.getValue(lifetime) : velocityYCurve.getIntegrateValue(0, time, duration); + ret.y = ret.y + curveValue1; + } + if (velocityZCurve) { + var curveValue2 = asMovement ? velocityZCurve.getValue(lifetime) : velocityZCurve.getIntegrateValue(0, time, duration); + ret.z = ret.z + curveValue2; + } + } + return ret; +} + +function ensureVec3(num) { + return Array.isArray(num) ? [ + num[0], + num[1], + num[2] + ] : [ + 0, + 0, + 0 + ]; +} +function vecFill(out, number) { + for(var i = 0, len = out.length; i < len; i++){ + out[i] = number; + } + return out; +} +function vecMulCombine(out, a, b) { + if (a && b) { + for(var i = 0, len = a.length; i < len; i++){ + out[i] = a[i] * b[i]; + } + } else if (a) { + if (out !== a) { + for(var i1 = 0; i1 < a.length; i1++){ + out[i1] = a[i1]; + } + } + } else if (b) { + if (out !== b) { + for(var i2 = 0; i2 < b.length; i2++){ + out[i2] = b[i2]; + } + } + } + return out; +} +var _obj$7; +var particleOriginTranslateMap$1 = (_obj$7 = {}, _obj$7[ParticleOrigin.PARTICLE_ORIGIN_CENTER] = [ + 0, + 0 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_CENTER_BOTTOM] = [ + 0, + -0.5 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_CENTER_TOP] = [ + 0, + 0.5 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_LEFT_TOP] = [ + -0.5, + 0.5 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_LEFT_CENTER] = [ + -0.5, + 0 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_LEFT_BOTTOM] = [ + -0.5, + -0.5 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_CENTER] = [ + 0.5, + 0 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_BOTTOM] = [ + 0.5, + -0.5 +], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_TOP] = [ + 0.5, + 0.5 +], _obj$7); +function nearestPowerOfTwo(value) { + return Math.pow(2, Math.round(Math.log(value) / Math.LN2)); +} +function setRayFromCamera(x, y, camera) { + var origin = camera.position; + var direction = new Vector3(x, y, 0); + var dir = new Vector3(); + var mat = camera.getInverseViewProjectionMatrix(); + mat.projectPoint(direction, dir); + dir.subtract(origin); + return new Ray(origin, dir); +} +function trianglesFromRect(position, halfWidth, halfHeight) { + var x = position.x, y = position.y, z = position.z; + var p0 = new Vector3(x - halfWidth, y + halfHeight, z); + var p1 = new Vector3(x - halfWidth, y - halfHeight, z); + var p2 = new Vector3(x + halfWidth, y - halfHeight, z); + var p3 = new Vector3(x + halfWidth, y + halfHeight, z); + return [ + { + p0: p0, + p1: p1, + p2: p2 + }, + { + p0: p0.clone(), + p1: p2.clone(), + p2: p3 + } + ]; +} +function decimalEqual(a, b, epsilon) { + if (epsilon === void 0) epsilon = 0.000001; + return Math.abs(a - b) < epsilon; +} +function numberToFix(a, fixed) { + if (fixed === void 0) fixed = 2; + var base = Math.pow(10, fixed); + return Math.floor(a * base) / base; +} + +var keyframeInfo = { + pointIndexCache: { + xIndex: 0, + yIndex: 0 + }, + /** + * 根据不同关键帧类型,获取位于曲线上的点 + */ getPointInCurve: function getPointInCurve(keyframe) { + keyframe[0]; var data = keyframe[1]; + var _this_getPointIndexInCurve = this.getPointIndexInCurve(keyframe, this.pointIndexCache), xIndex = _this_getPointIndexInCurve.xIndex, yIndex = _this_getPointIndexInCurve.yIndex; + var time = data[xIndex]; + var value = data[yIndex]; + return new Vector2(time, value); + }, + /** + * 根据不同关键帧类型,获取位于曲线上的点的索引 + */ getPointIndexInCurve: function getPointIndexInCurve(keyframe, res) { + var type = keyframe[0], markType = keyframe[2]; + // 不同类型,存放的时间不同 + var index = type === BezierKeyframeType.LINE ? 0 : type === BezierKeyframeType.EASE_OUT ? 0 : type === BezierKeyframeType.EASE_IN ? 2 : type === BezierKeyframeType.EASE ? 2 : type === BezierKeyframeType.HOLD ? markType === BezierKeyframeType.EASE_IN ? 2 : 0 : 0; + if (res) { + res.xIndex = index; + res.yIndex = index + 1; + return res; + } else { + return { + xIndex: index, + yIndex: index + 1 + }; + } + }, + /** + * 关键帧左侧是否为缓动类型(否则为线段) + */ isLeftSideEase: function isLeftSideEase(keyframe) { + var keyframeType = keyframe[0]; keyframe[1]; var markType = keyframe[2]; + // 定格关键帧的左侧类型,需要借助markType判断 + if (keyframeType === BezierKeyframeType.HOLD && this.isKeyframeTypeLeftSideEase(markType)) { + return true; + } + return this.isKeyframeTypeLeftSideEase(keyframeType); + }, + /** + * 关键帧右侧是否为缓动类型(否则为线段) + */ isRightSideEase: function isRightSideEase(keyframe) { + var keyframeType = keyframe[0]; keyframe[1]; var markType = keyframe[2]; + // 定格关键帧的右侧类型,需要借助markType判断 + if (keyframeType === BezierKeyframeType.HOLD && this.isKeyframeTypeRightSideEase(markType)) { + return true; + } + return this.isKeyframeTypeRightSideEase(keyframeType); + }, + /** + * 关键帧左侧是否为缓动类型(否则为线段) + */ isKeyframeTypeLeftSideEase: function isKeyframeTypeLeftSideEase(keyframeType) { + return [ + BezierKeyframeType.EASE, + BezierKeyframeType.EASE_IN, + BezierKeyframeType.AUTO + ].includes(keyframeType); + }, + /** + * 关键帧右侧是否为缓动类型(否则为线段) + */ isKeyframeTypeRightSideEase: function isKeyframeTypeRightSideEase(keyframeType) { + return [ + BezierKeyframeType.EASE, + BezierKeyframeType.EASE_OUT, + BezierKeyframeType.AUTO + ].includes(keyframeType); + }, + /** + * 是否为定格进关键帧 + */ isHoldInKeyframe: function isHoldInKeyframe(keyframe) { + var keyframeType = keyframe[0]; keyframe[1]; var leftSubType = keyframe[2]; + return keyframeType === BezierKeyframeType.HOLD && [ + BezierKeyframeType.HOLD, + BezierKeyframeType.LINE_OUT, + BezierKeyframeType.EASE_OUT + ].includes(leftSubType); + }, + /** + * 是否为定格出关键帧 + */ isHoldOutKeyframe: function isHoldOutKeyframe(keyframe) { + var keyframeType = keyframe[0]; keyframe[1]; var leftSubType = keyframe[2]; + return keyframeType === BezierKeyframeType.HOLD && [ + BezierKeyframeType.HOLD, + BezierKeyframeType.LINE, + BezierKeyframeType.EASE_IN + ].includes(leftSubType); + } +}; + +var BezierLengthData = function BezierLengthData(points, totalLength) { + this.points = points; + this.totalLength = totalLength; +}; +var BezierMap = {}; +var BezierDataMap = {}; +var NEWTON_ITERATIONS = 4; +var NEWTON_MIN_SLOPE = 0.001; +var SUBDIVISION_PRECISION = 0.0000001; +var SUBDIVISION_MAX_ITERATIONS = 10; +var CURVE_SEGMENTS = 300; +var kSplineTableSize = 11; +var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); +function A(a1, a2) { + return 1.0 - 3.0 * a2 + 3.0 * a1; +} +function B(a1, a2) { + return 3.0 * a2 - 6.0 * a1; +} +function C(a1) { + return 3.0 * a1; +} +// A * t ^ 3 + B * t ^ 2 + C * t +// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. +function calcBezier(t, a1, a2) { + return ((A(a1, a2) * t + B(a1, a2)) * t + C(a1)) * t; +} +// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. +function getSlope(t, a1, a2) { + return 3.0 * A(a1, a2) * t * t + 2.0 * B(a1, a2) * t + C(a1); +} +function binarySubdivide(aX, aA, aB, mX1, mX2) { + var currentX, currentT, i = 0; + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + }while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); + return currentT; +} +function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) { + for(var i = 0; i < NEWTON_ITERATIONS; ++i){ + var currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope === 0.0) { + return aGuessT; + } + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; +} +// de Casteljau算法构建曲线 +/** + * @param p1 起始点 + * @param p2 终点 + * @param p3 起始控制点 + * @param p4 终止控制点 + * @returns + */ function buildBezierData(p1, p2, p3, p4) { + // 使用平移后的终点、控制点作为key + var s1 = numberToFix(p2.x - p1.x, 3) + "_" + numberToFix(p2.y - p1.y, 3) + "_" + numberToFix(p2.z - p1.z, 3); + var s2 = numberToFix(p3.x - p1.x, 3) + "_" + numberToFix(p3.y - p1.y, 3) + "_" + numberToFix(p3.z - p1.z, 3); + var s3 = numberToFix(p4.x - p1.x, 3) + "_" + numberToFix(p4.y - p1.y, 3) + "_" + numberToFix(p4.z - p1.z, 3); + var str = s1 + "&" + s2 + "&" + s3; + if (BezierDataMap[str]) { + return { + data: BezierDataMap[str], + interval: p1 + }; + } else { + var samples = []; + var lastPoint = null, addedLength = 0, ptDistance = 0; + var curveSegments = CURVE_SEGMENTS; + for(var k = 0; k < curveSegments; k += 1){ + var point = new Vector3(); + var perc = k / (curveSegments - 1); + ptDistance = 0; + point.x = 3 * Math.pow(1 - perc, 2) * perc * (p3.x - p1.x) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.x - p1.x) + Math.pow(perc, 3) * (p2.x - p1.x); + point.y = 3 * Math.pow(1 - perc, 2) * perc * (p3.y - p1.y) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.y - p1.y) + Math.pow(perc, 3) * (p2.y - p1.y); + point.z = 3 * Math.pow(1 - perc, 2) * perc * (p3.z - p1.z) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.z - p1.z) + Math.pow(perc, 3) * (p2.z - p1.z); + if (lastPoint !== null) { + ptDistance += Math.pow(point.x - lastPoint.x, 2); + ptDistance += Math.pow(point.y - lastPoint.y, 2); + ptDistance += Math.pow(point.z - lastPoint.z, 2); + } + lastPoint = point; + ptDistance = Math.sqrt(ptDistance); + addedLength += ptDistance; + samples[k] = { + partialLength: ptDistance, + point: point + }; + } + var data = new BezierLengthData(samples, addedLength); + BezierDataMap[str] = data; + return { + data: data, + interval: new Vector3(p1.x, p1.y, p1.z) + }; + } +} +var BezierPath = /*#__PURE__*/ function() { + function BezierPath(p1, p2, p3, p4) { + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + this.p4 = p4; + this.catching = { + lastPoint: 0, + lastAddedLength: 0 + }; + var _buildBezierData = buildBezierData(p1, p2, p3, p4), data = _buildBezierData.data, interval = _buildBezierData.interval; + this.lengthData = data; + this.interval = interval; + this.totalLength = data.totalLength; + } + var _proto = BezierPath.prototype; + /** + * 获取路径在指定比例长度上点的坐标 + * @param percent 路径长度的比例 + */ _proto.getPointInPercent = function getPointInPercent(percent) { + var bezierData = this.lengthData; + if (percent === 0) { + return bezierData.points[0].point.clone().add(this.interval); + } + if (decimalEqual(1 - percent, 0)) { + return bezierData.points[CURVE_SEGMENTS - 1].point.clone().add(this.interval); + } + if (decimalEqual(bezierData.totalLength, 0)) { + return this.p1.clone(); + } + var point = new Vector3(); + var segmentLength = numberToFix(bezierData.totalLength * percent, 4); + var addedLength = this.catching.lastAddedLength; + var j = this.catching.lastPoint; + if (decimalEqual(addedLength, segmentLength)) { + return bezierData.points[j].point.clone().add(this.interval); + } + var flag = true; + var dir = 1; + if (segmentLength < addedLength) { + dir = -1; + } + while(flag){ + if (segmentLength >= addedLength) { + if (j === CURVE_SEGMENTS - 1) { + point.x = bezierData.points[j].point.x; + point.y = bezierData.points[j].point.y; + point.z = bezierData.points[j].point.z; + break; + } + if (segmentLength < addedLength + bezierData.points[j + 1].partialLength) { + var segmentPerc = (segmentLength - addedLength) / bezierData.points[j + 1].partialLength; + point.x = bezierData.points[j].point.x + (bezierData.points[j + 1].point.x - bezierData.points[j].point.x) * segmentPerc; + point.y = bezierData.points[j].point.y + (bezierData.points[j + 1].point.y - bezierData.points[j].point.y) * segmentPerc; + point.z = bezierData.points[j].point.z + (bezierData.points[j + 1].point.z - bezierData.points[j].point.z) * segmentPerc; + break; + } + } + if (dir > 0 && j < CURVE_SEGMENTS - 1) { + j += dir; + addedLength += numberToFix(bezierData.points[j].partialLength, 5); + } else if (dir < 0 && j > 0) { + addedLength -= numberToFix(bezierData.points[j].partialLength, 5); + j += dir; + } else { + flag = false; + } + } + this.catching.lastPoint = j; + this.catching.lastAddedLength = addedLength; + point.add(this.interval); + return point; + }; + return BezierPath; +}(); +var BezierQuat = /*#__PURE__*/ function() { + function BezierQuat(p1, p2, p3, p4) { + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + this.p4 = p4; + this.temp = new Quaternion(); + this.totalLength = 0; + } + var _proto = BezierQuat.prototype; + /** + * 获取路径在指定比例长度上点的坐标 + * @param percent 路径长度的比例 + */ _proto.getPointInPercent = function getPointInPercent(percent) { + if (percent === 0) { + return this.temp.copyFrom(this.p1); + } + if (decimalEqual(1 - percent, 0)) { + return this.temp.copyFrom(this.p2); + } + QuaternionInner.slerpFlat(this.temp, this.p1, this.p2, percent); + return this.temp; + }; + return BezierQuat; +}(); +var BezierEasing = /*#__PURE__*/ function() { + function BezierEasing(mX1, mY1, mX2, mY2) { + this.mX1 = mX1; + this.mY1 = mY1; + this.mX2 = mX2; + this.mY2 = mY2; + this.precomputed = false; + this.mSampleValues = new Array(kSplineTableSize); + } + var _proto = BezierEasing.prototype; + _proto.precompute = function precompute() { + this.precomputed = true; + if (this.mX1 !== this.mY1 || this.mX2 !== this.mY2) { + this.calcSampleValues(); + } + }; + _proto.getValue = function getValue(x) { + if (this.mX1 === this.mY1 && this.mX2 === this.mY2) { + return x; + } + if (isNaN(this.mY1) || isNaN(this.mY2)) { + return 0; + } + if (x === 0 || x === 1) { + return x; + } + if (!this.precomputed) { + this.precompute(); + } + var value = calcBezier(this.getTForX(x), this.mY1, this.mY2); + return value; + }; + _proto.calcSampleValues = function calcSampleValues() { + for(var i = 0; i < kSplineTableSize; ++i){ + this.mSampleValues[i] = calcBezier(i * kSampleStepSize, this.mX1, this.mX2); + } + }; + _proto.getTForX = function getTForX(aX) { + var mSampleValues = this.mSampleValues, lastSample = kSplineTableSize - 1; + var intervalStart = 0, currentSample = 1; + for(; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample){ + intervalStart += kSampleStepSize; + } + --currentSample; + // Interpolate to provide an initial guess for t + var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]); + var guessForT = intervalStart + dist * kSampleStepSize; + var initialSlope = getSlope(guessForT, this.mX1, this.mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT, this.mX1, this.mX2); + } + if (initialSlope === 0.0) { + return guessForT; + } + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, this.mX1, this.mX2); + }; + return BezierEasing; +}(); +function buildEasingCurve(leftKeyframe, rightKeyframe) { + // 获取控制点和曲线类型 + var _getControlPoints = getControlPoints(leftKeyframe, rightKeyframe, true), p0 = _getControlPoints.p0, p1 = _getControlPoints.p1, p2 = _getControlPoints.p2, p3 = _getControlPoints.p3; + assertExist(p2); + assertExist(p3); + var timeInterval = p3.x - p0.x; + var valueInterval = p3.y - p0.y; + var y1, y2; + var x1 = numberToFix((p1.x - p0.x) / timeInterval, 5); + var x2 = numberToFix((p2.x - p0.x) / timeInterval, 5); + if (decimalEqual(valueInterval, 0)) { + y1 = y2 = NaN; + } else { + y1 = numberToFix((p1.y - p0.y) / valueInterval, 5); + y2 = numberToFix((p2.y - p0.y) / valueInterval, 5); + } + if (x1 < 0) { + console.error("Invalid bezier points, x1 < 0", p0, p1, p2, p3); + x1 = 0; + } + if (x2 < 0) { + console.error("Invalid bezier points, x2 < 0", p0, p1, p2, p3); + x2 = 0; + } + if (x1 > 1) { + console.error("Invalid bezier points, x1 >= 1", p0, p1, p2, p3); + x1 = 1; + } + if (x2 > 1) { + console.error("Invalid bezier points, x2 >= 1", p0, p1, p2, p3); + x2 = 1; + } + var str = ("bez_" + x1 + "_" + y1 + "_" + x2 + "_" + y2).replace(/\./g, "p"); + var bezEasing; + if (BezierMap[str]) { + bezEasing = BezierMap[str]; + } else { + bezEasing = new BezierEasing(x1, y1, x2, y2); + BezierMap[str] = bezEasing; + } + return { + points: [ + p0, + p1, + p2, + p3 + ], + timeInterval: timeInterval, + valueInterval: valueInterval, + curve: bezEasing + }; +} +/** + * 根据关键帧类型获取贝塞尔曲线上的关键点 + */ function getControlPoints(leftKeyframe, rightKeyframe, lineToBezier) { + var leftValue = leftKeyframe[1]; + var leftHoldLine = keyframeInfo.isHoldOutKeyframe(leftKeyframe); + var rightHoldLine = keyframeInfo.isHoldInKeyframe(rightKeyframe); + var leftEase = !rightHoldLine && keyframeInfo.isRightSideEase(leftKeyframe); + var rightEase = !leftHoldLine && keyframeInfo.isLeftSideEase(rightKeyframe); + // 1. 左边为ease,右边为line(补充右边的控制点,该点在曲线上的点的偏左边位置) + if (leftEase && !rightEase && !rightHoldLine) { + var p0 = new Vector2(leftValue[leftValue.length - 4], leftValue[leftValue.length - 3]); + var p1 = new Vector2(leftValue[leftValue.length - 2], leftValue[leftValue.length - 1]); + var rightPoint = keyframeInfo.getPointInCurve(rightKeyframe); + var p3 = new Vector2(rightPoint.x, rightPoint.y); + var p2 = new Vector2(p3.x - (p3.x - p0.x) / 10, p3.y); + return { + type: "ease", + p0: p0, + p1: p1, + p2: p2, + p3: p3 + }; + } + // 2. 左边为line,右边为ease(补充左边的控制点,该点在曲线上的点的偏右边位置) + if (!leftEase && rightEase && !leftHoldLine) { + var rightValue = rightKeyframe[1]; + var leftPoint = keyframeInfo.getPointInCurve(leftKeyframe); + var p01 = new Vector2(leftPoint.x, leftPoint.y); + var p21 = new Vector2(rightValue[0], rightValue[1]); + var p31 = new Vector2(rightValue[2], rightValue[3]); + var p11 = new Vector2(p01.x + (p31.x - p01.x) / 10, p01.y); + return { + type: "ease", + p0: p01, + p1: p11, + p2: p21, + p3: p31 + }; + } + // 3. 左边为ease,右边为ease + if (leftEase && rightEase) { + var rightValue1 = rightKeyframe[1]; + var p02 = new Vector2(leftValue[leftValue.length - 4], leftValue[leftValue.length - 3]); + var p12 = new Vector2(leftValue[leftValue.length - 2], leftValue[leftValue.length - 1]); + var p22 = new Vector2(rightValue1[0], rightValue1[1]); + var p32 = new Vector2(rightValue1[2], rightValue1[3]); + return { + type: "ease", + p0: p02, + p1: p12, + p2: p22, + p3: p32 + }; + } + // 4. 左边为line,右边为line + var p03 = keyframeInfo.getPointInCurve(leftKeyframe); + var p13 = keyframeInfo.getPointInCurve(rightKeyframe); + if (leftHoldLine) { + p13.y = p03.y; // 定格关键帧使用相同的点 + } else if (rightHoldLine) { + p03.y = p13.y; + } + if (lineToBezier) { + // 补上两个在直线上的控制点 + var p23 = new Vector2((p13.x - p03.x) / 3 + p03.x, (p13.y - p03.y) / 3 + p03.y); + var p33 = new Vector2((p13.x - p03.x) / 3 * 2 + p03.x, (p13.y - p03.y) / 3 * 2 + p03.y); + return { + type: "ease", + p0: p03, + p1: p23, + p2: p33, + p3: p13, + isHold: leftHoldLine || rightHoldLine, + leftHoldLine: leftHoldLine, + rightHoldLine: rightHoldLine + }; + } else { + return { + type: "line", + p0: p03, + p1: p13, + isHold: leftHoldLine || rightHoldLine, + leftHoldLine: leftHoldLine, + rightHoldLine: rightHoldLine + }; + } +} +var QuaternionInner = /*#__PURE__*/ function() { + function QuaternionInner() {} + QuaternionInner.slerpFlat = function slerpFlat(dst, src0, src1, t) { + // fuzz-free, array-based Quaternion SLERP operation + var x0 = src0.x; + var y0 = src0.y; + var z0 = src0.z; + var w0 = src0.w; + var x1 = src1.x; + var y1 = src1.y; + var z1 = src1.z; + var w1 = src1.w; + if (t === 0) { + dst.x = x0; + dst.y = y0; + dst.z = z0; + dst.w = w0; + return; + } + if (t === 1) { + dst.x = x1; + dst.y = y1; + dst.z = z1; + dst.w = w1; + return; + } + if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { + var s = 1 - t; + var cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1; + var dir = cos >= 0 ? 1 : -1; + var sqrSin = 1 - cos * cos; + // Skip the Slerp for tiny steps to avoid numeric problems: + if (sqrSin > Number.EPSILON) { + var sin = Math.sqrt(sqrSin); + var len = Math.atan2(sin, cos * dir); + s = Math.sin(s * len) / sin; + t = Math.sin(t * len) / sin; + } + var tDir = t * dir; + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + // Normalize in case we just did a lerp: + if (s === 1 - t) { + var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + } + } + dst.x = x0; + dst.y = y0; + dst.z = z0; + dst.w = w0; + }; + return QuaternionInner; +}(); + +var CURVE_PRO_TIME = 0; +var CURVE_PRO_VALUE = 1; +var CURVE_PRO_IN_TANGENT = 2; +var CURVE_PRO_OUT_TANGENT = 3; +var NOT_IMPLEMENT = "not_implement"; +var ValueGetter = /*#__PURE__*/ function() { + function ValueGetter(arg) { + this.onCreate(arg); + } + var _proto = ValueGetter.prototype; + _proto.onCreate = function onCreate(props) { + throw new Error(NOT_IMPLEMENT); + }; + _proto.getIntegrateValue = function getIntegrateValue(t0, t1, timeScale) { + throw new Error(NOT_IMPLEMENT); + }; + _proto.getIntegrateByTime = function getIntegrateByTime(t0, time) { + throw new Error(NOT_IMPLEMENT); + }; + _proto.getValue = function getValue(time) { + throw new Error(NOT_IMPLEMENT); + }; + _proto.getMaxTime = function getMaxTime() { + throw new Error(NOT_IMPLEMENT); + }; + _proto.toUniform = function toUniform(meta) { + throw new Error(NOT_IMPLEMENT); + }; + _proto.map = function map(func) { + throw new Error(NOT_IMPLEMENT); + }; + _proto.scaleXCoord = function scaleXCoord(scale) { + return this; + }; + _proto.toData = function toData() { + throw new Error(NOT_IMPLEMENT); + }; + ValueGetter.getAllData = function getAllData(meta, halfFloat) { + var ret = new (halfFloat ? Float16ArrayWrapper : Float32Array)(meta.index * 4); + for(var i = 0, cursor = 0, curves = meta.curves; i < curves.length; i++){ + var data = curves[i].toData(); + ret.set(data, cursor); + cursor += data.length; + } + return halfFloat ? ret.data : ret; + }; + return ValueGetter; +}(); +var StaticValue = /*#__PURE__*/ function(ValueGetter) { + _inherits(StaticValue, ValueGetter); + function StaticValue() { + return ValueGetter.apply(this, arguments); + } + var _proto = StaticValue.prototype; + _proto.onCreate = function onCreate(arg) { + this.value = arg; + }; + _proto.getIntegrateValue = function getIntegrateValue(t0, t1, ts) { + return this.value * (t1 - t0); + }; + _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) { + return 0.5 * this.value * (t1 * t1 - t0 * t0); + }; + _proto.getValue = function getValue(time) { + return this.value; + }; + _proto.toUniform = function toUniform() { + return new Float32Array([ + 0, + this.value, + 0, + 0 + ]); + }; + _proto.map = function map(func) { + var val = this.value; + this.value = func(val); + return this; + }; + _proto.getMaxTime = function getMaxTime() { + return 0; + }; + return StaticValue; +}(ValueGetter); +var RandomSetValue = /*#__PURE__*/ function(ValueGetter) { + _inherits(RandomSetValue, ValueGetter); + function RandomSetValue() { + return ValueGetter.apply(this, arguments); + } + var _proto = RandomSetValue.prototype; + _proto.onCreate = function onCreate(arg) { + this.items = arg; + }; + _proto.getValue = function getValue(t) { + var items = this.items; + return items[Math.floor(Math.random() * items.length)]; + }; + _proto.map = function map(func) { + this.items = this.items.map(func); + return this; + }; + return RandomSetValue; +}(ValueGetter); +var RandomValue = /*#__PURE__*/ function(ValueGetter) { + _inherits(RandomValue, ValueGetter); + function RandomValue() { + return ValueGetter.apply(this, arguments); + } + var _proto = RandomValue.prototype; + _proto.onCreate = function onCreate(props) { + this.min = props[0]; + this.max = props[1]; + }; + _proto.getValue = function getValue(time, seed) { + var randomSeed = seed != null ? seed : Math.random(); + return this.min + randomSeed * (this.max - this.min); + }; + _proto.getIntegrateValue = function getIntegrateValue(t0, t1, timeScale) { + var seed = timeScale != null ? timeScale : 1.0; + return (this.min + seed * (this.max - this.min)) * (t1 - t0); + }; + _proto.toUniform = function toUniform() { + return new Float32Array([ + 4, + this.min, + this.max, + 0 + ]); + }; + _proto.map = function map(func) { + this.min = func(this.min); + this.max = func(this.max); + return this; + }; + return RandomValue; +}(ValueGetter); +var RandomVectorValue = /*#__PURE__*/ function(ValueGetter) { + _inherits(RandomVectorValue, ValueGetter); + function RandomVectorValue() { + return ValueGetter.apply(this, arguments); + } + var _proto = RandomVectorValue.prototype; + _proto.onCreate = function onCreate(props) { + this.min = props[0]; + this.max = props[1]; + }; + _proto.getValue = function getValue(time) { + var min = this.min; + var max = this.max; + var ret = []; + for(var i = 0; i < min.length; i++){ + var t = Math.random(); + ret[i] = min[i] * (1 - t) + max[i] * t; + } + return ret; + }; + // TODO: + _proto.map = function map(func) { + this.min = this.min.map(func); + this.max = this.max.map(func); + return this; + }; + return RandomVectorValue; +}(ValueGetter); +var LinearValue = /*#__PURE__*/ function(ValueGetter) { + _inherits(LinearValue, ValueGetter); + function LinearValue() { + return ValueGetter.apply(this, arguments); + } + var _proto = LinearValue.prototype; + _proto.onCreate = function onCreate(props) { + this.min = props[0]; + this.max = props[1]; + this.xCoord = 1; + }; + _proto.getValue = function getValue(t) { + t /= this.xCoord; + return this.min * (1 - t) + this.max * t; + }; + _proto.toUniform = function toUniform() { + return new Float32Array([ + 1, + this.min, + this.max, + this.xCoord + ]); + }; + _proto.getIntegrateValue = function getIntegrateValue(t0, t1, timeScale) { + if (timeScale === void 0) timeScale = 1; + var min = this.min; + var max = this.max; + var ts = this.xCoord * timeScale; + var v1 = min + (max - min) * (t1 / ts); + var v0 = min + (max - min) * (t0 / ts); + return ((v1 + min) * t1 - (v0 + min) * t0) / 2; + }; + _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) { + return lineSegIntegrateByTime(t1, 0, this.xCoord, this.min, this.max) - lineSegIntegrateByTime(t0, 0, this.xCoord, this.min, this.max); + }; + _proto.map = function map(func) { + this.min = func(this.min); + this.max = func(this.max); + return this; + }; + _proto.scaleXCoord = function scaleXCoord(scale) { + this.xCoord = scale; + return this; + }; + return LinearValue; +}(ValueGetter); +var GradientValue = /*#__PURE__*/ function(ValueGetter) { + _inherits(GradientValue, ValueGetter); + function GradientValue() { + return ValueGetter.apply(this, arguments); + } + var _proto = GradientValue.prototype; + _proto.onCreate = function onCreate(props) { + this.stops = colorStopsFromGradient(props); + }; + _proto.getStops = function getStops() { + return this.stops; + }; + _proto.getValue = function getValue(time) { + var stops = this.stops; + var last = stops.length - 1; + for(var i = 0; i < last; i++){ + var a = stops[i]; + var b = stops[i + 1]; + if (a.stop <= time && b.stop > time) { + var t = (time - a.stop) / (b.stop - a.stop); + return interpolateColor(a.color, b.color, t, true); + } + } + return stops[last].color.slice(); + }; + return GradientValue; +}(ValueGetter); +var LineSegments = /*#__PURE__*/ function(ValueGetter) { + _inherits(LineSegments, ValueGetter); + function LineSegments() { + return ValueGetter.apply(this, arguments); + } + var _proto = LineSegments.prototype; + _proto.onCreate = function onCreate(props) { + this.keys = props.map(function(p) { + if (p.slice) { + return p.slice(0, 2); + } + return [ + p.time, + p.value + ]; + }).sort(function(a, b) { + return a[0] - b[0]; + }); + var last = this.keys[this.keys.length - 1]; + if (last[0] < 1) { + this.keys.push([ + 1, + last[1] + ]); + } + var first = this.keys[0]; + if (first[0] > 0) { + this.keys.unshift([ + 0, + first[1] + ]); + } + this.isLineSeg = true; + }; + _proto.getValue = function getValue(time) { + var keys = this.keys; + if (time < keys[0][0]) { + return keys[0][1]; + } + var end = keys.length - 1; + for(var i = 0; i < end; i++){ + var key = keys[i]; + var k2 = keys[i + 1]; + var x0 = key[0]; + var x1 = k2[0]; + if (time >= x0 && time <= x1) { + var p = (time - x0) / (x1 - x0); + var y0 = key[1]; + return y0 + p * (k2[1] - y0); + } + } + return keys[end][1]; + }; + _proto.getIntegrateValue = function getIntegrateValue(t0, t1, ts) { + if (ts === void 0) ts = 1; + return (this.integrate(t1, false) - this.integrate(t0, false)) * ts; + }; + _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) { + return this.integrate(t1, true) - this.integrate(t0, true); + }; + _proto.integrate = function integrate(time, byTime) { + var keys = this.keys; + if (time <= keys[0][0]) { + return 0; + } + var ret = 0; + var end = keys.length - 1; + var func = byTime ? lineSegIntegrateByTime : lineSegIntegrate; + for(var i = 0; i < end; i++){ + var k1 = keys[i]; + var k2 = keys[i + 1]; + var t0 = k1[0]; + var t1 = k2[0]; + if (time > t0 && time <= t1) { + return ret + func(time, t0, t1, k1[1], k2[1]); + } else { + ret += func(t1, t0, t1, k1[1], k2[1]); + } + } + return ret; + }; + _proto.toData = function toData() { + var keys = this.keys; + var data = new Float32Array(Math.ceil(keys.length / 2) * 4); + for(var i = 0, cursor = 0; i < keys.length; i++, cursor += 2){ + data.set(keys[i], cursor); + } + data.set(keys[keys.length - 1], data.length - 2); + return data; + }; + _proto.toUniform = function toUniform(meta) { + var index = meta.index; + var keys = this.keys; + var uniformCount = Math.ceil(keys.length / 2); + meta.lineSegCount += uniformCount; + meta.curves.push(this); + meta.index += uniformCount; + meta.max = Math.max(meta.max, uniformCount); + return new Float32Array([ + 3, + index, + uniformCount, + 0 + ]); + }; + _proto.map = function map(func) { + this.keys.forEach(function(k) { + return k[1] = func(k[1]); + }); + return this; + }; + _proto.scaleXCoord = function scaleXCoord(scale) { + this.keys.forEach(function(k) { + return k[0] = scale * k[0]; + }); + return this; + }; + return LineSegments; +}(ValueGetter); +var BezierCurve = /*#__PURE__*/ function(ValueGetter) { + _inherits(BezierCurve, ValueGetter); + function BezierCurve() { + return ValueGetter.apply(this, arguments); + } + var _proto = BezierCurve.prototype; + _proto.onCreate = function onCreate(props) { + var keyframes = props; + this.curveMap = {}; + this.keys = []; + for(var i = 0; i < keyframes.length - 1; i++){ + var leftKeyframe = keyframes[i]; + var rightKeyframe = keyframes[i + 1]; + var _buildEasingCurve = buildEasingCurve(leftKeyframe, rightKeyframe), points = _buildEasingCurve.points, curve = _buildEasingCurve.curve, timeInterval = _buildEasingCurve.timeInterval, valueInterval = _buildEasingCurve.valueInterval; + var s = points[0]; + var e = points[points.length - 1]; + this.keys.push([].concat(s.toArray(), points[1].toArray())); + this.keys.push([].concat(e.toArray(), points[2].toArray())); + this.curveMap[s.x + "&" + e.x] = { + points: points, + timeInterval: timeInterval, + valueInterval: valueInterval, + curve: curve, + timeStart: Number(s.x), + timeEnd: Number(e.x) + }; + } + this.startKeyframe = keyframes[0]; + this.endKeyframe = keyframes[keyframes.length - 1]; + this.keyTimeData = Object.keys(this.curveMap); + }; + _proto.getValue = function getValue(time) { + var result = 0; + var keyTimeData = this.keyTimeData; + var keyTimeStart = this.curveMap[keyTimeData[0]].timeStart; + var keyTimeEnd = this.curveMap[keyTimeData[keyTimeData.length - 1]].timeEnd; + if (time <= keyTimeStart) { + keyframeInfo.getPointIndexInCurve(this.startKeyframe, keyframeInfo.pointIndexCache); + return this.startKeyframe[1][keyframeInfo.pointIndexCache.yIndex]; + } + if (time >= keyTimeEnd) { + keyframeInfo.getPointIndexInCurve(this.endKeyframe, keyframeInfo.pointIndexCache); + return this.endKeyframe[1][keyframeInfo.pointIndexCache.yIndex]; + } + for(var i = 0; i < keyTimeData.length; i++){ + var xMin = this.curveMap[keyTimeData[i]].timeStart; + var xMax = this.curveMap[keyTimeData[i]].timeEnd; + // const [xMin, xMax] = keyTimeData[i].split('&'); + if (time >= Number(xMin) && time < Number(xMax)) { + result = this.getCurveValue(keyTimeData[i], time); + break; + } + } + return result; + }; + _proto.getIntegrateValue = function getIntegrateValue(t0, t1, ts) { + if (ts === void 0) ts = 1; + var time = (t1 - t0) / ts; + var result = 0; + var keyTimeData = Object.keys(this.curveMap); + var keyTimeStart = this.curveMap[keyTimeData[0]].timeStart; + if (time <= keyTimeStart) { + return 0; + } + for(var i = 0; i < keyTimeData.length; i++){ + var xMin = this.curveMap[keyTimeData[i]].timeStart; + var xMax = this.curveMap[keyTimeData[i]].timeEnd; + if (time >= Number(xMax)) { + result += ts * this.getCurveIntegrateValue(keyTimeData[i], Number(xMax)); + } + if (time >= Number(xMin) && time < Number(xMax)) { + result += ts * this.getCurveIntegrateValue(keyTimeData[i], time); + break; + } + } + return result; + }; + _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) { + return this.getIntegrateValue(0, t1) - this.getIntegrateValue(0, t0); + }; + // 速度变化曲线面板移除后下线 + _proto.getCurveIntegrateValue = function getCurveIntegrateValue(curveKey, time) { + var curveInfo = this.curveMap[curveKey]; + var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0]; + var timeInterval = curveInfo.timeInterval; + var valueInterval = curveInfo.valueInterval; + var segments = 20; + var total = 0; + var h = (time - p0.x) / segments; + for(var i = 0; i <= segments; i++){ + var t = i * h; + var normalizeTime = t / timeInterval; + var y = p0.y + valueInterval * curveInfo.curve.getValue(normalizeTime); + if (i === 0 || i === segments) { + total += y; + } else if (i % 2 === 1) { + total += 4 * y; + } else { + total += 2 * y; + } + } + total *= h / 3; + return total; + }; + _proto.getCurveValue = function getCurveValue(curveKey, time) { + var curveInfo = this.curveMap[curveKey]; + var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0]; + var timeInterval = curveInfo.timeInterval; + var valueInterval = curveInfo.valueInterval; + var normalizeTime = (time - p0.x) / timeInterval; + var value = curveInfo.curve.getValue(normalizeTime); + return p0.y + valueInterval * value; + }; + _proto.toUniform = function toUniform(meta) { + var index = meta.index; + var count = this.keys.length; + meta.curves.push(this); + meta.index = index + count; + // 兼容 WebGL1 + meta.max = Math.max(meta.max, count); + meta.curveCount += count; + return new Float32Array([ + 5, + index + 1 / count, + index, + count + ]); + }; + _proto.toData = function toData() { + var keys = this.keys; + var data = new Float32Array(keys.length * 4); + for(var i = 0, cursor = 0; i < keys.length; i++, cursor += 4){ + data.set(keys[i], cursor); + } + return data; + }; + _proto.getMaxTime = function getMaxTime() { + var keyTimeData = this.keyTimeData; + return this.curveMap[keyTimeData[keyTimeData.length - 1]].timeEnd; + }; + return BezierCurve; +}(ValueGetter); +var PathSegments = /*#__PURE__*/ function(ValueGetter) { + _inherits(PathSegments, ValueGetter); + function PathSegments() { + return ValueGetter.apply(this, arguments); + } + var _proto = PathSegments.prototype; + _proto.onCreate = function onCreate(props) { + this.keys = props[0]; + this.values = props[1]; + }; + _proto.getValue = function getValue(time) { + var keys = this.keys; + var values = this.values; + for(var i = 0; i < keys.length - 1; i++){ + var k0 = keys[i]; + var k1 = keys[i + 1]; + if (k0[0] <= time && k1[0] >= time) { + var dis = k1[1] - k0[1]; + var dt = void 0; + if (dis === 0) { + dt = (time - k0[0]) / (k1[0] - k0[0]); + } else { + var val = curveValueEvaluate(time, k0, k1); + dt = (val - k0[1]) / dis; + } + return this.calculateVec(i, dt); + } + } + if (time <= keys[0][0]) { + return values[0].slice(); + } + return values[values.length - 1].slice(); + }; + _proto.calculateVec = function calculateVec(i, dt) { + var vec0 = this.values[i]; + var vec1 = this.values[i + 1]; + var ret = [ + 0, + 0, + 0 + ]; + for(var j = 0; j < vec0.length; j++){ + ret[j] = vec0[j] * (1 - dt) + vec1[j] * dt; + } + return ret; + }; + return PathSegments; +}(ValueGetter); +var BezierCurvePath = /*#__PURE__*/ function(ValueGetter) { + _inherits(BezierCurvePath, ValueGetter); + function BezierCurvePath() { + return ValueGetter.apply(this, arguments); + } + var _proto = BezierCurvePath.prototype; + _proto.onCreate = function onCreate(props) { + var keyframes = props[0], points = props[1], controlPoints = props[2]; + this.curveSegments = {}; + if (!controlPoints.length) { + return; + } + for(var i = 0; i < keyframes.length - 1; i++){ + var leftKeyframe = keyframes[i]; + var rightKeyframe = keyframes[i + 1]; + var ps1 = new Vector3(points[i][0], points[i][1], points[i][2]), ps2 = new Vector3(points[i + 1][0], points[i + 1][1], points[i + 1][2]); + var cp1 = new Vector3(controlPoints[2 * i][0], controlPoints[2 * i][1], controlPoints[2 * i][2]), cp2 = new Vector3(controlPoints[2 * i + 1][0], controlPoints[2 * i + 1][1], controlPoints[2 * i + 1][2]); + var _buildEasingCurve = buildEasingCurve(leftKeyframe, rightKeyframe), ps = _buildEasingCurve.points, easingCurve = _buildEasingCurve.curve, timeInterval = _buildEasingCurve.timeInterval, valueInterval = _buildEasingCurve.valueInterval; + var s = ps[0]; + var e = ps[ps.length - 1]; + var pathCurve = new BezierPath(ps1, ps2, cp1, cp2); + this.curveSegments[s.x + "&" + e.x] = { + points: ps, + timeInterval: timeInterval, + valueInterval: valueInterval, + easingCurve: easingCurve, + pathCurve: pathCurve, + timeStart: Number(s.x), + timeEnd: Number(e.x) + }; + } + this.keyTimeData = Object.keys(this.curveSegments); + }; + _proto.getValue = function getValue(time) { + var t = numberToFix(time, 5); + var perc = 0, point = new Vector3(); + var keyTimeData = this.keyTimeData; + if (!keyTimeData.length) { + return point; + } + var keyTimeStart = this.curveSegments[keyTimeData[0]].timeStart; + var keyTimeEnd = this.curveSegments[keyTimeData[keyTimeData.length - 1]].timeEnd; + if (t <= keyTimeStart) { + var pathCurve = this.curveSegments[keyTimeData[0]].pathCurve; + point = pathCurve.getPointInPercent(0); + return point; + } + if (t >= keyTimeEnd) { + var pathCurve1 = this.curveSegments[keyTimeData[keyTimeData.length - 1]].pathCurve; + point = pathCurve1.getPointInPercent(1); + return point; + } + for(var i = 0; i < keyTimeData.length; i++){ + var xMin = this.curveSegments[keyTimeData[i]].timeStart; + var xMax = this.curveSegments[keyTimeData[i]].timeEnd; + if (t >= Number(xMin) && t < Number(xMax)) { + var bezierPath = this.curveSegments[keyTimeData[i]].pathCurve; + perc = this.getPercValue(keyTimeData[i], t); + point = bezierPath.getPointInPercent(perc); + } + } + return point; + }; + _proto.getPercValue = function getPercValue(curveKey, time) { + var curveInfo = this.curveSegments[curveKey]; + var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0]; + var timeInterval = curveInfo.timeInterval; + var normalizeTime = numberToFix((time - p0.x) / timeInterval, 4); + var value = curveInfo.easingCurve.getValue(normalizeTime); + // TODO 测试用 编辑器限制值域后移除clamp + return clamp$1(value, 0, 1); + }; + _proto.getMaxTime = function getMaxTime() { + var keyTimeData = this.keyTimeData; + return this.curveSegments[keyTimeData[keyTimeData.length - 1]].timeEnd; + }; + return BezierCurvePath; +}(ValueGetter); +var BezierCurveQuat = /*#__PURE__*/ function(ValueGetter) { + _inherits(BezierCurveQuat, ValueGetter); + function BezierCurveQuat() { + return ValueGetter.apply(this, arguments); + } + var _proto = BezierCurveQuat.prototype; + _proto.onCreate = function onCreate(props) { + var keyframes = props[0], points = props[1], controlPoints = props[2]; + this.curveSegments = {}; + if (!controlPoints.length) { + return; + } + for(var i = 0; i < keyframes.length - 1; i++){ + var leftKeyframe = keyframes[i]; + var rightKeyframe = keyframes[i + 1]; + var ps1 = Quaternion.fromArray(points[i]); + var ps2 = Quaternion.fromArray(points[i + 1]); + var cp1 = Quaternion.fromArray(controlPoints[2 * i]); + var cp2 = Quaternion.fromArray(controlPoints[2 * i + 1]); + var _buildEasingCurve = buildEasingCurve(leftKeyframe, rightKeyframe), ps = _buildEasingCurve.points, easingCurve = _buildEasingCurve.curve, timeInterval = _buildEasingCurve.timeInterval, valueInterval = _buildEasingCurve.valueInterval; + var s = ps[0]; + var e = ps[ps.length - 1]; + var pathCurve = new BezierQuat(ps1, ps2, cp1, cp2); + this.curveSegments[s.x + "&" + e.x] = { + points: ps, + timeInterval: timeInterval, + valueInterval: valueInterval, + easingCurve: easingCurve, + pathCurve: pathCurve + }; + } + }; + _proto.getValue = function getValue(time) { + var perc = 0; + var t = numberToFix(time, 5); + var keyTimeData = Object.keys(this.curveSegments); + var keyTimeStart = Number(keyTimeData[0].split("&")[0]); + var keyTimeEnd = Number(keyTimeData[keyTimeData.length - 1].split("&")[1]); + if (t <= keyTimeStart) { + var pathCurve = this.curveSegments[keyTimeData[0]].pathCurve; + return pathCurve.getPointInPercent(0); + } + if (t >= keyTimeEnd) { + var pathCurve1 = this.curveSegments[keyTimeData[keyTimeData.length - 1]].pathCurve; + return pathCurve1.getPointInPercent(1); + } + for(var i = 0; i < keyTimeData.length; i++){ + var _keyTimeData_i_split = keyTimeData[i].split("&"), xMin = _keyTimeData_i_split[0], xMax = _keyTimeData_i_split[1]; + if (t >= Number(xMin) && t < Number(xMax)) { + var pathCurve2 = this.curveSegments[keyTimeData[i]].pathCurve; + perc = this.getPercValue(keyTimeData[i], t); + return pathCurve2.getPointInPercent(perc); + } + } + var pathCurve3 = this.curveSegments[keyTimeData[0]].pathCurve; + return pathCurve3.getPointInPercent(0); + }; + _proto.getPercValue = function getPercValue(curveKey, time) { + var curveInfo = this.curveSegments[curveKey]; + var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0]; + var timeInterval = curveInfo.timeInterval; + var normalizeTime = numberToFix((time - p0.x) / timeInterval, 4); + var value = curveInfo.easingCurve.getValue(normalizeTime); + // TODO 测试用 编辑器限制值域后移除clamp + return clamp$1(value, 0, 1); + }; + _proto.getMaxTime = function getMaxTime() { + var keyTimeData = Object.keys(this.curveSegments); + return Number(keyTimeData[keyTimeData.length - 1].split("&")[1]); + }; + return BezierCurveQuat; +}(ValueGetter); +function lineSegIntegrate(t, t0, t1, y0, y1) { + var h = t - t0; + return (y0 + y0 + (y1 - y0) * h / (t1 - t0)) * h / 2; +} +function lineSegIntegrateByTime(t, t0, t1, y0, y1) { + var t2 = t * t; + var t3 = t2 * t; + var t02 = t0 * t0; + var t03 = t02 * t0; + return (2 * t3 * (y0 - y1) + 3 * t2 * (t0 * y1 - t1 * y0) - t03 * (2 * y0 + y1) + 3 * t02 * t1 * y0) / (6 * (t0 - t1)); +} +function curveValueEvaluate(time, keyframe0, keyframe1) { + var dt = keyframe1[CURVE_PRO_TIME] - keyframe0[CURVE_PRO_TIME]; + var m0 = keyframe0[CURVE_PRO_OUT_TANGENT] * dt; + var m1 = keyframe1[CURVE_PRO_IN_TANGENT] * dt; + var t = (time - keyframe0[CURVE_PRO_TIME]) / dt; + var t2 = t * t; + var t3 = t2 * t; + var a = 2 * t3 - 3 * t2 + 1; + var b = t3 - 2 * t2 + t; + var c = t3 - t2; + var d = -2 * t3 + 3 * t2; + //(2*v0+m0+m1-2*v1)*(t-t0)^3/k^3+(3*v1-3*v0-2*m0-m1)*(t-t0)^2/k^2+m0 *(t-t0)/k+v0 + return a * keyframe0[CURVE_PRO_VALUE] + b * m0 + c * m1 + d * keyframe1[CURVE_PRO_VALUE]; +} +function getKeyFrameMetaByRawValue(meta, value) { + if (value) { + var type = value[0]; + var keys = value[1]; + if (type === ValueType.CURVE) { + meta.curves.push(keys); + var keyLen = keys.length; + if (keys[0][0] > 0) { + keyLen++; + } + if (keys[keys.length - 1][0] < 1) { + keyLen++; + } + meta.index += keyLen; + meta.max = Math.max(meta.max, keyLen); + meta.curveCount += keyLen; + } else if (type === ValueType.LINE) { + var keyLen1 = keys.length; + if (keyLen1 === 2 && keys[0][0] === 0 && keys[1][0] === 1) { + return; + } + if (keys[0][0] > 0) { + keyLen1++; + } + if (keys[keys.length - 1][0] < 1) { + keyLen1++; + } + var uniformCount = Math.ceil(keyLen1 / 2); + meta.lineSegCount += uniformCount; + meta.curves.push(keys); + meta.index += uniformCount; + meta.max = Math.max(meta.max, uniformCount); + } else if (type === ValueType.BEZIER_CURVE) { + var keyLen2 = keys.length - 1; + meta.index += 2 * keyLen2; + meta.curves.push(keys); + meta.max = Math.max(meta.max, 2 * keyLen2); + meta.curveCount += 2 * keyLen2; + } + } +} +function createKeyFrameMeta() { + return { + curves: [], + index: 0, + max: 0, + lineSegCount: 0, + curveCount: 0 + }; +} + +function _is_native_reflect_construct() { + // Since Reflect.construct can't be properly polyfilled, some + // implementations (e.g. core-js@2) don't set the correct internal slots. + // Those polyfills don't allow us to subclass built-ins, so we need to + // use our fallback implementation. + try { + // If the internal slots aren't set, this throws an error similar to + // TypeError: this is not a Boolean object. + var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {})); + } catch (_) {} + return (_is_native_reflect_construct = function _is_native_reflect_construct() { + return !!result; + })(); +} + +function _construct(Parent, args, Class) { + if (_is_native_reflect_construct()) _construct = Reflect.construct; + else { + _construct = function construct(Parent, args, Class) { + var a = [ + null + ]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _set_prototype_of(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); +} + +var Vector4Curve = /*#__PURE__*/ function(ValueGetter) { + _inherits(Vector4Curve, ValueGetter); + function Vector4Curve() { + var _this; + _this = ValueGetter.apply(this, arguments) || this; + _this.value = new Vector4$1(); + return _this; + } + var _proto = Vector4Curve.prototype; + _proto.onCreate = function onCreate(arg) { + this.xCurve = createValueGetter(arg[0]); + this.yCurve = createValueGetter(arg[1]); + this.zCurve = createValueGetter(arg[2]); + this.wCurve = createValueGetter(arg[3]); + }; + _proto.getValue = function getValue(t) { + var x = this.xCurve.getValue(t); + var y = this.yCurve.getValue(t); + var z = this.zCurve.getValue(t); + var w = this.wCurve.getValue(t); + this.value.set(x, y, z, w); + return this.value; + }; + return Vector4Curve; +}(ValueGetter); +var Vector2Curve = /*#__PURE__*/ function(ValueGetter) { + _inherits(Vector2Curve, ValueGetter); + function Vector2Curve() { + var _this; + _this = ValueGetter.apply(this, arguments) || this; + _this.value = new Vector2(); + return _this; + } + var _proto = Vector2Curve.prototype; + _proto.onCreate = function onCreate(arg) { + this.xCurve = createValueGetter(arg[0]); + this.yCurve = createValueGetter(arg[1]); + }; + _proto.getValue = function getValue(t) { + var x = this.xCurve.getValue(t); + var y = this.yCurve.getValue(t); + this.value.set(x, y); + return this.value; + }; + return Vector2Curve; +}(ValueGetter); + +var _obj$6; +var map$1 = (_obj$6 = {}, _obj$6[ValueType.RANDOM] = function(props) { + if (_instanceof1(props[0], Array)) { + return new RandomVectorValue(props); + } + return new RandomValue(props); +}, _obj$6[ValueType.CONSTANT] = function(props) { + return new StaticValue(props); +}, _obj$6[ValueType.CONSTANT_VEC2] = function(props) { + return new StaticValue(props); +}, _obj$6[ValueType.CONSTANT_VEC3] = function(props) { + return new StaticValue(props); +}, _obj$6[ValueType.CONSTANT_VEC4] = function(props) { + return new StaticValue(props); +}, _obj$6[ValueType.RGBA_COLOR] = function(props) { + return new StaticValue(props); +}, _obj$6[ValueType.COLORS] = function(props) { + return new RandomSetValue(props.map(function(c) { + return colorToArr$1(c, false); + })); +}, _obj$6[ValueType.LINE] = function(props) { + if (props.length === 2 && props[0][0] === 0 && props[1][0] === 1) { + return new LinearValue([ + props[0][1], + props[1][1] + ]); + } + return new LineSegments(props); +}, _obj$6[ValueType.GRADIENT_COLOR] = function(props) { + return new GradientValue(props); +}, _obj$6[ValueType.LINEAR_PATH] = function(pros) { + return new PathSegments(pros); +}, _obj$6[ValueType.BEZIER_CURVE] = function(props) { + if (props.length === 1) { + return new StaticValue(props[0][1][1]); + } + return new BezierCurve(props); +}, _obj$6[ValueType.BEZIER_CURVE_PATH] = function(props) { + if (props[0].length === 1) { + return new StaticValue(_construct(Vector3, [].concat(props[1][0]))); + } + return new BezierCurvePath(props); +}, _obj$6[ValueType.BEZIER_CURVE_QUAT] = function(props) { + if (props[0].length === 1) { + return new StaticValue(_construct(Quaternion, [].concat(props[1][0]))); + } + return new BezierCurveQuat(props); +}, _obj$6[ValueType.COLOR_CURVE] = function(props) { + return new ColorCurve(props); +}, _obj$6[ValueType.VECTOR4_CURVE] = function(props) { + return new Vector4Curve(props); +}, _obj$6[ValueType.VECTOR2_CURVE] = function(props) { + return new Vector2Curve(props); +}, _obj$6); +function createValueGetter(args) { + if (!args || !isNaN(+args)) { + return new StaticValue(args || 0); + } + if (_instanceof1(args, ValueGetter)) { + return args; + } + if (isFunction(map$1[args[0]])) { + return map$1[args[0]](args[1]); + } else { + throw new Error("ValueType: " + args[0] + " is not supported, see " + HELP_LINK$1["ValueType: 21/22 is not supported"] + "."); + } +} + +var ColorCurve = /*#__PURE__*/ function(ValueGetter) { + _inherits(ColorCurve, ValueGetter); + function ColorCurve() { + var _this; + _this = ValueGetter.apply(this, arguments) || this; + _this.value = new Color(); + return _this; + } + var _proto = ColorCurve.prototype; + _proto.onCreate = function onCreate(arg) { + this.rCurve = createValueGetter(arg[0]); + this.gCurve = createValueGetter(arg[1]); + this.bCurve = createValueGetter(arg[2]); + this.aCurve = createValueGetter(arg[3]); + }; + _proto.getValue = function getValue(t) { + var r = this.rCurve.getValue(t); + var g = this.gCurve.getValue(t); + var b = this.bCurve.getValue(t); + var a = this.aCurve.getValue(t); + this.value.set(r, g, b, a); + return this.value; + }; + return ColorCurve; +}(ValueGetter); + +var vertex = "\nprecision highp float;\n\nattribute vec2 aPoint;\nuniform vec4 uPos;\nuniform vec2 uSize;\nuniform vec4 uQuat;\nuniform vec4 uColor;\nuniform mat4 effects_ObjectToWorld;\nuniform mat4 effects_MatrixInvV;\nuniform mat4 effects_MatrixVP;\nvarying vec4 vColor;\n#ifdef ENV_EDITOR\n uniform vec4 uEditorTransform;\n#endif\n\nvec3 rotateByQuat(vec3 a, vec4 quat){\n vec3 qvec = quat.xyz;\n vec3 uv = cross(qvec, a);\n vec3 uuv = cross(qvec, uv) * 2.;\n return a +(uv * 2. * quat.w + uuv);\n}\n\nvoid main() {\n vec4 _pos = uPos;\n vec3 point = rotateByQuat(vec3(aPoint.xy * uSize, 0.),uQuat);\n vec4 pos = vec4(_pos.xyz, 1.0);\n pos = effects_ObjectToWorld * pos;\n pos.xyz += effects_MatrixInvV[0].xyz * point.x+ effects_MatrixInvV[1].xyz * point.y;\n gl_Position = effects_MatrixVP * pos;\n vColor = uColor;\n #ifdef ENV_EDITOR\n gl_Position = vec4(gl_Position.xy * uEditorTransform.xy + uEditorTransform.zw * gl_Position.w, gl_Position.zw);\n #endif\n}\n"; +var fragment = "\nprecision highp float;\n\n#define fragColor gl_FragColor\n\nvarying vec4 vColor;\nvoid main() {\n gl_FragColor = vColor*vColor.a;\n}\n"; +var seed$8 = 1; +var InteractMesh = /*#__PURE__*/ function() { + function InteractMesh(props, rendererOptions, transform, engine) { + this.transform = transform; + this.engine = engine; + this.color = props.options.previewColor; + var material = this.createMaterial(rendererOptions); + var geometry = this.createGeometry(); + this.mesh = this.createMesh(geometry, material); + this.updateMesh(); + } + var _proto = InteractMesh.prototype; + _proto.updateMesh = function updateMesh() { + var material = this.mesh.material; + var uSize = material.getVector2("uSize").clone(); + var uPos = material.getVector4("uPos").clone(); + var tempPos = new Vector3(); + var tempQuat = new Quaternion(); + var tempScale = this.transform.scale.clone(); + this.transform.assignWorldTRS(tempPos, tempQuat, tempScale); + uSize.x = tempScale.x; + uSize.y = tempScale.y; + uPos.x = tempPos.x; + uPos.y = tempPos.y; + uPos.z = tempPos.z; + material.setVector2("uSize", uSize); + material.setVector4("uPos", uPos); + material.setQuaternion("uQuat", tempQuat); + }; + _proto.createMaterial = function createMaterial(rendererOptions) { + var _this_engine_renderer; + var macros = [ + [ + "ENV_EDITOR", + ((_this_engine_renderer = this.engine.renderer) == null ? void 0 : _this_engine_renderer.env) === PLAYER_OPTIONS_ENV_EDITOR + ] + ]; + var color = createValueGetter(this.color).getValue(0); + var materialProps = { + shader: { + vertex: vertex, + fragment: fragment, + glslVersion: exports.GLSLVersion.GLSL1, + cacheId: "" + rendererOptions.cachePrefix + "_effects_interact", + macros: macros + }, + uniformSemantics: { + effects_MatrixVP: "VIEWPROJECTION", + effects_MatrixInvV: "VIEWINVERSE", + effects_ObjectToWorld: "MODEL", + uEditorTransform: "EDITOR_TRANSFORM" + } + }; + var material = Material.create(this.engine, materialProps); + material.blending = true; + material.depthTest = false; + material.setVector4("uPos", new Vector4$1(0, 0, 0, 0)); + material.setVector2("uSize", new Vector2(1, 1)); + material.setVector4("uColor", new Vector4$1(color[0] / 255, color[1] / 255, color[2] / 255, color[3])); + material.setQuaternion("uQuat", new Quaternion(0, 0, 0, 0)); + return material; + }; + _proto.createGeometry = function createGeometry() { + var indexData = new Uint8Array([ + 0, + 1, + 1, + 2, + 2, + 3, + 3, + 0 + ]); + return Geometry.create(this.engine, { + attributes: { + aPoint: { + size: 2, + offset: 0, + stride: 2 * Float32Array.BYTES_PER_ELEMENT, + data: new Float32Array([ + -0.5, + 0.5, + 0.5, + 0.5, + 0.5, + -0.5, + -0.5, + -0.5 + ]) + } + }, + drawCount: indexData.length, + indices: { + data: indexData + }, + mode: glContext.LINES, + maxVertex: 4 + }); + }; + _proto.createMesh = function createMesh(geometry, material) { + return Mesh.create(this.engine, { + name: "Interact_preview" + seed$8++, + priority: 0, + worldMatrix: Matrix4$1.fromIdentity(), + geometry: geometry, + material: material + }); + }; + return InteractMesh; +}(); + +exports.InteractComponent = /*#__PURE__*/ function(RendererComponent) { + _inherits(InteractComponent, RendererComponent); + function InteractComponent() { + var _this; + _this = RendererComponent.apply(this, arguments) || this; + /** + * 拖拽的惯性衰减系数,范围[0, 1], 越大惯性越强 + */ _this.downgrade = 0.95; + /** + * 拖拽的距离映射系数,越大越容易拖动 + */ _this.dragRatio = [ + 1, + 1 + ]; + /** + * 拖拽X范围 + */ _this.dragRange = { + dxRange: [ + 0, + 0 + ], + dyRange: [ + 0, + 0 + ] + }; + _this.duringPlay = false; + /** 是否响应点击和拖拽交互事件 */ _this._interactive = true; + _this.lastTime = -1; + _this.getHitTestParams = function(force) { + if (!_this.clickable) { + return; + } + var behavior = _this.item.props.content.options.behavior; + var area = _this.getBoundingBox(); + if (area) { + return { + type: area.type, + triangles: area.area, + behavior: behavior + }; + } + }; + return _this; + } + var _proto = InteractComponent.prototype; + _proto.getDragRangeX = function getDragRangeX() { + return this.dragRange.dxRange; + }; + _proto.setDragRangeX = function setDragRangeX(min, max) { + this.dragRange.dxRange = [ + min, + max + ]; + }; + _proto.getDragRangeY = function getDragRangeY() { + return this.dragRange.dyRange; + }; + _proto.setDragRangeY = function setDragRangeY(min, max) { + this.dragRange.dyRange = [ + min, + max + ]; + }; + _proto.onStart = function onStart() { + var options = this.item.props.content.options; + var env = this.item.engine.renderer.env; + var composition = this.item.composition; + var _this_interactData_options = this.interactData.options, type = _this_interactData_options.type, showPreview = _this_interactData_options.showPreview; + if (type === InteractType.CLICK) { + this.clickable = true; + if (showPreview && env === PLAYER_OPTIONS_ENV_EDITOR) { + var rendererOptions = composition == null ? void 0 : composition.getRendererOptions(); + if (rendererOptions !== undefined) { + this.previewContent = new InteractMesh(this.item.props.content, rendererOptions, this.transform, this.engine); + } + } + } + if (options.type === InteractType.DRAG) { + if (env !== PLAYER_OPTIONS_ENV_EDITOR || options.enableInEditor) { + (composition == null ? void 0 : composition.event) && this.beginDragTarget(options, composition.event); + } + } + if (this.previewContent) { + this.previewContent.mesh.item = this.item; + this.materials = this.previewContent.mesh.materials; + } + this.item.getHitTestParams = this.getHitTestParams; + }; + _proto.onDisable = function onDisable() { + RendererComponent.prototype.onDisable.call(this); + if (this.item && this.item.composition) { + if (this.duringPlay && !this.item.transform.getValid()) { + this.item.composition.removeInteractiveItem(this.item, this.item.props.content.options.type); + this.duringPlay = false; + } + this.clickable = false; + this.endDragTarget(); + } + }; + _proto.onEnable = function onEnable() { + RendererComponent.prototype.onEnable.call(this); + var type = this.interactData.options.type; + var env = this.item.engine.renderer.env; + if (type === InteractType.CLICK) { + this.clickable = true; + } else if (type === InteractType.DRAG) { + var options = this.interactData.options; + var enableInEditor = options.enableInEditor; + if (env !== PLAYER_OPTIONS_ENV_EDITOR || enableInEditor) { + var _this_item_composition; + ((_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.event) && this.beginDragTarget(options, this.item.composition.event); + } + } + }; + _proto.onUpdate = function onUpdate(dt) { + var _this_previewContent; + this.duringPlay = true; + // trigger messageBegin when item enter + if (this.lastTime <= this.item.time) { + if (this.item.time >= 0 && this.lastTime < 0) { + var _this_item_composition; + var options = this.item.props.content.options; + (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.addInteractiveItem(this.item, options.type); + } + } else { + // loop trigger + if (this.item.time >= 0) { + var _this_item_composition1; + var options1 = this.item.props.content.options; + (_this_item_composition1 = this.item.composition) == null ? void 0 : _this_item_composition1.addInteractiveItem(this.item, options1.type); + } + } + this.lastTime = this.item.time; + (_this_previewContent = this.previewContent) == null ? void 0 : _this_previewContent.updateMesh(); + if (!this.dragEvent || !this.bouncingArg) { + return; + } + this.bouncingArg.vx *= this.downgrade; + this.bouncingArg.vy *= this.downgrade; + this.bouncingArg.dy += this.bouncingArg.vy; + this.bouncingArg.dx += this.bouncingArg.vx; + if (shouldIgnoreBouncing(this.bouncingArg)) { + this.dragEvent = null; + this.bouncingArg = null; + } else { + this.handleDragMove(this.dragEvent, this.bouncingArg); + } + }; + _proto.render = function render(renderer) { + if (this.previewContent) { + this.previewContent.mesh.render(renderer); + } + }; + _proto.onDestroy = function onDestroy() { + var _this_previewContent; + (_this_previewContent = this.previewContent) == null ? void 0 : _this_previewContent.mesh.dispose(); + }; + _proto.endDragTarget = function endDragTarget() { + // OVERRIDE + }; + _proto.handleDragMove = function handleDragMove(evt, event) { + if (!(evt == null ? void 0 : evt.cameraParam) || !this.canInteract() || !this.item.composition) { + return; + } + var _evt_cameraParam = evt.cameraParam, position = _evt_cameraParam.position, fov = _evt_cameraParam.fov; + var dy = event.dy; + var dx = event.dx * event.width / event.height; + var depth = position[2]; + var sp = Math.tan(fov * Math.PI / 180 / 2) * Math.abs(depth); + var height = dy * sp; + var width = dx * sp; + var _this_dragRange = this.dragRange, dxRange = _this_dragRange.dxRange, dyRange = _this_dragRange.dyRange; + var nx = position[0] - this.dragRatio[0] * width; + var ny = position[1] - this.dragRatio[1] * height; + var xMin = dxRange[0], xMax = dxRange[1]; + var yMin = dyRange[0], yMax = dyRange[1]; + nx = clamp$1(nx, xMin, xMax); + ny = clamp$1(ny, yMin, yMax); + if (nx !== xMin && nx !== xMax && xMin !== xMax) { + var _event_origin; + (_event_origin = event.origin) == null ? void 0 : _event_origin.preventDefault(); + } + if (ny !== yMin && ny !== yMax && yMin !== yMax) { + var _event_origin1; + (_event_origin1 = event.origin) == null ? void 0 : _event_origin1.preventDefault(); + } + this.item.composition.camera.position = new Vector3(nx, ny, depth); + }; + _proto.beginDragTarget = function beginDragTarget(options, eventSystem) { + var _this = this; + if (options.target !== "camera") { + return; + } + var dragEvent; + var handlerMap = { + touchstart: function(event) { + var _this_item_composition; + if (!_this.canInteract()) { + return; + } + _this.dragEvent = null; + _this.bouncingArg = null; + var camera = (_this_item_composition = _this.item.composition) == null ? void 0 : _this_item_composition.camera; + dragEvent = { + x: event.x, + y: event.y, + cameraParam: { + position: (camera == null ? void 0 : camera.position.toArray()) || [ + 0, + 0, + 8 + ], + fov: (camera == null ? void 0 : camera.fov) || 60 + } + }; + }, + touchmove: function(event) { + _this.handleDragMove(dragEvent, event); + _this.bouncingArg = event; + }, + touchend: function(event) { + if (!_this.canInteract()) { + return; + } + var bouncingArg = _this.bouncingArg; + if (!shouldIgnoreBouncing(bouncingArg, 3) && bouncingArg) { + var speed = 5; + bouncingArg.vx *= speed; + bouncingArg.vy *= speed; + _this.dragEvent = _extends({}, dragEvent); + } + dragEvent = null; + } + }; + Object.keys(handlerMap).forEach(function(name) { + eventSystem.addEventListener(name, handlerMap[name]); + }); + handlerMap.touchmove({ + dx: 0, + dy: 0, + width: 1, + height: 1 + }); + this.item.getComponent(InteractComponent).endDragTarget = function() { + Object.keys(handlerMap).forEach(function(name) { + eventSystem.removeEventListener(name, handlerMap[name]); + }); + }; + }; + _proto.getBoundingBox = function getBoundingBox() { + var worldMatrix = this.transform.getWorldMatrix(); + var triangles = trianglesFromRect(Vector3.ZERO, 0.5 * this.transform.size.x, 0.5 * this.transform.size.y); + triangles.forEach(function(triangle) { + worldMatrix.transformPoint(triangle.p0); + worldMatrix.transformPoint(triangle.p1); + worldMatrix.transformPoint(triangle.p2); + }); + return { + type: exports.HitTestType.triangle, + area: triangles + }; + }; + _proto.fromData = function fromData(data) { + RendererComponent.prototype.fromData.call(this, data); + this.interactData = data; + if (data.options.type === InteractType.DRAG) { + var options = data.options; + if (options.dxRange) { + this.dragRange.dxRange = options.dxRange; + } + if (options.dyRange) { + this.dragRange.dyRange = options.dyRange; + } + } + }; + _proto.canInteract = function canInteract() { + var _this_item_composition; + return Boolean((_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.interactive) && this._interactive; + }; + _create_class(InteractComponent, [ + { + key: "interactive", + get: function get() { + return this._interactive; + }, + set: function set(enable) { + this._interactive = enable; + if (!enable) { + // 立刻停止惯性滑动 + this.bouncingArg = null; + } + } + } + ]); + return InteractComponent; +}(RendererComponent); +exports.InteractComponent = __decorate([ + effectsClass(DataType.InteractComponent) +], exports.InteractComponent); +function shouldIgnoreBouncing(arg, mul) { + var threshold = 0.00001 * (mul || 1); + return arg && Math.abs(arg.vx || 0) < threshold && Math.abs(arg.vy || 0) < threshold; +} + +/** + * + */ var MeshCollider = /*#__PURE__*/ function() { + function MeshCollider() { + this.triangles = []; + this.worldMatrix = new Matrix4$1(); + this.assemblyTriangles = function(vertices, indices, indexStart, indexEnd, res) { + for(var i = indexStart; i < indexEnd; i += 3){ + var index0 = indices[i] * 3; + var index1 = indices[i + 1] * 3; + var index2 = indices[i + 2] * 3; + var p0 = { + x: vertices[index0], + y: vertices[index0 + 1], + z: vertices[index0 + 2] + }; + var p1 = { + x: vertices[index1], + y: vertices[index1 + 1], + z: vertices[index1 + 2] + }; + var p2 = { + x: vertices[index2], + y: vertices[index2 + 1], + z: vertices[index2 + 2] + }; + res.push({ + p0: p0, + p1: p1, + p2: p2 + }); + } + }; + } + var _proto = MeshCollider.prototype; + _proto.getBoundingBoxData = function getBoundingBoxData() { + this.applyWorldMatrix(this.boundingBoxData.area); + return this.boundingBoxData; + }; + _proto.getBoundingBox = function getBoundingBox() { + var maxX = -Number.MAX_VALUE; + var maxY = -Number.MAX_VALUE; + var minX = Number.MAX_VALUE; + var minY = Number.MAX_VALUE; + for(var _iterator = _create_for_of_iterator_helper_loose(this.boundingBoxData.area), _step; !(_step = _iterator()).done;){ + var triangle = _step.value; + maxX = Math.max(triangle.p0.x, triangle.p1.x, triangle.p2.x, maxX); + maxY = Math.max(triangle.p0.y, triangle.p1.y, triangle.p2.y, maxY); + minX = Math.min(triangle.p0.x, triangle.p1.x, triangle.p2.x, minX); + minY = Math.min(triangle.p0.y, triangle.p1.y, triangle.p2.y, minY); + } + var area = []; + var point0 = new Vector3(minX, maxY, 0); + var point1 = new Vector3(maxX, maxY, 0); + var point2 = new Vector3(maxX, minY, 0); + var point3 = new Vector3(minX, minY, 0); + area.push({ + p0: point0, + p1: point1, + p2: point2 + }); + area.push({ + p0: point0, + p1: point2, + p2: point3 + }); + this.applyWorldMatrix(area); + return { + type: exports.HitTestType.triangle, + area: area + }; + }; + _proto.setGeometry = function setGeometry(geometry, worldMatrix) { + this.triangles = this.geometryToTriangles(geometry); + var area = []; + for(var _iterator = _create_for_of_iterator_helper_loose(this.triangles), _step; !(_step = _iterator()).done;){ + var triangle = _step.value; + area.push({ + p0: triangle.p0, + p1: triangle.p1, + p2: triangle.p2 + }); + } + if (worldMatrix) { + this.worldMatrix.copyFrom(worldMatrix); + } + this.boundingBoxData = { + type: exports.HitTestType.triangle, + area: area + }; + }; + _proto.geometryToTriangles = function geometryToTriangles(geometry) { + var indices = geometry.getIndexData(); + var vertices = geometry.getAttributeData("aPos"); + var res = []; + if (!indices || !vertices) { + return res; + } + if (geometry.subMeshes.length === 0) { + this.assemblyTriangles(vertices, indices, 0, indices.length, res); + } else { + for(var _iterator = _create_for_of_iterator_helper_loose(geometry.subMeshes), _step; !(_step = _iterator()).done;){ + var subMesh = _step.value; + if (subMesh.indexCount === undefined) { + continue; + } + var elementSize = indices.BYTES_PER_ELEMENT; + var start = subMesh.offset / elementSize; + var end = start + subMesh.indexCount; + this.assemblyTriangles(vertices, indices, start, end, res); + } + } + return res; + }; + _proto.applyWorldMatrix = function applyWorldMatrix(area) { + var _this = this; + area.forEach(function(triangle) { + triangle.p0 = _this.worldMatrix.transformPoint(triangle.p0, new Vector3()); + triangle.p1 = _this.worldMatrix.transformPoint(triangle.p1, new Vector3()); + triangle.p2 = _this.worldMatrix.transformPoint(triangle.p2, new Vector3()); + }); + return area; + }; + return MeshCollider; +}(); + +var SpriteLoader = /*#__PURE__*/ function(AbstractPlugin) { + _inherits(SpriteLoader, AbstractPlugin); + function SpriteLoader() { + var _this; + _this = AbstractPlugin.apply(this, arguments) || this; + _this.name = "sprite"; + return _this; + } + return SpriteLoader; +}(AbstractPlugin); + +/** + * 动画图,负责更新所有的动画节点 + * @since 2.0.0 + */ var PlayableGraph = /*#__PURE__*/ function() { + function PlayableGraph() { + this.playableOutputs = []; + this.playables = []; + } + var _proto = PlayableGraph.prototype; + _proto.evaluate = function evaluate(dt) { + // 初始化输出节点状态 + for(var _iterator = _create_for_of_iterator_helper_loose(this.playableOutputs), _step; !(_step = _iterator()).done;){ + var playableOutput = _step.value; + playableOutput.context.deltaTime = dt; + } + // 执行生命周期函数 + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.playableOutputs), _step1; !(_step1 = _iterator1()).done;){ + var playableOutput1 = _step1.value; + this.prepareFrameWithRoot(playableOutput1); + } + for(var _iterator2 = _create_for_of_iterator_helper_loose(this.playableOutputs), _step2; !(_step2 = _iterator2()).done;){ + var playableOutput2 = _step2.value; + this.processFrameWithRoot(playableOutput2); + } + // 更新节点时间 + // for (const playable of this.playables) { + // this.updatePlayableTime(playable, dt / 1000); + // } + }; + _proto.addOutput = function addOutput(output) { + this.playableOutputs.push(output); + }; + _proto.addPlayable = function addPlayable(playable) { + this.playables.push(playable); + }; + _proto.processFrameWithRoot = function processFrameWithRoot(output) { + output.sourcePlayable.processFrame(output.context); + output.processFrame(); + }; + _proto.prepareFrameWithRoot = function prepareFrameWithRoot(output) { + output.prepareFrame(); + output.sourcePlayable.prepareFrame(output.context); + }; + _proto.updatePlayableTime = function updatePlayableTime(playable, deltaTime) { + if (playable.getPlayState() !== 0) { + return; + } + playable.setTime(playable.getTime() + deltaTime); + }; + return PlayableGraph; +}(); +/** + * 动画图可播放节点对象 + * @since 2.0.0 + */ var Playable = /*#__PURE__*/ function() { + function Playable(graph, inputCount) { + this.onPlayablePlayFlag = true; + this.onPlayablePauseFlag = false; + this.duration = 0; + this.destroyed = false; + this.playState = 0; + /** + * 当前本地播放的时间 + */ this.time = 0; + graph.addPlayable(this); + } + var _proto = Playable.prototype; + _proto.play = function play() { + switch(this.playState){ + case 0: + break; + case 1: + this.playState = 0; + this.onPlayablePlayFlag = true; + this.onPlayablePauseFlag = false; + break; + } + }; + _proto.pause = function pause() { + switch(this.playState){ + case 0: + this.playState = 1; + this.onPlayablePauseFlag = true; + this.onPlayablePlayFlag = false; + break; + } + }; + _proto.setTime = function setTime(time) { + this.time = time; + }; + _proto.getTime = function getTime() { + return this.time; + }; + _proto.setDuration = function setDuration(duration) { + this.duration = duration; + }; + _proto.getDuration = function getDuration() { + return this.duration; + }; + _proto.getPlayState = function getPlayState() { + return this.playState; + }; + // onGraphStart () { + // } + // onGraphStop () { + // } + // onPlayablePlay (context: FrameContext) { + // } + // onPlayablePause (context: FrameContext) { + // } + _proto.prepareFrame = function prepareFrame(context) {}; + _proto.processFrame = function processFrame(context) {}; + _proto.onPlayableDestroy = function onPlayableDestroy() {}; + _proto.dispose = function dispose() { + if (this.destroyed) { + return; + } + this.onPlayableDestroy(); + // TODO 将节点从动画图中移除 + this.destroyed = true; + }; + return Playable; +}(); +/** + * 动画图输出节点对象,将动画数据采样到绑定的元素属性上 + * @since 2.0.0 + */ var PlayableOutput = /*#__PURE__*/ function() { + function PlayableOutput() { + this.context = { + deltaTime: 0, + output: this + }; + } + var _proto = PlayableOutput.prototype; + _proto.setSourcePlayable = function setSourcePlayable(playable) { + this.sourcePlayable = playable; + }; + _proto.setUserData = function setUserData(value) { + this.userData = value; + }; + _proto.getUserData = function getUserData() { + return this.userData; + }; + // onGraphStart () { + // } + _proto.prepareFrame = function prepareFrame() {}; + _proto.processFrame = function processFrame() {}; + return PlayableOutput; +}(); +var PlayableAsset = /*#__PURE__*/ function(EffectsObject) { + _inherits(PlayableAsset, EffectsObject); + function PlayableAsset() { + return EffectsObject.apply(this, arguments); + } + return PlayableAsset; +}(EffectsObject); +var PlayState; +(function(PlayState) { + PlayState[PlayState["Playing"] = 0] = "Playing"; + PlayState[PlayState["Paused"] = 1] = "Paused"; +})(PlayState || (PlayState = {})); + +function _assert_this_initialized(self) { + if (self === void 0) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return self; +} + +var tempQuat$1 = new Quaternion(); +var seed$7 = 1; +// TODO 继承 Component +/** + * + */ var Transform = /*#__PURE__*/ function() { + function Transform(props, parent) { + if (props === void 0) props = {}; + this.taggedProperties = {}; + /** + * 自身位移 + */ this.position = new Vector3(0, 0, 0); + /** + * 自身旋转对应的四元数,右手坐标系,旋转正方向左手螺旋(轴向的顺时针),旋转欧拉角的顺序为 ZYX + */ this.quat = new Quaternion(0, 0, 0, 1); + /** + * 自身旋转角度 + */ this.rotation = new Euler(0, 0, 0); + /** + * 自身缩放 + */ this.scale = new Vector3(1, 1, 1); + /** + * 自身锚点 + */ this.anchor = new Vector3(0, 0, 0); + /** + * 元素矩形宽高 + */ this.size = new Vector2(1, 1); + /** + * 子变换,可以有多个 + */ this.children = []; + /** + * 包含父变换的最终模型矩阵 + */ this.worldMatrix = Matrix4$1.fromIdentity(); + /** + * 仅包含自身变换的模型矩阵 + */ this.localMatrix = Matrix4$1.fromIdentity(); + /** + * 变换是否需要生效,不生效返回的模型矩阵为单位矩阵,需要随元素生命周期改变 + */ this.valid = true; + /** + * 数据变化标志位 + */ this.dirtyFlags = { + /* 自身变换是否有修改,若修改,localMatrix 需要更新 */ localData: false, + /* localMatrix 是否有修改,若修改,WorldMatrix 需要更新 */ localMatrix: false, + /* worldMatrix 是否有修改,若修改,worldTRS 需要更新 */ worldMatrix: false, + /* parentMatrix 是否有修改,若修改,WorldMatrix需要更新 */ parentMatrix: false + }; + /** + * 最终模型矩阵对应变换的缓存,当自身矩阵或父矩阵有修改时需要更新 + */ this.worldTRSCache = { + position: new Vector3(0, 0, 0), + quat: new Quaternion(0, 0, 0, 1), + scale: new Vector3(1, 1, 1) + }; + this.name = "transform_" + seed$7++; + if (props) { + this.setTransform(props); + } + if (parent) { + this.parentTransform = parent; + } + if (props.valid !== undefined) { + this.setValid(props.valid); + } + } + var _proto = Transform.prototype; + // /** + // * 自身数据修改 / 父变换修改 / 父变换的数据修改 + // * @returns + // */ + // get traceDirty (): boolean { + // if (this.dirty || this.parentDirty) { + // return true; + // } + // + // return !!(this.parent && this.parent.traceDirty); + // } + /** + * 设置位置 + * @param x + * @param y + * @param z + */ _proto.setPosition = function setPosition(x, y, z) { + if (this.position.x !== x || this.position.y !== y || this.position.z !== z) { + this.position.x = x; + this.position.y = y; + this.position.z = z; + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + /** + * 在当前位置的基础上添加位置偏移 + * @param x + * @param y + * @param z + */ _proto.translate = function translate(x, y, z) { + if (x !== 0 || y !== 0 || z !== 0) { + this.position.x += x; + this.position.y += y; + this.position.z += z; + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + /** + * 设置旋转 + * @param x + * @param y + * @param z + */ _proto.setRotation = function setRotation(x, y, z) { + if (this.rotation.x !== x || this.rotation.y !== y || this.rotation.z !== z) { + this.rotation.x = x; + this.rotation.y = y; + this.rotation.z = z; + this.quat.setFromEuler(this.rotation); + // TODO 修正 GE 四元数旋转共轭问题 + this.quat.conjugate(); + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + /** + * 设置四元数 + * @param x + * @param y + * @param z + * @param w + * @private + */ _proto.setQuaternion = function setQuaternion(x, y, z, w) { + if (this.quat.x !== x || this.quat.y !== y || this.quat.z !== z || this.quat.w !== w) { + this.quat.x = x; + this.quat.y = y; + this.quat.z = z; + this.quat.w = w; + this.rotation.setFromQuaternion(this.quat); + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + /** + * 设置缩放 + * @param x + * @param y + * @param z + */ _proto.setScale = function setScale(x, y, z) { + if (this.scale.x !== x || this.scale.y !== y || this.scale.z !== z) { + this.scale.x = x; + this.scale.y = y; + this.scale.z = z; + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + _proto.setSize = function setSize(x, y) { + if (this.size.x !== x || this.size.y !== y) { + this.size.x = x; + this.size.y = y; + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + /** + * 在当前旋转的基础上使用四元素添加旋转 + * @param quat + */ _proto.rotateByQuat = function rotateByQuat(quat) { + this.quat.multiply(quat); + this.rotation.setFromQuaternion(this.quat); + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + }; + /** + * 在当前缩放基础上设置缩放系数 + * @param x + * @param y + * @param z + */ _proto.scaleBy = function scaleBy(x, y, z) { + this.scale.x *= x; + this.scale.y *= y; + this.scale.z *= z; + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + }; + /** + * 设置锚点 + * @param x + * @param y + */ _proto.setAnchor = function setAnchor(x, y) { + if (this.anchor.x !== x || this.anchor.y !== y) { + this.anchor.x = x; + this.anchor.y = y; + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + } + }; + /** + * 批量设置 transform 属性 + * @param props - 要设置的属性 + * @param reverseEuler - 设置 rotation时,欧拉角是否需要取负值 + */ _proto.setTransform = function setTransform(props, reverseEuler) { + var position = props.position, rotation = props.rotation, scale = props.scale, size = props.size, quat = props.quat, name = props.name, anchor = props.anchor; + if (name) { + this.name = name; + } + if (position) { + if (_instanceof1(position, Vector3)) { + this.setPosition(position.x, position.y, position.z); + } else { + this.setPosition(position[0], position[1], position[2]); + } + } + if (quat) { + if (_instanceof1(quat, Quaternion)) { + this.setQuaternion(quat.x, quat.y, quat.z, quat.w); + } else { + this.setQuaternion(quat[0], quat[1], quat[2], quat[3]); + } + } else if (rotation) { + var mul = reverseEuler ? -1 : 1; + if (_instanceof1(rotation, Euler)) { + this.setRotation(rotation.x * mul, rotation.y * mul, rotation.z * mul); + } else { + this.setRotation(rotation[0] * mul, rotation[1] * mul, rotation[2] * mul); + } + } + if (scale) { + if (_instanceof1(scale, Vector3)) { + this.setScale(scale.x, scale.y, scale.z); + } else { + this.setScale(scale[0], scale[1], scale[2]); + } + } + if (size) { + this.setSize(size.x, size.y); + } + if (anchor) { + if (_instanceof1(anchor, Vector2)) { + this.setAnchor(anchor.x, anchor.y); + } else { + this.setAnchor(anchor[0], anchor[1]); + } + } + }; + /** + * 添加子变换 + * @param child - 要添加的子变换 + */ _proto.addChild = function addChild(child) { + addItem(this.children, child); + }; + /** + * 移除子变换 + */ _proto.removeChild = function removeChild(child) { + removeItem(this.children, child); + }; + /** + * 获取当前的旋转量 + * @returns + */ _proto.getRotation = function getRotation() { + return Transform.getRotation(this.quat, new Euler()); + }; + /** + * 获取当前的四元数 + * @returns + */ _proto.getQuaternion = function getQuaternion() { + return this.quat; + }; + /** + * 更新元素自身变换矩阵 + */ _proto.updateLocalMatrix = function updateLocalMatrix() { + if (this.valid) { + if (this.dirtyFlags.localData) { + this.localMatrix.compose(this.position, this.quat, this.scale, this.anchor); + this.dirtyFlags.localMatrix = true; + } + this.dirtyFlags.localData = false; + } else { + if (!this.localMatrix.isIdentity()) { + this.localMatrix.identity(); + this.dirtyFlags.localMatrix = true; + } + } + }; + /** + * 获取自身变换对应的模型矩阵 + * 数据修改且需要生效时更新自身矩阵 + * 当变换不需要生效时返回单位矩阵 + * @returns + */ _proto.getMatrix = function getMatrix() { + this.updateLocalMatrix(); + return this.localMatrix; + }; + /** + * 获取父矩阵,如果有多级父节点,返回整体变换 + * @returns + */ _proto.getParentMatrix = function getParentMatrix() { + if (this.parent) { + this.parentMatrix = this.parent.getWorldMatrix(); + this.dirtyFlags.parentMatrix = this.dirtyFlags.parentMatrix || this.parent.dirtyFlags.localMatrix || this.parent.dirtyFlags.worldMatrix; + } + return this.parentMatrix; + }; + /** + * 获取包含自身变换和父变换的模型变换矩阵 + * @returns + */ _proto.getWorldMatrix = function getWorldMatrix() { + var localMatrix = this.getMatrix(); + var parentMatrix = this.getParentMatrix(); + if (this.dirtyFlags.localMatrix || this.dirtyFlags.parentMatrix) { + if (parentMatrix) { + this.worldMatrix.multiplyMatrices(parentMatrix, localMatrix); + } else { + this.worldMatrix.copyFrom(localMatrix); + } + this.dirtyFlags.worldMatrix = true; + this.dirtyFlags.localMatrix = false; + this.dirtyFlags.parentMatrix = false; + } + return this.worldMatrix; + }; + /** + * 获取联合变换后的最终缩放因子 + * @returns + */ _proto.getWorldScale = function getWorldScale() { + var cache = this.worldTRSCache; + if (this.dirtyFlags.worldMatrix) { + var mat = this.getWorldMatrix(); + mat.decompose(cache.position, cache.quat, cache.scale); + this.dirtyFlags.worldMatrix = false; + } + return this.worldTRSCache.scale.clone(); + }; + /** + * 获取联合变换后的最终位置 + * @returns + */ _proto.getWorldPosition = function getWorldPosition() { + this.updateTRSCache(); + return this.worldTRSCache.position.clone(); + }; + /** + * 获取联合变换后的最终旋转量 + * @returns + */ _proto.getWorldRotation = function getWorldRotation() { + this.updateTRSCache(); + return Transform.getRotation(this.worldTRSCache.quat, new Euler()); + }; + /** + * 根据世界变换矩阵计算位移、旋转、缩放向量 + * @param position + * @param quat + * @param scale + */ _proto.assignWorldTRS = function assignWorldTRS(position, quat, scale) { + this.updateTRSCache(); + if (position) { + position.copyFrom(this.worldTRSCache.position); + } + if (quat) { + quat.copyFrom(this.worldTRSCache.quat); + } + if (scale) { + scale.copyFrom(this.worldTRSCache.scale); + } + }; + /** + * 拆解并复制指定矩阵到自身变换 + * @param m4 + * @param scale + * @returns + */ _proto.cloneFromMatrix = function cloneFromMatrix(m4, scale) { + m4.decompose(this.position, this.quat, this.scale); + this.rotation.setFromQuaternion(this.quat.clone().conjugate()); + if (scale) { + scale.copyFrom(this.scale); + } + this.dirtyFlags.localData = true; + this.dispatchValueChange(); + }; + /** + * 设置 Transform 生效 / 失效, 默认元素生命周期开始后生效,结束后失效 + */ _proto.setValid = function setValid(val) { + if (this.valid !== val) { + this.valid = val; + if (!val) { + this.localMatrix.identity(); + this.dirtyFlags.localMatrix = true; + } else { + this.dirtyFlags.localData = true; + } + this.dispatchValueChange(); + } + }; + /** + * 获取 Transform 是否生效 + */ _proto.getValid = function getValid() { + return this.valid; + }; + _proto.toData = function toData() { + var transformData = this.taggedProperties; + transformData.position = this.position.clone(); + transformData.eulerHint = { + x: this.rotation.x, + y: this.rotation.y, + z: this.rotation.z + }; + transformData.scale = this.scale.clone(); + return transformData; + }; + _proto.fromData = function fromData(data) { + var transformData = { + position: new Vector3().copyFrom(data.position), + rotation: new Euler(data.eulerHint.x, data.eulerHint.y, data.eulerHint.z), + scale: new Vector3().copyFrom(data.scale) + }; + this.setTransform(transformData); + }; + _proto.dispose = function dispose() {}; + _proto.updateTRSCache = function updateTRSCache() { + var worldMatrix = this.getWorldMatrix(); + if (this.dirtyFlags.worldMatrix) { + var cache = this.worldTRSCache; + worldMatrix.decompose(cache.position, cache.quat, cache.scale); + this.dirtyFlags.worldMatrix = false; + } + }; + _proto.dispatchValueChange = function dispatchValueChange() { + this.children.forEach(function(c) { + c.parentMatrixDirty = true; + }); + }; + /** + * 转换右手坐标系左手螺旋对应的四元数到对应的旋转角 + * @param quat - 四元数 + * @param out - 欧拉角 + * @returns + */ Transform.getRotation = function getRotation(quat, out) { + var newQuat = tempQuat$1.copyFrom(quat); + newQuat.conjugate(); + return out.setFromQuaternion(newQuat); + }; + _create_class(Transform, [ + { + key: "parentTransform", + get: function get() { + return this.parent; + }, + set: function set(transform) { + if (!transform || this.parent === transform || this === transform) { + return; + } + if (this.parent) { + this.parent.removeChild(this); + } + transform.addChild(this); + this.parent = transform; + this.parentMatrixDirty = true; + } + }, + { + key: "parentMatrixDirty", + get: function get() { + return this.dirtyFlags.parentMatrix; + }, + set: function set(val) { + if (this.dirtyFlags.parentMatrix !== val) { + this.dirtyFlags.parentMatrix = val; + this.dispatchValueChange(); + } + } + } + ]); + return Transform; +}(); + +var tmpScale = new Vector3(1, 1, 1); +/** + * 合成的相机对象,采用透视投影 + */ var Camera = /*#__PURE__*/ function() { + function Camera(name, options) { + if (options === void 0) options = {}; + this.name = name; + this./** + * @internal + */ transform = new Transform(); + this.viewportMatrix = Matrix4$1.fromIdentity(); + this.viewMatrix = Matrix4$1.fromIdentity(); + this.projectionMatrix = Matrix4$1.fromIdentity(); + this.viewProjectionMatrix = Matrix4$1.fromIdentity(); + this.inverseViewMatrix = Matrix4$1.fromIdentity(); + this.dirty = true; + var _options_near = options.near, near = _options_near === void 0 ? 0.1 : _options_near, _options_far = options.far, far = _options_far === void 0 ? 20 : _options_far, _options_fov = options.fov, fov = _options_fov === void 0 ? 60 : _options_fov, _options_aspect = options.aspect, aspect = _options_aspect === void 0 ? 1 : _options_aspect, _options_clipMode = options.clipMode, clipMode = _options_clipMode === void 0 ? CameraClipMode.portrait : _options_clipMode, _options_position = options.position, position = _options_position === void 0 ? [ + 0, + 0, + 8 + ] : _options_position, _options_rotation = options.rotation, rotation = _options_rotation === void 0 ? [ + 0, + 0, + 0 + ] : _options_rotation; + var euler = new Euler(rotation[0], rotation[1], rotation[2]); + var quat = new Quaternion().setFromEuler(euler); + this.options = { + near: near, + far: far, + fov: fov, + aspect: aspect, + clipMode: clipMode + }; + this.transform.setPosition(position[0], position[1], position[2]); + this.transform.setQuaternion(quat.x, quat.y, quat.z, quat.w); + this.dirty = true; + this.updateMatrix(); + } + var _proto = Camera.prototype; + /** + * 设置相机变换 + * @since 2.3.0 + * @param transform + */ _proto.setTransform = function setTransform(transform) { + this.transform.parentTransform = transform.parentTransform; + this.transform.cloneFromMatrix(transform.getMatrix()); + this.dirty = true; + }; + _proto.setViewportMatrix = function setViewportMatrix(matrix) { + this.viewportMatrix = matrix.clone(); + this.dirty = true; + }; + _proto.getViewportMatrix = function getViewportMatrix() { + return this.viewportMatrix; + }; + /** + * 获取相机的视图变换矩阵 + * @return + */ _proto.getViewMatrix = function getViewMatrix() { + this.updateMatrix(); + return this.viewMatrix.clone(); + }; + /** + * 获取视图变换的逆矩阵 + */ _proto.getInverseViewMatrix = function getInverseViewMatrix() { + this.updateMatrix(); + return this.inverseViewMatrix.clone(); + }; + /** + * 获取相机的投影矩阵 + * @return + */ _proto.getProjectionMatrix = function getProjectionMatrix() { + this.updateMatrix(); + return this.projectionMatrix.clone(); + }; + /** + * 获取相机投影矩阵的逆矩阵 + * @return + */ _proto.getInverseProjectionMatrix = function getInverseProjectionMatrix() { + var _this_inverseProjectionMatrix; + this.updateMatrix(); + return (_this_inverseProjectionMatrix = this.inverseProjectionMatrix) == null ? void 0 : _this_inverseProjectionMatrix.clone(); + }; + /** + * 获取相机的 VP 矩阵 + * @return + */ _proto.getViewProjectionMatrix = function getViewProjectionMatrix() { + this.updateMatrix(); + return this.viewProjectionMatrix.clone(); + }; + /** + * 获取相机 VP 矩阵的逆矩阵 + * @return + */ _proto.getInverseViewProjectionMatrix = function getInverseViewProjectionMatrix() { + this.updateMatrix(); + if (!this.inverseViewProjectionMatrix) { + this.inverseViewProjectionMatrix = this.viewProjectionMatrix.clone(); + this.inverseViewProjectionMatrix.invert(); + } + return this.inverseViewProjectionMatrix.clone(); + }; + /** + * 根据相机的视图投影矩阵对指定模型矩阵做变换 + * @param out - 结果矩阵 + * @param model - 模型变换矩阵 + */ _proto.getModelViewProjection = function getModelViewProjection(out, model) { + return out.multiplyMatrices(this.viewProjectionMatrix, model); + }; + /** + * 获取归一化坐标和 3D 世界坐标的换算比例,使用 ViewProjection 矩阵 + * @param z - 当前的位置 z + */ _proto.getInverseVPRatio = function getInverseVPRatio(z) { + var pos = new Vector3(this.position.x, this.position.y, z); + var mat = this.getViewProjectionMatrix(); + var inverseMat = this.getInverseViewProjectionMatrix(); + if (!this.viewportMatrix.isIdentity()) { + var viewportMatrix = this.viewportMatrix.clone(); + inverseMat.premultiply(viewportMatrix); + mat.multiply(viewportMatrix.invert()); + } + var _mat_projectPoint = mat.projectPoint(pos), nz = _mat_projectPoint.z; + var _inverseMat_projectPoint = inverseMat.projectPoint(new Vector3(1, 1, nz)), xMax = _inverseMat_projectPoint.x, yMax = _inverseMat_projectPoint.y; + var _inverseMat_projectPoint1 = inverseMat.projectPoint(new Vector3(-1, -1, nz)), xMin = _inverseMat_projectPoint1.x, yMin = _inverseMat_projectPoint1.y; + return new Vector3((xMax - xMin) / 2, (yMax - yMin) / 2, 0); + }; + /** + * 设置相机的旋转四元数 + * @param value - 旋转四元数 + */ _proto.setQuat = function setQuat(value) { + if (!this.transform.getQuaternion().equals(value)) { + this.transform.setQuaternion(value.x, value.y, value.z, value.w); + this.dirty = true; + } + }; + /** + * 获取相机旋转对应的四元数 + * @returns + */ _proto.getQuat = function getQuat() { + return this.transform.quat.clone(); + }; + /** + * 获取相机内部的 options + * @returns 相机 options + */ _proto.getOptions = function getOptions() { + return _extends({}, this.options, { + position: this.position.clone(), + rotation: this.rotation.clone() + }); + }; + /** + * 复制指定相机元素的属性到当前相机 + * @param camera + */ _proto.copy = function copy(camera) { + var near = camera.near, far = camera.far, fov = camera.fov, clipMode = camera.clipMode, aspect = camera.aspect, position = camera.position, rotation = camera.rotation; + this.near = near; + this.far = far; + this.fov = fov; + this.clipMode = clipMode; + this.aspect = aspect; + this.position = position; + this.rotation = rotation; + this.updateMatrix(); + }; + /** + * 更新相机相关的矩阵,获取矩阵前会自动调用 + */ _proto.updateMatrix = function updateMatrix() { + if (this.dirty) { + var _this_options = this.options, fov = _this_options.fov, aspect = _this_options.aspect, near = _this_options.near, far = _this_options.far, clipMode = _this_options.clipMode; + this.projectionMatrix.perspective(fov * DEG2RAD, aspect, near, far, clipMode === CameraClipMode.portrait); + this.projectionMatrix.premultiply(this.viewportMatrix); + this.inverseViewMatrix.compose(this.position, this.getQuat(), tmpScale); + var _this_transform_getParentMatrix; + this.inverseViewMatrix.premultiply((_this_transform_getParentMatrix = this.transform.getParentMatrix()) != null ? _this_transform_getParentMatrix : Matrix4$1.IDENTITY); + this.viewMatrix.copyFrom(this.inverseViewMatrix).invert(); + this.viewProjectionMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); + this.inverseViewProjectionMatrix = null; + this.dirty = false; + } + }; + _create_class(Camera, [ + { + key: "near", + get: function get() { + return this.options.near; + }, + set: /** + * 设置相机近平面 + * @param near + */ function set(near) { + if (this.options.near !== near) { + this.options.near = near; + this.dirty = true; + } + } + }, + { + key: "far", + get: function get() { + return this.options.far; + }, + set: /** + * 设置相机远平面 + * @param far + */ function set(far) { + if (this.options.far !== far) { + this.options.far = far; + this.dirty = true; + } + } + }, + { + key: "fov", + get: function get() { + return this.options.fov; + }, + set: /** + * 设置相机视锥体垂直视野角度 + * @param fov + */ function set(fov) { + if (this.options.fov !== fov) { + this.options.fov = fov; + this.dirty = true; + } + } + }, + { + key: "aspect", + get: function get() { + return this.options.aspect; + }, + set: /** + * 设置相机视锥体的长宽比 + * @param aspect + */ function set(aspect) { + if (this.options.aspect !== aspect) { + this.options.aspect = aspect; + this.dirty = true; + } + } + }, + { + key: "clipMode", + get: function get() { + return this.options.clipMode; + }, + set: /** + * 相机的裁剪模式 + * @param clipMode + */ function set(clipMode) { + if (clipMode !== undefined && this.options.clipMode !== clipMode) { + this.options.clipMode = clipMode; + this.dirty = true; + } + } + }, + { + key: "position", + get: /** + * 获取相机的本地位置 + */ function get() { + return this.transform.position.clone(); + }, + set: /** + * 设置相机的本地位置 + * @param value + */ function set(value) { + if (!this.transform.position.equals(value)) { + this.transform.setPosition(value.x, value.y, value.z); + this.dirty = true; + } + } + }, + { + key: "worldPosition", + get: /** + * 获取相机的世界位置 + * @since 2.3.0 + */ function get() { + return this.transform.getWorldPosition(); + } + }, + { + key: "rotation", + get: function get() { + return this.transform.rotation.clone(); + }, + set: /** + * 设置相机的旋转角度 + * @param value + */ function set(value) { + if (!this.transform.rotation.equals(value)) { + this.transform.setRotation(value.x, value.y, value.z); + this.dirty = true; + } + } + } + ]); + return Camera; +}(); + +var Burst = /*#__PURE__*/ function() { + function Burst(options) { + var time = options.time, interval = options.interval, count = options.count, cycles = options.cycles, probability = options.probability; + this.time = +time || 0; + this.interval = +interval || 1; + this.count = _instanceof1(count, ValueGetter) ? count : createValueGetter(count); + this.cycles = +cycles || Infinity; + this.probability = isNaN(probability) ? 1 : +probability; + this.reset(); + } + var _proto = Burst.prototype; + _proto.getGeneratorOptions = function getGeneratorOptions(timePassed, lifetime) { + var dt = timePassed - this.time - this.now; + if (dt > this.interval * this.index && this.internalCycles > 0) { + this.internalCycles--; + this.index++; + return Math.random() <= this.probability ? { + index: this.index, + total: 1 / this.interval, + count: this.count.getValue(lifetime), + cycleIndex: this.cycles - this.internalCycles - 1 + } : null; + } + }; + _proto.reset = function reset() { + this.internalCycles = this.cycles; + this.index = 0; + this.now = 0; + }; + _proto.clone = function clone() { + var options = { + time: this.time, + interval: this.interval, + count: this.count, + cycles: this.cycles, + probability: this.probability + }; + return new Burst(options); + }; + return Burst; +}(); + +var LinkNode = function LinkNode(content) { + this.content = content; +}; +var Link = /*#__PURE__*/ function() { + function Link(sort) { + this.sort = sort; + this.length = 0; + } + var _proto = Link.prototype; + _proto.findNodeByContent = function findNodeByContent(filter) { + var node = this.first; + if (node) { + do { + if (filter(node.content)) { + return node; + } + // @ts-expect-error + // eslint-disable-next-line no-cond-assign + }while (node = node.next); + } + }; + _proto.insertNode = function insertNode(a, next) { + var b = a.next; + a.next = next; + next.pre = a; + next.next = b; + if (b) { + b.pre = next; + } + // a -> next -> b + }; + _proto.shiftNode = function shiftNode(content) { + var node = new LinkNode(content); + this.length++; + if (this.length === 1) { + return this.first = this.last = node; + } + var current = this.first; + while(current){ + if (this.sort(current.content, node.content) <= 0) { + if (current.next) { + current = current.next; + } else { + this.insertNode(current, node); + return this.last = node; + } + } else { + if (current.pre) { + this.insertNode(current.pre, node); + } else { + this.first = node; + node.next = current; + current.pre = node; + } + return node; + } + } + }; + _proto.pushNode = function pushNode(content) { + var node = new LinkNode(content); + this.length++; + if (this.length === 1) { + return this.last = this.first = node; + } + var current = this.last; + while(current){ + if (this.sort(node.content, current.content) <= 0) { + if (this.first === current) { + current.pre = node; + node.next = current; + return this.first = node; + } else { + // @ts-expect-error + current = current.pre; + } + } else { + this.insertNode(current, node); + if (current === this.last) { + this.last = node; + } + return node; + } + } + }; + _proto.removeNode = function removeNode(node) { + var current = this.first; + this.length--; + if (current === node) { + // @ts-expect-error + var a = this.first = current.next; + if (a) { + a.pre = null; + } + } else if ((current = this.last) === node) { + // @ts-expect-error + var a1 = this.last = current.pre; + if (a1) { + a1.next = null; + } + } else if (node) { + var pre = node.pre; + var next = node.next; + // @ts-expect-error + pre.next = next; + if (next) { + next.pre = pre; + } + } + node.pre = null; + node.next = null; + }; + _proto.forEach = function forEach(func, thisObj) { + var node = this.first; + var i = 0; + if (node) { + do { + func.call(thisObj || this, node.content, i++); + // @ts-expect-error + // eslint-disable-next-line no-cond-assign + }while (node = node.next); + } + }; + _proto.forEachReverse = function forEachReverse(func, thisObj) { + var node = this.last; + var i = this.length - 1; + if (node) { + do { + func.call(thisObj || this, node.content, i--); + // @ts-expect-error + // eslint-disable-next-line no-cond-assign + }while (node = node.pre); + } + }; + _proto.getNodeByIndex = function getNodeByIndex(index) { + var i = 0, res = this.first; + if (!res || index >= this.length || index < 0) { + return null; + } + while(i < index){ + res = res.next; + i++; + } + return res; + }; + return Link; +}(); + +var RUNTIME_ENV = "runtime_env"; +var RENDER_PREFER_LOOKUP_TEXTURE = "lookup_texture"; +// 文本元素使用 offscreen canvas 绘制 +var TEMPLATE_USE_OFFSCREEN_CANVAS = "offscreen_canvas"; +// 后处理配置相关 +var POST_PROCESS_SETTINGS = "post_process_settings"; +var config = {}; +/** + * 获取全局配置项 + * @param name + * @returns + */ function getConfig(name) { + return config[name]; +} +/** + * 设置全局配置项 + * @param name + * @param value + * @returns + */ function setConfig(name, value) { + return config[name] = value; +} + +var tmp0 = new Vector3(); +var tmp1 = new Vector3(); +var TrailMesh = /*#__PURE__*/ function() { + function TrailMesh(engine, props) { + this.pointStart = []; + var colorOverLifetime = props.colorOverLifetime, colorOverTrail = props.colorOverTrail, maxTrailCount = props.maxTrailCount, _props_opacityOverLifetime = props.opacityOverLifetime, opacityOverLifetime = _props_opacityOverLifetime === void 0 ? createValueGetter(1) : _props_opacityOverLifetime, widthOverTrail = props.widthOverTrail, name = props.name, occlusion = props.occlusion, blending = props.blending, maskMode = props.maskMode, mask = props.mask, _props_textureMap = props.// order, + textureMap, textureMap = _props_textureMap === void 0 ? [ + 0, + 0, + 1, + 1 + ] : _props_textureMap, texture = props.texture, transparentOcclusion = props.transparentOcclusion, minimumVertexDistance = props.minimumVertexDistance, lifetime = props.lifetime, matrix = props.matrix; + var _engine_gpuCapability = engine.gpuCapability, detail = _engine_gpuCapability.detail, level = _engine_gpuCapability.level; + var pointCountPerTrail = Math.max(props.pointCountPerTrail, 2); + var keyFrameMeta = createKeyFrameMeta(); + var enableVertexTexture = detail.maxVertexTextures > 0; + var _engine_renderer; + var env = ((_engine_renderer = engine.renderer) != null ? _engine_renderer : {}).env; + var uniformValues = {}; + // const lookUpTexture = getConfig(RENDER_PREFER_LOOKUP_TEXTURE) ? 1 : 0; + var lookUpTexture = 0; + var macros = [ + [ + "ENABLE_VERTEX_TEXTURE", + enableVertexTexture + ], + [ + "LOOKUP_TEXTURE_CURVE", + lookUpTexture + ], + [ + "ENV_EDITOR", + env === PLAYER_OPTIONS_ENV_EDITOR + ] + ]; + var useAttributeTrailStart = maxTrailCount > 64; + var shaderCacheId = 0; + if (colorOverLifetime) { + macros.push([ + "COLOR_OVER_LIFETIME", + true + ]); + shaderCacheId |= 1; + uniformValues.uColorOverLifetime = Texture.createWithData(engine, imageDataFromGradient(colorOverLifetime)); + } + if (colorOverTrail) { + macros.push([ + "COLOR_OVER_TRAIL", + true + ]); + shaderCacheId |= 1 << 2; + uniformValues.uColorOverTrail = Texture.createWithData(engine, imageDataFromGradient(colorOverTrail)); + } + if (useAttributeTrailStart) { + macros.push([ + "ATTR_TRAIL_START", + 1 + ]); + shaderCacheId |= 1 << 3; + } else { + uniformValues.uTrailStart = new Float32Array(maxTrailCount); + } + uniformValues.uOpacityOverLifetimeValue = opacityOverLifetime.toUniform(keyFrameMeta); + var uWidthOverTrail = widthOverTrail.toUniform(keyFrameMeta); + macros.push([ + "VERT_CURVE_VALUE_COUNT", + keyFrameMeta.index + ], [ + "VERT_MAX_KEY_FRAME_COUNT", + keyFrameMeta.max + ]); + if (enableVertexTexture && lookUpTexture) { + var tex = generateHalfFloatTexture(engine, ValueGetter.getAllData(keyFrameMeta, true), keyFrameMeta.index, 1); + uniformValues.uVCurveValueTexture = tex; + } else { + uniformValues.uVCurveValues = ValueGetter.getAllData(keyFrameMeta); + } + var vertex = trailVert; + var fragment = particleFrag; + var mtl = { + shader: { + vertex: vertex, + fragment: fragment, + macros: macros, + glslVersion: level === 1 ? exports.GLSLVersion.GLSL1 : exports.GLSLVersion.GLSL3, + shared: true, + name: "trail#" + name, + cacheId: "-t:+" + shaderCacheId + "+" + keyFrameMeta.index + "+" + keyFrameMeta.max + }, + uniformSemantics: { + effects_MatrixVP: "VIEWPROJECTION", + effects_MatrixInvV: "VIEWINVERSE", + effects_ObjectToWorld: "MODEL", + uEditorTransform: "EDITOR_TRANSFORM" + } + }; + var maxVertexCount = pointCountPerTrail * maxTrailCount * 2; + var maxTriangleCount = (pointCountPerTrail - 1) * maxTrailCount; + var bpe = Float32Array.BYTES_PER_ELEMENT; + var v12 = 12 * bpe; + var geometryOptions = { + attributes: { + aColor: { + size: 4, + stride: v12, + data: new Float32Array(maxVertexCount * 12) + }, + aSeed: { + size: 1, + stride: v12, + offset: 4 * bpe, + dataSource: "aColor" + }, + aInfo: { + size: 3, + stride: v12, + offset: 5 * bpe, + dataSource: "aColor" + }, + aPos: { + size: 4, + stride: v12, + offset: 8 * bpe, + dataSource: "aColor" + }, + // + aTime: { + size: 1, + data: new Float32Array(maxVertexCount) + }, + // + aDir: { + size: 3, + data: new Float32Array(maxVertexCount * 3) + } + }, + indices: { + data: new Uint16Array(maxVertexCount * 6) + }, + drawCount: maxTriangleCount * 6, + name: "trail#" + name, + bufferUsage: glContext.DYNAMIC_DRAW + }; + if (useAttributeTrailStart) { + geometryOptions.attributes.aTrailStart = { + size: 1, + data: new Float32Array(maxVertexCount) + }; + } else { + var indexData = new Float32Array(maxVertexCount); + geometryOptions.attributes.aTrailStartIndex = { + size: 1, + data: indexData + }; + for(var i = 0; i < maxTrailCount; i++){ + var c = pointCountPerTrail * 2; + var s = i * c; + for(var j = 0; j < c; j++){ + indexData[s + j] = i; + } + } + } + var preMulAlpha = getPreMultiAlpha(blending); + var material = Material.create(engine, mtl); + material.blending = true; + material.depthMask = occlusion; + material.depthTest = true; + material.stencilRef = mask ? [ + mask, + mask + ] : undefined; + setMaskMode(material, maskMode); + setBlendMode(material, blending); + var mesh = this.mesh = Mesh.create(engine, { + name: "MTrail_" + name, + material: material, + geometry: Geometry.create(engine, geometryOptions) + }); + var uMaskTex = texture != null ? texture : Texture.createWithData(engine); + Object.keys(uniformValues).map(function(name) { + var value = uniformValues[name]; + if (_instanceof1(value, Texture)) { + material.setTexture(name, value); + } else if (name === "uTrailStart") { + material.setFloats("uTrailStart", value); + } else if (name === "uVCurveValues") { + var array = []; + for(var i = 0; i < value.length; i = i + 4){ + var v = new Vector4$1(value[i], value[i + 1], value[i + 2], value[i + 3]); + array.push(v); + } + material.setVector4Array(name, array); + } else { + material.setVector4(name, Vector4$1.fromArray(value)); + } + }); + material.setFloat("uTime", 0); + // TODO: 修改下长度 + material.setVector4("uWidthOverTrail", Vector4$1.fromArray(uWidthOverTrail)); + material.setVector2("uTexOffset", new Vector2(0, 0)); + material.setVector4("uTextureMap", Vector4$1.fromArray(textureMap)); + material.setVector4("uParams", new Vector4$1(0, pointCountPerTrail - 1, 0, 0)); + material.setTexture("uMaskTex", uMaskTex); + material.setVector4("uColorParams", new Vector4$1(texture ? 1 : 0, +preMulAlpha, 0, +(occlusion && !transparentOcclusion))); + this.maxTrailCount = maxTrailCount; + this.pointCountPerTrail = pointCountPerTrail; + this.checkVertexDistance = minimumVertexDistance > 0; + this.minimumVertexDistance = Math.pow(minimumVertexDistance || 0.001, 2); + this.useAttributeTrailStart = useAttributeTrailStart; + this.lifetime = lifetime; + if (matrix) { + this.mesh.worldMatrix = matrix; + } + this.geometry = mesh.firstGeometry(); + this.trailCursors = new Uint16Array(maxTrailCount); + } + var _proto = TrailMesh.prototype; + _proto.addPoint = function addPoint(trailIndex, position, opt) { + opt = opt || {}; + var cursor = this.trailCursors[trailIndex]; + var pointCountPerTrail = this.pointCountPerTrail; + var geometry = this.geometry; + var segmentPerTrail = pointCountPerTrail - 1; + var pointIndex = cursor % pointCountPerTrail; + var previousIndex = (cursor - 1) % pointCountPerTrail; + var bpreviousIndex = (cursor - 2) % pointCountPerTrail; + var previousPoint = this.getTrailPosition(trailIndex, previousIndex, tmp0); + // point too close + if (previousPoint && this.checkVertexDistance && (previousPoint == null ? void 0 : previousPoint.distanceSquared(position)) < this.minimumVertexDistance) { + return; + } + var pointStartIndex = trailIndex * pointCountPerTrail + pointIndex; + var dir = calculateDirection(previousPoint, position); + var time = opt.time || this.time; + var info = [ + Math.random(), + opt.lifetime || this.lifetime, + cursor + ]; + var size = opt.size || 1; + var dirStartIndex = pointStartIndex * 6; + var dirData = new Float32Array(6); + dirData.set(dir, 0); + dirData.set(dir, 3); + geometry.setAttributeSubData("aDir", dirStartIndex, dirData); + geometry.setAttributeSubData("aTime", pointStartIndex * 2, new Float32Array([ + time, + time + ])); + var color = opt.color || [ + 1, + 1, + 1, + 1 + ]; + var colorData = new Float32Array(24); + var positionData = position.toArray(); + colorData.set(color, 0); + colorData.set(info, 4); + colorData[7] = 0; + colorData.set(positionData, 8); + colorData[11] = 0.5 * size; + colorData.set(color, 12); + colorData.set(info, 16); + colorData[19] = 1; + colorData.set(positionData, 20); + colorData[23] = -0.5 * size; + geometry.setAttributeSubData("aColor", pointStartIndex * 24, colorData); + if (previousIndex >= 0) { + var bPreviousPoint = this.getTrailPosition(trailIndex, bpreviousIndex, tmp1); + var previousDir = new Float32Array(calculateDirection(bPreviousPoint, previousPoint, position)); + var previousDirStartIndex = (trailIndex * pointCountPerTrail + previousIndex) * 6; + geometry.setAttributeSubData("aDir", previousDirStartIndex, previousDir); + geometry.setAttributeSubData("aDir", previousDirStartIndex + 3, previousDir); + var indicesStart = trailIndex * pointCountPerTrail * 2; + var indicesData = new Uint16Array([ + previousIndex * 2 + indicesStart, + previousIndex * 2 + 1 + indicesStart, + pointIndex * 2 + indicesStart, + pointIndex * 2 + indicesStart, + previousIndex * 2 + 1 + indicesStart, + pointIndex * 2 + 1 + indicesStart + ]); + var start = (trailIndex * segmentPerTrail + (cursor - 1) % segmentPerTrail) * 6; + geometry.setIndexSubData(start, indicesData); + } + cursor = ++this.trailCursors[trailIndex]; + var mtl = this.mesh.material; + var params = mtl.getVector4("uParams"); + var trailStart = info[2]; + if (this.useAttributeTrailStart) { + var len = pointCountPerTrail * 2; + var startData = new Float32Array(len); + for(var i = 0; i < len; i++){ + startData[i] = trailStart; + } + geometry.setAttributeSubData("aTrailStart", trailIndex * startData.length, startData); + } else { + var value = mtl.getFloats("uTrailStart"); + if (value != undefined) { + value[trailIndex] = trailStart; + mtl.setFloats("uTrailStart", value); + } + } + if (params) { + params.y = Math.max(params.y, cursor - 1) - Math.max(0, cursor - pointCountPerTrail); + mtl.setVector4("uParams", params); + } + }; + _proto.getTrailPosition = function getTrailPosition(trail, index, out) { + var pointCountPerTrail = this.pointCountPerTrail; + if (index >= 0 && index < pointCountPerTrail) { + var startIndex = (trail * pointCountPerTrail + index) * 24 + 8; + var data = this.geometry.getAttributeData("aColor"); + assertExist(data); + out.x = data[startIndex]; + out.y = data[1 + startIndex]; + out.z = data[2 + startIndex]; + return out; + } + }; + _proto.clearAllTrails = function clearAllTrails() { + var indexData = this.geometry.getIndexData(); + assertExist(indexData); + this.trailCursors = new Uint16Array(this.trailCursors.length); + this.geometry.setIndexData(new Uint16Array(indexData.length)); + }; + _proto.minusTime = function minusTime(time) { + var data = this.geometry.getAttributeData("aTime"); + assertExist(data); + for(var i = 0; i < data.length; i++){ + data[i] -= time; + } + this.geometry.setAttributeData("aTime", data); + this.time -= time; + }; + _proto.clearTrail = function clearTrail(index) { + if (this.trailCursors[index] !== 0) { + var pointCountPerTrail = this.pointCountPerTrail; + var indicesPerTrail = (pointCountPerTrail - 1) * 6; + var indices = this.geometry.getIndexData(); + assertExist(indices); + indices.set(new Uint16Array(indicesPerTrail), index * indicesPerTrail); + this.geometry.setIndexData(indices); + this.trailCursors[index] = 0; + } + }; + _proto.getPointStartPos = function getPointStartPos(index) { + return this.pointStart[index]; + }; + _proto.setPointStartPos = function setPointStartPos(index, pos) { + this.pointStart[index] = pos; + }; + _proto.onUpdate = function onUpdate(escapeTime) {}; + _create_class(TrailMesh, [ + { + key: "time", + get: function get() { + return this.mesh.material.getFloat("uTime") || 0; + }, + set: function set(t) { + this.mesh.material.setFloat("uTime", t != null ? t : 0); + } + } + ]); + return TrailMesh; +}(); +var tempDir$1 = new Vector3(); +var tempDa = new Vector3(); +var tempDb = new Vector3(); +// TODO: prePoint 可选,point 必选,顺序有问题 +function calculateDirection(prePoint, point, nextPoint) { + var dir = tempDir$1; + if (!prePoint && !nextPoint) { + return [ + 0, + 0, + 0 + ]; + } else if (!prePoint) { + dir.subtractVectors(nextPoint, point); + } else if (!nextPoint) { + dir.subtractVectors(point, prePoint); + } else { + tempDa.subtractVectors(point, prePoint).normalize(); + // FIXME: 这里有bug。。。 + tempDa.subtractVectors(nextPoint, point); + tempDb.copyFrom(tempDa).normalize(); + dir.addVectors(tempDa, tempDb); + } + return dir.normalize().toArray(); +} + +/** + * @since 2.0.0 + */ var ParticleBehaviourPlayable = /*#__PURE__*/ function(Playable) { + _inherits(ParticleBehaviourPlayable, Playable); + function ParticleBehaviourPlayable() { + var _this; + _this = Playable.apply(this, arguments) || this; + _this.lastTime = 0; + return _this; + } + var _proto = ParticleBehaviourPlayable.prototype; + _proto.start = function start(context) { + var boundObject = context.output.getUserData(); + if (this.particleSystem || !_instanceof1(boundObject, exports.VFXItem)) { + return; + } + this.particleSystem = boundObject.getComponent(exports.ParticleSystem); + if (this.particleSystem) { + this.particleSystem.name = boundObject.name; + this.particleSystem.startEmit(); + this.particleSystem.initEmitterTransform(); + } + }; + _proto.processFrame = function processFrame(context) { + if (this.time >= 0) { + this.start(context); + } + var particleSystem = this.particleSystem; + if (particleSystem) { + var deltaTime = context.deltaTime; + if (this.time >= 0 && this.time < particleSystem.item.duration && particleSystem.isEnded()) { + particleSystem.reset(); + } + if (Math.abs(this.time - this.lastTime) < 0.001) { + deltaTime = 0; + } + particleSystem.update(deltaTime); + } + this.lastTime = this.time; + }; + return ParticleBehaviourPlayable; +}(Playable); +var ParticleBehaviourPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(ParticleBehaviourPlayableAsset, PlayableAsset); + function ParticleBehaviourPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = ParticleBehaviourPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + return new ParticleBehaviourPlayable(graph); + }; + return ParticleBehaviourPlayableAsset; +}(PlayableAsset); +var particleUniformTypeMap = { + "uSprite": "vec4", + "uParams": "vec4", + "uAcceleration": "vec4", + "uGravityModifierValue": "vec4", + "uOpacityOverLifetimeValue": "vec4", + "uRXByLifeTimeValue": "vec4", + "uRYByLifeTimeValue": "vec4", + "uRZByLifeTimeValue": "vec4", + "uLinearXByLifetimeValue": "vec4", + "uLinearYByLifetimeValue": "vec4", + "uLinearZByLifetimeValue": "vec4", + "uSpeedLifetimeValue": "vec4", + "uOrbXByLifetimeValue": "vec4", + "uOrbYByLifetimeValue": "vec4", + "uOrbZByLifetimeValue": "vec4", + "uSizeByLifetimeValue": "vec4", + "uSizeYByLifetimeValue": "vec4", + "uColorParams": "vec4", + "uFSprite": "vec4", + "uPreviewColor": "vec4", + "uVCurveValues": "vec4Array", + "uFCurveValues": "vec4", + "uFinalTarget": "vec3", + "uForceCurve": "vec4", + "uOrbCenter": "vec3", + "uTexOffset": "vec2", + "uPeriodValue": "vec4", + "uMovementValue": "vec4", + "uStrengthValue": "vec4", + "uWaveParams": "vec4" +}; + +var ParticleMesh = /*#__PURE__*/ function() { + function ParticleMesh(engine, props) { + this.particleCount = 0; + this.cachedRotationVector3 = new Vector3(); + this.cachedRotationMatrix = new Matrix3(); + this.cachedLinearMove = new Vector3(); + this.tempMatrix3 = new Matrix3(); + this.VERT_MAX_KEY_FRAME_COUNT = 0; + var _engine_renderer; + var env = ((_engine_renderer = engine.renderer) != null ? _engine_renderer : {}).env; + var speedOverLifetime = props.speedOverLifetime, colorOverLifetime = props.colorOverLifetime, linearVelOverLifetime = props.linearVelOverLifetime, orbitalVelOverLifetime = props.orbitalVelOverLifetime, sizeOverLifetime = props.sizeOverLifetime, rotationOverLifetime = props.rotationOverLifetime, sprite = props.sprite, gravityModifier = props.gravityModifier, maxCount = props.maxCount, textureFlip = props.textureFlip, useSprite = props.useSprite, name = props.name, gravity = props.gravity, forceTarget = props.forceTarget, side = props.side, occlusion = props.occlusion, anchor = props.anchor, blending = props.blending, maskMode = props.maskMode, mask = props.mask, transparentOcclusion = props.transparentOcclusion, meshSlots = props.meshSlots, _props_renderMode = props.renderMode, renderMode = _props_renderMode === void 0 ? 0 : _props_renderMode, _props_diffuse = props.diffuse, diffuse = _props_diffuse === void 0 ? Texture.createWithData(engine) : _props_diffuse; + var detail = engine.gpuCapability.detail; + var halfFloatTexture = detail.halfFloatTexture, maxVertexUniforms = detail.maxVertexUniforms; + var macros = [ + // spec.RenderMode + [ + "RENDER_MODE", + +renderMode + ], + [ + "ENV_EDITOR", + env === PLAYER_OPTIONS_ENV_EDITOR + ] + ]; + var level = engine.gpuCapability.level; + var vertexKeyFrameMeta = createKeyFrameMeta(); + var fragmentKeyFrameMeta = createKeyFrameMeta(); + var enableVertexTexture = maxVertexUniforms > 0; + var uniformValues = {}; + var vertex_lookup_texture = 0; + var shaderCacheId = 0; + var useOrbitalVel; + this.useSprite = useSprite; + if (enableVertexTexture) { + macros.push([ + "ENABLE_VERTEX_TEXTURE", + true + ]); + } + if (speedOverLifetime) { + macros.push([ + "SPEED_OVER_LIFETIME", + true + ]); + shaderCacheId |= 1 << 1; + uniformValues.uSpeedLifetimeValue = speedOverLifetime.toUniform(vertexKeyFrameMeta); + } + if (sprite == null ? void 0 : sprite.animate) { + macros.push([ + "USE_SPRITE", + true + ]); + shaderCacheId |= 1 << 2; + uniformValues.uFSprite = uniformValues.uSprite = new Float32Array([ + sprite.col, + sprite.row, + sprite.total, + sprite.blend ? 1 : 0 + ]); + this.useSprite = true; + } + if (colorOverLifetime == null ? void 0 : colorOverLifetime.color) { + macros.push([ + "COLOR_OVER_LIFETIME", + true + ]); + shaderCacheId |= 1 << 4; + uniformValues.uColorOverLifetime = _instanceof1(colorOverLifetime.color, Texture) ? colorOverLifetime.color : Texture.createWithData(engine, imageDataFromGradient(colorOverLifetime.color)); + } + if (colorOverLifetime == null ? void 0 : colorOverLifetime.opacity) { + uniformValues.uOpacityOverLifetimeValue = colorOverLifetime.opacity.toUniform(vertexKeyFrameMeta); + } else { + uniformValues.uOpacityOverLifetimeValue = createValueGetter(1).toUniform(vertexKeyFrameMeta); + } + [ + "x", + "y", + "z" + ].forEach(function(pro, i) { + var defL = 0; + var defO = 0; + if (linearVelOverLifetime == null ? void 0 : linearVelOverLifetime[pro]) { + uniformValues["uLinear" + pro.toUpperCase() + "ByLifetimeValue"] = linearVelOverLifetime[pro].toUniform(vertexKeyFrameMeta); + defL = 1; + shaderCacheId |= 1 << 7 + i; + linearVelOverLifetime.enabled = true; + } + macros.push([ + "LINEAR_VEL_" + pro.toUpperCase(), + defL + ]); + if (orbitalVelOverLifetime == null ? void 0 : orbitalVelOverLifetime[pro]) { + uniformValues["uOrb" + pro.toUpperCase() + "ByLifetimeValue"] = orbitalVelOverLifetime[pro].toUniform(vertexKeyFrameMeta); + defO = 1; + shaderCacheId |= 1 << 10 + i; + useOrbitalVel = true; + orbitalVelOverLifetime.enabled = true; + } + macros.push([ + "ORB_VEL_" + pro.toUpperCase(), + defO + ]); + }); + if (linearVelOverLifetime == null ? void 0 : linearVelOverLifetime.asMovement) { + macros.push([ + "AS_LINEAR_MOVEMENT", + true + ]); + shaderCacheId |= 1 << 5; + } + if (useOrbitalVel) { + if (orbitalVelOverLifetime == null ? void 0 : orbitalVelOverLifetime.asRotation) { + macros.push([ + "AS_ORBITAL_MOVEMENT", + true + ]); + shaderCacheId |= 1 << 6; + } + uniformValues.uOrbCenter = new Float32Array((orbitalVelOverLifetime == null ? void 0 : orbitalVelOverLifetime.center) || [ + 0, + 0, + 0 + ]); + } + uniformValues.uSizeByLifetimeValue = sizeOverLifetime == null ? void 0 : sizeOverLifetime.x.toUniform(vertexKeyFrameMeta); + if (sizeOverLifetime == null ? void 0 : sizeOverLifetime.separateAxes) { + var _sizeOverLifetime_y; + macros.push([ + "SIZE_Y_BY_LIFE", + 1 + ]); + shaderCacheId |= 1 << 14; + uniformValues.uSizeYByLifetimeValue = sizeOverLifetime == null ? void 0 : (_sizeOverLifetime_y = sizeOverLifetime.y) == null ? void 0 : _sizeOverLifetime_y.toUniform(vertexKeyFrameMeta); + } + if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.z) { + uniformValues.uRZByLifeTimeValue = rotationOverLifetime.z.toUniform(vertexKeyFrameMeta); + shaderCacheId |= 1 << 15; + macros.push([ + "ROT_Z_LIFETIME", + 1 + ]); + } + if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.x) { + uniformValues.uRXByLifeTimeValue = rotationOverLifetime.x.toUniform(vertexKeyFrameMeta); + shaderCacheId |= 1 << 16; + macros.push([ + "ROT_X_LIFETIME", + 1 + ]); + } + if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.y) { + uniformValues.uRYByLifeTimeValue = rotationOverLifetime.y.toUniform(vertexKeyFrameMeta); + shaderCacheId |= 1 << 17; + macros.push([ + "ROT_Y_LIFETIME", + 1 + ]); + } + if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.asRotation) { + macros.push([ + "ROT_LIFETIME_AS_MOVEMENT", + 1 + ]); + shaderCacheId |= 1 << 18; + } + uniformValues.uGravityModifierValue = gravityModifier.toUniform(vertexKeyFrameMeta); + if (forceTarget) { + macros.push([ + "FINAL_TARGET", + true + ]); + shaderCacheId |= 1 << 19; + uniformValues.uFinalTarget = new Float32Array(forceTarget.target || [ + 0, + 0, + 0 + ]); + uniformValues.uForceCurve = forceTarget.curve.toUniform(vertexKeyFrameMeta); + } + if (halfFloatTexture && fragmentKeyFrameMeta.max) { + shaderCacheId |= 1 << 20; + uniformValues.uFCurveValueTexture = generateHalfFloatTexture(engine, ValueGetter.getAllData(fragmentKeyFrameMeta, true), fragmentKeyFrameMeta.index, 1); + } else { + uniformValues.uFCurveValues = ValueGetter.getAllData(fragmentKeyFrameMeta); + } + var vertexCurveTexture = vertexKeyFrameMeta.max + vertexKeyFrameMeta.curves.length - 32 > maxVertexUniforms; + // if (getConfig(RENDER_PREFER_LOOKUP_TEXTURE)) { + // vertexCurveTexture = true; + // } + if (level === 2) { + vertexKeyFrameMeta.max = -1; + vertexKeyFrameMeta.index = meshSlots ? meshSlots[0] : getSlot(vertexKeyFrameMeta.index); + if (fragmentKeyFrameMeta.index > 0) { + fragmentKeyFrameMeta.max = -1; + fragmentKeyFrameMeta.index = meshSlots ? meshSlots[1] : getSlot(fragmentKeyFrameMeta.index); + } + } + if (vertexCurveTexture && halfFloatTexture && enableVertexTexture) { + var tex = generateHalfFloatTexture(engine, ValueGetter.getAllData(vertexKeyFrameMeta, true), vertexKeyFrameMeta.index, 1); + uniformValues.uVCurveValueTexture = tex; + vertex_lookup_texture = 1; + } else { + uniformValues.uVCurveValues = ValueGetter.getAllData(vertexKeyFrameMeta); + } + var shaderCache = [ + "-p:", + renderMode, + shaderCacheId, + vertexKeyFrameMeta.index, + vertexKeyFrameMeta.max, + fragmentKeyFrameMeta.index, + fragmentKeyFrameMeta.max + ].join("+"); + macros.push([ + "VERT_CURVE_VALUE_COUNT", + vertexKeyFrameMeta.index + ], [ + "FRAG_CURVE_VALUE_COUNT", + fragmentKeyFrameMeta.index + ], [ + "VERT_MAX_KEY_FRAME_COUNT", + vertexKeyFrameMeta.max + ], [ + "FRAG_MAX_KEY_FRAME_COUNT", + fragmentKeyFrameMeta.max + ]); + this.VERT_MAX_KEY_FRAME_COUNT = vertexKeyFrameMeta.max; + var fragment = particleFrag; + var originalVertex = "#define LOOKUP_TEXTURE_CURVE " + vertex_lookup_texture + "\n" + particleVert; + var vertex = originalVertex; + var shader = { + fragment: fragment, + vertex: vertex, + glslVersion: level === 1 ? exports.GLSLVersion.GLSL1 : exports.GLSLVersion.GLSL3, + shared: true, + cacheId: shaderCache, + macros: macros, + name: "particle#" + name + }; + var mtlOptions = { + shader: shader, + uniformSemantics: { + effects_MatrixV: "VIEW", + effects_MatrixVP: "VIEWPROJECTION", + uEditorTransform: "EDITOR_TRANSFORM", + effects_ObjectToWorld: "MODEL" + } + }; + var preMulAlpha = getPreMultiAlpha(blending); + uniformValues.uTexOffset = new Float32Array(diffuse ? [ + 1 / diffuse.getWidth(), + 1 / diffuse.getHeight() + ] : [ + 0, + 0 + ]); + uniformValues.uMaskTex = diffuse; + uniformValues.uColorParams = new Float32Array([ + diffuse ? 1 : 0, + +preMulAlpha, + 0, + +(!!occlusion && !transparentOcclusion) + ]); + uniformValues.uParams = [ + 0, + 0, + 0, + 0 + ]; + uniformValues.uAcceleration = [ + (gravity == null ? void 0 : gravity[0]) || 0, + (gravity == null ? void 0 : gravity[1]) || 0, + (gravity == null ? void 0 : gravity[2]) || 0, + 0 + ]; + // mtlOptions.uniformValues = uniformValues; + var material = Material.create(engine, mtlOptions); + material.blending = true; + material.depthTest = true; + material.depthMask = !!occlusion; + material.stencilRef = mask ? [ + mask, + mask + ] : undefined; + setMaskMode(material, maskMode); + setBlendMode(material, blending); + setSideMode(material, side); + Object.keys(uniformValues).map(function(name) { + var value = uniformValues[name]; + if (_instanceof1(value, Texture)) { + material.setTexture(name, value); + return; + } + var res = []; + switch(particleUniformTypeMap[name]){ + case "vec4": + material.setVector4(name, Vector4$1.fromArray(value)); + break; + case "vec3": + material.setVector3(name, Vector3.fromArray(value)); + break; + case "vec2": + material.setVector2(name, Vector2.fromArray(value)); + break; + case "vec4Array": + for(var i = 0; i < value.length; i = i + 4){ + var v = new Vector4$1(value[i], value[i + 1], value[i + 2], value[i + 3]); + res.push(v); + } + material.setVector4Array(name, res); + res.length = 0; + break; + default: + console.warn("Uniform " + name + "'s type not in typeMap."); + } + }); + material.setVector3("emissionColor", new Vector3(0, 0, 0)); + material.setFloat("emissionIntensity", 0.0); + var geometry = Geometry.create(engine, generateGeometryProps(maxCount * 4, this.useSprite, "particle#" + name)); + var mesh = Mesh.create(engine, { + name: "MParticle_" + name, + // priority: listIndex, + material: material, + geometry: geometry + }); + this.anchor = anchor; + this.mesh = mesh; + this.geometry = mesh.firstGeometry(); + this.forceTarget = forceTarget; + this.sizeOverLifetime = sizeOverLifetime; + this.speedOverLifetime = speedOverLifetime; + this.linearVelOverLifetime = linearVelOverLifetime; + this.orbitalVelOverLifetime = orbitalVelOverLifetime; + this.orbitalVelOverLifetime = orbitalVelOverLifetime; + this.gravityModifier = gravityModifier; + this.rotationOverLifetime = rotationOverLifetime; + this.maxCount = maxCount; + // this.duration = duration; + this.textureOffsets = textureFlip ? [ + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1 + ] : [ + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ]; + this.time = 0; + } + var _proto = ParticleMesh.prototype; + // get time () { + // // const value = this.mesh.material.getVector4('uParams')!; + // // return value.x; + // return this._time; + // } + // set time (value: number) { + // this._time = value; + // // this.mesh.material.setVector4('uParams', new Vector4(+v, this.duration, 0, 0)); + // } + _proto.getPointColor = function getPointColor(index) { + var data = this.geometry.getAttributeData("aRot"); + var i = index * 32 + 4; + assertExist(data); + return [ + data[i], + data[i + 1], + data[i + 2], + data[i + 3] + ]; + }; + _proto.clearPoints = function clearPoints() { + this.resetGeometryData(this.geometry); + this.particleCount = 0; + this.geometry.setDrawCount(0); + this.maxParticleBufferCount = 0; + }; + _proto.resetGeometryData = function resetGeometryData(geometry) { + var names = geometry.getAttributeNames(); + var index = geometry.getIndexData(); + for(var i = 0; i < names.length; i++){ + var name = names[i]; + var data = geometry.getAttributeData(name); + if (data) { + // @ts-expect-error + geometry.setAttributeData(name, new data.constructor(0)); + } + } + // @ts-expect-error + geometry.setIndexData(new index.constructor(0)); + }; + _proto.onUpdate = function onUpdate(dt) { + var aPosArray = this.geometry.getAttributeData("aPos"); // vector3 + var vertexCount = Math.ceil(aPosArray.length / 12); + this.applyTranslation(vertexCount, dt); + this.applyRotation(vertexCount, dt); + this.applyLinearMove(vertexCount, dt); + }; + _proto.minusTime = function minusTime(time) { + var aOffset = this.geometry.getAttributeData("aOffset"); + for(var i = 0; i < aOffset.length; i += 4){ + aOffset[i + 2] -= time; + } + this.geometry.setAttributeData("aOffset", aOffset); + this.time -= time; + }; + _proto.removePoint = function removePoint(index) { + if (index < this.particleCount) { + this.geometry.setAttributeSubData("aOffset", index * 16, new Float32Array(16)); + } + }; + _proto.setPoint = function setPoint(index, point) { + var maxCount = this.maxCount; + if (index < maxCount) { + var particleCount = index + 1; + var vertexCount = particleCount * 4; + var geometry = this.geometry; + var increaseBuffer = particleCount > this.maxParticleBufferCount; + var inc = 1; + if (this.particleCount > 300) { + inc = (this.particleCount + 100) / this.particleCount; + } else if (this.particleCount > 100) { + inc = 1.4; + } else if (this.particleCount > 0) { + inc = 2; + } + var pointData = { + aPos: new Float32Array(48), + aRot: new Float32Array(32), + aOffset: new Float32Array(16), + aTranslation: new Float32Array(12), + aLinearMove: new Float32Array(12), + aRotation0: new Float32Array(36) + }; + var useSprite = this.useSprite; + if (useSprite) { + pointData.aSprite = new Float32Array(12); + } + var tempPos = new Vector3(); + var tempQuat = new Quaternion(); + var scale = new Vector3(1, 1, 1); + point.transform.assignWorldTRS(tempPos, tempQuat, scale); + var tempEuler = Transform.getRotation(tempQuat, new Euler()); + var position = tempPos.toArray(); + var rotation = tempEuler.toArray(); + var offsets = this.textureOffsets; + var off = [ + 0, + 0, + point.delay, + point.lifetime + ]; + var wholeUV = [ + 0, + 0, + 1, + 1 + ]; + var vel = point.vel; + var color = point.color; + var sizeOffsets = [ + -.5, + .5, + -.5, + -.5, + .5, + .5, + .5, + -.5 + ]; + var seed = Math.random(); + var sprite; + if (useSprite) { + sprite = point.sprite; + } + for(var j = 0; j < 4; j++){ + var offset = j * 2; + var j3 = j * 3; + var j4 = j * 4; + var j12 = j * 12; + var j8 = j * 8; + pointData.aPos.set(position, j12); + vel.fill(pointData.aPos, j12 + 3); + pointData.aRot.set(rotation, j8); + pointData.aRot[j8 + 3] = seed; + pointData.aRot.set(color, j8 + 4); + if (useSprite) { + // @ts-expect-error + pointData.aSprite.set(sprite, j3); + } + var uv = point.uv || wholeUV; + if (uv) { + var uvy = useSprite ? 1 - offsets[offset + 1] : offsets[offset + 1]; + off[0] = uv[0] + offsets[offset] * uv[2]; + off[1] = uv[1] + uvy * uv[3]; + } + pointData.aOffset.set(off, j4); + var ji = j + j; + var sx = (sizeOffsets[ji] - this.anchor.x) * scale.x; + var sy = (sizeOffsets[ji + 1] - this.anchor.y) * scale.y; + for(var k = 0; k < 3; k++){ + pointData.aPos[j12 + 6 + k] = point.dirX.getElement(k) * sx; + pointData.aPos[j12 + 9 + k] = point.dirY.getElement(k) * sy; + } + } + var indexData = new Uint16Array([ + 0, + 1, + 2, + 2, + 1, + 3 + ].map(function(x) { + return x + index * 4; + })); + if (increaseBuffer) { + var baseIndexData = geometry.getIndexData(); + var idx = enlargeBuffer(baseIndexData, particleCount * 6, maxCount * 6, inc); + idx.set(indexData, index * 6); + geometry.setIndexData(idx); + this.maxParticleBufferCount = idx.length / 6; + } else { + geometry.setIndexSubData(index * 6, indexData); + } + Object.keys(pointData).forEach(function(name) { + var data = pointData[name]; + var attrSize = geometry.getAttributeStride(name) / Float32Array.BYTES_PER_ELEMENT; + if (increaseBuffer) { + var baseData = geometry.getAttributeData(name); + assertExist(baseData); + var geoData = enlargeBuffer(baseData, vertexCount * attrSize, maxCount * 4 * attrSize, inc); + geoData.set(data, data.length * index); + geometry.setAttributeData(name, geoData); + } else { + geometry.setAttributeSubData(name, data.length * index, data); + } + }); + this.particleCount = Math.max(particleCount, this.particleCount); + geometry.setDrawCount(this.particleCount * 6); + } + }; + _proto.applyTranslation = function applyTranslation(vertexCount, deltaTime) { + var localTime = this.time; + var aTranslationArray = this.geometry.getAttributeData("aTranslation"); + var aVelArray = this.geometry.getAttributeData("aVel"); // vector3 + var aOffsetArray = this.geometry.getAttributeData("aOffset"); + if (aTranslationArray.length < vertexCount * 3) { + aTranslationArray = this.expandArray(aTranslationArray, vertexCount * 3); + } + // const velocity = this.cachedVelocity; + var velocityX = 0; + var velocityY = 0; + var velocityZ = 0; + var uAcceleration = this.mesh.material.getVector4("uAcceleration"); + var uGravityModifierValue = this.mesh.material.getVector4("uGravityModifierValue"); + for(var i = 0; i < vertexCount; i += 4){ + var velOffset = i * 12 + 3; + velocityX = aVelArray[velOffset]; + velocityY = aVelArray[velOffset + 1]; + velocityZ = aVelArray[velOffset + 2]; + // velocity.set(aVelArray[velOffset], aVelArray[velOffset + 1], aVelArray[velOffset + 2]); + var dt = localTime - aOffsetArray[i * 4 + 2]; // 相对delay的时间 + var duration = aOffsetArray[i * 4 + 3]; + if (uAcceleration && uGravityModifierValue) { + var d = this.gravityModifier.getIntegrateValue(0, dt, duration); + // const acc = this.tempVector3.set(uAcceleration.x * d, uAcceleration.y * d, uAcceleration.z * d); + var accX = uAcceleration.x * d; + var accY = uAcceleration.y * d; + var accZ = uAcceleration.z * d; + // speedIntegrate = speedOverLifetime.getIntegrateValue(0, time, duration); + if (this.speedOverLifetime) { + // dt / dur 归一化 + var speed = this.speedOverLifetime.getValue(dt / duration); + velocityX = velocityX * speed + accX; + velocityY = velocityY * speed + accY; + velocityZ = velocityZ * speed + accZ; + // velocity.multiply(speed).add(acc); + } else { + velocityX = velocityX + accX; + velocityY = velocityY + accY; + velocityZ = velocityZ + accZ; + // velocity.add(acc); + } + } + var aTranslationOffset = i * 3; + if (aOffsetArray[i * 4 + 2] < localTime) { + // const translation = velocity.multiply(deltaTime / 1000); + var aTranslationX = velocityX * (deltaTime / 1000); + var aTranslationY = velocityY * (deltaTime / 1000); + var aTranslationZ = velocityZ * (deltaTime / 1000); + aTranslationArray[aTranslationOffset] += aTranslationX; + aTranslationArray[aTranslationOffset + 1] += aTranslationY; + aTranslationArray[aTranslationOffset + 2] += aTranslationZ; + aTranslationArray[aTranslationOffset + 3] += aTranslationX; + aTranslationArray[aTranslationOffset + 4] += aTranslationY; + aTranslationArray[aTranslationOffset + 5] += aTranslationZ; + aTranslationArray[aTranslationOffset + 6] += aTranslationX; + aTranslationArray[aTranslationOffset + 7] += aTranslationY; + aTranslationArray[aTranslationOffset + 8] += aTranslationZ; + aTranslationArray[aTranslationOffset + 9] += aTranslationX; + aTranslationArray[aTranslationOffset + 10] += aTranslationY; + aTranslationArray[aTranslationOffset + 11] += aTranslationZ; + } + } + this.geometry.setAttributeData("aTranslation", aTranslationArray); + }; + _proto.applyRotation = function applyRotation(vertexCount, deltaTime) { + var aRotationArray = this.geometry.getAttributeData("aRotation0"); + var aOffsetArray = this.geometry.getAttributeData("aOffset"); + var aRotArray = this.geometry.getAttributeData("aRot"); // vector3 + var aSeedArray = this.geometry.getAttributeData("aSeed"); // float + var localTime = this.time; + var aRotationMatrix = this.cachedRotationMatrix; + if (aRotationArray.length < vertexCount * 9) { + aRotationArray = this.expandArray(aRotationArray, vertexCount * 9); + } + for(var i = 0; i < vertexCount; i += 4){ + var time = localTime - aOffsetArray[i * 4 + 2]; + var duration = aOffsetArray[i * 4 + 3]; + var life = clamp$1(time / duration, 0.0, 1.0); + var aRotOffset = i * 8; + var aRot = this.cachedRotationVector3.set(aRotArray[aRotOffset], aRotArray[aRotOffset + 1], aRotArray[aRotOffset + 2]); + var aSeed = aSeedArray[i * 8 + 3]; + var rotation = aRot; + if (!this.rotationOverLifetime) { + aRotationMatrix.setZero(); + } else { + // Adjust rotation based on the specified lifetime components + if (this.rotationOverLifetime.x) { + if (_instanceof1(this.rotationOverLifetime.x, RandomValue)) { + rotation.x += this.rotationOverLifetime.x.getValue(life, aSeed); + } else { + rotation.x += this.rotationOverLifetime.x.getValue(life); + } + } + if (this.rotationOverLifetime.y) { + if (_instanceof1(this.rotationOverLifetime.y, RandomValue)) { + rotation.y += this.rotationOverLifetime.y.getValue(life, aSeed); + } else { + rotation.y += this.rotationOverLifetime.y.getValue(life); + } + } + if (this.rotationOverLifetime.z) { + if (_instanceof1(this.rotationOverLifetime.z, RandomValue)) { + rotation.z += this.rotationOverLifetime.z.getValue(life, aSeed); + } else { + rotation.z += this.rotationOverLifetime.z.getValue(life); + } + } + } + // else { + // // Adjust rotation based on the specified lifetime components + // if (this.rotationOverLifetime.x) { + // if (this.rotationOverLifetime.x instanceof RandomValue) { + // rotation.x += this.rotationOverLifetime.x.getIntegrateValue(0.0, life, aSeed) * duration; + // } else { + // rotation.x += this.rotationOverLifetime.x.getIntegrateValue(0.0, life, duration) * duration; + // } + // } + // if (this.rotationOverLifetime.y) { + // if (this.rotationOverLifetime.y instanceof RandomValue) { + // rotation.y += this.rotationOverLifetime.y.getIntegrateValue(0.0, life, aSeed) * duration; + // } else { + // rotation.y += this.rotationOverLifetime.y.getIntegrateValue(0.0, life, duration) * duration; + // } + // } + // if (this.rotationOverLifetime.z) { + // if (this.rotationOverLifetime.z instanceof RandomValue) { + // rotation.z += this.rotationOverLifetime.z.getIntegrateValue(0.0, life, aSeed) * duration; + // } else { + // rotation.z += this.rotationOverLifetime.z.getIntegrateValue(0.0, life, duration) * duration; + // } + // } + // } + // If the rotation vector is zero, return the identity matrix + if (rotation.dot(rotation) === 0.0) { + aRotationMatrix.identity(); + } + var d2r = Math.PI / 180; + var rotationXD2r = rotation.x * d2r; + var rotationYD2r = rotation.y * d2r; + var rotationZD2r = rotation.z * d2r; + var sinRX = Math.sin(rotationXD2r); + var sinRY = Math.sin(rotationYD2r); + var sinRZ = Math.sin(rotationZD2r); + var cosRX = Math.cos(rotationXD2r); + var cosRY = Math.cos(rotationYD2r); + var cosRZ = Math.cos(rotationZD2r); + // rotZ * rotY * rotX + aRotationMatrix.set(cosRZ, -sinRZ, 0., sinRZ, cosRZ, 0., 0., 0., 1.); //rotZ + aRotationMatrix.multiply(this.tempMatrix3.set(cosRY, 0., sinRY, 0., 1., 0., -sinRY, 0, cosRY)); //rotY + aRotationMatrix.multiply(this.tempMatrix3.set(1., 0., 0., 0, cosRX, -sinRX, 0., sinRX, cosRX)); //rotX + var aRotationOffset = i * 9; + var matrixArray = aRotationMatrix.elements; + aRotationArray.set(matrixArray, aRotationOffset); + if (i + 4 <= vertexCount) { + aRotationArray.set(matrixArray, aRotationOffset + 9); + aRotationArray.set(matrixArray, aRotationOffset + 18); + aRotationArray.set(matrixArray, aRotationOffset + 27); + } + } + this.geometry.setAttributeData("aRotation0", aRotationArray); + }; + _proto.applyLinearMove = function applyLinearMove(vertexCount, deltaTime) { + var aLinearMoveArray = this.geometry.getAttributeData("aLinearMove"); + var aOffsetArray = this.geometry.getAttributeData("aOffset"); + var aSeedArray = this.geometry.getAttributeData("aSeed"); // float + var localTime = this.time; + if (aLinearMoveArray.length < vertexCount * 3) { + aLinearMoveArray = this.expandArray(aLinearMoveArray, vertexCount * 3); + } + var linearMove = this.cachedLinearMove; + if (this.linearVelOverLifetime && this.linearVelOverLifetime.enabled) { + for(var i = 0; i < vertexCount; i += 4){ + var time = localTime - aOffsetArray[i * 4 + 2]; + var duration = aOffsetArray[i * 4 + 3]; + // const life = math.clamp(time / duration, 0.0, 1.0); + var lifetime = time / duration; + var aSeed = aSeedArray[i * 8 + 3]; + linearMove.setZero(); + if (this.linearVelOverLifetime.asMovement) { + if (this.linearVelOverLifetime.x) { + if (_instanceof1(this.linearVelOverLifetime.x, RandomValue)) { + linearMove.x = this.linearVelOverLifetime.x.getValue(lifetime, aSeed); + } else { + linearMove.x = this.linearVelOverLifetime.x.getValue(lifetime); + } + } + if (this.linearVelOverLifetime.y) { + if (_instanceof1(this.linearVelOverLifetime.y, RandomValue)) { + linearMove.y = this.linearVelOverLifetime.y.getValue(lifetime, aSeed); + } else { + linearMove.y = this.linearVelOverLifetime.y.getValue(lifetime); + } + } + if (this.linearVelOverLifetime.z) { + if (_instanceof1(this.linearVelOverLifetime.z, RandomValue)) { + linearMove.z = this.linearVelOverLifetime.z.getValue(lifetime, aSeed); + } else { + linearMove.z = this.linearVelOverLifetime.z.getValue(lifetime); + } + } + } else { + // Adjust rotation based on the specified lifetime components + if (this.linearVelOverLifetime.x) { + if (_instanceof1(this.linearVelOverLifetime.x, RandomValue)) { + linearMove.x = this.linearVelOverLifetime.x.getIntegrateValue(0.0, time, aSeed); + } else { + linearMove.x = this.linearVelOverLifetime.x.getIntegrateValue(0.0, time, duration); + } + } + if (this.linearVelOverLifetime.y) { + if (_instanceof1(this.linearVelOverLifetime.y, RandomValue)) { + linearMove.y = this.linearVelOverLifetime.y.getIntegrateValue(0.0, time, aSeed); + } else { + linearMove.y = this.linearVelOverLifetime.y.getIntegrateValue(0.0, time, duration); + } + } + if (this.linearVelOverLifetime.z) { + if (_instanceof1(this.linearVelOverLifetime.z, RandomValue)) { + linearMove.z = this.linearVelOverLifetime.z.getIntegrateValue(0.0, time, aSeed); + } else { + linearMove.z = this.linearVelOverLifetime.z.getIntegrateValue(0.0, time, duration); + } + } + } + var aLinearMoveOffset = i * 3; + aLinearMoveArray[aLinearMoveOffset] = linearMove.x; + aLinearMoveArray[aLinearMoveOffset + 1] = linearMove.y; + aLinearMoveArray[aLinearMoveOffset + 2] = linearMove.z; + aLinearMoveArray[aLinearMoveOffset + 3] = linearMove.x; + aLinearMoveArray[aLinearMoveOffset + 4] = linearMove.y; + aLinearMoveArray[aLinearMoveOffset + 5] = linearMove.z; + aLinearMoveArray[aLinearMoveOffset + 6] = linearMove.x; + aLinearMoveArray[aLinearMoveOffset + 7] = linearMove.y; + aLinearMoveArray[aLinearMoveOffset + 8] = linearMove.z; + aLinearMoveArray[aLinearMoveOffset + 9] = linearMove.x; + aLinearMoveArray[aLinearMoveOffset + 10] = linearMove.y; + aLinearMoveArray[aLinearMoveOffset + 11] = linearMove.z; + } + } + this.geometry.setAttributeData("aLinearMove", aLinearMoveArray); + }; + _proto.expandArray = function expandArray(array, newSize) { + var newArr = new Float32Array(newSize); + newArr.set(array); + return newArr; + }; + return ParticleMesh; +}(); +var gl2UniformSlots = [ + 10, + 32, + 64, + 160 +]; +function getSlot(count) { + for(var w = 0; w < gl2UniformSlots.length; w++){ + var slot = gl2UniformSlots[w]; + if (slot > count) { + return slot; + } + } + return count || gl2UniformSlots[0]; +} +function generateGeometryProps(maxVertex, useSprite, name) { + var bpe = Float32Array.BYTES_PER_ELEMENT; + var j12 = bpe * 12; + var attributes = { + aPos: { + size: 3, + offset: 0, + stride: j12, + data: new Float32Array(0) + }, + aVel: { + size: 3, + offset: 3 * bpe, + stride: j12, + dataSource: "aPos" + }, + aDirX: { + size: 3, + offset: 6 * bpe, + stride: j12, + dataSource: "aPos" + }, + aDirY: { + size: 3, + offset: 9 * bpe, + stride: j12, + dataSource: "aPos" + }, + // + aRot: { + size: 3, + offset: 0, + stride: 8 * bpe, + data: new Float32Array(0) + }, + aSeed: { + size: 1, + offset: 3 * bpe, + stride: 8 * bpe, + dataSource: "aRot" + }, + aColor: { + size: 4, + offset: 4 * bpe, + stride: 8 * bpe, + dataSource: "aRot" + }, + // + aOffset: { + size: 4, + stride: 4 * bpe, + data: new Float32Array(0) + }, + aTranslation: { + size: 3, + data: new Float32Array(0) + }, + aLinearMove: { + size: 3, + data: new Float32Array(0) + }, + aRotation0: { + size: 3, + offset: 0, + stride: 9 * bpe, + data: new Float32Array(0) + }, + aRotation1: { + size: 3, + offset: 3 * bpe, + stride: 9 * bpe, + dataSource: "aRotation0" + }, + aRotation2: { + size: 3, + offset: 6 * bpe, + stride: 9 * bpe, + dataSource: "aRotation0" + } + }; + if (useSprite) { + attributes["aSprite"] = { + size: 3, + stride: 3 * bpe, + data: new Float32Array(0) + }; + } + return { + attributes: attributes, + indices: { + data: new Uint16Array(0) + }, + name: name, + maxVertex: maxVertex + }; +} +function getParticleMeshShader(item, gpuCapability, env) { + if (env === void 0) env = ""; + var _props_renderer; + var props = item.content; + var renderMode = +(((_props_renderer = props.renderer) == null ? void 0 : _props_renderer.renderMode) || 0); + var macros = [ + [ + "RENDER_MODE", + renderMode + ], + [ + "ENV_EDITOR", + env === PLAYER_OPTIONS_ENV_EDITOR + ] + ]; + var level = gpuCapability.level, detail = gpuCapability.detail; + var vertexKeyFrameMeta = createKeyFrameMeta(); + var fragmentKeyFrameMeta = createKeyFrameMeta(); + var enableVertexTexture = detail.maxVertexUniforms > 0; + var _props_positionOverLifetime; + var speedOverLifetime = ((_props_positionOverLifetime = props.positionOverLifetime) != null ? _props_positionOverLifetime : {}).speedOverLifetime; + var vertex_lookup_texture = 0; + var shaderCacheId = 0; + if (enableVertexTexture) { + macros.push([ + "ENABLE_VERTEX_TEXTURE", + true + ]); + } + if (speedOverLifetime) { + macros.push([ + "SPEED_OVER_LIFETIME", + true + ]); + shaderCacheId |= 1 << 1; + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, speedOverLifetime); + } + var sprite = props.textureSheetAnimation; + if (sprite && sprite.animate) { + macros.push([ + "USE_SPRITE", + true + ]); + shaderCacheId |= 1 << 2; + } + var colorOverLifetime = props.colorOverLifetime; + if (colorOverLifetime && colorOverLifetime.color) { + macros.push([ + "COLOR_OVER_LIFETIME", + true + ]); + shaderCacheId |= 1 << 4; + } + var opacity = colorOverLifetime && colorOverLifetime.opacity; + if (opacity) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, opacity); + } + var positionOverLifetime = props.positionOverLifetime; + var useOrbitalVel; + [ + "x", + "y", + "z" + ].forEach(function(pro, i) { + var defL = 0; + var linearPro = "linear" + pro.toUpperCase(); + var orbitalPro = "orbital" + pro.toUpperCase(); + if (positionOverLifetime == null ? void 0 : positionOverLifetime[linearPro]) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime[linearPro]); + defL = 1; + shaderCacheId |= 1 << 7 + i; + } + macros.push([ + "LINEAR_VEL_" + pro.toUpperCase(), + defL + ]); + var defO = 0; + if (positionOverLifetime == null ? void 0 : positionOverLifetime[orbitalPro]) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime[orbitalPro]); + defO = 1; + shaderCacheId |= 1 << 10 + i; + useOrbitalVel = true; + } + macros.push([ + "ORB_VEL_" + pro.toUpperCase(), + defO + ]); + }); + if (positionOverLifetime == null ? void 0 : positionOverLifetime.asMovement) { + macros.push([ + "AS_LINEAR_MOVEMENT", + true + ]); + shaderCacheId |= 1 << 5; + } + if (useOrbitalVel) { + if (positionOverLifetime == null ? void 0 : positionOverLifetime.asRotation) { + macros.push([ + "AS_ORBITAL_MOVEMENT", + true + ]); + shaderCacheId |= 1 << 6; + } + } + if (props.sizeOverLifetime) { + var sizeOverLifetime = props.sizeOverLifetime; + var separateAxes = sizeOverLifetime.separateAxes; + if (separateAxes) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.x); + macros.push([ + "SIZE_Y_BY_LIFE", + 1 + ]); + shaderCacheId |= 1 << 14; + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.y); + } else { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.size); + } + } + if (props.rotationOverLifetime) { + var rot = props.rotationOverLifetime; + if (rot.z) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot == null ? void 0 : rot.z); + shaderCacheId |= 1 << 15; + macros.push([ + "ROT_Z_LIFETIME", + 1 + ]); + } + if (rot.separateAxes) { + if (rot.x) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot.x); + shaderCacheId |= 1 << 16; + macros.push([ + "ROT_X_LIFETIME", + 1 + ]); + } + if (rot.y) { + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot.y); + shaderCacheId |= 1 << 17; + macros.push([ + "ROT_Y_LIFETIME", + 1 + ]); + } + } + if (rot == null ? void 0 : rot.asRotation) { + macros.push([ + "ROT_LIFETIME_AS_MOVEMENT", + 1 + ]); + shaderCacheId |= 1 << 18; + } + } + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime == null ? void 0 : positionOverLifetime.gravityOverLifetime); + var forceOpt = positionOverLifetime == null ? void 0 : positionOverLifetime.forceTarget; + if (forceOpt) { + macros.push([ + "FINAL_TARGET", + true + ]); + shaderCacheId |= 1 << 19; + getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime.forceCurve); + } + var HALF_FLOAT = detail.halfFloatTexture; + if (HALF_FLOAT && fragmentKeyFrameMeta.max) { + shaderCacheId |= 1 << 20; + } + var maxVertexUniforms = detail.maxVertexUniforms; + var vertexCurveTexture = vertexKeyFrameMeta.max + vertexKeyFrameMeta.curves.length - 32 > maxVertexUniforms; + if (getConfig(RENDER_PREFER_LOOKUP_TEXTURE)) { + vertexCurveTexture = true; + } + if (level === 2) { + vertexKeyFrameMeta.max = -1; + // vertexKeyFrameMeta.index = getSlot(vertexKeyFrameMeta.index); + if (fragmentKeyFrameMeta.index > 0) { + fragmentKeyFrameMeta.max = -1; + // fragmentKeyFrameMeta.index = getSlot(fragmentKeyFrameMeta.index); + } + } + if (vertexCurveTexture && HALF_FLOAT && enableVertexTexture) { + vertex_lookup_texture = 1; + } + var shaderCache = [ + "-p:", + renderMode, + shaderCacheId, + vertexKeyFrameMeta.index, + vertexKeyFrameMeta.max, + fragmentKeyFrameMeta.index, + fragmentKeyFrameMeta.max + ].join("+"); + var shader = { + fragment: particleFrag, + vertex: "#define LOOKUP_TEXTURE_CURVE " + vertex_lookup_texture + "\n" + particleVert, + shared: true, + cacheId: shaderCache, + macros: macros, + name: "particle#" + item.name + }; + macros.push([ + "VERT_CURVE_VALUE_COUNT", + vertexKeyFrameMeta.index + ], [ + "FRAG_CURVE_VALUE_COUNT", + fragmentKeyFrameMeta.index + ], [ + "VERT_MAX_KEY_FRAME_COUNT", + vertexKeyFrameMeta.max + ], [ + "FRAG_MAX_KEY_FRAME_COUNT", + fragmentKeyFrameMeta.max + ]); + return { + shader: shader, + vertex: vertexKeyFrameMeta.index, + fragment: fragmentKeyFrameMeta.index + }; +} +function modifyMaxKeyframeShader(shader, maxVertex, maxFrag) { + var _shader_cacheId; + var shaderIds = (_shader_cacheId = shader.cacheId) == null ? void 0 : _shader_cacheId.split("+"); + shaderIds[3] = maxVertex; + shaderIds[5] = maxFrag; + shader.cacheId = shaderIds.join("+"); + if (!shader.macros) { + return; + } + for(var i = 0; i < shader.macros.length; i++){ + var marco = shader.macros[i]; + if (marco[0] === "VERT_CURVE_VALUE_COUNT") { + marco[1] = maxVertex; + } else if (marco[0] === "FRAG_CURVE_VALUE_COUNT") { + marco[1] = maxFrag; + break; + } + } +} + +/** + * @since 2.0.0 + */ var ParticleSystemRenderer = /*#__PURE__*/ function(RendererComponent) { + _inherits(ParticleSystemRenderer, RendererComponent); + function ParticleSystemRenderer(engine, particleMeshProps, trailMeshProps) { + var _this; + _this = RendererComponent.call(this, engine) || this; + _this.name = "ParticleSystemRenderer"; + if (particleMeshProps) { + _this.particleMesh = new ParticleMesh(engine, particleMeshProps); + } + if (trailMeshProps) { + _this.trailMesh = new TrailMesh(engine, trailMeshProps); + } + var meshes = [ + _this.particleMesh.mesh + ]; + _this.materials.push(_this.particleMesh.mesh.material); + if (_this.trailMesh) { + meshes.push(_this.trailMesh.mesh); + _this.materials.push(_this.trailMesh.mesh.material); + } + _this.meshes = meshes; + return _this; + } + var _proto = ParticleSystemRenderer.prototype; + _proto.onStart = function onStart() { + this._priority = this.item.renderOrder; + this.particleMesh.gravityModifier.scaleXCoord(this.item.duration); + for(var _iterator = _create_for_of_iterator_helper_loose(this.meshes), _step; !(_step = _iterator()).done;){ + var mesh = _step.value; + mesh.onStart(); + } + }; + _proto.onUpdate = function onUpdate(dt) { + var time = this.particleMesh.time; + var _this_particleMesh_mesh_material_getVector4; + var uParams = (_this_particleMesh_mesh_material_getVector4 = this.particleMesh.mesh.material.getVector4("uParams")) != null ? _this_particleMesh_mesh_material_getVector4 : new Vector4$1(); + this.particleMesh.mesh.material.setVector4("uParams", uParams.set(time, this.item.duration, 0, 0)); + }; + _proto.render = function render(renderer) { + this.maskManager.drawStencilMask(renderer); + for(var _iterator = _create_for_of_iterator_helper_loose(this.meshes), _step; !(_step = _iterator()).done;){ + var mesh = _step.value; + mesh.render(renderer); + } + }; + _proto.reset = function reset() { + var _this_trailMesh; + this.particleMesh.clearPoints(); + (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.clearAllTrails(); + }; + _proto.updateTime = function updateTime(now, delta) { + this.particleMesh.time = now; + this.particleMesh.onUpdate(delta); + if (this.trailMesh) { + this.trailMesh.time = now; + this.trailMesh.onUpdate(delta); + } + }; + _proto.minusTimeForLoop = function minusTimeForLoop(duration) { + var _this_trailMesh; + this.particleMesh.minusTime(duration); + (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.minusTime(duration); + }; + _proto.updateWorldMatrix = function updateWorldMatrix(worldMatrix) { + this.particleMesh.mesh.worldMatrix = worldMatrix; + if (this.trailMesh) { + this.trailMesh.mesh.worldMatrix = worldMatrix; + } + }; + _proto.setVisible = function setVisible(visible) { + var _this_trailMesh; + this.particleMesh.mesh.setVisible(visible); + (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.mesh.setVisible(visible); + }; + _proto.getTextures = function getTextures() { + var textures = []; + // @ts-expect-error textures 是否可以考虑挂在 Material 上 + var particleMeshTextures = this.particleMesh.mesh.material.textures; + Object.keys(particleMeshTextures).forEach(function(key) { + textures.push(particleMeshTextures[key]); + }); + if (this.trailMesh) { + // @ts-expect-error 同上 + var trailMeshTextures = this.trailMesh.mesh.material.textures; + Object.keys(trailMeshTextures).forEach(function(key) { + textures.push(trailMeshTextures[key]); + }); + } + return textures; + }; + _proto.setParticlePoint = function setParticlePoint(index, point) { + this.particleMesh.setPoint(index, point); + }; + _proto.removeParticlePoint = function removeParticlePoint(index) { + this.particleMesh.removePoint(index); + }; + _proto.getParticlePointColor = function getParticlePointColor(index) { + return this.particleMesh.getPointColor(index); + }; + _proto.hasTrail = function hasTrail() { + return this.trailMesh !== undefined; + }; + _proto.clearTrail = function clearTrail(pointIndex) { + var _this_trailMesh; + (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.clearTrail(pointIndex); + }; + _proto.addTrailPoint = function addTrailPoint(index, position, options) { + var _this_trailMesh; + (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.addPoint(index, position, options); + }; + _proto.setTrailStartPosition = function setTrailStartPosition(index, position) { + var _this_trailMesh; + (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.setPointStartPos(index, position); + }; + _proto.getTrailStartPosition = function getTrailStartPosition(index) { + return this.trailMesh.getPointStartPos(index); + }; + return ParticleSystemRenderer; +}(RendererComponent); + +exports.ParticleSystem = /*#__PURE__*/ function(Component) { + _inherits(ParticleSystem, Component); + function ParticleSystem(engine, props) { + var _this; + _this = Component.call(this, engine) || this; + _this.destroyed = false; + _this.getHitTestParams = function(force) { + var interactParams = _this.interaction; + if (force || interactParams) { + return { + type: exports.HitTestType.custom, + collect: function(ray) { + return _this.raycast({ + radius: (interactParams == null ? void 0 : interactParams.radius) || 0.4, + multiple: !!(interactParams == null ? void 0 : interactParams.multiple), + removeParticle: (interactParams == null ? void 0 : interactParams.behavior) === ParticleInteractionBehavior.removeParticle, + ray: ray + }); + } + }; + } + }; + _this.maskManager = new MaskProcessor(engine); + if (props) { + _this.fromData(props); + } + return _this; + } + var _proto = ParticleSystem.prototype; + _proto.isFrozen = function isFrozen() { + return this.frozen; + }; + _proto.isEnded = function isEnded() { + return this.ended; + }; + _proto.initEmitterTransform = function initEmitterTransform() { + var position = this.item.transform.position.clone(); + var rotation = this.item.transform.rotation.clone(); + var transformPath = this.props.emitterTransform && this.props.emitterTransform.path; + var path; + if (transformPath) { + if (transformPath[0] === ValueType.CONSTANT_VEC3) { + position.add(transformPath[1]); + } else { + path = createValueGetter(transformPath); + } + } + this.basicTransform = { + position: position, + rotation: rotation, + path: path + }; + var selfPos = position.clone(); + if (path) { + selfPos.add(path.getValue(0)); + } + this.transform.setPosition(selfPos.x, selfPos.y, selfPos.z); + if (this.options.particleFollowParent) { + var worldMatrix = this.transform.getWorldMatrix(); + this.renderer.updateWorldMatrix(worldMatrix); + } + }; + _proto.updateEmitterTransform = function updateEmitterTransform(time) { + var _this_basicTransform = this.basicTransform, path = _this_basicTransform.path, position = _this_basicTransform.position; + var selfPos = position.clone(); + if (path) { + var duration = this.item.duration; + selfPos.add(path.getValue(time / duration)); + } + this.transform.setPosition(selfPos.x, selfPos.y, selfPos.z); + if (this.options.particleFollowParent) { + var worldMatrix = this.transform.getWorldMatrix(); + this.renderer.updateWorldMatrix(worldMatrix); + } + }; + _proto.addParticle = function addParticle(point, maxCount) { + var link = this.particleLink; + var linkContent = [ + point.delay + point.lifetime, + 0, + point.delay, + point + ]; + var pointIndex; + if (link.length < maxCount) { + pointIndex = linkContent[1] = link.length; + } else { + var first = link.first; + link.removeNode(first); + pointIndex = linkContent[1] = first.content[1]; + } + link.pushNode(linkContent); + this.renderer.setParticlePoint(pointIndex, point); + this.clearPointTrail(pointIndex); + if (this.transform.parentTransform) { + this.renderer.setTrailStartPosition(pointIndex, this.transform.parentTransform.position.clone()); + } + }; + _proto.setVisible = function setVisible(visible) { + this.renderer.setVisible(visible); + }; + _proto.setOpacity = function setOpacity(opacity) { + var _material_getVector4; + var material = this.renderer.particleMesh.mesh.material; + var geometry = this.renderer.particleMesh.mesh.geometry; + var originalColor = ((_material_getVector4 = material.getVector4("uOpacityOverLifetimeValue")) == null ? void 0 : _material_getVector4.toArray()) || [ + 1, + 1, + 1, + 1 + ]; + material.setVector4("uOpacityOverLifetimeValue", new Vector4$1(originalColor[0], originalColor[1], originalColor[2], opacity)); + var data = geometry.getAttributeData("aColor") || []; + for(var i = 0; i < data.length; i += 32){ + data[i * 8 + 7] = opacity; + } + }; + /** + * @internal + */ _proto.setColor = function setColor(r, g, b, a) { + var _material_getVector4; + var material = this.renderer.particleMesh.mesh.material; + var geometry = this.renderer.particleMesh.mesh.geometry; + var originalColor = ((_material_getVector4 = material.getVector4("uOpacityOverLifetimeValue")) == null ? void 0 : _material_getVector4.toArray()) || [ + 1, + 1, + 1, + 1 + ]; + material.setVector4("uOpacityOverLifetimeValue", new Vector4$1(originalColor[0], originalColor[1], originalColor[2], a)); + var data = geometry.getAttributeData("aColor") || []; + for(var i = 0; i < data.length; i += 32){ + data[i * 8 + 4] = r; + data[i * 8 + 5] = g; + data[i * 8 + 6] = b; + data[i * 8 + 7] = a; + } + }; + _proto.setParentTransform = function setParentTransform(transform) {}; + _proto.getTextures = function getTextures() { + return this.renderer.getTextures(); + }; + _proto.startEmit = function startEmit() { + if (!this.started || this.ended) { + this.reset(); + this.started = true; + this.ended = false; + } + }; + _proto.stop = function stop() { + this.ended = true; + this.started = false; + }; + _proto.reset = function reset() { + this.renderer.reset(); + this.lastUpdate = 0; + this.loopStartTime = 0; + this.lastEmitTime = -1 / this.emission.rateOverTime.getValue(0); + this.generatedCount = 0; + this.particleLink = new Link(function(a, b) { + return a[0] - b[0]; + }); + this.emission.bursts.forEach(function(b) { + return b.reset(); + }); + this.frozen = false; + this.ended = false; + this.destroyed = false; + }; + _proto.update = function update(delta) { + var _this = this; + if (this.started && !this.frozen) { + var now = this.lastUpdate + delta / 1000; + var options = this.options; + var loopStartTime = this.loopStartTime; + var emission = this.emission; + this.lastUpdate = now; + this.upDirectionWorld = null; + this.renderer.updateTime(now, delta); + var link = this.particleLink; + var emitterLifetime = (now - loopStartTime) / this.item.duration; + var timePassed = this.timePassed; + var trailUpdated = false; + var updateTrail = function() { + if (_this.trails && !trailUpdated) { + trailUpdated = true; + link.forEach(function(param) { + var time = param[0], pointIndex = param[1], delay = param[2], point = param[3]; + if (time < timePassed) { + _this.clearPointTrail(pointIndex); + } else if (timePassed > delay) { + _this.updatePointTrail(pointIndex, emitterLifetime, point, delay); + } + }); + } + }; + if (!this.ended) { + var duration = this.item.duration; + var lifetime = this.lifetime; + if (timePassed < duration) { + var interval = 1 / emission.rateOverTime.getValue(lifetime); + var pointCount = Math.floor((timePassed - this.lastEmitTime) / interval); + var maxEmissionCount = pointCount; + var timeDelta = interval / pointCount; + var meshTime = now; + var maxCount = options.maxCount; + this.updateEmitterTransform(timePassed); + var shouldSkipGenerate = function() { + var first = link.first; + return _this.emissionStopped || link.length === maxCount && first && first.content[0] - loopStartTime > timePassed; + }; + for(var i = 0; i < maxEmissionCount && i < maxCount; i++){ + if (shouldSkipGenerate()) { + break; + } + var p = this.createPoint(lifetime); + p.delay += meshTime + i * timeDelta; + this.addParticle(p, maxCount); + this.lastEmitTime = timePassed; + } + var bursts = emission.bursts; + for(var j = (bursts == null ? void 0 : bursts.length) - 1, cursor = 0; j >= 0 && cursor < maxCount; j--){ + if (shouldSkipGenerate()) { + break; + } + var burst = bursts[j]; + var opts = !burst.disabled && burst.getGeneratorOptions(timePassed, lifetime); + if (opts) { + var originVec = [ + 0, + 0, + 0 + ]; + var offsets = emission.burstOffsets[j]; + var burstOffset = offsets && offsets[opts.cycleIndex] || originVec; + if (burst.once) { + this.removeBurst(j); + } + for(var i1 = 0; i1 < opts.count && cursor < maxCount; i1++){ + var _p_transform; + if (shouldSkipGenerate()) { + break; + } + var p1 = this.initPoint(this.shape.generate({ + total: opts.total, + index: opts.index, + burstIndex: i1, + burstCount: opts.count + })); + p1.delay += meshTime; + cursor++; + (_p_transform = p1.transform).translate.apply(_p_transform, [].concat(burstOffset)); + this.addParticle(p1, maxCount); + } + } + } + } else if (this.item.endBehavior === EndBehavior.restart) { + updateTrail(); + this.loopStartTime = now - duration; + this.lastEmitTime -= duration; + this.lastUpdate -= duration; + emission.bursts.forEach(function(b) { + return b.reset(); + }); + this.particleLink.forEach(function(content) { + content[0] -= duration; + content[2] -= duration; + content[3].delay -= duration; + }); + this.renderer.minusTimeForLoop(duration); + } else { + this.ended = true; + var endBehavior = this.item.endBehavior; + if (endBehavior === EndBehavior.freeze) { + this.frozen = true; + } + } + } else if (this.item.endBehavior !== EndBehavior.restart) { + if (EndBehavior.destroy === this.item.endBehavior) { + var node = link.last; + if (node && node.content[0] < this.lastUpdate) { + this.destroyed = true; + } + } + } + updateTrail(); + } + }; + _proto.onDestroy = function onDestroy() { + if (this.item && this.item.composition) { + this.meshes.forEach(function(mesh) { + return mesh.dispose({ + material: { + textures: exports.DestroyOptions.keep + } + }); + }); + } + }; + _proto.getParticleBoxes = function getParticleBoxes() { + var link = this.particleLink; + var renderer = this.renderer; + var res = []; + var maxCount = this.particleCount; + var counter = 0; + if (!(link && renderer)) { + return res; + } + var node = link.last; + var finish = false; + while(!finish){ + var currentTime = node.content[0]; + var point = node.content[3]; + if (currentTime > this.timePassed) { + var pos = this.getPointPosition(point); + res.push({ + center: pos, + size: point.transform.scale + }); + if (node.pre) { + node = node.pre; + } else { + finish = true; + } + } + counter++; + if (counter > maxCount) { + finish = true; + } + } + return res; + }; + _proto.raycast = function raycast(options) { + var link = this.particleLink; + var renderer = this.renderer; + if (!(link && renderer)) { + return; + } + var node = link.last; + var hitPositions = []; + var temp = new Vector3(); + var finish = false; + if (node && node.content) { + do { + var _node_content = node.content, currentTime = _node_content[0], pointIndex = _node_content[1]; _node_content[2]; var point = _node_content[3]; + if (currentTime > this.timePassed) { + var pos = this.getPointPosition(point); + var ray = options.ray; + var pass = false; + if (ray) { + pass = !!ray.intersectSphere({ + center: pos, + radius: options.radius + }, temp); + } + if (pass) { + if (options.removeParticle) { + renderer.removeParticlePoint(pointIndex); + this.clearPointTrail(pointIndex); + node.content = [ + 0 + ]; + } + hitPositions.push(pos); + if (!options.multiple) { + finish = true; + } + } + } else { + break; + } + // @ts-expect-error + }while ((node = node.pre) && !finish); + } + return hitPositions; + }; + _proto.clearPointTrail = function clearPointTrail(pointIndex) { + if (this.trails && this.trails.dieWithParticles) { + this.renderer.clearTrail(pointIndex); + } + }; + _proto.updatePointTrail = function updatePointTrail(pointIndex, emitterLifetime, point, startTime) { + var renderer = this.renderer; + if (!renderer.hasTrail()) { + return; + } + var trails = this.trails; + var position = this.getPointPosition(point); + var color = trails.inheritParticleColor ? renderer.getParticlePointColor(pointIndex) : [ + 1, + 1, + 1, + 1 + ]; + var size = point.transform.getWorldScale().toArray(); + var width = 1; + var lifetime = trails.lifetime.getValue(emitterLifetime); + if (trails.sizeAffectsWidth) { + width *= size[0]; + } + if (trails.sizeAffectsLifetime) { + lifetime *= size[0]; + } + if (trails.parentAffectsPosition && this.transform.parentTransform) { + position.add(this.transform.parentTransform.position); + var pos = renderer.getTrailStartPosition(pointIndex); + if (pos) { + position.subtract(pos); + } + } + renderer.addTrailPoint(pointIndex, position, { + color: color, + lifetime: lifetime, + size: width, + time: startTime + }); + }; + /** + * 通过索引获取指定index粒子当前时刻的位置 + * @params index - 粒子索引 + */ _proto.getPointPositionByIndex = function getPointPositionByIndex(index) { + var point = this.particleLink.getNodeByIndex(index); + if (!point) { + console.error("Get point error."); + return null; + } else { + return this.getPointPosition(point.content[3]); + } + }; + /** + * 通过粒子参数获取当前时刻粒子的位置 + */ _proto.getPointPosition = function getPointPosition(point) { + var transform = point.transform, vel = point.vel, lifetime = point.lifetime, delay = point.delay, _point_gravity = point.gravity, gravity = _point_gravity === void 0 ? [] : _point_gravity; + var forceTarget = this.options.forceTarget; + var time = this.lastUpdate - delay; + var tempPos = new Vector3(); + var acc = Vector3.fromArray(gravity); + transform.assignWorldTRS(tempPos); + var ret = calculateTranslation(new Vector3(), this.options, acc, time, lifetime, tempPos, vel); + if (forceTarget) { + var target = forceTarget.target || [ + 0, + 0, + 0 + ]; + var life = forceTarget.curve.getValue(time / lifetime); + var dl = 1 - life; + ret.x = ret.x * dl + target[0] * life; + ret.y = ret.y * dl + target[1] * life; + ret.z = ret.z * dl + target[2] * life; + } + return ret; + }; + _proto.initPoint = function initPoint(data) { + var options = this.options; + var lifetime = this.lifetime; + var shape = this.shape; + var speed = options.startSpeed.getValue(lifetime); + var matrix4 = options.particleFollowParent ? Matrix4$1.IDENTITY : this.transform.getWorldMatrix(); + var pointPosition = data.position; + // 粒子的位置受发射器的位置影响,自身的旋转和缩放不受影响 + var position = matrix4.transformPoint(pointPosition, new Vector3()); + var transform = new Transform({ + position: position, + valid: true + }); + var direction = data.direction; + direction = matrix4.transformNormal(direction, tempDir).normalize(); + if (options.startTurbulence && options.turbulence) { + for(var i = 0; i < 3; i++){ + tempVec3.setElement(i, options.turbulence[i].getValue(lifetime)); + } + tempEuler.setFromVector3(tempVec3.negate()); + var mat4 = tempMat4.setFromEuler(tempEuler); + mat4.transformNormal(direction).normalize(); + } + var dirX = tmpDirX; + var dirY = tmpDirY; + if (shape.alignSpeedDirection) { + dirY.copyFrom(direction); + if (!this.upDirectionWorld) { + if (shape.upDirection) { + this.upDirectionWorld = shape.upDirection.clone(); + } else { + this.upDirectionWorld = Vector3.Z.clone(); + } + matrix4.transformNormal(this.upDirectionWorld); + } + dirX.crossVectors(dirY, this.upDirectionWorld).normalize(); + // FIXME: 原先因为有精度问题,这里dirX不是0向量 + if (dirX.isZero()) { + dirX.set(1, 0, 0); + } + } else { + dirX.set(1, 0, 0); + dirY.set(0, 1, 0); + } + var sprite; + var tsa = this.textureSheetAnimation; + if (tsa && tsa.animate) { + sprite = tempSprite; + sprite[0] = tsa.animationDelay.getValue(lifetime); + sprite[1] = tsa.animationDuration.getValue(lifetime); + sprite[2] = tsa.cycles.getValue(lifetime); + } + var rot = tempRot$1; + if (options.start3DRotation) { + // @ts-expect-error + rot.set(options.startRotationX.getValue(lifetime), options.startRotationY.getValue(lifetime), options.startRotationZ.getValue(lifetime)); + } else if (options.startRotation) { + rot.set(0, 0, options.startRotation.getValue(lifetime)); + } else { + rot.set(0, 0, 0); + } + transform.setRotation(rot.x, rot.y, rot.z); + var color = options.startColor.getValue(lifetime); + if (color.length === 3) { + color[3] = 1; + } + var size = tempSize$1; + if (options.start3DSize) { + size.x = options.startSizeX.getValue(lifetime); + size.y = options.startSizeY.getValue(lifetime); + } else { + var n = options.startSize.getValue(lifetime); + var aspect = options.sizeAspect.getValue(lifetime); + size.x = n; + // 兼容aspect为0的情况 + size.y = aspect === 0 ? 0 : n / aspect; + // size[1] = n / aspect; + } + var vel = direction.clone(); + vel.multiply(speed); + // 粒子的大小受发射器父节点的影响 + if (!options.particleFollowParent) { + var tempScale = new Vector3(); + this.transform.assignWorldTRS(undefined, undefined, tempScale); + size.x *= tempScale.x; + size.y *= tempScale.y; + } + transform.setScale(size.x, size.y, 1); + return { + size: size, + vel: vel, + color: color, + delay: options.startDelay.getValue(lifetime), + lifetime: options.startLifetime.getValue(lifetime), + uv: randomArrItem(this.uvs, true), + gravity: options.gravity, + sprite: sprite, + dirY: dirY, + dirX: dirX, + transform: transform + }; + }; + _proto.addBurst = function addBurst(burst, offsets) { + var willAdd = false; + if (!this.emission.bursts.includes(burst)) { + this.emission.bursts.push(burst); + willAdd = true; + } + if (willAdd && _instanceof1(offsets, Array)) { + var index = this.emission.bursts.indexOf(burst); + this.emission.burstOffsets[index] = offsets; + return index; + } + return -1; + }; + _proto.removeBurst = function removeBurst(index) { + if (index < this.emission.bursts.length) { + this.emission.burstOffsets[index] = null; + this.emission.bursts.splice(index, 1); + } + }; + _proto.createPoint = function createPoint(lifetime) { + var generator = { + total: this.emission.rateOverTime.getValue(lifetime), + index: this.generatedCount, + burstIndex: 0, + burstCount: 0 + }; + this.generatedCount++; + return this.initPoint(this.shape.generate(generator)); + }; + _proto.stopParticleEmission = function stopParticleEmission() { + this.emissionStopped = true; + }; + _proto.resumeParticleEmission = function resumeParticleEmission() { + this.emissionStopped = false; + }; + _proto.getBoundingBox = function getBoundingBox() { + var area = this.getParticleBoxes(); + return { + type: exports.HitTestType.sphere, + area: area + }; + }; + _proto.fromData = function fromData(data) { + Component.prototype.fromData.call(this, data); + var props = data; + this.props = props; + this.destroyed = false; + var cachePrefix = ""; + var options = props.options, _props_positionOverLifetime = props.positionOverLifetime, positionOverLifetime = _props_positionOverLifetime === void 0 ? {} : _props_positionOverLifetime, shape = props.shape; + var gravityModifier = positionOverLifetime == null ? void 0 : positionOverLifetime.gravityOverLifetime; + var gravity = ensureVec3(positionOverLifetime == null ? void 0 : positionOverLifetime.gravity); + var _textureSheetAnimation = props.textureSheetAnimation; + var textureSheetAnimation = _textureSheetAnimation ? { + animationDelay: createValueGetter(_textureSheetAnimation.animationDelay || 0), + animationDuration: createValueGetter(_textureSheetAnimation.animationDuration || 1), + cycles: createValueGetter(_textureSheetAnimation.cycles || 1), + animate: _textureSheetAnimation.animate, + col: _textureSheetAnimation.col, + row: _textureSheetAnimation.row, + total: _textureSheetAnimation.total || _textureSheetAnimation.col * _textureSheetAnimation.row + } : undefined; + var startTurbulence = !!(shape && shape.turbulenceX || (shape == null ? void 0 : shape.turbulenceY) || (shape == null ? void 0 : shape.turbulenceZ)); + var turbulence; + if (startTurbulence) { + var _shape_turbulenceX, _shape_turbulenceY, _shape_turbulenceZ; + turbulence = [ + createValueGetter((_shape_turbulenceX = shape.turbulenceX) != null ? _shape_turbulenceX : 0), + createValueGetter((_shape_turbulenceY = shape.turbulenceY) != null ? _shape_turbulenceY : 0), + createValueGetter((_shape_turbulenceZ = shape.turbulenceZ) != null ? _shape_turbulenceZ : 0) + ]; + } + this.name = "ParticleSystem"; + this.shape = createShape(shape); + var _props_emission_burstOffsets; + this.emission = { + rateOverTime: createValueGetter(props.emission.rateOverTime), + burstOffsets: getBurstOffsets((_props_emission_burstOffsets = props.emission.burstOffsets) != null ? _props_emission_burstOffsets : []), + bursts: (props.emission.bursts || []).map(function(c) { + return new Burst(c); + }) + }; + this.textureSheetAnimation = textureSheetAnimation; + var renderer = props.renderer || {}; + var rotationOverLifetime; + var rotOverLt = props.rotationOverLifetime; + if (rotOverLt) { + rotationOverLifetime = {}; + rotationOverLifetime.asRotation = !!rotOverLt.asRotation; + rotationOverLifetime.z = rotOverLt.z ? createValueGetter(rotOverLt.z) : createValueGetter(0); + if (rotOverLt.separateAxes) { + rotationOverLifetime.x = rotOverLt.x && createValueGetter(rotOverLt.x); + rotationOverLifetime.y = rotOverLt.y && createValueGetter(rotOverLt.y); + } + } + var forceTarget; + if (positionOverLifetime == null ? void 0 : positionOverLifetime.forceTarget) { + forceTarget = { + target: positionOverLifetime.target || [ + 0, + 0, + 0 + ], + curve: createValueGetter(positionOverLifetime.forceCurve || [ + ValueType.LINE, + [ + [ + 0, + 0 + ], + [ + 1, + 1 + ] + ] + ]) + }; + } + var linearVelOverLifetime = { + x: positionOverLifetime.linearX && createValueGetter(positionOverLifetime.linearX || 0), + y: positionOverLifetime.linearY && createValueGetter(positionOverLifetime.linearY || 0), + z: positionOverLifetime.linearZ && createValueGetter(positionOverLifetime.linearZ || 0), + asMovement: positionOverLifetime.asMovement + }; + var orbitalVelOverLifetime = { + x: positionOverLifetime.orbitalX && createValueGetter(positionOverLifetime.orbitalX), + y: positionOverLifetime.orbitalY && createValueGetter(positionOverLifetime.orbitalY), + z: positionOverLifetime.orbitalZ && createValueGetter(positionOverLifetime.orbitalZ), + center: positionOverLifetime.orbCenter, + asRotation: positionOverLifetime.asRotation + }; + var sizeOverLifetime = props.sizeOverLifetime || {}; + var colorOverLifetime = props.colorOverLifetime; + var shaderCachePrefix = cachePrefix; + var sizeOverLifetimeGetter = (sizeOverLifetime == null ? void 0 : sizeOverLifetime.separateAxes) ? { + separateAxes: true, + x: createValueGetter(sizeOverLifetime.x), + y: createValueGetter(sizeOverLifetime.y) + } : { + separateAxes: false, + x: createValueGetter(("size" in sizeOverLifetime ? sizeOverLifetime.size : sizeOverLifetime.x) || 1) + }; + renderer.anchor = renderer.anchor || [ + 0, + 0 + ]; + var anchor = Vector2.fromArray(renderer.anchor); + var _options_maxCount; + this.options = { + particleFollowParent: !!options.particleFollowParent, + startLifetime: createValueGetter(options.startLifetime), + startDelay: createValueGetter(options.startDelay || 0), + startSpeed: createValueGetter(positionOverLifetime.startSpeed || 0), + startColor: createValueGetter(options.startColor), + // duration:vfxItem.duration || 1, + looping: false, + maxCount: (_options_maxCount = options.maxCount) != null ? _options_maxCount : 0, + gravityModifier: createValueGetter(gravityModifier || 0), + gravity: gravity, + start3DSize: !!options.start3DSize, + startTurbulence: startTurbulence, + turbulence: turbulence, + speedOverLifetime: positionOverLifetime.speedOverLifetime && createValueGetter(positionOverLifetime.speedOverLifetime), + linearVelOverLifetime: linearVelOverLifetime, + orbitalVelOverLifetime: orbitalVelOverLifetime, + forceTarget: forceTarget + }; + if (options.startRotationZ) { + this.options.startRotation = createValueGetter(options.startRotationZ || 0); + } + if (options.startRotationX || options.startRotationY) { + this.options.start3DRotation = true; + this.options.startRotationX = createValueGetter(options.startRotationX || 0); + this.options.startRotationY = createValueGetter(options.startRotationY || 0); + this.options.startRotationZ = createValueGetter(options.startRotationZ || 0); + } + if (options.start3DSize) { + this.options.startSizeX = createValueGetter(options.startSizeX); + this.options.startSizeY = createValueGetter(options.startSizeY); + } else { + this.options.startSize = createValueGetter(options.startSize); + this.options.sizeAspect = createValueGetter(options.sizeAspect || 1); + } + var maskProps = this.getMaskOptions(props); + var particleMeshProps = { + // listIndex: vfxItem.listIndex, + meshSlots: options.meshSlots, + name: this.name, + matrix: Matrix4$1.IDENTITY, + shaderCachePrefix: shaderCachePrefix, + renderMode: renderer.renderMode || RenderMode.BILLBOARD, + side: renderer.side || SideMode.DOUBLE, + gravity: gravity, + // duration: vfxItem.duration, + blending: renderer.blending || BlendingMode.ALPHA, + rotationOverLifetime: rotationOverLifetime, + gravityModifier: this.options.gravityModifier, + linearVelOverLifetime: this.options.linearVelOverLifetime, + orbitalVelOverLifetime: this.options.orbitalVelOverLifetime, + speedOverLifetime: this.options.speedOverLifetime, + sprite: textureSheetAnimation, + occlusion: !!renderer.occlusion, + transparentOcclusion: !!renderer.transparentOcclusion, + maxCount: options.maxCount, + mask: maskProps.maskRef, + maskMode: maskProps.maskMode, + forceTarget: forceTarget, + diffuse: renderer.texture ? this.engine.findObject(renderer.texture) : undefined, + sizeOverLifetime: sizeOverLifetimeGetter, + anchor: anchor + }; + if (colorOverLifetime) { + var color = colorOverLifetime.color, opacity = colorOverLifetime.opacity; + particleMeshProps.colorOverLifetime = {}; + if (opacity) { + particleMeshProps.colorOverLifetime.opacity = createValueGetter(colorOverLifetime.opacity); + } + if (color) { + if (color[0] === ValueType.GRADIENT_COLOR) { + particleMeshProps.colorOverLifetime.color = colorOverLifetime.color[1]; + } else if (color[0] === ValueType.RGBA_COLOR) { + particleMeshProps.colorOverLifetime.color = Texture.createWithData(this.engine, { + data: new Uint8Array(color[1]), + width: 1, + height: 1 + }); + } else if (_instanceof1(color, Texture)) { + particleMeshProps.colorOverLifetime.color = color; + } + } + } + var uvs = []; + var textureMap = [ + 0, + 0, + 1, + 1 + ]; + var flip; + if (props.splits) { + var s = props.splits[0]; + flip = s[4]; + textureMap = flip ? [ + s[0], + s[1], + s[3], + s[2] + ] : [ + s[0], + s[1], + s[2], + s[3] + ]; + } + if (textureSheetAnimation && !textureSheetAnimation.animate) { + var col = flip ? textureSheetAnimation.row : textureSheetAnimation.col; + var row = flip ? textureSheetAnimation.col : textureSheetAnimation.row; + var total = textureSheetAnimation.total || col * row; + var index = 0; + for(var x = 0; x < col; x++){ + for(var y = 0; y < row && index < total; y++, index++){ + uvs.push([ + x * textureMap[2] / col + textureMap[0], + y * textureMap[3] / row + textureMap[1], + textureMap[2] / col, + textureMap[3] / row + ]); + } + } + } else { + uvs.push(textureMap); + } + this.uvs = uvs; + // @ts-expect-error + particleMeshProps.textureFlip = flip; + var trails = props.trails; + var trailMeshProps; + if (trails) { + this.trails = { + lifetime: createValueGetter(trails.lifetime), + dieWithParticles: trails.dieWithParticles !== false, + sizeAffectsWidth: !!trails.sizeAffectsWidth, + sizeAffectsLifetime: !!trails.sizeAffectsLifetime, + inheritParticleColor: !!trails.inheritParticleColor, + parentAffectsPosition: !!trails.parentAffectsPosition + }; + maskProps = this.getMaskOptions(trails); + trailMeshProps = { + name: "Trail", + matrix: Matrix4$1.IDENTITY, + minimumVertexDistance: trails.minimumVertexDistance || 0.02, + maxTrailCount: options.maxCount, + pointCountPerTrail: Math.round(trails.maxPointPerTrail) || 32, + blending: trails.blending, + texture: trails.texture ? this.engine.findObject(trails.texture) : undefined, + opacityOverLifetime: createValueGetter(trails.opacityOverLifetime || 1), + widthOverTrail: createValueGetter(trails.widthOverTrail || 1), + // order: vfxItem.listIndex + (trails.orderOffset || 0), + shaderCachePrefix: shaderCachePrefix, + lifetime: this.trails.lifetime, + occlusion: !!trails.occlusion, + transparentOcclusion: !!trails.transparentOcclusion, + textureMap: trails.textureMap, + mask: maskProps.maskRef, + maskMode: maskProps.maskMode + }; + if (trails.colorOverLifetime && trails.colorOverLifetime[0] === ValueType.GRADIENT_COLOR) { + trailMeshProps.colorOverLifetime = trails.colorOverLifetime[1]; + } + if (trails.colorOverTrail && trails.colorOverTrail[0] === ValueType.GRADIENT_COLOR) { + trailMeshProps.colorOverTrail = trails.colorOverTrail[1]; + } + } + this.renderer = new ParticleSystemRenderer(this.engine, particleMeshProps, trailMeshProps); + this.renderer.item = this.item; + this.renderer.maskManager = this.maskManager; + this.meshes = this.renderer.meshes; + var interaction = props.interaction; + if (interaction) { + var _interaction_radius; + this.interaction = { + multiple: interaction.multiple, + radius: (_interaction_radius = interaction.radius) != null ? _interaction_radius : 0.4, + behavior: interaction.behavior + }; + } + this.item.getHitTestParams = this.getHitTestParams; + this.item._content = this; + }; + _proto.getMaskOptions = function getMaskOptions(data) { + var maskMode = exports.MaskMode.NONE; + var maskRef = 0; + if (data.mask) { + var maskProps = data.mask; + if (maskProps && maskProps.ref) { + maskProps.ref = this.engine.findObject(maskProps.ref); + } + maskMode = this.maskManager.getMaskMode(data); + maskRef = this.maskManager.getRefValue(); + } + return { + maskMode: maskMode, + maskRef: maskRef + }; + }; + _create_class(ParticleSystem, [ + { + key: "timePassed", + get: function get() { + return this.lastUpdate - this.loopStartTime; + } + }, + { + key: "lifetime", + get: function get() { + return this.timePassed / this.item.duration; + } + }, + { + key: "particleCount", + get: function get() { + return this.particleLink.length; + } + }, + { + key: "maxParticles", + get: /** + * 获取当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时,发射器会暂时停止发射粒子。 + * @since 2.3.0 + */ function get() { + return this.options.maxCount; + }, + set: /** + * 设置当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时,发射器会暂时停止发射粒子。 + * 注意:暂时不支持增加拖尾数量 + * @since 2.3.0 + */ function set(count) { + var _this_renderer; + this.options.maxCount = count; + if ((_this_renderer = this.renderer) == null ? void 0 : _this_renderer.particleMesh) { + this.renderer.particleMesh.maxCount = count; + } + } + } + ]); + return ParticleSystem; +}(Component); +exports.ParticleSystem = __decorate([ + effectsClass(DataType.ParticleSystem) +], exports.ParticleSystem); +// array performance better for small memory than Float32Array +var tempDir = new Vector3(); +var tempSize$1 = new Vector2(); +var tempRot$1 = new Euler(); +var tmpDirX = new Vector3(); +var tmpDirY = new Vector3(); +var tempVec3 = new Vector3(); +var tempEuler = new Euler(); +var tempSprite = [ + 0, + 0, + 0 +]; +var tempMat4 = new Matrix4$1(); +function getBurstOffsets(burstOffsets) { + var ret = {}; + if (Array.isArray(burstOffsets)) { + burstOffsets.forEach(function(arr) { + var isArr = _instanceof1(arr, Array); + var index = isArr ? arr[0] : arr.index; + var offsets = ret[index]; + if (!offsets) { + offsets = ret[index] = []; + } + if (isArr) { + offsets.push(arr.slice(1, 4)); + } else { + offsets.push([ + +arr.x, + +arr.y, + +arr.z + ]); + } + }); + } + return ret; +} +function randomArrItem(arr, keepArr) { + var index = Math.floor(Math.random() * arr.length); + var item = arr[index]; + if (!keepArr) { + arr.splice(index, 1); + } + return item; +} + +var TrackMixerPlayable = /*#__PURE__*/ function(Playable1) { + _inherits(TrackMixerPlayable, Playable1); + function TrackMixerPlayable() { + var _this; + _this = Playable1.apply(this, arguments) || this; + _this.clipPlayables = []; + _this.clipWeights = []; + return _this; + } + var _proto = TrackMixerPlayable.prototype; + _proto.processFrame = function processFrame(context) { + for(var _iterator = _create_for_of_iterator_helper_loose(this.clipPlayables), _step; !(_step = _iterator()).done;){ + var clipPlayable = _step.value; + clipPlayable.processFrame(context); + } + this.evaluate(context); + }; + _proto.setClipWeight = function setClipWeight(playableOrIndex, weight) { + if (_instanceof1(playableOrIndex, Playable)) { + for(var i = 0; i < this.clipPlayables.length; i++){ + if (this.clipPlayables[i] === playableOrIndex) { + this.clipWeights[i] = weight; + return; + } + } + } else { + if (this.clipWeights.length < playableOrIndex + 1) { + this.clipWeights.length = playableOrIndex + 1; + } + this.clipWeights[playableOrIndex] = weight; + } + }; + _proto.getClipWeight = function getClipWeight(inputIndex) { + return this.clipWeights[inputIndex]; + }; + _proto.getClipPlayable = function getClipPlayable(index) { + return this.clipPlayables[index]; + }; + _proto.evaluate = function evaluate(context) { + // Override + }; + return TrackMixerPlayable; +}(Playable); + +var ActivationMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) { + _inherits(ActivationMixerPlayable, TrackMixerPlayable); + function ActivationMixerPlayable() { + return TrackMixerPlayable.apply(this, arguments); + } + var _proto = ActivationMixerPlayable.prototype; + _proto.evaluate = function evaluate(context) { + var boundObject = context.output.getUserData(); + if (!_instanceof1(boundObject, exports.VFXItem)) { + return; + } + var boundItem = boundObject; + var hasInput = false; + for(var i = 0; i < this.clipPlayables.length; i++){ + if (this.getClipWeight(i) > 0) { + hasInput = true; + break; + } + } + if (hasInput) { + boundItem.transform.setValid(true); + boundItem.setActive(true); + } else { + boundItem.transform.setValid(false); + boundItem.setActive(false); + } + }; + return ActivationMixerPlayable; +}(TrackMixerPlayable); + +var PropertyClipPlayable = /*#__PURE__*/ function(Playable) { + _inherits(PropertyClipPlayable, Playable); + function PropertyClipPlayable() { + return Playable.apply(this, arguments); + } + var _proto = PropertyClipPlayable.prototype; + _proto.processFrame = function processFrame(context) { + this.value = this.curve.getValue(this.time / this.getDuration()); + }; + return PropertyClipPlayable; +}(Playable); + +var PropertyMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) { + _inherits(PropertyMixerPlayable, TrackMixerPlayable); + function PropertyMixerPlayable() { + var _this; + _this = TrackMixerPlayable.apply(this, arguments) || this; + _this.propertyName = ""; + return _this; + } + var _proto = PropertyMixerPlayable.prototype; + _proto.evaluate = function evaluate(context) { + var boundObject = context.output.getUserData(); + if (!boundObject) { + return; + } + var hasInput = false; + this.propertyValue = boundObject[this.propertyName]; + if (this.propertyValue === undefined || this.propertyValue === null) { + return; + } + this.resetPropertyValue(); + // evaluate the curve + for(var i = 0; i < this.clipPlayables.length; i++){ + var weight = this.getClipWeight(i); + if (weight > 0) { + var propertyClipPlayable = this.getClipPlayable(i); + if (!_instanceof1(propertyClipPlayable, PropertyClipPlayable)) { + console.error("PropertyTrack added non-PropertyPlayableAsset"); + continue; + } + var curveValue = propertyClipPlayable.value; + this.addWeightedValue(curveValue, weight); + hasInput = true; + } + } + // set value + if (hasInput) { + boundObject[this.propertyName] = this.propertyValue; + } + }; + return PropertyMixerPlayable; +}(TrackMixerPlayable); + +var ColorPropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) { + _inherits(ColorPropertyMixerPlayable, PropertyMixerPlayable); + function ColorPropertyMixerPlayable() { + return PropertyMixerPlayable.apply(this, arguments); + } + var _proto = ColorPropertyMixerPlayable.prototype; + _proto.resetPropertyValue = function resetPropertyValue() { + this.propertyValue.setZero(); + }; + _proto.addWeightedValue = function addWeightedValue(curveValue, weight) { + var result = this.propertyValue; + result.r += curveValue.r * weight; + result.g += curveValue.g * weight; + result.b += curveValue.b * weight; + result.a += curveValue.a * weight; + }; + return ColorPropertyMixerPlayable; +}(PropertyMixerPlayable); + +var FloatPropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) { + _inherits(FloatPropertyMixerPlayable, PropertyMixerPlayable); + function FloatPropertyMixerPlayable() { + return PropertyMixerPlayable.apply(this, arguments); + } + var _proto = FloatPropertyMixerPlayable.prototype; + _proto.resetPropertyValue = function resetPropertyValue() { + this.propertyValue = 0; + }; + _proto.addWeightedValue = function addWeightedValue(curveValue, weight) { + this.propertyValue += curveValue * weight; + }; + return FloatPropertyMixerPlayable; +}(PropertyMixerPlayable); + +var ParticleMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) { + _inherits(ParticleMixerPlayable, TrackMixerPlayable); + function ParticleMixerPlayable() { + return TrackMixerPlayable.apply(this, arguments); + } + var _proto = ParticleMixerPlayable.prototype; + _proto.evaluate = function evaluate(context) {}; + return ParticleMixerPlayable; +}(TrackMixerPlayable); + +var SpriteColorMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) { + _inherits(SpriteColorMixerPlayable, TrackMixerPlayable); + function SpriteColorMixerPlayable() { + return TrackMixerPlayable.apply(this, arguments); + } + var _proto = SpriteColorMixerPlayable.prototype; + _proto.evaluate = function evaluate(context) {}; + return SpriteColorMixerPlayable; +}(TrackMixerPlayable); + +var SubCompositionClipPlayable = /*#__PURE__*/ function(Playable) { + _inherits(SubCompositionClipPlayable, Playable); + function SubCompositionClipPlayable() { + return Playable.apply(this, arguments); + } + var _proto = SubCompositionClipPlayable.prototype; + _proto.processFrame = function processFrame(context) { + var boundObject = context.output.getUserData(); + if (_instanceof1(boundObject, exports.CompositionComponent)) { + boundObject.time = this.getTime(); + } + }; + return SubCompositionClipPlayable; +}(Playable); + +var SubCompositionMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) { + _inherits(SubCompositionMixerPlayable, TrackMixerPlayable); + function SubCompositionMixerPlayable() { + return TrackMixerPlayable.apply(this, arguments); + } + var _proto = SubCompositionMixerPlayable.prototype; + _proto.evaluate = function evaluate(context) { + var boundObject = context.output.getUserData(); + if (!_instanceof1(boundObject, exports.CompositionComponent)) { + return; + } + var compositionComponent = boundObject; + var hasInput = false; + for(var i = 0; i < this.clipPlayables.length; i++){ + if (this.getClipWeight(i) > 0) { + hasInput = true; + break; + } + } + if (hasInput) { + compositionComponent.item.setActive(true); + } else { + compositionComponent.item.setActive(false); + } + }; + return SubCompositionMixerPlayable; +}(TrackMixerPlayable); + +var TransformMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) { + _inherits(TransformMixerPlayable, TrackMixerPlayable); + function TransformMixerPlayable() { + return TrackMixerPlayable.apply(this, arguments); + } + var _proto = TransformMixerPlayable.prototype; + _proto.evaluate = function evaluate(context) {}; + return TransformMixerPlayable; +}(TrackMixerPlayable); + +var Vector4PropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) { + _inherits(Vector4PropertyMixerPlayable, PropertyMixerPlayable); + function Vector4PropertyMixerPlayable() { + return PropertyMixerPlayable.apply(this, arguments); + } + var _proto = Vector4PropertyMixerPlayable.prototype; + _proto.resetPropertyValue = function resetPropertyValue() { + this.propertyValue.x = 0; + this.propertyValue.y = 0; + this.propertyValue.z = 0; + this.propertyValue.w = 0; + }; + _proto.addWeightedValue = function addWeightedValue(curveValue, weight) { + var result = this.propertyValue; + result.x += curveValue.x * weight; + result.y += curveValue.y * weight; + result.z += curveValue.z * weight; + result.w += curveValue.w * weight; + }; + return Vector4PropertyMixerPlayable; +}(PropertyMixerPlayable); +var Vector2PropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) { + _inherits(Vector2PropertyMixerPlayable, PropertyMixerPlayable); + function Vector2PropertyMixerPlayable() { + return PropertyMixerPlayable.apply(this, arguments); + } + var _proto = Vector2PropertyMixerPlayable.prototype; + _proto.resetPropertyValue = function resetPropertyValue() { + this.propertyValue.x = 0; + this.propertyValue.y = 0; + }; + _proto.addWeightedValue = function addWeightedValue(curveValue, weight) { + var result = this.propertyValue; + result.x += curveValue.x * weight; + result.y += curveValue.y * weight; + }; + return Vector2PropertyMixerPlayable; +}(PropertyMixerPlayable); + +/** + * @since 2.0.0 + */ var TimelineClip = /*#__PURE__*/ function() { + function TimelineClip() { + this.start = 0; + this.duration = 0; + } + var _proto = TimelineClip.prototype; + _proto.toLocalTime = function toLocalTime(time) { + var localTime = time - this.start; + var duration = this.duration; + if (localTime - duration > 0) { + if (this.endBehavior === EndBehavior.restart) { + localTime = localTime % duration; + } else if (this.endBehavior === EndBehavior.freeze) { + localTime = Math.min(duration, localTime); + } + } + return localTime; + }; + return TimelineClip; +}(); +exports.TrackAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(TrackAsset, PlayableAsset); + function TrackAsset() { + var _this; + _this = PlayableAsset.apply(this, arguments) || this; + _this.trackType = 0; + _this.clipSeed = 0; + _this.clips = []; + _this.children = []; + return _this; + } + var _proto = TrackAsset.prototype; + /** + * 重写该方法以获取自定义对象绑定 + */ _proto.updateAnimatedObject = function updateAnimatedObject() { + if (this.parent) { + this.boundObject = this.parent.boundObject; + } + }; + /** + * 重写该方法以创建自定义混合器 + */ _proto.createTrackMixer = function createTrackMixer(graph) { + return new TrackMixerPlayable(graph); + }; + _proto.createOutput = function createOutput() { + var output = new PlayableOutput(); + return output; + }; + _proto.createPlayableGraph = function createPlayableGraph(graph, runtimeClips) { + var mixerPlayable = this.createMixerPlayableGraph(graph, runtimeClips); + return mixerPlayable; + }; + _proto.createMixerPlayableGraph = function createMixerPlayableGraph(graph, runtimeClips) { + var clips = []; + for(var _iterator = _create_for_of_iterator_helper_loose(this.clips), _step; !(_step = _iterator()).done;){ + var clip = _step.value; + clips.push(clip); + } + var mixerPlayable = this.compileClips(graph, clips, runtimeClips); + return mixerPlayable; + }; + _proto.compileClips = function compileClips(graph, timelineClips, runtimeClips) { + var mixer = this.createTrackMixer(graph); + for(var _iterator = _create_for_of_iterator_helper_loose(timelineClips), _step; !(_step = _iterator()).done;){ + var timelineClip = _step.value; + var clipPlayable = this.createClipPlayable(graph, timelineClip); + clipPlayable.setDuration(timelineClip.duration); + var clip = new RuntimeClip(timelineClip, clipPlayable, mixer, this); + runtimeClips.push(clip); + mixer.clipPlayables.push(clipPlayable); + mixer.setClipWeight(clipPlayable, 0.0); + } + return mixer; + }; + _proto.createPlayable = function createPlayable(graph) { + return new Playable(graph); + }; + _proto.getChildTracks = function getChildTracks() { + return this.children; + }; + _proto.addChild = function addChild(child) { + this.children.push(child); + child.parent = this; + }; + _proto.createClip = function createClip(classConstructor, name) { + var newClip = new TimelineClip(); + newClip.asset = new classConstructor(this.engine); + newClip.name = name ? name : "TimelineClip" + newClip.id; + this.addClip(newClip); + return newClip; + }; + _proto.getClips = function getClips() { + return this.clips; + }; + _proto.findClip = function findClip(name) { + for(var _iterator = _create_for_of_iterator_helper_loose(this.clips), _step; !(_step = _iterator()).done;){ + var clip = _step.value; + if (clip.name === name) { + return clip; + } + } + }; + _proto.addClip = function addClip(clip) { + clip.id = (this.clipSeed++).toString(); + this.clips.push(clip); + }; + _proto.createClipPlayable = function createClipPlayable(graph, clip) { + return clip.asset.createPlayable(graph); + }; + _proto.fromData = function fromData(data) { + PlayableAsset.prototype.fromData.call(this, data); + for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){ + var child = _step.value; + child.parent = this; + } + }; + return TrackAsset; +}(PlayableAsset); +__decorate([ + serialize(TimelineClip) +], exports.TrackAsset.prototype, "clips", void 0); +__decorate([ + serialize() +], exports.TrackAsset.prototype, "children", void 0); +exports.TrackAsset = __decorate([ + effectsClass(DataType.TrackAsset) +], exports.TrackAsset); +exports.TrackType = void 0; +(function(TrackType) { + TrackType[TrackType["MasterTrack"] = 0] = "MasterTrack"; + TrackType[TrackType["ObjectTrack"] = 1] = "ObjectTrack"; +})(exports.TrackType || (exports.TrackType = {})); +var RuntimeClip = /*#__PURE__*/ function() { + function RuntimeClip(clip, clipPlayable, parentMixer, track) { + this.clip = clip; + this.playable = clipPlayable; + this.parentMixer = parentMixer; + this.track = track; + if (_instanceof1(this.track.boundObject, exports.VFXItem)) { + this.particleSystem = this.track.boundObject.getComponent(exports.ParticleSystem); + } + } + var _proto = RuntimeClip.prototype; + _proto.evaluateAt = function evaluateAt(localTime) { + var clip = this.clip; + var weight = 1.0; + var ended = false; + var started = false; + var boundObject = this.track.boundObject; + if (localTime >= clip.start + clip.duration && clip.endBehavior === EndBehavior.destroy) { + if (_instanceof1(boundObject, exports.VFXItem) && exports.VFXItem.isParticle(boundObject) && this.particleSystem && !this.particleSystem.destroyed) { + weight = 1.0; + } else { + weight = 0.0; + ended = true; + } + } else if (localTime - this.clip.start >= 0) { + weight = 1.0; + started = true; + } else if (localTime < clip.start) { + weight = 0.0; + } + if (started && this.playable.getPlayState() !== PlayState.Playing) { + this.playable.play(); + } + this.parentMixer.setClipWeight(this.playable, weight); + var clipTime = parseFloat(clip.toLocalTime(localTime).toFixed(3)); + this.playable.setTime(clipTime); + // 判断动画是否结束 + if (ended) { + if (this.playable.getPlayState() === PlayState.Playing) { + this.playable.pause(); + } + } + }; + _create_class(RuntimeClip, [ + { + key: "enable", + set: function set(value) { + if (value) { + this.playable.play(); + } else { + this.parentMixer.setClipWeight(this.playable, 0); + this.playable.pause(); + } + } + } + ]); + return RuntimeClip; +}(); + +exports.ActivationTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(ActivationTrack, TrackAsset); + function ActivationTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = ActivationTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + return new ActivationMixerPlayable(graph); + }; + return ActivationTrack; +}(exports.TrackAsset); +exports.ActivationTrack = __decorate([ + effectsClass(DataType.ActivationTrack) +], exports.ActivationTrack); + +var PropertyTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(PropertyTrack, TrackAsset); + function PropertyTrack() { + var _this; + _this = TrackAsset.apply(this, arguments) || this; + _this.propertyNames = []; + _this.path = ""; + return _this; + } + var _proto = PropertyTrack.prototype; + _proto.updateAnimatedObject = function updateAnimatedObject() { + var propertyNames = this.propertyNames; + var target = this.parent.boundObject; + for(var i = 0; i < propertyNames.length - 1; i++){ + var property = target[propertyNames[i]]; + if (property === undefined) { + console.error("The " + propertyNames[i] + " property of " + target + " was not found"); + } + target = property; + } + this.boundObject = target; + }; + _proto.fromData = function fromData(data) { + TrackAsset.prototype.fromData.call(this, data); + var propertyNames = this.path.split("."); + this.propertyNames = propertyNames; + }; + return PropertyTrack; +}(exports.TrackAsset); +__decorate([ + serialize() +], PropertyTrack.prototype, "path", void 0); + +exports.FloatPropertyTrack = /*#__PURE__*/ function(PropertyTrack) { + _inherits(FloatPropertyTrack, PropertyTrack); + function FloatPropertyTrack() { + return PropertyTrack.apply(this, arguments); + } + var _proto = FloatPropertyTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + var mixer = new FloatPropertyMixerPlayable(graph); + var propertyNames = this.propertyNames; + if (propertyNames.length > 0) { + var propertyName = propertyNames[propertyNames.length - 1]; + mixer.propertyName = propertyName; + } + return mixer; + }; + _proto.updateAnimatedObject = function updateAnimatedObject() { + var propertyNames = this.propertyNames; + var target = this.parent.boundObject; + for(var i = 0; i < propertyNames.length - 1; i++){ + var property = target[propertyNames[i]]; + if (property === undefined) { + console.error("The " + propertyNames[i] + " property of " + target + " was not found"); + } + target = property; + } + this.boundObject = target; + }; + return FloatPropertyTrack; +}(PropertyTrack); +exports.FloatPropertyTrack = __decorate([ + effectsClass(DataType.FloatPropertyTrack) +], exports.FloatPropertyTrack); + +exports.SpriteColorTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(SpriteColorTrack, TrackAsset); + function SpriteColorTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = SpriteColorTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + return new SpriteColorMixerPlayable(graph); + }; + return SpriteColorTrack; +}(exports.TrackAsset); +exports.SpriteColorTrack = __decorate([ + effectsClass(DataType.SpriteColorTrack) +], exports.SpriteColorTrack); + +exports.SubCompositionTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(SubCompositionTrack, TrackAsset); + function SubCompositionTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = SubCompositionTrack.prototype; + _proto.updateAnimatedObject = function updateAnimatedObject() { + if (!this.parent || !_instanceof1(this.parent.boundObject, exports.VFXItem)) { + throw new Error("SubCompositionTrack needs to be set under the VFXItem track."); + } + this.boundObject = this.parent.boundObject.getComponent(exports.CompositionComponent); + }; + _proto.createTrackMixer = function createTrackMixer(graph) { + return new SubCompositionMixerPlayable(graph); + }; + return SubCompositionTrack; +}(exports.TrackAsset); +exports.SubCompositionTrack = __decorate([ + effectsClass(DataType.SubCompositionTrack) +], exports.SubCompositionTrack); + +exports.TransformTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(TransformTrack, TrackAsset); + function TransformTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = TransformTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + return new TransformMixerPlayable(graph); + }; + return TransformTrack; +}(exports.TrackAsset); +exports.TransformTrack = __decorate([ + effectsClass(DataType.TransformTrack) +], exports.TransformTrack); + +exports.MaterialTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(MaterialTrack, TrackAsset); + function MaterialTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = MaterialTrack.prototype; + _proto.updateAnimatedObject = function updateAnimatedObject() { + if (!_instanceof1(this.parent.boundObject, RendererComponent)) { + return; + } + this.parent.boundObject; + this.boundObject = this.parent.boundObject.materials[this.index]; + }; + return MaterialTrack; +}(exports.TrackAsset); +__decorate([ + serialize() +], exports.MaterialTrack.prototype, "index", void 0); +exports.MaterialTrack = __decorate([ + effectsClass("MaterialTrack") +], exports.MaterialTrack); + +var ParticleTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(ParticleTrack, TrackAsset); + function ParticleTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = ParticleTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + return new ParticleMixerPlayable(graph); + }; + return ParticleTrack; +}(exports.TrackAsset); + +exports.Vector4PropertyTrack = /*#__PURE__*/ function(PropertyTrack) { + _inherits(Vector4PropertyTrack, PropertyTrack); + function Vector4PropertyTrack() { + return PropertyTrack.apply(this, arguments); + } + var _proto = Vector4PropertyTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + var mixer = new Vector4PropertyMixerPlayable(graph); + var propertyNames = this.propertyNames; + if (propertyNames.length > 0) { + var propertyName = propertyNames[propertyNames.length - 1]; + mixer.propertyName = propertyName; + } + return mixer; + }; + return Vector4PropertyTrack; +}(PropertyTrack); +exports.Vector4PropertyTrack = __decorate([ + effectsClass(DataType.Vector4PropertyTrack) +], exports.Vector4PropertyTrack); +exports.Vector2PropertyTrack = /*#__PURE__*/ function(PropertyTrack) { + _inherits(Vector2PropertyTrack, PropertyTrack); + function Vector2PropertyTrack() { + return PropertyTrack.apply(this, arguments); + } + var _proto = Vector2PropertyTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + var mixer = new Vector2PropertyMixerPlayable(graph); + var propertyNames = this.propertyNames; + if (propertyNames.length > 0) { + var propertyName = propertyNames[propertyNames.length - 1]; + mixer.propertyName = propertyName; + } + return mixer; + }; + return Vector2PropertyTrack; +}(PropertyTrack); +exports.Vector2PropertyTrack = __decorate([ + effectsClass("Vector2PropertyTrack") +], exports.Vector2PropertyTrack); + +exports.ColorPropertyTrack = /*#__PURE__*/ function(PropertyTrack) { + _inherits(ColorPropertyTrack, PropertyTrack); + function ColorPropertyTrack() { + return PropertyTrack.apply(this, arguments); + } + var _proto = ColorPropertyTrack.prototype; + _proto.createTrackMixer = function createTrackMixer(graph) { + var mixer = new ColorPropertyMixerPlayable(graph); + var propertyNames = this.propertyNames; + if (propertyNames.length > 0) { + var propertyName = propertyNames[propertyNames.length - 1]; + mixer.propertyName = propertyName; + } + return mixer; + }; + return ColorPropertyTrack; +}(PropertyTrack); +exports.ColorPropertyTrack = __decorate([ + effectsClass(DataType.ColorPropertyTrack) +], exports.ColorPropertyTrack); + +exports.ColorPropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(ColorPropertyPlayableAsset, PlayableAsset); + function ColorPropertyPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = ColorPropertyPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var clipPlayable = new PropertyClipPlayable(graph); + clipPlayable.curve = createValueGetter(this.curveData); + clipPlayable.value = clipPlayable.curve.getValue(0); + return clipPlayable; + }; + return ColorPropertyPlayableAsset; +}(PlayableAsset); +__decorate([ + serialize() +], exports.ColorPropertyPlayableAsset.prototype, "curveData", void 0); +exports.ColorPropertyPlayableAsset = __decorate([ + effectsClass(DataType.ColorPropertyPlayableAsset) +], exports.ColorPropertyPlayableAsset); + +exports.FloatPropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(FloatPropertyPlayableAsset, PlayableAsset); + function FloatPropertyPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = FloatPropertyPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var clipPlayable = new PropertyClipPlayable(graph); + clipPlayable.curve = createValueGetter(this.curveData); + clipPlayable.value = clipPlayable.curve.getValue(0); + return clipPlayable; + }; + return FloatPropertyPlayableAsset; +}(PlayableAsset); +__decorate([ + serialize() +], exports.FloatPropertyPlayableAsset.prototype, "curveData", void 0); +exports.FloatPropertyPlayableAsset = __decorate([ + effectsClass(DataType.FloatPropertyPlayableAsset) +], exports.FloatPropertyPlayableAsset); + +exports.SubCompositionPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(SubCompositionPlayableAsset, PlayableAsset); + function SubCompositionPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = SubCompositionPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + return new SubCompositionClipPlayable(graph); + }; + return SubCompositionPlayableAsset; +}(PlayableAsset); +exports.SubCompositionPlayableAsset = __decorate([ + effectsClass(DataType.SubCompositionPlayableAsset) +], exports.SubCompositionPlayableAsset); + +exports.ObjectBindingTrack = /*#__PURE__*/ function(TrackAsset) { + _inherits(ObjectBindingTrack, TrackAsset); + function ObjectBindingTrack() { + return TrackAsset.apply(this, arguments); + } + var _proto = ObjectBindingTrack.prototype; + _proto.updateAnimatedObject = function updateAnimatedObject() {}; + _proto.create = function create(timelineAsset) { + if (!_instanceof1(this.boundObject, exports.VFXItem)) { + return; + } + var boundItem = this.boundObject; + // 添加粒子动画 clip // TODO 待移除 + if (boundItem.getComponent(exports.ParticleSystem)) { + var particleTrack = timelineAsset.createTrack(ParticleTrack, this, "ParticleTrack"); + particleTrack.boundObject = this.boundObject; + var particleClip = particleTrack.createClip(ParticleBehaviourPlayableAsset); + particleClip.start = boundItem.start; + particleClip.duration = boundItem.duration; + particleClip.endBehavior = boundItem.endBehavior; + } + }; + return ObjectBindingTrack; +}(exports.TrackAsset); +exports.ObjectBindingTrack = __decorate([ + effectsClass(DataType.ObjectBindingTrack) +], exports.ObjectBindingTrack); + +/** + * A class that stores track assets and the generated mixer playables and playable outputs. + * It is used to query the corresponding playable object based on the track asset. + */ var TrackInstance = /*#__PURE__*/ function() { + function TrackInstance(trackAsset, mixer, output) { + this.children = []; + this.trackAsset = trackAsset; + this.mixer = mixer; + this.output = output; + } + var _proto = TrackInstance.prototype; + _proto.addChild = function addChild(trackInstance) { + this.children.push(trackInstance); + }; + return TrackInstance; +}(); + +exports.TimelineAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(TimelineAsset, PlayableAsset); + function TimelineAsset() { + var _this; + _this = PlayableAsset.apply(this, arguments) || this; + _this.tracks = []; + _this.cacheFlattenedTracks = null; + return _this; + } + var _proto = TimelineAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var timelinePlayable = new TimelinePlayable(graph); + for(var _iterator = _create_for_of_iterator_helper_loose(this.tracks), _step; !(_step = _iterator()).done;){ + var track = _step.value; + if (_instanceof1(track, exports.ObjectBindingTrack)) { + track.create(this); + } + } + this.sortTracks(this.tracks); + timelinePlayable.compileTracks(graph, this.flattenedTracks); + return timelinePlayable; + }; + _proto.createTrack = function createTrack(classConstructor, parent, name) { + var newTrack = new classConstructor(this.engine); + newTrack.name = name ? name : classConstructor.name; + parent.addChild(newTrack); + this.invalidate(); + return newTrack; + }; + /** + * Invalidates the asset, called when tracks data changed + */ _proto.invalidate = function invalidate() { + this.cacheFlattenedTracks = null; + }; + _proto.addSubTracksRecursive = function addSubTracksRecursive(track, allTracks) { + for(var _iterator = _create_for_of_iterator_helper_loose(track.getChildTracks()), _step; !(_step = _iterator()).done;){ + var subTrack = _step.value; + allTracks.push(subTrack); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(track.getChildTracks()), _step1; !(_step1 = _iterator1()).done;){ + var subTrack1 = _step1.value; + this.addSubTracksRecursive(subTrack1, allTracks); + } + }; + _proto.sortTracks = function sortTracks(tracks) { + var sortedTracks = []; + for(var i = 0; i < tracks.length; i++){ + sortedTracks.push(new TrackSortWrapper(tracks[i], i)); + } + sortedTracks.sort(compareTracks); + tracks.length = 0; + for(var _iterator = _create_for_of_iterator_helper_loose(sortedTracks), _step; !(_step = _iterator()).done;){ + var trackWrapper = _step.value; + tracks.push(trackWrapper.track); + } + }; + _proto.fromData = function fromData(data) {}; + _create_class(TimelineAsset, [ + { + key: "flattenedTracks", + get: function get() { + if (!this.cacheFlattenedTracks) { + this.cacheFlattenedTracks = []; + // flatten track tree + for(var _iterator = _create_for_of_iterator_helper_loose(this.tracks), _step; !(_step = _iterator()).done;){ + var masterTrack = _step.value; + this.cacheFlattenedTracks.push(masterTrack); + this.addSubTracksRecursive(masterTrack, this.cacheFlattenedTracks); + } + } + return this.cacheFlattenedTracks; + } + } + ]); + return TimelineAsset; +}(PlayableAsset); +__decorate([ + serialize() +], exports.TimelineAsset.prototype, "tracks", void 0); +exports.TimelineAsset = __decorate([ + effectsClass(DataType.TimelineAsset) +], exports.TimelineAsset); +var TimelinePlayable = /*#__PURE__*/ function(Playable) { + _inherits(TimelinePlayable, Playable); + function TimelinePlayable() { + var _this; + _this = Playable.apply(this, arguments) || this; + _this.clips = []; + _this.masterTrackInstances = []; + return _this; + } + var _proto = TimelinePlayable.prototype; + _proto.prepareFrame = function prepareFrame(context) {}; + _proto.evaluate = function evaluate() { + var time = this.getTime(); + // TODO search active clips + for(var _iterator = _create_for_of_iterator_helper_loose(this.clips), _step; !(_step = _iterator()).done;){ + var clip = _step.value; + clip.evaluateAt(time); + } + }; + _proto.compileTracks = function compileTracks(graph, tracks) { + var outputTrack = tracks; + // map for searching track instance with track asset guid + var trackInstanceMap = {}; + for(var _iterator = _create_for_of_iterator_helper_loose(outputTrack), _step; !(_step = _iterator()).done;){ + var track = _step.value; + // create track mixer and track output + var trackMixPlayable = track.createPlayableGraph(graph, this.clips); + var trackOutput = track.createOutput(); + trackOutput.setUserData(track.boundObject); + graph.addOutput(trackOutput); + trackOutput.setSourcePlayable(trackMixPlayable); + // create track instance + var trackInstance = new TrackInstance(track, trackMixPlayable, trackOutput); + trackInstanceMap[track.getInstanceId()] = trackInstance; + if (!track.parent) { + this.masterTrackInstances.push(trackInstance); + } + } + // build trackInstance tree + for(var _iterator1 = _create_for_of_iterator_helper_loose(outputTrack), _step1; !(_step1 = _iterator1()).done;){ + var track1 = _step1.value; + var trackInstance1 = trackInstanceMap[track1.getInstanceId()]; + for(var _iterator2 = _create_for_of_iterator_helper_loose(track1.getChildTracks()), _step2; !(_step2 = _iterator2()).done;){ + var child = _step2.value; + var childTrackInstance = trackInstanceMap[child.getInstanceId()]; + trackInstance1.addChild(childTrackInstance); + } + } + }; + return TimelinePlayable; +}(Playable); +var TrackSortWrapper = function TrackSortWrapper(track, originalIndex) { + this.track = track; + this.originalIndex = originalIndex; +}; +function compareTracks(a, b) { + var bindingA = a.track.boundObject; + var bindingB = b.track.boundObject; + if (!_instanceof1(bindingA, exports.VFXItem) || !_instanceof1(bindingB, exports.VFXItem)) { + return a.originalIndex - b.originalIndex; + } + if (exports.VFXItem.isAncestor(bindingA, bindingB)) { + return -1; + } else if (exports.VFXItem.isAncestor(bindingB, bindingA)) { + return 1; + } else { + return a.originalIndex - b.originalIndex; // 非父子关系的元素保持原始顺序 + } +} + +exports.Vector4PropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(Vector4PropertyPlayableAsset, PlayableAsset); + function Vector4PropertyPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = Vector4PropertyPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var clipPlayable = new PropertyClipPlayable(graph); + clipPlayable.curve = createValueGetter(this.curveData); + clipPlayable.value = clipPlayable.curve.getValue(0); + return clipPlayable; + }; + return Vector4PropertyPlayableAsset; +}(PlayableAsset); +__decorate([ + serialize() +], exports.Vector4PropertyPlayableAsset.prototype, "curveData", void 0); +exports.Vector4PropertyPlayableAsset = __decorate([ + effectsClass(DataType.Vector4PropertyPlayableAsset) +], exports.Vector4PropertyPlayableAsset); +exports.Vector2PropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(Vector2PropertyPlayableAsset, PlayableAsset); + function Vector2PropertyPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = Vector2PropertyPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var clipPlayable = new PropertyClipPlayable(graph); + clipPlayable.curve = createValueGetter(this.curveData); + clipPlayable.value = clipPlayable.curve.getValue(0); + return clipPlayable; + }; + return Vector2PropertyPlayableAsset; +}(PlayableAsset); +__decorate([ + serialize() +], exports.Vector2PropertyPlayableAsset.prototype, "curveData", void 0); +exports.Vector2PropertyPlayableAsset = __decorate([ + effectsClass(DataType.Vector2PropertyPlayableAsset) +], exports.Vector2PropertyPlayableAsset); + +exports.CompositionComponent = /*#__PURE__*/ function(Component) { + _inherits(CompositionComponent, Component); + function CompositionComponent() { + var _this; + _this = Component.apply(this, arguments) || this; + _this.time = 0; + _this.startTime = 0; + _this.items = [] // 场景的所有元素 + ; + /** + * @internal + */ _this.state = PlayState.Playing; + _this.reusable = false; + _this.sceneBindings = []; + _this.graph = new PlayableGraph(); + return _this; + } + var _proto = CompositionComponent.prototype; + _proto.onStart = function onStart() { + var _this_item_composition; + if (!this.timelineAsset) { + this.timelineAsset = new exports.TimelineAsset(this.engine); + } + this.resolveBindings(); + this.timelinePlayable = this.timelineAsset.createPlayable(this.graph); + // 重播不销毁元素 + if (this.item.endBehavior !== EndBehavior.destroy) { + this.setReusable(true); + } + (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.refContent.push(this.item); + }; + _proto.setReusable = function setReusable(value) { + for(var _iterator = _create_for_of_iterator_helper_loose(this.timelineAsset.tracks), _step; !(_step = _iterator()).done;){ + var track = _step.value; + var boundObject = track.boundObject; + if (_instanceof1(boundObject, exports.VFXItem)) { + var subCompositionComponent = boundObject.getComponent(CompositionComponent); + if (subCompositionComponent) { + subCompositionComponent.setReusable(value); + } + } + } + }; + _proto.getReusable = function getReusable() { + return this.reusable; + }; + _proto.pause = function pause() { + this.state = PlayState.Paused; + }; + _proto.resume = function resume() { + this.state = PlayState.Playing; + }; + _proto.onUpdate = function onUpdate(dt) { + if (this.state === PlayState.Paused) { + return; + } + var time = this.time; + this.timelinePlayable.setTime(time); + // The properties of the object may change dynamically, + // so reset the track binding to avoid invalidation of the previously obtained binding object. + this.resolveBindings(); + this.timelinePlayable.evaluate(); + this.graph.evaluate(dt); + }; + _proto.onEnable = function onEnable() { + for(var _iterator = _create_for_of_iterator_helper_loose(this.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + item.setActive(true); + } + }; + _proto.onDisable = function onDisable() { + for(var _iterator = _create_for_of_iterator_helper_loose(this.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + item.setActive(false); + } + }; + _proto.onDestroy = function onDestroy() { + if (this.item.composition) { + if (this.items) { + this.items.forEach(function(item) { + return item.dispose(); + }); + this.items.length = 0; + } + } + }; + _proto.hitTest = function hitTest(ray, x, y, regions, force, options) { + var _this, _loop = function(i) { + var item = _this.items[i]; + if (item.isActive && item.transform.getValid() && !exports.VFXItem.isComposition(item) && !skip(item)) { + var hitParams = item.getHitTestParams(force); + if (hitParams) { + var success = false; + var intersectPoint = new Vector3(); + if (hitParams.type === exports.HitTestType.triangle) { + var triangles = hitParams.triangles, backfaceCulling = hitParams.backfaceCulling; + for(var j = 0; j < triangles.length; j++){ + var triangle = triangles[j]; + if (ray.intersectTriangle(triangle, intersectPoint, backfaceCulling)) { + success = true; + hitPositions.push(intersectPoint); + break; + } + } + } else if (hitParams.type === exports.HitTestType.box) { + var center = hitParams.center, size = hitParams.size; + var boxMin = center.clone().addScaledVector(size, 0.5); + var boxMax = center.clone().addScaledVector(size, -0.5); + if (ray.intersectBox({ + min: boxMin, + max: boxMax + }, intersectPoint)) { + success = true; + hitPositions.push(intersectPoint); + } + } else if (hitParams.type === exports.HitTestType.sphere) { + var center1 = hitParams.center, radius = hitParams.radius; + if (ray.intersectSphere({ + center: center1, + radius: radius + }, intersectPoint)) { + success = true; + hitPositions.push(intersectPoint); + } + } else if (hitParams.type === exports.HitTestType.custom) { + var tempPosition = hitParams.collect(ray, new Vector2(x, y)); + if (tempPosition && tempPosition.length > 0) { + tempPosition.forEach(function(pos) { + hitPositions.push(pos); + }); + success = true; + } + } + if (success) { + var region = { + compContent: _this.item, + id: item.id, + name: item.name, + position: hitPositions[hitPositions.length - 1], + parentId: item.parentId, + hitPositions: hitPositions, + behavior: hitParams.behavior + }; + // 触发单个元素的点击事件 + item.emit("click", region); + regions.push(region); + if (stop(region)) { + return { + v: regions + }; + } + } + } + } + }; + var hitPositions = []; + var stop = (options == null ? void 0 : options.stop) || noop; + var skip = (options == null ? void 0 : options.skip) || noop; + var maxCount = (options == null ? void 0 : options.maxCount) || this.items.length; + for(var i = 0; i < this.items.length && regions.length < maxCount; i++){ + var _ret = (_this = this, _loop(i)); + if (_type_of(_ret) === "object") return _ret.v; + } + return regions; + }; + /** + * 设置当前合成子元素的渲染顺序 + * @internal + */ _proto.setChildrenRenderOrder = function setChildrenRenderOrder(startOrder) { + for(var _iterator = _create_for_of_iterator_helper_loose(this.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + item.renderOrder = startOrder++; + var subCompositionComponent = item.getComponent(CompositionComponent); + if (subCompositionComponent) { + startOrder = subCompositionComponent.setChildrenRenderOrder(startOrder); + } + } + return startOrder; + }; + _proto.fromData = function fromData(data) { + Component.prototype.fromData.call(this, data); + var compositionData = data; + var _compositionData_startTime; + this.startTime = (_compositionData_startTime = compositionData.startTime) != null ? _compositionData_startTime : 0; + }; + _proto.resolveBindings = function resolveBindings() { + for(var _iterator = _create_for_of_iterator_helper_loose(this.sceneBindings), _step; !(_step = _iterator()).done;){ + var sceneBinding = _step.value; + sceneBinding.key.boundObject = sceneBinding.value; + } + // 为了通过帧对比,需要保证和原有的 update 时机一致。 + // 因此这边更新一次对象绑定,后续 timeline playable 中 sort tracks 的排序才能和原先的版本对上。 + // 如果不需要严格保证和之前的 updata 时机一致,这边的更新和 timeline asset 中的 sortTracks 都能去掉。 + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.timelineAsset.tracks), _step1; !(_step1 = _iterator1()).done;){ + var masterTrack = _step1.value; + this.updateTrackAnimatedObject(masterTrack); + } + }; + _proto.updateTrackAnimatedObject = function updateTrackAnimatedObject(track) { + for(var _iterator = _create_for_of_iterator_helper_loose(track.getChildTracks()), _step; !(_step = _iterator()).done;){ + var subTrack = _step.value; + subTrack.updateAnimatedObject(); + this.updateTrackAnimatedObject(subTrack); + } + }; + return CompositionComponent; +}(Component); +__decorate([ + serialize() +], exports.CompositionComponent.prototype, "items", void 0); +__decorate([ + serialize() +], exports.CompositionComponent.prototype, "sceneBindings", void 0); +__decorate([ + serialize() +], exports.CompositionComponent.prototype, "timelineAsset", void 0); +exports.CompositionComponent = __decorate([ + effectsClass("CompositionComponent") +], exports.CompositionComponent); + +/** + * + */ /** + * 事件监听器 + */ var EventEmitter = function EventEmitter() { + var _this = this; + var _this1 = this; + this.listeners = {}; + /** + * 移除事件监听器 + * @param eventName - 事件名称 + * @param listener - 事件监听器 + * @returns + */ this.off = function(eventName, listener) { + if (!_this.listeners[eventName]) { + return; + } + _this.listeners[eventName] = _this.listeners[eventName].filter(function(param) { + var l = param.listener; + return l !== listener; + }); + }; + /** + * 监听事件 + * @param eventName - 事件名称 + * @param listener - 事件监听器 + * @param options - 事件监听器选项 + * @returns + */ this.on = function(eventName, listener, options) { + _this.listeners[eventName] = _this.listeners[eventName] || []; + _this.listeners[eventName].push({ + listener: listener, + options: options + }); + return function() { + return _this.off(eventName, listener); + }; + }; + /** + * 一次性监听事件 + * @param eventName - 事件名称 + * @param listener - 事件监听器 + */ this.once = function(eventName, listener) { + _this.on(eventName, listener, { + once: true + }); + }; + /** + * 触发事件 + * @param eventName - 事件名称 + * @param args - 事件参数 + */ this.emit = function(eventName) { + for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ + args[_key - 1] = arguments[_key]; + } + var _this_listeners_eventName; + (_this_listeners_eventName = _this1.listeners[eventName]) == null ? void 0 : _this_listeners_eventName.forEach(function(param) { + var listener = param.listener, options = param.options; + listener.apply(void 0, [].concat(args)); + if (options == null ? void 0 : options.once) { + _this1.off(eventName, listener); + } + }); + }; + /** + * 获取事件名称对应的所有监听器 + * @param eventName - 事件名称 + * @returns - 返回事件名称对应的所有监听器 + */ this.getListeners = function(eventName) { + var _this_listeners_eventName; + return ((_this_listeners_eventName = _this.listeners[eventName]) == null ? void 0 : _this_listeners_eventName.map(function(param) { + var listener = param.listener; + return listener; + })) || []; + }; +}; + +/** + * + */ var SceneTicking = /*#__PURE__*/ function() { + function SceneTicking() { + this.update = new UpdateTickData(); + this.lateUpdate = new LateUpdateTickData(); + } + var _proto = SceneTicking.prototype; + /** + * + * @param obj + */ _proto.addComponent = function addComponent(obj) { + if (obj.onUpdate !== Component.prototype.onUpdate) { + this.update.addComponent(obj); + } + if (obj.onLateUpdate !== Component.prototype.onLateUpdate) { + this.lateUpdate.addComponent(obj); + } + }; + /** + * + * @param obj + */ _proto.removeComponent = function removeComponent(obj) { + if (obj.onUpdate !== Component.prototype.onUpdate) { + this.update.removeComponent(obj); + } + if (obj.onLateUpdate !== Component.prototype.onLateUpdate) { + this.lateUpdate.removeComponent(obj); + } + }; + /** + * + */ _proto.clear = function clear() { + this.update.clear(); + this.lateUpdate.clear(); + }; + return SceneTicking; +}(); +var TickData = /*#__PURE__*/ function() { + function TickData() { + this.components = []; + this.ticks = []; + } + var _proto = TickData.prototype; + _proto.tick = function tick(dt) { + this.tickComponents(this.components, dt); + for(var i = 0; i < this.ticks.length; i++){ + this.ticks[i](dt); + } + }; + _proto.tickComponents = function tickComponents(components, dt) { + // To be implemented in derived classes + }; + _proto.addComponent = function addComponent(component) { + if (!this.components.includes(component)) { + this.components.push(component); + } + }; + _proto.removeComponent = function removeComponent(component) { + var index = this.components.indexOf(component); + if (index > -1) { + this.components.splice(index, 1); + } + }; + _proto.addTick = function addTick(method, callee) { + var tick = method.bind(callee); + if (!this.ticks.includes(tick)) { + this.ticks.push(tick); + } + }; + _proto.clear = function clear() { + this.components = []; + }; + return TickData; +}(); +var UpdateTickData = /*#__PURE__*/ function(TickData) { + _inherits(UpdateTickData, TickData); + function UpdateTickData() { + return TickData.apply(this, arguments); + } + var _proto = UpdateTickData.prototype; + _proto.tickComponents = function tickComponents(components, dt) { + for(var _iterator = _create_for_of_iterator_helper_loose(components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + component.onUpdate(dt); + } + }; + return UpdateTickData; +}(TickData); +var LateUpdateTickData = /*#__PURE__*/ function(TickData) { + _inherits(LateUpdateTickData, TickData); + function LateUpdateTickData() { + return TickData.apply(this, arguments); + } + var _proto = LateUpdateTickData.prototype; + _proto.tickComponents = function tickComponents(components, dt) { + for(var _iterator = _create_for_of_iterator_helper_loose(components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + component.onLateUpdate(dt); + } + }; + return LateUpdateTickData; +} // function compareComponents (a: Component, b: Component): number { + // const itemA = a.item; + // const itemB = b.item; + // if (VFXItem.isAncestor(itemA, itemB)) { + // return -1; + // } else { + // return 1; + // } + // } +(TickData); + +/** + * 合成抽象类:核心对象,通常一个场景只包含一个合成,可能会有多个合成。 + * 合成中包含了相关的 Item 元素,支持对 Item 元素的创建、更新和销毁。 + * 也负责 Item 相关的动画播放控制,和持有渲染帧数据。 + */ var Composition = /*#__PURE__*/ function(EventEmitter) { + _inherits(Composition, EventEmitter); + function Composition(props, scene) { + var _this; + var _scene_jsonScene_renderSettings; + _this = EventEmitter.call(this) || this; + /** + * + */ _this.sceneTicking = new SceneTicking(); + /** + * 动画播放速度 + */ _this.speed = 1; + /** + * 合成是否结束 + */ _this.isEnded = false; + /** + * 用于保存与当前合成相关的插件数据 + */ _this.loaderData = {}; + /** + * 预合成数组 + */ _this.refContent = []; + /** + * 是否开启后处理 + */ _this.postProcessingEnabled = false; + // TODO: 待优化 + _this.assigned = false; + /** + * 销毁状态位 + */ _this.destroyed = false; + _this.postLoaders = []; + /** + * 合成暂停/播放 标识 + */ _this.paused = false; + _this.lastVideoUpdateTime = 0; + _this.isEndCalled = false; + _this._textures = []; + var _props_reusable = props.reusable, reusable = _props_reusable === void 0 ? false : _props_reusable, _props_speed = props.speed, speed = _props_speed === void 0 ? 1 : _props_speed, _props_baseRenderOrder = props.baseRenderOrder, baseRenderOrder = _props_baseRenderOrder === void 0 ? 0 : _props_baseRenderOrder, renderer = props.renderer, event = props.event, width = props.width, height = props.height, handleItemMessage = props.handleItemMessage; + _this.renderer = renderer; + _this._textures = scene.textureOptions; + var _scene_jsonScene_renderSettings_postProcessingEnabled; + _this.postProcessingEnabled = (_scene_jsonScene_renderSettings_postProcessingEnabled = (_scene_jsonScene_renderSettings = scene.jsonScene.renderSettings) == null ? void 0 : _scene_jsonScene_renderSettings.postProcessingEnabled) != null ? _scene_jsonScene_renderSettings_postProcessingEnabled : false; + _this.getEngine().renderLevel = scene.renderLevel; + if (reusable) { + _this.keepResource = true; + scene.textures = undefined; + scene.consumed = true; + } + var sourceContent = scene.jsonScene.compositions[0]; + for(var _iterator = _create_for_of_iterator_helper_loose(scene.jsonScene.compositions), _step; !(_step = _iterator()).done;){ + var composition = _step.value; + if (composition.id === scene.jsonScene.compositionId) { + sourceContent = composition; + } + } + assertExist(sourceContent); + // Instantiate composition rootItem + _this.rootItem = new exports.VFXItem(_this.getEngine()); + _this.rootItem.name = "rootItem"; + _this.rootItem.duration = sourceContent.duration; + _this.rootItem.endBehavior = sourceContent.endBehavior; + _this.rootItem.composition = _assert_this_initialized(_this); + // Create rootItem components + //@ts-expect-error TODO update spec. + var componentPaths = sourceContent.components; + for(var _iterator1 = _create_for_of_iterator_helper_loose(componentPaths), _step1; !(_step1 = _iterator1()).done;){ + var componentPath = _step1.value; + var component = _this.getEngine().findObject(componentPath); + _this.rootItem.components.push(component); + component.item = _this.rootItem; + } + _this.rootComposition = _this.rootItem.getComponent(exports.CompositionComponent); + _this.width = width; + _this.height = height; + _this.renderOrder = baseRenderOrder; + _this.id = sourceContent.id; + _this.renderer = renderer; + _this.event = event; + var _scene_startTime, _scene_totalTime; + _this.statistic = { + loadStart: (_scene_startTime = scene.startTime) != null ? _scene_startTime : 0, + loadTime: (_scene_totalTime = scene.totalTime) != null ? _scene_totalTime : 0, + compileTime: 0, + firstFrameTime: 0 + }; + _this.reusable = reusable; + _this.speed = speed; + _this.name = sourceContent.name; + _this.pluginSystem = scene.pluginSystem; + _this.pluginSystem.initializeComposition(_assert_this_initialized(_this), scene); + _this.camera = new Camera(_this.name, _extends({}, sourceContent == null ? void 0 : sourceContent.camera, { + aspect: width / height + })); + _this.url = scene.url; + _this.assigned = true; + _this.interactive = true; + _this.handleItemMessage = handleItemMessage; + _this.createRenderFrame(); + _this.rendererOptions = null; + Composition.buildItemTree(_this.rootItem); + _this.rootComposition.setChildrenRenderOrder(0); + _this.pluginSystem.resetComposition(_assert_this_initialized(_this), _this.renderFrame); + return _this; + } + var _proto = Composition.prototype; + /** + * 获取合成的时长 + */ _proto.getDuration = function getDuration() { + return this.rootItem.duration; + }; + /** + * 重新开始合成 + */ _proto.restart = function restart() { + this.reset(); + this.forwardTime(this.startTime); + }; + /** + * 设置当前合成的渲染顺序 + * @param index - 序号,大的后绘制 + */ _proto.setIndex = function setIndex(index) { + this.renderOrder = index; + }; + /** + * 获取当前合成的渲染顺序 + * @returns + */ _proto.getIndex = function getIndex() { + return this.renderOrder; + }; + /** + * 设置合成的动画速度 + * @param speed - 速度 + */ _proto.setSpeed = function setSpeed(speed) { + this.speed = speed; + }; + /** + * 设置合成的可见性 + * @since 2.0.0 + * @param visible - 是否可见 + */ _proto.setVisible = function setVisible(visible) { + this.rootItem.setVisible(visible); + }; + /** + * 获取合成的动画速度 + * @returns + */ _proto.getSpeed = function getSpeed() { + return this.speed; + }; + /** + * + */ _proto.play = function play() { + if (this.isEnded && this.reusable) { + this.restart(); + } + if (this.rootComposition.isStartCalled) { + this.gotoAndPlay(this.time - this.startTime); + } else { + this.gotoAndPlay(0); + } + }; + /** + * 暂停合成的播放 + */ _proto.pause = function pause() { + this.paused = true; + }; + /** + * + * @returns + */ _proto.getPaused = function getPaused() { + return this.paused; + }; + /** + * 恢复合成的播放 + */ _proto.resume = function resume() { + this.paused = false; + }; + /** + * 跳转合成到指定时间播放 + * @param time - 相对 startTime 的时间 + */ _proto.gotoAndPlay = function gotoAndPlay(time) { + this.setTime(time); + this.resume(); + }; + /** + * 跳转合成到指定时间并暂停 + * @param time - 相对 startTime 的时间 + */ _proto.gotoAndStop = function gotoAndStop(time) { + this.setTime(time); + this.pause(); + }; + /** + * + */ _proto.createRenderFrame = function createRenderFrame() { + this.renderFrame = new RenderFrame({ + camera: this.camera, + renderer: this.renderer, + keepColorBuffer: this.keepColorBuffer, + globalVolume: this.globalVolume, + postProcessingEnabled: this.postProcessingEnabled + }); + // TODO 考虑放到构造函数 + this.renderFrame.cachedTextures = this.textures; + }; + /** + * 跳到指定时间点(不做任何播放行为) + * @param time - 相对 startTime 的时间 + */ _proto.setTime = function setTime(time) { + var speed = this.speed; + var pause = this.getPaused(); + if (pause) { + this.resume(); + } + this.setSpeed(1); + this.forwardTime(time + this.startTime); + this.setSpeed(speed); + if (pause) { + this.pause(); + } + this.emit("goto", { + time: time + }); + }; + _proto.addItem = function addItem(item) { + this.items.push(item); + item.setParent(this.rootItem); + }; + /** + * 前进合成到指定时间 + * @param time - 相对0时刻的时间 + */ _proto.forwardTime = function forwardTime(time) { + var deltaTime = time * 1000 - this.rootComposition.time * 1000; + var reverse = deltaTime < 0; + var step = 15; + var t = Math.abs(deltaTime); + var ss = reverse ? -step : step; + for(t; t > step; t -= step){ + this.update(ss); + } + this.update(reverse ? -t : t); + }; + /** + * 重置状态函数 + */ _proto.reset = function reset() { + this.rendererOptions = null; + this.isEnded = false; + this.isEndCalled = false; + this.rootComposition.time = 0; + this.pluginSystem.resetComposition(this, this.renderFrame); + }; + _proto.prepareRender = function prepareRender() { + var _this = this; + var frame = this.renderFrame; + this.postLoaders.length = 0; + this.pluginSystem.plugins.forEach(function(loader) { + if (loader.prepareRenderFrame(_this, frame)) { + _this.postLoaders.push(loader); + } + }); + this.postLoaders.forEach(function(loader) { + return loader.postProcessFrame(_this, frame); + }); + }; + /** + * 合成更新,针对所有 item 的更新 + * @param deltaTime - 更新的时间步长 + */ _proto.update = function update(deltaTime) { + if (!this.assigned || this.getPaused()) { + return; + } + // scene VFXItem components lifetime function. + if (!this.rootItem.isDuringPlay) { + this.callAwake(this.rootItem); + this.rootItem.beginPlay(); + } + var dt = parseFloat(this.getUpdateTime(deltaTime * this.speed).toFixed(0)); + this.updateRootComposition(dt / 1000); + this.updateVideo(); + // 更新 model-tree-plugin + this.updatePluginLoaders(deltaTime); + this.sceneTicking.update.tick(dt); + this.sceneTicking.lateUpdate.tick(dt); + this.updateCamera(); + this.prepareRender(); + if (this.isEnded && !this.isEndCalled) { + this.isEndCalled = true; + this.emit("end", { + composition: this + }); + } + if (this.shouldDispose()) { + this.dispose(); + } + }; + _proto.shouldDispose = function shouldDispose() { + return this.isEnded && this.rootItem.endBehavior === EndBehavior.destroy && !this.reusable; + }; + _proto.getUpdateTime = function getUpdateTime(t) { + var startTimeInMs = this.startTime * 1000; + var now = this.rootComposition.time * 1000; + if (t < 0 && now + t < startTimeInMs) { + return startTimeInMs - now; + } + return t; + }; + _proto.callAwake = function callAwake(item) { + for(var _iterator = _create_for_of_iterator_helper_loose(item.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + if (!component.isAwakeCalled) { + component.onAwake(); + component.isAwakeCalled = true; + } + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(item.children), _step1; !(_step1 = _iterator1()).done;){ + var child = _step1.value; + this.callAwake(child); + } + }; + /** + * 更新视频数据到纹理 + * @override + */ _proto.updateVideo = function updateVideo() { + var now = performance.now(); + // 视频固定30帧更新 + if (now - this.lastVideoUpdateTime > 33) { + var _this_textures; + ((_this_textures = this.textures) != null ? _this_textures : []).forEach(function(tex) { + return tex == null ? void 0 : tex.uploadCurrentVideoFrame(); + }); + this.lastVideoUpdateTime = now; + } + }; + /** + * 更新相机 + * @override + */ _proto.updateCamera = function updateCamera() { + this.camera.updateMatrix(); + }; + /** + * 插件更新,来自 CompVFXItem 的更新调用 + * @param deltaTime - 更新的时间步长 + */ _proto.updatePluginLoaders = function updatePluginLoaders(deltaTime) { + var _this = this; + this.pluginSystem.plugins.forEach(function(loader) { + return loader.onCompositionUpdate(_this, deltaTime); + }); + }; + /** + * 更新主合成组件 + */ _proto.updateRootComposition = function updateRootComposition(deltaTime) { + if (this.rootComposition.state === PlayState.Paused || !this.rootComposition.isActiveAndEnabled) { + return; + } + var localTime = parseFloat((this.time + deltaTime - this.rootItem.start).toFixed(3)); + var isEnded = false; + var duration = this.rootItem.duration; + var endBehavior = this.rootItem.endBehavior; + if (localTime - duration > 0.001) { + isEnded = true; + switch(endBehavior){ + case EndBehavior.restart: + { + localTime = localTime % duration; + this.restart(); + break; + } + case EndBehavior.freeze: + { + localTime = Math.min(duration, localTime); + break; + } + case EndBehavior.forward: + { + break; + } + case EndBehavior.destroy: + { + break; + } + } + } + this.rootComposition.time = localTime; + // end state changed, handle onEnd flags + if (this.isEnded !== isEnded) { + if (isEnded) { + this.isEnded = true; + } else { + this.isEnded = false; + this.isEndCalled = false; + } + } + }; + /** + * 通过名称获取元素 + * @param name - 元素名称 + * @returns 元素对象 + */ _proto.getItemByName = function getItemByName(name) { + return this.rootItem.find(name); + }; + /** + * 获取指定位置和相机连成的射线 + * @param x + * @param y + * @returns + */ _proto.getHitTestRay = function getHitTestRay(x, y) { + var _this_renderFrame_editorTransform = this.renderFrame.editorTransform, a = _this_renderFrame_editorTransform.x, b = _this_renderFrame_editorTransform.y, c = _this_renderFrame_editorTransform.z, d = _this_renderFrame_editorTransform.w; + return setRayFromCamera((x - c) / a, (y - d) / b, this.camera); + }; + /** + * 获取 engine 对象 + * @returns + */ _proto.getEngine = function getEngine() { + var _this_renderer; + return (_this_renderer = this.renderer) == null ? void 0 : _this_renderer.engine; + }; + /** + * Item 求交测试,返回求交结果列表,x 和 y 是归一化到[-1, 1]区间的值,原点在左上角 + * @param x - 鼠标或触点的 x,已经归一化到[-1, 1] + * @param y - 鼠标或触点的 y,已经归一化到[-1, 1] + * @param force - 是否强制求交,没有交互信息的 Item 也要进行求交测试 + * @param options - 最大求交数和求交时的回调 + */ _proto.hitTest = function hitTest(x, y, force, options) { + if (this.isDestroyed || !this.interactive) { + return []; + } + var regions = []; + var ray = this.getHitTestRay(x, y); + this.refContent.forEach(function(ref) { + var _ref_getComponent; + (_ref_getComponent = ref.getComponent(exports.CompositionComponent)) == null ? void 0 : _ref_getComponent.hitTest(ray, x, y, regions, force, options); + }); + return regions; + }; + /** + * InteractItem 生命周期开始时的调用 + * @param item - 交互元素 + * @param type - 交互类型 + */ _proto.addInteractiveItem = function addInteractiveItem(item, type) { + if (type === InteractType.MESSAGE) { + this.handleItemMessage({ + name: item.name, + phrase: MESSAGE_ITEM_PHRASE_BEGIN, + id: item.id, + compositionId: this.id + }); + item.emit("message", { + name: item.name, + phrase: MESSAGE_ITEM_PHRASE_BEGIN, + id: item.id + }); + return item.id; + } + }; + /** + * InteractItem 生命周期结束时的调用 + * @param item - 交互元素 + * @param type - 交互类型 + */ _proto.removeInteractiveItem = function removeInteractiveItem(item, type) { + // MESSAGE ITEM 的结束行为 + if (type === InteractType.MESSAGE) { + this.handleItemMessage({ + name: item.name, + phrase: MESSAGE_ITEM_PHRASE_END, + id: item.id, + compositionId: this.id + }); + item.emit("message", { + name: item.name, + phrase: MESSAGE_ITEM_PHRASE_END, + id: item.id + }); + } + }; + /** + * 销毁 Item + * @internal + * @param item - 需要销毁的 item + */ _proto.destroyItem = function destroyItem(item) { + var _this = this; + // 预合成元素销毁时销毁其中的item + if (item.type == ItemType.composition) { + if (item.endBehavior !== EndBehavior.freeze) { + var contentItems = item.getComponent(exports.CompositionComponent).items; + contentItems.forEach(function(it) { + return _this.pluginSystem.plugins.forEach(function(loader) { + return loader.onCompositionItemRemoved(_this, it); + }); + }); + } + } else { + // this.content.removeItem(item); + // 预合成中的元素移除 + // this.refContent.forEach(content => content.removeItem(item)); + removeItem(this.items, item); + this.pluginSystem.plugins.forEach(function(loader) { + return loader.onCompositionItemRemoved(_this, item); + }); + } + }; + _proto.lost = function lost(e) { + this.videoState = this.textures.map(function(tex) { + if ("video" in tex.source) { + tex.source.video.pause(); + return tex.source.video.currentTime; + } + }); + this.textures.map(function(tex) { + return tex.dispose(); + }); + this.dispose(); + }; + /** + * 合成对象销毁 + */ _proto.dispose = function dispose() { + var _this = this; + var _this_rendererOptions, _this_pluginSystem; + if (this.destroyed) { + return; + } + this.destroyed = true; + var textureDisposes = {}; + var textures = this.textures; + if (textures) { + if (this.keepResource) { + textures.forEach(function(tex) { + if (tex == null ? void 0 : tex.dispose) { + textureDisposes[tex.id] = tex.dispose; + tex.dispose = noop; + } + }); + } + } + this.rootItem.dispose(); + // FIXME: 注意这里增加了renderFrame销毁 + this.renderFrame.dispose(); + (_this_rendererOptions = this.rendererOptions) == null ? void 0 : _this_rendererOptions.emptyTexture.dispose(); + (_this_pluginSystem = this.pluginSystem) == null ? void 0 : _this_pluginSystem.destroyComposition(this); + this.update = function() { + { + logger.error("Update disposed composition: " + _this.name + "."); + } + }; + this.dispose = noop; + if (textures && this.keepResource) { + textures.forEach(function(tex) { + tex.dispose = textureDisposes[tex.id]; + tex.dispose(); + }); + } + if (this.renderer.env === PLAYER_OPTIONS_ENV_EDITOR) { + return; + } + this.renderer.clear({ + stencilAction: exports.TextureLoadAction.clear, + clearStencil: 0, + depthAction: exports.TextureLoadAction.clear, + clearDepth: 1, + colorAction: exports.TextureLoadAction.clear, + clearColor: [ + 0, + 0, + 0, + 0 + ] + }); + }; + /** + * 编辑器使用的 transform 修改方法 + * @internal + * @param scale - 缩放比例 + * @param dx - x偏移量 + * @param dy - y偏移量 + */ _proto.setEditorTransform = function setEditorTransform(scale, dx, dy) { + this.renderFrame.editorTransform.set(scale, scale, dx, dy); + }; + /** + * 合成整体在水平方向移动 x 像素,垂直方向移动 y 像素 + */ _proto.translateByPixel = function translateByPixel(x, y) { + if (!this.renderer) { + console.warn("Renderer not assigned. Operation aborted."); + return; + } + this.rootItem.translateByPixel(x, y); + }; + /** + * 设置合成在画布上的像素位置 + * Tips: + * - 坐标原点在 canvas 左上角,x 正方向水平向右, y 正方向垂直向下 + * - 设置后会覆盖原有的位置信息 + * @param x - x 坐标 + * @param y - y 坐标 + */ _proto.setPositionByPixel = function setPositionByPixel(x, y) { + if (!this.renderer) { + console.warn("Renderer not assigned. Operation aborted."); + return; + } + this.rootItem.setPositionByPixel(x, y); + }; + /** + * 设置合成在 3D 坐标轴上相对当前的位移 + */ _proto.translate = function translate(x, y, z) { + this.rootItem.translate(x, y, z); + }; + /** + * 设置合成在 3D 坐标轴上相对原点的位移 + */ _proto.setPosition = function setPosition(x, y, z) { + this.rootItem.setPosition(x, y, z); + }; + /** + * 设置合成在 3D 坐标轴上相对当前的旋转(角度) + */ _proto.rotate = function rotate(x, y, z) { + this.rootItem.rotate(x, y, z); + }; + /** + * 设置合成在 3D 坐标轴上的相对原点的旋转(角度) + */ _proto.setRotation = function setRotation(x, y, z) { + this.rootItem.setRotation(x, y, z); + }; + /** + * 设置合成在 3D 坐标轴上相对当前的缩放 + */ _proto.scale = function scale(x, y, z) { + this.rootItem.scale(x, y, z); + }; + /** + * 设置合成在 3D 坐标轴上的缩放 + */ _proto.setScale = function setScale(x, y, z) { + this.rootItem.setScale(x, y, z); + }; + /** + * 卸载贴图纹理方法,减少内存 + */ _proto.offloadTexture = function offloadTexture() { + if (!this.textureOffloaded) { + this.textures.forEach(function(tex) { + return tex && tex.offloadData(); + }); + this.textureOffloaded = true; + } + }; + _proto.getRendererOptions = function getRendererOptions() { + if (!this.rendererOptions) { + this.rendererOptions = { + emptyTexture: this.renderFrame.emptyTexture, + cachePrefix: "-" + }; + } + return this.rendererOptions; + }; + /** + * 重新加载纹理 + */ _proto.reloadTexture = function reloadTexture() { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!_this.textureOffloaded) return [ + 3, + 2 + ]; + return [ + 4, + Promise.all(_this.textures.map(function(tex) { + return tex == null ? void 0 : tex.reloadData(); + })) + ]; + case 1: + _state.sent(); + _this.textureOffloaded = false; + _state.label = 2; + case 2: + return [ + 2 + ]; + } + }); + })(); + }; + /** + * @internal + * 构建父子树,同时保存到 itemCacheMap 中便于查找 + */ Composition.buildItemTree = function buildItemTree(compVFXItem) { + var itemMap = new Map(); + var contentItems = compVFXItem.getComponent(exports.CompositionComponent).items; + for(var _iterator = _create_for_of_iterator_helper_loose(contentItems), _step; !(_step = _iterator()).done;){ + var item = _step.value; + itemMap.set(item.id, item); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(contentItems), _step1; !(_step1 = _iterator1()).done;){ + var item1 = _step1.value; + if (item1.parentId === undefined) { + item1.setParent(compVFXItem); + } else { + var parent = itemMap.get(item1.parentId); + if (parent) { + item1.setParent(parent); + } else { + throw new Error("The element references a non-existent element, please check the data."); + } + } + } + }; + _create_class(Composition, [ + { + key: "transform", + get: /** + * 所有合成 Item 的根变换 + */ function get() { + return this.rootItem.transform; + } + }, + { + key: "textures", + get: /** + * 获取场景中的纹理数组 + */ function get() { + return this._textures; + } + }, + { + key: "items", + get: /** + * 获取合成中所有元素 + */ function get() { + return this.rootComposition.items; + } + }, + { + key: "startTime", + get: /** + * 获取合成开始渲染的时间 + */ function get() { + return this.rootComposition.startTime; + } + }, + { + key: "time", + get: /** + * 获取合成当前时间 + */ function get() { + return this.rootComposition.time; + } + }, + { + key: "isDestroyed", + get: /** + * 获取销毁状态 + */ function get() { + return this.destroyed; + } + }, + { + key: "viewportMatrix", + get: function get() { + return this.camera.getViewportMatrix(); + }, + set: function set(matrix) { + this.camera.setViewportMatrix(matrix); + } + } + ]); + return Composition; +}(EventEmitter); + +exports.VFXItem = /*#__PURE__*/ function(EffectsObject) { + _inherits(VFXItem, EffectsObject); + function VFXItem(engine, props) { + var _this; + _this = EffectsObject.call(this, engine) || this; + _this.children = []; + /** + * 元素的变换包含位置、旋转、缩放。 + */ _this.transform = new Transform(); + /** + * 元素动画的当前时间 + */ _this.time = -1; + /** + * 元素动画的持续时间 + */ _this.duration = 0; + /** + * 元素动画的开始时间 + */ _this.start = 0; + /** + * 元素动画结束时行为(如何处理元素) + */ _this.endBehavior = EndBehavior.forward; + _this.type = ItemType.base; + _this.components = []; + _this.isDuringPlay = false; + /** + * 元素是否激活 + */ _this.active = true; + /** + * 元素组件是否显示,用于批量开关元素组件 + */ _this.visible = true; + /** + * 元素动画的速度 + */ _this.speed = 1; + _this.listIndex = 0; + _this.isEnabled = false; + _this.eventProcessor = new EventEmitter(); + _this.name = "VFXItem"; + _this.transform.name = _this.name; + _this.transform.engine = engine; + if (props) { + _this.fromData(props); + } + return _this; + } + var _proto = VFXItem.prototype; + /** + * 元素监听事件 + * @param eventName - 事件名称 + * @param listener - 事件监听器 + * @param options - 事件监听器选项 + * @returns + */ _proto.on = function on(eventName, listener, options) { + this.eventProcessor.on(eventName, listener, options); + }; + /** + * 移除事件监听器 + * @param eventName - 事件名称 + * @param listener - 事件监听器 + * @returns + */ _proto.off = function off(eventName, listener) { + this.eventProcessor.off(eventName, listener); + }; + /** + * 一次性监听事件 + * @param eventName - 事件名称 + * @param listener - 事件监听器 + */ _proto.once = function once(eventName, listener) { + this.eventProcessor.once(eventName, listener); + }; + /** + * 触发事件 + * @param eventName - 事件名称 + * @param args - 事件参数 + */ _proto.emit = function emit(eventName) { + for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){ + args[_key - 1] = arguments[_key]; + } + var _this_eventProcessor; + (_this_eventProcessor = this.eventProcessor).emit.apply(_this_eventProcessor, [].concat([ + eventName + ], args)); + }; + /** + * 获取事件名称对应的所有监听器 + * @param eventName - 事件名称 + * @returns - 返回事件名称对应的所有监听器 + */ _proto.getListeners = function getListeners(eventName) { + return this.eventProcessor.getListeners(eventName); + }; + /** + * 设置元素的动画速度 + * @param speed - 速度 + */ _proto.setSpeed = function setSpeed(speed) { + this.speed = speed; + }; + /** + * 获取元素的动画速度 + * @returns + */ _proto.getSpeed = function getSpeed() { + return this.speed; + }; + /** + * 添加组件 + * @param classConstructor - 要添加的组件 + */ _proto.addComponent = function addComponent(classConstructor) { + var newComponent = new classConstructor(this.engine); + this.components.push(newComponent); + newComponent.setVFXItem(this); + return newComponent; + }; + /** + * 获取某一类型的组件。如果当前元素绑定了多个同类型的组件只返回第一个 + * @param classConstructor - 要获取的组件类型 + * @returns 查询结果中符合类型的第一个组件 + */ _proto.getComponent = function getComponent(classConstructor) { + var res; + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var com = _step.value; + if (_instanceof1(com, classConstructor)) { + res = com; + break; + } + } + return res; + }; + /** + * 获取某一类型的所有组件 + * @param classConstructor - 要获取的组件 + * @returns 一个组件列表,包含所有符合类型的组件 + */ _proto.getComponents = function getComponents(classConstructor) { + var res = []; + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var com = _step.value; + if (_instanceof1(com, classConstructor)) { + res.push(com); + } + } + return res; + }; + _proto.setParent = function setParent(vfxItem) { + if (vfxItem === this && !vfxItem) { + return; + } + if (this.parent) { + removeItem(this.parent.children, this); + } + this.parent = vfxItem; + this.transform.parentTransform = vfxItem.transform; + vfxItem.children.push(this); + if (!this.composition && vfxItem.composition) { + this.composition = vfxItem.composition; + } + if (!this.isDuringPlay && vfxItem.isDuringPlay) { + this.beginPlay(); + } + }; + /** + * 通过指定 r、g、b、a 值设置元素的颜色 + * @param {number} r + * @param {number} g + * @param {number} b + * @param {number} a + * @internal + */ _proto.setColor = function setColor(r, g, b, a) {}; + /** + * 设置元素的透明度 + * @param opacity - 透明度值,范围 [0,1] + */ _proto.setOpacity = function setOpacity(opacity) {}; + /** + * 激活或停用 VFXItem + */ _proto.setActive = function setActive(value) { + if (this.active !== value) { + this.active = !!value; + this.onActiveChanged(); + } + }; + /** + * 设置元素的显隐,该设置会批量开关元素组件 + */ _proto.setVisible = function setVisible(visible) { + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + component.enabled = visible; + } + this.visible = visible; + }; + /** + * 元素组件显隐状态 + * @deprecated use isVisible instead + */ _proto.getVisible = function getVisible() { + return this.visible; + }; + /** + * 获取元素变换包括位置、旋转、缩放 + * @param transform 将元素变换拷贝到该对象,并将其作为返回值 + * @returns 元素变换的拷贝 + */ _proto.getWorldTransform = function getWorldTransform(transform) { + var tf = transform != null ? transform : new Transform({ + valid: true + }); + tf.cloneFromMatrix(this.transform.getWorldMatrix()); + return tf; + }; + /** + * 设置元素在 3D 坐标轴上相对移动 + */ _proto.translate = function translate(x, y, z) { + this.transform.translate(x, y, z); + }; + /** + * 设置元素在 3D 坐标轴上相对旋转(角度) + */ _proto.rotate = function rotate(x, y, z) { + var euler = new Euler(x, y, z); + var q = Quaternion.fromEuler(euler); + q.conjugate(); + this.transform.rotateByQuat(q); + }; + /** + * 设置元素在 3D 坐标轴上相对缩放 + */ _proto.scale = function scale(x, y, z) { + this.transform.scaleBy(x, y, z); + }; + /** + * 设置元素在画布上的像素位置 + * Tips: + * - 坐标原点在 canvas 左上角,x 正方向水平向右, y 正方向垂直向下 + * - 设置后会覆盖原有的位置信息 + * @param x - x 坐标 + * @param y - y 坐标 + */ _proto.setPositionByPixel = function setPositionByPixel(x, y) { + if (this.composition) { + var z = this.transform.getWorldPosition().z; + var _this_composition_camera_getInverseVPRatio = this.composition.camera.getInverseVPRatio(z), rx = _this_composition_camera_getInverseVPRatio.x, ry = _this_composition_camera_getInverseVPRatio.y; + var width = this.composition.renderer.getWidth() / 2; + var height = this.composition.renderer.getHeight() / 2; + this.transform.setPosition((2 * x / width - 1) * rx, (1 - 2 * y / height) * ry, z); + } + }; + /** + * 设置元素在 3D 坐标轴的位置 + */ _proto.setPosition = function setPosition(x, y, z) { + this.transform.setPosition(x, y, z); + }; + /** + * 设置元素在 3D 坐标轴的角度 + */ _proto.setRotation = function setRotation(x, y, z) { + this.transform.setRotation(x, y, z); + }; + /** + * 设置元素在 3D 坐标轴的缩放 + */ _proto.setScale = function setScale(x, y, z) { + this.transform.setScale(x, y, z); + }; + /** + * 获取元素包围盒 + * @override + */ _proto.getBoundingBox = function getBoundingBox() { + // OVERRIDE + }; + /** + * 获取元素用于计算光线投射的面片类型和参数 + * @override + * @param force - 元素没有开启交互也返回参数 + */ _proto.getHitTestParams = function getHitTestParams(force) { + // OVERRIDE + }; + /** + * 获取元素当前世界坐标 + */ _proto.getCurrentPosition = function getCurrentPosition() { + var pos = new Vector3(); + this.transform.assignWorldTRS(pos); + return pos; + }; + _proto.find = function find(name) { + var _queue; + if (this.name === name) { + return this; + } + var queue = []; + (_queue = queue).push.apply(_queue, [].concat(this.children)); + var index = 0; + while(index < queue.length){ + var _queue1; + var item = queue[index]; + index++; + if (item.name === name) { + return item; + } + (_queue1 = queue).push.apply(_queue1, [].concat(item.children)); + } + return undefined; + }; + /** + * 复制 VFXItem,返回一个新的 VFXItem + * @since 2.4.0 + * @returns 复制的新 VFXItem + */ _proto.duplicate = function duplicate() { + var previousObjectIDMap = new Map(); + this.gatherPreviousObjectID(previousObjectIDMap); + // 重新设置当前元素和组件的 ID 以及子元素和子元素组件的 ID,避免实例化新的对象时产生碰撞 + this.resetGUID(); + var newItem = this.engine.findObject({ + id: this.defination.id + }); + newItem.resetGUID(); + this.resetGUID(previousObjectIDMap); + if (this.composition) { + newItem.setParent(this.composition.rootItem); + } + return newItem; + }; + /** + * @internal + */ _proto.beginPlay = function beginPlay() { + this.isDuringPlay = true; + if (this.composition && this.active && !this.isEnabled) { + this.onEnable(); + } + for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){ + var child = _step.value; + if (!child.isDuringPlay) { + child.beginPlay(); + } + } + }; + /** + * @internal + */ _proto.onActiveChanged = function onActiveChanged() { + if (!this.isEnabled) { + this.onEnable(); + } else { + this.onDisable(); + } + }; + /** + * @internal + */ _proto.onEnable = function onEnable() { + this.isEnabled = true; + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + if (component.enabled && !component.isStartCalled) { + component.onStart(); + component.isStartCalled = true; + } + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.components), _step1; !(_step1 = _iterator1()).done;){ + var component1 = _step1.value; + if (component1.enabled && !component1.isEnableCalled) { + component1.enable(); + } + } + }; + /** + * @internal + */ _proto.onDisable = function onDisable() { + this.isEnabled = false; + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + if (component.enabled && component.isEnableCalled) { + component.disable(); + } + } + }; + _proto.fromData = function fromData(data) { + EffectsObject.prototype.fromData.call(this, data); + var id = data.id, name = data.name, delay = data.delay, parentId = data.parentId, endBehavior = data.endBehavior, transform = data.transform, _data_duration = data.duration, duration = _data_duration === void 0 ? 0 : _data_duration; + this.props = data; + this.type = data.type; + this.id = id.toString(); // TODO 老数据 id 是 number,需要转换 + this.name = name; + this.start = delay ? delay : this.start; + var transformProps = {}; + if (transform) { + transformProps.position = new Vector3().copyFrom(transform.position); + // FIXME: transform.rotation待删除 + //@ts-expect-error + if (transform.quat) { + //@ts-expect-error + transformProps.quat = new Quaternion(transform.quat.x, transform.quat.y, transform.quat.z, transform.quat.w); + } else { + var _transform_eulerHint; + //@ts-expect-error + transformProps.rotation = new Euler().copyFrom((_transform_eulerHint = transform.eulerHint) != null ? _transform_eulerHint : transform.rotation); + } + transformProps.scale = new Vector3().copyFrom(transform.scale); + if (transform.size) { + transformProps.size = new Vector2().copyFrom(transform.size); + } + if (transform.anchor) { + transformProps.anchor = new Vector2().copyFrom(transform.anchor); + } + this.transform.setTransform(transformProps); + } + this.transform.name = this.name; + this.transform.engine = this.engine; + this.parentId = parentId; + this.duration = duration; + this.endBehavior = endBehavior; + if (!data.content) { + data.content = { + options: {} + }; + } + if (duration < 0) { + throw new Error("Item duration can't be less than 0, see " + HELP_LINK$1["Item duration can't be less than 0"] + "."); + } + if (data.components) { + this.components.length = 0; + for(var _iterator = _create_for_of_iterator_helper_loose(data.components), _step; !(_step = _iterator()).done;){ + var componentPath = _step.value; + var component = this.engine.findObject(componentPath); + this.components.push(component); + // TODO ParticleSystemRenderer 现在是动态生成的,后面需要在 json 中单独表示为一个组件 + if (_instanceof1(component, exports.ParticleSystem)) { + if (!this.components.includes(component.renderer)) { + this.components.push(component.renderer); + } + } + } + } + if (VFXItem.isComposition(this)) { + this.instantiatePreComposition(); + } + }; + _proto.toData = function toData() { + var _this_parent; + this.defination.id = this.guid; + this.defination.transform = this.transform.toData(); + this.defination.dataType = DataType.VFXItemData; + if (((_this_parent = this.parent) == null ? void 0 : _this_parent.name) !== "rootItem") { + var _this_parent1; + this.defination.parentId = (_this_parent1 = this.parent) == null ? void 0 : _this_parent1.guid; + } + // TODO 统一 sprite 等其他组件的序列化逻辑 + if (!this.defination.components) { + this.defination.components = []; + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + if (_instanceof1(component, exports.EffectComponent)) { + this.defination.components.push(component); + } + } + } + this.defination.content = {}; + }; + _proto.translateByPixel = function translateByPixel(x, y) { + if (this.composition) { + // @ts-expect-error + var _this_composition_renderer_canvas_getBoundingClientRect = this.composition.renderer.canvas.getBoundingClientRect(), width = _this_composition_renderer_canvas_getBoundingClientRect.width, height = _this_composition_renderer_canvas_getBoundingClientRect.height; + var z = this.transform.getWorldPosition().z; + var _this_composition_camera_getInverseVPRatio = this.composition.camera.getInverseVPRatio(z), rx = _this_composition_camera_getInverseVPRatio.x, ry = _this_composition_camera_getInverseVPRatio.y; + this.transform.translate(2 * x * rx / width, -2 * y * ry / height, 0); + } + }; + /** + * 销毁元素 + */ _proto.dispose = function dispose() { + this.resetChildrenParent(); + if (this.composition) { + this.composition.destroyItem(this); + // component 调用 dispose() 会将自身从 this.components 数组删除,slice() 避免迭代错误 + for(var _iterator = _create_for_of_iterator_helper_loose(this.components.slice()), _step; !(_step = _iterator()).done;){ + var component = _step.value; + component.dispose(); + } + this.components = []; + this._content = undefined; + this._composition = null; + this.transform.setValid(false); + } + }; + _proto.resetChildrenParent = function resetChildrenParent() { + // GE 父元素销毁子元素继承逻辑 + // 如果有父对象,销毁时子对象继承父对象。 + for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){ + var child = _step.value; + if (this.parent) { + child.setParent(this.parent); + } + } + if (this.parent) { + var _this_parent; + removeItem((_this_parent = this.parent) == null ? void 0 : _this_parent.children, this); + } + // const contentItems = compositonVFXItem.getComponent(CompositionComponent)!.items; + // contentItems.splice(contentItems.indexOf(this), 1); + // else { + // // 普通元素正常销毁逻辑, 子元素不继承 + // if (this.parent) { + // removeItem(this.parent?.children, this); + // } + // } + }; + _proto.instantiatePreComposition = function instantiatePreComposition() { + var compositionContent = this.props.content; + var refId = compositionContent.options.refId; + var props = this.engine.findEffectsObjectData(refId); + if (!props) { + throw new Error("Referenced precomposition with Id: " + refId + " does not exist."); + } + //@ts-expect-error TODO update spec. + var componentPaths = props.components; + for(var _iterator = _create_for_of_iterator_helper_loose(componentPaths), _step; !(_step = _iterator()).done;){ + var componentPath = _step.value; + var component = this.engine.findObject(componentPath); + component.item = this; + this.components.push(component); + component.setInstanceId(generateGUID()); + if (_instanceof1(component, exports.CompositionComponent)) { + for(var _iterator1 = _create_for_of_iterator_helper_loose(component.items), _step1; !(_step1 = _iterator1()).done;){ + var vfxItem = _step1.value; + vfxItem.setInstanceId(generateGUID()); + for(var _iterator2 = _create_for_of_iterator_helper_loose(vfxItem.components), _step2; !(_step2 = _iterator2()).done;){ + var component1 = _step2.value; + component1.setInstanceId(generateGUID()); + } + } + } + } + Composition.buildItemTree(this); + }; + _proto.resetGUID = function resetGUID(previousObjectIDMap) { + var _previousObjectIDMap_get; + var itemGUID = (_previousObjectIDMap_get = previousObjectIDMap == null ? void 0 : previousObjectIDMap.get(this)) != null ? _previousObjectIDMap_get : generateGUID(); + this.setInstanceId(itemGUID); + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + var _previousObjectIDMap_get1; + var componentGUID = (_previousObjectIDMap_get1 = previousObjectIDMap == null ? void 0 : previousObjectIDMap.get(component)) != null ? _previousObjectIDMap_get1 : generateGUID(); + component.setInstanceId(componentGUID); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.children), _step1; !(_step1 = _iterator1()).done;){ + var child = _step1.value; + child.resetGUID(previousObjectIDMap); + } + }; + _proto.gatherPreviousObjectID = function gatherPreviousObjectID(previousObjectIDMap) { + previousObjectIDMap.set(this, this.getInstanceId()); + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + previousObjectIDMap.set(component, component.getInstanceId()); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.children), _step1; !(_step1 = _iterator1()).done;){ + var child = _step1.value; + child.gatherPreviousObjectID(previousObjectIDMap); + } + }; + /** + * + * @param item + * @returns + */ VFXItem.isComposition = function isComposition(item) { + return item.type === ItemType.composition; + }; + /** + * + * @param item + * @returns + */ VFXItem.isSprite = function isSprite(item) { + return item.type === ItemType.sprite; + }; + /** + * + * @param item + * @returns + */ VFXItem.isParticle = function isParticle(item) { + return item.type === ItemType.particle; + }; + /** + * + * @param item + * @returns + */ VFXItem.isNull = function isNull(item) { + return item.type === ItemType.null; + }; + /** + * + * @param item + * @returns + */ VFXItem.isTree = function isTree(item) { + return item.type === ItemType.tree; + }; + /** + * + * @param item + * @returns + */ VFXItem.isCamera = function isCamera(item) { + return item.type === ItemType.camera; + }; + /** + * + * @param ancestorCandidate + * @param descendantCandidate + * @returns + */ VFXItem.isAncestor = function isAncestor(ancestorCandidate, descendantCandidate) { + var current = descendantCandidate.parent; + while(current){ + if (current === ancestorCandidate) { + return true; + } + current = current.parent; + } + return false; + }; + _create_class(VFXItem, [ + { + key: "content", + get: /** + * 返回元素创建的数据 + */ function get() { + return this._content; + } + }, + { + key: "composition", + get: /** + * 获取元素的合成 + */ function get() { + return this._composition; + }, + set: /** + * 设置元素的合成 + */ function set(value) { + this._composition = value; + for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){ + var child = _step.value; + if (!child.composition) { + child.composition = value; + } + } + } + }, + { + key: "compositionReusable", + get: /** + * 播放完成后是否需要再使用,是的话生命周期结束后不会 dispose + */ function get() { + var _this_composition; + var _this_composition_reusable; + return (_this_composition_reusable = (_this_composition = this.composition) == null ? void 0 : _this_composition.reusable) != null ? _this_composition_reusable : false; + } + }, + { + key: "renderOrder", + get: /** + * 元素在合成中的索引 + */ function get() { + return this.listIndex; + }, + set: function set(value) { + if (this.listIndex !== value) { + this.listIndex = value; + for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + if (_instanceof1(component, RendererComponent)) { + component.priority = value; + } + } + } + } + }, + { + key: "isActive", + get: /** + * 当前 VFXItem 是否激活 + */ function get() { + return this.active; + } + }, + { + key: "isVisible", + get: /** + * 元素组件显隐状态 + */ function get() { + return this.visible; + } + } + ]); + return VFXItem; +}(EffectsObject); +exports.VFXItem = __decorate([ + effectsClass(DataType.VFXItemData) +], exports.VFXItem); +exports.Item = void 0; +(function(Item) { + function is(item, type) { + return item.type === type; + } + Item.is = is; + function isComposition(item) { + return item.type === ItemType.composition; + } + Item.isComposition = isComposition; + function isParticle(item) { + return item.type === ItemType.particle; + } + Item.isParticle = isParticle; + function isNull(item) { + return item.type === ItemType.null; + } + Item.isNull = isNull; +})(exports.Item || (exports.Item = {})); + +var tempColor = [ + 1, + 1, + 1, + 1 +]; +var ColorPlayable = /*#__PURE__*/ function(Playable) { + _inherits(ColorPlayable, Playable); + function ColorPlayable() { + var _this; + _this = Playable.apply(this, arguments) || this; + _this.renderColor = [ + 1, + 1, + 1, + 1 + ]; + return _this; + } + var _proto = ColorPlayable.prototype; + _proto.processFrame = function processFrame(context) { + var boundObject = context.output.getUserData(); + if (!_instanceof1(boundObject, exports.VFXItem)) { + return; + } + if (!this.activeComponent) { + this.activeComponent = this.getActiveComponent(boundObject); + } + if (!this.activeMaterial) { + var _this_activeComponent, _this_activeMaterial; + this.activeMaterial = (_this_activeComponent = this.activeComponent) == null ? void 0 : _this_activeComponent.material; + var startColor = (_this_activeMaterial = this.activeMaterial) == null ? void 0 : _this_activeMaterial.getColor("_Color"); + if (startColor) { + this.startColor = startColor.toArray(); + } + } + var colorInc = vecFill(tempColor, 1); + var colorChanged; + var life = this.time / boundObject.duration; + var opacityOverLifetime = this.opacityOverLifetime; + var colorOverLifetime = this.colorOverLifetime; + if (colorOverLifetime) { + colorInc = getColorFromGradientStops(colorOverLifetime, life, true); + colorChanged = true; + } + if (opacityOverLifetime) { + colorInc[3] *= opacityOverLifetime.getValue(life); + colorChanged = true; + } + if (colorChanged) { + var _this_activeMaterial_getColor, _this_activeMaterial1; + vecMulCombine(this.renderColor, colorInc, this.startColor); + (_this_activeMaterial1 = this.activeMaterial) == null ? void 0 : (_this_activeMaterial_getColor = _this_activeMaterial1.getColor("_Color")) == null ? void 0 : _this_activeMaterial_getColor.setFromArray(this.renderColor); + } + }; + _proto.create = function create(clipData) { + this.clipData = clipData; + var colorOverLifetime = clipData.colorOverLifetime; + if (colorOverLifetime) { + var _colorOverLifetime_opacity; + this.opacityOverLifetime = createValueGetter((_colorOverLifetime_opacity = colorOverLifetime.opacity) != null ? _colorOverLifetime_opacity : 1); + if (colorOverLifetime.color && colorOverLifetime.color[0] === ValueType.GRADIENT_COLOR) { + this.colorOverLifetime = colorStopsFromGradient(colorOverLifetime.color[1]); + } + } + return this; + }; + _proto.getActiveComponent = function getActiveComponent(boundObject) { + return boundObject.getComponent(BaseRenderComponent); + }; + return ColorPlayable; +}(Playable); + +var singleSplits = [ + [ + 0, + 0, + 1, + 1, + undefined + ] +]; +var seed$6 = 0; +exports.SpriteColorPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(SpriteColorPlayableAsset, PlayableAsset); + function SpriteColorPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = SpriteColorPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var spriteColorPlayable = new ColorPlayable(graph); + spriteColorPlayable.create(this.data); + return spriteColorPlayable; + }; + _proto.fromData = function fromData(data) { + this.data = data; + }; + return SpriteColorPlayableAsset; +}(PlayableAsset); +exports.SpriteColorPlayableAsset = __decorate([ + effectsClass(DataType.SpriteColorPlayableAsset) +], exports.SpriteColorPlayableAsset); +exports.SpriteComponent = /*#__PURE__*/ function(BaseRenderComponent) { + _inherits(SpriteComponent, BaseRenderComponent); + function SpriteComponent(engine, props) { + var _this; + _this = BaseRenderComponent.call(this, engine) || this; + _this.splits = singleSplits; + _this.frameAnimationLoop = false; + _this.name = "MSprite" + seed$6++; + _this.geometry = _this.createGeometry(); + if (props) { + _this.fromData(props); + } + return _this; + } + var _proto = SpriteComponent.prototype; + _proto.onUpdate = function onUpdate(dt) { + var _this = this; + var time = this.item.time; + var duration = this.item.duration; + if (time > duration && this.frameAnimationLoop) { + time = time % duration; + } + var life = Math.min(Math.max(time / duration, 0.0), 1.0); + var ta = this.textureSheetAnimation; + var video = this.renderer.texture.source.video; + if (video) { + if (time === 0) { + video.pause(); + } else { + video.play().catch(function(e) { + _this.engine.renderErrors.add(e); + }); + } + } + if (ta) { + var _this_material_getVector4; + var total = ta.total || ta.row * ta.col; + var texRectX = 0; + var texRectY = 0; + var texRectW = 1; + var texRectH = 1; + var flip; + if (this.splits) { + var sp = this.splits[0]; + flip = sp[4]; + texRectX = sp[0]; + texRectY = sp[1]; + if (flip) { + texRectW = sp[3]; + texRectH = sp[2]; + } else { + texRectW = sp[2]; + texRectH = sp[3]; + } + } + var dx, dy; + if (flip) { + dx = 1 / ta.row * texRectW; + dy = 1 / ta.col * texRectH; + } else { + dx = 1 / ta.col * texRectW; + dy = 1 / ta.row * texRectH; + } + var texOffset; + if (ta.animate) { + var frameIndex = Math.round(life * (total - 1)); + var yIndex = Math.floor(frameIndex / ta.col); + var xIndex = frameIndex - yIndex * ta.col; + texOffset = flip ? [ + dx * yIndex, + dy * (ta.col - xIndex) + ] : [ + dx * xIndex, + dy * (1 + yIndex) + ]; + } else { + texOffset = [ + 0, + dy + ]; + } + (_this_material_getVector4 = this.material.getVector4("_TexOffset")) == null ? void 0 : _this_material_getVector4.setFromArray([ + texRectX + texOffset[0], + texRectH + texRectY - texOffset[1], + dx, + dy + ]); + } + }; + _proto.onDestroy = function onDestroy() { + var texture = this.renderer.texture; + var source = texture.source; + if (source.sourceType === exports.TextureSourceType.video && (source == null ? void 0 : source.video)) { + source.video.pause(); + source.video.src = ""; + source.video.load(); + } + }; + _proto.getItemGeometryData = function getItemGeometryData(geometry) { + var _this = this, splits = _this.splits, textureSheetAnimation = _this.textureSheetAnimation; + var sx = 1, sy = 1; + var renderer = this.renderer; + if (renderer.shape) { + var _renderer_shape = renderer.shape, _renderer_shape_index = _renderer_shape.index, index = _renderer_shape_index === void 0 ? [] : _renderer_shape_index, _renderer_shape_aPoint = _renderer_shape.aPoint, aPoint = _renderer_shape_aPoint === void 0 ? [] : _renderer_shape_aPoint; + var point = new Float32Array(aPoint); + var position = []; + var atlasOffset = []; + for(var i = 0; i < point.length; i += 6){ + point[i] *= sx; + point[i + 1] *= sy; + atlasOffset.push(aPoint[i + 2], aPoint[i + 3]); + position.push(point[i], point[i + 1], 0.0); + } + geometry.setAttributeData("aPos", new Float32Array(position)); + return { + index: index, + atlasOffset: atlasOffset + }; + } + var originData = [ + -.5, + .5, + -.5, + -.5, + .5, + .5, + .5, + -.5 + ]; + var atlasOffset1 = []; + var index1 = []; + var col = 2; + var row = 2; + if (splits.length === 1) { + col = 1; + row = 1; + } + var position1 = []; + for(var x = 0; x < col; x++){ + for(var y = 0; y < row; y++){ + var base = (y * 2 + x) * 4; + // @ts-expect-error + var split = textureSheetAnimation ? [ + 0, + 0, + 1, + 1, + splits[0][4] + ] : splits[y * 2 + x]; + var texOffset = split[4] ? [ + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1 + ] : [ + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0 + ]; + var dw = ((x + x + 1) / col - 1) / 2; + var dh = ((y + y + 1) / row - 1) / 2; + var tox = split[0]; + var toy = split[1]; + var tsx = split[4] ? split[3] : split[2]; + var tsy = split[4] ? split[2] : split[3]; + var origin = [ + originData[0] / col + dw, + originData[1] / row + dh, + originData[2] / col + dw, + originData[3] / row + dh, + originData[4] / col + dw, + originData[5] / row + dh, + originData[6] / col + dw, + originData[7] / row + dh + ]; + atlasOffset1.push(texOffset[0] * tsx + tox, texOffset[1] * tsy + toy, texOffset[2] * tsx + tox, texOffset[3] * tsy + toy, texOffset[4] * tsx + tox, texOffset[5] * tsy + toy, texOffset[6] * tsx + tox, texOffset[7] * tsy + toy); + position1.push(origin[0] * sx, origin[1] * sy, 0.0, origin[2] * sx, origin[3] * sy, 0.0, origin[4] * sx, origin[5] * sy, 0.0, origin[6] * sx, origin[7] * sy, 0.0); + index1.push(base, 1 + base, 2 + base, 2 + base, 1 + base, 3 + base); + } + } + geometry.setAttributeData("aPos", new Float32Array(position1)); + return { + index: index1, + atlasOffset: atlasOffset1 + }; + }; + _proto.fromData = function fromData(data) { + BaseRenderComponent.prototype.fromData.call(this, data); + var interaction = data.interaction, options = data.options; + this.interaction = interaction; + this.splits = data.splits || singleSplits; + this.textureSheetAnimation = data.textureSheetAnimation; + var geometry = this.createGeometry(); + this.geometry = geometry; + var startColor = options.startColor || [ + 1, + 1, + 1, + 1 + ]; + this.material.setColor("_Color", new Color().setFromArray(startColor)); + }; + return SpriteComponent; +}(BaseRenderComponent); +exports.SpriteComponent = __decorate([ + effectsClass(DataType.SpriteComponent) +], exports.SpriteComponent); + +exports.maxSpriteMeshItemCount = 8; +function setSpriteMeshMaxItemCountByGPU(gpuCapability) { + if (gpuCapability.maxVertexUniforms >= 256) { + return exports.maxSpriteMeshItemCount = 32; + } else if (gpuCapability.maxVertexUniforms >= 128) { + return exports.maxSpriteMeshItemCount = 16; + } +} +// TODO: 只有单测用 +function setMaxSpriteMeshItemCount(count) { + exports.maxSpriteMeshItemCount = count; +} + +var ParticleLoader = /*#__PURE__*/ function(AbstractPlugin) { + _inherits(ParticleLoader, AbstractPlugin); + function ParticleLoader() { + return AbstractPlugin.apply(this, arguments); + } + return ParticleLoader; +}(AbstractPlugin); + +var CalculateLoader = /*#__PURE__*/ function(AbstractPlugin) { + _inherits(CalculateLoader, AbstractPlugin); + function CalculateLoader() { + return AbstractPlugin.apply(this, arguments); + } + return CalculateLoader; +}(AbstractPlugin); + +var AnimationStream = /*#__PURE__*/ function() { + function AnimationStream(playable) { + this.curveValues = {}; + this.playable = playable; + } + var _proto = AnimationStream.prototype; + _proto.setCurveValue = function setCurveValue(componentType, propertyName, value) { + if (!this.findCurveValue(componentType, propertyName)) { + this.curveValues[componentType + propertyName] = { + componentType: componentType, + propertyName: propertyName, + value: value + }; + } else { + this.curveValues[componentType + propertyName].value = value; + } + return this.curveValues[componentType + propertyName]; + }; + _proto.findCurveValue = function findCurveValue(componentType, propertyName) { + return this.curveValues[componentType + propertyName]; + }; + return AnimationStream; +}(); + +var AnimationPlayable = /*#__PURE__*/ function(Playable) { + _inherits(AnimationPlayable, Playable); + function AnimationPlayable(graph) { + var _this; + _this = Playable.call(this, graph) || this; + _this.animationStream = new AnimationStream(_assert_this_initialized(_this)); + return _this; + } + return AnimationPlayable; +}(Playable); + +var tempRot = new Euler(); +var tempSize = new Vector3(1, 1, 1); +var tempPos = new Vector3(); +/** + * @since 2.0.0 + */ var TransformAnimationPlayable = /*#__PURE__*/ function(AnimationPlayable) { + _inherits(TransformAnimationPlayable, AnimationPlayable); + function TransformAnimationPlayable() { + return AnimationPlayable.apply(this, arguments); + } + var _proto = TransformAnimationPlayable.prototype; + _proto.start = function start() { + var boundItem = this.boundObject; + var scale = boundItem.transform.scale; + this.originalTransform = { + position: boundItem.transform.position.clone(), + rotation: boundItem.transform.getRotation().clone(), + // TODO 编辑器 scale 没有z轴控制 + scale: new Vector3(scale.x, scale.y, scale.x) + }; + var positionOverLifetime = this.data.positionOverLifetime; + var rotationOverLifetime = this.data.rotationOverLifetime; + var sizeOverLifetime = this.data.sizeOverLifetime; + // TODO: 没有 K 帧数据的不需要传 positionOverLifetime 空对象 + if (positionOverLifetime && Object.keys(positionOverLifetime).length !== 0) { + this.positionOverLifetime = positionOverLifetime; + if (positionOverLifetime.path) { + this.originalTransform.path = createValueGetter(positionOverLifetime.path); + } + var linearVelEnable = positionOverLifetime.linearX || positionOverLifetime.linearY || positionOverLifetime.linearZ; + if (linearVelEnable) { + this.linearVelOverLifetime = { + x: positionOverLifetime.linearX && createValueGetter(positionOverLifetime.linearX), + y: positionOverLifetime.linearY && createValueGetter(positionOverLifetime.linearY), + z: positionOverLifetime.linearZ && createValueGetter(positionOverLifetime.linearZ), + asMovement: positionOverLifetime.asMovement, + enabled: !!linearVelEnable + }; + } + var orbitalVelEnable = positionOverLifetime.orbitalX || positionOverLifetime.orbitalY || positionOverLifetime.orbitalZ; + if (orbitalVelEnable) { + this.orbitalVelOverLifetime = { + x: positionOverLifetime.orbitalX && createValueGetter(positionOverLifetime.orbitalX), + y: positionOverLifetime.orbitalY && createValueGetter(positionOverLifetime.orbitalY), + z: positionOverLifetime.orbitalZ && createValueGetter(positionOverLifetime.orbitalZ), + center: ensureVec3(positionOverLifetime.orbCenter), + asRotation: positionOverLifetime.asRotation, + enabled: !!orbitalVelEnable + }; + } + this.speedOverLifetime = positionOverLifetime.speedOverLifetime && createValueGetter(positionOverLifetime.speedOverLifetime); + } + if (sizeOverLifetime) { + if (sizeOverLifetime.separateAxes) { + this.sizeSeparateAxes = true; + this.sizeXOverLifetime = createValueGetter(sizeOverLifetime.x || 1); + this.sizeYOverLifetime = createValueGetter(sizeOverLifetime.y || 1); + this.sizeZOverLifetime = createValueGetter(sizeOverLifetime.z || 1); + } else { + this.sizeXOverLifetime = createValueGetter(sizeOverLifetime.size || 1); + } + } + if (rotationOverLifetime) { + this.rotationOverLifetime = { + asRotation: rotationOverLifetime.asRotation, + separateAxes: rotationOverLifetime.separateAxes, + z: createValueGetter(rotationOverLifetime.z || 0) + }; + if (rotationOverLifetime.separateAxes) { + var rotLt = this.rotationOverLifetime; + rotLt.x = createValueGetter(rotationOverLifetime.x || 0); + rotLt.y = createValueGetter(rotationOverLifetime.y || 0); + } + } + this.gravity = Vector3.fromArray((positionOverLifetime == null ? void 0 : positionOverLifetime.gravity) || []); + var _positionOverLifetime_gravityOverLifetime; + this.gravityModifier = createValueGetter((_positionOverLifetime_gravityOverLifetime = positionOverLifetime == null ? void 0 : positionOverLifetime.gravityOverLifetime) != null ? _positionOverLifetime_gravityOverLifetime : 0); + this.direction = (positionOverLifetime == null ? void 0 : positionOverLifetime.direction) ? Vector3.fromArray(positionOverLifetime.direction).normalize() : new Vector3(); + this.startSpeed = (positionOverLifetime == null ? void 0 : positionOverLifetime.startSpeed) || 0; + this.velocity = this.direction.clone(); + this.velocity.multiply(this.startSpeed); + }; + _proto.processFrame = function processFrame(context) { + if (!this.boundObject) { + var boundObject = context.output.getUserData(); + if (_instanceof1(boundObject, exports.VFXItem)) { + this.boundObject = boundObject; + this.start(); + } + } + if (this.boundObject && this.boundObject.composition) { + this.sampleAnimation(); + } + }; + /** + * 应用时间轴K帧数据到对象 + */ _proto.sampleAnimation = function sampleAnimation() { + var _this = this; + var boundItem = this.boundObject; + var duration = boundItem.duration; + var life = this.time / duration; + life = life < 0 ? 0 : life > 1 ? 1 : life; + if (this.sizeXOverLifetime) { + tempSize.x = this.sizeXOverLifetime.getValue(life); + if (this.sizeSeparateAxes) { + tempSize.y = this.sizeYOverLifetime.getValue(life); + tempSize.z = this.sizeZOverLifetime.getValue(life); + } else { + tempSize.z = tempSize.y = tempSize.x; + } + var startSize = this.originalTransform.scale; + boundItem.transform.setScale(tempSize.x * startSize.x, tempSize.y * startSize.y, tempSize.z * startSize.z); + // this.animationStream.setCurveValue('transform', 'scale.x', tempSize.x * startSize.x); + // this.animationStream.setCurveValue('transform', 'scale.y', tempSize.y * startSize.y); + // this.animationStream.setCurveValue('transform', 'scale.z', tempSize.z * startSize.z); + } + if (this.rotationOverLifetime) { + var func = function(v) { + return _this.rotationOverLifetime.asRotation ? v.getValue(life) : v.getIntegrateValue(0, life, duration); + }; + var incZ = func(this.rotationOverLifetime.z); + var separateAxes = this.rotationOverLifetime.separateAxes; + tempRot.x = separateAxes ? func(this.rotationOverLifetime.x) : 0; + tempRot.y = separateAxes ? func(this.rotationOverLifetime.y) : 0; + tempRot.z = incZ; + var rot = tempRot.addEulers(this.originalTransform.rotation, tempRot); + boundItem.transform.setRotation(rot.x, rot.y, rot.z); + // this.animationStream.setCurveValue('transform', 'rotation.x', rot.x); + // this.animationStream.setCurveValue('transform', 'rotation.y', rot.y); + // this.animationStream.setCurveValue('transform', 'rotation.z', rot.z); + } + if (this.positionOverLifetime) { + var pos = tempPos; + calculateTranslation(pos, this, this.gravity, this.time, duration, this.originalTransform.position, this.velocity); + if (this.originalTransform.path) { + pos.add(this.originalTransform.path.getValue(life)); + } + boundItem.transform.setPosition(pos.x, pos.y, pos.z); + // this.animationStream.setCurveValue('transform', 'position.x', pos.x); + // this.animationStream.setCurveValue('transform', 'position.y', pos.y); + // this.animationStream.setCurveValue('transform', 'position.z', pos.z); + } + }; + return TransformAnimationPlayable; +}(AnimationPlayable); +exports.TransformPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(TransformPlayableAsset, PlayableAsset); + function TransformPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = TransformPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + var transformAnimationPlayable = new TransformAnimationPlayable(graph); + transformAnimationPlayable.data = this.transformAnimationData; + return transformAnimationPlayable; + }; + _proto.fromData = function fromData(data) { + this.transformAnimationData = data; + }; + return TransformPlayableAsset; +}(PlayableAsset); +exports.TransformPlayableAsset = __decorate([ + effectsClass(DataType.TransformPlayableAsset) +], exports.TransformPlayableAsset); +/** + * @since 2.0.0 + */ var ActivationPlayable = /*#__PURE__*/ function(Playable) { + _inherits(ActivationPlayable, Playable); + function ActivationPlayable() { + return Playable.apply(this, arguments); + } + var _proto = ActivationPlayable.prototype; + _proto.processFrame = function processFrame(context) { + var vfxItem = context.output.getUserData(); + if (!_instanceof1(vfxItem, exports.VFXItem)) { + return; + } + vfxItem.time = this.time; + }; + return ActivationPlayable; +}(Playable); +exports.ActivationPlayableAsset = /*#__PURE__*/ function(PlayableAsset) { + _inherits(ActivationPlayableAsset, PlayableAsset); + function ActivationPlayableAsset() { + return PlayableAsset.apply(this, arguments); + } + var _proto = ActivationPlayableAsset.prototype; + _proto.createPlayable = function createPlayable(graph) { + return new ActivationPlayable(graph); + }; + return ActivationPlayableAsset; +}(PlayableAsset); +exports.ActivationPlayableAsset = __decorate([ + effectsClass(DataType.ActivationPlayableAsset) +], exports.ActivationPlayableAsset); +exports.AnimationClip = /*#__PURE__*/ function(EffectsObject) { + _inherits(AnimationClip, EffectsObject); + function AnimationClip() { + var _this; + _this = EffectsObject.apply(this, arguments) || this; + _this.duration = 0; + _this.positionCurves = []; + _this.rotationCurves = []; + _this.scaleCurves = []; + _this.floatCurves = []; + return _this; + } + var _proto = AnimationClip.prototype; + _proto.sampleAnimation = function sampleAnimation(vfxItem, time) { + var duration = vfxItem.duration; + var life = time / duration; + life = life < 0 ? 0 : life > 1 ? 1 : life; + for(var _iterator = _create_for_of_iterator_helper_loose(this.positionCurves), _step; !(_step = _iterator()).done;){ + var curve = _step.value; + var value = curve.keyFrames.getValue(life); + // @ts-expect-error + var target = this.findTarget(vfxItem, curve.path); + target == null ? void 0 : target.transform.setPosition(value.x, value.y, value.z); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.rotationCurves), _step1; !(_step1 = _iterator1()).done;){ + var curve1 = _step1.value; + var value1 = curve1.keyFrames.getValue(life); + // @ts-expect-error + var target1 = this.findTarget(vfxItem, curve1.path); + target1 == null ? void 0 : target1.transform.setQuaternion(value1.x, value1.y, value1.z, value1.w); + } + for(var _iterator2 = _create_for_of_iterator_helper_loose(this.scaleCurves), _step2; !(_step2 = _iterator2()).done;){ + var curve2 = _step2.value; + var value2 = curve2.keyFrames.getValue(life); + // @ts-expect-error + var target2 = this.findTarget(vfxItem, curve2.path); + target2 == null ? void 0 : target2.transform.setScale(value2.x, value2.y, value2.z); + } + // TODO float curves 采样 + }; + _proto.fromData = function fromData(data) { + this.positionCurves.length = 0; + this.scaleCurves.length = 0; + this.floatCurves.length = 0; + for(var _iterator = _create_for_of_iterator_helper_loose(data.positionCurves), _step; !(_step = _iterator()).done;){ + var positionCurveData = _step.value; + var curve = { + path: positionCurveData.path, + keyFrames: createValueGetter(positionCurveData.keyFrames) + }; + this.duration = Math.max(this.duration, curve.keyFrames.getMaxTime()); + this.positionCurves.push(curve); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(data.rotationCurves), _step1; !(_step1 = _iterator1()).done;){ + var rotationCurveData = _step1.value; + var curve1 = { + path: rotationCurveData.path, + keyFrames: createValueGetter(rotationCurveData.keyFrames) + }; + this.duration = Math.max(this.duration, curve1.keyFrames.getMaxTime()); + this.rotationCurves.push(curve1); + } + for(var _iterator2 = _create_for_of_iterator_helper_loose(data.scaleCurves), _step2; !(_step2 = _iterator2()).done;){ + var scaleCurvesData = _step2.value; + var curve2 = { + path: scaleCurvesData.path, + keyFrames: createValueGetter(scaleCurvesData.keyFrames) + }; + this.duration = Math.max(this.duration, curve2.keyFrames.getMaxTime()); + this.scaleCurves.push(curve2); + } + for(var _iterator3 = _create_for_of_iterator_helper_loose(data.floatCurves), _step3; !(_step3 = _iterator3()).done;){ + var floatCurveData = _step3.value; + var curve3 = { + path: floatCurveData.path, + keyFrames: createValueGetter(floatCurveData.keyFrames), + property: floatCurveData.property, + className: floatCurveData.className + }; + this.duration = Math.max(this.duration, curve3.keyFrames.getMaxTime()); + this.floatCurves.push(curve3); + } + }; + _proto.findTarget = function findTarget(vfxItem, path) { + var target = vfxItem; + for(var _iterator = _create_for_of_iterator_helper_loose(path), _step; !(_step = _iterator()).done;){ + var name = _step.value; + var findTag = false; + for(var _iterator1 = _create_for_of_iterator_helper_loose(target.children), _step1; !(_step1 = _iterator1()).done;){ + var child = _step1.value; + if (child.name === name) { + target = child; + findTag = true; + break; + } + } + if (!findTag) { + return; + } + } + return target; + }; + return AnimationClip; +}(EffectsObject); +exports.AnimationClip = __decorate([ + effectsClass(DataType.AnimationClip) +], exports.AnimationClip); +var AnimationClipPlayable = /*#__PURE__*/ function(Playable) { + _inherits(AnimationClipPlayable, Playable); + function AnimationClipPlayable() { + return Playable.apply(this, arguments); + } + var _proto = AnimationClipPlayable.prototype; + _proto.processFrame = function processFrame(context) { + var boundObject = context.output.getUserData(); + if (!_instanceof1(boundObject, exports.VFXItem)) { + return; + } + if (boundObject.composition) { + this.clip.sampleAnimation(boundObject, this.time); + } + }; + return AnimationClipPlayable; +}(Playable); + +// Based on: +/** + * The Point object represents a location in a two-dimensional coordinate system, where `x` represents + * the position on the horizontal axis and `y` represents the position on the vertical axis. + */ var Point = /*#__PURE__*/ function() { + function Point(x, y) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + /** + * Position of the point on the x axis + */ this.x = 0; + /** + * Position of the point on the y axis + */ this.y = 0; + this.x = x; + this.y = y; + } + var _proto = Point.prototype; + /** + * Creates a clone of this point + * @returns A clone of this point + */ _proto.clone = function clone() { + return new Point(this.x, this.y); + }; + /** + * Copies `x` and `y` from the given point into this point + * @param p - The point to copy from + * @returns The point instance itself + */ _proto.copyFrom = function copyFrom(p) { + this.set(p.x, p.y); + return this; + }; + /** + * Copies this point's x and y into the given point (`p`). + * @param p - The point to copy to. Can be any of type that is or extends `PointData` + * @returns The point (`p`) with values updated + */ _proto.copyTo = function copyTo(p) { + p.set(this.x, this.y); + return p; + }; + /** + * Accepts another point (`p`) and returns `true` if the given point is equal to this point + * @param p - The point to check + * @returns Returns `true` if both `x` and `y` are equal + */ _proto.equals = function equals(p) { + return p.x === this.x && p.y === this.y; + }; + /** + * Sets the point to a new `x` and `y` position. + * If `y` is omitted, both `x` and `y` will be set to `x`. + * @param {number} [x=0] - position of the point on the `x` axis + * @param {number} [y=x] - position of the point on the `y` axis + * @returns The point instance itself + */ _proto.set = function set(x, y) { + if (x === void 0) x = 0; + if (y === void 0) y = x; + this.x = x; + this.y = y; + return this; + }; + _create_class(Point, null, [ + { + key: "shared", + get: /** + * A static Point object with `x` and `y` values of `0`. Can be used to avoid creating new objects multiple times. + * @readonly + */ function get() { + tempPoint.x = 0; + tempPoint.y = 0; + return tempPoint; + } + } + ]); + return Point; +}(); +var tempPoint = new Point(); + +// Based on: +var closePointEps = 1e-4; +var curveEps = 0.0001; +/** + * Buffers vertices to draw a square cap. + * + * @internal + * @private + * @param x - X-coord of end point + * @param y - Y-coord of end point + * @param nx - X-coord of line normal pointing inside + * @param ny - Y-coord of line normal pointing inside + * @param innerWeight - Weight of inner points + * @param outerWeight - Weight of outer points + * @param clockwise - Whether the cap is drawn clockwise + * @param verts - vertex buffer + * @returns - no. of vertices pushed + */ function square(x, y, nx, ny, innerWeight, outerWeight, clockwise, /* rotation for square (true at left end, false at right end) */ verts) { + var ix = x - nx * innerWeight; + var iy = y - ny * innerWeight; + var ox = x + nx * outerWeight; + var oy = y + ny * outerWeight; + /* Rotate nx,ny for extension vector */ var exx; + var eyy; + if (clockwise) { + exx = ny; + eyy = -nx; + } else { + exx = -ny; + eyy = nx; + } + /* [i|0]x,y extended at cap */ var eix = ix + exx; + var eiy = iy + eyy; + var eox = ox + exx; + var eoy = oy + eyy; + /* Square itself must be inserted clockwise*/ verts.push(eix, eiy); + verts.push(eox, eoy); + return 2; +} +/** + * Buffers vertices to draw an arc at the line joint or cap. + * + * @internal + * @private + * @param cx - X-coord of center + * @param cy - Y-coord of center + * @param sx - X-coord of arc start + * @param sy - Y-coord of arc start + * @param ex - X-coord of arc end + * @param ey - Y-coord of arc end + * @param verts - buffer of vertices + * @param clockwise - orientation of vertices + * @returns - no. of vertices pushed + */ function round(cx, cy, sx, sy, ex, ey, verts, clockwise) { + var cx2p0x = sx - cx; + var cy2p0y = sy - cy; + var angle0 = Math.atan2(cx2p0x, cy2p0y); + var angle1 = Math.atan2(ex - cx, ey - cy); + if (clockwise && angle0 < angle1) { + angle0 += Math.PI * 2; + } else if (!clockwise && angle0 > angle1) { + angle1 += Math.PI * 2; + } + var startAngle = angle0; + var angleDiff = angle1 - angle0; + var absAngleDiff = Math.abs(angleDiff); + var radius = Math.sqrt(cx2p0x * cx2p0x + cy2p0y * cy2p0y); + var segCount = (15 * absAngleDiff * Math.sqrt(radius) / Math.PI >> 0) + 1; + var angleInc = angleDiff / segCount; + startAngle += angleInc; + if (clockwise) { + verts.push(cx, cy); + verts.push(sx, sy); + for(var i = 1, angle = startAngle; i < segCount; i++, angle += angleInc){ + verts.push(cx, cy); + verts.push(cx + Math.sin(angle) * radius, cy + Math.cos(angle) * radius); + } + verts.push(cx, cy); + verts.push(ex, ey); + } else { + verts.push(sx, sy); + verts.push(cx, cy); + for(var i1 = 1, angle2 = startAngle; i1 < segCount; i1++, angle2 += angleInc){ + verts.push(cx + Math.sin(angle2) * radius, cy + Math.cos(angle2) * radius); + verts.push(cx, cy); + } + verts.push(ex, ey); + verts.push(cx, cy); + } + return segCount * 2; +} +function getOrientationOfPoints(points) { + var m = points.length; + if (m < 6) { + return 1; + } + var area = 0; + for(var i = 0, x1 = points[m - 2], y1 = points[m - 1]; i < m; i += 2){ + var x2 = points[i]; + var y2 = points[i + 1]; + area += (x2 - x1) * (y2 + y1); + x1 = x2; + y1 = y2; + } + if (area < 0) { + return -1; + } + return 1; +} +/** + * Builds a line to draw using the polygon method. + * @param points + * @param lineStyle + * @param flipAlignment + * @param closed + * @param vertices + * @param _verticesStride + * @param _verticesOffset + * @param indices + * @param _indicesOffset + */ function buildLine(points, lineStyle, flipAlignment, closed, // alignment:number, +vertices, _verticesStride, _verticesOffset, indices, _indicesOffset) { + // const shape = graphicsData.shape as Polygon; + // let points = graphicsData.points || shape.points.slice(); + var eps = closePointEps; + if (points.length === 0) { + return; + } + var style = lineStyle; + var alignment = style.alignment; + if (lineStyle.alignment !== 0.5) { + // rotate the points! + var orientation = getOrientationOfPoints(points); + if (flipAlignment) { + orientation *= -1; + } + alignment = (alignment - 0.5) * orientation + 0.5; + } + // get first and last point.. figure out the middle! + var firstPoint = new Point(points[0], points[1]); + var lastPoint = new Point(points[points.length - 2], points[points.length - 1]); + var closedShape = closed; + var closedPath = Math.abs(firstPoint.x - lastPoint.x) < eps && Math.abs(firstPoint.y - lastPoint.y) < eps; + // if the first point is the last point - gonna have issues :) + if (closedShape) { + // need to clone as we are going to slightly modify the shape.. + points = points.slice(); + if (closedPath) { + points.pop(); + points.pop(); + lastPoint.set(points[points.length - 2], points[points.length - 1]); + } + var midPointX = (firstPoint.x + lastPoint.x) * 0.5; + var midPointY = (lastPoint.y + firstPoint.y) * 0.5; + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY); + } + var verts = vertices; + var length = points.length / 2; + var indexCount = points.length; + var indexStart = verts.length / 2; + // Max. inner and outer width + var width = style.width / 2; + var widthSquared = width * width; + var miterLimitSquared = style.miterLimit * style.miterLimit; + /* Line segments of interest where (x1,y1) forms the corner. */ var x0 = points[0]; + var y0 = points[1]; + var x1 = points[2]; + var y1 = points[3]; + var x2 = 0; + var y2 = 0; + /* perp[?](x|y) = the line normal with magnitude lineWidth. */ var perpX = -(y0 - y1); + var perpY = x0 - x1; + var perp1x = 0; + var perp1y = 0; + // 计算向量长度并添加极小值 NumberEpsilon 以避免除以零的情况。 + var dist = Math.sqrt(perpX * perpX + perpY * perpY) + NumberEpsilon; + perpX /= dist; + perpY /= dist; + perpX *= width; + perpY *= width; + var ratio = alignment; // 0.5; + var innerWeight = (1 - ratio) * 2; + var outerWeight = ratio * 2; + if (!closedShape) { + if (style.cap === LineCap.Round) { + indexCount += round(x0 - perpX * (innerWeight - outerWeight) * 0.5, y0 - perpY * (innerWeight - outerWeight) * 0.5, x0 - perpX * innerWeight, y0 - perpY * innerWeight, x0 + perpX * outerWeight, y0 + perpY * outerWeight, verts, true) + 2; + } else if (style.cap === LineCap.Square) { + indexCount += square(x0, y0, perpX, perpY, innerWeight, outerWeight, true, verts); + } + } + // Push first point (below & above vertices) + verts.push(x0 - perpX * innerWeight, y0 - perpY * innerWeight); + verts.push(x0 + perpX * outerWeight, y0 + perpY * outerWeight); + for(var i = 1; i < length - 1; ++i){ + x0 = points[(i - 1) * 2]; + y0 = points[(i - 1) * 2 + 1]; + x1 = points[i * 2]; + y1 = points[i * 2 + 1]; + x2 = points[(i + 1) * 2]; + y2 = points[(i + 1) * 2 + 1]; + perpX = -(y0 - y1); + perpY = x0 - x1; + dist = Math.sqrt(perpX * perpX + perpY * perpY) + NumberEpsilon; + perpX /= dist; + perpY /= dist; + perpX *= width; + perpY *= width; + perp1x = -(y1 - y2); + perp1y = x1 - x2; + dist = Math.sqrt(perp1x * perp1x + perp1y * perp1y) + NumberEpsilon; + perp1x /= dist; + perp1y /= dist; + perp1x *= width; + perp1y *= width; + /* d[x|y](0|1) = the component displacement between points p(0,1|1,2) */ var dx0 = x1 - x0; + var dy0 = y0 - y1; + var dx1 = x1 - x2; + var dy1 = y2 - y1; + /* +ve if internal angle < 90 degree, -ve if internal angle > 90 degree. */ var dot = dx0 * dx1 + dy0 * dy1; + /* +ve if internal angle counterclockwise, -ve if internal angle clockwise. */ var cross = dy0 * dx1 - dy1 * dx0; + var clockwise = cross < 0; + /* Going nearly parallel? */ /* atan(0.001) ~= 0.001 rad ~= 0.057 degree */ if (Math.abs(cross) < 0.001 * Math.abs(dot)) { + verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); + verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); + /* 180 degree corner? */ if (dot >= 0) { + if (style.join === LineJoin.Round) { + indexCount += round(x1, y1, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 4; + } else { + indexCount += 2; + } + verts.push(x1 - perp1x * outerWeight, y1 - perp1y * outerWeight); + verts.push(x1 + perp1x * innerWeight, y1 + perp1y * innerWeight); + } + continue; + } + /* p[x|y] is the miter point. pDist is the distance between miter point and p1. */ var c1 = (-perpX + x0) * (-perpY + y1) - (-perpX + x1) * (-perpY + y0); + var c2 = (-perp1x + x2) * (-perp1y + y1) - (-perp1x + x1) * (-perp1y + y2); + var px = (dx0 * c2 - dx1 * c1) / cross; + var py = (dy1 * c1 - dy0 * c2) / cross; + var pDist = (px - x1) * (px - x1) + (py - y1) * (py - y1); + /* Inner miter point */ var imx = x1 + (px - x1) * innerWeight; + var imy = y1 + (py - y1) * innerWeight; + /* Outer miter point */ var omx = x1 - (px - x1) * outerWeight; + var omy = y1 - (py - y1) * outerWeight; + /* Is the inside miter point too far away, creating a spike? */ var smallerInsideSegmentSq = Math.min(dx0 * dx0 + dy0 * dy0, dx1 * dx1 + dy1 * dy1); + var insideWeight = clockwise ? innerWeight : outerWeight; + var smallerInsideDiagonalSq = smallerInsideSegmentSq + insideWeight * insideWeight * widthSquared; + var insideMiterOk = pDist <= smallerInsideDiagonalSq; + if (insideMiterOk) { + if (style.join === LineJoin.Bevel || pDist / widthSquared > miterLimitSquared) { + if (clockwise) /* rotating at inner angle */ { + verts.push(imx, imy); // inner miter point + verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); // first segment's outer vertex + verts.push(imx, imy); // inner miter point + verts.push(x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); // second segment's outer vertex + } else /* rotating at outer angle */ { + verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); // first segment's inner vertex + verts.push(omx, omy); // outer miter point + verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight); // second segment's outer vertex + verts.push(omx, omy); // outer miter point + } + indexCount += 2; + } else if (style.join === LineJoin.Round) { + if (clockwise) /* arc is outside */ { + verts.push(imx, imy); + verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); + indexCount += round(x1, y1, x1 + perpX * outerWeight, y1 + perpY * outerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight, verts, true) + 4; + verts.push(imx, imy); + verts.push(x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); + } else /* arc is inside */ { + verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); + verts.push(omx, omy); + indexCount += round(x1, y1, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 4; + verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight); + verts.push(omx, omy); + } + } else { + verts.push(imx, imy); + verts.push(omx, omy); + } + } else { + verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); // first segment's inner vertex + verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); // first segment's outer vertex + if (style.join === LineJoin.Round) { + if (clockwise) /* arc is outside */ { + indexCount += round(x1, y1, x1 + perpX * outerWeight, y1 + perpY * outerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight, verts, true) + 2; + } else /* arc is inside */ { + indexCount += round(x1, y1, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 2; + } + } else if (style.join === LineJoin.Miter && pDist / widthSquared <= miterLimitSquared) { + if (clockwise) { + verts.push(omx, omy); // inner miter point + verts.push(omx, omy); // inner miter point + } else { + verts.push(imx, imy); // outer miter point + verts.push(imx, imy); // outer miter point + } + indexCount += 2; + } + verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight); // second segment's inner vertex + verts.push(x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); // second segment's outer vertex + indexCount += 2; + } + } + x0 = points[(length - 2) * 2]; + y0 = points[(length - 2) * 2 + 1]; + x1 = points[(length - 1) * 2]; + y1 = points[(length - 1) * 2 + 1]; + perpX = -(y0 - y1); + perpY = x0 - x1; + dist = Math.sqrt(perpX * perpX + perpY * perpY) + NumberEpsilon; + perpX /= dist; + perpY /= dist; + perpX *= width; + perpY *= width; + verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); + verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); + if (!closedShape) { + if (style.cap === LineCap.Round) { + indexCount += round(x1 - perpX * (innerWeight - outerWeight) * 0.5, y1 - perpY * (innerWeight - outerWeight) * 0.5, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 + perpX * outerWeight, y1 + perpY * outerWeight, verts, false) + 2; + } else if (style.cap === LineCap.Square) { + indexCount += square(x1, y1, perpX, perpY, innerWeight, outerWeight, false, verts); + } + } + // const indices = graphicsGeometry.indices; + var eps2 = curveEps * curveEps; + // indices.push(indexStart); + for(var i1 = indexStart; i1 < indexCount + indexStart - 2; ++i1){ + x0 = verts[i1 * 2]; + y0 = verts[i1 * 2 + 1]; + x1 = verts[(i1 + 1) * 2]; + y1 = verts[(i1 + 1) * 2 + 1]; + x2 = verts[(i1 + 2) * 2]; + y2 = verts[(i1 + 2) * 2 + 1]; + /* Skip zero area triangles */ if (Math.abs(x0 * (y1 - y2) + x1 * (y2 - y0) + x2 * (y0 - y1)) < eps2) { + continue; + } + indices.push(i1, i1 + 1, i1 + 2); + } +} + +// Based on: +// https://github.com/pixijs/pixijs/blob/dev/src/maths/shapes/ShapePrimitive.ts +var ShapePrimitive = function ShapePrimitive() { +}; + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +var libtess_min = {exports: {}}; + +/* + + Copyright 2000, Silicon Graphics, Inc. All Rights Reserved. + Copyright 2015, Google Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice including the dates of first publication and + either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ + shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR + IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Original Code. The Original Code is: OpenGL Sample Implementation, + Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, + Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. + Copyright in any portions created by third parties is as indicated + elsewhere herein. All Rights Reserved. +*/ + +(function (module) { +var n; +function t(a, b) { + return a.b === b.b && a.a === b.a; +} +function u(a, b) { + return a.b < b.b || a.b === b.b && a.a <= b.a; +} +function v(a, b, c) { + var d = b.b - a.b, e = c.b - b.b; + return 0 < d + e ? d < e ? b.a - a.a + d / (d + e) * (a.a - c.a) : b.a - c.a + e / (d + e) * (c.a - a.a) : 0; +} +function x(a, b, c) { + var d = b.b - a.b, e = c.b - b.b; + return 0 < d + e ? (b.a - c.a) * d + (b.a - a.a) * e : 0; +} +function z(a, b) { + return a.a < b.a || a.a === b.a && a.b <= b.b; +} +function aa(a, b, c) { + var d = b.a - a.a, e = c.a - b.a; + return 0 < d + e ? d < e ? b.b - a.b + d / (d + e) * (a.b - c.b) : b.b - c.b + e / (d + e) * (c.b - a.b) : 0; +} +function ba(a, b, c) { + var d = b.a - a.a, e = c.a - b.a; + return 0 < d + e ? (b.b - c.b) * d + (b.b - a.b) * e : 0; +} +function ca(a) { + return u(a.b.a, a.a); +} +function da(a) { + return u(a.a, a.b.a); +} +function A(a, b, c, d) { + a = 0 > a ? 0 : a; + c = 0 > c ? 0 : c; + return a <= c ? 0 === c ? (b + d) / 2 : b + a / (a + c) * (d - b) : d + c / (a + c) * (b - d); +} +function ea(a) { + var b = B(a.b); + C(b, a.c); + C(b.b, a.c); + D(b, a.a); + return b; +} +function E(a, b) { + var c = !1, d = !1; + a !== b && (b.a !== a.a && (d = !0, F(b.a, a.a)), b.d !== a.d && (c = !0, G(b.d, a.d)), H(b, a), d || (C(b, a.a), a.a.c = a), c || (D(b, a.d), a.d.a = a)); +} +function I(a) { + var b = a.b, c = !1; + a.d !== a.b.d && (c = !0, G(a.d, a.b.d)); + a.c === a ? F(a.a, null) : (a.b.d.a = J(a), a.a.c = a.c, H(a, J(a)), c || D(a, a.d)); + b.c === b ? (F(b.a, null), G(b.d, null)) : (a.d.a = J(b), b.a.c = b.c, H(b, J(b))); + fa(a); +} +function K(a) { + var b = B(a), c = b.b; + H(b, a.e); + b.a = a.b.a; + C(c, b.a); + b.d = c.d = a.d; + b = b.b; + H(a.b, J(a.b)); + H(a.b, b); + a.b.a = b.a; + b.b.a.c = b.b; + b.b.d = a.b.d; + b.f = a.f; + b.b.f = a.b.f; + return b; +} +function L(a, b) { + var c = !1, d = B(a), e = d.b; + b.d !== a.d && (c = !0, G(b.d, a.d)); + H(d, a.e); + H(e, b); + d.a = a.b.a; + e.a = b.a; + d.d = e.d = a.d; + a.d.a = e; + c || D(d, a.d); + return d; +} +function B(a) { + var b = new M, c = new M, d = a.b.h; + c.h = d; + d.b.h = b; + b.h = a; + a.b.h = c; + b.b = c; + b.c = b; + b.e = c; + c.b = b; + c.c = c; + return c.e = b; +} +function H(a, b) { + var c = a.c, d = b.c; + c.b.e = b; + d.b.e = a; + a.c = d; + b.c = c; +} +function C(a, b) { + var c = b.f, d = new N(b, c); + c.e = d; + b.f = d; + c = d.c = a; + do c.a = d, c = c.c; + while (c !== a); +} +function D(a, b) { + var c = b.d, d = new ga(b, c); + c.b = d; + b.d = d; + d.a = a; + d.c = b.c; + c = a; + do c.d = d, c = c.e; + while (c !== a); +} +function fa(a) { + var b = a.h; + a = a.b.h; + b.b.h = a; + a.b.h = b; +} +function F(a, b) { + var c = a.c, d = c; + do d.a = b, d = d.c; + while (d !== c); + c = a.f; + d = a.e; + d.f = c; + c.e = d; +} +function G(a, b) { + var c = a.a, d = c; + do d.d = b, d = d.e; + while (d !== c); + c = a.d; + d = a.b; + d.d = c; + c.b = d; +} +function ha(a) { + var b = 0; + Math.abs(a[1]) > Math.abs(a[0]) && (b = 1); + Math.abs(a[2]) > Math.abs(a[b]) && (b = 2); + return b; +} +var O = 4 * 1E150; +function P(a, b) { + a.f += b.f; + a.b.f += b.b.f; +} +function ia(a, b, c) { + a = a.a; + b = b.a; + c = c.a; + if (b.b.a === a) return c.b.a === a ? u(b.a, c.a) ? 0 >= x(c.b.a, b.a, c.a) : 0 <= x(b.b.a, c.a, b.a) : 0 >= x(c.b.a, a, c.a); + if (c.b.a === a) return 0 <= x(b.b.a, a, b.a); + b = v(b.b.a, a, b.a); + a = v(c.b.a, a, c.a); + return b >= a; +} +function Q(a) { + a.a.i = null; + var b = a.e; + b.a.c = b.c; + b.c.a = b.a; + a.e = null; +} +function ja(a, b) { + I(a.a); + a.c = !1; + a.a = b; + b.i = a; +} +function ka(a) { + var b = a.a.a; + do a = R(a); + while (a.a.a === b); + a.c && (b = L(S(a).a.b, a.a.e), ja(a, b), a = R(a)); + return a; +} +function la(a, b, c) { + var d = new ma; + d.a = c; + d.e = na(a.f, b.e, d); + return c.i = d; +} +function oa(a, b) { + switch(a.s){ + case 100130: + return 0 !== (b & 1); + case 100131: + return 0 !== b; + case 100132: + return 0 < b; + case 100133: + return 0 > b; + case 100134: + return 2 <= b || -2 >= b; + } + return !1; +} +function pa(a) { + var b = a.a, c = b.d; + c.c = a.d; + c.a = b; + Q(a); +} +function T(a, b, c) { + a = b; + for(b = b.a; a !== c;){ + a.c = !1; + var d = S(a), e = d.a; + if (e.a !== b.a) { + if (!d.c) { + pa(a); + break; + } + e = L(b.c.b, e.b); + ja(d, e); + } + b.c !== e && (E(J(e), e), E(b, e)); + pa(a); + b = d.a; + a = d; + } + return b; +} +function U(a, b, c, d, e, f) { + var g = !0; + do la(a, b, c.b), c = c.c; + while (c !== d); + for(null === e && (e = S(b).a.b.c);;){ + d = S(b); + c = d.a.b; + if (c.a !== e.a) break; + c.c !== e && (E(J(c), c), E(J(e), c)); + d.f = b.f - c.f; + d.d = oa(a, d.f); + b.b = !0; + !g && qa(a, b) && (P(c, e), Q(b), I(e)); + g = !1; + b = d; + e = c; + } + b.b = !0; + f && ra(a, b); +} +function sa(a, b, c, d, e) { + var f = [ + b.g[0], + b.g[1], + b.g[2] + ]; + b.d = null; + b.d = a.o ? a.o(f, c, d, a.c) || null : null; + null === b.d && (e ? a.n || (V(a, 100156), a.n = !0) : b.d = c[0]); +} +function ta(a, b, c) { + var d = [ + null, + null, + null, + null + ]; + d[0] = b.a.d; + d[1] = c.a.d; + sa(a, b.a, d, [ + .5, + .5, + 0, + 0 + ], !1); + E(b, c); +} +function ua(a, b, c, d, e) { + var f = Math.abs(b.b - a.b) + Math.abs(b.a - a.a), g = Math.abs(c.b - a.b) + Math.abs(c.a - a.a), h = e + 1; + d[e] = .5 * g / (f + g); + d[h] = .5 * f / (f + g); + a.g[0] += d[e] * b.g[0] + d[h] * c.g[0]; + a.g[1] += d[e] * b.g[1] + d[h] * c.g[1]; + a.g[2] += d[e] * b.g[2] + d[h] * c.g[2]; +} +function qa(a, b) { + var c = S(b), d = b.a, e = c.a; + if (u(d.a, e.a)) { + if (0 < x(e.b.a, d.a, e.a)) return !1; + if (!t(d.a, e.a)) K(e.b), E(d, J(e)), b.b = c.b = !0; + else if (d.a !== e.a) { + var c = a.e, f = d.a.h; + if (0 <= f) { + var c = c.b, g = c.d, h = c.e, k = c.c, l = k[f]; + g[l] = g[c.a]; + k[g[l]] = l; + l <= --c.a && (1 >= l ? W(c, l) : u(h[g[l >> 1]], h[g[l]]) ? W(c, l) : va(c, l)); + h[f] = null; + k[f] = c.b; + c.b = f; + } else for(c.c[-(f + 1)] = null; 0 < c.a && null === c.c[c.d[c.a - 1]];)--c.a; + ta(a, J(e), d); + } + } else { + if (0 > x(d.b.a, e.a, d.a)) return !1; + R(b).b = b.b = !0; + K(d.b); + E(J(e), d); + } + return !0; +} +function wa(a, b) { + var c = S(b), d = b.a, e = c.a, f = d.a, g = e.a, h = d.b.a, k = e.b.a, l = new N; + x(h, a.a, f); + x(k, a.a, g); + if (f === g || Math.min(f.a, h.a) > Math.max(g.a, k.a)) return !1; + if (u(f, g)) { + if (0 < x(k, f, g)) return !1; + } else if (0 > x(h, g, f)) return !1; + var r = h, p = f, q = k, y = g, m, w; + u(r, p) || (m = r, r = p, p = m); + u(q, y) || (m = q, q = y, y = m); + u(r, q) || (m = r, r = q, q = m, m = p, p = y, y = m); + u(q, p) ? u(p, y) ? (m = v(r, q, p), w = v(q, p, y), 0 > m + w && (m = -m, w = -w), l.b = A(m, q.b, w, p.b)) : (m = x(r, q, p), w = -x(r, y, p), 0 > m + w && (m = -m, w = -w), l.b = A(m, q.b, w, y.b)) : l.b = (q.b + p.b) / 2; + z(r, p) || (m = r, r = p, p = m); + z(q, y) || (m = q, q = y, y = m); + z(r, q) || (m = r, r = q, q = m, m = p, p = y, y = m); + z(q, p) ? z(p, y) ? (m = aa(r, q, p), w = aa(q, p, y), 0 > m + w && (m = -m, w = -w), l.a = A(m, q.a, w, p.a)) : (m = ba(r, q, p), w = -ba(r, y, p), 0 > m + w && (m = -m, w = -w), l.a = A(m, q.a, w, y.a)) : l.a = (q.a + p.a) / 2; + u(l, a.a) && (l.b = a.a.b, l.a = a.a.a); + r = u(f, g) ? f : g; + u(r, l) && (l.b = r.b, l.a = r.a); + if (t(l, f) || t(l, g)) return qa(a, b), !1; + if (!t(h, a.a) && 0 <= x(h, a.a, l) || !t(k, a.a) && 0 >= x(k, a.a, l)) { + if (k === a.a) return K(d.b), E(e.b, d), b = ka(b), d = S(b).a, T(a, S(b), c), U(a, b, J(d), d, d, !0), !0; + if (h === a.a) { + K(e.b); + E(d.e, J(e)); + f = c = b; + g = f.a.b.a; + do f = R(f); + while (f.a.b.a === g); + b = f; + f = S(b).a.b.c; + c.a = J(e); + e = T(a, c, null); + U(a, b, e.c, d.b.c, f, !0); + return !0; + } + 0 <= x(h, a.a, l) && (R(b).b = b.b = !0, K(d.b), d.a.b = a.a.b, d.a.a = a.a.a); + 0 >= x(k, a.a, l) && (b.b = c.b = !0, K(e.b), e.a.b = a.a.b, e.a.a = a.a.a); + return !1; + } + K(d.b); + K(e.b); + E(J(e), d); + d.a.b = l.b; + d.a.a = l.a; + d.a.h = xa(a.e, d.a); + d = d.a; + e = [ + 0, + 0, + 0, + 0 + ]; + l = [ + f.d, + h.d, + g.d, + k.d + ]; + d.g[0] = d.g[1] = d.g[2] = 0; + ua(d, f, h, e, 0); + ua(d, g, k, e, 2); + sa(a, d, l, e, !0); + R(b).b = b.b = c.b = !0; + return !1; +} +function ra(a, b) { + for(var c = S(b);;){ + for(; c.b;)b = c, c = S(c); + if (!b.b && (c = b, b = R(b), null === b || !b.b)) break; + b.b = !1; + var d = b.a, e = c.a, f; + if (f = d.b.a !== e.b.a) a: { + f = b; + var g = S(f), h = f.a, k = g.a, l = void 0; + if (u(h.b.a, k.b.a)) { + if (0 > x(h.b.a, k.b.a, h.a)) { + f = !1; + break a; + } + R(f).b = f.b = !0; + l = K(h); + E(k.b, l); + l.d.c = f.d; + } else { + if (0 < x(k.b.a, h.b.a, k.a)) { + f = !1; + break a; + } + f.b = g.b = !0; + l = K(k); + E(h.e, k.b); + l.b.d.c = f.d; + } + f = !0; + } + f && (c.c ? (Q(c), I(e), c = S(b), e = c.a) : b.c && (Q(b), I(d), b = R(c), d = b.a)); + if (d.a !== e.a) { + if (d.b.a === e.b.a || b.c || c.c || d.b.a !== a.a && e.b.a !== a.a) qa(a, b); + else if (wa(a, b)) break; + } + d.a === e.a && d.b.a === e.b.a && (P(e, d), Q(b), I(d), b = R(c)); + } +} +function ya(a, b) { + a.a = b; + for(var c = b.c; null === c.i;)if (c = c.c, c === b.c) { + var c = a, d = b, e = new ma; + e.a = d.c.b; + var f = c.f, g = f.a; + do g = g.a; + while (null !== g.b && !f.c(f.b, e, g.b)); + var f = g.b, h = S(f), e = f.a, g = h.a; + if (0 === x(e.b.a, d, e.a)) e = f.a, t(e.a, d) || t(e.b.a, d) || (K(e.b), f.c && (I(e.c), f.c = !1), E(d.c, e), ya(c, d)); + else { + var k = u(g.b.a, e.b.a) ? f : h, h = void 0; + f.d || k.c ? (k === f ? h = L(d.c.b, e.e) : h = L(g.b.c.b, d.c).b, k.c ? ja(k, h) : (e = c, f = la(c, f, h), f.f = R(f).f + f.a.f, f.d = oa(e, f.f)), ya(c, d)) : U(c, f, d.c, d.c, null, !0); + } + return; + } + c = ka(c.i); + e = S(c); + f = e.a; + e = T(a, e, null); + if (e.c === f) { + var f = e, e = f.c, g = S(c), h = c.a, k = g.a, l = !1; + h.b.a !== k.b.a && wa(a, c); + t(h.a, a.a) && (E(J(e), h), c = ka(c), e = S(c).a, T(a, S(c), g), l = !0); + t(k.a, a.a) && (E(f, J(k)), f = T(a, g, null), l = !0); + l ? U(a, c, f.c, e, e, !0) : (u(k.a, h.a) ? d = J(k) : d = h, d = L(f.c.b, d), U(a, c, d, d.c, d.c, !1), d.b.i.c = !0, ra(a, c)); + } else U(a, c, e.c, f, f, !0); +} +function za(a, b) { + var c = new ma, d = ea(a.b); + d.a.b = O; + d.a.a = b; + d.b.a.b = -O; + d.b.a.a = b; + a.a = d.b.a; + c.a = d; + c.f = 0; + c.d = !1; + c.c = !1; + c.h = !0; + c.b = !1; + d = a.f; + d = na(d, d.a, c); + c.e = d; +} +function Aa(a) { + this.a = new Ba; + this.b = a; + this.c = ia; +} +function na(a, b, c) { + do b = b.c; + while (null !== b.b && !a.c(a.b, b.b, c)); + a = new Ba(c, b.a, b); + b.a.c = a; + return b.a = a; +} +function Ba(a, b, c) { + this.b = a || null; + this.a = b || this; + this.c = c || this; +} +function X() { + this.d = Y; + this.p = this.b = this.q = null; + this.j = [ + 0, + 0, + 0 + ]; + this.s = 100130; + this.n = !1; + this.o = this.a = this.e = this.f = null; + this.m = !1; + this.c = this.r = this.i = this.k = this.l = this.h = null; +} +var Y = 0; +n = X.prototype; +n.x = function() { + Z(this, Y); +}; +n.B = function(a, b) { + switch(a){ + case 100142: + return; + case 100140: + switch(b){ + case 100130: + case 100131: + case 100132: + case 100133: + case 100134: + this.s = b; + return; + } + break; + case 100141: + this.m = !!b; + return; + default: + V(this, 100900); + return; + } + V(this, 100901); +}; +n.y = function(a) { + switch(a){ + case 100142: + return 0; + case 100140: + return this.s; + case 100141: + return this.m; + default: + V(this, 100900); + } + return !1; +}; +n.A = function(a, b, c) { + this.j[0] = a; + this.j[1] = b; + this.j[2] = c; +}; +n.z = function(a, b) { + var c = b ? b : null; + switch(a){ + case 100100: + case 100106: + this.h = c; + break; + case 100104: + case 100110: + this.l = c; + break; + case 100101: + case 100107: + this.k = c; + break; + case 100102: + case 100108: + this.i = c; + break; + case 100103: + case 100109: + this.p = c; + break; + case 100105: + case 100111: + this.o = c; + break; + case 100112: + this.r = c; + break; + default: + V(this, 100900); + } +}; +n.C = function(a, b) { + var c = !1, d = [ + 0, + 0, + 0 + ]; + Z(this, 2); + for(var e = 0; 3 > e; ++e){ + var f = a[e]; + -1E150 > f && (f = -1E150, c = !0); + 1E150 < f && (f = 1E150, c = !0); + d[e] = f; + } + c && V(this, 100155); + c = this.q; + null === c ? (c = ea(this.b), E(c, c.b)) : (K(c), c = c.e); + c.a.d = b; + c.a.g[0] = d[0]; + c.a.g[1] = d[1]; + c.a.g[2] = d[2]; + c.f = 1; + c.b.f = -1; + this.q = c; +}; +n.u = function(a) { + Z(this, Y); + this.d = 1; + this.b = new Ca; + this.c = a; +}; +n.t = function() { + Z(this, 1); + this.d = 2; + this.q = null; +}; +n.v = function() { + Z(this, 2); + this.d = 1; +}; +n.w = function() { + Z(this, 1); + this.d = Y; + var a = this.j[0], b = this.j[1], c = this.j[2], d = !1, e = [ + a, + b, + c + ]; + if (0 === a && 0 === b && 0 === c) { + for(var b = [ + -2 * 1E150, + -2 * 1E150, + -2 * 1E150 + ], f = [ + 2 * 1E150, + 2 * 1E150, + 2 * 1E150 + ], c = [], g = [], d = this.b.c, a = d.e; a !== d; a = a.e)for(var h = 0; 3 > h; ++h){ + var k = a.g[h]; + k < f[h] && (f[h] = k, g[h] = a); + k > b[h] && (b[h] = k, c[h] = a); + } + a = 0; + b[1] - f[1] > b[0] - f[0] && (a = 1); + b[2] - f[2] > b[a] - f[a] && (a = 2); + if (f[a] >= b[a]) e[0] = 0, e[1] = 0, e[2] = 1; + else { + b = 0; + f = g[a]; + c = c[a]; + g = [ + 0, + 0, + 0 + ]; + f = [ + f.g[0] - c.g[0], + f.g[1] - c.g[1], + f.g[2] - c.g[2] + ]; + h = [ + 0, + 0, + 0 + ]; + for(a = d.e; a !== d; a = a.e)h[0] = a.g[0] - c.g[0], h[1] = a.g[1] - c.g[1], h[2] = a.g[2] - c.g[2], g[0] = f[1] * h[2] - f[2] * h[1], g[1] = f[2] * h[0] - f[0] * h[2], g[2] = f[0] * h[1] - f[1] * h[0], k = g[0] * g[0] + g[1] * g[1] + g[2] * g[2], k > b && (b = k, e[0] = g[0], e[1] = g[1], e[2] = g[2]); + 0 >= b && (e[0] = e[1] = e[2] = 0, e[ha(f)] = 1); + } + d = !0; + } + g = ha(e); + a = this.b.c; + b = (g + 1) % 3; + c = (g + 2) % 3; + g = 0 < e[g] ? 1 : -1; + for(e = a.e; e !== a; e = e.e)e.b = e.g[b], e.a = g * e.g[c]; + if (d) { + e = 0; + d = this.b.a; + for(a = d.b; a !== d; a = a.b)if (b = a.a, !(0 >= b.f)) { + do e += (b.a.b - b.b.a.b) * (b.a.a + b.b.a.a), b = b.e; + while (b !== a.a); + } + if (0 > e) for(e = this.b.c, d = e.e; d !== e; d = d.e)d.a = -d.a; + } + this.n = !1; + e = this.b.b; + for(a = e.h; a !== e; a = d)if (d = a.h, b = a.e, t(a.a, a.b.a) && a.e.e !== a && (ta(this, b, a), I(a), a = b, b = a.e), b.e === a) { + if (b !== a) { + if (b === d || b === d.b) d = d.h; + I(b); + } + if (a === d || a === d.b) d = d.h; + I(a); + } + this.e = e = new Da; + d = this.b.c; + for(a = d.e; a !== d; a = a.e)a.h = xa(e, a); + Ea(e); + this.f = new Aa(this); + za(this, -O); + for(za(this, O); null !== (e = Fa(this.e));){ + for(;;){ + a: if (a = this.e, 0 === a.a) d = Ga(a.b); + else if (d = a.c[a.d[a.a - 1]], 0 !== a.b.a && (a = Ga(a.b), u(a, d))) { + d = a; + break a; + } + if (null === d || !t(d, e)) break; + d = Fa(this.e); + ta(this, e.c, d.c); + } + ya(this, e); + } + this.a = this.f.a.a.b.a.a; + for(e = 0; null !== (d = this.f.a.a.b);)d.h || ++e, Q(d); + this.f = null; + e = this.e; + e.b = null; + e.d = null; + this.e = e.c = null; + e = this.b; + for(a = e.a.b; a !== e.a; a = d)d = a.b, a = a.a, a.e.e === a && (P(a.c, a), I(a)); + if (!this.n) { + e = this.b; + if (this.m) for(a = e.b.h; a !== e.b; a = d)d = a.h, a.b.d.c !== a.d.c ? a.f = a.d.c ? 1 : -1 : I(a); + else for(a = e.a.b; a !== e.a; a = d)if (d = a.b, a.c) { + for(a = a.a; u(a.b.a, a.a); a = a.c.b); + for(; u(a.a, a.b.a); a = a.e); + b = a.c.b; + for(c = void 0; a.e !== b;)if (u(a.b.a, b.a)) { + for(; b.e !== a && (ca(b.e) || 0 >= x(b.a, b.b.a, b.e.b.a));)c = L(b.e, b), b = c.b; + b = b.c.b; + } else { + for(; b.e !== a && (da(a.c.b) || 0 <= x(a.b.a, a.a, a.c.b.a));)c = L(a, a.c.b), a = c.b; + a = a.e; + } + for(; b.e.e !== a;)c = L(b.e, b), b = c.b; + } + if (this.h || this.i || this.k || this.l) if (this.m) for(e = this.b, d = e.a.b; d !== e.a; d = d.b){ + if (d.c) { + this.h && this.h(2, this.c); + a = d.a; + do this.k && this.k(a.a.d, this.c), a = a.e; + while (a !== d.a); + this.i && this.i(this.c); + } + } + else { + e = this.b; + d = !!this.l; + a = !1; + b = -1; + for(c = e.a.d; c !== e.a; c = c.d)if (c.c) { + a || (this.h && this.h(4, this.c), a = !0); + g = c.a; + do d && (f = g.b.d.c ? 0 : 1, b !== f && (b = f, this.l && this.l(!!b, this.c))), this.k && this.k(g.a.d, this.c), g = g.e; + while (g !== c.a); + } + a && this.i && this.i(this.c); + } + if (this.r) { + e = this.b; + for(a = e.a.b; a !== e.a; a = d)if (d = a.b, !a.c) { + b = a.a; + c = b.e; + g = void 0; + do g = c, c = g.e, g.d = null, null === g.b.d && (g.c === g ? F(g.a, null) : (g.a.c = g.c, H(g, J(g))), f = g.b, f.c === f ? F(f.a, null) : (f.a.c = f.c, H(f, J(f))), fa(g)); + while (g !== b); + b = a.d; + a = a.b; + a.d = b; + b.b = a; + } + this.r(this.b); + this.c = this.b = null; + return; + } + } + this.b = this.c = null; +}; +function Z(a, b) { + if (a.d !== b) for(; a.d !== b;)if (a.d < b) switch(a.d){ + case Y: + V(a, 100151); + a.u(null); + break; + case 1: + V(a, 100152), a.t(); + } + else switch(a.d){ + case 2: + V(a, 100154); + a.v(); + break; + case 1: + V(a, 100153), a.w(); + } +} +function V(a, b) { + a.p && a.p(b, a.c); +} +function ga(a, b) { + this.b = a || this; + this.d = b || this; + this.a = null; + this.c = !1; +} +function M() { + this.h = this; + this.i = this.d = this.a = this.e = this.c = this.b = null; + this.f = 0; +} +function J(a) { + return a.b.e; +} +function Ca() { + this.c = new N; + this.a = new ga; + this.b = new M; + this.d = new M; + this.b.b = this.d; + this.d.b = this.b; +} +function N(a, b) { + this.e = a || this; + this.f = b || this; + this.d = this.c = null; + this.g = [ + 0, + 0, + 0 + ]; + this.h = this.a = this.b = 0; +} +function Da() { + this.c = []; + this.d = null; + this.a = 0; + this.e = !1; + this.b = new Ha; +} +function Ea(a) { + a.d = []; + for(var b = 0; b < a.a; b++)a.d[b] = b; + a.d.sort(function(a) { + return function(b, e) { + return u(a[b], a[e]) ? 1 : -1; + }; + }(a.c)); + a.e = !0; + Ia(a.b); +} +function xa(a, b) { + if (a.e) { + var c = a.b, d = ++c.a; + 2 * d > c.f && (c.f *= 2, c.c = Ja(c.c, c.f + 1)); + var e; + 0 === c.b ? e = d : (e = c.b, c.b = c.c[c.b]); + c.e[e] = b; + c.c[e] = d; + c.d[d] = e; + c.h && va(c, d); + return e; + } + c = a.a++; + a.c[c] = b; + return -(c + 1); +} +function Fa(a) { + if (0 === a.a) return Ka(a.b); + var b = a.c[a.d[a.a - 1]]; + if (0 !== a.b.a && u(Ga(a.b), b)) return Ka(a.b); + do --a.a; + while (0 < a.a && null === a.c[a.d[a.a - 1]]); + return b; +} +function Ha() { + this.d = Ja([ + 0 + ], 33); + this.e = [ + null, + null + ]; + this.c = [ + 0, + 0 + ]; + this.a = 0; + this.f = 32; + this.b = 0; + this.h = !1; + this.d[1] = 1; +} +function Ja(a, b) { + for(var c = Array(b), d = 0; d < a.length; d++)c[d] = a[d]; + for(; d < b; d++)c[d] = 0; + return c; +} +function Ia(a) { + for(var b = a.a; 1 <= b; --b)W(a, b); + a.h = !0; +} +function Ga(a) { + return a.e[a.d[1]]; +} +function Ka(a) { + var b = a.d, c = a.e, d = a.c, e = b[1], f = c[e]; + 0 < a.a && (b[1] = b[a.a], d[b[1]] = 1, c[e] = null, d[e] = a.b, a.b = e, 0 < --a.a && W(a, 1)); + return f; +} +function W(a, b) { + for(var c = a.d, d = a.e, e = a.c, f = b, g = c[f];;){ + var h = f << 1; + h < a.a && u(d[c[h + 1]], d[c[h]]) && (h += 1); + var k = c[h]; + if (h > a.a || u(d[g], d[k])) { + c[f] = g; + e[g] = f; + break; + } + c[f] = k; + e[k] = f; + f = h; + } +} +function va(a, b) { + for(var c = a.d, d = a.e, e = a.c, f = b, g = c[f];;){ + var h = f >> 1, k = c[h]; + if (0 === h || u(d[k], d[g])) { + c[f] = g; + e[g] = f; + break; + } + c[f] = k; + e[k] = f; + f = h; + } +} +function ma() { + this.e = this.a = null; + this.f = 0; + this.c = this.b = this.h = this.d = !1; +} +function S(a) { + return a.e.c.b; +} +function R(a) { + return a.e.a.b; +} +commonjsGlobal.libtess = { + GluTesselator: X, + windingRule: { + GLU_TESS_WINDING_ODD: 100130, + GLU_TESS_WINDING_NONZERO: 100131, + GLU_TESS_WINDING_POSITIVE: 100132, + GLU_TESS_WINDING_NEGATIVE: 100133, + GLU_TESS_WINDING_ABS_GEQ_TWO: 100134 + }, + primitiveType: { + GL_LINE_LOOP: 2, + GL_TRIANGLES: 4, + GL_TRIANGLE_STRIP: 5, + GL_TRIANGLE_FAN: 6 + }, + errorType: { + GLU_TESS_MISSING_BEGIN_POLYGON: 100151, + GLU_TESS_MISSING_END_POLYGON: 100153, + GLU_TESS_MISSING_BEGIN_CONTOUR: 100152, + GLU_TESS_MISSING_END_CONTOUR: 100154, + GLU_TESS_COORD_TOO_LARGE: 100155, + GLU_TESS_NEED_COMBINE_CALLBACK: 100156 + }, + gluEnum: { + GLU_TESS_MESH: 100112, + GLU_TESS_TOLERANCE: 100142, + GLU_TESS_WINDING_RULE: 100140, + GLU_TESS_BOUNDARY_ONLY: 100141, + GLU_INVALID_ENUM: 100900, + GLU_INVALID_VALUE: 100901, + GLU_TESS_BEGIN: 100100, + GLU_TESS_VERTEX: 100101, + GLU_TESS_END: 100102, + GLU_TESS_ERROR: 100103, + GLU_TESS_EDGE_FLAG: 100104, + GLU_TESS_COMBINE: 100105, + GLU_TESS_BEGIN_DATA: 100106, + GLU_TESS_VERTEX_DATA: 100107, + GLU_TESS_END_DATA: 100108, + GLU_TESS_ERROR_DATA: 100109, + GLU_TESS_EDGE_FLAG_DATA: 100110, + GLU_TESS_COMBINE_DATA: 100111 + } +}; +X.prototype.gluDeleteTess = X.prototype.x; +X.prototype.gluTessProperty = X.prototype.B; +X.prototype.gluGetTessProperty = X.prototype.y; +X.prototype.gluTessNormal = X.prototype.A; +X.prototype.gluTessCallback = X.prototype.z; +X.prototype.gluTessVertex = X.prototype.C; +X.prototype.gluTessBeginPolygon = X.prototype.u; +X.prototype.gluTessBeginContour = X.prototype.t; +X.prototype.gluTessEndContour = X.prototype.v; +X.prototype.gluTessEndPolygon = X.prototype.w; +{ + module.exports = commonjsGlobal.libtess; +} +}(libtess_min)); + +var tessy = function initTesselator() { + // function called for each vertex of tesselator output + function vertexCallback(data, polyVertArray) { + polyVertArray[polyVertArray.length] = data[0]; + polyVertArray[polyVertArray.length] = data[1]; + } + function begincallback(type) { + if (type !== libtess_min.exports.primitiveType.GL_TRIANGLES) { + console.info("expected TRIANGLES but got type: " + type); + } + } + function errorcallback(errno) { + console.error("error callback, error number: " + errno); + } + // callback for when segments intersect and must be split + function combinecallback(coords, data, weight) { + // console.log('combine callback'); + return [ + coords[0], + coords[1], + coords[2] + ]; + } + function edgeCallback(flag) { + // don't really care about the flag, but need no-strip/no-fan behavior + // console.log('edge flag: ' + flag); + } + var tessy = new libtess_min.exports.GluTesselator(); + // tessy.gluTessProperty(libtess.gluEnum.GLU_TESS_WINDING_RULE, libtess.windingRule.GLU_TESS_WINDING_POSITIVE); + tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_VERTEX_DATA, vertexCallback); + tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_BEGIN, begincallback); + tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_ERROR, errorcallback); + tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_COMBINE, combinecallback); + tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback); + return tessy; +}(); +function triangulate(contours) { + // libtess will take 3d verts and flatten to a plane for tesselation + // since only doing 2d tesselation here, provide z=1 normal to skip + // iterating over verts only to get the same answer. + // comment out to test normal-generation code + tessy.gluTessNormal(0, 0, 1); + var triangleVerts = []; + tessy.gluTessBeginPolygon(triangleVerts); + for(var i = 0; i < contours.length; i++){ + tessy.gluTessBeginContour(); + var contour = contours[i]; + for(var j = 0; j < contour.length; j += 2){ + var coords = [ + contour[j], + contour[j + 1], + 0 + ]; + tessy.gluTessVertex(coords, coords); + } + tessy.gluTessEndContour(); + } + // finish polygon + tessy.gluTessEndPolygon(); + return triangleVerts; +} + +// Based on: +/** + * A class to define a shape via user defined coordinates. + */ var Polygon = /*#__PURE__*/ function(ShapePrimitive) { + _inherits(Polygon, ShapePrimitive); + function Polygon() { + for(var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++){ + points[_key] = arguments[_key]; + } + var _this; + _this = ShapePrimitive.call(this) || this; + /** + * An array of the points of this polygon. + */ _this.points = []; + /** + * `false` after moveTo, `true` after `closePath`. In all other cases it is `true`. + */ _this.closePath = false; + var flat = Array.isArray(points[0]) ? points[0] : points; + // if this is an array of points, convert it to a flat array of numbers + if (typeof flat[0] !== "number") { + var p = []; + for(var i = 0, il = flat.length; i < il; i++){ + p.push(flat[i].x, flat[i].y); + } + flat = p; + } + _this.points = flat; + _this.closePath = true; + return _this; + } + var _proto = Polygon.prototype; + /** + * Creates a clone of this polygon. + * @returns - A copy of the polygon. + */ _proto.clone = function clone() { + var points = this.points.slice(); + var polygon = new Polygon(points); + polygon.closePath = this.closePath; + return polygon; + }; + /** + * Checks whether the x and y coordinates passed to this function are contained within this polygon. + * @param x - The X coordinate of the point to test. + * @param y - The Y coordinate of the point to test. + * @returns - Whether the x/y coordinates are within this polygon. + */ _proto.contains = function contains(x, y) { + var inside = false; + // use some raycasting to test hits + // https://github.com/substack/point-in-polygon/blob/master/index.js + var length = this.points.length / 2; + for(var i = 0, j = length - 1; i < length; j = i++){ + var xi = this.points[i * 2]; + var yi = this.points[i * 2 + 1]; + var xj = this.points[j * 2]; + var yj = this.points[j * 2 + 1]; + var intersect = yi > y !== yj > y && x < (xj - xi) * ((y - yi) / (yj - yi)) + xi; + if (intersect) { + inside = !inside; + } + } + return inside; + }; + /** + * Copies another polygon to this one. + * @param polygon - The polygon to copy from. + * @returns Returns itself. + */ _proto.copyFrom = function copyFrom(polygon) { + this.points = polygon.points.slice(); + this.closePath = polygon.closePath; + return this; + }; + /** + * Copies this polygon to another one. + * @param polygon - The polygon to copy to. + * @returns Returns given parameter. + */ _proto.copyTo = function copyTo(polygon) { + polygon.copyFrom(this); + return polygon; + }; + /** + * Get the first X coordinate of the polygon + * @readonly + */ _proto.getX = function getX() { + return this.points[this.points.length - 2]; + }; + /** + * Get the first Y coordinate of the polygon + * @readonly + */ _proto.getY = function getY() { + return this.points[this.points.length - 1]; + }; + _proto.build = function build(points) { + for(var i = 0; i < this.points.length; i++){ + points[i] = this.points[i]; + } + }; + _proto.triangulate = function triangulate1(points, vertices, verticesOffset, indices, indicesOffset) { + var triangles = triangulate([ + points + ]); + var indexStart = vertices.length / 2; + // 当所有 points 在一条直线时, gluTess 三角化 triangles 会返回空数组,这边做一下额外处理返回线段左右端点组成的三角形,确保拿到的包围盒是正确的。 + if (triangles.length === 0) { + this.getLineEndPointsTriangle(points, triangles); + } + for(var i = 0; i < triangles.length; i++){ + vertices[verticesOffset * 2 + i] = triangles[i]; + } + var vertexCount = triangles.length / 2; + for(var i1 = 0; i1 < vertexCount; i1++){ + indices[indicesOffset + i1] = indexStart + i1; + } + }; + /** + * 获取直线上最远的两个端点坐标组成的三角形 + */ _proto.getLineEndPointsTriangle = function getLineEndPointsTriangle(points, triangles) { + // 参数检查 + if (!points || points.length < 2 || points.length % 2 !== 0) { + throw new Error("Invalid points array"); + } + if (points.length === 2) { + triangles.push(points[0], points[1], points[0], points[1], points[0], points[1]); + return; + } + // 取第一个线段计算斜率 + var dx = points[2] - points[0]; + var dy = points[3] - points[1]; + // 存放结果坐标 + var startX = points[0]; + var startY = points[1]; + var endX = points[0]; + var endY = points[1]; + // 根据斜率决定比较x还是y + if (Math.abs(dx) >= Math.abs(dy)) { + // 水平方向为主,比较x坐标 + for(var i = 0; i < points.length; i += 2){ + var x = points[i]; + var y = points[i + 1]; + if (x < startX) { + startX = x; + startY = y; + } + if (x > endX) { + endX = x; + endY = y; + } + } + } else { + // 垂直方向为主,比较y坐标 + for(var i1 = 0; i1 < points.length; i1 += 2){ + var x1 = points[i1]; + var y1 = points[i1 + 1]; + if (y1 < startY) { + startX = x1; + startY = y1; + } + if (y1 > endY) { + endX = x1; + endY = y1; + } + } + } + triangles.push(startX, startY, endX, endY, endX, endY); + }; + _create_class(Polygon, [ + { + key: "lastX", + get: /** + * Get the last X coordinate of the polygon + * @readonly + */ function get() { + return this.points[this.points.length - 2]; + } + }, + { + key: "lastY", + get: /** + * Get the last Y coordinate of the polygon + * @readonly + */ function get() { + return this.points[this.points.length - 1]; + } + } + ]); + return Polygon; +}(ShapePrimitive); + +// thanks to https://github.com/mattdesl/adaptive-bezier-curve +// for the original code! +var RECURSION_LIMIT = 8; +var FLT_EPSILON = 1.19209290e-7; +var PATH_DISTANCE_EPSILON = 1.0; +var defaultBezierSmoothness = 0.5; +function buildAdaptiveBezier(points, sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, smoothness) { + // TODO expose as a parameter + var scale = 5; + var smoothing = Math.min(0.99, Math.max(0, smoothness != null ? smoothness : defaultBezierSmoothness)); + var distanceTolerance = (PATH_DISTANCE_EPSILON - smoothing) / scale; + distanceTolerance *= distanceTolerance; + begin(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance); + return points; +} +//// Based on: +//// https://github.com/pelson/antigrain/blob/master/agg-2.4/src/agg_curves.cpp +function begin(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance) { + // dont need to actually ad this! + // points.push(sX, sY); + recursive(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance, 0); + points.push(eX, eY); +} +// eslint-disable-next-line max-params +function recursive(x1, y1, x2, y2, x3, y3, x4, y4, points, distanceTolerance, level) { + if (level > RECURSION_LIMIT) { + return; + } + // Calculate all the mid-points of the line segments + // ---------------------- + var x12 = (x1 + x2) / 2; + var y12 = (y1 + y2) / 2; + var x23 = (x2 + x3) / 2; + var y23 = (y2 + y3) / 2; + var x34 = (x3 + x4) / 2; + var y34 = (y3 + y4) / 2; + var x123 = (x12 + x23) / 2; + var y123 = (y12 + y23) / 2; + var x234 = (x23 + x34) / 2; + var y234 = (y23 + y34) / 2; + var x1234 = (x123 + x234) / 2; + var y1234 = (y123 + y234) / 2; + if (level > 0) { + // Try to approximate the full cubic curve by a single straight line + // ------------------ + var dx = x4 - x1; + var dy = y4 - y1; + var d2 = Math.abs((x2 - x4) * dy - (y2 - y4) * dx); + var d3 = Math.abs((x3 - x4) * dy - (y3 - y4) * dx); + if (d2 > FLT_EPSILON && d3 > FLT_EPSILON) { + // Regular care + // ----------------- + if ((d2 + d3) * (d2 + d3) <= distanceTolerance * (dx * dx + dy * dy)) { + // If the curvature doesn't exceed the distanceTolerance value + // we tend to finish subdivisions. + // ---------------------- + { + points.push(x1234, y1234); + return; + } + } + } else if (d2 > FLT_EPSILON) { + // p1,p3,p4 are collinear, p2 is considerable + // ---------------------- + if (d2 * d2 <= distanceTolerance * (dx * dx + dy * dy)) { + { + points.push(x1234, y1234); + return; + } + } + } else if (d3 > FLT_EPSILON) { + // p1,p2,p4 are collinear, p3 is considerable + // ---------------------- + if (d3 * d3 <= distanceTolerance * (dx * dx + dy * dy)) { + { + points.push(x1234, y1234); + return; + } + } + } else { + // Collinear case + // ----------------- + dx = x1234 - (x1 + x4) / 2; + dy = y1234 - (y1 + y4) / 2; + if (dx * dx + dy * dy <= distanceTolerance) { + points.push(x1234, y1234); + return; + } + } + } + // Continue subdivision + // ---------------------- + recursive(x1, y1, x12, y12, x123, y123, x1234, y1234, points, distanceTolerance, level + 1); + recursive(x1234, y1234, x234, y234, x34, y34, x4, y4, points, distanceTolerance, level + 1); +} + +// Based on: +/** + * The Ellipse object is used to help draw graphics and can also be used to specify a hit area for containers. + */ var Ellipse = /*#__PURE__*/ function(ShapePrimitive) { + _inherits(Ellipse, ShapePrimitive); + function Ellipse(x, y, halfWidth, halfHeight) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + if (halfWidth === void 0) halfWidth = 0; + if (halfHeight === void 0) halfHeight = 0; + var _this; + _this = ShapePrimitive.call(this) || this; + /** + * The type of the object, mainly used to avoid `instanceof` checks + * @default 'ellipse' + */ _this.type = "ellipse"; + _this.x = x; + _this.y = y; + _this.halfWidth = halfWidth; + _this.halfHeight = halfHeight; + return _this; + } + var _proto = Ellipse.prototype; + /** + * Creates a clone of this Ellipse instance + * @returns {Ellipse} A copy of the ellipse + */ _proto.clone = function clone() { + return new Ellipse(this.x, this.y, this.halfWidth, this.halfHeight); + }; + /** + * Checks whether the x and y coordinates given are contained within this ellipse + * @param x - The X coordinate of the point to test + * @param y - The Y coordinate of the point to test + * @returns Whether the x/y coords are within this ellipse + */ _proto.contains = function contains(x, y) { + if (this.halfWidth <= 0 || this.halfHeight <= 0) { + return false; + } + // normalize the coords to an ellipse with center 0,0 + var normx = (x - this.x) / this.halfWidth; + var normy = (y - this.y) / this.halfHeight; + normx *= normx; + normy *= normy; + return normx + normy <= 1; + }; + /** + * Checks whether the x and y coordinates given are contained within this ellipse including stroke + * @param x - The X coordinate of the point to test + * @param y - The Y coordinate of the point to test + * @param width + * @returns Whether the x/y coords are within this ellipse + */ _proto.strokeContains = function strokeContains(x, y, width) { + var _this = this, halfWidth = _this.halfWidth, halfHeight = _this.halfHeight; + if (halfWidth <= 0 || halfHeight <= 0) { + return false; + } + var halfStrokeWidth = width / 2; + var innerA = halfWidth - halfStrokeWidth; + var innerB = halfHeight - halfStrokeWidth; + var outerA = halfWidth + halfStrokeWidth; + var outerB = halfHeight + halfStrokeWidth; + var normalizedX = x - this.x; + var normalizedY = y - this.y; + var innerEllipse = normalizedX * normalizedX / (innerA * innerA) + normalizedY * normalizedY / (innerB * innerB); + var outerEllipse = normalizedX * normalizedX / (outerA * outerA) + normalizedY * normalizedY / (outerB * outerB); + return innerEllipse > 1 && outerEllipse <= 1; + }; + /** + * Returns the framing rectangle of the ellipse as a Rectangle object + * @param out + * @returns The framing rectangle + */ // getBounds (out?: Rectangle): Rectangle { + // out = out || new Rectangle(); + // out.x = this.x - this.halfWidth; + // out.y = this.y - this.halfHeight; + // out.width = this.halfWidth * 2; + // out.height = this.halfHeight * 2; + // return out; + // } + /** + * Copies another ellipse to this one. + * @param ellipse - The ellipse to copy from. + * @returns Returns itself. + */ _proto.copyFrom = function copyFrom(ellipse) { + this.x = ellipse.x; + this.y = ellipse.y; + this.halfWidth = ellipse.halfWidth; + this.halfHeight = ellipse.halfHeight; + return this; + }; + /** + * Copies this ellipse to another one. + * @param ellipse - The ellipse to copy to. + * @returns Returns given parameter. + */ _proto.copyTo = function copyTo(ellipse) { + ellipse.copyFrom(this); + return ellipse; + }; + _proto.getX = function getX() { + return this.x; + }; + _proto.getY = function getY() { + return this.y; + }; + _proto.build = function build(points) { + var x = this.x; + var y = this.y; + var rx = this.halfWidth; + var ry = this.halfHeight; + var dx = 0; + var dy = 0; + if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) { + return points; + } + // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029 + var sampleDensity = 5; + var n = Math.ceil(sampleDensity * Math.sqrt(rx + ry)); + var m = n * 8 + (0) + (0); + if (m === 0) { + return points; + } + if (n === 0) { + points[0] = points[6] = x + dx; + points[1] = points[3] = y + dy; + points[2] = points[4] = x - dx; + points[5] = points[7] = y - dy; + return points; + } + var j1 = 0; + var j2 = n * 4 + (0) + 2; + var j3 = j2; + var j4 = m; + var x0 = dx + rx; + var y0 = dy; + var x1 = x + x0; + var x2 = x - x0; + var y1 = y + y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j2] = y1; + points[--j2] = x2; + for(var i = 1; i < n; i++){ + var a = Math.PI / 2 * (i / n); + var x01 = dx + Math.cos(a) * rx; + var y01 = dy + Math.sin(a) * ry; + var x11 = x + x01; + var x21 = x - x01; + var y11 = y + y01; + var y21 = y - y01; + points[j1++] = x11; + points[j1++] = y11; + points[--j2] = y11; + points[--j2] = x21; + points[j3++] = x21; + points[j3++] = y21; + points[--j4] = y21; + points[--j4] = x11; + } + x0 = dx; + y0 = dy + ry; + x1 = x + x0; + x2 = x - x0; + y1 = y + y0; + var y22 = y - y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j4] = y22; + points[--j4] = x1; + return points; + }; + _proto.triangulate = function triangulate(points, vertices, verticesOffset, indices, indicesOffset) { + if (points.length === 0) { + return; + } + // Compute center (average of all points) + var centerX = 0; + var centerY = 0; + for(var i = 0; i < points.length; i += 2){ + centerX += points[i]; + centerY += points[i + 1]; + } + centerX /= points.length / 2; + centerY /= points.length / 2; + // Set center vertex + var count = verticesOffset; + vertices[count * 2] = centerX; + vertices[count * 2 + 1] = centerY; + var centerIndex = count++; + // Set edge vertices and indices + for(var i1 = 0; i1 < points.length; i1 += 2){ + vertices[count * 2] = points[i1]; + vertices[count * 2 + 1] = points[i1 + 1]; + if (i1 > 0) { + indices[indicesOffset++] = count; + indices[indicesOffset++] = centerIndex; + indices[indicesOffset++] = count - 1; + } + count++; + } + // Connect last point to the first edge point + indices[indicesOffset++] = centerIndex + 1; + indices[indicesOffset++] = centerIndex; + indices[indicesOffset++] = count - 1; + }; + return Ellipse; +}(ShapePrimitive); + +// Based on: +exports.StarType = void 0; +(function(StarType) { + StarType[StarType["Star"] = 0] = "Star"; + StarType[StarType["Polygon"] = 1] = "Polygon"; +})(exports.StarType || (exports.StarType = {})); +var PolyStar = /*#__PURE__*/ function(ShapePrimitive) { + _inherits(PolyStar, ShapePrimitive); + function PolyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType) { + if (pointCount === void 0) pointCount = 0; + if (outerRadius === void 0) outerRadius = 0; + if (innerRadius === void 0) innerRadius = 0; + if (outerRoundness === void 0) outerRoundness = 0; + if (innerRoundness === void 0) innerRoundness = 0; + if (starType === void 0) starType = 0; + var _this; + _this = ShapePrimitive.call(this) || this; + _this.pointCount = pointCount; + _this.outerRadius = outerRadius; + _this.innerRadius = innerRadius; + _this.outerRoundness = outerRoundness; + _this.innerRoundness = innerRoundness; + _this.starType = starType; + _this.v = []; + _this.in = []; + _this.out = []; + return _this; + } + var _proto = PolyStar.prototype; + _proto.clone = function clone() { + var polyStar = new PolyStar(this.pointCount, this.outerRadius, this.innerRadius, this.outerRoundness, this.innerRoundness, this.starType); + return polyStar; + }; + _proto.copyFrom = function copyFrom(source) { + this.pointCount = source.pointCount; + this.outerRadius = source.outerRadius; + this.innerRadius = source.innerRadius; + this.outerRoundness = source.outerRoundness; + this.innerRoundness = source.innerRoundness; + this.starType = source.starType; + }; + _proto.copyTo = function copyTo(destination) { + destination.copyFrom(this); + }; + _proto.build = function build(points) { + switch(this.starType){ + case 0: + { + this.buildStarPath(); + break; + } + case 1: + { + this.buildPolygonPath(); + break; + } + } + var smoothness = 1; + for(var i = 0; i < this.v.length - 2; i += 2){ + buildAdaptiveBezier(points, this.v[i], this.v[i + 1], this.out[i], this.out[i + 1], this.in[i + 2], this.in[i + 3], this.v[i + 2], this.v[i + 3], smoothness); + } + // draw last curve + var lastIndex = this.v.length - 1; + buildAdaptiveBezier(points, this.v[lastIndex - 1], this.v[lastIndex], this.out[lastIndex - 1], this.out[lastIndex], this.in[0], this.in[1], this.v[0], this.v[1], smoothness); + }; + _proto.triangulate = function triangulate1(points, vertices, verticesOffset, indices, indicesOffset) { + var triangles = triangulate([ + points + ]); + var indexStart = vertices.length / 2; + for(var i = 0; i < triangles.length; i++){ + vertices[verticesOffset * 2 + i] = triangles[i]; + } + var vertexCount = triangles.length / 2; + for(var i1 = 0; i1 < vertexCount; i1++){ + indices[indicesOffset + i1] = indexStart + i1; + } + }; + _proto.buildStarPath = function buildStarPath() { + this.v = []; + this.in = []; + this.out = []; + var numPts = Math.floor(this.pointCount) * 2; + var angle = Math.PI * 2 / numPts; + var longFlag = true; + var longRad = this.outerRadius; + var shortRad = this.innerRadius; + var longRound = this.outerRoundness / 100; + var shortRound = this.innerRoundness / 100; + var longPerimSegment = 2 * Math.PI * longRad / (numPts * 2); + var shortPerimSegment = 2 * Math.PI * shortRad / (numPts * 2); + var i; + var rad; + var roundness; + var perimSegment; + var currentAng = -Math.PI / 2; + var dir = 1; + for(i = 0; i < numPts; i++){ + rad = longFlag ? longRad : shortRad; + roundness = longFlag ? longRound : shortRound; + perimSegment = longFlag ? longPerimSegment : shortPerimSegment; + var x = rad * Math.cos(currentAng); + var y = rad * Math.sin(currentAng); + var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y); + var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y); + var offset = i * 2; + this.v[offset] = x; + this.v[offset + 1] = y; + this.in[offset] = x + ox * perimSegment * roundness * dir; + this.in[offset + 1] = y + oy * perimSegment * roundness * dir; + this.out[offset] = x - ox * perimSegment * roundness * dir; + this.out[offset + 1] = y - oy * perimSegment * roundness * dir; + longFlag = !longFlag; + currentAng += angle * dir; + } + }; + _proto.buildPolygonPath = function buildPolygonPath() { + this.v = []; + this.in = []; + this.out = []; + var numPts = Math.floor(this.pointCount); + var angle = Math.PI * 2 / numPts; + var rad = this.outerRadius; + var roundness = this.outerRoundness / 100; + var perimSegment = 2 * Math.PI * rad / (numPts * 4); + var i; + var currentAng = -Math.PI * 0.5; + var dir = 1; + for(i = 0; i < numPts; i++){ + var x = rad * Math.cos(currentAng); + var y = rad * Math.sin(currentAng); + var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y); + var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y); + var offset = i * 2; + this.v[offset] = x; + this.v[offset + 1] = y; + this.in[offset] = x + ox * perimSegment * roundness * dir; + this.in[offset + 1] = y + oy * perimSegment * roundness * dir; + this.out[offset] = x - ox * perimSegment * roundness * dir; + this.out[offset + 1] = y - oy * perimSegment * roundness * dir; + currentAng += angle * dir; + } + }; + return PolyStar; +}(ShapePrimitive); + +// Based on: +/** + * The `Rectangle` object is an area defined by its position, as indicated by its top-left corner + * point (`x`, `y`) and by its `width` and its `height`, including a `roundness` property that + * defines the roundness of the rounded corners. + * @memberof maths + */ var Rectangle = /*#__PURE__*/ function(ShapePrimitive) { + _inherits(Rectangle, ShapePrimitive); + function Rectangle(x, y, width, height, roundness) { + if (x === void 0) x = 0; + if (y === void 0) y = 0; + if (width === void 0) width = 0; + if (height === void 0) height = 0; + if (roundness === void 0) roundness = 20; + var _this; + _this = ShapePrimitive.call(this) || this; + _this.x = x; + _this.y = y; + _this.width = width; + _this.height = height; + _this.roundness = roundness; + return _this; + } + var _proto = Rectangle.prototype; + /** + * Returns the framing rectangle of the rectangle as a Rectangle object + * @param out - optional rectangle to store the result + * @returns The framing rectangle + */ _proto.getBounds = function getBounds(out) { + out = out || new Rectangle(); + out.x = this.x; + out.y = this.y; + out.width = this.width; + out.height = this.height; + return out; + }; + /** + * Creates a clone of this rectangle. + * @returns - A copy of the rectangle. + */ _proto.clone = function clone() { + return new Rectangle(this.x, this.y, this.width, this.height, this.roundness); + }; + /** + * Copies another rectangle to this one. + * @param rectangle - The rectangle to copy from. + * @returns Returns itself. + */ _proto.copyFrom = function copyFrom(rectangle) { + this.x = rectangle.x; + this.y = rectangle.y; + this.width = rectangle.width; + this.height = rectangle.height; + this.roundness = rectangle.roundness; + return this; + }; + /** + * Copies this rectangle to another one. + * @param rectangle - The rectangle to copy to. + * @returns Returns given parameter. + */ _proto.copyTo = function copyTo(rectangle) { + rectangle.copyFrom(this); + return rectangle; + }; + _proto.build = function build(points) { + var ry; + var halfWidth = this.width / 2; + var halfHeight = this.height / 2; + var x = this.x + halfWidth; + var y = this.y + halfHeight; + var rx = ry = Math.max(0, Math.min(this.roundness / 100, 1) * Math.min(halfWidth, halfHeight)); + var dx = halfWidth - rx; + var dy = halfHeight - ry; + if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) { + return; + } + // 控制边缘的平滑程度 + var densityScale = 5; + // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029 + var n = densityScale * Math.ceil(2.3 * Math.sqrt(rx + ry)); + var m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0); + if (m === 0) { + return; + } + if (n === 0) { + points[0] = points[6] = x + dx; + points[1] = points[3] = y + dy; + points[2] = points[4] = x - dx; + points[5] = points[7] = y - dy; + return; + } + var j1 = 0; + var j2 = n * 4 + (dx ? 2 : 0) + 2; + var j3 = j2; + var j4 = m; + var x0 = dx + rx; + var y0 = dy; + var x1 = x + x0; + var x2 = x - x0; + var y1 = y + y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j2] = y1; + points[--j2] = x2; + if (dy) { + var y2 = y - y0; + points[j3++] = x2; + points[j3++] = y2; + points[--j4] = y2; + points[--j4] = x1; + } + for(var i = 1; i < n; i++){ + var a = Math.PI / 2 * (i / n); + var x01 = dx + Math.cos(a) * rx; + var y01 = dy + Math.sin(a) * ry; + var x11 = x + x01; + var x21 = x - x01; + var y11 = y + y01; + var y21 = y - y01; + points[j1++] = x11; + points[j1++] = y11; + points[--j2] = y11; + points[--j2] = x21; + points[j3++] = x21; + points[j3++] = y21; + points[--j4] = y21; + points[--j4] = x11; + } + x0 = dx; + y0 = dy + ry; + x1 = x + x0; + x2 = x - x0; + y1 = y + y0; + var y22 = y - y0; + points[j1++] = x1; + points[j1++] = y1; + points[--j4] = y22; + points[--j4] = x1; + if (dx) { + points[j1++] = x2; + points[j1++] = y1; + points[--j4] = y22; + points[--j4] = x2; + } + }; + _proto.triangulate = function triangulate(points, vertices, verticesOffset, indices, indicesOffset) { + if (points.length === 0) { + return; + } + // Compute center (average of all points) + var centerX = 0; + var centerY = 0; + for(var i = 0; i < points.length; i += 2){ + centerX += points[i]; + centerY += points[i + 1]; + } + centerX /= points.length / 2; + centerY /= points.length / 2; + // Set center vertex + var count = verticesOffset; + vertices[count * 2] = centerX; + vertices[count * 2 + 1] = centerY; + var centerIndex = count++; + // Set edge vertices and indices + for(var i1 = 0; i1 < points.length; i1 += 2){ + vertices[count * 2] = points[i1]; + vertices[count * 2 + 1] = points[i1 + 1]; + if (i1 > 0) { + indices[indicesOffset++] = count; + indices[indicesOffset++] = centerIndex; + indices[indicesOffset++] = count - 1; + } + count++; + } + // Connect last point to the first edge point + indices[indicesOffset++] = centerIndex + 1; + indices[indicesOffset++] = centerIndex; + indices[indicesOffset++] = count - 1; + }; + return Rectangle; +}(ShapePrimitive); + +// Based on: +var ShapePath = /*#__PURE__*/ function() { + function ShapePath(graphicsPath) { + this.graphicsPath = graphicsPath; + this.currentPoly = null; + this.shapePrimitives = []; + } + var _proto = ShapePath.prototype; + /** Builds the path. */ _proto.buildPath = function buildPath() { + this.currentPoly = null; + this.shapePrimitives.length = 0; + var path = this.graphicsPath; + for(var _iterator = _create_for_of_iterator_helper_loose(path.instructions), _step; !(_step = _iterator()).done;){ + var instruction = _step.value; + var action = instruction.action; + var data = instruction.data; + switch(action){ + case "bezierCurveTo": + { + this.bezierCurveTo(data[0], data[1], data[2], data[3], data[4], data[5], data[6]); + break; + } + case "moveTo": + { + this.moveTo(data[0], data[1]); + break; + } + case "ellipse": + { + this.ellipse(data[0], data[1], data[2], data[3], data[4]); + break; + } + case "polyStar": + { + this.polyStar(data[0], data[1], data[2], data[3], data[4], data[5], data[6]); + break; + } + case "rect": + { + this.rect(data[0], data[1], data[2], data[3], data[4]); + break; + } + case "closePath": + { + this.closePath(); + break; + } + } + } + this.endPoly(); + }; + /** + * Adds a cubic Bezier curve to the path. + * It requires three points: the first two are control points and the third one is the end point. + * The starting point is the last point in the current path. + * @param cp1x - The x-coordinate of the first control point. + * @param cp1y - The y-coordinate of the first control point. + * @param cp2x - The x-coordinate of the second control point. + * @param cp2y - The y-coordinate of the second control point. + * @param x - The x-coordinate of the end point. + * @param y - The y-coordinate of the end point. + * @param smoothness - Optional parameter to adjust the smoothness of the curve. + * @returns The instance of the current object for chaining. + */ _proto.bezierCurveTo = function bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, smoothness) { + this.ensurePoly(); + var currentPoly = this.currentPoly; + buildAdaptiveBezier(currentPoly.points, currentPoly.lastX, currentPoly.lastY, cp1x, cp1y, cp2x, cp2y, x, y, smoothness); + return this; + }; + _proto.moveTo = function moveTo(x, y) { + this.startPoly(x, y); + return this; + }; + /** + * Closes the current path by drawing a straight line back to the start. + * If the shape is already closed or there are no points in the path, this method does nothing. + * @returns The instance of the current object for chaining. + */ _proto.closePath = function closePath() { + this.endPoly(true); + return this; + }; + /** + * Draws an ellipse at the specified location and with the given x and y radii. + * An optional transformation can be applied, allowing for rotation, scaling, and translation. + * @param x - The x-coordinate of the center of the ellipse. + * @param y - The y-coordinate of the center of the ellipse. + * @param radiusX - The horizontal radius of the ellipse. + * @param radiusY - The vertical radius of the ellipse. + * @param transform - An optional `Matrix` object to apply a transformation to the ellipse. This can include rotations. + * @returns The instance of the current object for chaining. + */ _proto.ellipse = function ellipse(x, y, radiusX, radiusY, transform) { + // TODO apply rotation to transform... + this.drawShape(new Ellipse(x, y, radiusX, radiusY), transform); + return this; + }; + _proto.polyStar = function polyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType, transform) { + this.drawShape(new PolyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType), transform); + return this; + }; + /** + * Draws a rectangle shape. This method adds a new rectangle path to the current drawing. + * @param x - The x-coordinate of the upper-left corner of the rectangle. + * @param y - The y-coordinate of the upper-left corner of the rectangle. + * @param w - The width of the rectangle. + * @param h - The height of the rectangle. + * @param transform - An optional `Matrix` object to apply a transformation to the rectangle. + * @returns The instance of the current object for chaining. + */ _proto.rect = function rect(x, y, w, h, roundness, transform) { + this.drawShape(new Rectangle(x, y, w, h, roundness), transform); + return this; + }; + /** + * Draws a given shape on the canvas. + * This is a generic method that can draw any type of shape specified by the `ShapePrimitive` parameter. + * An optional transformation matrix can be applied to the shape, allowing for complex transformations. + * @param shape - The shape to draw, defined as a `ShapePrimitive` object. + * @param matrix - An optional `Matrix` for transforming the shape. This can include rotations, + * scaling, and translations. + * @returns The instance of the current object for chaining. + */ _proto.drawShape = function drawShape(shape, matrix) { + this.endPoly(); + this.shapePrimitives.push({ + shape: shape, + transform: matrix + }); + return this; + }; + /** + * Starts a new polygon path from the specified starting point. + * This method initializes a new polygon or ends the current one if it exists. + * @param x - The x-coordinate of the starting point of the new polygon. + * @param y - The y-coordinate of the starting point of the new polygon. + * @returns The instance of the current object for chaining. + */ _proto.startPoly = function startPoly(x, y) { + var currentPoly = this.currentPoly; + if (currentPoly) { + this.endPoly(); + } + currentPoly = new Polygon(); + currentPoly.points.push(x, y); + this.currentPoly = currentPoly; + return this; + }; + /** + * Ends the current polygon path. If `closePath` is set to true, + * the path is closed by connecting the last point to the first one. + * This method finalizes the current polygon and prepares it for drawing or adding to the shape primitives. + * @param closePath - A boolean indicating whether to close the polygon by connecting the last point + * back to the starting point. False by default. + * @returns The instance of the current object for chaining. + */ _proto.endPoly = function endPoly(closePath) { + if (closePath === void 0) closePath = false; + var shape = this.currentPoly; + if (shape && shape.points.length > 2) { + shape.closePath = closePath; + this.shapePrimitives.push({ + shape: shape + }); + } + this.currentPoly = null; + return this; + }; + _proto.ensurePoly = function ensurePoly(start) { + if (this.currentPoly) { + return; + } + this.currentPoly = new Polygon(); + this.currentPoly.points.push(0, 0); + }; + return ShapePath; +}(); + +// Based on: +var GraphicsPath = /*#__PURE__*/ function() { + function GraphicsPath() { + this.instructions = []; + this.dirty = false; + } + var _proto = GraphicsPath.prototype; + /** + * Adds a cubic Bezier curve to the path. + * It requires three points: the first two are control points and the third one is the end point. + * The starting point is the last point in the current path. + * @param cp1x - The x-coordinate of the first control point. + * @param cp1y - The y-coordinate of the first control point. + * @param cp2x - The x-coordinate of the second control point. + * @param cp2y - The y-coordinate of the second control point. + * @param x - The x-coordinate of the end point. + * @param y - The y-coordinate of the end point. + * @param smoothness - Optional parameter to adjust the smoothness of the curve. + * @returns The instance of the current object for chaining. + */ _proto.bezierCurveTo = function bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, smoothness) { + this.instructions.push({ + action: "bezierCurveTo", + data: [ + cp1x, + cp1y, + cp2x, + cp2y, + x, + y, + smoothness + ] + }); + this.dirty = true; + return this; + }; + /** + * Sets the starting point for a new sub-path. Any subsequent drawing commands are considered part of this path. + * @param x - The x-coordinate for the starting point. + * @param y - The y-coordinate for the starting point. + * @returns The instance of the current object for chaining. + */ _proto.moveTo = function moveTo(x, y) { + this.instructions.push({ + action: "moveTo", + data: [ + x, + y + ] + }); + this.dirty = true; + return this; + }; + /** + * Closes the current path by drawing a straight line back to the start. + * If the shape is already closed or there are no points in the path, this method does nothing. + * @returns The instance of the current object for chaining. + */ _proto.closePath = function closePath() { + this.instructions.push({ + action: "closePath", + data: [] + }); + this.dirty = true; + return this; + }; + /** + * Draws an ellipse at the specified location and with the given x and y radii. + * An optional transformation can be applied, allowing for rotation, scaling, and translation. + * @param x - The x-coordinate of the center of the ellipse. + * @param y - The y-coordinate of the center of the ellipse. + * @param radiusX - The horizontal radius of the ellipse. + * @param radiusY - The vertical radius of the ellipse. + * @param transform - An optional `Matrix` object to apply a transformation to the ellipse. This can include rotations. + * @returns The instance of the current object for chaining. + */ _proto.ellipse = function ellipse(x, y, radiusX, radiusY, transform) { + this.instructions.push({ + action: "ellipse", + data: [ + x, + y, + radiusX, + radiusY, + transform + ] + }); + this.dirty = true; + return this; + }; + /** + * Draws a rectangle shape. This method adds a new rectangle path to the current drawing. + * @param x - The x-coordinate of the upper-left corner of the rectangle. + * @param y - The y-coordinate of the upper-left corner of the rectangle. + * @param w - The width of the rectangle. + * @param h - The height of the rectangle. + * @param transform - An optional `Matrix` object to apply a transformation to the rectangle. + * @returns The instance of the current object for chaining. + */ _proto.rect = function rect(x, y, w, h, roundness, transform) { + this.instructions.push({ + action: "rect", + data: [ + x, + y, + w, + h, + roundness, + transform + ] + }); + this.dirty = true; + return this; + }; + _proto.polyStar = function polyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType, transform) { + this.instructions.push({ + action: "polyStar", + data: [ + pointCount, + outerRadius, + innerRadius, + outerRoundness, + innerRoundness, + starType, + transform + ] + }); + this.dirty = true; + return this; + }; + _proto.clear = function clear() { + this.instructions.length = 0; + this.dirty = true; + return this; + }; + _create_class(GraphicsPath, [ + { + key: "shapePath", + get: /** + * Provides access to the internal shape path, ensuring it is up-to-date with the current instructions. + * @returns The `ShapePath` instance associated with this `GraphicsPath`. + */ function get() { + if (!this._shapePath) { + this._shapePath = new ShapePath(this); + } + if (this.dirty) { + this.dirty = false; + this._shapePath.buildPath(); + } + return this._shapePath; + } + } + ]); + return GraphicsPath; +}(); + +function _possible_constructor_return(self, call) { + if (call && (_type_of(call) === "object" || typeof call === "function")) return call; + return _assert_this_initialized(self); +} + +var CanvasPool = /*#__PURE__*/ function() { + function CanvasPool() { + this.elements = []; + } + var _proto = CanvasPool.prototype; + _proto.dispose = function dispose() { + this.elements.forEach(function(e) { + return e.remove(); + }); + // clearing the array + this.elements.length = 0; + }; + _proto.getCanvas = function getCanvas() { + if (this.elements.length !== 0) { + var canvas = this.elements.shift(); + assertExist(canvas); + return canvas; + } + if (getConfig(TEMPLATE_USE_OFFSCREEN_CANVAS)) { + return window._createOffscreenCanvas(10, 10); + } else { + // in hongmeng system, create too many canvas will case render error + var defCanvas = document.createElement("canvas"); + defCanvas.getContext("2d", { + willReadFrequently: true + }); + return defCanvas; + } + }; + _proto.saveCanvas = function saveCanvas(canvas) { + canvas.width = 1; + canvas.height = 1; + if (this.elements.length < 3) { + addItem(this.elements, canvas); + } else { + canvas.remove(); + } + }; + return CanvasPool; +}(); +var canvasPool = new CanvasPool(); + +var TextLayout = /*#__PURE__*/ function() { + function TextLayout(options) { + this.width = 0; + this.height = 0; + var _options_textHeight = options.textHeight, textHeight = _options_textHeight === void 0 ? 100 : _options_textHeight, _options_textWidth = options.textWidth, textWidth = _options_textWidth === void 0 ? 100 : _options_textWidth, _options_textOverflow = options.textOverflow, textOverflow = _options_textOverflow === void 0 ? TextOverflow.clip : _options_textOverflow, _options_textBaseline = options.textBaseline, textBaseline = _options_textBaseline === void 0 ? TextBaseline.top : _options_textBaseline, _options_textAlign = options.textAlign, textAlign = _options_textAlign === void 0 ? TextAlignment.left : _options_textAlign, _options_text = options.text, text = _options_text === void 0 ? " " : _options_text, _options_letterSpace = options.letterSpace, letterSpace = _options_letterSpace === void 0 ? 0 : _options_letterSpace, _options_autoWidth = options.autoWidth, autoWidth = _options_autoWidth === void 0 ? false : _options_autoWidth, fontSize = options.fontSize, _options_lineHeight = options.lineHeight, lineHeight = _options_lineHeight === void 0 ? fontSize : _options_lineHeight; + var tempWidth = fontSize + letterSpace; + this.autoWidth = autoWidth; + this.maxTextWidth = text.length * tempWidth; + this.width = textWidth; + this.height = textHeight; + this.letterSpace = letterSpace; + this.overflow = textOverflow; + this.textBaseline = textBaseline; + this.textAlign = textAlign; + this.lineHeight = lineHeight; + } + var _proto = TextLayout.prototype; + /** + * 获取初始的行高偏移值 + * @param style - 字体基础数据 + * @param lineCount - 渲染行数 + * @param lineHeight - 渲染时的字体行高 + * @param fontSize - 渲染时的字体大小 + * @returns - 行高偏移值 + */ _proto.getOffsetY = function getOffsetY(style, lineCount, lineHeight, fontSize) { + var outlineWidth = style.outlineWidth, fontScale = style.fontScale; + // /3 计算Y轴偏移量,以匹配编辑器行为 + var offsetY = (lineHeight - fontSize) / 3; + // 计算基础偏移量 + var baseOffset = fontSize + outlineWidth * fontScale; + var commonCalculation = lineHeight * (lineCount - 1); + var offsetResult = 0; + switch(this.textBaseline){ + case TextBaseline.top: + offsetResult = baseOffset + offsetY; + break; + case TextBaseline.middle: + offsetResult = (this.height * fontScale - commonCalculation + baseOffset) / 2; + break; + case TextBaseline.bottom: + offsetResult = this.height * fontScale - commonCalculation - offsetY; + break; + } + return offsetResult; + }; + _proto.getOffsetX = function getOffsetX(style, maxWidth) { + var offsetX = 0; + switch(this.textAlign){ + case TextAlignment.left: + offsetX = style.outlineWidth * style.fontScale; + break; + case TextAlignment.middle: + offsetX = (this.width * style.fontScale - maxWidth) / 2; + break; + case TextAlignment.right: + offsetX = this.width * style.fontScale - maxWidth; + break; + } + return offsetX; + }; + /** + * 设置文本框的宽度和高度 + * @param width 文本框宽度 + * @param height 文本框高度 + */ _proto.setSize = function setSize(width, height) { + this.width = width; + this.height = height; + }; + return TextLayout; +}(); + +var TextStyle = function TextStyle(options) { + /** + * 是否有下划线(暂时无效) + */ this.isUnderline = false // ttf + ; + /** + * 下划线高度(暂时无效) + */ this.underlineHeight = 1 // ttf + ; + /** + * 是否有外描边 + */ this.isOutlined = false // both // ttf & char + ; + /** + * 外描边宽度 + */ this.outlineWidth = 0 // both // ttf & char + ; + /** + * 是否有阴影 + */ this.hasShadow = false // ttf + ; + this.fontDesc = "" // both + ; + /** + * 字体倍数 + */ this.fontScale = 2; + this.fontOffset = 0; + var _options_textColor = options.textColor, textColor = _options_textColor === void 0 ? [ + 1, + 1, + 1, + 1 + ] : _options_textColor, _options_fontSize = options.fontSize, fontSize = _options_fontSize === void 0 ? 40 : _options_fontSize, outline = options.outline, shadow = options.shadow, _options_fontWeight = options.fontWeight, fontWeight = _options_fontWeight === void 0 ? "normal" : _options_fontWeight, _options_fontStyle = options.fontStyle, fontStyle = _options_fontStyle === void 0 ? "normal" : _options_fontStyle, _options_fontFamily = options.fontFamily, fontFamily = _options_fontFamily === void 0 ? "sans-serif" : _options_fontFamily; + this.textColor = textColor; + //@ts-expect-error + this.textWeight = fontWeight; + //@ts-expect-error + this.fontStyle = fontStyle; + this.fontFamily = fontFamily; + this.fontSize = fontSize; // 暂时取消字号限制 Math.min(fontSize, this.maxFontSize); + if (outline) { + this.isOutlined = true; + var _outline_outlineColor; + this.outlineColor = (_outline_outlineColor = outline.outlineColor) != null ? _outline_outlineColor : [ + 1, + 1, + 1, + 1 + ]; + var _outline_outlineWidth; + this.outlineWidth = (_outline_outlineWidth = outline.outlineWidth) != null ? _outline_outlineWidth : 1; + this.fontOffset += this.outlineWidth; + } + if (shadow) { + this.hasShadow = true; + var _shadow_shadowBlur; + this.shadowBlur = (_shadow_shadowBlur = shadow.shadowBlur) != null ? _shadow_shadowBlur : 2; + var _shadow_shadowColor; + this.shadowColor = (_shadow_shadowColor = shadow.shadowColor) != null ? _shadow_shadowColor : [ + 0, + 0, + 0, + 1 + ]; + var _shadow_shadowOffsetX; + this.shadowOffsetX = (_shadow_shadowOffsetX = shadow.shadowOffsetX) != null ? _shadow_shadowOffsetX : 0; + var _shadow_shadowOffsetY; + this.shadowOffsetY = (_shadow_shadowOffsetY = shadow.shadowOffsetY) != null ? _shadow_shadowOffsetY : 0; + } + if (this.fontStyle !== FontStyle.normal) { + // 0.0174532925 = 3.141592653 / 180 + this.fontOffset += this.fontSize * Math.tan(12 * 0.0174532925); + } +}; + +var DEFAULT_FONTS = [ + "serif", + "sans-serif", + "monospace", + "courier" +]; +var seed$5 = 0; +exports.TextComponent = /*#__PURE__*/ function(BaseRenderComponent) { + _inherits(TextComponent, BaseRenderComponent); + function TextComponent(engine, props) { + var _this; + _this = BaseRenderComponent.call(this, engine) || this; + _this.isDirty = true; + /** + * 文本行数 + */ _this.lineCount = 0; + /** + * 每一行文本的最大宽度 + */ _this.maxLineWidth = 0; + _this.SCALE_FACTOR = 0.1; + _this.ALPHA_FIX_VALUE = 1 / 255; + _this.name = "MText" + seed$5++; + _this.geometry = _this.createGeometry(); + if (props) { + _this.fromData(props); + } + _this.canvas = canvasPool.getCanvas(); + canvasPool.saveCanvas(_this.canvas); + _this.context = _this.canvas.getContext("2d", { + willReadFrequently: true + }); + if (!props) { + return _possible_constructor_return(_this); + } + var options = props.options; + _this.updateWithOptions(options); + _this.updateTexture(); + return _this; + } + var _proto = TextComponent.prototype; + _proto.onUpdate = function onUpdate(dt) { + BaseRenderComponent.prototype.onUpdate.call(this, dt); + this.updateTexture(); + }; + _proto.fromData = function fromData(data) { + BaseRenderComponent.prototype.fromData.call(this, data); + var interaction = data.interaction, options = data.options; + this.interaction = interaction; + // TextComponentBase + this.updateWithOptions(options); + this.renderText(options); + // 恢复默认颜色 + this.material.setColor("_Color", new Color(1, 1, 1, 1)); + }; + _proto.updateWithOptions = function updateWithOptions(options) { + // OVERRIDE by mixins + }; + _proto.updateTexture = function updateTexture(flipY) { + // OVERRIDE by mixins + }; + return TextComponent; +}(BaseRenderComponent); +exports.TextComponent = __decorate([ + effectsClass(DataType.TextComponent) +], exports.TextComponent); +var TextComponentBase = /*#__PURE__*/ function() { + function TextComponentBase() {} + var _proto = TextComponentBase.prototype; + _proto.renderText = function renderText(options) { + this.updateTexture(); + }; + _proto.updateWithOptions = function updateWithOptions(options) { + this.textStyle = new TextStyle(options); + this.textLayout = new TextLayout(options); + this.text = options.text.toString(); + this.lineCount = this.getLineCount(options.text, true); + }; + _proto.getLineCount = function getLineCount(text, init) { + var context = this.context; + var _this_textLayout = this.textLayout, letterSpace = _this_textLayout.letterSpace, overflow = _this_textLayout.overflow; + var fontScale = init ? this.textStyle.fontSize / 10 : 1 / this.textStyle.fontScale; + var width = this.textLayout.width + this.textStyle.fontOffset; + var lineCount = 1; + var x = 0; + for(var i = 0; i < text.length; i++){ + var _context_measureText; + var str = text[i]; + var _context_measureText_width; + var textMetrics = ((_context_measureText_width = context == null ? void 0 : (_context_measureText = context.measureText(str)) == null ? void 0 : _context_measureText.width) != null ? _context_measureText_width : 0) * fontScale; + // 和浏览器行为保持一致 + x += letterSpace; + // 处理文本结束行为 + if (overflow === TextOverflow.display) { + if (str === "\n") { + lineCount++; + x = 0; + } else { + x += textMetrics; + this.maxLineWidth = Math.max(this.maxLineWidth, x); + } + } else { + if (x + textMetrics > width && i > 0 || str === "\n") { + lineCount++; + this.maxLineWidth = Math.max(this.maxLineWidth, x); + x = 0; + } + if (str !== "\n") { + x += textMetrics; + } + } + } + return lineCount; + }; + /** + * 设置字号大小 + * @param value - 字号 + * @returns + */ _proto.setFontSize = function setFontSize(value) { + if (this.textStyle.fontSize === value) { + return; + } + // 保证字号变化后位置正常 + var diff = this.textStyle.fontSize - value; + this.textLayout.lineHeight += diff; + this.textStyle.fontSize = value; + this.isDirty = true; + }; + /** + * 设置字重 + * @param value - 字重类型 + * @returns + */ _proto.setFontWeight = function setFontWeight(value) { + if (this.textStyle.textWeight === value) { + return; + } + this.textStyle.textWeight = value; + this.isDirty = true; + }; + /** + * 设置字体类型 + * @param value 字体类型 + * @returns + */ _proto.setFontStyle = function setFontStyle(value) { + if (this.textStyle.fontStyle === value) { + return; + } + this.textStyle.fontStyle = value; + this.isDirty = true; + }; + /** + * 设置文本 + * @param value - 文本内容 + * @returns + */ _proto.setText = function setText(value) { + if (this.text === value) { + return; + } + this.text = value.toString(); + this.lineCount = this.getLineCount(value, false); + this.isDirty = true; + }; + /** + * 设置文本水平布局 + * @param value - 布局选项 + * @returns + */ _proto.setTextAlign = function setTextAlign(value) { + if (this.textLayout.textAlign === value) { + return; + } + this.textLayout.textAlign = value; + this.isDirty = true; + }; + /** + * 设置文本垂直布局 + * @param value - 布局选项 + * @returns + */ _proto.setTextBaseline = function setTextBaseline(value) { + if (this.textLayout.textBaseline === value) { + return; + } + this.textLayout.textBaseline = value; + this.isDirty = true; + }; + /** + * 设置文本颜色 + * @param value - 颜色内容 + * @returns + */ _proto.setTextColor = function setTextColor(value) { + if (this.textStyle.textColor === value) { + return; + } + this.textStyle.textColor = value; + this.isDirty = true; + }; + /** + * 设置文本字体 + * @param value - 文本字体 + * @returns + */ _proto.setFontFamily = function setFontFamily(value) { + if (this.textStyle.fontFamily === value && !isValidFontFamily(value)) { + console.warn("The font is either the current font or an risky font family."); + return; + } + this.textStyle.fontFamily = value; + this.isDirty = true; + }; + /** + * 设置外描边文本颜色 + * @param value - 颜色内容 + * @returns + */ _proto.setOutlineColor = function setOutlineColor(value) { + if (this.textStyle.outlineColor === value) { + return; + } + this.textStyle.outlineColor = value; + this.isDirty = true; + }; + /** + * 设置外描边文本宽度 + * @param value - 外描边宽度 + * @returns + */ _proto.setOutlineWidth = function setOutlineWidth(value) { + if (this.textStyle.outlineWidth === value) { + return; + } + this.textStyle.outlineWidth = value; + this.isDirty = true; + }; + /** + * 设置阴影模糊 + * @param value - 阴影模糊强度 + * @returns + */ _proto.setShadowBlur = function setShadowBlur(value) { + if (this.textStyle.shadowBlur === value) { + return; + } + this.textStyle.shadowBlur = value; + this.isDirty = true; + }; + /** + * 设置文本溢出模式 + * + * - clip: 当文本内容超出边界框时,多余的会被截断。 + * - display: 该模式下会显示所有文本,会自动调整文本字号以保证显示完整。 + * > 当存在多行时,部分行内文本可能存在文本字号变小的情况,其他行为正常情况 + * + * @param overflow - 文本溢出模式 + */ _proto.setOverflow = function setOverflow(overflow) { + this.textLayout.overflow = overflow; + this.isDirty = true; + }; + /** + * 设置阴影颜色 + * @param value - 阴影颜色 + * @returns + */ _proto.setShadowColor = function setShadowColor(value) { + if (this.textStyle.shadowColor === value) { + return; + } + this.textStyle.shadowColor = value; + this.isDirty = true; + }; + /** + * 设置阴影水平偏移距离 + * @param value - 水平偏移距离 + * @returns + */ _proto.setShadowOffsetX = function setShadowOffsetX(value) { + if (this.textStyle.shadowOffsetX === value) { + return; + } + this.textStyle.shadowOffsetX = value; + this.isDirty = true; + }; + /** + * 设置阴影水平偏移距离 + * @param value - 水平偏移距离 + * @returns + */ _proto.setShadowOffsetY = function setShadowOffsetY(value) { + if (this.textStyle.shadowOffsetY === value) { + return; + } + this.textStyle.shadowOffsetY = value; + this.isDirty = true; + }; + /** + * 设置字体清晰度 + * @param value - 字体清晰度 + * @returns + */ _proto.setFontScale = function setFontScale(value) { + if (this.textStyle.fontScale === value) { + return; + } + this.textStyle.fontScale = value; + this.isDirty = true; + }; + /** + * 设置自适应宽高开关 + * @param value - 是否自适应宽高开关 + * @returns + */ _proto.setAutoWidth = function setAutoWidth(value) { + if (this.textLayout.autoWidth === value) { + return; + } + this.textLayout.autoWidth = value; + this.isDirty = true; + }; + /** + * 更新文本 + * @returns + */ _proto.updateTexture = function updateTexture(flipY) { + if (flipY === void 0) flipY = true; + if (!this.isDirty || !this.context || !this.canvas) { + return; + } + var context = this.context; + var style = this.textStyle; + var layout = this.textLayout; + var fontScale = style.fontScale; + var width = (layout.width + style.fontOffset) * fontScale; + var finalHeight = layout.lineHeight * this.lineCount; + var fontSize = style.fontSize * fontScale; + var lineHeight = layout.lineHeight * fontScale; + style.fontDesc = this.getFontDesc(fontSize); + this.char = (this.text || "").split(""); + this.canvas.width = width; + if (layout.autoWidth) { + this.canvas.height = finalHeight * fontScale; + this.item.transform.size.set(1, finalHeight / layout.height); + } else { + this.canvas.height = layout.height * fontScale; + } + var height = this.canvas.height; + // fix bug 1/255 + context.fillStyle = "rgba(255, 255, 255, 0.0039)"; + if (!flipY) { + context.translate(0, height); + context.scale(1, -1); + } + // canvas size 变化后重新刷新 context + if (this.maxLineWidth > width && layout.overflow === TextOverflow.display) { + context.font = this.getFontDesc(fontSize * width / this.maxLineWidth); + } else { + context.font = style.fontDesc; + } + context.clearRect(0, 0, width, height); + if (style.hasShadow) { + this.setupShadow(); + } + if (style.isOutlined) { + this.setupOutline(); + } + // 文本颜色 + context.fillStyle = "rgba(" + style.textColor[0] + ", " + style.textColor[1] + ", " + style.textColor[2] + ", " + style.textColor[3] + ")"; + var charsInfo = []; + var x = 0; + var y = layout.getOffsetY(style, this.lineCount, lineHeight, fontSize); + var charsArray = []; + var charOffsetX = []; + for(var i = 0; i < this.char.length; i++){ + var str = this.char[i]; + var textMetrics = context.measureText(str); + // 和浏览器行为保持一致 + x += layout.letterSpace * fontScale; + if (x + textMetrics.width > width && i > 0 || str === "\n") { + charsInfo.push({ + y: y, + width: x, + chars: charsArray, + charOffsetX: charOffsetX + }); + x = 0; + y += lineHeight; + charsArray = []; + charOffsetX = []; + } + if (str !== "\n") { + charsArray.push(str); + charOffsetX.push(x); + x += textMetrics.width; + } + } + charsInfo.push({ + y: y, + width: x, + chars: charsArray, + charOffsetX: charOffsetX + }); + charsInfo.forEach(function(charInfo) { + var x = layout.getOffsetX(style, charInfo.width); + charInfo.chars.forEach(function(str, i) { + if (style.isOutlined) { + context.strokeText(str, x + charInfo.charOffsetX[i], charInfo.y); + } + context.fillText(str, x + charInfo.charOffsetX[i], charInfo.y); + }); + }); + if (style.hasShadow) { + context.shadowColor = "transparent"; + } + //与 toDataURL() 两种方式都需要像素读取操作 + var imageData = context.getImageData(0, 0, this.canvas.width, this.canvas.height); + var texture = Texture.createWithData(this.engine, { + data: new Uint8Array(imageData.data), + width: imageData.width, + height: imageData.height + }, { + flipY: flipY, + magFilter: glContext.LINEAR, + minFilter: glContext.LINEAR, + wrapS: glContext.CLAMP_TO_EDGE, + wrapT: glContext.CLAMP_TO_EDGE + }); + this.renderer.texture = texture; + this.material.setTexture("_MainTex", texture); + this.isDirty = false; + }; + _proto.getFontDesc = function getFontDesc(size) { + var _this_textStyle = this.textStyle, fontSize = _this_textStyle.fontSize, fontScale = _this_textStyle.fontScale, fontFamily = _this_textStyle.fontFamily, textWeight = _this_textStyle.textWeight, fontStyle = _this_textStyle.fontStyle; + var fontDesc = "" + (size || fontSize * fontScale).toString() + "px "; + if (!DEFAULT_FONTS.includes(fontFamily)) { + fontDesc += '"' + fontFamily + '"'; + } else { + fontDesc += fontFamily; + } + if (textWeight !== TextWeight.normal) { + fontDesc = textWeight + " " + fontDesc; + } + if (fontStyle !== FontStyle.normal) { + fontDesc = fontStyle + " " + fontDesc; + } + return fontDesc; + }; + _proto.setupOutline = function setupOutline() { + var context = this.context; + var _this_textStyle = this.textStyle, outlineColor = _this_textStyle.outlineColor, outlineWidth = _this_textStyle.outlineWidth; + var r = outlineColor[0], g = outlineColor[1], b = outlineColor[2], a = outlineColor[3]; + if (context) { + context.strokeStyle = "rgba(" + r * 255 + ", " + g * 255 + ", " + b * 255 + ", " + a + ")"; + context.lineWidth = outlineWidth * 2; + } + }; + _proto.setupShadow = function setupShadow() { + var context = this.context; + var _this_textStyle = this.textStyle, outlineColor = _this_textStyle.outlineColor, shadowBlur = _this_textStyle.shadowBlur, shadowOffsetX = _this_textStyle.shadowOffsetX, shadowOffsetY = _this_textStyle.shadowOffsetY; + var r = outlineColor[0], g = outlineColor[1], b = outlineColor[2], a = outlineColor[3]; + if (context) { + context.shadowColor = "rgba(" + r * 255 + ", " + g * 255 + ", " + b * 255 + ", " + a + ")"; + context.shadowBlur = shadowBlur; + context.shadowOffsetX = shadowOffsetX; + context.shadowOffsetY = -shadowOffsetY; + } + }; + return TextComponentBase; +}(); +applyMixins(exports.TextComponent, [ + TextComponentBase +]); + +// TODO: 注册必须用 +var TextLoader = /*#__PURE__*/ function(AbstractPlugin) { + _inherits(TextLoader, AbstractPlugin); + function TextLoader() { + return AbstractPlugin.apply(this, arguments); + } + return TextLoader; +}(AbstractPlugin); + +var Asset = /*#__PURE__*/ function(EffectsObject) { + _inherits(Asset, EffectsObject); + function Asset() { + return EffectsObject.apply(this, arguments); + } + return Asset; +}(EffectsObject); + +exports.BinaryAsset = /*#__PURE__*/ function(EffectsObject) { + _inherits(BinaryAsset, EffectsObject); + function BinaryAsset() { + return EffectsObject.apply(this, arguments); + } + return BinaryAsset; +}(EffectsObject); +__decorate([ + serialize() +], exports.BinaryAsset.prototype, "buffer", void 0); +exports.BinaryAsset = __decorate([ + effectsClass(DataType.BinaryAsset) +], exports.BinaryAsset); + +var SerializationHelper = /*#__PURE__*/ function() { + function SerializationHelper() {} + SerializationHelper.serialize = function serialize(effectsObject, serializedData) { + effectsObject.toData(); + if (!serializedData) { + serializedData = {}; + } + var serializedProperties = getMergedStore(effectsObject); + if (serializedProperties) { + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(serializedProperties)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + var value = effectsObject[key]; + if (typeof value === "number" || typeof value === "string" || typeof value === "boolean" || SerializationHelper.checkTypedArray(value)) { + // TODO json 数据避免传 typedArray + serializedData[key] = value; + } else if (isArray(value)) { + if (!serializedData[key]) { + serializedData[key] = []; + } + SerializationHelper.serializeArrayProperty(value, serializedData[key], 0); + } else if (EffectsObject.is(value)) { + // TODO 处理 EffectsObject 递归序列化 + serializedData[key] = { + id: value.getInstanceId() + }; + } else if (isObject(value)) { + if (!serializedData[key]) { + serializedData[key] = {}; + } + SerializationHelper.serializeObjectProperty(value, serializedData[key], 0); + } + } + } + // TODO 待移除 tagggedProperties 为没有装饰器的临时方案 + for(var _iterator1 = _create_for_of_iterator_helper_loose(Object.keys(effectsObject.defination)), _step1; !(_step1 = _iterator1()).done;){ + var key1 = _step1.value; + var value1 = effectsObject.defination[key1]; + if (typeof value1 === "number" || typeof value1 === "string" || typeof value1 === "boolean" || SerializationHelper.checkTypedArray(value1)) { + // TODO json 数据避免传 typedArray + serializedData[key1] = value1; + } else if (isArray(value1)) { + if (!serializedData[key1]) { + serializedData[key1] = []; + } + SerializationHelper.serializeArrayProperty(value1, serializedData[key1], 0); + } else if (EffectsObject.is(value1)) { + // TODO 处理 EffectsObject 递归序列化 + serializedData[key1] = { + id: value1.getInstanceId() + }; + } else if (isObject(value1)) { + if (!serializedData[key1]) { + serializedData[key1] = {}; + } + SerializationHelper.serializeObjectProperty(value1, serializedData[key1], 0); + } + } + return serializedData; + }; + SerializationHelper.deserialize = function deserialize(serializedData, effectsObject) { + effectsObject.defination = serializedData; + var serializedProperties = getMergedStore(effectsObject); + var engine = effectsObject.engine; + if (serializedProperties) { + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(serializedProperties)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + var value = serializedData[key]; + if (value === undefined) { + continue; + } + var propertyType = serializedProperties[key].type; + // FIXME: taggedProperties 为 readonly,这里存在强制赋值 + effectsObject[key] = SerializationHelper.deserializeProperty(value, engine, 0, propertyType); + } + } + effectsObject.fromData(effectsObject.defination); + }; + SerializationHelper.checkTypedArray = function checkTypedArray(obj) { + return _instanceof1(obj, Int8Array) || _instanceof1(obj, Uint8Array) || _instanceof1(obj, Uint8ClampedArray) || _instanceof1(obj, Int16Array) || _instanceof1(obj, Uint16Array) || _instanceof1(obj, Int32Array) || _instanceof1(obj, Uint32Array) || _instanceof1(obj, Float32Array) || _instanceof1(obj, Float64Array) || _instanceof1(obj, ArrayBuffer); + }; + // check value is { id: 7e69662e964e4892ae8933f24562395b } + SerializationHelper.checkDataPath = function checkDataPath(value) { + return !!(isObject(value) && Object.keys(value).length === 1 && "id" in value && isString(value.id) && value.id.length === 32); + }; + // TODO 测试函数,2.0 上线后移除 + SerializationHelper.checkGLTFNode = function checkGLTFNode(value) { + return isObject(value) && value.nodeIndex !== undefined && value.isJoint !== undefined; + }; + SerializationHelper.checkImageSource = function checkImageSource(value) { + return isCanvas(value) || _instanceof1(value, HTMLImageElement); + }; + SerializationHelper.deserializeProperty = function deserializeProperty(property, engine, level, type, overrideDataPath) { + if (overrideDataPath === void 0) overrideDataPath = true; + if (level > 14) { + console.error("The nested object layers of the serialized data exceed the maximum limit."); + return; + } + // 加载并链接 DataPath 字段表示的 EffectsObject 引用。Class 对象 copy [key, value] 会丢失对象信息,因此只递归数组对象和普通 js Object 结构对象。 + if (isArray(property)) { + var res = []; + for(var _iterator = _create_for_of_iterator_helper_loose(property), _step; !(_step = _iterator()).done;){ + var value = _step.value; + res.push(SerializationHelper.deserializeProperty(value, engine, level + 1, type, overrideDataPath)); + } + return res; + // TODO json 数据避免传 typedArray + } else if (SerializationHelper.checkDataPath(property)) { + var referenceObject = engine.findObject(property); + return overrideDataPath ? referenceObject : property; + } else if (isObject(property) && property.constructor === Object) { + var res1; + if (type) { + res1 = new type(); + } else { + res1 = {}; + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(Object.keys(property)), _step1; !(_step1 = _iterator1()).done;){ + var key = _step1.value; + res1[key] = SerializationHelper.deserializeProperty(property[key], engine, level + 1, undefined, overrideDataPath); + } + return res1; + } else { + return property; + } + }; + SerializationHelper.serializeObjectProperty = function serializeObjectProperty(objectProperty, serializedData, level) { + if (level > 14) { + console.error("The nested object layers of the serialized data exceed the maximum limit."); + return; + } + if (!serializedData) { + serializedData = {}; + } + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(objectProperty)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + var value = objectProperty[key]; + if (typeof value === "number" || typeof value === "string" || typeof value === "boolean" || SerializationHelper.checkTypedArray(objectProperty)) { + // TODO json 数据避免传 typedArray + serializedData[key] = value; + } else if (isArray(value)) { + if (!serializedData[key]) { + serializedData[key] = []; + } + SerializationHelper.serializeArrayProperty(value, serializedData[key], level + 1); + } else if (EffectsObject.is(value)) { + // TODO 处理 EffectsObject 递归序列化 + serializedData[key] = { + id: value.getInstanceId() + }; + } else if (isObject(value)) { + if (!serializedData[key]) { + serializedData[key] = {}; + } + SerializationHelper.serializeObjectProperty(value, serializedData[key], level + 1); + } + } + }; + SerializationHelper.serializeArrayProperty = function serializeArrayProperty(arrayProperty, serializedData, level) { + if (level > 14) { + console.error("The nested object layers of the serialized data exceed the maximum limit."); + return; + } + if (!serializedData) { + serializedData = []; + } + for(var i = 0; i < arrayProperty.length; i++){ + var value = arrayProperty[i]; + if (typeof value === "number" || typeof value === "string" || typeof value === "boolean" || SerializationHelper.checkTypedArray(arrayProperty)) { + // TODO json 数据避免传 typedArray + serializedData[i] = value; + } else if (isArray(value)) { + if (!serializedData[i]) { + serializedData[i] = []; + } + SerializationHelper.serializeArrayProperty(value, serializedData[i], level + 1); + } else if (EffectsObject.is(value)) { + // TODO 处理 EffectsObject 递归序列化 + serializedData[i] = { + id: value.getInstanceId() + }; + } else if (isObject(value)) { + if (!serializedData[i]) { + serializedData[i] = {}; + } + SerializationHelper.serializeObjectProperty(value, serializedData[i], level + 1); + } + } + }; + return SerializationHelper; +}(); + +/** + * @since 2.0.0 + */ var AssetLoader = /*#__PURE__*/ function() { + function AssetLoader(engine) { + this.engine = engine; + } + var _proto = AssetLoader.prototype; + _proto.loadGUID = function loadGUID(dataPath) { + var guid = dataPath.id; + if (!dataPath) { + return null; + } + var effectsObjectData = this.findData(guid); + var effectsObject; + if (!effectsObjectData) { + console.error("Object data with uuid: " + guid + " not found."); + return undefined; + } + switch(effectsObjectData.dataType){ + case DataType.Material: + effectsObject = Material.create(this.engine); + break; + case DataType.Geometry: + effectsObject = Geometry.create(this.engine); + break; + case DataType.Texture: + effectsObject = Texture.create(this.engine); + break; + default: + { + var classConstructor = AssetLoader.getClass(effectsObjectData.dataType); + if (classConstructor) { + effectsObject = new classConstructor(this.engine); + } + } + } + if (!effectsObject) { + console.error("Constructor for DataType: " + effectsObjectData.dataType + " not found."); + return undefined; + } + effectsObject.setInstanceId(effectsObjectData.id); + this.engine.addInstance(effectsObject); + SerializationHelper.deserialize(effectsObjectData, effectsObject); + return effectsObject; + }; + _proto.findData = function findData(uuid) { + return this.engine.jsonSceneData[uuid]; + }; + AssetLoader.getClass = function getClass(dataType) { + return effectsClassStore[dataType]; + }; + return AssetLoader; +}(); +var Database = /*#__PURE__*/ function() { + function Database() {} + var _proto = Database.prototype; + _proto.loadGUID = function loadGUID(guid) { + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + undefined + ]; + }); + })(); + }; + return Database; +}(); + +function arrAdd(arr, item) { + if (!arr.includes(item)) { + arr.push(item); + return true; + } +} +function ensureFixedNumber(a) { + if (Number.isFinite(a)) { + return [ + ValueType.CONSTANT, + a + ]; + } + if (a) { + var valueType = a[0]; + var valueData = a[1]; + if (Array.isArray(valueType)) { + // 没有数据类型的数据 + return; + } + if (valueType === "static" || valueType === ValueType.CONSTANT) { + return [ + ValueType.CONSTANT, + a[1] + ]; + } + if (valueType === "lines") { + return [ + ValueType.LINE, + a[1] + ]; + } + if (valueType === ValueType.LINE) { + // @ts-expect-error + var keyframes = valueData.map(function(data) { + return [ + BezierKeyframeType.LINE, + data + ]; + }); + return [ + ValueType.BEZIER_CURVE, + keyframes + ]; + } + if (valueType === "curve" || valueType === ValueType.CURVE) { + return [ + ValueType.BEZIER_CURVE, + getBezierCurveFromHermiteInGE(valueData) + ]; + } + return a; + } +} +function ensureFixedNumberWithRandom(a, p) { + if (Array.isArray(a) && a[0] === "random") { + return [ + ValueType.CONSTANT, + a[1][p] + ]; + } + return ensureFixedNumber(a); +} +function ensureRGBAValue(a) { + if (a && a[0] === "color") { + return colorToArr(a[1], true); + } + return [ + 1, + 1, + 1, + 1 + ]; +} +function ensureColorExpression(a, normalized) { + if (a) { + if (a[0] === "colors") { + return [ + ValueType.COLORS, + a[1].map(function(color) { + return colorToArr(color, normalized); + }) + ]; + } else if (a[0] === "gradient") { + return ensureGradient(a[1], normalized); + } else if (a[0] === "color") { + return [ + ValueType.RGBA_COLOR, + colorToArr(a[1], normalized) + ]; + } + return a; + } +} +function ensureNumberExpression(a) { + if (a && a[0] === "random") { + return [ + ValueType.RANDOM, + a[1] + ]; + } + return ensureFixedNumber(a); +} +function ensureGradient(a, normalized) { + if (a) { + var stops = []; + Object.getOwnPropertyNames(a).forEach(function(p) { + var stop = parsePercent(p); + var color = colorToArr(a[p], normalized); + stops.push([ + stop, + color[0], + color[1], + color[2], + color[3] + ]); + }); + stops = stops.sort(function(a, b) { + return a[0] - b[0]; + }); + return [ + ValueType.GRADIENT_COLOR, + stops + ]; + } +} +function colorToArr(hex, normalized) { + var ret; + if (typeof hex === "string") { + hex = hex.replace(/[\s\t\r\n]/g, ""); + var m = /rgba?\(([.\d]+),([.\d]+),([.\d]+),?([.\d]+)?\)/.exec(hex); + if (m) { + var a = +m[4]; + ret = [ + +m[1], + +m[2], + +m[3], + isNaN(a) ? 255 : Math.round(a * 255) + ]; + } else if (/^#[a-f\d]{3}$/i.test(hex)) { + ret = [ + parseInt(hex[1] + hex[1], 16), + parseInt(hex[2] + hex[2], 16), + parseInt(hex[3] + hex[3], 16), + 255 + ]; + // eslint-disable-next-line no-cond-assign + } else if (m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)) { + ret = [ + parseInt(m[1], 16), + parseInt(m[2], 16), + parseInt(m[3], 16), + 255 + ] || [ + 0, + 0, + 0, + 255 + ]; + } + } else if (_instanceof1(hex, Array)) { + ret = [ + hex[0], + hex[1], + hex[2], + isNaN(hex[3]) ? 255 : Math.round(hex[3] * 255) + ]; + } + if (normalized) { + // @ts-expect-error + ret = normalizeColor(ret); + } + // @ts-expect-error + return ret; +} +function normalizeColor(a) { + if (Array.isArray(a)) { + return a.map(function(i) { + return Number.isFinite(i / 255) ? Number((i / 255).toFixed(6)) : 0; + }); + } +} +function parsePercent(c) { + var match = /^(-)?([\d+.]+)%$/.exec(c); + if (match) { + return +match[2] / 100 * (match[1] ? -1 : 1); + } + return +c; +} +function getGradientColor(color, normalized) { + if (Array.isArray(color)) { + if (color[0] === ValueType.GRADIENT_COLOR) { + return color; + } + // @ts-expect-error + return (color[0] === "gradient" || color[0] === "color") && ensureGradient(color[1], normalized); + } else { + return ensureGradient(color, normalized); + } +} +function ensureFixedVec3(a) { + if (a) { + if (a.length === 3) { + return [ + ValueType.CONSTANT_VEC3, + a + ]; + } + var valueType = a[0]; + if (valueType === "path" || valueType === "bezier" || valueType === ValueType.BEZIER_PATH || valueType === ValueType.LINEAR_PATH) { + var valueData = a[1]; + var easing = valueData[0]; + var points = valueData[1]; + var controlPoints = valueData[2]; + var bezierEasing = getBezierCurveFromHermiteInGE(easing); + // linear path没有controlPoints + if (!controlPoints) { + controlPoints = []; + for(var keyframeIndex = 0; keyframeIndex < points.length; keyframeIndex++){ + var point = points[keyframeIndex].slice(); + if (keyframeIndex === 0) { + controlPoints.push(point); + } else if (keyframeIndex < points.length - 1) { + controlPoints.push(point); + controlPoints.push(point); + } else { + controlPoints.push(point); + } + } + } + return [ + ValueType.BEZIER_CURVE_PATH, + [ + bezierEasing, + points, + controlPoints + ] + ]; + } + return a; + } +} +function objectValueToNumber(o) { + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(o)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + o[key] = Number(o[key]); + } + return o; +} +function deleteEmptyValue(o) { + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(o)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + if (o[key] === undefined) { + delete o[key]; + } + } + return o; +} +var cos = Math.cos; +var sin = Math.sin; +var d2r = Math.PI / 180; +var r2d = 180 / Math.PI; +function quatFromXYZRotation(out, x, y, z) { + var c1 = cos(x * d2r / 2); + var c2 = cos(y * d2r / 2); + var c3 = cos(z * d2r / 2); + var s1 = sin(x * d2r / 2); + var s2 = sin(y * d2r / 2); + var s3 = sin(z * d2r / 2); + out[0] = s1 * c2 * c3 + c1 * s2 * s3; + out[1] = c1 * s2 * c3 - s1 * c2 * s3; + out[2] = c1 * c2 * s3 + s1 * s2 * c3; + out[3] = c1 * c2 * c3 - s1 * s2 * s3; + return out; +} +function clamp(v, min, max) { + return v > max ? max : v < min ? min : v; +} +function rotationZYXFromQuat(out, quat) { + var x = quat[0]; + var y = quat[1]; + var z = quat[2]; + var w = quat[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var m11 = 1 - yy - zz, m12 = yx - wz; + var m21 = yx + wz, m22 = 1 - xx - zz; + var m31 = zx - wy, m32 = zy + wx, m33 = 1 - xx - yy; + out[1] = Math.asin(clamp(-m31, -1, 1)) * r2d; + if (Math.abs(m31) < 0.9999999) { + out[0] = Math.atan2(m32, m33) * r2d; + out[2] = Math.atan2(m21, m11) * r2d; + } else { + out[0] = 0; + out[2] = Math.atan2(-m12, m22) * r2d; + } + return out; +} +/** + * 提取并转换 JSON 数据中的 anchor 值 + */ function convertAnchor(anchor, particleOrigin) { + if (anchor) { + return [ + anchor[0] - 0.5, + 0.5 - anchor[1] + ]; + } else if (particleOrigin) { + return particleOriginTranslateMap[particleOrigin]; + } else { + return [ + 0, + 0 + ]; + } +} +var _obj$5; +var particleOriginTranslateMap = (_obj$5 = {}, _obj$5[ParticleOrigin.PARTICLE_ORIGIN_CENTER] = [ + 0, + 0 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_CENTER_BOTTOM] = [ + 0, + -0.5 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_CENTER_TOP] = [ + 0, + 0.5 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_LEFT_TOP] = [ + -0.5, + 0.5 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_LEFT_CENTER] = [ + -0.5, + 0 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_LEFT_BOTTOM] = [ + -0.5, + -0.5 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_CENTER] = [ + 0.5, + 0 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_BOTTOM] = [ + 0.5, + -0.5 +], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_TOP] = [ + 0.5, + 0.5 +], _obj$5); +function getBezierCurveFromHermite(m0, m1, p0, p3) { + var xStart = p0[0]; + var yStart = p0[1]; + var xEnd = p3[0]; + var yEnd = p3[1]; + var dt = xEnd - xStart; + m0 = m0 * dt; + m1 = m1 * dt; + var bezierControlPoints = [ + [ + xStart + (xEnd - xStart) / 3, + yStart + m0 / 3 + ], + [ + xEnd - (xEnd - xStart) / 3, + yEnd - m1 / 3 + ] + ]; + return bezierControlPoints; +} +function getBezierCurveFromHermiteInGE(geHermiteCurves) { + var ymax = -1000000; + var ymin = 1000000; + for(var i = 0; i < geHermiteCurves.length; i++){ + ymax = Math.max(ymax, geHermiteCurves[i][1]); + ymin = Math.min(ymin, geHermiteCurves[i][1]); + } + var geBezierCurves = [ + [ + geHermiteCurves[0][0], + geHermiteCurves[0][1] + ] + ]; + for(var i1 = 0; i1 < geHermiteCurves.length - 1; i1++){ + var m0 = geHermiteCurves[i1][3] * (ymax - ymin); + var m1 = geHermiteCurves[i1 + 1][2] * (ymax - ymin); + var p0 = [ + geHermiteCurves[i1][0], + geHermiteCurves[i1][1] + ]; + var p3 = [ + geHermiteCurves[i1 + 1][0], + geHermiteCurves[i1 + 1][1] + ]; + if (p0[0] != p3[0]) { + var bezierControlPoints = getBezierCurveFromHermite(m0, m1, p0, p3); + var p1 = bezierControlPoints[0]; + var p2 = bezierControlPoints[1]; + geBezierCurves[geBezierCurves.length - 1].push(p1[0]); + geBezierCurves[geBezierCurves.length - 1].push(p1[1]); + geBezierCurves.push([ + p2[0], + p2[1], + p3[0], + p3[1] + ]); + } else { + geBezierCurves[geBezierCurves.length - 1].push(p3[0]); + geBezierCurves[geBezierCurves.length - 1].push(p3[1]); + } + } + // 添加关键帧类型 + return geBezierCurves.map(function(curve, index) { + return index === 0 ? [ + BezierKeyframeType.EASE_OUT, + curve + ] : index === geBezierCurves.length - 1 ? [ + BezierKeyframeType.EASE_IN, + curve + ] : [ + BezierKeyframeType.EASE, + curve + ]; + }); +} + +function getStandardCameraContent(model) { + var _model_transform; + var opt = model.options; + var ret = { + options: { + fov: opt.fov, + far: opt.far, + near: opt.near, + clipMode: opt.clipMode + } + }; + var velocityOverLifetime = model.velocityOverLifetime; + if (velocityOverLifetime || ((_model_transform = model.transform) == null ? void 0 : _model_transform.path)) { + var _model_transform1; + var positionOverLifetime = { + path: ensureFixedVec3((_model_transform1 = model.transform) == null ? void 0 : _model_transform1.path), + linearX: ensureFixedNumber(velocityOverLifetime == null ? void 0 : velocityOverLifetime.translateX), + linearY: ensureFixedNumber(velocityOverLifetime == null ? void 0 : velocityOverLifetime.translateY), + linearZ: ensureFixedNumber(velocityOverLifetime == null ? void 0 : velocityOverLifetime.translateZ) + }; + deleteEmptyValue(positionOverLifetime); + ret.positionOverLifetime = positionOverLifetime; + } + var rol = model.rotationOverLifetime; + if (rol) { + var rotationOverLifetime = { + separateAxes: rol.separateAxes, + x: ensureFixedNumber(rol == null ? void 0 : rol.rotateX), + y: ensureFixedNumber(rol == null ? void 0 : rol.rotateY), + z: rol.separateAxes ? ensureFixedNumber(rol == null ? void 0 : rol.rotateZ) : ensureFixedNumber(rol.rotation) + }; + deleteEmptyValue(rotationOverLifetime); + ret.rotationOverLifetime = rotationOverLifetime; + } + return ret; +} + +function getStandardInteractContent(ui) { + var options = ui.options; + var option; + switch(options.type){ + case "click": + { + option = { + type: InteractType.CLICK, + showPreview: options.showPreview, + previewColor: options.previewColor && ensureRGBAValue(options.previewColor), + behavior: options.behavior || InteractBehavior.NOTIFY + }; + break; + } + case "drag": + { + option = { + type: InteractType.DRAG, + enableInEditor: !!options.enableInEditor, + dxRange: options.dxRange, + dyRange: options.dyRange, + target: options.target + }; + break; + } + case "message": + { + option = { + type: InteractType.MESSAGE + }; + break; + } + } + var ret = { + // @ts-expect-error + options: option + }; + return ret; +} + +/** + * 2.1 以下版本数据适配(mars-player@2.4.0 及以上版本支持 2.1 以下数据的适配) + */ function version21Migration(json) { + json.compositions.forEach(function(composition) { + composition.items.forEach(function(item) { + if (item.type === ItemType.null) { + if (item.endBehavior === EndBehavior.destroy) { + item.endBehavior = EndBehavior.freeze; + } + } + }); + }); + json.version = JSONSceneVersion["2_1"]; + return json; +} +/** + * 2.2 以下版本数据适配(mars-player@2.5.0 及以上版本支持 2.2 以下数据的适配) + */ function version22Migration(json) { + var _json_version; + var singleVersion = (_json_version = json.version) == null ? void 0 : _json_version.split("."); + if (!singleVersion || Number(singleVersion[0]) > 2 || Number(singleVersion[0]) === 2 && Number(singleVersion[1]) >= 2) { + return json; + } + json.compositions.forEach(function(composition) { + composition.items.forEach(function(item) { + if (item.type === ItemType.mesh || item.type === ItemType.light) { + item.endBehavior = item.endBehavior === 1 ? EndBehavior.destroy : item.endBehavior; + } + }); + }); + return json; +} +var currentMaskComponent; +var componentMap = new Map(); +var itemMap = new Map(); +var refCompositions = new Map(); +/** + * 3.1 版本数据适配 + * - 富文本插件名称的适配 + */ function version31Migration(json) { + // Custom shape fill 属性位置迁移 + for(var _iterator = _create_for_of_iterator_helper_loose(json.components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + if (component.dataType === DataType.ShapeComponent) { + var shapeComponent = component; + if (shapeComponent.type === ShapePrimitiveType.Custom) { + var _customShapeComponent_shapes; + var customShapeComponent = shapeComponent; + //@ts-expect-error + if (((_customShapeComponent_shapes = customShapeComponent.shapes) == null ? void 0 : _customShapeComponent_shapes.length) > 0 && customShapeComponent.shapes[0].fill) { + // @ts-expect-error + customShapeComponent.fill = customShapeComponent.shapes[0].fill; + } + // easingIn 和 easingOut 绝对坐标转相对坐标 + var easingInFlag = new Array(customShapeComponent.easingIns.length); + var easingOutFlag = new Array(customShapeComponent.easingOuts.length).fill(false); + for(var _iterator1 = _create_for_of_iterator_helper_loose(customShapeComponent.shapes), _step1; !(_step1 = _iterator1()).done;){ + var shape = _step1.value; + for(var _iterator2 = _create_for_of_iterator_helper_loose(shape.indexes), _step2; !(_step2 = _iterator2()).done;){ + var index = _step2.value; + var point = customShapeComponent.points[index.point]; + var easingIn = customShapeComponent.easingIns[index.easingIn]; + var easingOut = customShapeComponent.easingOuts[index.easingOut]; + if (!easingInFlag[index.easingIn]) { + easingIn.x -= point.x; + easingIn.y -= point.y; + easingInFlag[index.easingIn] = true; + } + if (!easingOutFlag[index.easingOut]) { + easingOut.x -= point.x; + easingOut.y -= point.y; + easingOutFlag[index.easingOut] = true; + } + } + } + } + } + } + return json; +} +function version32Migration(json) { + componentMap.clear(); + itemMap.clear(); + refCompositions.clear(); + var compositions = json.compositions, items = json.items, components = json.components; + // 处理旧蒙版数据 + var mainComp = compositions[0]; + for(var _iterator = _create_for_of_iterator_helper_loose(components), _step; !(_step = _iterator()).done;){ + var component = _step.value; + componentMap.set(component.id, component); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(compositions), _step1; !(_step1 = _iterator1()).done;){ + var comp = _step1.value; + if (comp.id === json.compositionId) { + mainComp = comp; + } else { + refCompositions.set(comp.id, comp); + } + } + for(var _iterator2 = _create_for_of_iterator_helper_loose(items), _step2; !(_step2 = _iterator2()).done;){ + var item = _step2.value; + itemMap.set(item.id, item); + } + processContent(mainComp); + return json; +} +function version33Migration(json) { + var // 修正老版本数据中,富文本插件名称的问题 + _json_plugins; + (_json_plugins = json.plugins) == null ? void 0 : _json_plugins.forEach(function(plugin, index) { + if (plugin === "richtext") { + json.plugins[index] = "rich-text"; + } + }); + // 老 shape 数据兼容 + for(var _iterator = _create_for_of_iterator_helper_loose(json.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + if (item.type === ItemType.sprite) { + var spriteComponent = componentMap.get(item.components[0].id); + if (spriteComponent) { + var shape = spriteComponent.renderer.shape; + var shapeData = void 0; + if (Number.isInteger(shape)) { + shapeData = json.shapes[shape]; + } else { + shapeData = shape; + } + spriteComponent.renderer.shape = shapeData; + } + } + } + // Composition id 转 guid, Composition 分离 CompositionComponent + var compositionId = json.compositionId; + var compositionIdToGUIDMap = {}; + for(var _iterator1 = _create_for_of_iterator_helper_loose(json.compositions), _step1; !(_step1 = _iterator1()).done;){ + var composition = _step1.value; + var guid = generateGUID(); + compositionIdToGUIDMap[composition.id] = guid; + if (composition.id === compositionId) { + json.compositionId = guid; + } + composition.id = guid; + var compositionComponent = { + id: generateGUID(), + dataType: "CompositionComponent", + items: composition.items, + timelineAsset: composition.timelineAsset, + sceneBindings: composition.sceneBindings, + startTime: composition.startTime + }; + //@ts-expect-error + composition.timelineAsset = undefined; + //@ts-expect-error + composition.sceneBindings = undefined; + composition.startTime = undefined; + //@ts-expect-error + composition.components = [ + { + id: compositionComponent.id + } + ]; + json.components.push(compositionComponent); + } + // 预合成元素 refId 同步改为生成的合成 guid + for(var _iterator2 = _create_for_of_iterator_helper_loose(json.items), _step2; !(_step2 = _iterator2()).done;){ + var item1 = _step2.value; + if (item1.content) { + var compositionOptions = item1.content.options; + if (compositionOptions && compositionOptions.refId !== undefined) { + compositionOptions.refId = compositionIdToGUIDMap[compositionOptions.refId]; + } + } + } + return json; +} +function processContent(composition) { + for(var _iterator = _create_for_of_iterator_helper_loose(composition.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + var itemProps = itemMap.get(item.id); + if (!itemProps) { + return; + } + if (itemProps.type === ItemType.sprite || itemProps.type === ItemType.particle || itemProps.type === ItemType.spine || itemProps.type === ItemType.text || itemProps.type === ItemType.richtext || itemProps.type === ItemType.video || itemProps.type === ItemType.shape) { + var component = componentMap.get(itemProps.components[0].id); + if (component) { + processMask(component); + } + } + // 处理预合成的渲染顺序 + if (itemProps.type === ItemType.composition) { + var refId = itemProps.content.options.refId; + var comp = refCompositions.get(refId); + comp && processContent(comp); + } + } +} +function processMask(renderContent) { + var renderer = renderContent.renderer; + var maskMode = renderer == null ? void 0 : renderer.maskMode; + if (!maskMode || maskMode === exports.MaskMode.NONE) { + return; + } + if (maskMode === exports.MaskMode.MASK) { + renderContent.mask = { + mask: true + }; + currentMaskComponent = renderContent.id; + } else if (maskMode === ObscuredMode.OBSCURED || maskMode === ObscuredMode.REVERSE_OBSCURED) { + renderContent.mask = { + mode: maskMode, + ref: { + "id": currentMaskComponent + } + }; + } +} +/** + * 3.0 以下版本数据适配(runtime 2.0及以上版本支持) + */ function version30Migration(json) { + var _loop = function() { + var composition = _step1.value; + // composition 的 endBehavior 兼容 + if (// @ts-expect-error + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + composition.endBehavior === END_BEHAVIOR_PAUSE_AND_DESTROY || // @ts-expect-error + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison + composition.endBehavior === END_BEHAVIOR_PAUSE) { + composition.endBehavior = EndBehavior.freeze; + } + // 过滤掉滤镜元素 + composition.items = composition.items.filter(function(item) { + return item.type !== "8"; + }); + // 过滤掉粒子滤镜(扭曲) + composition.items.forEach(function(item) { + if (item.type === ItemType.particle) { + // @ts-expect-error + var filterData = item.content["filter"]; + if (filterData) { + // @ts-expect-error + delete item.content["filter"]; + } + } + }); + for(var _iterator = _create_for_of_iterator_helper_loose(composition.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + itemOldIdToGuidMap[item.id] = generateGUID(); + // TODO: 编辑器测试用,上线后删除 + //@ts-expect-error + item.oldId = item.id; + item.id = itemOldIdToGuidMap[item.id]; + guidToItemMap[item.id] = item; + } + composition.items.forEach(function(item, index) { + if (item.parentId) { + if (item.parentId.includes("^")) { + var parentId = item.parentId.split("^")[0]; + var nodeId = item.parentId.split("^")[1]; + item.parentId = itemOldIdToGuidMap[parentId] + "^" + nodeId; + } else { + item.parentId = itemOldIdToGuidMap[item.parentId]; + } + } + // @ts-expect-error fix item type + result.items.push(item); + // @ts-expect-error fix item type + composition.items[index] = { + id: item.id + }; + }); + var compositionData = _extends({}, composition, { + timelineAsset: { + id: "" + }, + sceneBindings: [] + }); + result.compositions.push(compositionData); + // 生成时间轴数据 + convertTimelineAsset(compositionData, guidToItemMap, result); + }; + var // 兼容老版本数据中不存在textures的情况 + _result; + var result = _extends({}, json, { + items: [], + compositions: [], + components: [], + materials: [], + shaders: [], + geometries: [], + animations: [], + miscs: [] + }); + // image数据添加 guid + for(var _iterator = _create_for_of_iterator_helper_loose(result.images), _step; !(_step = _iterator()).done;){ + var image = _step.value; + image.id = generateGUID(); + } + var _textures; + (_textures = (_result = result).textures) != null ? _textures : _result.textures = []; + result.textures.forEach(function(textureOptions) { + var _result_images_textureOptions_source; + textureOptions.id = generateGUID(); + textureOptions.dataType = DataType.Texture; + // @ts-expect-error + textureOptions.source = { + id: (_result_images_textureOptions_source = result.images[textureOptions.source]) == null ? void 0 : _result_images_textureOptions_source.id + }; + }); + if (result.textures.length < result.images.length) { + for(var i = result.textures.length; i < result.images.length; i++){ + result.textures.push({ + id: generateGUID(), + dataType: DataType.Texture, + //@ts-expect-error + source: { + id: result.images[i].id + }, + flipY: true + }); + } + } + // 处理老版本数据中 bins 没有 id 的情况 + if (json.bins) { + convertBinaryAsset(json.bins, result); + } + var itemOldIdToGuidMap = {}; + var guidToItemMap = {}; + // 更正Composition.endBehavior + for(var _iterator1 = _create_for_of_iterator_helper_loose(json.compositions), _step1; !(_step1 = _iterator1()).done;)_loop(); + for(var _iterator2 = _create_for_of_iterator_helper_loose(result.items), _step2; !(_step2 = _iterator2()).done;){ + var item = _step2.value; + // 原 texture 索引转为统一 guid 索引 + if (item.content) { + if (item.content.renderer) { + if (item.content.renderer.texture !== undefined) { + var oldTextureId = item.content.renderer.texture; + item.content.renderer.texture = { + id: result.textures[oldTextureId].id + }; + } + } + if (item.content.trails) { + if (item.content.trails.texture !== undefined) { + var oldTextureId1 = item.content.trails.texture; + item.content.trails.texture = { + id: result.textures[oldTextureId1].id + }; + } + } + } + // item 的 transform 属性由数组转为 {x:n, y:n, z:n} + if (item.transform) { + var _item_transform_position; + //@ts-expect-error + var position = [].concat((_item_transform_position = item.transform.position) != null ? _item_transform_position : [ + 0, + 0, + 0 + ]); + var _item_transform_rotation; + //@ts-expect-error + var rotation = [].concat((_item_transform_rotation = item.transform.rotation) != null ? _item_transform_rotation : [ + 0, + 0, + 0 + ]); + var _item_transform_scale; + //@ts-expect-error + var scale = [].concat((_item_transform_scale = item.transform.scale) != null ? _item_transform_scale : [ + 1, + 1, + 1 + ]); + Object.assign(item, { + transform: { + position: { + x: position[0], + y: position[1], + z: position[2] + }, + eulerHint: { + x: rotation[0], + y: rotation[1], + z: rotation[2] + }, + scale: { + x: scale[0], + y: scale[1], + z: scale[0] + } + } + }); + // sprite 的 scale 转为 size + if (item.type === ItemType.sprite) { + item.transform.size = { + x: scale[0], + y: scale[1] + }; + item.transform.scale = { + x: 1, + y: 1, + z: 1 + }; + } + // sprite 的 anchor 修正 + if (item.type === ItemType.sprite) { + var content = item.content; + if (!content.renderer) { + content.renderer = {}; + } + var renderer = content.renderer; + var realAnchor = convertAnchor(renderer.anchor, renderer.particleOrigin); + var startSize = item.transform.size; + // 兼容旧JSON(anchor和particleOrigin可能同时存在) + if (!renderer.anchor && renderer.particleOrigin !== undefined) { + var _startSize_x; + item.transform.position.x += -realAnchor[0] * ((_startSize_x = startSize == null ? void 0 : startSize.x) != null ? _startSize_x : 1); + var _startSize_y; + item.transform.position.y += -realAnchor[1] * ((_startSize_y = startSize == null ? void 0 : startSize.y) != null ? _startSize_y : 1); + } + var _startSize_x1, _startSize_y1; + item.transform.anchor = { + x: realAnchor[0] * ((_startSize_x1 = startSize == null ? void 0 : startSize.x) != null ? _startSize_x1 : 1), + y: realAnchor[1] * ((_startSize_y1 = startSize == null ? void 0 : startSize.y) != null ? _startSize_y1 : 1) + }; + } + } + if (item.type === ItemType.particle) { + var content1 = item.content; + if (!content1.renderer) { + content1.renderer = {}; + } + var renderer1 = content1.renderer; + content1.renderer.anchor = convertAnchor(renderer1.anchor, renderer1.particleOrigin); + } + // 修复相机K帧缺失 asMovement 参数 + if (item.type === ItemType.camera && item.content.positionOverLifetime && Object.keys(item.content.positionOverLifetime).length !== 0) { + item.content.positionOverLifetime.asMovement = true; + } + // 修正老 json 的 item.pluginName + if (item.pn !== undefined) { + var pn = item.pn; + var _json_plugins = json.plugins, plugins = _json_plugins === void 0 ? [] : _json_plugins; + if (pn !== undefined && Number.isInteger(pn)) { + item.pluginName = plugins[pn]; + } + } + // 修正老 json 的 item.type + if (item.pluginName === "editor-gizmo") { + //@ts-expect-error + item.type = "editor-gizmo"; + } + if (item.pluginName === "orientation-transformer") { + //@ts-expect-error + item.type = "orientation-transformer"; + } + // gizmo 的 target id 转换为新的 item guid + if (item.content.options.target && item.pluginName === "editor-gizmo") { + item.content.options.target = itemOldIdToGuidMap[item.content.options.target]; + } + // Spine 元素转为 guid 索引 + if (item.type === ItemType.spine && json.spines && json.spines.length !== 0) { + convertSpineData(json.spines[item.content.options.spine], item.content, result); + } + // item 的 content 转为 component data 加入 JSONScene.components + if (item.type === ItemType.sprite || item.type === ItemType.particle || item.type === ItemType.mesh || item.type === ItemType.skybox || item.type === ItemType.light || item.type === "camera" || item.type === ItemType.tree || item.type === ItemType.interact || item.type === ItemType.camera || item.type === ItemType.text || item.type === ItemType.spine || item.type === "editor-gizmo" || item.type === "orientation-transformer") { + item.components = []; + result.components.push(item.content); + item.content.id = generateGUID(); + item.content.item = { + id: item.id + }; + item.dataType = DataType.VFXItemData; + item.components.push({ + id: item.content.id + }); + } + if (item.type === ItemType.null || item.type === ItemType.composition) { + item.components = []; + item.dataType = DataType.VFXItemData; + } + switch(item.type){ + case ItemType.sprite: + item.content.dataType = DataType.SpriteComponent; + break; + case ItemType.particle: + item.content.dataType = DataType.ParticleSystem; + break; + case ItemType.mesh: + item.content.dataType = DataType.MeshComponent; + break; + case ItemType.skybox: + item.content.dataType = DataType.SkyboxComponent; + break; + case ItemType.light: + item.content.dataType = DataType.LightComponent; + break; + case "camera": + item.content.dataType = DataType.CameraComponent; + break; + case "editor-gizmo": + item.content.dataType = "GizmoComponent"; + break; + case "orientation-transformer": + item.content.dataType = "OrientationComponent"; + break; + case ItemType.tree: + item.content.dataType = DataType.TreeComponent; + break; + case ItemType.interact: + item.content.dataType = DataType.InteractComponent; + break; + case ItemType.camera: + item.content.dataType = DataType.CameraController; + break; + case ItemType.text: + item.content.dataType = DataType.TextComponent; + break; + case ItemType.spine: + item.content.dataType = DataType.SpineComponent; + break; + } + } + result.version = JSONSceneVersion["3_0"]; + return result; +} +/** + * 2.5 以下版本 赫尔米特数据转换成贝塞尔数据 + */ function version24Migration(json) { + // 曲线转换成贝塞尔 + json.compositions.map(function(comp) { + for(var _iterator = _create_for_of_iterator_helper_loose(comp.items), _step; !(_step = _iterator()).done;){ + var item = _step.value; + convertParam(item.content); + } + }); + return json; +} +function convertParam(content) { + if (!content) { + return; + } + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(content)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + var value = content[key]; + var isArray = Array.isArray(value); + if (isArray && value.length === 2 && Array.isArray(value[1])) { + if (key === "path") { + content[key] = ensureFixedVec3(value); + } else { + content[key] = ensureFixedNumber(value); + } + } else if (!isArray && typeof value === "object") { + convertParam(value); + } + } +} +function convertTimelineAsset(composition, guidToItemMap, jsonScene) { + var sceneBindings = []; + var trackDatas = []; + var playableAssetDatas = []; + var timelineAssetData = { + tracks: [], + id: generateGUID(), + //@ts-expect-error + dataType: "TimelineAsset" + }; + for(var _iterator = _create_for_of_iterator_helper_loose(composition.items), _step; !(_step = _iterator()).done;){ + var itemDataPath = _step.value; + var item = guidToItemMap[itemDataPath.id]; + var subTrackDatas = []; + var newActivationPlayableAsset = { + id: generateGUID(), + dataType: "ActivationPlayableAsset" + }; + playableAssetDatas.push(newActivationPlayableAsset); + var newActivationTrackData = { + id: generateGUID(), + dataType: "ActivationTrack", + children: [], + clips: [ + { + start: item.delay, + duration: item.duration, + endBehavior: item.endBehavior, + asset: { + id: newActivationPlayableAsset.id + } + } + ] + }; + subTrackDatas.push({ + id: newActivationTrackData.id + }); + trackDatas.push(newActivationTrackData); + if (item.type !== ItemType.particle) { + var newTransformPlayableAssetData = { + id: generateGUID(), + dataType: "TransformPlayableAsset", + //@ts-expect-error + sizeOverLifetime: item.content.sizeOverLifetime, + //@ts-expect-error + rotationOverLifetime: item.content.rotationOverLifetime, + //@ts-expect-error + positionOverLifetime: item.content.positionOverLifetime + }; + playableAssetDatas.push(newTransformPlayableAssetData); + var newTrackData = { + id: generateGUID(), + dataType: "TransformTrack", + children: [], + clips: [ + { + start: item.delay, + duration: item.duration, + endBehavior: item.endBehavior, + asset: { + id: newTransformPlayableAssetData.id + } + } + ] + }; + subTrackDatas.push({ + id: newTrackData.id + }); + trackDatas.push(newTrackData); + } + if (item.type === ItemType.sprite || item.type === ItemType.text) { + var newSpriteColorPlayableAssetData = { + id: generateGUID(), + dataType: "SpriteColorPlayableAsset", + colorOverLifetime: item.content.colorOverLifetime + }; + playableAssetDatas.push(newSpriteColorPlayableAssetData); + var newTrackData1 = { + id: generateGUID(), + dataType: "SpriteColorTrack", + children: [], + clips: [ + { + start: item.delay, + duration: item.duration, + endBehavior: item.endBehavior, + asset: { + id: newSpriteColorPlayableAssetData.id + } + } + ] + }; + subTrackDatas.push({ + id: newTrackData1.id + }); + trackDatas.push(newTrackData1); + } + if (item.type === ItemType.composition) { + var newSubCompositionPlayableAssetData = { + id: generateGUID(), + dataType: "SubCompositionPlayableAsset" + }; + playableAssetDatas.push(newSubCompositionPlayableAssetData); + var newTrackData2 = { + id: generateGUID(), + dataType: "SubCompositionTrack", + children: [], + clips: [ + { + start: item.delay, + duration: item.duration, + endBehavior: item.endBehavior, + asset: { + id: newSubCompositionPlayableAssetData.id + } + } + ] + }; + subTrackDatas.push({ + id: newTrackData2.id + }); + trackDatas.push(newTrackData2); + } + var bindingTrackData = { + id: generateGUID(), + dataType: "ObjectBindingTrack", + children: subTrackDatas, + clips: [] + }; + trackDatas.push(bindingTrackData); + timelineAssetData.tracks.push({ + id: bindingTrackData.id + }); + sceneBindings.push({ + key: { + id: bindingTrackData.id + }, + value: { + id: item.id + } + }); + } + var trackIds = []; + for(var _iterator1 = _create_for_of_iterator_helper_loose(trackDatas), _step1; !(_step1 = _iterator1()).done;){ + var trackData = _step1.value; + trackIds.push({ + id: trackData.id + }); + } + composition.timelineAsset = { + id: timelineAssetData.id + }; + composition.sceneBindings = sceneBindings; + jsonScene.miscs.push(timelineAssetData); + for(var _iterator2 = _create_for_of_iterator_helper_loose(trackDatas), _step2; !(_step2 = _iterator2()).done;){ + var trackData1 = _step2.value; + //@ts-expect-error + jsonScene.miscs.push(trackData1); + } + for(var _iterator3 = _create_for_of_iterator_helper_loose(playableAssetDatas), _step3; !(_step3 = _iterator3()).done;){ + var playableAsset = _step3.value; + //@ts-expect-error + jsonScene.miscs.push(playableAsset); + } +} +function convertBinaryAsset(bins, jsonScene) { + //@ts-expect-error + jsonScene.bins = bins.map(function(bin) { + return { + url: bin.url, + "dataType": "BinaryAsset", + id: generateGUID() + }; + }); +} +function convertSpineData(resource, content, jsonScene) { + //@ts-expect-error + content.resource = { + "atlas": { + "bins": { + //@ts-expect-error + "id": jsonScene.bins[resource.atlas[1][0]].id + }, + "source": resource.atlas[1].slice(1) + }, + "skeleton": { + "bins": { + //@ts-expect-error + "id": jsonScene.bins[resource.skeleton[1][0]].id + }, + "source": resource.skeleton[1].slice(1) + }, + "skeletonType": resource.skeletonType, + "images": resource.images.map(function(i) { + return { + //@ts-expect-error + id: jsonScene.textures[i].id + }; + }) + }; +} + +function getStandardParticleContent(particle) { + var options = particle.options; + var transform = particle.transform; + var shape = { + type: ParticleEmitterShapeType.NONE + }; + if (particle.shape) { + var _particle_shape_shape; + var shapeType = (_particle_shape_shape = particle.shape.shape) == null ? void 0 : _particle_shape_shape.replace(/([A-Z])/g, "_$1").toUpperCase().replace(/^_/, ""); + shape = _extends({}, particle.shape, { + type: ParticleEmitterShapeType[shapeType] + }); + if (particle.shape.upDirection) { + var _particle_shape_upDirection = particle.shape.upDirection, x = _particle_shape_upDirection[0], y = _particle_shape_upDirection[1], z = _particle_shape_upDirection[2]; + if (x === 0 && y === 0 && z === 0) { + delete shape.upDirection; + } + } + } + if (options.startTurbulence) { + shape.turbulenceX = ensureNumberExpression(options.turbulenceX); + shape.turbulenceY = ensureNumberExpression(options.turbulenceY); + shape.turbulenceZ = ensureNumberExpression(options.turbulenceZ); + } + var emission = particle.emission; + if (emission.bursts && emission.bursts.length > 0) { + emission.bursts = emission.bursts.map(function(b) { + return objectValueToNumber(b); + }); + } + if (emission.burstOffsets && emission.burstOffsets.length > 0) { + emission.burstOffsets = emission.burstOffsets.map(function(b) { + return objectValueToNumber(b); + }); + } + if (emission.rateOverTime) { + emission.rateOverTime = ensureNumberExpression(emission.rateOverTime); + } + var ret = { + renderer: particle.renderer, + shape: shape, + splits: particle.splits, + emission: emission, + options: { + startLifetime: ensureNumberExpression(options.startLifetime), + start3DSize: !!options.start3DSize, + startSize: ensureNumberExpression(options.startSize), + startSizeX: ensureNumberExpression(options.startSizeX), + startSizeY: ensureNumberExpression(options.startSizeY), + sizeAspect: ensureNumberExpression(options.sizeAspect), + maxCount: options.maxCount, + startDelay: ensureNumberExpression(options.startDelay), + startColor: ensureColorExpression(options.startColor, true), + startRotationZ: ensureNumberExpression(options.startRotation || options.startRotationZ), + particleFollowParent: options.particleFollowParent + } + }; + if (options.start3DRotation) { + ret.options.startRotationX = ensureNumberExpression(options.startRotationX); + ret.options.startRotationY = ensureNumberExpression(options.startRotationY); + } + if (transform && transform.path) { + ret.emitterTransform = { + path: ensureFixedVec3(transform.path) + }; + } + var sizeOverLifetime = particle.sizeOverLifetime; + if (sizeOverLifetime) { + if (sizeOverLifetime.separateAxes) { + ret.sizeOverLifetime = { + separateAxes: true, + x: ensureNumberExpression(sizeOverLifetime.x), + y: ensureNumberExpression(sizeOverLifetime.y) + }; + } else { + ret.sizeOverLifetime = { + size: ensureNumberExpression(sizeOverLifetime.size) + }; + } + } + var velocityOverLifetime = particle.velocityOverLifetime || {}; + var sol = velocityOverLifetime.speedOverLifetime; + if (sol) { + sol = ensureFixedNumber(sol); + } else { + sol = undefined; + } + ret.positionOverLifetime = { + gravity: options.gravity, + gravityOverLifetime: ensureFixedNumber(options.gravityModifier), + startSpeed: ensureNumberExpression(options.startSpeed), + speedOverLifetime: sol, + asMovement: velocityOverLifetime.asMovement, + linearX: ensureNumberExpression(velocityOverLifetime.linearX), + linearY: ensureNumberExpression(velocityOverLifetime.linearY), + linearZ: ensureNumberExpression(velocityOverLifetime.linearZ), + asRotation: velocityOverLifetime.asRotation, + orbCenter: velocityOverLifetime.orbCenter, + orbitalX: ensureNumberExpression(velocityOverLifetime.orbitalX), + orbitalY: ensureNumberExpression(velocityOverLifetime.orbitalY), + orbitalZ: ensureNumberExpression(velocityOverLifetime.orbitalZ), + forceTarget: velocityOverLifetime.forceTarget, + target: velocityOverLifetime.target, + forceCurve: ensureFixedNumber(velocityOverLifetime.forceCurve) + }; + deleteEmptyValue(ret.positionOverLifetime); + var rotationOverLifetime = particle.rotationOverLifetime; + if (rotationOverLifetime) { + ret.rotationOverLifetime = { + separateAxes: rotationOverLifetime.separateAxes, + asRotation: rotationOverLifetime.asRotation, + z: ensureNumberExpression(rotationOverLifetime.separateAxes ? rotationOverLifetime.z : rotationOverLifetime.angularVelocity) + }; + if (rotationOverLifetime.separateAxes) { + ret.rotationOverLifetime.y = ensureFixedNumber(rotationOverLifetime.y); + ret.rotationOverLifetime.x = ensureFixedNumber(rotationOverLifetime.x); + } + } + var colorOverLifetime = particle.colorOverLifetime; + if (colorOverLifetime) { + var col = ret.colorOverLifetime = { + opacity: ensureFixedNumber(colorOverLifetime.opacity) + }; + if (colorOverLifetime.color) { + col.color = getGradientColor(colorOverLifetime.color); + } + } + var textureSheetAnimation = particle.textureSheetAnimation; + if (textureSheetAnimation) { + ret.textureSheetAnimation = { + row: textureSheetAnimation.row, + col: textureSheetAnimation.col, + total: textureSheetAnimation.total, + animate: textureSheetAnimation.animate, + cycles: ensureFixedNumber(textureSheetAnimation.cycles), + animationDelay: ensureFixedNumberWithRandom(textureSheetAnimation.animationDelay, 0), + animationDuration: ensureFixedNumberWithRandom(textureSheetAnimation.animationDuration, 0) + }; + } + var trials = particle.trails; + if (trials) { + ret.trails = { + lifetime: ensureNumberExpression(trials.lifetime), + dieWithParticles: trials.dieWithParticles, + maxPointPerTrail: trials.maxPointPerTrail, + minimumVertexDistance: trials.minimumVertexDistance, + widthOverTrail: ensureFixedNumber(trials.widthOverTrail), + colorOverTrail: trials.colorOverTrail && getGradientColor(trials.colorOverTrail, false), + blending: trials.blending, + colorOverLifetime: trials.colorOverLifetime && getGradientColor(trials.colorOverLifetime, false), + inheritParticleColor: trials.inheritParticleColor, + occlusion: trials.occlusion, + transparentOcclusion: trials.transparentOcclusion, + orderOffset: trials.orderOffset, + sizeAffectsLifetime: trials.sizeAffectsLifetime, + sizeAffectsWidth: trials.sizeAffectsWidth, + texture: trials.texture, + parentAffectsPosition: trials.parentAffectsPosition, + opacityOverLifetime: ensureNumberExpression(trials.opacityOverLifetime) + }; + } + ret.trails && deleteEmptyValue(ret.trails); + var interaction = particle.interaction; + if (interaction) { + ret.interaction = { + behavior: interaction.behavior, + radius: interaction.radius, + multiple: interaction.multiple + }; + } + return ret; +} + +function getStandardNullContent(sprite, transform) { + var _sprite_transform; + var opt = sprite.options; + var velocityOverLifetime = sprite.velocityOverLifetime || {}; + var positionOverLifetime = { + path: ensureFixedVec3((_sprite_transform = sprite.transform) == null ? void 0 : _sprite_transform.path), + gravity: opt.gravity, + gravityOverLifetime: ensureFixedNumber(opt.gravityModifier), + direction: opt.direction, + startSpeed: opt.startSpeed, + asMovement: velocityOverLifetime.asMovement, + linearX: ensureFixedNumber(velocityOverLifetime.linearX), + linearY: ensureFixedNumber(velocityOverLifetime.linearY), + linearZ: ensureFixedNumber(velocityOverLifetime.linearZ), + asRotation: velocityOverLifetime.asRotation, + orbCenter: velocityOverLifetime.orbCenter, + orbitalX: ensureFixedNumber(velocityOverLifetime.orbitalX), + orbitalY: ensureFixedNumber(velocityOverLifetime.orbitalY), + orbitalZ: ensureFixedNumber(velocityOverLifetime.orbitalZ), + speedOverLifetime: ensureFixedNumber(velocityOverLifetime.speedOverLifetime) + }; + deleteEmptyValue(positionOverLifetime); + var ret = { + options: { + startColor: ensureRGBAValue(opt.startColor) + }, + positionOverLifetime: positionOverLifetime + }; + if (opt.startSize) { + transform.scale = [ + opt.startSize, + opt.startSize / (opt.sizeAspect || 1), + 1 + ]; + } + if (opt.startRotation) { + if (!transform.rotation) { + transform.rotation = [ + 0, + 0, + opt.startRotation + ]; + } else { + transform.rotation[2] += opt.startRotation; + } + } + var rotationOverLifetime = sprite.rotationOverLifetime; + if (rotationOverLifetime) { + var rot = ret.rotationOverLifetime = { + separateAxes: rotationOverLifetime.separateAxes, + asRotation: rotationOverLifetime.asRotation + }; + if (rot.separateAxes) { + rot.x = ensureFixedNumber(rotationOverLifetime.x); + rot.y = ensureFixedNumber(rotationOverLifetime.y); + rot.z = ensureFixedNumber(rotationOverLifetime.z); + } else { + rot.z = ensureFixedNumber(rotationOverLifetime.angularVelocity); + } + } + var colorOverLifetime = sprite.colorOverLifetime; + if (colorOverLifetime) { + var col = ret.colorOverLifetime = { + opacity: ensureFixedNumber(colorOverLifetime.opacity) + }; + if (colorOverLifetime.color) { + col.color = getGradientColor(colorOverLifetime.color); + } + } + var sizeOverLifetime = sprite.sizeOverLifetime; + if (sizeOverLifetime) { + ret.sizeOverLifetime = { + separateAxes: sizeOverLifetime.separateAxes, + size: ensureFixedNumber(sizeOverLifetime.size), + x: ensureFixedNumber(sizeOverLifetime.x), + y: ensureFixedNumber(sizeOverLifetime.y), + z: ensureFixedNumber(sizeOverLifetime.z) + }; + } + return ret; +} +function getStandardSpriteContent(sprite, transform) { + var ret = getStandardNullContent(sprite, transform); + var texAni = sprite.textureSheetAnimation; + if (texAni) { + ret.textureSheetAnimation = { + row: texAni.row, + col: texAni.col, + total: texAni.total || undefined, + animate: texAni.animate + }; + } + ret.renderer = sprite.renderer; + if (sprite.splits) { + ret.splits = sprite.splits; + } + if (sprite.interaction) { + ret.interaction = sprite.interaction; + } + return ret; +} + +var v0 = /^(\d+)\.(\d+)\.(\d+)(-(\w+)\.\d+)?$/; +var standardVersion = /^(\d+)\.(\d+)$/; +var reverseParticle = false; +function getStandardJSON(json) { + if (!json || typeof json !== "object") { + throw new Error("Invalid input: Expected a JSON object."); + } + // 修正老版本数据中,meshItem 以及 lightItem 结束行为错误问题 + version22Migration(json); + if (v0.test(json.version)) { + var _exec; + reverseParticle = ((_exec = /^(\d+)/.exec(json.version)) == null ? void 0 : _exec[0]) === "0"; + return version33Migration(version32Migration(version31Migration(version30Migration(version21Migration(getStandardJSONFromV0(json)))))); + } + reverseParticle = false; + var vs = standardVersion.exec(json.version) || []; + var mainVersion = Number(vs[1]); + var minorVersion = Number(vs[2]); + if (mainVersion) { + if (mainVersion < 2 || mainVersion === 2 && minorVersion < 4) { + json = version24Migration(json); + } + if (mainVersion < 3) { + json = version30Migration(version21Migration(json)); + } + // 版本号重新计算 + vs = standardVersion.exec(json.version) || []; + mainVersion = Number(vs[1]); + minorVersion = Number(vs[2]); + // 3.x 版本格式转换 + if (mainVersion < 4) { + if (minorVersion < 2) { + json = version31Migration(json); + } + if (minorVersion < 3) { + json = version32Migration(json); + } + if (minorVersion < 4) { + json = version33Migration(json); + } + } + return json; + } + throw new Error("Invalid JSON version: " + json.version + "."); +} +var currentVersion = JSONSceneVersion["1_0"]; +function getStandardJSONFromV0(json) { + var _json_bins; + currentVersion = JSONSceneVersion["1_0"]; + var plugins = json.plugins || []; + if ((_json_bins = json.bins) == null ? void 0 : _json_bins.length) { + currentVersion = JSONSceneVersion["1_3"]; + } + var requires = (json.requires || []).slice(); + var images = json.images.map(function(img, index) { + return getStandardImage(img, index, json.imageTags || []); + }); + var textures = json.textures || images.map(function(img, i) { + return { + source: i, + flipY: true + }; + }); + var _json_playerVersion; + var ret = { + plugins: plugins, + shapes: json.shapes || [], + type: "ge", + version: currentVersion, + playerVersion: (_json_playerVersion = json.playerVersion) != null ? _json_playerVersion : { + web: "", + native: "" + }, + compositionId: json.compositionId + "", + compositions: json.compositions.map(function(comp) { + return getStandardComposition(comp, { + plugins: plugins, + requires: requires + }); + }), + images: images, + imgUsage: json._imgs, + binUsage: json.binUsage, + spines: json.spines, + requires: json.requires, + textures: textures, + bins: (json.bins || []).slice() + }; + if (json._textures) { + ret._textures = json._textures; + } + return ret; +} +function getStandardImage(image, index, imageTags) { + var renderLevel = imageTags[index]; + if (typeof image === "string") { + return { + id: generateGUID(), + renderLevel: renderLevel, + url: image + }; + } else if (image.template) { + return { + id: generateGUID(), + url: image.url, + template: image.template, + webp: image.webp, + renderLevel: renderLevel + }; + } else if (image.compressed) { + return { + id: generateGUID(), + url: image.url, + compressed: { + astc: image.compressed.android, + pvrtc: image.compressed.iOS + }, + webp: image.webp, + renderLevel: renderLevel + }; + } else if (image.url) { + return { + id: generateGUID(), + url: image.url, + webp: image.webp, + renderLevel: renderLevel + }; + } else if (image && image.sourceType) { + return image; + } + throw new Error("Invalid image type."); +} +function getStandardComposition(composition, opt) { + if (opt === void 0) opt = {}; + var _composition_meta; + var ret = { + id: composition.id + "", + camera: _extends({ + clipMode: CAMERA_CLIP_MODE_NORMAL + }, composition.camera), + duration: composition.duration, + endBehavior: composition.endBehavior, + items: composition.items.map(function(item) { + return getStandardItem(item, opt); + }), + name: composition.name + }; + var startTime = composition.startTime || composition.st; + if (startTime) { + ret.startTime = startTime; + } + var previewSize = (_composition_meta = composition.meta) == null ? void 0 : _composition_meta.previewSize; + if (previewSize && previewSize[0] === previewSize[1] && previewSize[0] === 0) { + previewSize = undefined; + } + if (previewSize) { + ret.previewSize = previewSize; + } + return ret; +} +var tempQuat = [ + 0, + 0, + 0, + 1 +]; +var stdAnchor = 0.5; +function getStandardItem(item, opt) { + if (opt === void 0) opt = {}; + var _content_renderer; + var type = ItemType.base; + var transform; + var originContent; + var content; + var endBehavior = item.endBehavior; + var renderLevel; + var pluginName; + var duration = NaN; + var pn; + if (item.content) { + type = item.type || ItemType.plugin; + pn = item.pn; + pluginName = item.pluginName; + content = item.content; + originContent = item.content; + if (isNaN(pn) && !pluginName) { + pluginName = content.options.type; + } + if (item.duration) { + duration = item.duration; + } + transform = item.transform || getTransform(originContent.transform); + } else if (item.particle) { + type = ItemType.particle; + originContent = item.particle; + transform = getTransform(originContent.transform, reverseParticle, true); + content = getStandardParticleContent(originContent); + } else if (item.sprite) { + type = ItemType.sprite; + originContent = item.sprite; + transform = getTransform(originContent.transform, false, true); + content = getStandardSpriteContent(originContent, transform); + } else if (item.cal) { + type = ItemType.null; + originContent = item.cal; + transform = getTransform(originContent.transform, false, true); + content = getStandardNullContent(originContent, transform); + } else if (item.ui) { + type = ItemType.interact; + originContent = item.ui; + transform = getTransform(originContent.transform); + content = getStandardInteractContent(originContent); + transform.scale = [ + originContent.options.width || 1, + originContent.options.height || 1, + 1 + ]; + } else if (item.model) { + originContent = item.model; + if (item.model.options.type === 1) { + type = ItemType.camera; + transform = getTransform(originContent.transform); + content = getStandardCameraContent(originContent); + } + } + if ((_content_renderer = content.renderer) == null ? void 0 : _content_renderer.anchor) { + var anchor = new Float32Array(content.renderer.anchor); + if (anchor[0] == stdAnchor && anchor[1] == stdAnchor) { + delete content.renderer.anchor; + } else if (opt.requires) { + arrAdd(opt.requires, "anchor"); + } + } + if (originContent) { + var _originContent_options; + var looping = (_originContent_options = originContent.options) == null ? void 0 : _originContent_options.looping; + if (looping) { + if (Array.isArray(looping)) { + endBehavior = looping[1] ? EndBehavior.restart : EndBehavior.destroy; + } else { + endBehavior = EndBehavior.restart; + } + } else { + var _originContent_options1; + endBehavior = endBehavior || (originContent == null ? void 0 : (_originContent_options1 = originContent.options) == null ? void 0 : _originContent_options1.endBehavior) || EndBehavior.destroy; + } + if (originContent.options.renderLevel) { + renderLevel = originContent.options.renderLevel; + } + if (isNaN(duration)) { + duration = originContent.options.duration; + } + } + var ret = { + type: type, + name: item.name, + delay: item.delay, + duration: duration, + id: item.id + "", + // @ts-expect-error + transform: transform, + endBehavior: endBehavior, + // @ts-expect-error + renderLevel: renderLevel, + content: content + }; + // @ts-expect-error + if (pluginName) { + if (opt.plugins) { + arrAdd(opt.plugins, pluginName); + ret.pn = opt.plugins.indexOf(pluginName); + } else { + ret.pluginName = pluginName; + } + // @ts-expect-error + } else if (Number.isInteger(pn)) { + // @ts-expect-error + ret.pn = pn; + } + if (item.parentId) { + ret.parentId = item.parentId + ""; + } + return ret; + function getTransform(originTransform, inverseRotation, changeOrder) { + if (originTransform) { + var transform = {}; + var rotation = originTransform.rotation; + if (rotation) { + if (inverseRotation) { + transform.rotation = [ + -rotation[0], + -rotation[1], + -rotation[2] + ]; + } else { + transform.rotation = [ + rotation[0], + rotation[1], + rotation[2] + ]; + } + if (changeOrder) { + var q = quatFromXYZRotation(tempQuat, transform.rotation[0], transform.rotation[1], transform.rotation[2]); + transform.rotation = rotationZYXFromQuat([], q); + } + } + var position = originTransform.position; + if (position) { + transform.position = originTransform.position; + } + if (Array.isArray(originTransform.scale)) { + transform.scale = [ + originTransform.scale[0] || 1, + originTransform.scale[1] || 1, + originTransform.scale[2] || 1 + ]; + } + return transform; + } + return {}; + } +} + +var _obj$4; +/** + * 机型和渲染等级对应表 + * + * 机型:B-低端机、A-中端机、S-高端机 + * 渲染等级:B-低、A-中、S-高、A+-中高、B+-全部 + * + * - S(高端机):高、全部、中高 + * - A(中端机):中、全部、中高 + * - B(低端机):低、全部 + * - undefined(全部机型) + */ var renderLevelPassSet = (_obj$4 = {}, _obj$4[RenderLevel.S] = [ + RenderLevel.S, + RenderLevel.BPlus, + RenderLevel.APlus +], _obj$4[RenderLevel.A] = [ + RenderLevel.A, + RenderLevel.BPlus, + RenderLevel.APlus +], _obj$4[RenderLevel.B] = [ + RenderLevel.B, + RenderLevel.BPlus +], _obj$4); +function passRenderLevel(l, renderLevel) { + if (!l || !renderLevel) { + return true; + } + var arr = renderLevelPassSet[renderLevel]; + if (arr) { + return arr.includes(l); + } + return false; +} + +exports.Scene = void 0; +(function(Scene) { + function isJSONObject(scene) { + return isObject(scene) && "jsonScene" in scene; + } + // JSON 对象 + Scene.isJSONObject = isJSONObject; + function isURL(scene) { + return isObject(scene) && "url" in scene; + } + Scene.isURL = isURL; + function isWithOptions(scene) { + return isObject(scene) && "options" in scene; + } + Scene.isWithOptions = isWithOptions; +})(exports.Scene || (exports.Scene = {})); + +function getBackgroundImage(template, variables) { + var templateBackground; + var _template_background; + var _ref = (_template_background = template == null ? void 0 : template.background) != null ? _template_background : {}, name = _ref.name, url = _ref.url; + if (name) { + if (variables && variables[name]) { + templateBackground = variables[name]; + } else if (url) { + templateBackground = url; + } + } + return templateBackground; +} +/** + * @param url + * @param template + * @param variables + * @param options + * @returns + */ function combineImageTemplate(url, template, variables) { + return _combineImageTemplate.apply(this, arguments); +} +function _combineImageTemplate() { + _combineImageTemplate = _async_to_generator(function(url, template, variables) { + var image, templateBackground; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!(typeof url === "string")) return [ + 3, + 2 + ]; + return [ + 4, + loadImage(url) + ]; + case 1: + image = _state.sent(); + return [ + 3, + 3 + ]; + case 2: + image = url; + _state.label = 3; + case 3: + if (!image) { + throw new Error("Image not provided."); + } + if (!template) { + return [ + 2, + image + ]; + } + // 获取动态换图的图片对象或 url 地址 + templateBackground = getBackgroundImage(template, variables); + if (templateBackground) { + if (isString(templateBackground) && templateBackground !== image.src) { + return [ + 2, + loadImage(templateBackground) + ]; + } + if (_instanceof1(templateBackground, HTMLImageElement)) { + return [ + 2, + templateBackground + ]; + } + } + return [ + 2, + image + ]; + } + }); + }); + return _combineImageTemplate.apply(this, arguments); +} + +var seed$4 = 1; +/** + * 资源管理器 + * 用于加载和动效中所有的资源文件,包括图片、插件、图层粒子数据等 + */ var AssetManager = /*#__PURE__*/ function() { + function AssetManager(options, downloader) { + if (options === void 0) options = {}; + if (downloader === void 0) downloader = new Downloader(); + this.options = options; + this.downloader = downloader; + this.assets = {}; + this.sourceFrom = {}; + this.id = seed$4++; + this.timers = []; + this.updateOptions(options); + } + var _proto = AssetManager.prototype; + _proto.updateOptions = function updateOptions(options) { + if (options === void 0) options = {}; + this.options = options; + if (!options.pluginData) { + options.pluginData = {}; + } + var _options_timeout = options.timeout, timeout = _options_timeout === void 0 ? 10 : _options_timeout; + this.timeout = timeout; + }; + /** + * 场景创建,通过 json 创建出场景对象,并进行提前编译等工作 + * @param url - json 的 URL 链接或者 json 对象 + * @param renderer - renderer 对象,用于获取管理、编译 shader 及 GPU 上下文的参数 + * @param options - 扩展参数 + * @returns + */ _proto.loadScene = function loadScene(url, renderer, options) { + var _this = this; + return _async_to_generator(function() { + var rawJSON, assetUrl, startTime, timeInfoMessages, gpuInstance, _gpuInstance_detail_compressedTexture, compressedTexture, timeInfos, loadTimer, cancelLoading, waitPromise, hookTimeInfo, loadResourcePromise; + return __generator(this, function(_state) { + assetUrl = isString(url) ? url : _this.id; + startTime = performance.now(); + timeInfoMessages = []; + gpuInstance = renderer == null ? void 0 : renderer.engine.gpuCapability; + compressedTexture = (_gpuInstance_detail_compressedTexture = gpuInstance == null ? void 0 : gpuInstance.detail.compressedTexture) != null ? _gpuInstance_detail_compressedTexture : exports.COMPRESSED_TEXTURE.NONE; + timeInfos = {}; + cancelLoading = false; + waitPromise = new Promise(function(resolve, reject) { + loadTimer = window.setTimeout(function() { + cancelLoading = true; + _this.removeTimer(loadTimer); + var totalTime = performance.now() - startTime; + reject(new Error("Load time out: totalTime: " + totalTime.toFixed(4) + "ms " + timeInfoMessages.join(" ") + ", url: " + assetUrl + ".")); + }, _this.timeout * 1000); + _this.timers.push(loadTimer); + }); + hookTimeInfo = /*#__PURE__*/ _async_to_generator(function(label, func) { + var st, result, time, e; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!!cancelLoading) return [ + 3, + 4 + ]; + st = performance.now(); + _state.label = 1; + case 1: + _state.trys.push([ + 1, + 3, + , + 4 + ]); + return [ + 4, + func() + ]; + case 2: + result = _state.sent(); + time = performance.now() - st; + timeInfoMessages.push("[" + label + ": " + time.toFixed(2) + "]"); + timeInfos[label] = time; + return [ + 2, + result + ]; + case 3: + e = _state.sent(); + throw new Error("Load error in " + label + ", " + e + "."); + case 4: + throw new Error("Load canceled."); + } + }); + }); + loadResourcePromise = /*#__PURE__*/ _async_to_generator(function() { + var scene, link, jsonScene, pluginSystem, loadedImages, images, _ref, jsonScene1, pluginSystem1, _jsonScene_bins, bins, images1, fonts, _ref1, loadedBins, loadedImages1, loadedTextures, totalTime; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!isString(url)) return [ + 3, + 2 + ]; + // 兼容相对路径 + link = new URL(url, location.href).href; + _this.baseUrl = link; + return [ + 4, + hookTimeInfo("loadJSON", function() { + return _this.loadJSON(link); + }) + ]; + case 1: + rawJSON = _state.sent(); + return [ + 3, + 3 + ]; + case 2: + // url 为 spec.JSONScene 或 Scene 对象 + rawJSON = url; + _this.baseUrl = location.href; + _state.label = 3; + case 3: + if (!exports.Scene.isJSONObject(rawJSON)) return [ + 3, + 5 + ]; + // 已经加载过的 可能需要更新数据模板 + scene = _extends({}, rawJSON); + jsonScene = scene.jsonScene, pluginSystem = scene.pluginSystem, loadedImages = scene.images; + images = jsonScene.images; + _this.assignImagesToAssets(images, loadedImages); + return [ + 4, + Promise.all([ + hookTimeInfo("plugin:processAssets", function() { + return _this.processPluginAssets(jsonScene, pluginSystem, options); + }) + ]) + ]; + case 4: + _state.sent(); + return [ + 3, + 10 + ]; + case 5: + return [ + 4, + hookTimeInfo("processJSON", function() { + return _this.processJSON(rawJSON); + }) + ]; + case 6: + _ref = _state.sent(), jsonScene1 = _ref.jsonScene, pluginSystem1 = _ref.pluginSystem; + _jsonScene_bins = jsonScene1.bins, bins = _jsonScene_bins === void 0 ? [] : _jsonScene_bins, images1 = jsonScene1.images, fonts = jsonScene1.fonts; + return [ + 4, + Promise.all([ + hookTimeInfo("processBins", function() { + return _this.processBins(bins); + }), + hookTimeInfo("processImages", function() { + return _this.processImages(images1, compressedTexture); + }), + hookTimeInfo("plugin:processAssets", function() { + return _this.processPluginAssets(jsonScene1, pluginSystem1, options); + }), + hookTimeInfo("processFontURL", function() { + return _this.processFontURL(fonts); + }) + ]) + ]; + case 7: + _ref1 = _state.sent(), loadedBins = _ref1[0], loadedImages1 = _ref1[1]; + return [ + 4, + hookTimeInfo("processTextures", function() { + return _this.processTextures(loadedImages1, loadedBins, jsonScene1); + }) + ]; + case 8: + loadedTextures = _state.sent(); + scene = { + timeInfos: timeInfos, + url: url, + renderLevel: _this.options.renderLevel, + storage: {}, + pluginSystem: pluginSystem1, + jsonScene: jsonScene1, + bins: loadedBins, + images: loadedImages1, + textureOptions: loadedTextures + }; + // 触发插件系统 pluginSystem 的回调 prepareResource + return [ + 4, + hookTimeInfo("plugin:prepareResource", function() { + return pluginSystem1.loadResources(scene, _this.options); + }) + ]; + case 9: + _state.sent(); + _state.label = 10; + case 10: + totalTime = performance.now() - startTime; + logger.info("Load asset: totalTime: " + totalTime.toFixed(4) + "ms " + timeInfoMessages.join(" ") + ", url: " + assetUrl + "."); + window.clearTimeout(loadTimer); + _this.removeTimer(loadTimer); + scene.totalTime = totalTime; + scene.startTime = startTime; + // 各部分分段时长 + scene.timeInfos = timeInfos; + return [ + 2, + scene + ]; + } + }); + }); + return [ + 2, + Promise.race([ + waitPromise, + loadResourcePromise() + ]) + ]; + }); + })(); + }; + _proto.getAssets = function getAssets() { + return this.assets; + }; + _proto.processJSON = function processJSON(json) { + var _this = this; + return _async_to_generator(function() { + var jsonScene, _jsonScene_plugins, plugins, pluginSystem; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + jsonScene = getStandardJSON(json); + _jsonScene_plugins = jsonScene.plugins, plugins = _jsonScene_plugins === void 0 ? [] : _jsonScene_plugins; + pluginSystem = new PluginSystem(plugins); + return [ + 4, + pluginSystem.processRawJSON(jsonScene, _this.options) + ]; + case 1: + _state.sent(); + return [ + 2, + { + jsonScene: jsonScene, + pluginSystem: pluginSystem + } + ]; + } + }); + })(); + }; + _proto.processBins = function processBins(bins) { + var _this = this; + return _async_to_generator(function() { + var renderLevel, baseUrl, jobs; + return __generator(this, function(_state) { + renderLevel = _this.options.renderLevel; + baseUrl = _this.baseUrl; + jobs = bins.map(function(bin) { + if (_instanceof1(bin, ArrayBuffer)) { + return bin; + } + if (passRenderLevel(bin.renderLevel, renderLevel)) { + return _this.loadBins(new URL(bin.url, baseUrl).href); + } + throw new Error("Invalid bins source: " + JSON.stringify(bins) + "."); + }); + return [ + 2, + Promise.all(jobs) + ]; + }); + })(); + }; + _proto.processFontURL = function processFontURL(fonts) { + var _this = this; + return _async_to_generator(function() { + var jobs; + return __generator(this, function(_state) { + // 对老数据的兼容 + if (!fonts) { + return [ + 2 + ]; + } + jobs = fonts.map(/*#__PURE__*/ _async_to_generator(function(font) { + var url, _font_fontFamily, fontFace; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!(font.fontURL && !AssetManager.fontCache.has(font.fontFamily))) return [ + 3, + 4 + ]; + if (!isValidFontFamily(font.fontFamily)) { + // 在所有设备上提醒开发者 + console.warn("Risky font family: " + font.fontFamily + "."); + } + _state.label = 1; + case 1: + _state.trys.push([ + 1, + 3, + , + 4 + ]); + url = new URL(font.fontURL, _this.baseUrl).href; + fontFace = new FontFace((_font_fontFamily = font.fontFamily) != null ? _font_fontFamily : "", "url(" + url + ")"); + return [ + 4, + fontFace.load() + ]; + case 2: + _state.sent(); + document.fonts.add(fontFace); + AssetManager.fontCache.add(font.fontFamily); + return [ + 3, + 4 + ]; + case 3: + _state.sent(); + logger.warn("Invalid font family or font source: " + JSON.stringify(font.fontURL) + "."); + return [ + 3, + 4 + ]; + case 4: + return [ + 2 + ]; + } + }); + })); + return [ + 2, + Promise.all(jobs) + ]; + }); + })(); + }; + _proto.processImages = function processImages(images, compressedTexture) { + if (compressedTexture === void 0) compressedTexture = 0; + var _this = this; + return _async_to_generator(function() { + var _this_options, useCompressedTexture, variables, disableWebP, disableAVIF, baseUrl, jobs, loadedImages; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + _this_options = _this.options, useCompressedTexture = _this_options.useCompressedTexture, variables = _this_options.variables, disableWebP = _this_options.disableWebP, disableAVIF = _this_options.disableAVIF; + baseUrl = _this.baseUrl; + jobs = images.map(/*#__PURE__*/ _async_to_generator(function(img, idx) { + var png, webp, avif, imageURL, webpURL, avifURL, id, template, background, url, isVideo, loadFn, resultImage, e, compressed, src, bufferURL, _ref, url1, image, _tmp; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + png = img.url, webp = img.webp, avif = img.avif; + // eslint-disable-next-line compat/compat + imageURL = new URL(png, baseUrl).href; + // eslint-disable-next-line compat/compat + webpURL = !disableWebP && webp ? new URL(webp, baseUrl).href : undefined; + // eslint-disable-next-line compat/compat + avifURL = !disableAVIF && avif ? new URL(avif, baseUrl).href : undefined; + id = img.id; + if (!("template" in img)) return [ + 3, + 8 + ]; + // 1. 数据模板 + template = img.template; + // 获取数据模板 background 参数 + background = template.background; + if (!background) return [ + 3, + 7 + ]; + url = getBackgroundImage(template, variables); + isVideo = background.type === BackgroundType.video; + // 根据背景类型确定加载函数 + loadFn = background && isVideo ? loadVideo : loadImage; + _state.label = 1; + case 1: + _state.trys.push([ + 1, + 6, + , + 7 + ]); + return [ + 4, + loadMedia(url, loadFn) + ]; + case 2: + resultImage = _state.sent(); + if (!_instanceof1(resultImage, HTMLVideoElement)) return [ + 3, + 3 + ]; + _this.sourceFrom[id] = { + url: resultImage.src, + type: exports.TextureSourceType.video + }; + return [ + 2, + resultImage + ]; + case 3: + // 如果是加载图片且是数组,设置变量,视频情况下不需要 + if (background && Array.isArray(url) && variables) { + variables[background.name] = resultImage.src; + } + _this.sourceFrom[id] = { + url: resultImage.src, + type: exports.TextureSourceType.image + }; + return [ + 4, + combineImageTemplate(resultImage, template, variables) + ]; + case 4: + return [ + 2, + _state.sent() + ]; + case 5: + return [ + 3, + 7 + ]; + case 6: + e = _state.sent(); + throw new Error("Failed to load. Check the template or if the URL is " + (isVideo ? "video" : "image") + " type, URL: " + url + ", Error: " + (e.message || e) + "."); + case 7: + return [ + 3, + 9 + ]; + case 8: + if ("compressed" in img && useCompressedTexture && compressedTexture) { + // 2. 压缩纹理 + compressed = img.compressed; + if (compressedTexture === exports.COMPRESSED_TEXTURE.ASTC) { + src = compressed.astc; + } else if (compressedTexture === exports.COMPRESSED_TEXTURE.PVRTC) { + src = compressed.pvrtc; + } + if (src) { + bufferURL = new URL(src, baseUrl).href; + _this.sourceFrom[id] = { + url: bufferURL, + type: exports.TextureSourceType.compressed + }; + return [ + 2, + _this.loadBins(bufferURL) + ]; + } + } else if (_instanceof1(img, HTMLImageElement) || _instanceof1(img, HTMLCanvasElement) || _instanceof1(img, HTMLVideoElement) || _instanceof1(img, Texture)) { + return [ + 2, + img + ]; + } + _state.label = 9; + case 9: + if (!avifURL) return [ + 3, + 11 + ]; + return [ + 4, + loadAVIFOptional(imageURL, avifURL) + ]; + case 10: + _tmp = _state.sent(); + return [ + 3, + 13 + ]; + case 11: + return [ + 4, + loadWebPOptional(imageURL, webpURL) + ]; + case 12: + _tmp = _state.sent(); + _state.label = 13; + case 13: + _ref = _tmp, url1 = _ref.url, image = _ref.image; + _this.sourceFrom[id] = { + url: url1, + type: exports.TextureSourceType.image + }; + return [ + 2, + image + ]; + } + }); + })); + return [ + 4, + Promise.all(jobs) + ]; + case 1: + loadedImages = _state.sent(); + _this.assignImagesToAssets(images, loadedImages); + return [ + 2, + loadedImages + ]; + } + }); + })(); + }; + _proto.processPluginAssets = function processPluginAssets(jsonScene, pluginSystem, options) { + var _this = this; + return _async_to_generator(function() { + var pluginResult, _pluginResult_reduce, assets, loadedAssets, i; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + return [ + 4, + pluginSystem.processAssets(jsonScene, options) + ]; + case 1: + pluginResult = _state.sent(); + _pluginResult_reduce = pluginResult.reduce(function(acc, cur) { + acc.assets = acc.assets.concat(cur.assets); + acc.loadedAssets = acc.loadedAssets.concat(cur.loadedAssets); + return acc; + }, { + assets: [], + loadedAssets: [] + }), assets = _pluginResult_reduce.assets, loadedAssets = _pluginResult_reduce.loadedAssets; + for(i = 0; i < assets.length; i++){ + _this.assets[assets[i].id] = loadedAssets[i]; + } + return [ + 2 + ]; + } + }); + })(); + }; + _proto.processTextures = function processTextures(images, bins, jsonScene) { + var _this = this; + return _async_to_generator(function() { + var _jsonScene_textures, textures, jobs; + return __generator(this, function(_state) { + textures = (_jsonScene_textures = jsonScene.textures) != null ? _jsonScene_textures : images.map(function(img, source) { + return { + source: source + }; + }); + jobs = textures.map(/*#__PURE__*/ _async_to_generator(function(textureOptions, idx) { + var e, source, id, image, imageId, texture; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (_instanceof1(textureOptions, Texture)) { + return [ + 2, + textureOptions + ]; + } + if (!("mipmaps" in textureOptions)) return [ + 3, + 4 + ]; + _state.label = 1; + case 1: + _state.trys.push([ + 1, + 3, + , + 4 + ]); + return [ + 4, + deserializeMipmapTexture(textureOptions, bins, _this.assets, jsonScene.bins) + ]; + case 2: + return [ + 2, + _state.sent() + ]; + case 3: + e = _state.sent(); + throw new Error("Load texture " + idx + " fails, error message: " + e + "."); + case 4: + source = textureOptions.source, id = textureOptions.id; + imageId = ""; + if (!isObject(source)) return [ + 3, + 5 + ]; + image = _this.assets[source.id]; + imageId = source.id; + return [ + 3, + 7 + ]; + case 5: + if (!(typeof source === "string")) return [ + 3, + 7 + ]; + return [ + 4, + loadImage(base64ToFile(source)) + ]; + case 6: + image = _state.sent(); + _state.label = 7; + case 7: + if (image) { + texture = createTextureOptionsBySource(image, _this.sourceFrom[imageId], id); + return [ + 2, + texture.sourceType === exports.TextureSourceType.compressed ? texture : _extends({}, texture, textureOptions) + ]; + } + throw new Error("Invalid texture source: " + source + "."); + } + }); + })); + return [ + 2, + Promise.all(jobs) + ]; + }); + })(); + }; + _proto.loadJSON = function loadJSON(url) { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + new Promise(function(resolve, reject) { + _this.downloader.downloadJSON(url, resolve, function(status, responseText) { + reject("Couldn't load JSON " + JSON.stringify(url) + ": status " + status + ", " + responseText); + }); + }) + ]; + }); + })(); + }; + _proto.loadBins = function loadBins(url) { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + return [ + 2, + new Promise(function(resolve, reject) { + _this.downloader.downloadBinary(url, resolve, function(status, responseText) { + reject("Couldn't load bins " + JSON.stringify(url) + ": status " + status + ", " + responseText); + }); + }) + ]; + }); + })(); + }; + _proto.assignImagesToAssets = function assignImagesToAssets(images, loadedImages) { + for(var i = 0; i < images.length; i++){ + this.assets[images[i].id] = loadedImages[i]; + } + }; + _proto.removeTimer = function removeTimer(id) { + var index = this.timers.indexOf(id); + if (index !== -1) { + this.timers.splice(index, 1); + } + }; + /** + * 销毁方法 + */ _proto.dispose = function dispose() { + if (this.timers.length) { + this.timers.map(function(id) { + return window.clearTimeout(id); + }); + } + this.assets = {}; + this.sourceFrom = {}; + this.timers = []; + }; + return AssetManager; +}(); +/** + * 自定义文本缓存,随页面销毁而销毁 + */ AssetManager.fontCache = new Set(); +function createTextureOptionsBySource(image, sourceFrom, id) { + var options = { + id: id, + dataType: DataType.Texture + }; + if (_instanceof1(image, Texture)) { + return _extends({}, image.source, options); + } else if (_instanceof1(image, HTMLImageElement) || isCanvas(image)) { + return _extends({ + image: image, + sourceType: exports.TextureSourceType.image, + sourceFrom: sourceFrom, + keepImageSource: true, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR + }, options); + } else if (_instanceof1(image, HTMLVideoElement)) { + // 视频 + return _extends({ + sourceType: exports.TextureSourceType.video, + video: image, + minFilter: glContext.LINEAR, + magFilter: glContext.LINEAR + }, options); + } else if (_instanceof1(image, ArrayBuffer)) { + // 压缩纹理 + return _extends({}, getKTXTextureOptions(image), { + sourceFrom: sourceFrom + }, options); + } else if ("width" in image && "height" in image && "data" in image) { + return _extends({ + sourceType: exports.TextureSourceType.data, + data: image, + wrapS: glContext.CLAMP_TO_EDGE, + wrapT: glContext.CLAMP_TO_EDGE, + minFilter: glContext.NEAREST, + magFilter: glContext.NEAREST + }, options); + } + throw new Error("Invalid texture options."); +} + +/** + * + */ var AssetService = /*#__PURE__*/ function() { + function AssetService(engine) { + this.engine = engine; + this.builtinObjects = []; + this.builtinObjects.push(generateWhiteTexture(engine)); + } + var _proto = AssetService.prototype; + /** + * @param url + * @param options + * @returns + */ _proto.assembleSceneLoadOptions = function assembleSceneLoadOptions(url, options) { + if (options === void 0) options = {}; + var source = url; + // 加载多个合成链接并各自设置可选参数 + if (exports.Scene.isURL(url)) { + if (!exports.Scene.isJSONObject(url)) { + source = url.url; + } + if (exports.Scene.isWithOptions(url)) { + options = _extends({}, options, url.options); + } + } + return { + source: source, + options: options + }; + }; + /** + * 根据用户参数修改文本元素的原始数据 + * @param scene + * @param options + */ _proto.updateTextVariables = function updateTextVariables(scene, variables) { + var _this = this; + if (variables === void 0) variables = {}; + scene.jsonScene.items.forEach(function(item) { + if (item.type === ItemType.text || item.type === ItemType.richtext) { + var textVariable = variables[item.name]; + if (!textVariable) { + return; + } + item.components.forEach(function(param) { + var id = param.id; + var componentData = _this.engine.findEffectsObjectData(id); + if ((componentData == null ? void 0 : componentData.dataType) === DataType.TextComponent || (componentData == null ? void 0 : componentData.dataType) === DataType.RichTextComponent) { + componentData.options.text = textVariable; + } + }); + } + }); + }; + _proto.initializeTexture = function initializeTexture(scene) { + for(var i = 0; i < scene.textureOptions.length; i++){ + var textureOptions = scene.textureOptions[i]; + if (_instanceof1(textureOptions, Texture)) { + this.engine.addInstance(textureOptions); + } else { + textureOptions = this.engine.findObject({ + id: scene.textureOptions[i].id + }); + scene.textureOptions[i] = textureOptions; + } + textureOptions.initialize(); + } + }; + _proto.prepareAssets = function prepareAssets(scene, assets) { + this.engine.clearResources(); + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(assets)), _step; !(_step = _iterator()).done;){ + var assetId = _step.value; + var asset = assets[assetId]; + var engineAsset = new Asset(this.engine); + engineAsset.data = asset; + engineAsset.setInstanceId(assetId); + } + // 加入 json 资产数据 + this.engine.addPackageDatas(scene); + // 加入内置引擎对象 + for(var _iterator1 = _create_for_of_iterator_helper_loose(this.builtinObjects), _step1; !(_step1 = _iterator1()).done;){ + var effectsObject = _step1.value; + this.engine.addInstance(effectsObject); + } + }; + // TODO Material 单独存表, 加速查询 + _proto.createShaderVariant = function createShaderVariant() { + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(this.engine.objectInstance)), _step; !(_step = _iterator()).done;){ + var guid = _step.value; + var effectsObject = this.engine.objectInstance[guid]; + if (_instanceof1(effectsObject, Material)) { + effectsObject.createShaderVariant(); + } + } + }; + _proto.destroyBuiltinObjects = function destroyBuiltinObjects() { + for(var _iterator = _create_for_of_iterator_helper_loose(this.builtinObjects), _step; !(_step = _iterator()).done;){ + var effectsObject = _step.value; + effectsObject.dispose(); + } + this.builtinObjects.length = 0; + }; + /** + * + */ _proto.dispose = function dispose() { + this.destroyBuiltinObjects(); + // Optionally remove references from engine if any + }; + return AssetService; +}(); + +var SIZEOF_SHORT = 2; +var SIZEOF_INT = 4; +var FILE_IDENTIFIER_LENGTH = 4; +var SIZE_PREFIX_LENGTH = 4; + +var int32 = new Int32Array(2); +var float32 = new Float32Array(int32.buffer); +var float64 = new Float64Array(int32.buffer); +var isLittleEndian = new Uint16Array(new Uint8Array([ + 1, + 0 +]).buffer)[0] === 1; + +var Encoding; +(function(Encoding) { + Encoding[Encoding["UTF8_BYTES"] = 1] = "UTF8_BYTES"; + Encoding[Encoding["UTF16_STRING"] = 2] = "UTF16_STRING"; +})(Encoding || (Encoding = {})); + +var ByteBuffer = /*#__PURE__*/ function() { + function ByteBuffer(bytes_) { + this.bytes_ = bytes_; + this.position_ = 0; + this.text_decoder_ = new TextDecoder(); + } + var _proto = ByteBuffer.prototype; + _proto.clear = function clear() { + this.position_ = 0; + }; + /** + * Get the underlying `Uint8Array`. + */ _proto.bytes = function bytes() { + return this.bytes_; + }; + /** + * Get the buffer's position. + */ _proto.position = function position() { + return this.position_; + }; + /** + * Set the buffer's position. + */ _proto.setPosition = function setPosition(position) { + this.position_ = position; + }; + /** + * Get the buffer's capacity. + */ _proto.capacity = function capacity() { + return this.bytes_.length; + }; + _proto.readInt8 = function readInt8(offset) { + return this.readUint8(offset) << 24 >> 24; + }; + _proto.readUint8 = function readUint8(offset) { + return this.bytes_[offset]; + }; + _proto.readInt16 = function readInt16(offset) { + return this.readUint16(offset) << 16 >> 16; + }; + _proto.readUint16 = function readUint16(offset) { + return this.bytes_[offset] | this.bytes_[offset + 1] << 8; + }; + _proto.readInt32 = function readInt32(offset) { + return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24; + }; + _proto.readUint32 = function readUint32(offset) { + return this.readInt32(offset) >>> 0; + }; + _proto.readInt64 = function readInt64(offset) { + return BigInt.asIntN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32))); + }; + _proto.readUint64 = function readUint64(offset) { + return BigInt.asUintN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32))); + }; + _proto.readFloat32 = function readFloat32(offset) { + int32[0] = this.readInt32(offset); + return float32[0]; + }; + _proto.readFloat64 = function readFloat64(offset) { + int32[isLittleEndian ? 0 : 1] = this.readInt32(offset); + int32[isLittleEndian ? 1 : 0] = this.readInt32(offset + 4); + return float64[0]; + }; + _proto.writeInt8 = function writeInt8(offset, value) { + this.bytes_[offset] = value; + }; + _proto.writeUint8 = function writeUint8(offset, value) { + this.bytes_[offset] = value; + }; + _proto.writeInt16 = function writeInt16(offset, value) { + this.bytes_[offset] = value; + this.bytes_[offset + 1] = value >> 8; + }; + _proto.writeUint16 = function writeUint16(offset, value) { + this.bytes_[offset] = value; + this.bytes_[offset + 1] = value >> 8; + }; + _proto.writeInt32 = function writeInt32(offset, value) { + this.bytes_[offset] = value; + this.bytes_[offset + 1] = value >> 8; + this.bytes_[offset + 2] = value >> 16; + this.bytes_[offset + 3] = value >> 24; + }; + _proto.writeUint32 = function writeUint32(offset, value) { + this.bytes_[offset] = value; + this.bytes_[offset + 1] = value >> 8; + this.bytes_[offset + 2] = value >> 16; + this.bytes_[offset + 3] = value >> 24; + }; + _proto.writeInt64 = function writeInt64(offset, value) { + this.writeInt32(offset, Number(BigInt.asIntN(32, value))); + this.writeInt32(offset + 4, Number(BigInt.asIntN(32, value >> BigInt(32)))); + }; + _proto.writeUint64 = function writeUint64(offset, value) { + this.writeUint32(offset, Number(BigInt.asUintN(32, value))); + this.writeUint32(offset + 4, Number(BigInt.asUintN(32, value >> BigInt(32)))); + }; + _proto.writeFloat32 = function writeFloat32(offset, value) { + float32[0] = value; + this.writeInt32(offset, int32[0]); + }; + _proto.writeFloat64 = function writeFloat64(offset, value) { + float64[0] = value; + this.writeInt32(offset, int32[isLittleEndian ? 0 : 1]); + this.writeInt32(offset + 4, int32[isLittleEndian ? 1 : 0]); + }; + /** + * Return the file identifier. Behavior is undefined for FlatBuffers whose + * schema does not include a file_identifier (likely points at padding or the + * start of a the root vtable). + */ _proto.getBufferIdentifier = function getBufferIdentifier() { + if (this.bytes_.length < this.position_ + SIZEOF_INT + FILE_IDENTIFIER_LENGTH) { + throw new Error("FlatBuffers: ByteBuffer is too short to contain an identifier."); + } + var result = ""; + for(var i = 0; i < FILE_IDENTIFIER_LENGTH; i++){ + result += String.fromCharCode(this.readInt8(this.position_ + SIZEOF_INT + i)); + } + return result; + }; + /** + * Look up a field in the vtable, return an offset into the object, or 0 if the + * field is not present. + */ _proto.__offset = function __offset(bb_pos, vtable_offset) { + var vtable = bb_pos - this.readInt32(bb_pos); + return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0; + }; + /** + * Initialize any Table-derived type to point to the union at the given offset. + */ _proto.__union = function __union(t, offset) { + t.bb_pos = offset + this.readInt32(offset); + t.bb = this; + return t; + }; + /** + * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer. + * This allocates a new string and converts to wide chars upon each access. + * + * To avoid the conversion to string, pass Encoding.UTF8_BYTES as the + * "optionalEncoding" argument. This is useful for avoiding conversion when + * the data will just be packaged back up in another FlatBuffer later on. + * + * @param offset + * @param opt_encoding Defaults to UTF16_STRING + */ _proto.__string = function __string(offset, opt_encoding) { + offset += this.readInt32(offset); + var length = this.readInt32(offset); + offset += SIZEOF_INT; + var utf8bytes = this.bytes_.subarray(offset, offset + length); + if (opt_encoding === Encoding.UTF8_BYTES) return utf8bytes; + else return this.text_decoder_.decode(utf8bytes); + }; + /** + * Handle unions that can contain string as its member, if a Table-derived type then initialize it, + * if a string then return a new one + * + * WARNING: strings are immutable in JS so we can't change the string that the user gave us, this + * makes the behaviour of __union_with_string different compared to __union + */ _proto.__union_with_string = function __union_with_string(o, offset) { + if (typeof o === "string") { + return this.__string(offset); + } + return this.__union(o, offset); + }; + /** + * Retrieve the relative offset stored at "offset" + */ _proto.__indirect = function __indirect(offset) { + return offset + this.readInt32(offset); + }; + /** + * Get the start of data of a vector whose offset is stored at "offset" in this object. + */ _proto.__vector = function __vector(offset) { + return offset + this.readInt32(offset) + SIZEOF_INT; // data starts after the length + }; + /** + * Get the length of a vector whose offset is stored at "offset" in this object. + */ _proto.__vector_len = function __vector_len(offset) { + return this.readInt32(offset + this.readInt32(offset)); + }; + _proto.__has_identifier = function __has_identifier(ident) { + if (ident.length != FILE_IDENTIFIER_LENGTH) { + throw new Error("FlatBuffers: file identifier must be length " + FILE_IDENTIFIER_LENGTH); + } + for(var i = 0; i < FILE_IDENTIFIER_LENGTH; i++){ + if (ident.charCodeAt(i) != this.readInt8(this.position() + SIZEOF_INT + i)) { + return false; + } + } + return true; + }; + /** + * A helper function for generating list for obj api + */ _proto.createScalarList = function createScalarList(listAccessor, listLength) { + var ret = []; + for(var i = 0; i < listLength; ++i){ + var val = listAccessor(i); + if (val !== null) { + ret.push(val); + } + } + return ret; + }; + /** + * A helper function for generating list for obj api + * @param listAccessor function that accepts an index and return data at that index + * @param listLength listLength + * @param res result list + */ _proto.createObjList = function createObjList(listAccessor, listLength) { + var ret = []; + for(var i = 0; i < listLength; ++i){ + var val = listAccessor(i); + if (val !== null) { + ret.push(val.unpack()); + } + } + return ret; + }; + /** + * Create and allocate a new ByteBuffer with a given size. + */ ByteBuffer.allocate = function allocate(byte_size) { + return new ByteBuffer(new Uint8Array(byte_size)); + }; + return ByteBuffer; +}(); + +var Builder = /*#__PURE__*/ function() { + function Builder(opt_initial_size) { + /** Minimum alignment encountered so far. */ this.minalign = 1; + /** The vtable for the current table. */ this.vtable = null; + /** The amount of fields we're actually using. */ this.vtable_in_use = 0; + /** Whether we are currently serializing a table. */ this.isNested = false; + /** Starting offset of the current struct/table. */ this.object_start = 0; + /** List of offsets of all vtables. */ this.vtables = []; + /** For the current vector being built. */ this.vector_num_elems = 0; + /** False omits default values from the serialized data */ this.force_defaults = false; + this.string_maps = null; + this.text_encoder = new TextEncoder(); + var initial_size; + if (!opt_initial_size) { + initial_size = 1024; + } else { + initial_size = opt_initial_size; + } + /** + * @type {ByteBuffer} + * @private + */ this.bb = ByteBuffer.allocate(initial_size); + this.space = initial_size; + } + var _proto = Builder.prototype; + _proto.clear = function clear() { + this.bb.clear(); + this.space = this.bb.capacity(); + this.minalign = 1; + this.vtable = null; + this.vtable_in_use = 0; + this.isNested = false; + this.object_start = 0; + this.vtables = []; + this.vector_num_elems = 0; + this.force_defaults = false; + this.string_maps = null; + }; + /** + * In order to save space, fields that are set to their default value + * don't get serialized into the buffer. Forcing defaults provides a + * way to manually disable this optimization. + * + * @param forceDefaults true always serializes default values + */ _proto.forceDefaults = function forceDefaults(forceDefaults) { + this.force_defaults = forceDefaults; + }; + /** + * Get the ByteBuffer representing the FlatBuffer. Only call this after you've + * called finish(). The actual data starts at the ByteBuffer's current position, + * not necessarily at 0. + */ _proto.dataBuffer = function dataBuffer() { + return this.bb; + }; + /** + * Get the bytes representing the FlatBuffer. Only call this after you've + * called finish(). + */ _proto.asUint8Array = function asUint8Array() { + return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset()); + }; + /** + * Prepare to write an element of `size` after `additional_bytes` have been + * written, e.g. if you write a string, you need to align such the int length + * field is aligned to 4 bytes, and the string data follows it directly. If all + * you need to do is alignment, `additional_bytes` will be 0. + * + * @param size This is the of the new element to write + * @param additional_bytes The padding size + */ _proto.prep = function prep(size, additional_bytes) { + // Track the biggest thing we've ever aligned to. + if (size > this.minalign) { + this.minalign = size; + } + // Find the amount of alignment needed such that `size` is properly + // aligned after `additional_bytes` + var align_size = ~(this.bb.capacity() - this.space + additional_bytes) + 1 & size - 1; + // Reallocate the buffer if needed. + while(this.space < align_size + size + additional_bytes){ + var old_buf_size = this.bb.capacity(); + this.bb = Builder.growByteBuffer(this.bb); + this.space += this.bb.capacity() - old_buf_size; + } + this.pad(align_size); + }; + _proto.pad = function pad(byte_size) { + for(var i = 0; i < byte_size; i++){ + this.bb.writeInt8(--this.space, 0); + } + }; + _proto.writeInt8 = function writeInt8(value) { + this.bb.writeInt8(this.space -= 1, value); + }; + _proto.writeInt16 = function writeInt16(value) { + this.bb.writeInt16(this.space -= 2, value); + }; + _proto.writeInt32 = function writeInt32(value) { + this.bb.writeInt32(this.space -= 4, value); + }; + _proto.writeInt64 = function writeInt64(value) { + this.bb.writeInt64(this.space -= 8, value); + }; + _proto.writeFloat32 = function writeFloat32(value) { + this.bb.writeFloat32(this.space -= 4, value); + }; + _proto.writeFloat64 = function writeFloat64(value) { + this.bb.writeFloat64(this.space -= 8, value); + }; + /** + * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary). + * @param value The `int8` to add the buffer. + */ _proto.addInt8 = function addInt8(value) { + this.prep(1, 0); + this.writeInt8(value); + }; + /** + * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary). + * @param value The `int16` to add the buffer. + */ _proto.addInt16 = function addInt16(value) { + this.prep(2, 0); + this.writeInt16(value); + }; + /** + * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary). + * @param value The `int32` to add the buffer. + */ _proto.addInt32 = function addInt32(value) { + this.prep(4, 0); + this.writeInt32(value); + }; + /** + * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary). + * @param value The `int64` to add the buffer. + */ _proto.addInt64 = function addInt64(value) { + this.prep(8, 0); + this.writeInt64(value); + }; + /** + * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary). + * @param value The `float32` to add the buffer. + */ _proto.addFloat32 = function addFloat32(value) { + this.prep(4, 0); + this.writeFloat32(value); + }; + /** + * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary). + * @param value The `float64` to add the buffer. + */ _proto.addFloat64 = function addFloat64(value) { + this.prep(8, 0); + this.writeFloat64(value); + }; + _proto.addFieldInt8 = function addFieldInt8(voffset, value, defaultValue) { + if (this.force_defaults || value != defaultValue) { + this.addInt8(value); + this.slot(voffset); + } + }; + _proto.addFieldInt16 = function addFieldInt16(voffset, value, defaultValue) { + if (this.force_defaults || value != defaultValue) { + this.addInt16(value); + this.slot(voffset); + } + }; + _proto.addFieldInt32 = function addFieldInt32(voffset, value, defaultValue) { + if (this.force_defaults || value != defaultValue) { + this.addInt32(value); + this.slot(voffset); + } + }; + _proto.addFieldInt64 = function addFieldInt64(voffset, value, defaultValue) { + if (this.force_defaults || value !== defaultValue) { + this.addInt64(value); + this.slot(voffset); + } + }; + _proto.addFieldFloat32 = function addFieldFloat32(voffset, value, defaultValue) { + if (this.force_defaults || value != defaultValue) { + this.addFloat32(value); + this.slot(voffset); + } + }; + _proto.addFieldFloat64 = function addFieldFloat64(voffset, value, defaultValue) { + if (this.force_defaults || value != defaultValue) { + this.addFloat64(value); + this.slot(voffset); + } + }; + _proto.addFieldOffset = function addFieldOffset(voffset, value, defaultValue) { + if (this.force_defaults || value != defaultValue) { + this.addOffset(value); + this.slot(voffset); + } + }; + /** + * Structs are stored inline, so nothing additional is being added. `d` is always 0. + */ _proto.addFieldStruct = function addFieldStruct(voffset, value, defaultValue) { + if (value != defaultValue) { + this.nested(value); + this.slot(voffset); + } + }; + /** + * Structures are always stored inline, they need to be created right + * where they're used. You'll get this assertion failure if you + * created it elsewhere. + */ _proto.nested = function nested(obj) { + if (obj != this.offset()) { + throw new TypeError("FlatBuffers: struct must be serialized inline."); + } + }; + /** + * Should not be creating any other object, string or vector + * while an object is being constructed + */ _proto.notNested = function notNested() { + if (this.isNested) { + throw new TypeError("FlatBuffers: object serialization must not be nested."); + } + }; + /** + * Set the current vtable at `voffset` to the current location in the buffer. + */ _proto.slot = function slot(voffset) { + if (this.vtable !== null) this.vtable[voffset] = this.offset(); + }; + /** + * @returns Offset relative to the end of the buffer. + */ _proto.offset = function offset() { + return this.bb.capacity() - this.space; + }; + /** + * Adds on offset, relative to where it will be written. + * + * @param offset The offset to add. + */ _proto.addOffset = function addOffset(offset) { + this.prep(SIZEOF_INT, 0); // Ensure alignment is already done. + this.writeInt32(this.offset() - offset + SIZEOF_INT); + }; + /** + * Start encoding a new object in the buffer. Users will not usually need to + * call this directly. The FlatBuffers compiler will generate helper methods + * that call this method internally. + */ _proto.startObject = function startObject(numfields) { + this.notNested(); + if (this.vtable == null) { + this.vtable = []; + } + this.vtable_in_use = numfields; + for(var i = 0; i < numfields; i++){ + this.vtable[i] = 0; // This will push additional elements as needed + } + this.isNested = true; + this.object_start = this.offset(); + }; + /** + * Finish off writing the object that is under construction. + * + * @returns The offset to the object inside `dataBuffer` + */ _proto.endObject = function endObject() { + if (this.vtable == null || !this.isNested) { + throw new Error("FlatBuffers: endObject called without startObject"); + } + this.addInt32(0); + var vtableloc = this.offset(); + // Trim trailing zeroes. + var i = this.vtable_in_use - 1; + // eslint-disable-next-line no-empty + for(; i >= 0 && this.vtable[i] == 0; i--){} + var trimmed_size = i + 1; + // Write out the current vtable. + for(; i >= 0; i--){ + // Offset relative to the start of the table. + this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0); + } + var standard_fields = 2; // The fields below: + this.addInt16(vtableloc - this.object_start); + var len = (trimmed_size + standard_fields) * SIZEOF_SHORT; + this.addInt16(len); + // Search for an existing vtable that matches the current one. + var existing_vtable = 0; + var vt1 = this.space; + outer_loop: for(i = 0; i < this.vtables.length; i++){ + var vt2 = this.bb.capacity() - this.vtables[i]; + if (len == this.bb.readInt16(vt2)) { + for(var j = SIZEOF_SHORT; j < len; j += SIZEOF_SHORT){ + if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) { + continue outer_loop; + } + } + existing_vtable = this.vtables[i]; + break; + } + } + if (existing_vtable) { + // Found a match: + // Remove the current vtable. + this.space = this.bb.capacity() - vtableloc; + // Point table to existing vtable. + this.bb.writeInt32(this.space, existing_vtable - vtableloc); + } else { + // No match: + // Add the location of the current vtable to the list of vtables. + this.vtables.push(this.offset()); + // Point table to current vtable. + this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc); + } + this.isNested = false; + return vtableloc; + }; + /** + * Finalize a buffer, poiting to the given `root_table`. + */ _proto.finish = function finish(root_table, opt_file_identifier, opt_size_prefix) { + var size_prefix = opt_size_prefix ? SIZE_PREFIX_LENGTH : 0; + if (opt_file_identifier) { + var file_identifier = opt_file_identifier; + this.prep(this.minalign, SIZEOF_INT + FILE_IDENTIFIER_LENGTH + size_prefix); + if (file_identifier.length != FILE_IDENTIFIER_LENGTH) { + throw new TypeError("FlatBuffers: file identifier must be length " + FILE_IDENTIFIER_LENGTH); + } + for(var i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--){ + this.writeInt8(file_identifier.charCodeAt(i)); + } + } + this.prep(this.minalign, SIZEOF_INT + size_prefix); + this.addOffset(root_table); + if (size_prefix) { + this.addInt32(this.bb.capacity() - this.space); + } + this.bb.setPosition(this.space); + }; + /** + * Finalize a size prefixed buffer, pointing to the given `root_table`. + */ _proto.finishSizePrefixed = function finishSizePrefixed(root_table, opt_file_identifier) { + this.finish(root_table, opt_file_identifier, true); + }; + /** + * This checks a required field has been set in a given table that has + * just been constructed. + */ _proto.requiredField = function requiredField(table, field) { + var table_start = this.bb.capacity() - table; + var vtable_start = table_start - this.bb.readInt32(table_start); + var ok = field < this.bb.readInt16(vtable_start) && this.bb.readInt16(vtable_start + field) != 0; + // If this fails, the caller will show what field needs to be set. + if (!ok) { + throw new TypeError("FlatBuffers: field " + field + " must be set"); + } + }; + /** + * Start a new array/vector of objects. Users usually will not call + * this directly. The FlatBuffers compiler will create a start/end + * method for vector types in generated code. + * + * @param elem_size The size of each element in the array + * @param num_elems The number of elements in the array + * @param alignment The alignment of the array + */ _proto.startVector = function startVector(elem_size, num_elems, alignment) { + this.notNested(); + this.vector_num_elems = num_elems; + this.prep(SIZEOF_INT, elem_size * num_elems); + this.prep(alignment, elem_size * num_elems); // Just in case alignment > int. + }; + /** + * Finish off the creation of an array and all its elements. The array must be + * created with `startVector`. + * + * @returns The offset at which the newly created array + * starts. + */ _proto.endVector = function endVector() { + this.writeInt32(this.vector_num_elems); + return this.offset(); + }; + /** + * Encode the string `s` in the buffer using UTF-8. If the string passed has + * already been seen, we return the offset of the already written string + * + * @param s The string to encode + * @return The offset in the buffer where the encoded string starts + */ _proto.createSharedString = function createSharedString(s) { + if (!s) { + return 0; + } + if (!this.string_maps) { + this.string_maps = new Map(); + } + if (this.string_maps.has(s)) { + return this.string_maps.get(s); + } + var offset = this.createString(s); + this.string_maps.set(s, offset); + return offset; + }; + /** + * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed + * instead of a string, it is assumed to contain valid UTF-8 encoded data. + * + * @param s The string to encode + * @return The offset in the buffer where the encoded string starts + */ _proto.createString = function createString(s) { + if (s === null || s === undefined) { + return 0; + } + var utf8; + if (_instanceof1(s, Uint8Array)) { + utf8 = s; + } else { + utf8 = this.text_encoder.encode(s); + } + this.addInt8(0); + this.startVector(1, utf8.length, 1); + this.bb.setPosition(this.space -= utf8.length); + this.bb.bytes().set(utf8, this.space); + return this.endVector(); + }; + /** + * Create a byte vector. + * + * @param v The bytes to add + * @returns The offset in the buffer where the byte vector starts + */ _proto.createByteVector = function createByteVector(v) { + if (v === null || v === undefined) { + return 0; + } + this.startVector(1, v.length, 1); + this.bb.setPosition(this.space -= v.length); + this.bb.bytes().set(v, this.space); + return this.endVector(); + }; + /** + * A helper function to pack an object + * + * @returns offset of obj + */ _proto.createObjectOffset = function createObjectOffset(obj) { + if (obj === null) { + return 0; + } + if (typeof obj === "string") { + return this.createString(obj); + } else { + return obj.pack(this); + } + }; + /** + * A helper function to pack a list of object + * + * @returns list of offsets of each non null object + */ _proto.createObjectOffsetList = function createObjectOffsetList(list) { + var ret = []; + for(var i = 0; i < list.length; ++i){ + var val = list[i]; + if (val !== null) { + ret.push(this.createObjectOffset(val)); + } else { + throw new TypeError("FlatBuffers: Argument for createObjectOffsetList cannot contain null."); + } + } + return ret; + }; + _proto.createStructOffsetList = function createStructOffsetList(list, startFunc) { + startFunc(this, list.length); + this.createObjectOffsetList(list.slice().reverse()); + return this.endVector(); + }; + /** + * Doubles the size of the backing ByteBuffer and copies the old data towards + * the end of the new buffer (since we build the buffer backwards). + * + * @param bb The current buffer with the existing data + * @returns A new byte buffer with the old data copied + * to it. The data is located at the end of the buffer. + * + * uint8Array.set() formally takes {Array|ArrayBufferView}, so to pass + * it a uint8Array we need to suppress the type check: + * @suppress {checkTypes} + */ Builder.growByteBuffer = function growByteBuffer(bb) { + var old_buf_size = bb.capacity(); + // Ensure we don't grow beyond what fits in an int. + if (old_buf_size & 0xC0000000) { + throw new Error("FlatBuffers: cannot grow buffer beyond 2 gigabytes."); + } + var new_buf_size = old_buf_size << 1; + var nbb = ByteBuffer.allocate(new_buf_size); + nbb.setPosition(new_buf_size - old_buf_size); + nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size); + return nbb; + }; + return Builder; +}(); + +// automatically generated by the FlatBuffers compiler, do not modify +var FBEffectsObjectData = /*#__PURE__*/ function() { + function FBEffectsObjectData() { + this.bb = null; + this.bb_pos = 0; + } + var _proto = FBEffectsObjectData.prototype; + _proto.__init = function __init(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; + }; + _proto.dataType = function dataType(optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null; + }; + _proto.data = function data(index) { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; + }; + _proto.dataLength = function dataLength() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.dataArray = function dataArray() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; + }; + _proto.unpack = function unpack() { + return new FBEffectsObjectDataT(this.dataType(), this.bb.createScalarList(this.data.bind(this), this.dataLength())); + }; + _proto.unpackTo = function unpackTo(_o) { + _o.dataType = this.dataType(); + _o.data = this.bb.createScalarList(this.data.bind(this), this.dataLength()); + }; + FBEffectsObjectData.getRootAsFBEffectsObjectData = function getRootAsFBEffectsObjectData(bb, obj) { + return (obj || new FBEffectsObjectData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBEffectsObjectData.getSizePrefixedRootAsFBEffectsObjectData = function getSizePrefixedRootAsFBEffectsObjectData(bb, obj) { + bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH); + return (obj || new FBEffectsObjectData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBEffectsObjectData.startFBEffectsObjectData = function startFBEffectsObjectData(builder) { + builder.startObject(2); + }; + FBEffectsObjectData.addDataType = function addDataType(builder, dataTypeOffset) { + builder.addFieldOffset(0, dataTypeOffset, 0); + }; + FBEffectsObjectData.addData = function addData(builder, dataOffset) { + builder.addFieldOffset(1, dataOffset, 0); + }; + FBEffectsObjectData.createDataVector = function createDataVector(builder, data) { + builder.startVector(1, data.length, 1); + for(var i = data.length - 1; i >= 0; i--){ + builder.addInt8(data[i]); + } + return builder.endVector(); + }; + FBEffectsObjectData.startDataVector = function startDataVector(builder, numElems) { + builder.startVector(1, numElems, 1); + }; + FBEffectsObjectData.endFBEffectsObjectData = function endFBEffectsObjectData(builder) { + var offset = builder.endObject(); + return offset; + }; + FBEffectsObjectData.createFBEffectsObjectData = function createFBEffectsObjectData(builder, dataTypeOffset, dataOffset) { + FBEffectsObjectData.startFBEffectsObjectData(builder); + FBEffectsObjectData.addDataType(builder, dataTypeOffset); + FBEffectsObjectData.addData(builder, dataOffset); + return FBEffectsObjectData.endFBEffectsObjectData(builder); + }; + return FBEffectsObjectData; +}(); +var FBEffectsObjectDataT = /*#__PURE__*/ function() { + function FBEffectsObjectDataT(dataType, data) { + if (dataType === void 0) dataType = null; + if (data === void 0) data = []; + this.dataType = dataType; + this.data = data; + } + var _proto = FBEffectsObjectDataT.prototype; + _proto.pack = function pack(builder) { + var dataType = this.dataType !== null ? builder.createString(this.dataType) : 0; + var data = FBEffectsObjectData.createDataVector(builder, this.data); + return FBEffectsObjectData.createFBEffectsObjectData(builder, dataType, data); + }; + return FBEffectsObjectDataT; +}(); + +// automatically generated by the FlatBuffers compiler, do not modify +var FBEffectsPackageData = /*#__PURE__*/ function() { + function FBEffectsPackageData() { + this.bb = null; + this.bb_pos = 0; + } + var _proto = FBEffectsPackageData.prototype; + _proto.__init = function __init(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; + }; + _proto.exportObjects = function exportObjects(index, obj) { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? (obj || new FBEffectsObjectData()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null; + }; + _proto.exportObjectsLength = function exportObjectsLength() { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.unpack = function unpack() { + return new FBEffectsPackageDataT(this.bb.createObjList(this.exportObjects.bind(this), this.exportObjectsLength())); + }; + _proto.unpackTo = function unpackTo(_o) { + _o.exportObjects = this.bb.createObjList(this.exportObjects.bind(this), this.exportObjectsLength()); + }; + FBEffectsPackageData.getRootAsFBEffectsPackageData = function getRootAsFBEffectsPackageData(bb, obj) { + return (obj || new FBEffectsPackageData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBEffectsPackageData.getSizePrefixedRootAsFBEffectsPackageData = function getSizePrefixedRootAsFBEffectsPackageData(bb, obj) { + bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH); + return (obj || new FBEffectsPackageData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBEffectsPackageData.startFBEffectsPackageData = function startFBEffectsPackageData(builder) { + builder.startObject(1); + }; + FBEffectsPackageData.addExportObjects = function addExportObjects(builder, exportObjectsOffset) { + builder.addFieldOffset(0, exportObjectsOffset, 0); + }; + FBEffectsPackageData.createExportObjectsVector = function createExportObjectsVector(builder, data) { + builder.startVector(4, data.length, 4); + for(var i = data.length - 1; i >= 0; i--){ + builder.addOffset(data[i]); + } + return builder.endVector(); + }; + FBEffectsPackageData.startExportObjectsVector = function startExportObjectsVector(builder, numElems) { + builder.startVector(4, numElems, 4); + }; + FBEffectsPackageData.endFBEffectsPackageData = function endFBEffectsPackageData(builder) { + var offset = builder.endObject(); + return offset; + }; + FBEffectsPackageData.finishFBEffectsPackageDataBuffer = function finishFBEffectsPackageDataBuffer(builder, offset) { + builder.finish(offset); + }; + FBEffectsPackageData.finishSizePrefixedFBEffectsPackageDataBuffer = function finishSizePrefixedFBEffectsPackageDataBuffer(builder, offset) { + builder.finish(offset, undefined, true); + }; + FBEffectsPackageData.createFBEffectsPackageData = function createFBEffectsPackageData(builder, exportObjectsOffset) { + FBEffectsPackageData.startFBEffectsPackageData(builder); + FBEffectsPackageData.addExportObjects(builder, exportObjectsOffset); + return FBEffectsPackageData.endFBEffectsPackageData(builder); + }; + return FBEffectsPackageData; +}(); +var FBEffectsPackageDataT = /*#__PURE__*/ function() { + function FBEffectsPackageDataT(exportObjects) { + if (exportObjects === void 0) exportObjects = []; + this.exportObjects = exportObjects; + } + var _proto = FBEffectsPackageDataT.prototype; + _proto.pack = function pack(builder) { + var exportObjects = FBEffectsPackageData.createExportObjectsVector(builder, builder.createObjectOffsetList(this.exportObjects)); + return FBEffectsPackageData.createFBEffectsPackageData(builder, exportObjects); + }; + return FBEffectsPackageDataT; +}(); + +// automatically generated by the FlatBuffers compiler, do not modify +var FBSubMesh = /*#__PURE__*/ function() { + function FBSubMesh() { + this.bb = null; + this.bb_pos = 0; + } + var _proto = FBSubMesh.prototype; + _proto.__init = function __init(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; + }; + _proto.offset = function offset() { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.indexCount = function indexCount() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.vertexCount = function vertexCount() { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.unpack = function unpack() { + return new FBSubMeshT(this.offset(), this.indexCount(), this.vertexCount()); + }; + _proto.unpackTo = function unpackTo(_o) { + _o.offset = this.offset(); + _o.indexCount = this.indexCount(); + _o.vertexCount = this.vertexCount(); + }; + FBSubMesh.getRootAsFBSubMesh = function getRootAsFBSubMesh(bb, obj) { + return (obj || new FBSubMesh()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBSubMesh.getSizePrefixedRootAsFBSubMesh = function getSizePrefixedRootAsFBSubMesh(bb, obj) { + bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH); + return (obj || new FBSubMesh()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBSubMesh.startFBSubMesh = function startFBSubMesh(builder) { + builder.startObject(3); + }; + FBSubMesh.addOffset = function addOffset(builder, offset) { + builder.addFieldInt32(0, offset, 0); + }; + FBSubMesh.addIndexCount = function addIndexCount(builder, indexCount) { + builder.addFieldInt32(1, indexCount, 0); + }; + FBSubMesh.addVertexCount = function addVertexCount(builder, vertexCount) { + builder.addFieldInt32(2, vertexCount, 0); + }; + FBSubMesh.endFBSubMesh = function endFBSubMesh(builder) { + var offset = builder.endObject(); + return offset; + }; + FBSubMesh.createFBSubMesh = function createFBSubMesh(builder, offset, indexCount, vertexCount) { + FBSubMesh.startFBSubMesh(builder); + FBSubMesh.addOffset(builder, offset); + FBSubMesh.addIndexCount(builder, indexCount); + FBSubMesh.addVertexCount(builder, vertexCount); + return FBSubMesh.endFBSubMesh(builder); + }; + return FBSubMesh; +}(); +var FBSubMeshT = /*#__PURE__*/ function() { + function FBSubMeshT(offset, indexCount, vertexCount) { + if (offset === void 0) offset = 0; + if (indexCount === void 0) indexCount = 0; + if (vertexCount === void 0) vertexCount = 0; + this.offset = offset; + this.indexCount = indexCount; + this.vertexCount = vertexCount; + } + var _proto = FBSubMeshT.prototype; + _proto.pack = function pack(builder) { + return FBSubMesh.createFBSubMesh(builder, this.offset, this.indexCount, this.vertexCount); + }; + return FBSubMeshT; +}(); + +// automatically generated by the FlatBuffers compiler, do not modify +var FBVertexChannel = /*#__PURE__*/ function() { + function FBVertexChannel() { + this.bb = null; + this.bb_pos = 0; + } + var _proto = FBVertexChannel.prototype; + _proto.__init = function __init(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; + }; + _proto.semantic = function semantic(optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null; + }; + _proto.offset = function offset() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.format = function format() { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.dimension = function dimension() { + var offset = this.bb.__offset(this.bb_pos, 10); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.normalize = function normalize() { + var offset = this.bb.__offset(this.bb_pos, 12); + return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false; + }; + _proto.unpack = function unpack() { + return new FBVertexChannelT(this.semantic(), this.offset(), this.format(), this.dimension(), this.normalize()); + }; + _proto.unpackTo = function unpackTo(_o) { + _o.semantic = this.semantic(); + _o.offset = this.offset(); + _o.format = this.format(); + _o.dimension = this.dimension(); + _o.normalize = this.normalize(); + }; + FBVertexChannel.getRootAsFBVertexChannel = function getRootAsFBVertexChannel(bb, obj) { + return (obj || new FBVertexChannel()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBVertexChannel.getSizePrefixedRootAsFBVertexChannel = function getSizePrefixedRootAsFBVertexChannel(bb, obj) { + bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH); + return (obj || new FBVertexChannel()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBVertexChannel.startFBVertexChannel = function startFBVertexChannel(builder) { + builder.startObject(5); + }; + FBVertexChannel.addSemantic = function addSemantic(builder, semanticOffset) { + builder.addFieldOffset(0, semanticOffset, 0); + }; + FBVertexChannel.addOffset = function addOffset(builder, offset) { + builder.addFieldInt32(1, offset, 0); + }; + FBVertexChannel.addFormat = function addFormat(builder, format) { + builder.addFieldInt32(2, format, 0); + }; + FBVertexChannel.addDimension = function addDimension(builder, dimension) { + builder.addFieldInt32(3, dimension, 0); + }; + FBVertexChannel.addNormalize = function addNormalize(builder, normalize) { + builder.addFieldInt8(4, +normalize, +false); + }; + FBVertexChannel.endFBVertexChannel = function endFBVertexChannel(builder) { + var offset = builder.endObject(); + return offset; + }; + FBVertexChannel.createFBVertexChannel = function createFBVertexChannel(builder, semanticOffset, offset, format, dimension, normalize) { + FBVertexChannel.startFBVertexChannel(builder); + FBVertexChannel.addSemantic(builder, semanticOffset); + FBVertexChannel.addOffset(builder, offset); + FBVertexChannel.addFormat(builder, format); + FBVertexChannel.addDimension(builder, dimension); + FBVertexChannel.addNormalize(builder, normalize); + return FBVertexChannel.endFBVertexChannel(builder); + }; + return FBVertexChannel; +}(); +var FBVertexChannelT = /*#__PURE__*/ function() { + function FBVertexChannelT(semantic, offset, format, dimension, normalize) { + if (semantic === void 0) semantic = null; + if (offset === void 0) offset = 0; + if (format === void 0) format = 0; + if (dimension === void 0) dimension = 0; + if (normalize === void 0) normalize = false; + this.semantic = semantic; + this.offset = offset; + this.format = format; + this.dimension = dimension; + this.normalize = normalize; + } + var _proto = FBVertexChannelT.prototype; + _proto.pack = function pack(builder) { + var semantic = this.semantic !== null ? builder.createString(this.semantic) : 0; + return FBVertexChannel.createFBVertexChannel(builder, semantic, this.offset, this.format, this.dimension, this.normalize); + }; + return FBVertexChannelT; +}(); + +// automatically generated by the FlatBuffers compiler, do not modify +var FBVertexData = /*#__PURE__*/ function() { + function FBVertexData() { + this.bb = null; + this.bb_pos = 0; + } + var _proto = FBVertexData.prototype; + _proto.__init = function __init(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; + }; + _proto.vertexCount = function vertexCount() { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.channels = function channels(index, obj) { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? (obj || new FBVertexChannel()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null; + }; + _proto.channelsLength = function channelsLength() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.unpack = function unpack() { + return new FBVertexDataT(this.vertexCount(), this.bb.createObjList(this.channels.bind(this), this.channelsLength())); + }; + _proto.unpackTo = function unpackTo(_o) { + _o.vertexCount = this.vertexCount(); + _o.channels = this.bb.createObjList(this.channels.bind(this), this.channelsLength()); + }; + FBVertexData.getRootAsFBVertexData = function getRootAsFBVertexData(bb, obj) { + return (obj || new FBVertexData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBVertexData.getSizePrefixedRootAsFBVertexData = function getSizePrefixedRootAsFBVertexData(bb, obj) { + bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH); + return (obj || new FBVertexData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBVertexData.startFBVertexData = function startFBVertexData(builder) { + builder.startObject(2); + }; + FBVertexData.addVertexCount = function addVertexCount(builder, vertexCount) { + builder.addFieldInt32(0, vertexCount, 0); + }; + FBVertexData.addChannels = function addChannels(builder, channelsOffset) { + builder.addFieldOffset(1, channelsOffset, 0); + }; + FBVertexData.createChannelsVector = function createChannelsVector(builder, data) { + builder.startVector(4, data.length, 4); + for(var i = data.length - 1; i >= 0; i--){ + builder.addOffset(data[i]); + } + return builder.endVector(); + }; + FBVertexData.startChannelsVector = function startChannelsVector(builder, numElems) { + builder.startVector(4, numElems, 4); + }; + FBVertexData.endFBVertexData = function endFBVertexData(builder) { + var offset = builder.endObject(); + return offset; + }; + FBVertexData.createFBVertexData = function createFBVertexData(builder, vertexCount, channelsOffset) { + FBVertexData.startFBVertexData(builder); + FBVertexData.addVertexCount(builder, vertexCount); + FBVertexData.addChannels(builder, channelsOffset); + return FBVertexData.endFBVertexData(builder); + }; + return FBVertexData; +}(); +var FBVertexDataT = /*#__PURE__*/ function() { + function FBVertexDataT(vertexCount, channels) { + if (vertexCount === void 0) vertexCount = 0; + if (channels === void 0) channels = []; + this.vertexCount = vertexCount; + this.channels = channels; + } + var _proto = FBVertexDataT.prototype; + _proto.pack = function pack(builder) { + var channels = FBVertexData.createChannelsVector(builder, builder.createObjectOffsetList(this.channels)); + return FBVertexData.createFBVertexData(builder, this.vertexCount, channels); + }; + return FBVertexDataT; +}(); + +// automatically generated by the FlatBuffers compiler, do not modify +var FBGeometryData = /*#__PURE__*/ function() { + function FBGeometryData() { + this.bb = null; + this.bb_pos = 0; + } + var _proto = FBGeometryData.prototype; + _proto.__init = function __init(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; + }; + _proto.id = function id(optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null; + }; + _proto.name = function name(optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null; + }; + _proto.vertexData = function vertexData(obj) { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? (obj || new FBVertexData()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null; + }; + _proto.indexFormat = function indexFormat() { + var offset = this.bb.__offset(this.bb_pos, 10); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.indexOffset = function indexOffset() { + var offset = this.bb.__offset(this.bb_pos, 12); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.subMeshes = function subMeshes(index, obj) { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? (obj || new FBSubMesh()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null; + }; + _proto.subMeshesLength = function subMeshesLength() { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.mode = function mode() { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? this.bb.readInt32(this.bb_pos + offset) : 0; + }; + _proto.buffer = function buffer(optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null; + }; + _proto.binaryData = function binaryData(index) { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; + }; + _proto.binaryDataLength = function binaryDataLength() { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.binaryDataArray = function binaryDataArray() { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; + }; + _proto.boneNames = function boneNames(index, optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null; + }; + _proto.boneNamesLength = function boneNamesLength() { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.rootBoneName = function rootBoneName(optionalEncoding) { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null; + }; + _proto.inverseBindMatrices = function inverseBindMatrices(index) { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? this.bb.readFloat32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; + }; + _proto.inverseBindMatricesLength = function inverseBindMatricesLength() { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; + }; + _proto.inverseBindMatricesArray = function inverseBindMatricesArray() { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? new Float32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; + }; + _proto.unpack = function unpack() { + return new FBGeometryDataT(this.id(), this.name(), this.vertexData() !== null ? this.vertexData().unpack() : null, this.indexFormat(), this.indexOffset(), this.bb.createObjList(this.subMeshes.bind(this), this.subMeshesLength()), this.mode(), this.buffer(), this.bb.createScalarList(this.binaryData.bind(this), this.binaryDataLength()), this.bb.createScalarList(this.boneNames.bind(this), this.boneNamesLength()), this.rootBoneName(), this.bb.createScalarList(this.inverseBindMatrices.bind(this), this.inverseBindMatricesLength())); + }; + _proto.unpackTo = function unpackTo(_o) { + _o.id = this.id(); + _o.name = this.name(); + _o.vertexData = this.vertexData() !== null ? this.vertexData().unpack() : null; + _o.indexFormat = this.indexFormat(); + _o.indexOffset = this.indexOffset(); + _o.subMeshes = this.bb.createObjList(this.subMeshes.bind(this), this.subMeshesLength()); + _o.mode = this.mode(); + _o.buffer = this.buffer(); + _o.binaryData = this.bb.createScalarList(this.binaryData.bind(this), this.binaryDataLength()); + _o.boneNames = this.bb.createScalarList(this.boneNames.bind(this), this.boneNamesLength()); + _o.rootBoneName = this.rootBoneName(); + _o.inverseBindMatrices = this.bb.createScalarList(this.inverseBindMatrices.bind(this), this.inverseBindMatricesLength()); + }; + FBGeometryData.getRootAsFBGeometryData = function getRootAsFBGeometryData(bb, obj) { + return (obj || new FBGeometryData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBGeometryData.getSizePrefixedRootAsFBGeometryData = function getSizePrefixedRootAsFBGeometryData(bb, obj) { + bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH); + return (obj || new FBGeometryData()).__init(bb.readInt32(bb.position()) + bb.position(), bb); + }; + FBGeometryData.startFBGeometryData = function startFBGeometryData(builder) { + builder.startObject(12); + }; + FBGeometryData.addId = function addId(builder, idOffset) { + builder.addFieldOffset(0, idOffset, 0); + }; + FBGeometryData.addName = function addName(builder, nameOffset) { + builder.addFieldOffset(1, nameOffset, 0); + }; + FBGeometryData.addVertexData = function addVertexData(builder, vertexDataOffset) { + builder.addFieldOffset(2, vertexDataOffset, 0); + }; + FBGeometryData.addIndexFormat = function addIndexFormat(builder, indexFormat) { + builder.addFieldInt32(3, indexFormat, 0); + }; + FBGeometryData.addIndexOffset = function addIndexOffset(builder, indexOffset) { + builder.addFieldInt32(4, indexOffset, 0); + }; + FBGeometryData.addSubMeshes = function addSubMeshes(builder, subMeshesOffset) { + builder.addFieldOffset(5, subMeshesOffset, 0); + }; + FBGeometryData.createSubMeshesVector = function createSubMeshesVector(builder, data) { + builder.startVector(4, data.length, 4); + for(var i = data.length - 1; i >= 0; i--){ + builder.addOffset(data[i]); + } + return builder.endVector(); + }; + FBGeometryData.startSubMeshesVector = function startSubMeshesVector(builder, numElems) { + builder.startVector(4, numElems, 4); + }; + FBGeometryData.addMode = function addMode(builder, mode) { + builder.addFieldInt32(6, mode, 0); + }; + FBGeometryData.addBuffer = function addBuffer(builder, bufferOffset) { + builder.addFieldOffset(7, bufferOffset, 0); + }; + FBGeometryData.addBinaryData = function addBinaryData(builder, binaryDataOffset) { + builder.addFieldOffset(8, binaryDataOffset, 0); + }; + FBGeometryData.createBinaryDataVector = function createBinaryDataVector(builder, data) { + builder.startVector(1, data.length, 1); + for(var i = data.length - 1; i >= 0; i--){ + builder.addInt8(data[i]); + } + return builder.endVector(); + }; + FBGeometryData.startBinaryDataVector = function startBinaryDataVector(builder, numElems) { + builder.startVector(1, numElems, 1); + }; + FBGeometryData.addBoneNames = function addBoneNames(builder, boneNamesOffset) { + builder.addFieldOffset(9, boneNamesOffset, 0); + }; + FBGeometryData.createBoneNamesVector = function createBoneNamesVector(builder, data) { + builder.startVector(4, data.length, 4); + for(var i = data.length - 1; i >= 0; i--){ + builder.addOffset(data[i]); + } + return builder.endVector(); + }; + FBGeometryData.startBoneNamesVector = function startBoneNamesVector(builder, numElems) { + builder.startVector(4, numElems, 4); + }; + FBGeometryData.addRootBoneName = function addRootBoneName(builder, rootBoneNameOffset) { + builder.addFieldOffset(10, rootBoneNameOffset, 0); + }; + FBGeometryData.addInverseBindMatrices = function addInverseBindMatrices(builder, inverseBindMatricesOffset) { + builder.addFieldOffset(11, inverseBindMatricesOffset, 0); + }; + FBGeometryData.createInverseBindMatricesVector = function createInverseBindMatricesVector(builder, data) { + builder.startVector(4, data.length, 4); + for(var i = data.length - 1; i >= 0; i--){ + builder.addFloat32(data[i]); + } + return builder.endVector(); + }; + FBGeometryData.startInverseBindMatricesVector = function startInverseBindMatricesVector(builder, numElems) { + builder.startVector(4, numElems, 4); + }; + FBGeometryData.endFBGeometryData = function endFBGeometryData(builder) { + var offset = builder.endObject(); + return offset; + }; + return FBGeometryData; +}(); +var FBGeometryDataT = /*#__PURE__*/ function() { + function FBGeometryDataT(id, name, vertexData, indexFormat, indexOffset, subMeshes, mode, buffer, binaryData, boneNames, rootBoneName, inverseBindMatrices) { + if (id === void 0) id = null; + if (name === void 0) name = null; + if (vertexData === void 0) vertexData = null; + if (indexFormat === void 0) indexFormat = 0; + if (indexOffset === void 0) indexOffset = 0; + if (subMeshes === void 0) subMeshes = []; + if (mode === void 0) mode = 0; + if (buffer === void 0) buffer = null; + if (binaryData === void 0) binaryData = []; + if (boneNames === void 0) boneNames = []; + if (rootBoneName === void 0) rootBoneName = null; + if (inverseBindMatrices === void 0) inverseBindMatrices = []; + this.id = id; + this.name = name; + this.vertexData = vertexData; + this.indexFormat = indexFormat; + this.indexOffset = indexOffset; + this.subMeshes = subMeshes; + this.mode = mode; + this.buffer = buffer; + this.binaryData = binaryData; + this.boneNames = boneNames; + this.rootBoneName = rootBoneName; + this.inverseBindMatrices = inverseBindMatrices; + } + var _proto = FBGeometryDataT.prototype; + _proto.pack = function pack(builder) { + var id = this.id !== null ? builder.createString(this.id) : 0; + var name = this.name !== null ? builder.createString(this.name) : 0; + var vertexData = this.vertexData !== null ? this.vertexData.pack(builder) : 0; + var subMeshes = FBGeometryData.createSubMeshesVector(builder, builder.createObjectOffsetList(this.subMeshes)); + var buffer = this.buffer !== null ? builder.createString(this.buffer) : 0; + var binaryData = FBGeometryData.createBinaryDataVector(builder, this.binaryData); + var boneNames = FBGeometryData.createBoneNamesVector(builder, builder.createObjectOffsetList(this.boneNames)); + var rootBoneName = this.rootBoneName !== null ? builder.createString(this.rootBoneName) : 0; + var inverseBindMatrices = FBGeometryData.createInverseBindMatricesVector(builder, this.inverseBindMatrices); + FBGeometryData.startFBGeometryData(builder); + FBGeometryData.addId(builder, id); + FBGeometryData.addName(builder, name); + FBGeometryData.addVertexData(builder, vertexData); + FBGeometryData.addIndexFormat(builder, this.indexFormat); + FBGeometryData.addIndexOffset(builder, this.indexOffset); + FBGeometryData.addSubMeshes(builder, subMeshes); + FBGeometryData.addMode(builder, this.mode); + FBGeometryData.addBuffer(builder, buffer); + FBGeometryData.addBinaryData(builder, binaryData); + FBGeometryData.addBoneNames(builder, boneNames); + FBGeometryData.addRootBoneName(builder, rootBoneName); + FBGeometryData.addInverseBindMatrices(builder, inverseBindMatrices); + return FBGeometryData.endFBGeometryData(builder); + }; + return FBGeometryDataT; +}(); + +/** + * @since 2.0.0 + */ var EffectsPackage = /*#__PURE__*/ function() { + function EffectsPackage() { + this.exportObjectDatas = []; + } + var _proto = EffectsPackage.prototype; + _proto.addData = function addData(effectsObjectData) { + this.exportObjectDatas.push(effectsObjectData); + }; + _proto.serializeToBinary = function serializeToBinary() { + var fbb = new Builder(1); + var effectsPackage = new FBEffectsPackageDataT(); + var exportObjects = []; + for(var _iterator = _create_for_of_iterator_helper_loose(this.exportObjectDatas), _step; !(_step = _iterator()).done;){ + var effectsObjectData = _step.value; + var fbEffectsObjectData = void 0; + if (effectsObjectData.dataType === DataType.Geometry) { + fbEffectsObjectData = new FBEffectsObjectDataT("Geometry", this.geometryDataToBinary(effectsObjectData)); + } + if (!fbEffectsObjectData) { + continue; + } + exportObjects.push(fbEffectsObjectData); + } + effectsPackage.exportObjects = exportObjects; + FBEffectsPackageData.finishFBEffectsPackageDataBuffer(fbb, effectsPackage.pack(fbb)); + return fbb.asUint8Array(); // Of type `Uint8Array`. + }; + _proto.deserializeFromBinary = function deserializeFromBinary(buffer) { + var buf = new ByteBuffer(buffer); + var fbEffectsPackage = FBEffectsPackageData.getRootAsFBEffectsPackageData(buf); + for(var i = 0; i < fbEffectsPackage.exportObjectsLength(); i++){ + var fbEffectsObjectData = fbEffectsPackage.exportObjects(i); + if (!fbEffectsObjectData) { + continue; + } + var dataBuffer = fbEffectsObjectData.dataArray(); + var dataType = fbEffectsObjectData.dataType(); + if (!dataBuffer) { + continue; + } + var effectsObjectData = void 0; + if (dataType === DataType.Geometry) { + effectsObjectData = this.binaryToGeometryData(dataBuffer); + } + if (!effectsObjectData) { + continue; + } + this.exportObjectDatas.push(effectsObjectData); + } + }; + _proto.geometryDataToBinary = function geometryDataToBinary(geometryData) { + var fbb = new Builder(1); + var fbGeometryData = new FBGeometryDataT(); + var indexFormat = geometryData.indexFormat, indexOffset = geometryData.indexOffset, mode = geometryData.mode, id = geometryData.id, vertexData = geometryData.vertexData, _geometryData_boneNames = geometryData.boneNames, boneNames = _geometryData_boneNames === void 0 ? [] : _geometryData_boneNames, _geometryData_rootBoneName = geometryData.rootBoneName, rootBoneName = _geometryData_rootBoneName === void 0 ? "" : _geometryData_rootBoneName, _geometryData_inverseBindMatrices = geometryData.inverseBindMatrices, inverseBindMatrices = _geometryData_inverseBindMatrices === void 0 ? [] : _geometryData_inverseBindMatrices, _geometryData_binaryData = geometryData.binaryData, binaryData = _geometryData_binaryData === void 0 ? [] : _geometryData_binaryData; + fbGeometryData.indexFormat = indexFormat; + fbGeometryData.indexOffset = indexOffset; + fbGeometryData.mode = mode; + fbGeometryData.id = id; + fbGeometryData.boneNames = boneNames; + fbGeometryData.rootBoneName = rootBoneName; + fbGeometryData.inverseBindMatrices = inverseBindMatrices; + fbGeometryData.binaryData = binaryData; + var fbVertexdata = new FBVertexDataT(); + fbVertexdata.vertexCount = vertexData.vertexCount; + fbVertexdata.channels = []; + for(var _iterator = _create_for_of_iterator_helper_loose(vertexData.channels), _step; !(_step = _iterator()).done;){ + var channel = _step.value; + var semantic = channel.semantic, offset = channel.offset, format = channel.format, dimension = channel.dimension, normalize = channel.normalize; + var fbChannel = new FBVertexChannelT(semantic, offset, format, dimension, normalize); + fbVertexdata.channels.push(fbChannel); + } + fbGeometryData.vertexData = fbVertexdata; + var fbSubMeshes = []; + for(var _iterator1 = _create_for_of_iterator_helper_loose(geometryData.subMeshes), _step1; !(_step1 = _iterator1()).done;){ + var subMesh = _step1.value; + var offset1 = subMesh.offset, indexCount = subMesh.indexCount, vertexCount = subMesh.vertexCount; + var fbSubMesh = new FBSubMeshT(offset1, indexCount, vertexCount); + fbSubMeshes.push(fbSubMesh); + } + fbGeometryData.subMeshes = fbSubMeshes; + FBEffectsPackageData.finishFBEffectsPackageDataBuffer(fbb, fbGeometryData.pack(fbb)); + return fbb.asUint8Array(); // Of type `Uint8Array`. + }; + _proto.binaryToGeometryData = function binaryToGeometryData(buffer) { + var buf = new ByteBuffer(buffer); + var fbGeometryData = FBGeometryData.getRootAsFBGeometryData(buf); + var vertexData = { + vertexCount: 0, + channels: [] + }; + var fbVertexData = fbGeometryData.vertexData(); + if (fbVertexData) { + vertexData.vertexCount = fbVertexData.vertexCount(); + for(var i = 0; i < fbVertexData.channelsLength(); i++){ + var channel = fbVertexData.channels(i); + if (!channel) { + continue; + } + var _channel_semantic; + var vertexChannel = { + semantic: (_channel_semantic = channel.semantic()) != null ? _channel_semantic : "", + offset: channel.offset(), + format: channel.format(), + dimension: channel.dimension(), + normalize: channel.normalize() + }; + vertexData.channels.push(vertexChannel); + } + } + var subMeshes = []; + for(var i1 = 0; i1 < fbGeometryData.subMeshesLength(); i1++){ + var fbSubMesh = fbGeometryData.subMeshes(i1); + if (!fbSubMesh) { + continue; + } + var subMesh = { + offset: fbSubMesh.offset(), + vertexCount: fbSubMesh.vertexCount(), + indexCount: fbSubMesh.indexCount() + }; + subMeshes.push(subMesh); + } + var boneNames = []; + for(var i2 = 0; i2 < fbGeometryData.boneNamesLength(); i2++){ + var boneName = fbGeometryData.boneNames(i2); + boneNames.push(boneName); + } + var inverseBindMatricesArray = fbGeometryData.inverseBindMatricesArray(); + var _fbGeometryData_buffer, _fbGeometryData_rootBoneName, _fbGeometryData_binaryDataArray, _fbGeometryData_id; + var geometryData = { + vertexData: vertexData, + indexFormat: fbGeometryData.indexFormat(), + indexOffset: fbGeometryData.indexOffset(), + subMeshes: subMeshes, + mode: fbGeometryData.mode(), + buffer: (_fbGeometryData_buffer = fbGeometryData.buffer()) != null ? _fbGeometryData_buffer : "", + boneNames: boneNames, + rootBoneName: (_fbGeometryData_rootBoneName = fbGeometryData.rootBoneName()) != null ? _fbGeometryData_rootBoneName : "", + inverseBindMatrices: inverseBindMatricesArray ? Array.from(inverseBindMatricesArray) : undefined, + binaryData: (_fbGeometryData_binaryDataArray = fbGeometryData.binaryDataArray()) != null ? _fbGeometryData_binaryDataArray : undefined, + id: (_fbGeometryData_id = fbGeometryData.id()) != null ? _fbGeometryData_id : "", + dataType: DataType.Geometry + }; + return geometryData; + }; + return EffectsPackage; +}(); + +/** + * Engine 基类,负责维护所有 GPU 资源的管理及销毁 + */ var Engine = /*#__PURE__*/ function() { + function Engine() { + /** + * 渲染过程中错误队列 + */ this.renderErrors = new Set(); + this.destroyed = false; + this.textures = []; + this.materials = []; + this.geometries = []; + this.meshes = []; + this.renderPasses = []; + this.jsonSceneData = {}; + this.objectInstance = {}; + this.assetLoader = new AssetLoader(this); + this.emptyTexture = generateWhiteTexture(this); + this.transparentTexture = generateTransparentTexture(this); + } + var _proto = Engine.prototype; + _proto.clearResources = function clearResources() { + this.jsonSceneData = {}; + this.objectInstance = {}; + }; + _proto.addEffectsObjectData = function addEffectsObjectData(data) { + this.jsonSceneData[data.id] = data; + }; + _proto.findEffectsObjectData = function findEffectsObjectData(uuid) { + return this.jsonSceneData[uuid]; + }; + _proto.addInstance = function addInstance(effectsObject) { + this.objectInstance[effectsObject.getInstanceId()] = effectsObject; + }; + /** + * @ignore + */ _proto.findObject = function findObject(guid) { + // 编辑器可能传 Class 对象,这边判断处理一下直接返回原对象。 + if (!(isObject(guid) && guid.constructor === Object)) { + return guid; + } + if (this.objectInstance[guid.id]) { + return this.objectInstance[guid.id]; + } + var result = this.assetLoader.loadGUID(guid); + return result; + }; + _proto.removeInstance = function removeInstance(id) { + delete this.objectInstance[id]; + }; + _proto.addPackageDatas = function addPackageDatas(scene) { + var jsonScene = scene.jsonScene, _scene_textureOptions = scene.textureOptions, textureOptions = _scene_textureOptions === void 0 ? [] : _scene_textureOptions; + var _jsonScene_items = jsonScene.items, items = _jsonScene_items === void 0 ? [] : _jsonScene_items, _jsonScene_materials = jsonScene.materials, materials = _jsonScene_materials === void 0 ? [] : _jsonScene_materials, _jsonScene_shaders = jsonScene.shaders, shaders = _jsonScene_shaders === void 0 ? [] : _jsonScene_shaders, _jsonScene_geometries = jsonScene.geometries, geometries = _jsonScene_geometries === void 0 ? [] : _jsonScene_geometries, _jsonScene_components = jsonScene.components, components = _jsonScene_components === void 0 ? [] : _jsonScene_components, _jsonScene_animations = jsonScene.animations, animations = _jsonScene_animations === void 0 ? [] : _jsonScene_animations, _jsonScene_bins = jsonScene.bins, bins = _jsonScene_bins === void 0 ? [] : _jsonScene_bins, _jsonScene_miscs = jsonScene.miscs, miscs = _jsonScene_miscs === void 0 ? [] : _jsonScene_miscs, compositions = jsonScene.compositions; + for(var _iterator = _create_for_of_iterator_helper_loose(compositions), _step; !(_step = _iterator()).done;){ + var compositionData = _step.value; + this.addEffectsObjectData(compositionData); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(items), _step1; !(_step1 = _iterator1()).done;){ + var vfxItemData = _step1.value; + if (!passRenderLevel(vfxItemData.renderLevel, scene.renderLevel)) { + vfxItemData.components = []; + vfxItemData.type = ItemType.null; + } + this.addEffectsObjectData(vfxItemData); + } + for(var _iterator2 = _create_for_of_iterator_helper_loose(materials), _step2; !(_step2 = _iterator2()).done;){ + var materialData = _step2.value; + this.addEffectsObjectData(materialData); + } + for(var _iterator3 = _create_for_of_iterator_helper_loose(shaders), _step3; !(_step3 = _iterator3()).done;){ + var shaderData = _step3.value; + this.addEffectsObjectData(shaderData); + } + for(var _iterator4 = _create_for_of_iterator_helper_loose(geometries), _step4; !(_step4 = _iterator4()).done;){ + var geometryData = _step4.value; + this.addEffectsObjectData(geometryData); + } + for(var _iterator5 = _create_for_of_iterator_helper_loose(components), _step5; !(_step5 = _iterator5()).done;){ + var componentData = _step5.value; + this.addEffectsObjectData(componentData); + } + for(var _iterator6 = _create_for_of_iterator_helper_loose(animations), _step6; !(_step6 = _iterator6()).done;){ + var animationData = _step6.value; + this.addEffectsObjectData(animationData); + } + for(var _iterator7 = _create_for_of_iterator_helper_loose(miscs), _step7; !(_step7 = _iterator7()).done;){ + var miscData = _step7.value; + this.addEffectsObjectData(miscData); + } + for(var i = 0; i < bins.length; i++){ + var binaryData = bins[i]; + var binaryBuffer = scene.bins[i]; + if (binaryData.dataType === DataType.BinaryAsset) { + //@ts-expect-error + binaryData.buffer = binaryBuffer; + if (binaryData.id) { + this.addEffectsObjectData(binaryData); + } + } else { + var effectsPackage = new EffectsPackage(); + effectsPackage.deserializeFromBinary(new Uint8Array(binaryBuffer)); + for(var _iterator8 = _create_for_of_iterator_helper_loose(effectsPackage.exportObjectDatas), _step8; !(_step8 = _iterator8()).done;){ + var effectsObjectData = _step8.value; + this.addEffectsObjectData(effectsObjectData); + } + } + } + for(var _iterator9 = _create_for_of_iterator_helper_loose(textureOptions), _step9; !(_step9 = _iterator9()).done;){ + var textureData = _step9.value; + this.addEffectsObjectData(textureData); + } + }; + _proto.createVFXItems = function createVFXItems(scene) { + var _this = this; + return _async_to_generator(function() { + var jsonScene, _iterator, _step, itemData, itemType; + return __generator(this, function(_state) { + jsonScene = scene.jsonScene; + for(_iterator = _create_for_of_iterator_helper_loose(jsonScene.items); !(_step = _iterator()).done;){ + itemData = _step.value; + itemType = itemData.type; + if (!(itemType === "ECS" || itemType === "camera" || itemType === ItemType.sprite || itemType === ItemType.particle || itemType === ItemType.mesh || itemType === ItemType.skybox || itemType === ItemType.light || itemType === ItemType.tree || itemType === ItemType.interact || itemType === ItemType.camera)) { + continue; + } + if (_this.database) { + _this.assetLoader.loadGUID(itemData); + } + } + return [ + 2 + ]; + }); + })(); + }; + _proto.addTexture = function addTexture(tex) { + if (this.destroyed) { + return; + } + addItem(this.textures, tex); + }; + _proto.removeTexture = function removeTexture(tex) { + if (this.destroyed) { + return; + } + removeItem(this.textures, tex); + }; + _proto.addMaterial = function addMaterial(mat) { + if (this.destroyed) { + return; + } + addItem(this.materials, mat); + }; + _proto.removeMaterial = function removeMaterial(mat) { + if (this.destroyed) { + return; + } + removeItem(this.materials, mat); + }; + _proto.addGeometry = function addGeometry(geo) { + if (this.destroyed) { + return; + } + addItem(this.geometries, geo); + }; + _proto.removeGeometry = function removeGeometry(geo) { + if (this.destroyed) { + return; + } + removeItem(this.geometries, geo); + }; + _proto.addMesh = function addMesh(mesh) { + if (this.destroyed) { + return; + } + addItem(this.meshes, mesh); + }; + _proto.removeMesh = function removeMesh(mesh) { + if (this.destroyed) { + return; + } + removeItem(this.meshes, mesh); + }; + _proto.addRenderPass = function addRenderPass(pass) { + if (this.destroyed) { + return; + } + addItem(this.renderPasses, pass); + }; + _proto.removeRenderPass = function removeRenderPass(pass) { + if (this.destroyed) { + return; + } + removeItem(this.renderPasses, pass); + }; + _proto.getShaderLibrary = function getShaderLibrary() { + return this.renderer.getShaderLibrary(); + }; + /** + * 销毁所有缓存的资源 + */ _proto.dispose = function dispose() { + if (this.destroyed) { + return; + } + this.destroyed = true; + var info = []; + if (this.renderPasses.length > 0) { + info.push("Pass " + this.renderPasses.length); + } + if (this.meshes.length > 0) { + info.push("Mesh " + this.meshes.length); + } + if (this.geometries.length > 0) { + info.push("Geom " + this.geometries.length); + } + if (this.textures.length > 0) { + info.push("Tex " + this.textures.length); + } + if (info.length > 0) { + logger.warn("Release GPU memory: " + info.join(", ") + "."); + } + this.renderPasses.forEach(function(pass) { + return pass.dispose(); + }); + this.meshes.forEach(function(mesh) { + return mesh.dispose(); + }); + this.geometries.forEach(function(geo) { + return geo.dispose(); + }); + this.materials.forEach(function(mat) { + return mat.dispose(); + }); + this.textures.forEach(function(tex) { + return tex.dispose(); + }); + this.textures = []; + this.materials = []; + this.geometries = []; + this.meshes = []; + this.renderPasses = []; + // @ts-expect-error + this.renderer = null; + }; + _create_class(Engine, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return Engine; +}(); + +var DEFAULT_FPS = 60; +/** + * 定时器类 + */ var Ticker = /*#__PURE__*/ function() { + function Ticker(fps) { + if (fps === void 0) fps = DEFAULT_FPS; + this.paused = true; + this.lastTime = 0; + // deltaTime + this.dt = 0; + this.setFPS(fps); + this.tickers = []; + } + var _proto = Ticker.prototype; + /** + * FPS 帧率设置 + */ _proto.getFPS = function getFPS() { + return this.targetFPS; + }; + _proto.setFPS = function setFPS(fps) { + this.targetFPS = clamp$1(fps, 1, 120); + // 注意:-2 的原因是保证帧率稳定 + // interval 在 fps 为 60 的时候设成 15 累计误差会很大,设成 14 较稳定 + // requestanimationFrame 在不同的刷新率下时间间隔不一样,120hz 的误差在 8 以内,60hz 的误差在 16 以内 + this.interval = Math.floor(1000 / fps) - 2; + }; + /** + * 获取定时器暂停标志位 + * @returns + */ _proto.getPaused = function getPaused() { + return this.paused; + }; + /** + * 定时器开始方法 + */ _proto.start = function start() { + var _this = this; + this.paused = false; + this.dt = 0; + if (!this.intervalId) { + this.lastTime = performance.now(); + var raf = requestAnimationFrame || function(func) { + return window.setTimeout(func, 16.7); + }; + var runLoop = function() { + _this.intervalId = raf(runLoop); + if (!_this.paused) { + _this.tick(); + } + }; + runLoop(); + } + }; + /** + * 定时器停止方法 + */ _proto.stop = function stop() { + (cancelAnimationFrame || window.clearTimeout)(this.intervalId); + this.intervalId = 0; + this.lastTime = 0; + this.paused = true; + this.dt = 0; + this.tickers = []; + }; + /** + * 定时器暂停方法 + */ _proto.pause = function pause() { + this.paused = true; + this.dt = 0; + }; + /** + * 定时器恢复方法 + */ _proto.resume = function resume() { + this.paused = false; + this.dt = 0; + }; + /** + * 定时器 tick 方法 + */ _proto.tick = function tick() { + if (this.paused) { + return; + } + var startTime = performance.now(); + this.dt = startTime - this.lastTime; + if (this.dt >= this.interval) { + this.lastTime = startTime; + if (this.resetTickers) { + this.tickers = this.tickers.filter(function(tick) { + return tick; + }); + this.resetTickers = false; + } + for(var i = 0, len = this.tickers.length; i < len; i++){ + var tick = this.tickers[i]; + tick(this.dt); + } + } + }; + /** + * 定时器添加计时方法 + * @param ticker - 定时器类 + */ _proto.add = function add(ticker) { + if (typeof ticker !== "function") { + throw new Error("The tick object must implement the tick method."); + } + this.tickers.push(ticker); + }; + _create_class(Ticker, [ + { + key: "deltaTime", + get: /** + * 获取定时器当前帧更新的时间 + */ function get() { + return this.dt; + } + } + ]); + return Ticker; +}(); + +registerPlugin("camera", CameraVFXItemLoader, exports.VFXItem); +registerPlugin("text", TextLoader, exports.VFXItem); +registerPlugin("sprite", SpriteLoader, exports.VFXItem); +registerPlugin("particle", ParticleLoader, exports.VFXItem); +registerPlugin("cal", CalculateLoader, exports.VFXItem); +registerPlugin("interact", InteractLoader, exports.VFXItem); +var version$1 = "2.4.3"; +logger.info("Core version: " + version$1 + "."); + +var _obj$3; +var FORMAT_HALF_FLOAT = (_obj$3 = {}, _obj$3[glContext.RGBA] = 34842, _obj$3[glContext.RGB] = 34843, _obj$3[glContext.ALPHA] = 33325, _obj$3[glContext.RED] = 33325, _obj$3[glContext.LUMINANCE_ALPHA] = 33327, _obj$3[glContext.LUMINANCE] = 33325, _obj$3); +var _obj1$1; +var FORMAT_FLOAT = (_obj1$1 = {}, _obj1$1[glContext.RGBA] = 34836, _obj1$1[glContext.RGB] = 34837, _obj1$1[glContext.ALPHA] = 33326, _obj1$1[glContext.RED] = 33326, _obj1$1[glContext.LUMINANCE_ALPHA] = 33328, _obj1$1[glContext.LUMINANCE] = 33326, _obj1$1); +var GLTexture = /*#__PURE__*/ function(Texture) { + _inherits(GLTexture, Texture); + function GLTexture(engine, source) { + var _this; + _this = Texture.call(this, engine) || this; + _this.initialized = false; + if (source) { + _this.fromData(source); + } + return _this; + } + var _proto = GLTexture.prototype; + /** + * 绑定当前 Texture 对象 + */ _proto.bind = function bind(force) { + this.pipelineContext.bindTexture(this.target, this.textureBuffer, force); + }; + /** + * 初始化 Texture 的 GPU 资源 + */ _proto.initialize = function initialize() { + if (this.initialized) { + return; + } + var glEngine = this.engine; + glEngine.addTexture(this); + this.pipelineContext = glEngine.getGLPipelineContext(); + var gl = this.pipelineContext.gl; + var _this_source = this.source, _this_source_target = _this_source.target, target = _this_source_target === void 0 ? gl.TEXTURE_2D : _this_source_target, name = _this_source.name; + this.textureBuffer = gl.createTexture(); + assignInspectorName(this.textureBuffer, name); + this.target = target; + this.update(this.source); + this.release(); + this.initialized = true; + }; + _proto.clone = function clone() { + var clonedTexture = new GLTexture(this.engine, this.source); + clonedTexture.sourceFrom = this.sourceFrom; + clonedTexture.sourceType = this.sourceType; + clonedTexture.width = this.width; + clonedTexture.height = this.height; + return clonedTexture; + }; + _proto.release = function release() { + var sourceType = this.source.sourceType; + switch(sourceType){ + case exports.TextureSourceType.image: + // @ts-expect-error + delete this.source.image; + // @ts-expect-error + delete this.source.cube; + break; + case exports.TextureSourceType.data: + // @ts-expect-error + delete this.source.data; + break; + case exports.TextureSourceType.compressed: + // @ts-expect-error + delete this.source.mipmaps; + break; + case exports.TextureSourceType.mipmaps: + // @ts-expect-error + delete this.source.mipmaps; + break; + } + }; + _proto.update = function update(sourceOptions) { + var _this = this; + if (!this.pipelineContext || !this.textureBuffer) { + this.width = 0; + this.height = 0; + return; + } + var target = this.target; + var source = this.source; + var gl = this.pipelineContext.gl; + var detail = this.engine.gpuCapability.detail; + var sourceType = source.sourceType; + var data = source.data; + var cube = source.cube; + var image = source.image; + var video = source.video; + var mipmaps = source.mipmaps; + var cubeMipmaps = source.mipmaps; + var optionsData = sourceOptions.data; + var optionsCube = sourceOptions.cube; + var generateMipmap = sourceOptions.generateMipmap; + var optionsMipmaps = sourceOptions.mipmaps; + var format = source.format, type = source.type, internalFormat = source.internalFormat; + var width = 0; + var height = 0; + // TODO 原GLState的textureUnitDict参数未处理。 + this.bind(sourceType === exports.TextureSourceType.video); + // 选择 type 和 format + if (type === glContext.HALF_FLOAT) { + type = detail.halfFloatTexture; + if (!type) { + logger.error("Half float texture is not support."); + } + if (isWebGL2(gl) && internalFormat === format) { + if (format === glContext.LUMINANCE) { + format = glContext.RED; + } + internalFormat = FORMAT_HALF_FLOAT[format]; + } + if (!detail.halfFloatLinear) { + source.minFilter = source.magFilter = gl.NEAREST; + logger.warn("Half float linear not support, change to NEAREST."); + } + } else if (type === gl.FLOAT) { + type = detail.floatTexture; + if (!type) { + logger.error("Float texture is not support."); + } + if (isWebGL2(gl) && internalFormat === format) { + if (format === glContext.LUMINANCE) { + format = glContext.RED; + } + internalFormat = FORMAT_FLOAT[format]; + } + if (!detail.floatLinear) { + source.minFilter = gl.NEAREST; + source.magFilter = gl.NEAREST; + logger.warn("Float linear not support, change to NEAREST."); + } + } + // 处理是否RGB透明度相乘和Y轴反转, 默认值都为false。 + if (source.premultiplyAlpha === undefined) { + source.premultiplyAlpha = false; + } + // gl的状态可能在外面被改变了,这里必须重新设置 + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, source.premultiplyAlpha); + if (source.flipY === undefined) { + source.flipY = false; + } + // gl的状态可能在外面被改变了,这里必须重新设置 + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, source.flipY); + // 根据不同的 TextureSourceType 传输对应贴图数据到 GPU + if (sourceType === exports.TextureSourceType.framebuffer) { + if (optionsData) { + var _optionsData_width; + width = (_optionsData_width = optionsData.width) != null ? _optionsData_width : 0; + var _optionsData_height; + height = (_optionsData_height = optionsData.height) != null ? _optionsData_height : 0; + if (width && height && (this.width !== width || this.height !== height)) { + gl.texImage2D(target, 0, internalFormat, width, height, 0, format, type, null); + } + } + } else if (sourceType === exports.TextureSourceType.data) { + if (target === gl.TEXTURE_CUBE_MAP) { + optionsCube.forEach(function(data, key) { + var _this_texImage2DData = _this.texImage2DData(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, 0, internalFormat, format, type, data), x = _this_texImage2DData[0], y = _this_texImage2DData[1]; + width = Math.max(x, width); + height = Math.max(y, height); + }); + } else { + var ref; + ref = this.texImage2DData(gl, target, 0, internalFormat, format, type, data), width = ref[0], height = ref[1]; + } + } else if (sourceType === exports.TextureSourceType.image || sourceType === exports.TextureSourceType.video) { + if (target === gl.TEXTURE_CUBE_MAP) { + cube.forEach(function(image, key) { + var _this_texImage2D = _this.texImage2D(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, 0, internalFormat, format, type, image), x = _this_texImage2D[0], y = _this_texImage2D[1]; + width = Math.max(x, width); + height = Math.max(y, height); + }); + } else if (target === gl.TEXTURE_2D) { + var imageData = image != null ? image : video; + var ref1; + ref1 = this.texImage2D(gl, target, 0, internalFormat, format, type, imageData), width = ref1[0], height = ref1[1]; + } + if (generateMipmap) { + if (isPowerOfTwo(width) && isPowerOfTwo(height) || isWebGL2(gl)) { + gl.generateMipmap(target); + } + } + } else if (sourceType === exports.TextureSourceType.mipmaps) { + var ret; + if (target === gl.TEXTURE_2D) { + mipmaps.forEach(function(mipmap, level) { + if ("data" in mipmap) { + ret = _this.texImage2DData(gl, target, level, internalFormat, format, type, mipmap); + } else { + ret = _this.texImage2D(gl, target, level, internalFormat, format, type, mipmap); + } + if (level === 0) { + var ref; + ref = ret, width = ref[0], height = ref[1]; + } + }); + } else if (target === gl.TEXTURE_CUBE_MAP) { + cubeMipmaps.forEach(function(mipmap, level) { + mipmap.forEach(function(face, key) { + if ("data" in face) { + ret = _this.texImage2DData(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, level, internalFormat, format, type, face); + } else { + ret = _this.texImage2D(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, level, internalFormat, format, type, face); + } + if (level === 0) { + var ref; + ref = ret, width = ref[0], height = ref[1]; + } + }); + }); + } + } else if (sourceType === exports.TextureSourceType.compressed) { + if (optionsMipmaps && optionsMipmaps.length !== 0) { + width = optionsMipmaps[0].width; + height = optionsMipmaps[0].height; + optionsMipmaps.forEach(function(mipmap, idx) { + gl.compressedTexImage2D(target, idx, internalFormat, mipmap.width, mipmap.height, 0, mipmap.data); + }); + } + } + this.width = width; + this.height = height; + this.setTextureFilters(gl, target, source); + }; + _proto.setTextureFilters = function setTextureFilters(gl, target, options) { + var _options_anisotropic = options.anisotropic, anisotropic = _options_anisotropic === void 0 ? 4 : _options_anisotropic, _options_wrapS = options.wrapS, wrapS = _options_wrapS === void 0 ? gl.CLAMP_TO_EDGE : _options_wrapS, _options_wrapT = options.wrapT, wrapT = _options_wrapT === void 0 ? gl.CLAMP_TO_EDGE : _options_wrapT; + var gpuCapability = this.engine.gpuCapability; + if (this.target === gl.TEXTURE_2D) { + gpuCapability.setTextureAnisotropic(gl, this.target, anisotropic); + } + var isPot = isWebGL2(gl) || isPowerOfTwo(this.width) && isPowerOfTwo(this.height); + var magFilter = options.magFilter ? options.magFilter : gl.NEAREST; + var minFilter = options.minFilter ? options.minFilter : gl.NEAREST; + if (!isPot) { + if (minFilter === gl.LINEAR_MIPMAP_LINEAR || minFilter === gl.LINEAR_MIPMAP_NEAREST || minFilter === gl.NEAREST_MIPMAP_LINEAR || minFilter === gl.NEAREST_MIPMAP_NEAREST) { + minFilter = gl.LINEAR; + } + } + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, isPot ? wrapS : gl.CLAMP_TO_EDGE); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, isPot ? wrapT : gl.CLAMP_TO_EDGE); + }; + _proto.fromData = function fromData(data) { + Texture.prototype.fromData.call(this, data); + var source = data; + var options = this.assembleOptions(source); + var sourceType = options.sourceType, sourceFrom = options.sourceFrom, _options_name = options.name, name = _options_name === void 0 ? "" : _options_name; + this.source = options; + this.sourceType = sourceType; + this.sourceFrom = sourceFrom; + this.name = name; + this.guid = data.id; + }; + _proto.texImage2D = function texImage2D(gl, target, level, internalformat, format, type, image) { + var _this = this; + var _this_source = this.source, sourceType = _this_source.sourceType, minFilter = _this_source.minFilter, magFilter = _this_source.magFilter, wrapS = _this_source.wrapS, wrapT = _this_source.wrapT; + var _this_engine_gpuCapability_detail_maxTextureSize; + var maxSize = (_this_engine_gpuCapability_detail_maxTextureSize = this.engine.gpuCapability.detail.maxTextureSize) != null ? _this_engine_gpuCapability_detail_maxTextureSize : 2048; + var img = image; + if (sourceType !== exports.TextureSourceType.video) { + var shouldResize = minFilter !== gl.NEAREST || magFilter !== gl.NEAREST || wrapS !== gl.CLAMP_TO_EDGE || wrapT !== gl.CLAMP_TO_EDGE; + shouldResize = shouldResize || image.width > maxSize || image.height > maxSize; + if (shouldResize) { + // fix android webgl1 img lost error + setTimeout(function() { + img = _this.resizeImage(image); + }); + } + } + gl.texImage2D(target, level, internalformat, format, type, img); + var size = [ + img.width, + img.height + ]; + if (sourceType === exports.TextureSourceType.video) { + var videoWidth = image.videoWidth, videoHeight = image.videoHeight; + return [ + videoWidth, + videoHeight + ]; + } + return size; + }; + _proto.texImage2DData = function texImage2DData(gl, target, level, internalformat, format, type, data) { + var bufferView = data.data, width = data.width, height = data.height; + // Uint8ClampedArray is incompatible in android + var neoBuffer = format === gl.UNSIGNED_BYTE ? new Uint8Array(bufferView.buffer, bufferView.byteOffset, bufferView.byteLength / bufferView.BYTES_PER_ELEMENT) : bufferView; + gl.texImage2D(target, level, internalformat, width, height, 0, format, type, neoBuffer); + return [ + width, + height + ]; + }; + _proto.resizeImage = function resizeImage(image, targetWidth, targetHeight) { + var detail = this.engine.gpuCapability.detail; + var _detail_maxTextureSize; + var maxSize = (_detail_maxTextureSize = detail.maxTextureSize) != null ? _detail_maxTextureSize : 2048; + var gl = this.pipelineContext.gl; + if (isWebGL2(gl) && image.width < maxSize && image.height < maxSize) { + return image; + } + var canvas = resizeImageByCanvas(image, maxSize, targetWidth, targetHeight); + if (canvas) { + return canvas; + } + return image; + }; + _proto.reloadData = function reloadData() { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (!_this.offloaded) return [ + 3, + 2 + ]; + return [ + 4, + getDefaultTextureFactory().reload(_this) + ]; + case 1: + _state.sent(); + _state.label = 2; + case 2: + return [ + 2 + ]; + } + }); + })(); + }; + _proto.offloadData = function offloadData() { + if (!(this.initialized && getDefaultTextureFactory().canOffloadTexture(this.source.sourceFrom))) { + return; + } + var target = this.target; + var gl = this.pipelineContext.gl; + if (gl && this.textureBuffer) { + var data = new Uint8Array([ + 255 + ]); + this.bind(); + if (target === gl.TEXTURE_2D) { + gl.texImage2D(target, 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data); + } else if (target === gl.TEXTURE_CUBE_MAP) { + var faces = [ + gl.TEXTURE_CUBE_MAP_NEGATIVE_X, + gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, + gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, + gl.TEXTURE_CUBE_MAP_POSITIVE_X, + gl.TEXTURE_CUBE_MAP_POSITIVE_Y, + gl.TEXTURE_CUBE_MAP_POSITIVE_Z + ]; + for(var i = 0; i < faces.length; i++){ + gl.texImage2D(faces[i], 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data); + } + } + // rewrite mipmap + gl.generateMipmap(target); + this.width = 1; + this.height = 1; + } + this.offloaded = true; + }; + _proto.uploadCurrentVideoFrame = function uploadCurrentVideoFrame() { + var _this = this; + return _async_to_generator(function() { + return __generator(this, function(_state) { + if (_this.source.sourceType === exports.TextureSourceType.video && _this.source.video && _this.initialized) { + _this.update({ + video: _this.source.video + }); + return [ + 2, + true + ]; + } + return [ + 2, + false + ]; + }); + })(); + }; + _proto.updateSource = function updateSource(opts) { + // @ts-expect-error + this.source = this.assembleOptions(_extends({}, this.source, opts)); + this.sourceType = this.source.sourceType; + this.sourceFrom = this.source.sourceFrom; + this.update(this.source); + }; + _proto.restore = function restore() { + // TODO + }; + _proto.dispose = function dispose() { + /** + * 原先Player是允许多次调用dispose,并且不会报错 + * dispose之后assignRenderer会报错 + */ if (this.pipelineContext && this.textureBuffer) { + this.pipelineContext.gl.deleteTexture(this.textureBuffer); + } + this.width = 0; + this.height = 0; + this.textureBuffer = null; + this.destroyed = true; + this.update = function() { + logger.error("This texture has been destroyed."); + }; + this.initialize = throwDestroyedError; + if (this.engine !== undefined) { + this.engine.removeTexture(this); + } + }; + return GLTexture; +}(Texture); +function resizeImageByCanvas(image, maxSize, targetWidth, targetHeight) { + var width = image.width, height = image.height; + var nw = Math.min(maxSize, targetWidth || nearestPowerOfTwo(width)); + var nh = Math.min(maxSize, targetHeight || nearestPowerOfTwo(height)); + if (nh !== height || nw !== width) { + var canvas = canvasPool.getCanvas(); + var ctx = canvas.getContext("2d"); + canvas.width = nw; + canvas.height = nh; + ctx == null ? void 0 : ctx.drawImage(image, 0, 0, width, height, 0, 0, nw, nh); + logger.warn("Image resize from " + width + "x" + height + " to " + nw + "x" + nh + "."); + return canvas; + } +} +function isPowerOfTwo(value) { + return (value & value - 1) === 0 && value !== 0; +} + +var GLVertexArrayObject = /*#__PURE__*/ function() { + function GLVertexArrayObject(engine, name) { + this.ready = false; + this.disposed = false; + this.gl = engine.getGLPipelineContext().gl; + this.vaoExt = engine.gpuCapability.vaoExt; + this.vao = this.createVertexArray(name); + } + var _proto = GLVertexArrayObject.prototype; + _proto.bind = function bind() { + this.bindVertexArray(this.vao); + }; + _proto.unbind = function unbind() { + this.bindVertexArray(null); + }; + _proto.createVertexArray = function createVertexArray(name) { + var vao = null; + if (isWebGL2(this.gl)) { + vao = this.gl.createVertexArray(); + } + if (!vao && this.vaoExt) { + vao = this.vaoExt.createVertexArrayOES(); + } + assignInspectorName(vao, name); + return vao; + }; + /** + * 根据 gpu level 选择对应的绑定函数 + * @param vao + */ _proto.bindVertexArray = function bindVertexArray(vao) { + if (isWebGL2(this.gl)) { + this.gl.bindVertexArray(vao); + } else { + var _this_vaoExt; + (_this_vaoExt = this.vaoExt) == null ? void 0 : _this_vaoExt.bindVertexArrayOES(vao); + } + }; + _proto.dispose = function dispose() { + if (isWebGL2(this.gl)) { + this.gl.deleteVertexArray(this.vao); + } else { + var _this_vaoExt; + (_this_vaoExt = this.vaoExt) == null ? void 0 : _this_vaoExt.deleteVertexArrayOES(this.vao); + } + }; + return GLVertexArrayObject; +}(); + +var seed$3 = 1; +var GLRendererInternal = /*#__PURE__*/ function() { + function GLRendererInternal(engine) { + this.engine = engine; + this.textures = []; + this.renderbuffers = []; + this.framebuffers = []; + this.destroyed = false; + var d = { + width: 1, + height: 1, + data: new Uint8Array([ + 255 + ]) + }; + var pipelineContext = engine.getGLPipelineContext(); + var gl = pipelineContext.gl; + this.gl = gl; + this.pipelineContext = pipelineContext; + this.emptyTexture2D = new GLTexture(engine, { + data: d, + sourceType: exports.TextureSourceType.data, + format: gl.LUMINANCE, + internalFormat: gl.LUMINANCE, + type: gl.UNSIGNED_BYTE + }); + this.emptyTexture2D.initialize(); + this.emptyTextureCube = new GLTexture(engine, { + target: gl.TEXTURE_CUBE_MAP, + cube: [ + d, + d, + d, + d, + d, + d + ], + sourceType: exports.TextureSourceType.data, + format: gl.LUMINANCE, + internalFormat: gl.LUMINANCE, + type: gl.UNSIGNED_BYTE + }); + this.emptyTextureCube.initialize(); + this.name = "GLGPURenderer" + seed$3; + seed$3++; + } + var _proto = GLRendererInternal.prototype; + _proto.copy2 = function copy2(source, target) { + var gl = this.gl; + if (!gl) { + return; + } + if (!this.sourceFbo) { + this.sourceFbo = gl.createFramebuffer(); + } + if (!this.targetFbo) { + this.targetFbo = gl.createFramebuffer(); + } + var state = this.pipelineContext; + state.bindFramebuffer(gl.FRAMEBUFFER, this.sourceFbo); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, source.textureBuffer, 0); + state.bindFramebuffer(gl.FRAMEBUFFER, this.targetFbo); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target.textureBuffer, 0); + state.bindFramebuffer(gl.READ_FRAMEBUFFER, this.sourceFbo); + state.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.targetFbo); + var filter = source.getWidth() === source.getHeight() && target.getWidth() == target.getHeight() ? gl.NEAREST : gl.LINEAR; + gl.blitFramebuffer(0, 0, source.getWidth(), source.getHeight(), 0, 0, target.getWidth(), target.getHeight(), gl.COLOR_BUFFER_BIT, filter); + state.bindFramebuffer(gl.FRAMEBUFFER, null); + state.bindFramebuffer(gl.READ_FRAMEBUFFER, null); + state.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); + }; + _proto.resetColorAttachments = function resetColorAttachments(rp, colors) { + rp.bind(); + rp.resetColorTextures(colors); + }; + _proto.createGLRenderbuffer = function createGLRenderbuffer(renderbuffer) { + var rb = this.gl.createRenderbuffer(); + if (rb) { + addItem(this.renderbuffers, renderbuffer); + } + return rb; + }; + _proto.resize = function resize(width, height) { + var gl = this.gl; + if (gl && gl.drawingBufferWidth !== width || gl.drawingBufferHeight !== height) { + gl.canvas.width = width; + gl.canvas.height = height; + gl.viewport(0, 0, width, height); + this.framebuffers.forEach(function(framebuffer) { + var viewport = framebuffer.viewport; + if (!framebuffer.isCustomViewport) { + framebuffer.resize(viewport[0], viewport[1], width * framebuffer.viewportScale, height * framebuffer.viewportScale); + } + }); + } + }; + _proto.drawGeometry = function drawGeometry(geometry, material, subMeshIndex) { + if (!this.gl) { + console.warn("GLGPURenderer has not bound a gl object, unable to render geometry."); + return; + } + var glGeometry = geometry; + var glMaterial = material; + var program = glMaterial.shaderVariant.program; + if (!program) { + return; + } + var vao = program.setupAttributes(glGeometry); + var gl = this.gl; + var indicesBuffer = glGeometry.indicesBuffer; + var offset = glGeometry.drawStart; + var count = glGeometry.drawCount; + var mode = glGeometry.mode; + var subMeshes = glGeometry.subMeshes; + if (subMeshes && subMeshes.length) { + var subMesh = subMeshes[subMeshIndex]; + // FIXME: 临时处理3D线框状态下隐藏模型 + if (count < 0) { + return; + } + offset = subMesh.offset; + if (indicesBuffer) { + var _subMesh_indexCount; + count = (_subMesh_indexCount = subMesh.indexCount) != null ? _subMesh_indexCount : 0; + } else { + count = subMesh.vertexCount; + } + } + if (indicesBuffer) { + gl.drawElements(mode, count, indicesBuffer.type, offset != null ? offset : 0); + } else { + gl.drawArrays(mode, offset, count); + } + vao == null ? void 0 : vao.unbind(); + }; + _proto.createGLFramebuffer = function createGLFramebuffer(framebuffer, name) { + var fbo = this.gl.createFramebuffer(); + if (fbo) { + addItem(this.framebuffers, framebuffer); + assignInspectorName(fbo, name, name); + } else { + throw new Error("Failed to create WebGL framebuffer. gl isContextLost=" + this.gl.isContextLost()); + } + return fbo; + }; + /**创建包裹VAO对象。 */ _proto.createVAO = function createVAO(name) { + var ret = new GLVertexArrayObject(this.engine, name); + return ret; + }; + _proto.deleteGLTexture = function deleteGLTexture(texture) { + if (texture.textureBuffer && !this.destroyed) { + this.gl.deleteTexture(texture.textureBuffer); + removeItem(this.textures, texture); + // @ts-expect-error + delete texture.textureBuffer; + } + }; + _proto.deleteGPUBuffer = function deleteGPUBuffer(buffer) { + if (buffer && !this.destroyed) { + this.gl.deleteBuffer(buffer.glBuffer); + // @ts-expect-error + delete buffer.glBuffer; + } + }; + _proto.deleteGLFramebuffer = function deleteGLFramebuffer(framebuffer) { + if (framebuffer && !this.destroyed) { + this.gl.deleteFramebuffer(framebuffer.fbo); + removeItem(this.framebuffers, framebuffer); + delete framebuffer.fbo; + } + }; + _proto.deleteGLRenderbuffer = function deleteGLRenderbuffer(renderbuffer) { + if (renderbuffer && !this.destroyed) { + this.gl.deleteRenderbuffer(renderbuffer.buffer); + removeItem(this.renderbuffers, renderbuffer); + // @ts-expect-error + delete renderbuffer.buffer; + } + }; + _proto.deleteResource = function deleteResource() { + var _this = this; + var gl = this.gl; + if (gl) { + gl.deleteFramebuffer(this.sourceFbo); + gl.deleteFramebuffer(this.targetFbo); + this.emptyTexture2D.dispose(); + this.emptyTextureCube.dispose(); + this.framebuffers.forEach(function(fb) { + return _this.deleteGLFramebuffer(fb); + }); + this.framebuffers.length = 0; + this.renderbuffers.forEach(function(rb) { + return _this.deleteGLRenderbuffer(rb); + }); + this.renderbuffers.length = 0; + this.textures.forEach(function(tex) { + return _this.deleteGLTexture(tex); + }); + this.textures.length = 0; + } + }; + _proto.lost = function lost(e) { + logger.error("WebGL context lost, destroying glRenderer by default to prevent memory leaks. Event target: " + e.target + "."); + this.deleteResource(); + }; + _proto.dispose = function dispose() { + this.deleteResource(); + // @ts-expect-error safe to assign + this.emptyTexture2D = this.emptyTextureCube = this.pipelineContext = this.gpu = this.gl = null; + this.destroyed = true; + }; + _create_class(GLRendererInternal, [ + { + key: "height", + get: function get() { + var _this_gl; + return (_this_gl = this.gl) == null ? void 0 : _this_gl.drawingBufferHeight; + } + }, + { + key: "width", + get: function get() { + var _this_gl; + return (_this_gl = this.gl) == null ? void 0 : _this_gl.drawingBufferWidth; + } + }, + { + key: "canvas", + get: function get() { + return this.gl.canvas; + } + }, + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return GLRendererInternal; +}(); +function assignInspectorName(obj, name, id) { + if (name === undefined || obj === null) { + return; + } + obj.__SPECTOR_Metadata = { + name: name + }; + if (obj.__SPECTOR_Object_TAG) { + obj.__SPECTOR_Object_TAG.displayText = name; + if (id) { + obj.__SPECTOR_Object_TAG.id = id; + } + } else { + obj.__SPECTOR_Object_TAG = { + displayText: name, + id: "" + }; + } +} + +var GLGPUBuffer = /*#__PURE__*/ function() { + function GLGPUBuffer(pipelineContext, props) { + this.pipelineContext = pipelineContext; + this.byteLength = 0; + this.destroyed = false; + var name = props.name, data = props.data, elementCount = props.elementCount, _props_target = props.target, target = _props_target === void 0 ? glContext.ARRAY_BUFFER : _props_target, _props_type = props.type, type = _props_type === void 0 ? glContext.FLOAT : _props_type, _props_usage = props.usage, usage = _props_usage === void 0 ? glContext.STATIC_DRAW : _props_usage; + var bytesPerElement = getBytesPerElementByGLType(type); + this.target = target; + this.type = type; + this.usage = usage; + this.glBuffer = this.createGLBuffer(name); + this.bytesPerElement = bytesPerElement; + if (data) { + this.bufferData(data); + } else if (elementCount) { + this.bufferData(bytesPerElement * elementCount); + } + } + var _proto = GLGPUBuffer.prototype; + _proto.createGLBuffer = function createGLBuffer(name) { + var buffer = this.pipelineContext.gl.createBuffer(); + assignInspectorName(buffer, name); + return buffer; + }; + _proto.bind = function bind() { + this.pipelineContext.gl.bindBuffer(this.target, this.glBuffer); + }; + _proto.bufferData = function bufferData(data) { + var byteLength = typeof data === "number" ? data : data.byteLength; + if (this.pipelineContext) { + this.byteLength = byteLength; + var gl = this.pipelineContext.gl; + var target = this.target; + gl.bindBuffer(target, this.glBuffer); + if (byteLength === 0) { + // ios 12 13 cause error when byteLength == 0 + gl.bufferData(target, 1, this.usage); + } else { + gl.bufferData(target, byteLength, this.usage); + if (typeof data !== "number") { + gl.bufferSubData(target, 0, data); + } + } + } else { + this.byteLength = 0; + } + }; + _proto.bufferSubData = function bufferSubData(elementOffset, data) { + if (this.pipelineContext) { + var gl = this.pipelineContext.gl; + var target = this.target; + var byteOffset = elementOffset * this.bytesPerElement; + var byteLength = byteOffset + data.byteLength; + gl.bindBuffer(target, this.glBuffer); + if (byteLength > this.byteLength) { + this.byteLength = byteLength; + gl.bufferData(target, byteLength, this.usage); + } + gl.bufferSubData(target, byteOffset, data); + } else { + this.byteLength = 0; + } + }; + _proto.dispose = function dispose() { + this.pipelineContext.gl.deleteBuffer(this.glBuffer); + // @ts-expect-error safe to assign + this.glBuffer = null; + this.destroyed = true; + }; + // for test + _proto.readSubData = function readSubData(elementOffset, dstBuffer) { + if (isWebGL2(this.pipelineContext.gl)) { + this.pipelineContext.gl.getBufferSubData(this.target, elementOffset * this.bytesPerElement, dstBuffer); + return true; + } + return false; + }; + _create_class(GLGPUBuffer, [ + { + key: "elementCount", + get: function get() { + return this.byteLength / this.bytesPerElement; + } + }, + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return GLGPUBuffer; +}(); +var _obj$2; +var map = (_obj$2 = {}, _obj$2[glContext.INT] = Int32Array, _obj$2[glContext.FLOAT] = Float32Array, _obj$2[glContext.SHORT] = Int16Array, _obj$2[glContext.BYTE] = Int8Array, _obj$2[glContext.UNSIGNED_BYTE] = Uint8Array, _obj$2[glContext.UNSIGNED_INT] = Uint32Array, _obj$2[glContext.UNSIGNED_SHORT] = Uint16Array, _obj$2); +function getBytesPerElementByGLType(type) { + var _map_type; + var _map_type_BYTES_PER_ELEMENT; + return (_map_type_BYTES_PER_ELEMENT = (_map_type = map[type]) == null ? void 0 : _map_type.BYTES_PER_ELEMENT) != null ? _map_type_BYTES_PER_ELEMENT : 0; +} + +var _obj$1; +var INDEX_TYPE_MAP = (_obj$1 = {}, _obj$1[Uint8Array.BYTES_PER_ELEMENT] = glContext.UNSIGNED_BYTE, _obj$1[Uint16Array.BYTES_PER_ELEMENT] = glContext.UNSIGNED_SHORT, _obj$1[Uint32Array.BYTES_PER_ELEMENT] = glContext.UNSIGNED_INT, _obj$1); +var seed$2 = 1; +/** + * 应用层 Geometry 对象,本身不直接保存 GPU 资源而是通过 geometryInternal 成员保存 GPU 资源 + */ var GLGeometry = /*#__PURE__*/ function(Geometry) { + _inherits(GLGeometry, Geometry); + function GLGeometry(engine, props) { + var _this; + _this = Geometry.call(this, engine) || this; + _this.drawCount = 0; + /** + * 记录了顶点属性与 GPUBuffer 对应关系 + */ _this.buffers = {}; + _this.vaos = {}; + _this.skin = {}; + _this.initialized = false; + _this.indicesReleasable = false; + _this.attributesName = []; + _this.destroyed = false; + if (props) { + _this.processProps(props); + } + return _this; + } + var _proto = GLGeometry.prototype; + _proto.getOptions = function getOptions() { + return _extends({}, this.options); + }; + /** + * Geometry 的 GPU 资源初始化方法,在绘制前调用 + */ _proto.initialize = function initialize() { + var _this = this; + if (this.initialized) { + return; + } + var engine = this.engine; + assertExist(engine); + engine.addGeometry(this); + var pipelineContext = this.engine.getGLPipelineContext(); + // 创建vbo + Object.keys(this.bufferProps).forEach(function(name) { + _this.buffers[name] = new GLGPUBuffer(pipelineContext, _this.bufferProps[name]); + }); + // 创建ibo + if (this.indices) { + this.indicesBuffer = this.createIndicesBuffer(pipelineContext, this.indices); + } + this.initialized = true; + // 向 GPU 传输顶点数据 + this.flush(); + this.options = undefined; + }; + _proto.getAttributeBuffer = function getAttributeBuffer(name) { + if (!this.initialized) { + return undefined; + } + var key = this.attributes[name].dataSource; + return this.buffers[key]; + }; + _proto.setAttributeData = function setAttributeData(name, data) { + if (this.bufferProps == undefined) { + return; + } + var bufferOption = this.getAttributeBufferOption(name); + var key = this.attributes[name].dataSource; + if (bufferOption) { + var usage = bufferOption.usage, target = bufferOption.target; + this.bufferProps[key] = { + data: data, + usage: usage, + target: target, + elementCount: data.length + }; + this.dirtyFlags[key].discard = true; + this.dirtyFlags[key].dirty = true; + } + }; + _proto.getAttributeData = function getAttributeData(name) { + if (this.bufferProps == undefined) { + return; + } + var bufferOption = this.getAttributeBufferOption(name); + return bufferOption ? bufferOption.data : undefined; + }; + _proto.setAttributeSubData = function setAttributeSubData(name, offset, data) { + if (this.bufferProps == undefined) { + return; + } + var attribute = this.getAttributeBufferOption(name); + if (attribute && attribute.data != undefined) { + var start = offset; + var length = offset + data.length; + if (attribute.data.length < length) { + // @ts-expect-error safe to use + var newData = new data.constructor(length); + newData.set(attribute.data); + attribute.data = newData; + this.dirtyFlags[name].discard = true; + } else if (!this.dirtyFlags[name].discard) { + var dirtyFlag = this.dirtyFlags[name]; + if (dirtyFlag.start !== undefined) { + dirtyFlag.start = Math.min(dirtyFlag.start, start); + } + if (dirtyFlag.end !== undefined) { + dirtyFlag.end = Math.max(dirtyFlag.end, length - 1); + } + } + attribute.data.set(data, start); + this.dirtyFlags[name].dirty = true; + } + }; + _proto.getIndexData = function getIndexData() { + return this.indices; + }; + _proto.setIndexData = function setIndexData(data) { + if (_instanceof1(data, Uint8Array) || _instanceof1(data, Uint16Array) || _instanceof1(data, Uint32Array)) { + this.indices = data; + this.dirtyFlags["index"].discard = true; + this.dirtyFlags["index"].dirty = true; + } + }; + _proto.setIndexSubData = function setIndexSubData(offset, data) { + if (this.indices) { + var _this_indices; + var start = offset; + var length = offset + data.length; + if (this.indices.length < length) { + // @ts-expect-error safe to use + var newData = new data.constructor(length); + newData.set(this.indices); + this.indices = newData; + this.dirtyFlags["index"].discard = true; + } else if (!this.dirtyFlags["index"].discard) { + var dirtyFlag = this.dirtyFlags["index"]; + if (dirtyFlag.start !== undefined) { + dirtyFlag.start = Math.min(dirtyFlag.start, start); + } + if (dirtyFlag.end !== undefined) { + dirtyFlag.end = Math.max(dirtyFlag.end, length - 1); + } + } + (_this_indices = this.indices) == null ? void 0 : _this_indices.set(data, start); + this.dirtyFlags["index"].dirty = true; + } + }; + _proto.getAttributeStride = function getAttributeStride(name) { + var attr = this.attributes[name]; + var stride = attr.stride, size = attr.size, type = attr.type; + return stride ? stride : size * BYTES_TYPE_MAP[type]; + }; + _proto.getAttributeNames = function getAttributeNames() { + return this.attributesName; + }; + _proto.setDrawStart = function setDrawStart(count) { + this.drawStart = count; + }; + _proto.getDrawStart = function getDrawStart() { + return this.drawStart; + }; + _proto.setDrawCount = function setDrawCount(count) { + this.drawCount = count; + }; + _proto.getDrawCount = function getDrawCount() { + return this.drawCount; + }; + _proto.getSkinProps = function getSkinProps() { + return this.skin; + }; + // 根据 attribute 的 datasource 获取 js 端 buffer + _proto.getAttributeBufferOption = function getAttributeBufferOption(name) { + var attribute = this.attributes[name]; + return attribute ? this.bufferProps[attribute.dataSource] : undefined; + }; + _proto.createIndicesBuffer = function createIndicesBuffer(pipelineContext, data) { + var type = INDEX_TYPE_MAP[data.BYTES_PER_ELEMENT]; + var indexProps = { + data: data, + target: glContext.ELEMENT_ARRAY_BUFFER, + type: type, + name: "" + this.name + "##index" + }; + return new GLGPUBuffer(pipelineContext, indexProps); + }; + _proto.flush = function flush() { + var _this = this; + if (!this.initialized) { + return; + } + var attributes = this.attributes; + var bufferProps = this.bufferProps; + var indices = this.indices; + Object.keys(this.dirtyFlags).forEach(function(name) { + var flag = _this.dirtyFlags[name]; + var buffer; + var data; + if (name == "index") { + buffer = _this.indicesBuffer; + data = indices; + } else { + var bufferName = attributes[name].dataSource; + buffer = _this.buffers[bufferName]; + data = bufferProps[bufferName].data; + } + if ((flag.dirty || flag.discard) && buffer && data) { + if (flag.discard) { + buffer.bufferData(data); + } else { + if (flag.start !== undefined && flag.end !== undefined) { + var offset = flag.start * data.BYTES_PER_ELEMENT + data.byteOffset; + var length = flag.end - flag.start + 1; + // @ts-expect-error safe to use + var subData = new data.constructor(data.buffer, offset, length); + buffer.bufferSubData(flag.start, subData); + } + } + flag.start = Number.POSITIVE_INFINITY; + flag.end = 0; + flag.dirty = flag.discard = false; + } + }); + // 需要释放的 attributes 数据 + Object.keys(this.attributesReleasable).forEach(function(name) { + var releasable = _this.attributesReleasable[name]; + var bufferName = attributes[name].dataSource; + if (bufferProps[bufferName] && releasable) { + bufferProps[bufferName].data = undefined; + } + }); + // 释放 indices buffer + if (this.indicesReleasable) ; + }; + _proto.processProps = function processProps(data) { + var props = data; + var _props_drawStart = props.drawStart, drawStart = _props_drawStart === void 0 ? 0 : _props_drawStart, drawCount = props.drawCount, mode = props.mode, indices = props.indices, _props_name = props.name, name = _props_name === void 0 ? "effectsGeometry:" + seed$2++ : _props_name, _props_bufferUsage = props.bufferUsage, bufferUsage = _props_bufferUsage === void 0 ? glContext.STATIC_DRAW : _props_bufferUsage; + this.name = name; + // 记录顶点属性,需要与 Shader 中 attribute 进行关联 + var bufferProps = {}; + var attributesName = []; + var attributes = {}; + // key为buffer的名字 + var dirtyFlags = {}; + var attributesReleasable = {}; + var usage = bufferUsage; + this.drawStart = drawStart; + if (drawCount !== undefined) { + this.drawCount = drawCount; + } + this.mode = isNaN(mode) ? glContext.TRIANGLES : mode; + Object.keys(props.attributes).forEach(function(name) { + var attr = props.attributes[name]; + var size = attr.size, stride = attr.stride, offset = attr.offset, normalize = attr.normalize; + var _attr_type = attr.type, type = _attr_type === void 0 ? glContext.FLOAT : _attr_type, releasable = attr.releasable; + var _$data = attr.data; + if (type && !("dataSource" in attr) && !_$data) { + _$data = generateEmptyTypedArray(type); + } + if (_$data) { + var glType = _instanceof1(_$data, Float32Array) ? glContext.FLOAT : glContext.INT; + // 使用 AttributeWithData 构造的 attribute + bufferProps[name] = { + data: _$data, + usage: usage, + target: glContext.ARRAY_BUFFER, + name: name + }; + attributes[name] = { + size: size, + stride: stride, + offset: offset, + type: type != null ? type : glType, + normalize: !!normalize, + dataSource: name + }; + attributesReleasable[name] = releasable != null ? releasable : false; + dirtyFlags[name] = { + dirty: true, + discard: true, + start: Number.POSITIVE_INFINITY, + end: 0 + }; + } else { + // 使用 AttributeWithType 构造的 attribute + var dataSource = attr.dataSource; + if (dataSource) { + // 属性共享 buffer + attributes[name] = { + size: size, + stride: stride, + offset: offset, + type: type, + dataSource: dataSource, + normalize: !!normalize + }; + } + } + attributesName.push(name); + }); + dirtyFlags.index = { + dirty: true, + discard: true, + start: Number.POSITIVE_INFINITY, + end: 0 + }; + // 顶点索引 + this.indices = indices == null ? void 0 : indices.data; + this.indicesReleasable = (indices == null ? void 0 : indices.releasable) === true; + this.bufferProps = bufferProps; + this.attributes = attributes; + this.attributesName = attributesName; + this.attributesReleasable = attributesReleasable; + this.dirtyFlags = dirtyFlags; + this.options = props; + this.initialized = false; + }; + _proto.fromData = function fromData(data) { + var _this = this; + Geometry.prototype.fromData.call(this, data); + this.subMeshes = data.subMeshes; + var buffer; + if (data.buffer) { + buffer = new Uint8Array(decodeBase64ToArrays(data.buffer)); + } else if (data.binaryData) { + buffer = data.binaryData; + } + if (!buffer) { + return; + } + var vertexCount = data.vertexData.vertexCount; + if (this.hasSemantic(data)) { + var geometryProps = { + mode: glContext.TRIANGLES, + attributes: {} + }; + data.vertexData.channels.forEach(function(channel) { + var _vertexBufferSemanticMap_channel_semantic; + var attribName = (_vertexBufferSemanticMap_channel_semantic = vertexBufferSemanticMap[channel.semantic]) != null ? _vertexBufferSemanticMap_channel_semantic : channel.semantic; + var attribBuffer = _this.createVertexTypedArray(channel, buffer, vertexCount); + geometryProps.attributes[attribName] = { + type: vertexFormatType2GLType(channel.format), + size: channel.dimension, + data: attribBuffer, + normalize: channel.normalize + }; + }); + if (data.indexFormat !== IndexFormatType.None) { + var indexBuffer = this.createIndexTypedArray(data.indexFormat, buffer, data.indexOffset); + geometryProps.indices = { + data: indexBuffer + }; + geometryProps.drawCount = indexBuffer.length; + } else { + geometryProps.drawCount = vertexCount; + } + this.processProps(geometryProps); + } else { + var positionChannel = data.vertexData.channels[0]; + var uvChannel = data.vertexData.channels[1]; + var normalChannel = data.vertexData.channels[2]; + // 根据提供的长度信息创建 Float32Array + var positionBuffer = this.createVertexTypedArray(positionChannel, buffer, vertexCount); + var uvBuffer = this.createVertexTypedArray(uvChannel, buffer, vertexCount); + var normalBuffer = this.createVertexTypedArray(normalChannel, buffer, vertexCount); + // 根据提供的长度信息创建 Uint16Array,它紧随 Float32Array 数据之后 + var indexBuffer1 = this.createIndexTypedArray(data.indexFormat, buffer, data.indexOffset); + var geometryProps1 = { + mode: glContext.TRIANGLES, + attributes: { + aPos: { + type: vertexFormatType2GLType(positionChannel.format), + size: 3, + data: positionBuffer, + normalize: positionChannel.normalize + }, + aUV: { + type: vertexFormatType2GLType(uvChannel.format), + size: 2, + data: uvBuffer, + normalize: uvChannel.normalize + }, + aNormal: { + type: vertexFormatType2GLType(normalChannel.format), + size: 3, + data: normalBuffer, + normalize: normalChannel.normalize + } + } + }; + geometryProps1.indices = { + data: indexBuffer1 + }; + geometryProps1.drawCount = indexBuffer1.length; + this.processProps(geometryProps1); + } + this.skin = { + boneNames: data.boneNames, + rootBoneName: data.rootBoneName, + inverseBindMatrices: data.inverseBindMatrices + }; + }; + _proto.dispose = function dispose() { + var _this = this; + this.drawStart = 0; + this.drawCount = NaN; + this.bufferProps = {}; + this.indices = undefined; + this.attributes = {}; + this.attributesName = []; + this.options = undefined; + if (this.initialized) { + var _this_indicesBuffer; + Object.keys(this.buffers).forEach(function(name) { + _this.buffers[name].dispose(); + }); + this.buffers = {}; + (_this_indicesBuffer = this.indicesBuffer) == null ? void 0 : _this_indicesBuffer.dispose(); + Object.keys(this.vaos).forEach(function(name) { + var _this_vaos_name; + (_this_vaos_name = _this.vaos[name]) == null ? void 0 : _this_vaos_name.dispose(); + _this.vaos[name] = undefined; + }); + this.indicesBuffer = undefined; + if (this.engine !== undefined) { + this.engine.removeGeometry(this); + // @ts-expect-error + this.engine = undefined; + } + } + this.destroyed = true; + }; + _proto.createVertexTypedArray = function createVertexTypedArray(channel, baseBuffer, vertexCount) { + var arrayBuffer = baseBuffer.buffer; + switch(channel.format){ + case VertexFormatType.Float32: + return new Float32Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount); + case VertexFormatType.Int16: + return new Int16Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount); + case VertexFormatType.Int8: + return new Int8Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount); + case VertexFormatType.UInt16: + return new Uint16Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount); + case VertexFormatType.UInt8: + return new Uint8Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount); + default: + console.error("Invalid vertex format type: " + channel.format + "."); + return new Float32Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount); + } + }; + _proto.createIndexTypedArray = function createIndexTypedArray(type, baseBuffer, offset) { + var arrayBuffer = baseBuffer.buffer; + switch(type){ + case IndexFormatType.UInt16: + return new Uint16Array(arrayBuffer, baseBuffer.byteOffset + offset); + case IndexFormatType.UInt32: + return new Uint32Array(arrayBuffer, baseBuffer.byteOffset + offset); + default: + console.error("Invalid index format type: " + type + "."); + return new Uint32Array(arrayBuffer, baseBuffer.byteOffset + offset); + } + }; + _proto.hasSemantic = function hasSemantic(data) { + var hasSemantic = false; + var vertexData = data.vertexData; + vertexData.channels.forEach(function(channel) { + if (channel.semantic && channel.semantic.length > 0) { + hasSemantic = true; + } + }); + return hasSemantic; + }; + _create_class(GLGeometry, [ + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + }, + { + key: "isInitialized", + get: function get() { + return this.initialized; + } + } + ]); + return GLGeometry; +}(Geometry); +var vertexBufferSemanticMap = { + POSITION: "aPos", + TEXCOORD0: "aUV", + TEXCOORD_0: "aUV", + TEXCOORD1: "aUV2", + NORMAL: "aNormal", + TANGENT: "aTangent", + COLOR: "aColor", + JOINTS: "aJoints", + JOINTS_0: "aJoints", + WEIGHTS: "aWeights", + WEIGHTS_0: "aWeights", + // + POSITION_BS0: "aTargetPosition0", + POSITION_BS1: "aTargetPosition1", + POSITION_BS2: "aTargetPosition2", + POSITION_BS3: "aTargetPosition3", + POSITION_BS4: "aTargetPosition4", + POSITION_BS5: "aTargetPosition5", + POSITION_BS6: "aTargetPosition6", + POSITION_BS7: "aTargetPosition7", + NORMAL_BS0: "aTargetNormal0", + NORMAL_BS1: "aTargetNormal1", + NORMAL_BS2: "aTargetNormal2", + NORMAL_BS3: "aTargetNormal3", + TANGENT_BS0: "aTargetTangent0", + TANGENT_BS1: "aTargetTangent1", + TANGENT_BS2: "aTargetTangent2", + TANGENT_BS3: "aTargetTangent3" +}; +function decodeBase64ToArrays(base64String) { + // 将 Base64 编码的字符串转换为二进制字符串 + var binaryString = atob(base64String); + // 将二进制字符串转换为字节数组 + var bytes = new Uint8Array(binaryString.length); + for(var i = 0; i < binaryString.length; i++){ + bytes[i] = binaryString.charCodeAt(i); + } + // 创建 ArrayBuffer 并为其创建视图 + var buffer = bytes.buffer; + // 返回解码后的数组 + return buffer; +} + +var GLMaterialState = /*#__PURE__*/ function() { + function GLMaterialState() { + this.reset(); + } + var _proto = GLMaterialState.prototype; + _proto.setBlendColor = function setBlendColor(color) { + var r = color[0], g = color[1], b = color[2], a = color[3]; + if (this.blendColor[0] === r && this.blendColor[1] === g && this.blendColor[2] === b && this.blendColor[3] === a) { + return; + } + this.blendColor[0] = r; + this.blendColor[1] = g; + this.blendColor[2] = b; + this.blendColor[3] = a; + }; + _proto.setBlending = function setBlending(value) { + if (this.blending !== value) { + this.blending = value; + } + }; + _proto.setBlendFunctionParameters = function setBlendFunctionParameters(value) { + var blendSrc = value[0], blendDst = value[1], blendSrcAlpha = value[2], blendDstAlpha = value[3]; + if (this.blendFunctionParameters[0] === blendSrc && this.blendFunctionParameters[1] === blendDst && this.blendFunctionParameters[2] === blendSrcAlpha && this.blendFunctionParameters[3] === blendDstAlpha) { + return; + } + this.blendFunctionParameters[0] = blendSrc; + this.blendFunctionParameters[1] = blendDst; + this.blendFunctionParameters[2] = blendSrcAlpha; + this.blendFunctionParameters[3] = blendDstAlpha; + }; + _proto.setBlendEquationParameters = function setBlendEquationParameters(value) { + var rgb = value[0], alpha = value[1]; + if (this.blendEquationParameters[0] === rgb && this.blendEquationParameters[1] === alpha) { + return; + } + this.blendEquationParameters[0] = rgb; + this.blendEquationParameters[1] = alpha; + }; + _proto.setDepthTest = function setDepthTest(value) { + if (this.depthTest === value) { + return; + } + this.depthTest = value; + }; + _proto.setDepthMask = function setDepthMask(value) { + if (this.depthMask === value) { + return; + } + this.depthMask = value; + }; + _proto.setDepthRange = function setDepthRange(value) { + if (this.depthRange[0] === value[0] && this.depthRange[1] === value[1]) { + return; + } + this.depthRange[0] = value[0]; + this.depthRange[1] = value[1]; + }; + _proto.setDepthFunc = function setDepthFunc(value) { + if (this.depthFunc === value) { + return; + } + this.depthFunc = value; + }; + _proto.setPolygonOffsetFill = function setPolygonOffsetFill(value) { + if (this.polygonOffsetFill === value) { + return; + } + this.polygonOffsetFill = value; + }; + _proto.setPolygonOffset = function setPolygonOffset(value) { + if (this.polygonOffset[0] === value[0] && this.polygonOffset[1] === value[1]) { + return; + } + this.polygonOffset[0] = value[0]; + this.polygonOffset[1] = value[1]; + }; + _proto.setSampleAlphaToCoverage = function setSampleAlphaToCoverage(value) { + if (this.sampleAlphaToCoverage === value) { + return; + } + this.sampleAlphaToCoverage = value; + }; + _proto.setColorMask = function setColorMask(colorMask) { + this.colorMask[0] = colorMask; + this.colorMask[1] = colorMask; + this.colorMask[2] = colorMask; + this.colorMask[3] = colorMask; + }; + _proto.setStencilTest = function setStencilTest(value) { + if (this.stencilTest === value) { + return; + } + this.stencilTest = value; + }; + _proto.setStencilMask = function setStencilMask(value) { + if (this.stencilMask[0] === value[0] && this.stencilMask[1] === value[1]) { + return; + } + this.stencilMask[0] = value[0]; + this.stencilMask[1] = value[1]; + }; + _proto.setStencilRef = function setStencilRef(value) { + if (this.stencilRef[0] === value[0] && this.stencilRef[1] === value[1]) { + return; + } + this.stencilRef[0] = value[0]; + this.stencilRef[1] = value[1]; + }; + _proto.setStencilFunc = function setStencilFunc(value) { + if (this.stencilFunc[0] === value[0] && this.stencilFunc[1] === value[1]) { + return; + } + this.stencilFunc[0] = value[0]; + this.stencilFunc[1] = value[1]; + }; + _proto.setStencilOpFail = function setStencilOpFail(value) { + if (this.stencilOpFail[0] === value[0] && this.stencilOpFail[1] === value[1]) { + return; + } + this.stencilOpFail[0] = value[0]; + this.stencilOpFail[1] = value[1]; + }; + _proto.setStencilOpZFail = function setStencilOpZFail(value) { + if (this.stencilOpZFail[0] === value[0] && this.stencilOpZFail[1] === value[1]) { + return; + } + this.stencilOpZFail[0] = value[0]; + this.stencilOpZFail[1] = value[1]; + }; + _proto.setStencilOpZPass = function setStencilOpZPass(value) { + if (this.stencilOpZPass[0] === value[0] && this.stencilOpZPass[1] === value[1]) { + return; + } + this.stencilOpZPass[0] = value[0]; + this.stencilOpZPass[1] = value[1]; + }; + _proto.setCulling = function setCulling(value) { + if (this.culling === value) { + return; + } + this.culling = value; + }; + _proto.setFrontFace = function setFrontFace(value) { + if (this.frontFace === value) { + return; + } + this.frontFace = value; + }; + _proto.setCullFace = function setCullFace(value) { + if (this.cullFace === value) { + return; + } + this.cullFace = value; + }; + _proto.reset = function reset() { + this.blending = false; + this.blendColor = [ + 0, + 0, + 0, + 0 + ]; + this.blendFunctionParameters = [ + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA, + glContext.ONE, + glContext.ONE_MINUS_SRC_ALPHA + ]; + this.blendEquationParameters = [ + glContext.FUNC_ADD, + glContext.FUNC_ADD + ]; + this.depthTest = true; + this.depthMask = true; + this.depthRange = [ + 0, + 1 + ]; + this.depthFunc = glContext.LESS; + this.polygonOffset = [ + 0, + 0 + ]; + this.polygonOffsetFill = false; + this.sampleAlphaToCoverage = false; + this.colorMask = [ + true, + true, + true, + true + ]; + this.stencilTest = false; + this.stencilMask = [ + 0xFF, + 0xFF + ]; + this.stencilRef = [ + 0, + 0 + ]; + this.stencilFunc = [ + glContext.ALWAYS, + glContext.ALWAYS + ]; + this.stencilOpFail = [ + glContext.KEEP, + glContext.KEEP + ]; + this.stencilOpZFail = [ + glContext.KEEP, + glContext.KEEP + ]; + this.stencilOpZPass = [ + glContext.KEEP, + glContext.KEEP + ]; + this.culling = false; + this.frontFace = glContext.CCW; + this.cullFace = glContext.FRONT; + }; + _proto.apply = function apply(pipelineContext) { + pipelineContext.toggle(glContext.SAMPLE_ALPHA_TO_COVERAGE, this.sampleAlphaToCoverage); + pipelineContext.toggle(glContext.BLEND, this.blending); + pipelineContext.toggle(glContext.DEPTH_TEST, this.depthTest); + pipelineContext.toggle(glContext.STENCIL_TEST, this.stencilTest); + pipelineContext.toggle(glContext.CULL_FACE, this.culling); + pipelineContext.toggle(glContext.POLYGON_OFFSET_FILL, this.polygonOffsetFill); + if (this.stencilTest) { + //stencil + pipelineContext.stencilMaskSeparate(glContext.BACK, this.stencilMask[1]); + pipelineContext.stencilMaskSeparate(glContext.FRONT, this.stencilMask[0]); + pipelineContext.stencilFuncSeparate(glContext.BACK, this.stencilFunc[0], this.stencilRef[0], this.stencilMask[0]); + pipelineContext.stencilFuncSeparate(glContext.FRONT, this.stencilFunc[1], this.stencilRef[1], this.stencilMask[1]); + pipelineContext.stencilOpSeparate(glContext.BACK, this.stencilOpFail[0], this.stencilOpZFail[0], this.stencilOpZPass[0]); + pipelineContext.stencilOpSeparate(glContext.FRONT, this.stencilOpFail[1], this.stencilOpZFail[1], this.stencilOpZPass[1]); + } + if (this.blending) { + var _this = this, blendColor = _this.blendColor, blendEquationParameters = _this.blendEquationParameters, blendFunctionParameters = _this.blendFunctionParameters; + pipelineContext.blendColor(blendColor[0], blendColor[1], blendColor[2], blendColor[3]); + pipelineContext.blendEquationSeparate(blendEquationParameters[0], blendEquationParameters[1]); + pipelineContext.blendFuncSeparate(blendFunctionParameters[0], blendFunctionParameters[1], blendFunctionParameters[2], blendFunctionParameters[3]); + } + //color depth + pipelineContext.colorMask(this.colorMask[0], this.colorMask[1], this.colorMask[2], this.colorMask[3]); + if (this.depthTest) { + pipelineContext.depthMask(this.depthMask); + pipelineContext.depthFunc(this.depthFunc); + pipelineContext.depthRange(this.depthRange[0], this.depthRange[1]); + } + if (this.culling) { + //face + pipelineContext.cullFace(this.cullFace); + pipelineContext.frontFace(this.frontFace); + } + if (this.polygonOffsetFill) { + pipelineContext.polygonOffset(this.polygonOffset[0], this.polygonOffset[1]); + } + }; + return GLMaterialState; +}(); + +var Vector4 = Vector4$1, Matrix4 = Matrix4$1; +var GLMaterial = /*#__PURE__*/ function(Material) { + _inherits(GLMaterial, Material); + function GLMaterial(engine, props) { + var _this; + _this = Material.call(this, engine, props) || this; + // material存放的uniform数据。 + _this.floats = {}; + _this.ints = {}; + _this.vector2s = {}; + _this.vector3s = {}; + _this.vector4s = {}; + _this.colors = {}; + _this.quaternions = {}; + _this.matrices = {}; + _this.matrice3s = {}; + _this.textures = {}; + _this.floatArrays = {}; + _this.vector4Arrays = {}; + _this.matrixArrays = {}; + _this.samplers = [] // material存放的sampler名称。 + ; + _this.uniforms = [] // material存放的uniform名称(不包括sampler)。 + ; + _this.uniformDirty = true; + _this.macrosDirty = true; + _this.glMaterialState = new GLMaterialState(); + if (props) { + _this.shader = new exports.Shader(engine); + _this.shader.shaderData = _extends({}, props.shader, { + id: generateGUID(), + dataType: DataType.Shader + }); + } + return _this; + } + var _proto = GLMaterial.prototype; + _proto.enableMacro = function enableMacro(keyword, value) { + if (!this.isMacroEnabled(keyword) || this.enabledMacros[keyword] !== value) { + this.enabledMacros[keyword] = value != null ? value : true; + this.macrosDirty = true; + } + }; + _proto.disableMacro = function disableMacro(keyword) { + if (this.isMacroEnabled(keyword)) { + delete this.enabledMacros[keyword]; + this.macrosDirty = true; + } + }; + _proto.isMacroEnabled = function isMacroEnabled(keyword) { + return this.enabledMacros[keyword] !== undefined; + }; + /**shader和texture的GPU资源初始化。 */ _proto.initialize = function initialize() { + var _this = this; + var engine = this.engine; + this.createShaderVariant(); + this.shaderVariant.initialize(); + if (this.initialized) { + return; + } + engine.addMaterial(this); + Object.keys(this.textures).forEach(function(key) { + var texture = _this.textures[key]; + if (!isFunction(texture.initialize)) { + logger.error("Failed to initialize texture: " + JSON.stringify(texture) + ". Ensure the texture conforms to the expected format."); + return; + } + texture.initialize(); + }); + this.initialized = true; + }; + _proto.createShaderVariant = function createShaderVariant() { + if (this.shaderDirty || this.macrosDirty) { + this.shaderVariant = this.shader.createVariant(this.enabledMacros); + this.macrosDirty = false; + this.shaderDirty = false; + this.uniformDirty = true; + } + }; + _proto.setupStates = function setupStates(pipelineContext) { + this.glMaterialState.apply(pipelineContext); + }; + _proto.use = function use(renderer, globalUniforms) { + var engine = renderer.engine; + var pipelineContext = engine.getGLPipelineContext(); + var shaderVariant = this.shaderVariant; + if (!shaderVariant.program) { + var _this_engine; + (_this_engine = this.engine) == null ? void 0 : _this_engine.renderErrors.add(new Error("Shader program is not initialized.")); + return; + } + shaderVariant.program.bind(); + this.setupStates(pipelineContext); + var name; + if (globalUniforms) { + // 加入全局 uniform 名称 + for(var _iterator = _create_for_of_iterator_helper_loose(globalUniforms.uniforms), _step; !(_step = _iterator()).done;){ + name = _step.value; + this.checkUniform(name); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(globalUniforms.samplers), _step1; !(_step1 = _iterator1()).done;){ + name = _step1.value; + if (!this.samplers.includes(name)) { + this.samplers.push(name); + this.uniformDirty = true; + } + } + } + // 更新 cached uniform location + if (this.uniformDirty) { + shaderVariant.fillShaderInformation(this.uniforms, this.samplers); + this.uniformDirty = false; + } + if (globalUniforms) { + // 设置全局 uniform + for(name in globalUniforms.floats){ + shaderVariant.setFloat(name, globalUniforms.floats[name]); + } + for(name in globalUniforms.ints){ + shaderVariant.setInt(name, globalUniforms.ints[name]); + } + for(name in globalUniforms.vector4s){ + shaderVariant.setVector4(name, globalUniforms.vector4s[name]); + } + for(name in globalUniforms.vector3s){ + shaderVariant.setVector3(name, globalUniforms.vector3s[name]); + } + for(name in globalUniforms.matrices){ + shaderVariant.setMatrix(name, globalUniforms.matrices[name]); + } + } + // 检查贴图数据是否初始化。 + for(name in this.textures){ + if (!this.textures[name].textureBuffer) { + this.textures[name].initialize(); + } + } + for(name in this.floats){ + shaderVariant.setFloat(name, this.floats[name]); + } + for(name in this.ints){ + shaderVariant.setInt(name, this.ints[name]); + } + for(name in this.floatArrays){ + shaderVariant.setFloats(name, this.floatArrays[name]); + } + for(name in this.textures){ + shaderVariant.setTexture(name, this.textures[name]); + } + for(name in this.vector2s){ + shaderVariant.setVector2(name, this.vector2s[name]); + } + for(name in this.vector3s){ + shaderVariant.setVector3(name, this.vector3s[name]); + } + for(name in this.vector4s){ + shaderVariant.setVector4(name, this.vector4s[name]); + } + for(name in this.colors){ + shaderVariant.setColor(name, this.colors[name]); + } + for(name in this.quaternions){ + shaderVariant.setQuaternion(name, this.quaternions[name]); + } + for(name in this.matrices){ + shaderVariant.setMatrix(name, this.matrices[name]); + } + for(name in this.matrice3s){ + shaderVariant.setMatrix3(name, this.matrice3s[name]); + } + for(name in this.vector4Arrays){ + shaderVariant.setVector4Array(name, this.vector4Arrays[name]); + } + for(name in this.matrixArrays){ + shaderVariant.setMatrixArray(name, this.matrixArrays[name]); + } + }; + _proto.getFloat = function getFloat(name) { + return this.floats[name]; + }; + _proto.setFloat = function setFloat(name, value) { + this.checkUniform(name); + this.floats[name] = value; + }; + _proto.getInt = function getInt(name) { + return this.ints[name]; + }; + _proto.setInt = function setInt(name, value) { + this.checkUniform(name); + this.ints[name] = value; + }; + _proto.getFloats = function getFloats(name) { + return this.floatArrays[name]; + }; + _proto.setFloats = function setFloats(name, value) { + this.checkUniform(name); + this.floatArrays[name] = value; + }; + _proto.getVector2 = function getVector2(name) { + return this.vector2s[name]; + }; + _proto.setVector2 = function setVector2(name, value) { + this.checkUniform(name); + this.vector2s[name] = value; + }; + _proto.getVector3 = function getVector3(name) { + return this.vector3s[name]; + }; + _proto.setVector3 = function setVector3(name, value) { + this.checkUniform(name); + this.vector3s[name] = value; + }; + _proto.getVector4 = function getVector4(name) { + return this.vector4s[name]; + }; + _proto.setVector4 = function setVector4(name, value) { + this.checkUniform(name); + this.vector4s[name] = value; + }; + _proto.getColor = function getColor(name) { + return this.colors[name]; + }; + _proto.setColor = function setColor(name, value) { + this.checkUniform(name); + this.colors[name] = value; + }; + _proto.getQuaternion = function getQuaternion(name) { + return this.quaternions[name]; + }; + _proto.setQuaternion = function setQuaternion(name, value) { + this.checkUniform(name); + this.quaternions[name] = value; + }; + _proto.getMatrix = function getMatrix(name) { + return this.matrices[name]; + }; + _proto.setMatrix = function setMatrix(name, value) { + this.checkUniform(name); + this.matrices[name] = value; + }; + _proto.setMatrix3 = function setMatrix3(name, value) { + this.checkUniform(name); + this.matrice3s[name] = value; + }; + _proto.getVector4Array = function getVector4Array(name) { + return this.vector4Arrays[name]; + }; + _proto.setVector4Array = function setVector4Array(name, array) { + this.checkUniform(name); + this.vector4Arrays[name] = []; + for(var _iterator = _create_for_of_iterator_helper_loose(array), _step; !(_step = _iterator()).done;){ + var v = _step.value; + this.vector4Arrays[name].push(v.x, v.y, v.z, v.w); + } + }; + _proto.getMatrixArray = function getMatrixArray(name) { + return this.matrixArrays[name]; + }; + _proto.setMatrixArray = function setMatrixArray(name, array) { + this.checkUniform(name); + this.matrixArrays[name] = []; + for(var _iterator = _create_for_of_iterator_helper_loose(array), _step; !(_step = _iterator()).done;){ + var m = _step.value; + for(var i = 0; i < 16; i++){ + this.matrixArrays[name].push(m.elements[i]); + } + } + }; + _proto.setMatrixNumberArray = function setMatrixNumberArray(name, array) { + this.checkUniform(name); + this.matrixArrays[name] = array; + }; + _proto.getTexture = function getTexture(name) { + return this.textures[name]; + }; + _proto.setTexture = function setTexture(name, texture) { + if (!this.samplers.includes(name)) { + this.samplers.push(name); + this.uniformDirty = true; + } + this.textures[name] = texture; + }; + _proto.hasUniform = function hasUniform(name) { + return this.uniforms.includes(name) || this.samplers.includes(name); + }; + _proto.clone = function clone(props) { + var newProps = props ? props : this.props; + var engine = this.engine; + assertExist(engine); + var clonedMaterial = new GLMaterial(engine, newProps); + // TODO: 更换 Object.assign,低端设备兼容问题 + clonedMaterial.glMaterialState = Object.assign(new GLMaterialState(), clonedMaterial.glMaterialState); + clonedMaterial.floats = this.floats; + clonedMaterial.ints = this.ints; + clonedMaterial.vector2s = this.vector2s; + clonedMaterial.vector3s = this.vector3s; + clonedMaterial.vector4s = this.vector4s; + clonedMaterial.colors = this.colors; + clonedMaterial.quaternions = this.quaternions; + clonedMaterial.matrices = this.matrices; + clonedMaterial.textures = this.textures; + clonedMaterial.floatArrays = this.floatArrays; + clonedMaterial.vector4Arrays = this.vector4Arrays; + clonedMaterial.matrixArrays = this.matrixArrays; + clonedMaterial.samplers = this.samplers; + clonedMaterial.uniforms = this.uniforms; + clonedMaterial.uniformDirty = true; + return clonedMaterial; + }; + _proto.fromData = function fromData(data) { + Material.prototype.fromData.call(this, data); + this.uniforms = []; + this.samplers = []; + this.textures = {}; + this.floats = {}; + this.ints = {}; + this.floatArrays = {}; + this.vector4s = {}; + var propertiesData = _extends({}, data); + if (data.stringTags["RenderType"] !== undefined) { + this.blending = data.stringTags["RenderType"] === RenderType.Transparent; + } + if (data.floats["ZTest"] !== undefined) { + this.depthTest = data.floats["ZTest"] !== 0; + } + if (data.floats["ZWrite"] !== undefined) { + this.depthMask = data.floats["ZWrite"] !== 0; + } + var renderFace = data.stringTags["RenderFace"]; + if (renderFace === RenderFace.Front) { + this.culling = true; + this.cullFace = glContext.BACK; + } else if (renderFace === RenderFace.Back) { + this.culling = true; + this.cullFace = glContext.FRONT; + } else { + this.culling = false; + } + var name; + for(name in propertiesData.floats){ + this.setFloat(name, propertiesData.floats[name]); + } + for(name in propertiesData.ints){ + this.setInt(name, propertiesData.ints[name]); + } + for(name in propertiesData.vector4s){ + var vector4Value = propertiesData.vector4s[name]; + this.setVector4(name, new Vector4$1(vector4Value.x, vector4Value.y, vector4Value.z, vector4Value.w)); + } + for(name in propertiesData.colors){ + var colorValue = propertiesData.colors[name]; + this.setColor(name, new Color(colorValue.r, colorValue.g, colorValue.b, colorValue.a)); + } + for(name in propertiesData.textures){ + var textureProperties = propertiesData.textures[name]; + var texture = this.engine.findObject(textureProperties.texture); + // TODO 纹理通过 id 加入场景数据 + this.setTexture(name, texture); + var offset = textureProperties.offset; + var scale = textureProperties.scale; + if (offset && scale) { + this.setVector4(name + "_ST", new Vector4(scale.x, scale.y, offset.x, offset.y)); + } + } + if (data.shader) { + var shader = this.engine.findObject(data.shader); + if (shader) { + this.shader = shader; + this.shaderSource = shader.shaderData; + } + } + var _data_stringTags; + this.stringTags = (_data_stringTags = data.stringTags) != null ? _data_stringTags : {}; + this.initialized = false; + }; + /** + * @since 2.0.0 + * @param sceneData + * @returns + */ _proto.toData = function toData() { + // @ts-expect-error + var materialData = this.defination; + if (this.shader) { + // @ts-expect-error + materialData.shader = this.shader; + } + materialData.floats = {}; + materialData.ints = {}; + materialData.vector4s = {}; + materialData.colors = {}; + materialData.textures = {}; + materialData.dataType = DataType.Material; + materialData.stringTags = this.stringTags; + for(var name in this.floats){ + materialData.floats[name] = this.floats[name]; + } + for(var name1 in this.ints){ + materialData.ints[name1] = this.ints[name1]; + } + for(var name2 in this.vector4s){ + materialData.vector4s[name2] = this.vector4s[name2]; + } + for(var name3 in this.colors){ + materialData.colors[name3] = this.colors[name3]; + } + for(var name4 in this.textures){ + if (!materialData.textures[name4]) { + materialData.textures[name4] = { + texture: this.textures[name4] + }; + } + var textureProperties = materialData.textures[name4]; + var scaleOffset = this.getVector4(name4 + "_ST"); + if (scaleOffset) { + textureProperties.scale = { + x: scaleOffset.x, + y: scaleOffset.y + }; + textureProperties.offset = { + x: scaleOffset.z, + y: scaleOffset.w + }; + delete materialData.vector4s[name4 + "_ST"]; + } + } + return materialData; + }; + _proto.cloneUniforms = function cloneUniforms(sourceMaterial) { + var material = sourceMaterial; + var name; + for(name in material.floats){ + this.setFloat(name, material.floats[name]); + } + for(name in material.ints){ + this.setInt(name, material.ints[name]); + } + for(name in material.floatArrays){ + this.setFloats(name, material.floatArrays[name]); + } + for(name in material.textures){ + this.setTexture(name, material.textures[name]); + } + for(name in material.vector2s){ + this.setVector2(name, material.vector2s[name]); + } + for(name in material.vector3s){ + this.setVector3(name, material.vector3s[name]); + } + for(name in material.vector4s){ + this.setVector4(name, material.vector4s[name]); + } + for(name in material.colors){ + this.setColor(name, material.colors[name]); + } + for(name in material.quaternions){ + this.setQuaternion(name, material.quaternions[name]); + } + for(name in material.matrices){ + this.setMatrix(name, material.matrices[name]); + } + for(name in material.vector4Arrays){ + var vec4Array = []; + for(var i = 0; i < material.vector4Arrays[name].length; i += 4){ + vec4Array.push(new Vector4(material.vector4Arrays[name][i], material.vector4Arrays[name][i + 1], material.vector4Arrays[name][i + 2], material.vector4Arrays[name][i + 3])); + } + this.setVector4Array(name, vec4Array); + } + for(name in material.matrixArrays){ + var mat4Array = []; + for(var i1 = 0; i1 < material.matrixArrays[name].length; i1 += 16){ + var matrix = Matrix4.fromIdentity(); + for(var j = 0; j < 16; j++){ + matrix.elements[j] = material.matrixArrays[name][i1 + j]; + } + mat4Array.push(matrix); + } + this.setMatrixArray(name, mat4Array); + } + }; + _proto.checkUniform = function checkUniform(uniformName) { + if (!this.uniforms.includes(uniformName)) { + this.uniforms.push(uniformName); + this.uniformDirty = true; + } + }; + _proto.dispose = function dispose(options) { + var _this = this; + var _this_shaderVariant; + if (this.destroyed) { + return; + } + (_this_shaderVariant = this.shaderVariant) == null ? void 0 : _this_shaderVariant.dispose(); + if ((options == null ? void 0 : options.textures) !== exports.DestroyOptions.keep) { + Object.keys(this.textures).forEach(function(key) { + var texture = _this.textures[key]; + // TODO 纹理释放需要引用计数 + if (texture !== _this.engine.emptyTexture) { + texture.dispose(); + } + }); + } + // @ts-expect-error + this.shaderSource = null; + // @ts-expect-error + this.uniformSemantics = {}; + this.floats = {}; + this.ints = {}; + this.vector2s = {}; + this.vector3s = {}; + this.vector4s = {}; + this.quaternions = {}; + this.matrices = {}; + this.matrice3s = {}; + this.textures = {}; + this.floatArrays = {}; + this.vector4Arrays = {}; + this.matrixArrays = {}; + this.samplers = []; + this.uniforms = []; + this.initialize = throwDestroyedError; + this.destroyed = true; + if (this.engine !== undefined) { + this.engine.removeMaterial(this); + } + }; + _create_class(GLMaterial, [ + { + key: "blending", + get: function get() { + return this.glMaterialState.blending; + }, + set: function set(blending) { + blending !== undefined && this.glMaterialState.setBlending(blending); + } + }, + { + key: "blendColor", + get: function get() { + return this.glMaterialState.blendColor; + }, + set: function set(color) { + color && this.glMaterialState.setBlendColor(color); + } + }, + { + key: "blendFunction", + get: function get() { + return this.glMaterialState.blendFunctionParameters; + }, + set: function set(func) { + func && this.glMaterialState.setBlendFunctionParameters(func); + } + }, + { + key: "blendEquation", + get: function get() { + return this.glMaterialState.blendEquationParameters; + }, + set: function set(equation) { + equation && this.glMaterialState.setBlendEquationParameters(equation); + } + }, + { + key: "depthTest", + get: function get() { + return this.glMaterialState.depthTest; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setDepthTest(value); + } + }, + { + key: "depthMask", + get: function get() { + return this.glMaterialState.depthMask; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setDepthMask(value); + } + }, + { + key: "depthRange", + get: function get() { + return this.glMaterialState.depthRange; + }, + set: function set(value) { + value && this.glMaterialState.setDepthRange(value); + } + }, + { + key: "depthFunc", + get: function get() { + return this.glMaterialState.depthFunc; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setDepthFunc(value); + } + }, + { + key: "polygonOffsetFill", + get: function get() { + return this.glMaterialState.polygonOffsetFill; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setPolygonOffsetFill(value); + } + }, + { + key: "polygonOffset", + get: function get() { + return this.glMaterialState.polygonOffset; + }, + set: function set(value) { + value && this.glMaterialState.setPolygonOffset(value); + } + }, + { + key: "sampleAlphaToCoverage", + get: function get() { + return this.glMaterialState.sampleAlphaToCoverage; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setSampleAlphaToCoverage(value); + } + }, + { + key: "colorMask", + get: function get() { + return this.glMaterialState.colorMask[0]; + }, + set: function set(value) { + this.glMaterialState.setColorMask(value); + } + }, + { + key: "stencilTest", + get: function get() { + return this.glMaterialState.stencilTest; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setStencilTest(value); + } + }, + { + key: "stencilMask", + get: function get() { + return this.glMaterialState.stencilMask; + }, + set: function set(value) { + value && this.glMaterialState.setStencilMask(value); + } + }, + { + key: "stencilRef", + get: function get() { + return this.glMaterialState.stencilRef; + }, + set: function set(value) { + value && this.glMaterialState.setStencilRef(value); + } + }, + { + key: "stencilFunc", + get: function get() { + return this.glMaterialState.stencilFunc; + }, + set: function set(value) { + value && this.glMaterialState.setStencilFunc(value); + } + }, + { + key: "stencilOpFail", + get: function get() { + return this.glMaterialState.stencilOpFail; + }, + set: function set(value) { + value && this.glMaterialState.setStencilOpFail(value); + } + }, + { + key: "stencilOpZFail", + get: function get() { + return this.glMaterialState.stencilOpZFail; + }, + set: function set(value) { + value && this.glMaterialState.setStencilOpZFail(value); + } + }, + { + key: "stencilOpZPass", + get: function get() { + return this.glMaterialState.stencilOpZPass; + }, + set: function set(value) { + value && this.glMaterialState.setStencilOpZPass(value); + } + }, + { + key: "culling", + get: function get() { + return this.glMaterialState.culling; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setCulling(value); + } + }, + { + key: "frontFace", + get: function get() { + return this.glMaterialState.frontFace; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setFrontFace(value); + } + }, + { + key: "cullFace", + get: function get() { + return this.glMaterialState.cullFace; + }, + set: function set(value) { + value !== undefined && this.glMaterialState.setCullFace(value); + } + }, + { + key: "isDestroyed", + get: function get() { + return this.destroyed; + } + } + ]); + return GLMaterial; +}(Material); + +var copyShaderId = "$mri-internal-copy"; +var ExtWrap = /*#__PURE__*/ function() { + function ExtWrap(renderer) { + this.renderer = renderer; + if (renderer.engine.gpuCapability.level === 1) { + this.copyRenderPass = this.createCopyRenderPass().initialize(renderer); + var shaderSource = this.copyRenderPass.meshes[0].material.shaderSource; + renderer.pipelineContext.shaderLibrary.addShader(shaderSource); + } + } + var _proto = ExtWrap.prototype; + _proto.resetColorAttachments = function resetColorAttachments(rp, colorTextures) { + if (this.renderer) { + rp.resetColorAttachments(colorTextures); + } + }; + _proto.copyTexture = function copyTexture(source, tex) { + if (!this.renderer) { + return; + } + source.initialize(); + tex.initialize(); + tex.updateSource({ + sourceType: exports.TextureSourceType.framebuffer, + data: { + width: tex.getWidth() || source.getWidth(), + height: tex.getHeight() || source.getHeight() + } + }); + if (this.renderer.engine.gpuCapability.level === 2) { + this.copy2(source, tex); + } else { + this.copy1(source, tex); + } + }; + _proto.copy2 = function copy2(source, target) { + // 保存当前的 fbo + var framebuffer = this.renderer.getFramebuffer(); + this.renderer.glRenderer.copy2(source, target); + // 还原 fbo + this.renderer.setFramebuffer(framebuffer); + }; + _proto.copy1 = function copy1(source, target) { + var rp = this.copyRenderPass; + if (rp) { + var renderer = this.renderer; + if (renderer) { + var fb = rp.framebuffer; + fb.viewport[2] = target.getWidth() || source.getWidth(); + fb.viewport[3] = target.getHeight() || source.getHeight(); + renderer.glRenderer.resetColorAttachments(fb, [ + target + ]); + var mesh = rp.meshes[0]; + mesh.material.setTexture("uTex", source); + renderer.renderRenderPass(rp); + } + } + }; + _proto.createCopyRenderPass = function createCopyRenderPass() { + var name = "mri-copy-mesh"; + var attachment = { + texture: { + format: glContext.RGBA + } + }; + var engine = this.renderer.engine; + var geometry = new GLGeometry(engine, { + name: name, + mode: glContext.TRIANGLE_STRIP, + attributes: { + aPos: { + type: glContext.FLOAT, + size: 2, + data: new Float32Array([ + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1 + ]) + } + }, + drawCount: 4 + }); + var vertexShader = "\nprecision highp float;\nattribute vec2 aPos;\nvarying vec2 vTex;\nvoid main(){\n gl_Position = vec4(aPos,0.,1.0);\n vTex = (aPos + vec2(1.))/2.;\n}"; + var fragmentShader = "\nprecision highp float;\nvarying vec2 vTex;\nuniform sampler2D uTex;\nvoid main(){\n gl_FragColor = texture2D(uTex,vTex);\n}"; + var level = engine.gpuCapability.level; + var material = new GLMaterial(engine, { + name: name, + shader: { + cacheId: copyShaderId, + name: name, + vertex: vertexShader, + fragment: fragmentShader, + glslVersion: level === 2 ? exports.GLSLVersion.GLSL3 : exports.GLSLVersion.GLSL1 + } + }); + material.blending = false; + material.depthTest = false; + material.culling = false; + var mesh = new Mesh(engine, { + name: name, + geometry: geometry, + material: material, + priority: 0 + }); + return new CopyTexturePass(this.renderer, { + name: "mri-copy-rp", + clearAction: { + colorAction: exports.TextureLoadAction.whatever + }, + attachments: [ + attachment + ], + meshes: [ + mesh + ] + }); + }; + _proto.dispose = function dispose() { + if (this.renderer) { + var _this_copyRenderPass; + (_this_copyRenderPass = this.copyRenderPass) == null ? void 0 : _this_copyRenderPass.dispose(); + // @ts-expect-error + this.renderer = undefined; + } + }; + return ExtWrap; +}(); +var CopyTexturePass = /*#__PURE__*/ function(RenderPass) { + _inherits(CopyTexturePass, RenderPass); + function CopyTexturePass() { + return RenderPass.apply(this, arguments); + } + var _proto = CopyTexturePass.prototype; + _proto.configure = function configure(renderer) { + this.currentFramebuffer = renderer.getFramebuffer(); + renderer.setFramebuffer(this.framebuffer); + }; + _proto.execute = function execute(renderer) { + if (this.clearAction) { + renderer.clear(this.clearAction); + } + renderer.renderMeshes(this.meshes); + if (this.storeAction) { + renderer.clear(this.storeAction); + } + renderer.setFramebuffer(this.currentFramebuffer); + }; + return CopyTexturePass; +}(RenderPass); + +var GLContextManager = /*#__PURE__*/ function() { + function GLContextManager(canvas, glType, options) { + var _this = this; + if (glType === void 0) glType = "webgl"; + if (options === void 0) options = {}; + this.canvas = canvas; + this.glType = glType; + this.restoreHandlers = []; + this.lostHandlers = []; + assertExist(canvas); + this.gl = createGLContext(canvas, glType, options); + this.contextLostListener = function(e) { + var _this_canvas; + for(var _iterator = _create_for_of_iterator_helper_loose(_this.lostHandlers), _step; !(_step = _iterator()).done;){ + var lostHandler = _step.value; + lostHandler.lost(e); + } + (_this_canvas = _this.canvas) == null ? void 0 : _this_canvas.removeEventListener("webglcontextlost", _this.contextLostListener); + }; + this.contextRestoredListener = function(e) { + var _this_canvas; + for(var _iterator = _create_for_of_iterator_helper_loose(_this.restoreHandlers), _step; !(_step = _iterator()).done;){ + var restorable = _step.value; + restorable.restore(); + } + (_this_canvas = _this.canvas) == null ? void 0 : _this_canvas.addEventListener("webglcontextlost", _this.contextLostListener); + }; + canvas.addEventListener("webglcontextlost", this.contextLostListener); + canvas.addEventListener("webglcontextrestored", this.contextRestoredListener); + } + var _proto = GLContextManager.prototype; + _proto.dispose = function dispose() { + if (this.canvas) { + this.canvas.removeEventListener("webglcontextlost", this.contextLostListener); + this.canvas.removeEventListener("webglcontextrestored", this.contextRestoredListener); + } + this.gl = null; + this.canvas = null; + }; + _proto.addLostHandler = function addLostHandler(lostHandler) { + this.lostHandlers.push(lostHandler); + }; + _proto.removeLostHandler = function removeLostHandler(lostHandler) { + var index = this.lostHandlers.indexOf(lostHandler); + if (index > -1) { + this.lostHandlers.splice(index, 1); + } + }; + _proto.addRestoreHandler = function addRestoreHandler(restoreHandler) { + this.restoreHandlers.push(restoreHandler); + }; + _proto.removeRestoreHandler = function removeRestoreHandler(restorable) { + var index = this.restoreHandlers.indexOf(restorable); + if (index > -1) { + this.restoreHandlers.splice(index, 1); + } + }; + return GLContextManager; +}(); + +var GLEngine = /*#__PURE__*/ function(Engine) { + _inherits(GLEngine, Engine); + function GLEngine(gl) { + var _this; + _this = Engine.call(this) || this; + _this.gpuCapability = new GPUCapability(gl); + return _this; + } + var _proto = GLEngine.prototype; + _proto.dispose = function dispose() { + if (this.isDestroyed) { + return; + } + Engine.prototype.dispose.call(this); + }; + _proto.getGLRenderer = function getGLRenderer() { + return this.renderer; + }; + _proto.getGLRendererInternal = function getGLRendererInternal() { + return this.getGLRenderer().glRenderer; + }; + _proto.getGLPipelineContext = function getGLPipelineContext() { + return this.getGLRenderer().pipelineContext; + }; + return GLEngine; +}(Engine); + +var GLRenderbuffer = /*#__PURE__*/ function(Renderbuffer) { + _inherits(GLRenderbuffer, Renderbuffer); + function GLRenderbuffer(props, renderer) { + var _this; + _this = Renderbuffer.call(this, props) || this; + _this.initialized = false; + if (renderer !== undefined) { + _this.initialize(renderer); + } + return _this; + } + var _proto = GLRenderbuffer.prototype; + _proto.initialize = function initialize(renderer) { + if (this.initialized) { + return; + } + this.initialized = true; + this.renderer = renderer; + this.buffer = renderer.createGLRenderbuffer(this); + }; + _proto.setSize = function setSize(width, height) { + if (!this.initialized) { + logger.error("Can't set size for uninitialized render buffer."); + return; + } + if (!this.renderer) { + return; + } + if (width !== this.size[0] || height !== this.size[1]) { + var _this_renderer = this.renderer, gl = _this_renderer.gl, state = _this_renderer.pipelineContext; + state.bindRenderbuffer(gl.RENDERBUFFER, this.buffer); + if (width && height) { + gl.renderbufferStorage(gl.RENDERBUFFER, this.format, this.size[0] = width, this.size[1] = height); + } else { + logger.error("Invalid render buffer size: " + width + "x" + height + "."); + } + } + }; + _proto.dispose = function dispose() { + if (this.renderer) { + this.renderer.deleteGLRenderbuffer(this); + this.renderer = null; + this.buffer = null; + } + this.destroyed = true; + this.initialize = throwDestroyedError; + }; + return GLRenderbuffer; +}(Renderbuffer); + +var seed$1 = 1; +var GLFramebuffer = /*#__PURE__*/ function(Framebuffer) { + _inherits(GLFramebuffer, Framebuffer); + function GLFramebuffer(props, renderer) { + var _this; + _this = Framebuffer.call(this) || this; + _this.attachmentTextures = []; + var depthStencilAttachment = props.depthStencilAttachment, viewport = props.viewport, isCustomViewport = props.isCustomViewport, storeAction = props.storeAction, _props_viewportScale = props.viewportScale, viewportScale = _props_viewportScale === void 0 ? 1 : _props_viewportScale, _props_name = props.name, name = _props_name === void 0 ? "GLFramebuffer" + seed$1++ : _props_name; + _this.renderer = renderer; + _this.engine = renderer.engine; + var _depthStencilAttachment_storageType; + _this.depthStencilStorageType = (_depthStencilAttachment_storageType = depthStencilAttachment == null ? void 0 : depthStencilAttachment.storageType) != null ? _depthStencilAttachment_storageType : exports.RenderPassAttachmentStorageType.none; + _this.viewport = viewport; + _this.isCustomViewport = !!isCustomViewport; + _this.viewportScale = viewportScale; + _this.name = name; + _this.storeAction = storeAction; + _this.updateProps(props); + return _this; + } + var _proto = GLFramebuffer.prototype; + _proto.getDepthTexture = function getDepthTexture() { + return this.depthTexture; + }; + _proto.getStencilTexture = function getStencilTexture() { + return this.stencilTexture; + }; + _proto.getColorTextures = function getColorTextures() { + return this.colorTextures; + }; + _proto.updateAttachmentTextures = function updateAttachmentTextures() { + var _this = this; + this.attachmentTextures.length = 0; + this.colorTextures.forEach(function(tex) { + tex.initialize(); + addItem(_this.attachmentTextures, tex.textureBuffer); + }); + if (this.stencilTexture) { + addItem(this.attachmentTextures, this.stencilTexture.textureBuffer); + } + if (this.depthTexture) { + addItem(this.attachmentTextures, this.depthTexture.textureBuffer); + } + }; + _proto.updateProps = function updateProps(props) { + var _props_depthStencilAttachment; + var renderer = this.renderer; + var gpuCapability = this.engine.gpuCapability; + var _props_depthStencilAttachment1; + var depthStencilAttachment = (_props_depthStencilAttachment1 = props.depthStencilAttachment) != null ? _props_depthStencilAttachment1 : { + storageType: exports.RenderPassAttachmentStorageType.none + }; + var willUseFbo = props.attachments.length > 0; + var separateDepthStencil = true; + this.externalStorage = false; + if (props.attachments.length > 1 && !gpuCapability.detail.drawBuffers) { + throw new Error("Multiple color attachments not support."); + } + var optDepthStencilTex = (_props_depthStencilAttachment = props.depthStencilAttachment) == null ? void 0 : _props_depthStencilAttachment.texture; + var readableDepthStencilTextures = gpuCapability.detail.readableDepthStencilTextures; + var storageType = depthStencilAttachment.storageType, storage = depthStencilAttachment.storage; + this.colorTextures = props.attachments.slice(); + if (!willUseFbo && storageType !== exports.RenderPassAttachmentStorageType.none) { + throw new Error("Use depth stencil attachment without color attachments."); + } + if (willUseFbo) { + this.fbo = renderer.glRenderer.createGLFramebuffer(this, this.name); + } + switch(storageType){ + case exports.RenderPassAttachmentStorageType.depth_stencil_opaque: + if (storage) { + if (_instanceof1(storage, GLRenderbuffer)) { + this.depthStencilRenderbuffer = storage; + this.externalStorage = true; + } else { + throw new Error("Invalid depth stencil attachment storage."); + } + } else { + this.depthStencilRenderbuffer = new GLRenderbuffer({ + format: glContext.DEPTH_STENCIL, + attachment: glContext.DEPTH_STENCIL_ATTACHMENT, + storageType: storageType + }, renderer.glRenderer); + } + separateDepthStencil = false; + break; + case exports.RenderPassAttachmentStorageType.depth_16_opaque: + if (storage) { + if (_instanceof1(storage, GLRenderbuffer)) { + this.depthStencilRenderbuffer = storage; + this.externalStorage = true; + } else { + throw new Error("Invalid depth attachment storage."); + } + } else { + this.depthStencilRenderbuffer = new GLRenderbuffer({ + attachment: glContext.DEPTH_ATTACHMENT, + format: glContext.DEPTH_COMPONENT16, + storageType: storageType + }, renderer.glRenderer); + } + break; + case exports.RenderPassAttachmentStorageType.stencil_8_opaque: + if (storage) { + if (_instanceof1(storage, GLRenderbuffer)) { + this.depthStencilRenderbuffer = storage; + this.externalStorage = true; + } else { + throw new Error("Invalid stencil attachment storage."); + } + } else { + this.depthStencilRenderbuffer = new GLRenderbuffer({ + attachment: glContext.STENCIL_ATTACHMENT, + format: glContext.STENCIL_INDEX8, + storageType: storageType + }, renderer.glRenderer); + } + break; + case exports.RenderPassAttachmentStorageType.depth_16_texture: + if (!readableDepthStencilTextures) { + throw new Error("Depth texture is not support in framebuffer."); + } + this.depthTexture = optDepthStencilTex != null ? optDepthStencilTex : new GLTexture(this.engine, { + sourceType: exports.TextureSourceType.framebuffer, + format: glContext.DEPTH_COMPONENT, + internalFormat: gpuCapability.internalFormatDepth16, + type: glContext.UNSIGNED_SHORT, + name: "" + this.name + "##depthTex" + }); + this.depthTexture.initialize(); + break; + case exports.RenderPassAttachmentStorageType.depth_24_stencil_8_texture: + if (!readableDepthStencilTextures) { + throw new Error("Depth stencil texture is not support in framebuffer."); + } + this.depthTexture = this.stencilTexture = optDepthStencilTex != null ? optDepthStencilTex : new GLTexture(this.engine, { + sourceType: exports.TextureSourceType.framebuffer, + format: glContext.DEPTH_STENCIL, + internalFormat: gpuCapability.internalFormatDepth24_stencil8, + type: gpuCapability.UNSIGNED_INT_24_8, + name: "" + this.name + "##dpthStclTex" + }); + this.depthTexture.initialize(); + separateDepthStencil = true; + break; + } + this.storeInvalidAttachments = this.getStoreAttachments(this.storeAction, separateDepthStencil); + this.updateAttachmentTextures(); + }; + _proto.getStoreAttachments = function getStoreAttachments(storeAction, separateDepthStencil) { + var gl = this.renderer.glRenderer.gl; + var colorLen = this.colorTextures.length; + if (storeAction && isWebGL2(gl) && colorLen > 0) { + var attachments = []; + if (storeAction.depthAction === exports.TextureStoreAction.clear && this.depthStorage) { + addItem(attachments, separateDepthStencil ? gl.DEPTH_ATTACHMENT : gl.DEPTH_STENCIL_ATTACHMENT); + } + if (storeAction.stencilAction === exports.TextureStoreAction.clear && this.stencilStorage) { + addItem(attachments, separateDepthStencil ? gl.STENCIL_ATTACHMENT : gl.DEPTH_STENCIL_ATTACHMENT); + } + if (storeAction.colorAction === exports.TextureStoreAction.clear) { + for(var i = 0; i < colorLen; i++){ + addItem(attachments, gl["COLOR_ATTACHMENT" + i]); + } + } + return attachments; + } + }; + _proto.unbind = function unbind() { + var attachments = this.storeInvalidAttachments; + if (attachments == null ? void 0 : attachments.length) { + var gl = this.renderer.glRenderer.gl; + if (isWebGL2(gl)) { + gl.invalidateFramebuffer(gl.FRAMEBUFFER, attachments); + } + } + this.renderer.pipelineContext.bindSystemFramebuffer(); + }; + _proto.bind = function bind() { + var _this = this; + if (!this.fbo) { + return; + } + var gl = this.renderer.glRenderer.gl; + var state = this.renderer.pipelineContext; + var _this_viewport = this.viewport, x = _this_viewport[0], y = _this_viewport[1], width = _this_viewport[2], height = _this_viewport[3]; + state.bindFramebuffer(gl.FRAMEBUFFER, this.fbo); + // TODO 不在bind中设置viewport + state.viewport(x, y, width, height); + var emptyTexture = this.renderer.glRenderer.emptyTexture2D.textureBuffer; + // in case frame texture loop + Object.keys(state.textureUnitDict).forEach(function(unit) { + var texture = state.textureUnitDict[unit]; + if (texture && texture !== emptyTexture && _this.attachmentTextures.includes(texture)) { + state.activeTexture(+unit); + _this.renderer.glRenderer.emptyTexture2D.bind(); + } + }); + // FIXME: 没有pipeline对象的临时方案 + for(var i = 0; i < 4; i++){ + state.activeTexture(gl.TEXTURE0 + i); + this.renderer.glRenderer.emptyTexture2D.bind(); + } + if (this.ready) { + return; + } + var _this1 = this, depthStencilRenderbuffer = _this1.depthStencilRenderbuffer, depthTexture = _this1.depthTexture, stencilTexture = _this1.stencilTexture; + state.activeTexture(gl.TEXTURE0); + if (depthStencilRenderbuffer) { + depthStencilRenderbuffer.setSize(width, height); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, depthStencilRenderbuffer.attachment, gl.RENDERBUFFER, depthStencilRenderbuffer.buffer); + } else if (depthTexture) { + // 解决RenderPass在Clone深度贴图时width和height丢失的问题 + depthTexture.source.data = { + width: width, + height: height + }; + depthTexture.update({ + data: { + width: width, + height: height, + data: new Uint16Array(0) + } + }); + var attachment = depthTexture && stencilTexture ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT; + gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthTexture.textureBuffer, 0); + } + this.resetColorTextures(this.colorTextures); + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status !== gl.FRAMEBUFFER_COMPLETE) { + throw new Error("Framebuffer failed. gl status=" + status + ", gl error=" + gl.getError() + ", gl isContextLost=" + gl.isContextLost() + "."); + } + this.ready = true; + }; + _proto.resetColorTextures = function resetColorTextures(colorTextures) { + var colors = colorTextures; + var gl = this.renderer.glRenderer.gl; + var gpuCapability = this.engine.gpuCapability; + var viewport = this.viewport; + var buffers = []; + if (colors) { + for(var _iterator = _create_for_of_iterator_helper_loose(colors), _step; !(_step = _iterator()).done;){ + var texture = _step.value; + texture.initialize(); + } + this.colorTextures = colors.slice(); + } + this.renderer.pipelineContext.activeTexture(gl.TEXTURE0); + this.colorTextures.forEach(function(tex, index) { + var width = viewport[2]; + var height = viewport[3]; + var data = { + width: width, + height: height, + data: new Uint8Array(0) + }; + tex.update({ + data: data + }); + gpuCapability.framebufferTexture2D(gl, gl.FRAMEBUFFER, index, gl.TEXTURE_2D, tex.textureBuffer); + buffers.push(true); + }); + gpuCapability.drawBuffers(gl, buffers); + this.updateAttachmentTextures(); + }; + _proto.resize = function resize(x, y, width, height) { + var _this_viewport = this.viewport, preX = _this_viewport[0], preY = _this_viewport[1], preWidth = _this_viewport[2], preHeight = _this_viewport[3]; + if (preX !== x || preY !== y || preWidth !== width || preHeight !== height) { + this.viewport = [ + x, + y, + width, + height + ]; + this.ready = false; + this.bind(); + } + }; + _proto.dispose = function dispose(options) { + if (this.renderer) { + this.renderer.glRenderer.deleteGLFramebuffer(this); + delete this.fbo; + var clearAttachment = (options == null ? void 0 : options.depthStencilAttachment) ? options.depthStencilAttachment : exports.RenderPassDestroyAttachmentType.force; + if (clearAttachment === exports.RenderPassDestroyAttachmentType.force || clearAttachment === exports.RenderPassDestroyAttachmentType.keepExternal && !this.externalStorage) { + var _this_depthStencilRenderbuffer, _this_depthTexture; + (_this_depthStencilRenderbuffer = this.depthStencilRenderbuffer) == null ? void 0 : _this_depthStencilRenderbuffer.dispose(); + (_this_depthTexture = this.depthTexture) == null ? void 0 : _this_depthTexture.dispose(); + } + // @ts-expect-error safe to assign + this.renderer = this.stencilRenderbuffer = this.depthStencilRenderbuffer = null; + } + }; + _create_class(GLFramebuffer, [ + { + key: "stencilStorage", + get: function get() { + var storageType = this.depthStencilStorageType; + if (storageType !== exports.RenderPassAttachmentStorageType.depth_16_opaque) { + return this.depthStencilRenderbuffer; + } + } + }, + { + key: "depthStorage", + get: function get() { + if (this.depthStencilStorageType !== exports.RenderPassAttachmentStorageType.stencil_8_opaque) { + return this.depthStencilRenderbuffer; + } + } + } + ]); + return GLFramebuffer; +}(Framebuffer); + +var BlockUniformInfoOffset = 1; +var BlockUniformInfoByteLength = 8; +var BlockUniformInfoType = 0; +var BlockUniformInfoArrayStride = 4; +var BlockUniformInfoArraySize = 2; +var BlockUniformInfoRowStride = 5; +var _obj; +var ItemPerValueMap = (_obj = {}, _obj[glContext.FLOAT] = 1, _obj[glContext.INT] = 1, _obj[glContext.UNSIGNED_INT] = 1, _obj[glContext.SHORT] = 1, _obj[glContext.BOOL] = 1, _obj[glContext.UNSIGNED_SHORT] = 1, _obj[glContext.FLOAT_VEC2] = 2, _obj[glContext.FLOAT_VEC3] = 3, _obj[glContext.FLOAT_VEC4] = 4, _obj[glContext.FLOAT_MAT2] = 4, _obj[glContext.FLOAT_MAT3] = 9, _obj[glContext.FLOAT_MAT4] = 16, _obj[glContext.FLOAT_MAT2x3] = 6, _obj[glContext.FLOAT_MAT2x4] = 8, _obj[glContext.FLOAT_MAT4x3] = 12, _obj[glContext.FLOAT_MAT4x2] = 8, _obj[glContext.FLOAT_MAT3x4] = 12, _obj[glContext.FLOAT_MAT3x2] = 6, _obj[glContext.INT_VEC2] = 2, _obj[glContext.INT_VEC3] = 3, _obj[glContext.INT_VEC4] = 4, _obj[glContext.UNSIGNED_INT_VEC2] = 2, _obj[glContext.UNSIGNED_INT_VEC3] = 3, _obj[glContext.UNSIGNED_INT_VEC4] = 4, _obj[glContext.BOOL_VEC2] = 2, _obj[glContext.BOOL_VEC3] = 3, _obj[glContext.BOOL_VEC4] = 4, _obj); +var setFloat32Array = arraySetter(Float32Array); +var setInt32Array = arraySetter(Int32Array); +var setUInt8Array = arraySetter(Uint8Array); +var _obj1; +(_obj1 = {}, _obj1[glContext.FLOAT] = numberSetter(Float32Array), _obj1[glContext.INT] = numberSetter(Int32Array), _obj1[glContext.UNSIGNED_INT] = numberSetter(Uint32Array), _obj1[glContext.SHORT] = numberSetter(Int16Array), _obj1[glContext.BOOL] = numberSetter(Uint8Array), _obj1[glContext.UNSIGNED_SHORT] = numberSetter(Uint16Array), _obj1[glContext.FLOAT_VEC2] = setFloat32Array, _obj1[glContext.FLOAT_VEC3] = setFloat32Array, _obj1[glContext.FLOAT_VEC4] = setFloat32Array, _obj1[glContext.FLOAT_MAT2] = setFloat32Array, _obj1[glContext.FLOAT_MAT3] = setFloat32Array, _obj1[glContext.FLOAT_MAT4] = setFloat32Array, _obj1[glContext.FLOAT_MAT2x3] = setFloat32Array, _obj1[glContext.FLOAT_MAT2x4] = setFloat32Array, _obj1[glContext.FLOAT_MAT4x3] = setFloat32Array, _obj1[glContext.FLOAT_MAT4x2] = setFloat32Array, _obj1[glContext.FLOAT_MAT3x4] = setFloat32Array, _obj1[glContext.FLOAT_MAT3x2] = setFloat32Array, _obj1[glContext.INT_VEC2] = setInt32Array, _obj1[glContext.INT_VEC3] = setInt32Array, _obj1[glContext.INT_VEC4] = setInt32Array, _obj1[glContext.UNSIGNED_INT_VEC2] = setInt32Array, _obj1[glContext.UNSIGNED_INT_VEC3] = setInt32Array, _obj1[glContext.UNSIGNED_INT_VEC4] = setInt32Array, _obj1[glContext.BOOL_VEC2] = setUInt8Array, _obj1[glContext.BOOL_VEC3] = setUInt8Array, _obj1[glContext.BOOL_VEC4] = setUInt8Array, _obj1); +function numberSetter(typedArray) { + return function(value, info, name, range) { + var flag = { + start: info[BlockUniformInfoOffset], + dirty: true + }; + var arrSize = info[BlockUniformInfoArraySize]; + if (arrSize > 1) { + var values = value; + if (values.length) { + var eleCount = range[1] || values.length; + var vecLen = info[BlockUniformInfoArrayStride] / typedArray.BYTES_PER_ELEMENT; + var buffer = flag.buffer = new typedArray(eleCount * vecLen); + var start = range[0] || 0; + for(var i = 0; i < eleCount; i++){ + buffer[i * vecLen] = values[i + start]; + } + flag.start += start * vecLen; + } + } else { + flag.buffer = new typedArray([ + value + ]); + } + return flag; + }; +} +function arraySetter(type) { + return function(value, info, name, range) { + var blockByteLen = info[BlockUniformInfoByteLength]; + var arrSize = info[BlockUniformInfoArraySize]; + var rowStride = info[BlockUniformInfoRowStride]; + var entryStride = arrSize === 1 ? blockByteLen : info[BlockUniformInfoArrayStride]; + var entryRowCount = rowStride ? entryStride / rowStride : 1; + var rowNumPadding = entryStride / type.BYTES_PER_ELEMENT / entryRowCount; + var maxRowCount = blockByteLen / type.BYTES_PER_ELEMENT / rowNumPadding; + //set array + var numPerEntry = ItemPerValueMap[info[BlockUniformInfoType]]; + var numPerRow = numPerEntry / entryRowCount; + var valueStartIndex = (range[0] || 0) * numPerEntry; + var totalRow = range[1] ? entryRowCount * range[1] : maxRowCount; + var buffer = new type(rowNumPadding * totalRow); + var flag = { + start: info[BlockUniformInfoOffset] + entryStride * (range[0] || 0), + dirty: true, + buffer: buffer + }; + for(var i = 0, bufferTarget = 0, sourceIndex = valueStartIndex; i < totalRow; i++){ + for(var j = 0; j < numPerRow; j++){ + buffer[bufferTarget + j] = value[sourceIndex + j]; + } + bufferTarget += rowNumPadding; + sourceIndex += numPerRow; + } + return flag; + }; +} +// TODO: 函数名重定义 +function createUniformBlockDataFromProgram(gl, program) { + var _loop = function(idx) { + var name = gl.getActiveUniformBlockName(program, idx); + assertExist(name); + var blockSpec = { + index: gl.getUniformBlockIndex(program, name), + usedByVertexShader: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER), + usedByFragmentShader: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER), + size: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_DATA_SIZE), + uniformIndices: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES), + used: false, + uniforms: {}, + name: name, + id: "" + }; + blockSpec.used = blockSpec.usedByVertexShader || blockSpec.usedByFragmentShader; + blockSpecs[idx] = blockSpec; + var indices = blockSpec.uniformIndices; + var uniformNames = []; + for(var i = 0; i < indices.length; i++){ + var name1 = gl.getActiveUniform(program, indices[i]).name.replace("[0]", ""); + blockSpec.uniforms[name1] = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + i, + 0 + ]; + uniformNames[i] = name1; + blockUniformNames.push(name1); + } + [ + gl.UNIFORM_TYPE, + gl.UNIFORM_OFFSET, + gl.UNIFORM_SIZE, + gl.UNIFORM_BLOCK_INDEX, + gl.UNIFORM_ARRAY_STRIDE, + gl.UNIFORM_MATRIX_STRIDE, + gl.UNIFORM_IS_ROW_MAJOR + ].forEach(function(param, pi) { + gl.getActiveUniforms(program, indices, param).forEach(function(value, idx) { + var name = uniformNames[idx]; + blockSpec.uniforms[name][pi] = +value; + }); + }); + for(var i1 = 0; i1 < uniformNames.length; i1++){ + var uniform = blockSpec.uniforms[uniformNames[i1]]; + var nextUniform = blockSpec.uniforms[uniformNames[i1 + 1]]; + var size = nextUniform ? nextUniform[1] : blockSpec.size; + uniform[8] = size - uniform[1]; + } + blockSpec.id = getUboHash(blockSpec) + ""; + }; + var blockSpecs = []; + var blockUniformNames = []; + var uniformBlocks = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS); + for(var idx = 0; idx < uniformBlocks; ++idx)_loop(idx); + return { + blockSpecs: blockSpecs, + blockUniformNames: blockUniformNames + }; +} +function stringHash() { + for(var _len = arguments.length, strings = new Array(_len), _key = 0; _key < _len; _key++){ + strings[_key] = arguments[_key]; + } + var h = 0; + for(var j = 0; j < arguments.length; j++){ + var s = strings[j]; + for(var i = 0; i < s.length; i++){ + h = Math.imul(31, h) + s.charCodeAt(i) | 0; + } + } + return h; +} +function getUboHash(spec) { + var name = spec.name, size = spec.size, uniforms = spec.uniforms, uniformIndices = spec.uniformIndices; + var ret = Object.keys(uniforms).map(function(name) { + return name + "[" + uniforms[name].join(":") + "]"; + }).join("+"); + return stringHash("" + name + "+", "" + size + "+", "" + uniformIndices.length + "+", ret); +} + +var GLProgram = /*#__PURE__*/ function() { + function GLProgram(engine, program, id) { + var _this = this; + this.engine = engine; + this.program = program; + this.id = id; + this.uniformBlockMap = {}; + this.pipelineContext = engine.getGLPipelineContext(); + var gl = this.pipelineContext.gl; + this.pipelineContext.useProgram(program); + this.attribInfoMap = this.createAttribMap(); + if (isWebGL2(gl)) { + var blockSpecs = createUniformBlockDataFromProgram(gl, program).blockSpecs; + // blockUniformNames = buns; + blockSpecs.forEach(function(b) { + return _this.uniformBlockMap[b.name] = b; + }); + } + this.pipelineContext.useProgram(null); + } + var _proto = GLProgram.prototype; + _proto.bind = function bind() { + this.pipelineContext.useProgram(this.program); + }; + /** + * 绑定 vao 对象并设置顶点属性 + * 如果当前环境不支持 vao,则使用 gl 函数依次设置属性。 + * @param geometry + * @returns + */ _proto.setupAttributes = function setupAttributes(geometry) { + var _this = this; + var _geometry_indicesBuffer; + var programId = this.id; + var gl = this.pipelineContext.gl; + var vao; + if (geometry.vaos[programId]) { + vao = geometry.vaos[programId]; + } else { + vao = new GLVertexArrayObject(this.engine, geometry.name + "-" + programId); + if (!vao) { + console.error("Failed to create VAO object."); + } + geometry.vaos[programId] = vao; + } + // 兼容小程序下不支持vao + if (vao && vao.vao) { + vao.bind(); + if (vao.ready) { + return vao; + } + } + Object.keys(this.attribInfoMap).forEach(function(name) { + var attrInfo = _this.attribInfoMap[name]; + var attribute = geometry.attributes[name]; + if (attribute) { + var buffer = geometry.buffers[attribute.dataSource]; + if (!buffer) { + throw new Error("Failed to find a buffer named '" + (attribute.dataSource || name) + "'. Please ensure the buffer is correctly initialized and bound."); + } + buffer.bind(); + gl.enableVertexAttribArray(attrInfo.loc); + gl.vertexAttribPointer(attrInfo.loc, attribute.size, attribute.type, attribute.normalize, attribute.stride || 0, attribute.offset || 0); + } + }); + (_geometry_indicesBuffer = geometry.indicesBuffer) == null ? void 0 : _geometry_indicesBuffer.bind(); + if (vao) { + vao.ready = true; + } + return vao; + }; + _proto.createAttribMap = function createAttribMap() { + var gl = this.pipelineContext.gl; + var program = this.program; + var attribMap = {}; + var num = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + for(var i = 0; i < num; i++){ + var info = gl.getActiveAttrib(program, i); + if (info) { + var name = info.name, type = info.type, size = info.size; + var loc = gl.getAttribLocation(program, name); + attribMap[name] = { + type: type, + name: name, + size: size, + loc: loc + }; + } + } + return attribMap; + }; + _proto.dispose = function dispose() { + if (this.pipelineContext) { + this.pipelineContext.gl.deleteProgram(this.program); + // @ts-expect-error safe to assign + this.pipelineContext = null; + } + }; + return GLProgram; +}(); + +var GLShaderVariant = /*#__PURE__*/ function(ShaderVariant) { + _inherits(GLShaderVariant, ShaderVariant); + function GLShaderVariant(engine, source) { + var _this; + _this = ShaderVariant.call(this, engine, source) || this; + _this.initialized = false; + _this.uniformLocations = {}; + _this.samplerChannels = {}; + return _this; + } + var _proto = GLShaderVariant.prototype; + // shader 的 GPU 资源初始化方法,在绘制前调用 + _proto.initialize = function initialize() { + if (this.initialized) { + return; + } + // 核心初始化都在 compileShader + // 否则会出现编译了却没有初始化的情况 + var pipelineContext = this.engine.getGLPipelineContext(); + pipelineContext.shaderLibrary.compileShader(this); + }; + _proto.setFloat = function setFloat(name, value) { + this.pipelineContext.setFloat(this.uniformLocations[name], value); + }; + _proto.setInt = function setInt(name, value) { + this.pipelineContext.setInt(this.uniformLocations[name], value); + }; + _proto.setFloats = function setFloats(name, value) { + this.pipelineContext.setFloats(this.uniformLocations[name], value); + }; + _proto.setTexture = function setTexture(name, texture) { + this.pipelineContext.setTexture(this.uniformLocations[name], this.samplerChannels[name], texture); + }; + _proto.setVector2 = function setVector2(name, value) { + this.pipelineContext.setVector2(this.uniformLocations[name], value); + }; + _proto.setVector3 = function setVector3(name, value) { + this.pipelineContext.setVector3(this.uniformLocations[name], value); + }; + _proto.setVector4 = function setVector4(name, value) { + this.pipelineContext.setVector4(this.uniformLocations[name], value); + }; + _proto.setColor = function setColor(name, value) { + this.pipelineContext.setColor(this.uniformLocations[name], value); + }; + _proto.setQuaternion = function setQuaternion(name, value) { + this.pipelineContext.setQuaternion(this.uniformLocations[name], value); + }; + _proto.setMatrix = function setMatrix(name, value) { + this.pipelineContext.setMatrix(this.uniformLocations[name], value); + }; + _proto.setMatrix3 = function setMatrix3(name, value) { + this.pipelineContext.setMatrix3(this.uniformLocations[name], value); + }; + _proto.setVector4Array = function setVector4Array(name, array) { + this.pipelineContext.setVector4Array(this.uniformLocations[name], array); + }; + _proto.setMatrixArray = function setMatrixArray(name, array) { + this.pipelineContext.setMatrixArray(this.uniformLocations[name], array); + }; + _proto.fillShaderInformation = function fillShaderInformation(uniformNames, samplers) { + // 避免修改原数组。 + var samplerList = samplers.slice(); + uniformNames = uniformNames.concat(samplerList); + var avaliableUniforms = this.pipelineContext.getUniforms(this.program.program, uniformNames); + for(var i = 0; i < uniformNames.length; i++){ + this.uniformLocations[uniformNames[i]] = avaliableUniforms[i]; + } + var index; + for(index = 0; index < samplerList.length; index++){ + var sampler = this.uniformLocations[samplerList[index]]; + if (sampler == null) { + samplerList.splice(index, 1); + index--; + } + } + for(index = 0; index < samplerList.length; index++){ + var samplerName = samplerList[index]; + this.samplerChannels[samplerName] = index; + } + }; + _proto.toData = function toData() { + var shaderData = this.defination; + shaderData.dataType = DataType.Shader; + shaderData.id = this.guid; + shaderData.vertex = this.source.vertex; + shaderData.fragment = this.source.fragment; + }; + _proto.dispose = function dispose() { + var _this_program; + if (this.compileResult && this.compileResult.shared) { + return; + } + (_this_program = this.program) == null ? void 0 : _this_program.dispose(); + }; + return GLShaderVariant; +}(ShaderVariant); + +var shaderSeed = 0; +var GLShaderLibrary = /*#__PURE__*/ function() { + function GLShaderLibrary(engine, pipelineContext) { + this.engine = engine; + this.pipelineContext = pipelineContext; + this.shaderResults = {}; + this.programMap = {}; + this.glVertShaderMap = new Map(); + this.glFragShaderMap = new Map(); + this.shaderAllDone = false; + this.cachedShaders = {}; + this.glAsyncCompileExt = engine.gpuCapability.glAsyncCompileExt; + } + var _proto = GLShaderLibrary.prototype; + _proto.compileAllShaders = function compileAllShaders(asyncCallback) { + var _this = this; + if (!this.shaderAllDone) { + var pendings = []; + for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(this.cachedShaders)), _step; !(_step = _iterator()).done;){ + var key = _step.value; + if (!this.cachedShaders[key].initialized) { + pendings.push(key); + } + } + if (asyncCallback) { + if (pendings.length) { + Promise.all(pendings.map(function(key) { + return new Promise(function(resolve) { + return _this.compileShader(_this.cachedShaders[key], resolve); + }); + })).then(asyncCallback).catch(function() { + return 0; + }); + } else { + asyncCallback([]); + } + } else { + pendings.map(function(key) { + return _this.compileShader(_this.cachedShaders[key]); + }); + } + this.shaderAllDone = true; + } else if (asyncCallback) { + asyncCallback([]); + } + }; + // TODO 创建shader的ShaderWithSource和shader的source类型一样,待优化。 + _proto.addShader = function addShader(shaderSource, macros) { + var mergedMacros = []; + if (shaderSource.macros) { + var _mergedMacros; + (_mergedMacros = mergedMacros).push.apply(_mergedMacros, [].concat(shaderSource.macros)); + } + if (macros) { + var // TODO 合并 shaderSource.macros 中已经存在的 macro + _mergedMacros1; + (_mergedMacros1 = mergedMacros).push.apply(_mergedMacros1, [].concat(macros)); + } + var shaderWithMacros = _extends({}, shaderSource, { + vertex: ShaderFactory.genFinalShaderCode({ + level: this.engine.gpuCapability.level, + shaderType: exports.ShaderType.vertex, + shader: shaderSource.vertex, + macros: mergedMacros + }), + fragment: ShaderFactory.genFinalShaderCode({ + level: this.engine.gpuCapability.level, + shaderType: exports.ShaderType.fragment, + shader: shaderSource.fragment, + macros: mergedMacros + }) + }); + var shaderCacheId = this.computeShaderCacheId(shaderWithMacros); + if (this.cachedShaders[shaderCacheId]) { + return shaderCacheId; + } + this.shaderAllDone = false; + var shared = false; + if (shaderWithMacros.shared || shaderWithMacros.cacheId) { + shared = true; + } + this.cachedShaders[shaderCacheId] = new GLShaderVariant(this.engine, _extends({}, shaderWithMacros, { + vertex: shaderWithMacros.vertex, + fragment: shaderWithMacros.fragment, + name: shaderWithMacros.name || shaderCacheId, + shared: shared + })); + this.cachedShaders[shaderCacheId].id = shaderCacheId; + return shaderCacheId; + }; + _proto.createShader = function createShader(shaderSource, macros) { + var shaderCacheId = this.addShader(shaderSource, macros); + return this.cachedShaders[shaderCacheId]; + }; + _proto.compileShader = function compileShader(shader, asyncCallback) { + var _this = this; + var _shader_source = shader.source, sourceShared = _shader_source.shared, vertex = _shader_source.vertex, fragment = _shader_source.fragment, name = _shader_source.name; + var cacheId = shader.source.cacheId; + var shared = false; + if (sourceShared || cacheId) { + shared = true; + } + var gl = this.pipelineContext.gl; + var result = { + shared: shared, + status: exports.ShaderCompileResultStatus.compiling + }; + var linkProgram = this.createProgram(gl, vertex, fragment, result); + var ext = this.glAsyncCompileExt; + var startTime = performance.now(); + var setupProgram = function(glProgram) { + result.status = exports.ShaderCompileResultStatus.success; + result.compileTime = performance.now() - startTime; + shader.program = glProgram; + shader.initialized = true; + shader.pipelineContext = _this.pipelineContext; + if (_this.programMap[shader.id] !== undefined) { + console.warn("Find duplicated shader id: " + shader.id + "."); + } + _this.programMap[shader.id] = glProgram; + // console.log('compileShader ' + result.cacheId + ' ' + result.compileTime + ' ', shader.source); + }; + var checkComplete = function() { + if (_this.engine.isDestroyed) { + console.warn("The player is destroyed during the loadScene process. Please check the timing of calling loadScene and dispose. A common situation is that when calling loadScene, await is not added. This will cause dispose to be called before loadScene is completed."); + return asyncCallback == null ? void 0 : asyncCallback(result); + } + if (shader.initialized) { + return asyncCallback == null ? void 0 : asyncCallback(result); + } + var shouldLink = !asyncCallback || !ext || ext && gl.getProgramParameter(result.program, ext.COMPLETION_STATUS_KHR) == true; + var program = shouldLink && linkProgram(); + if (program) { + if (result.status !== exports.ShaderCompileResultStatus.fail) { + assignInspectorName(program, name); + var glProgram = new GLProgram(_this.engine, program, shader.id); + // FIXME: 这个检测不能在这里调用,安卓上会有兼容性问题。要么开发版使用,要么移到Shader首次使用时 + gl.validateProgram(program); + var valid = gl.getProgramParameter(program, gl.VALIDATE_STATUS); + if (!valid) { + var error = gl.getProgramInfoLog(program); + var err0 = "the same texture"; + if (error == null ? void 0 : error.includes(err0)) { + // 忽略这类错误 + setupProgram(glProgram); + } else { + result.status = exports.ShaderCompileResultStatus.fail; + result.error = error; + console.error("compileProgramError: " + error, "\nvertex:\n", vertex, "\nfragment:\n", fragment); + gl.deleteProgram(program); + } + } else { + setupProgram(glProgram); + } + } + asyncCallback == null ? void 0 : asyncCallback(result); + } else if (asyncCallback) { + requestAnimationFrame(checkComplete); + } + }; + shader.compileResult = result; + checkComplete(); + }; + _proto.computeShaderCacheId = function computeShaderCacheId(shader) { + var _shader_vertex = shader.vertex, vertex = _shader_vertex === void 0 ? "" : _shader_vertex, _shader_fragment = shader.fragment, fragment = _shader_fragment === void 0 ? "" : _shader_fragment, shared = shader.shared; + var cacheId = shader.cacheId; + var shaderCacheId; + if (shared || cacheId) { + shaderCacheId = cacheId || "shared_" + stringHash(vertex, fragment); + } else { + shaderCacheId = "instanced_" + shaderSeed++; + } + return shaderCacheId; + }; + _proto.createProgram = function createProgram(gl, vs, fs, result) { + var program = gl.createProgram(); + var vertexShader = this.createGLShader(gl, gl.VERTEX_SHADER, vs); + var fragShader = this.createGLShader(gl, gl.FRAGMENT_SHADER, fs); + if (program && vertexShader && fragShader) { + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragShader); + gl.linkProgram(program); + result.program = program; + result.status = exports.ShaderCompileResultStatus.compiling; + return function() { + result.program = undefined; + var linked = gl.getProgramParameter(program, gl.LINK_STATUS); + if (!linked) { + // 链接失败,获取并打印错误信息 + var info = gl.getProgramInfoLog(program); + console.error("Failed to link program: " + info + "."); + var vsCheckResult = checkShader(gl, vertexShader, "vertex", vs); + var fsCheckResult = checkShader(gl, fragShader, "fragment", fs); + result.status = exports.ShaderCompileResultStatus.fail; + if (vsCheckResult) { + result.error = vsCheckResult.error; + result.status = vsCheckResult.status; + } + if (fsCheckResult) { + result.error = fsCheckResult.error; + result.status = fsCheckResult.status; + } + return program; + } + return program; + }; + } + result.status = exports.ShaderCompileResultStatus.fail; + return function() { + return null; + }; + }; + _proto.createGLShader = function createGLShader(gl, shaderType, code) { + var map = shaderType === gl.VERTEX_SHADER ? this.glVertShaderMap : this.glFragShaderMap; + var strHash = stringHash(code != null ? code : ""); + var ret = map.get(strHash); + if (ret) { + return ret; + } + var shader = gl.createShader(shaderType); + if (shader) { + gl.shaderSource(shader, code); + gl.compileShader(shader); + map.set(strHash, shader); + } + return shader; + }; + _proto.deleteShader = function deleteShader(cacheId) { + var program = this.programMap[cacheId]; + if (program !== undefined) { + program.dispose(); + delete this.programMap[cacheId]; + } + var result = this.shaderResults[cacheId]; + if (result !== undefined) { + delete this.shaderResults[cacheId]; + } + }; + _proto.restore = function restore() { + // TODO + }; + _proto.dispose = function dispose() { + var _this = this; + Object.keys(this.programMap).forEach(function(key) { + var program = _this.programMap[key]; + program.dispose(); + }); + this.programMap = {}; + if (this.pipelineContext) { + var gl = this.pipelineContext.gl; + this.glFragShaderMap.forEach(function(shader) { + gl.deleteShader(shader); + }); + this.glVertShaderMap.forEach(function(shader) { + gl.deleteShader(shader); + }); + this.glVertShaderMap = new Map(); + this.glFragShaderMap = new Map(); + } + }; + return GLShaderLibrary; +}(); +function checkShader(gl, shader, type, code) { + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + var error = gl.getShaderInfoLog(shader); + console.error("compile " + type + " error: " + error, (code != null ? code : "").split("\n").map(function(line, index) { + return index + 1 + " " + line; + }).join("\n")); + return { + error: error, + status: exports.ShaderCompileResultStatus.fail + }; + } +} + +var GLPipelineContext = /*#__PURE__*/ function() { + function GLPipelineContext(engine, gl) { + this.engine = engine; + this.gl = gl; + this.gl = gl; + this.shaderLibrary = new GLShaderLibrary(engine, this); + this.maxTextureCount = this.gl.TEXTURE0 + this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS) - 1; + this.reset(); + } + var _proto = GLPipelineContext.prototype; + _proto.dispose = function dispose() { + this.shaderLibrary.dispose(); + this.reset(); + }; + _proto.reset = function reset() { + this.glCapabilityCache = {}; + this.activeTextureIndex = glContext.TEXTURE0; + this.textureUnitDict = {}; + this.currentFramebuffer = {}; + this.pixelStorei = {}; + this.currentRenderbuffer = {}; + }; + _proto.toggle = function toggle(capability, enable) { + if (enable) { + this.enable(capability); + } else { + this.disable(capability); + } + }; + /** + * 对于该上下文开启某种特性 + * @param capability + * example: + * gl.enable(gl.DITHER); + */ _proto.enable = function enable(capability) { + var value = this.glCapabilityCache[capability]; + if (value !== true) { + this.glCapabilityCache[capability] = true; + this.gl.enable(capability); + } + }; + /** + * 基于某种上下文关闭特性 + * @param capability + * example: + * gl.disable(gl.DITHER); + */ _proto.disable = function disable(capability) { + var value = this.glCapabilityCache[capability]; + if (value !== false) { + this.glCapabilityCache[capability] = false; + this.gl.disable(capability); + } + }; + /** + * 绑定framebuffer webgl2新增: gl.DRAW_FRAMEBUFFER 和 gl.READ_FRAMEBUFFER + * @param target + * @param framebuffer + * example: + * const framebuffer = gl.createFramebuffer(); + * gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + */ _proto.bindFramebuffer = function bindFramebuffer(target, framebuffer) { + if (this.currentFramebuffer[target] !== framebuffer) { + this.currentFramebuffer[target] = framebuffer; + this.gl.bindFramebuffer(target, framebuffer); + } + }; + _proto.bindRenderbuffer = function bindRenderbuffer(target, renderbuffer) { + if (this.currentRenderbuffer[target] !== renderbuffer) { + this.currentRenderbuffer[target] = renderbuffer; + this.gl.bindRenderbuffer(target, renderbuffer); + } + }; + /** + * 绑定系统 framebuffer + */ _proto.bindSystemFramebuffer = function bindSystemFramebuffer() { + this.bindFramebuffer(this.gl.FRAMEBUFFER, null); + }; + /** + * 将定义好的 WebGLProgram 对象添加到当前的渲染状态中。 + * @param program + * example: + * gl.useProgram(program); + * gl.useProgram(null); + */ _proto.useProgram = function useProgram(program) { + this.set1("useProgram", program); + }; + /** + * 使用预设值来清空缓冲 + * @param mask + * example: + * gl.clear(gl.DEPTH_BUFFER_BIT); + * gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT); + */ _proto.clear = function clear(mask) { + this.gl.clear(mask); + }; + /*** depth start ***/ /** + * 设置深度缓冲区的深度清除值 + * @param depth + * example: + * gl.clearDepth(0.5); + */ _proto.clearDepth = function clearDepth(depth) { + this.set1("clearDepth", depth); + }; + /** + * 指定将输入像素深度与当前深度缓冲区值进行比较的函数。 + * @param func + * example: + * gl.enable(gl.DEPTH_TEST); + * gl.depthFunc(gl.NEVER); + */ _proto.depthFunc = function depthFunc(func) { + this.set1("depthFunc", func); + }; + /** + * 设置是否启用写入深度缓冲。 + * @param flag + * example: + * gl.depthMask(false); + */ _proto.depthMask = function depthMask(flag) { + this.set1("depthMask", flag); + }; + _proto.polygonOffset = function polygonOffset(factor, unit) { + this.set2("polygonOffset", factor, unit); + }; + /** + * 将 z 值从规范化设备坐标映射到窗口坐标 + * @param zNear + * @param zFar + * example: + * gl.depthRange(0.2, 0.6); + */ _proto.depthRange = function depthRange(zNear, zFar) { + this.set2("depthRange", zNear, zFar); + }; + /*** depth end ***/ /*** stencil start ***/ /** + * 模版测试设置函数和引用值。 + * @param func + * @param ref + * @param mask + * example: + * gl.enable(gl.STENCIL_TEST); + * gl.stencilFunc(gl.LESS, 0, 0b1110011); + */ _proto.clearStencil = function clearStencil(s) { + this.set1("clearStencil", s); + }; + /** + * 控制启用和禁用模板平面中单个位的正面和背面写入 + * @param mask + * example: + * gl.stencilMask(0xff); + */ _proto.stencilMask = function stencilMask(mask) { + this.stencilMaskSeparate(this.gl.FRONT, mask); + this.stencilMaskSeparate(this.gl.BACK, mask); + }; + /** + * 模版测试设置函数和引用值。 + * @param func + * @param ref + * @param mask + * example: + * gl.enable(gl.STENCIL_TEST); + * gl.stencilFunc(gl.LESS, 0, 0b1110011); + */ _proto.stencilFunc = function stencilFunc(func, ref, mask) { + this.stencilFuncSeparate(this.gl.FRONT, func, ref, mask); + this.stencilFuncSeparate(this.gl.BACK, func, ref, mask); + }; + /** + * 单面模版测试 + * @param face + * @param func + * @param ref + * @param mask + * example: + * gl.enable(gl.STENCIL_TEST); + * gl.stencilFuncSeparate(gl.FRONT, gl.LESS, 0.2, 1110011); + */ _proto.stencilFuncSeparate = function stencilFuncSeparate(face, func, ref, mask) { + this.set4("stencilFuncSeparate", face, func, ref, mask); + }; + /** + * 单面的mask写入 + * @param face + * @param mask + * example: + * gl.stencilMaskSeparate(gl.FRONT, 110101); + */ _proto.stencilMaskSeparate = function stencilMaskSeparate(face, mask) { + this.set2("stencilMaskSeparate", face, mask); + }; + /** + * 设置正面和背面模板测试操作 + * @param fail + * @param zfail + * @param zpass + * example: + * gl.enable(gl.STENCIL_TEST); + * gl.stencilOp(gl.INCR, gl.DECR, gl.INVERT); + */ _proto.stencilOp = function stencilOp(fail, zfail, zpass) { + this.stencilOpSeparate(this.gl.FRONT, fail, zfail, zpass); + this.stencilOpSeparate(this.gl.BACK, fail, zfail, zpass); + }; + /** + * 设置正面和/或背面模板测试操作 + * @param face + * @param fail + * @param zfail + * @param zpass + * example: + * gl.enable(gl.STENCIL_TEST); + * gl.stencilOpSeparate(gl.FRONT, gl.INCR, gl.DECR, gl.INVERT); + */ _proto.stencilOpSeparate = function stencilOpSeparate(face, fail, zfail, zpass) { + this.set4("stencilOpSeparate", face, fail, zfail, zpass); + }; + /*** stencil end ***/ /*** face start ***/ /** + * 剔除方式 + * @param mode + * example: + * gl.enable(gl.CULL_FACE); + * gl.cullFace(gl.FRONT_AND_BACK); + */ _proto.cullFace = function cullFace(mode) { + this.set1("cullFace", mode); + }; + /** + * 设置卷绕方向 + * @param mode + * example: + * gl.frontFace(gl.CW); + */ _proto.frontFace = function frontFace(mode) { + this.set1("frontFace", mode); + }; + /*** face end ***/ /*** color start ***/ /** + * 设置颜色写入 + * @param red + * @param green + * @param blue + * @param alpha + * example: + * gl.colorMask(true, true, true, false); + */ _proto.clearColor = function clearColor(red, green, blue, alpha) { + this.set4("clearColor", red, green, blue, alpha); + }; + /** + * 设置颜色写入 + * @param red + * @param green + * @param blue + * @param alpha + * example: + * gl.colorMask(true, true, true, false); + */ _proto.colorMask = function colorMask(red, green, blue, alpha) { + this.set4("colorMask", red, green, blue, alpha); + }; + /** + * 设置源和目标混合因子 + * @param red + * @param green + * @param blue + * @param alpha + * example: + * gl.blendColor(0, 0.5, 1, 1); + */ _proto.blendColor = function blendColor(red, green, blue, alpha) { + this.set4("blendColor", red, green, blue, alpha); + }; + /** + * 用于混合像素算法 + * @param sfactor + * @param dfactor + * example: + * gl.enable(gl.BLEND); + * gl.blendFunc(gl.SRC_COLOR, gl.DST_COLOR); + */ _proto.blendFunc = function blendFunc(sfactor, dfactor) { + this.blendFuncSeparate(sfactor, dfactor, sfactor, dfactor); + }; + /** + * 分别设置应用在 RGB 和 Alpha 上的 factor + * @param srcRGB + * @param dstRGB + * @param srcAlpha + * @param dstAlpha + * example: + * gl.enable(gl.BLEND); + * gl.blendFuncSeparate(gl.SRC_COLOR, gl.DST_COLOR, gl.ONE, gl.ZERO); + */ _proto.blendFuncSeparate = function blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha) { + this.set4("blendFuncSeparate", srcRGB, dstRGB, srcAlpha, dstAlpha); + }; + /** + * 设置混合模式 + * @param mode + * example: + * gl.blendEquation(gl.FUNC_ADD); + * gl.blendEquation(gl.FUNC_SUBTRACT); + * gl.blendEquation(gl.FUNC_REVERSE_SUBTRACT); + */ _proto.blendEquation = function blendEquation(mode) { + this.set1("blendEquation", mode); + }; + /** + * 可以分别对 RGB 和 Alpha 做不同的操作处理 + * @param modeRGB + * @param modeAlpha + * example: + * gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_SUBTRACT); + */ _proto.blendEquationSeparate = function blendEquationSeparate(modeRGB, modeAlpha) { + this.set2("blendEquationSeparate", modeRGB, modeAlpha); + }; + /*** color end ***/ /** + * 图像预处理 + * @param pname + * @param param + * example: + * var tex = gl.createTexture(); + * gl.bindTexture(gl.TEXTURE_2D, tex); + * gl.pixelStorei(gl.PACK_ALIGNMENT, 4); + */ _proto.setPixelStorei = function setPixelStorei(pname, param) { + var currentParam = this.pixelStorei[pname]; + if (currentParam !== param) { + this.pixelStorei[pname] = param; + this.gl.pixelStorei(pname, param); + } + }; + /** + * 用来设置视口,即指定从标准设备到窗口坐标的x、y仿射变换。 + * @param x + * @param y + * @param width + * @param height + * example: + * gl.viewport(0, 0, width, height); + */ _proto.viewport = function viewport(x, y, width, height) { + this.set4("viewport", x, y, width, height); + }; + /** + * 激活指定的纹理单元 + * @param texture + * example: + * gl.activeTexture(gl.TEXTURE1); + */ _proto.activeTexture = function activeTexture(texture) { + texture = Math.min(texture, this.maxTextureCount); + if (this.activeTextureIndex !== texture) { + this.activeTextureIndex = texture; + this.gl.activeTexture(texture); + } + }; + /** + * 绑定WebGLTexture + * @param target + * @param texture + * @param force + * example: + * const texture = gl.createTexture(); + * gl.bindTexture(gl.TEXTURE_2D, texture) + */ // TODO: texture.bind 替换时对于这段逻辑的处理 + _proto.bindTexture = function bindTexture(target, texture, force) { + if (this.currentTextureBinding !== texture || force) { + this.gl.bindTexture(target, texture); + this.currentTextureBinding = texture; + } + this.textureUnitDict[this.activeTextureIndex] = texture; + }; + _proto.set1 = function set1(name, param) { + var value = this.glCapabilityCache[name]; + if (value !== param) { + this.glCapabilityCache[name] = param; + // @ts-expect-error save to assign + this.gl[name](param); + } + }; + _proto.set2 = function set2(name, param0, param1) { + var value = this.glCapabilityCache[name]; + if (!value) { + value = this.glCapabilityCache[name] = { + x: NaN, + y: NaN + }; + } + if (value.x !== param0 || value.y !== param1) { + // @ts-expect-error save to assign + this.gl[name](value.x = param0, value.y = param1); + } + }; + _proto.set3 = function set3(name, param0, param1, param2) { + var value = this.glCapabilityCache[name]; + if (!value) { + value = this.glCapabilityCache[name] = { + x: NaN, + y: NaN, + z: NaN + }; + } + if (value.x !== param0 || value.y !== param1 || value.z !== param2) { + // @ts-expect-error safe to assign + this.gl[name](value.x = param0, value.y = param1, value.z = param2); + } + }; + _proto.set4 = function set4(name, param0, param1, param2, param3) { + var value = this.glCapabilityCache[name]; + if (!value) { + value = this.glCapabilityCache[name] = { + x: NaN, + y: NaN, + z: NaN, + w: NaN + }; + } + if (value.x !== param0 || value.y !== param1 || value.z !== param2 || value.w !== param3) { + // @ts-expect-error safe to assign + this.gl[name](value.x = param0, value.y = param1, value.z = param2, value.w = param3); + } + }; + // TODO 命名 + _proto.get = function get(name) { + return this.glCapabilityCache[name]; + }; + _proto.setFloat = function setFloat(uniform, value) { + if (!uniform) { + return; + } + this.gl.uniform1f(uniform, value); + }; + _proto.setInt = function setInt(uniform, value) { + if (!uniform) { + return; + } + this.gl.uniform1i(uniform, value); + }; + _proto.setFloats = function setFloats(uniform, value) { + if (!uniform) { + return; + } + this.gl.uniform1fv(uniform, value); + }; + _proto.setVector2 = function setVector2(uniform, value) { + this.setFloat2(uniform, value.x, value.y); + }; + _proto.setVector3 = function setVector3(uniform, value) { + this.setFloat3(uniform, value.x, value.y, value.z); + }; + _proto.setVector4 = function setVector4(uniform, value) { + this.setFloat4(uniform, value.x, value.y, value.z, value.w); + }; + _proto.setColor = function setColor(uniform, value) { + this.setFloat4(uniform, value.r, value.g, value.b, value.a); + }; + _proto.setQuaternion = function setQuaternion(uniform, value) { + this.setFloat4(uniform, value.x, value.y, value.z, value.w); + }; + _proto.setVector4Array = function setVector4Array(uniform, array) { + if (!uniform || array.length % 4 !== 0) { + return; + } + this.gl.uniform4fv(uniform, array); + }; + _proto.setMatrix = function setMatrix(uniform, value) { + if (!uniform) { + return; + } + this.gl.uniformMatrix4fv(uniform, false, value.elements); + }; + _proto.setMatrix3 = function setMatrix3(uniform, value) { + if (!uniform) { + return; + } + this.gl.uniformMatrix3fv(uniform, false, value.elements); + }; + _proto.setMatrixArray = function setMatrixArray(uniform, array) { + if (!uniform || array.length % 16 !== 0) { + return; + } + this.gl.uniformMatrix4fv(uniform, false, array); + }; + _proto.setTexture = function setTexture(uniform, channel, texture) { + if (!uniform) { + return; + } + this.gl.activeTexture(this.gl.TEXTURE0 + channel); + var target = texture.target; + this.gl.bindTexture(target, texture.textureBuffer); + this.gl.uniform1i(uniform, channel); + }; + /** + * 查询所有uniform的location。 + * @param program 查询的shader program + * @param uniformsNames 查询的uniform名称列表 + * @returns + */ _proto.getUniforms = function getUniforms(program, uniformsNames) { + var results = []; + for(var index = 0; index < uniformsNames.length; index++){ + results.push(this.gl.getUniformLocation(program, uniformsNames[index])); + } + return results; + }; + _proto.setFloat4 = function setFloat4(uniform, x, y, z, w) { + if (!uniform) { + return; + } + this.gl.uniform4f(uniform, x, y, z, w); + }; + _proto.setFloat3 = function setFloat3(uniform, x, y, z) { + if (!uniform) { + return; + } + this.gl.uniform3f(uniform, x, y, z); + }; + _proto.setFloat2 = function setFloat2(uniform, x, y) { + if (!uniform) { + return; + } + this.gl.uniform2f(uniform, x, y); + }; + return GLPipelineContext; +}(); + +var GLRenderer = /*#__PURE__*/ function(Renderer) { + _inherits(GLRenderer, Renderer); + function GLRenderer(canvas, framework, renderOptions) { + var _this; + _this = Renderer.call(this) || this; + _this.canvas = canvas; + _this.temporaryRTs = {}; + var options = _extends({ + preserveDrawingBuffer: undefined, + alpha: true, + stencil: true, + antialias: true, + depth: true, + premultipliedAlpha: true + }, renderOptions); + _this.context = new GLContextManager(canvas, framework, options); + var gl = _this.context.gl; + assertExist(gl); + // engine 先创建 + _this.engine = new GLEngine(gl); + _this.engine.renderer = _assert_this_initialized(_this); + _this.pipelineContext = new GLPipelineContext(_this.engine, gl); + _this.glRenderer = new GLRendererInternal(_this.engine); + _this.extension = new ExtWrap(_assert_this_initialized(_this)); + _this.renderingData = { + // @ts-expect-error + currentFrame: {} + }; + _this.framebuffer = new GLFramebuffer({ + storeAction: {}, + viewport: [ + 0, + 0, + _this.width, + _this.height + ], + attachments: [ + new GLTexture(_this.engine, { + sourceType: exports.TextureSourceType.framebuffer, + data: { + width: _this.width, + height: _this.height + } + }) + ], + depthStencilAttachment: { + storageType: exports.RenderPassAttachmentStorageType.none + } + }, _assert_this_initialized(_this)); + return _this; + } + var _proto = GLRenderer.prototype; + _proto.renderRenderFrame = function renderRenderFrame(renderFrame) { + var _frame_renderer_getShaderLibrary; + var frame = renderFrame; + // TODO 需要一个贴图统一初始化的管理类,避免在渲染逻辑代码中初始化。 + // 初始化renderframe的贴图资源 + // if (frame.cachedTextures) { + // for (const texture of frame.cachedTextures) { + // (texture as GLTexture).initialize(this.pipelineContext); + // } + // } + if (frame.resource) { + frame.resource.color_b.initialize(); + } + frame.emptyTexture.initialize(); + frame.transparentTexture.initialize(); + var passes = frame._renderPasses; + if (this.isDestroyed) { + console.error("Renderer is destroyed, target: GLRenderer."); + return; + } + (_frame_renderer_getShaderLibrary = frame.renderer.getShaderLibrary()) == null ? void 0 : _frame_renderer_getShaderLibrary.compileAllShaders(); + this.setFramebuffer(null); + this.clear(frame.clearAction); + var currentCamera = frame.camera; + this.renderingData.currentFrame = frame; + this.renderingData.currentCamera = currentCamera; + this.setGlobalMatrix("effects_MatrixInvV", currentCamera.getInverseViewMatrix()); + this.setGlobalMatrix("effects_MatrixV", currentCamera.getViewMatrix()); + this.setGlobalMatrix("effects_MatrixVP", currentCamera.getViewProjectionMatrix()); + this.setGlobalMatrix("_MatrixP", currentCamera.getProjectionMatrix()); + this.setGlobalVector3("effects_WorldSpaceCameraPos", currentCamera.position); + // 根据 priority 排序 pass + sortByOrder(passes); + for(var _iterator = _create_for_of_iterator_helper_loose(passes), _step; !(_step = _iterator()).done;){ + var pass = _step.value; + var delegate = pass.delegate; + delegate.willBeginRenderPass == null ? void 0 : delegate.willBeginRenderPass.call(delegate, pass, this.renderingData); + this.renderRenderPass(pass); + delegate.didEndRenderPass == null ? void 0 : delegate.didEndRenderPass.call(delegate, pass, this.renderingData); + } + for(var _iterator1 = _create_for_of_iterator_helper_loose(passes), _step1; !(_step1 = _iterator1()).done;){ + var pass1 = _step1.value; + pass1.frameCleanup(this); + } + }; + _proto.renderRenderPass = function renderRenderPass(pass) { + this.renderingData.currentPass = pass; + // 初始化 pass attachment GPU资源 + pass.initialize(this); + // 配置当前 renderer 的 RT + pass.configure(this); + // 执行当前 pass + pass.execute(this); + }; + _proto.renderMeshes = function renderMeshes(meshes) { + var delegate = this.renderingData.currentPass.delegate; + for(var _iterator = _create_for_of_iterator_helper_loose(meshes), _step; !(_step = _iterator()).done;){ + var mesh = _step.value; + delegate.willRenderMesh == null ? void 0 : delegate.willRenderMesh.call(delegate, mesh, this.renderingData); + mesh.render(this); + delegate.didRenderMesh == null ? void 0 : delegate.didRenderMesh.call(delegate, mesh, this.renderingData); + } + }; + _proto.setGlobalFloat = function setGlobalFloat(name, value) { + this.checkGlobalUniform(name); + this.renderingData.currentFrame.globalUniforms.floats[name] = value; + }; + _proto.setGlobalVector4 = function setGlobalVector4(name, value) { + this.checkGlobalUniform(name); + this.renderingData.currentFrame.globalUniforms.vector4s[name] = value; + }; + _proto.getGlobalVector4 = function getGlobalVector4(name) { + return this.renderingData.currentFrame.globalUniforms.vector4s[name]; + }; + _proto.setGlobalInt = function setGlobalInt(name, value) { + this.checkGlobalUniform(name); + this.renderingData.currentFrame.globalUniforms.ints[name] = value; + }; + _proto.setGlobalMatrix = function setGlobalMatrix(name, value) { + this.checkGlobalUniform(name); + this.renderingData.currentFrame.globalUniforms.matrices[name] = value; + }; + _proto.setGlobalVector3 = function setGlobalVector3(name, value) { + this.checkGlobalUniform(name); + this.renderingData.currentFrame.globalUniforms.vector3s[name] = value; + }; + _proto.drawGeometry = function drawGeometry(geometry, material, subMeshIndex) { + if (subMeshIndex === void 0) subMeshIndex = 0; + if (!geometry || !material) { + return; + } + material.initialize(); + geometry.initialize(); + geometry.flush(); + var renderingData = this.renderingData; + if (renderingData.currentFrame.editorTransform) { + material.setVector4("uEditorTransform", renderingData.currentFrame.editorTransform); + } + try { + material.use(this, renderingData.currentFrame.globalUniforms); + } catch (e) { + console.error(e); + return; + } + this.glRenderer.drawGeometry(geometry, material, subMeshIndex); + }; + _proto.setFramebuffer = function setFramebuffer(framebuffer) { + if (framebuffer) { + this.framebuffer = framebuffer; + this.framebuffer.bind(); + this.setViewport(framebuffer.viewport[0], framebuffer.viewport[1], framebuffer.viewport[2], framebuffer.viewport[3]); + } else { + this.pipelineContext.bindSystemFramebuffer(); + this.setViewport(0, 0, this.getWidth(), this.getHeight()); + } + }; + _proto.getFramebuffer = function getFramebuffer() { + return this.framebuffer; + }; + _proto.getTemporaryRT = function getTemporaryRT(name, width, height, depthBuffer, filter, format) { + if (this.temporaryRTs[name]) { + return this.temporaryRTs[name]; + } + var textureFilter; + var textureType; + var depthType = exports.RenderPassAttachmentStorageType.none; + // TODO 建立Map映射 + if (filter === exports.FilterMode.Linear) { + textureFilter = glContext.LINEAR; + } else if (filter === exports.FilterMode.Nearest) { + textureFilter = glContext.NEAREST; + } + if (format === exports.RenderTextureFormat.RGBA32) { + textureType = glContext.UNSIGNED_BYTE; + } else if (format === exports.RenderTextureFormat.RGBAHalf) { + textureType = glContext.HALF_FLOAT; + } + if (depthBuffer === 0) { + depthType = exports.RenderPassAttachmentStorageType.none; + } else if (depthBuffer === 16) { + depthType = exports.RenderPassAttachmentStorageType.depth_16_opaque; + } else if (depthBuffer === 24) { + depthType = exports.RenderPassAttachmentStorageType.depth_24_stencil_8_texture; + } + var colorAttachment = new GLTexture(this.engine, { + sourceType: exports.TextureSourceType.framebuffer, + minFilter: textureFilter, + magFilter: textureFilter, + internalFormat: glContext.RGBA, + format: glContext.RGBA, + type: textureType + }); + var newFramebuffer = new GLFramebuffer({ + name: name, + storeAction: {}, + viewport: [ + 0, + 0, + width, + height + ], + viewportScale: 1, + isCustomViewport: true, + attachments: [ + colorAttachment + ], + depthStencilAttachment: { + storageType: depthType + } + }, this); + this.temporaryRTs[name] = newFramebuffer; + return newFramebuffer; + }; + _proto.setViewport = function setViewport(x, y, width, height) { + this.pipelineContext.viewport(x, y, width, height); + }; + _proto.clear = function clear(action) { + var state = this.pipelineContext; + var bit = 0; + if (action.colorAction === exports.TextureLoadAction.clear) { + var clearColor = action.clearColor; + if (clearColor) { + state.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); + } + state.colorMask(true, true, true, true); + bit = glContext.COLOR_BUFFER_BIT; + } + if (action.stencilAction === exports.TextureLoadAction.clear) { + state.stencilMask(0xff); + state.clearStencil(action.clearStencil || 0); + bit = bit | glContext.STENCIL_BUFFER_BIT; + } + if (action.depthAction === exports.TextureLoadAction.clear) { + var depth = action.clearDepth; + state.depthMask(true); + state.clearDepth(Number.isFinite(depth) ? depth : 1); + bit = bit | glContext.DEPTH_BUFFER_BIT; + } + if (bit) { + state.clear(bit); + } + }; + _proto.addLostHandler = function addLostHandler(lostHandler) { + this.context.addLostHandler(lostHandler); + }; + _proto.addRestoreHandler = function addRestoreHandler(restoreHandler) { + this.context.addRestoreHandler(restoreHandler); + }; + _proto.getShaderLibrary = function getShaderLibrary() { + return this.pipelineContext.shaderLibrary; + }; + _proto.getWidth = function getWidth() { + return this.width; + }; + _proto.getHeight = function getHeight() { + return this.height; + }; + _proto.dispose = function dispose() { + var _this_glRenderer; + this.context.dispose(); + this.extension.dispose(); + this.pipelineContext.dispose(); + (_this_glRenderer = this.glRenderer) == null ? void 0 : _this_glRenderer.dispose(); + // @ts-expect-error + this.canvas = null; + this.engine.dispose(); + }; + _proto.lost = function lost(e) { + e.preventDefault(); + this.pipelineContext.dispose(); + this.extension.dispose(); + this.glRenderer.lost(e); + }; + _proto.restore = function restore() { + // FIXME: 需要测试下lost和restore流程 + var gl = this.context.gl; + if (!gl) { + throw new Error("Can not restore automatically because losing gl context."); + } + this.engine.gpuCapability = new GPUCapability(gl); + this.engine.renderer = this; + this.pipelineContext = new GLPipelineContext(this.engine, gl); + this.glRenderer = new GLRendererInternal(this.engine); + this.extension = new ExtWrap(this); + }; + _proto.resize = function resize(width, height) { + var internal = this.glRenderer; + if (internal) { + if (this.width !== width || this.height !== height) { + internal.resize(width, height); + } + } + }; + _proto.checkGlobalUniform = function checkGlobalUniform(name) { + var globalUniforms = this.renderingData.currentFrame.globalUniforms; + if (!globalUniforms.uniforms.includes(name)) { + globalUniforms.uniforms.push(name); + } + }; + _create_class(GLRenderer, [ + { + key: "isDestroyed", + get: function get() { + var internal = this.glRenderer; + return internal ? internal.isDestroyed : true; + } + }, + { + key: "height", + get: function get() { + var _this_glRenderer; + var _this_glRenderer_height; + return (_this_glRenderer_height = (_this_glRenderer = this.glRenderer) == null ? void 0 : _this_glRenderer.height) != null ? _this_glRenderer_height : 0; + } + }, + { + key: "width", + get: function get() { + var _this_glRenderer; + var _this_glRenderer_width; + return (_this_glRenderer_width = (_this_glRenderer = this.glRenderer) == null ? void 0 : _this_glRenderer.width) != null ? _this_glRenderer_width : 0; + } + } + ]); + return GLRenderer; +}(Renderer); + +var HELP_LINK = { + "Container size overflowed": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#MvjnY", + "DPI overflowed": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#ulfNT", + "Invalid container size": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#lLlSW", + "Container is not an HTMLElement": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#WZaWg", + "Never use destroyed player again": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#YSWQr", + "Current running player count": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#IzodZ", + "Create player with different WebGL version": "https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#X0ulg" +}; + +function isDowngradeIOS() { + var iOSVersionRegex = /iPhone OS (\d+)_(\d+)/; + var match = iOSVersionRegex.exec(navigator.userAgent); + if (match) { + return match[1] === "13" || match[1] === "16" && match[2] === "5"; + } + return false; +} +function throwError(destroyedErrorMessage) { + throw new Error(destroyedErrorMessage); +} +function throwErrorPromise(destroyedErrorMessage) { + return Promise.reject(destroyedErrorMessage); +} +function handleThrowError(target, propertyKey, descriptor) { + // 保存原始方法 + var originalMethod = descriptor.value; + // 替换原始方法 + descriptor.value = /*#__PURE__*/ _async_to_generator(function() { + var _len, args, _key, result, e; + var _arguments = arguments; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + for(_len = _arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){ + args[_key] = _arguments[_key]; + } + _state.label = 1; + case 1: + _state.trys.push([ + 1, + 3, + , + 4 + ]); + return [ + 4, + originalMethod.apply(this, args) + ]; + case 2: + result = _state.sent(); + return [ + 2, + result + ]; + case 3: + e = _state.sent(); + // @ts-expect-error + target.handleThrowError.call(this, e); + return [ + 3, + 4 + ]; + case 4: + return [ + 2 + ]; + } + }); + }); + // 返回修改后的描述符 + return descriptor; +} + +var playerMap = new Map(); +/** + * 判断指定的 canvas 是否有播放器正在使用 + * @param canvas - 指定的 canvas + * @returns + */ function isCanvasUsedByPlayer(canvas) { + return playerMap.has(canvas); +} +/** + * 获取 canvas 对应的播放器 + * @param canvas - 指定的 canvas + * @returns + */ function getPlayerByCanvas(canvas) { + return playerMap.get(canvas); +} +/** + * 获取使用中的播放器 + * @returns + */ function getActivePlayers() { + return Array.from(playerMap.values()); +} +/** + * 同时允许的播放器数量超过 1 时打印错误 + */ function assertNoConcurrentPlayers() { + var runningPlayers = []; + for(var _iterator = _create_for_of_iterator_helper_loose(playerMap.values()), _step; !(_step = _iterator()).done;){ + var player = _step.value; + if (!player.paused) { + runningPlayers.push(player); + } + } + if (runningPlayers.length > 1) { + logger.error("Current running player count: " + runningPlayers.length + ", see " + HELP_LINK["Current running player count"] + ".", runningPlayers); + } +} + +var enableDebugType = false; +var seed = 1; +/** + * Galacean Effects 播放器 + */ var Player = /*#__PURE__*/ function(EventEmitter) { + _inherits(Player, EventEmitter); + function Player(config) { + var _this; + _this = EventEmitter.call(this) || this; + /** + * 当前播放的合成对象数组,请不要修改内容 + */ _this.compositions = []; + _this.displayScale = 1; + _this.resumePending = false; + _this.disposed = false; + _this.assetManagers = []; + _this.speed = 1; + _this.baseCompositionIndex = 0; + /** + * 播放器在 `webglcontextlost` 时执行的操作 + * @param e - Event + */ _this.lost = function(e) { + var _this_ticker; + (_this_ticker = _this.ticker) == null ? void 0 : _this_ticker.pause(); + _this.compositions.forEach(function(comp) { + return comp.lost(e); + }); + _this.renderer.lost(e); + _this.handleEmitEvent("webglcontextlost", e); + broadcastPlayerEvent(_assert_this_initialized(_this), false); + }; + var _this1 = _assert_this_initialized(_this); + /** + * 播放器在 `webglcontextrestored` 时执行的操作 + * @returns + */ _this.restore = /*#__PURE__*/ _async_to_generator(function() { + var _this_ticker; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + _this1.renderer.restore(); + return [ + 4, + Promise.all(_this1.compositions.map(/*#__PURE__*/ _async_to_generator(function(composition) { + var currentTime, url, speed, keepResource, reusable, renderOrder, transform, videoState, newComposition, i, video, _videoState_i; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + currentTime = composition.time, url = composition.url, speed = composition.speed, keepResource = composition.keepResource, reusable = composition.reusable, renderOrder = composition.renderOrder, transform = composition.transform, videoState = composition.videoState; + return [ + 4, + _this1.loadScene(url) + ]; + case 1: + newComposition = _state.sent(); + newComposition.speed = speed; + newComposition.reusable = reusable; + newComposition.keepResource = keepResource; + newComposition.renderOrder = renderOrder; + newComposition.transform.setPosition(transform.position.x, transform.position.y, transform.position.z); + newComposition.transform.setRotation(transform.rotation.x, transform.rotation.y, transform.rotation.z); + newComposition.transform.setScale(transform.scale.x, transform.scale.y, transform.scale.z); + i = 0; + _state.label = 2; + case 2: + if (!(i < videoState.length)) return [ + 3, + 5 + ]; + if (!videoState[i]) return [ + 3, + 4 + ]; + video = newComposition.textures[i].source.video; + video.currentTime = (_videoState_i = videoState[i]) != null ? _videoState_i : 0; + return [ + 4, + video.play() + ]; + case 3: + _state.sent(); + _state.label = 4; + case 4: + i++; + return [ + 3, + 2 + ]; + case 5: + newComposition.isEnded = false; + newComposition.gotoAndPlay(currentTime); + return [ + 2, + newComposition + ]; + } + }); + }))) + ]; + case 1: + _this1.compositions = _state.sent(); + _this1.emit("webglcontextrestored"); + (_this_ticker = _this1.ticker) == null ? void 0 : _this_ticker.resume(); + if (isIOS() && _this1.canvas) { + _this1.canvas.style.display = "none"; + window.setTimeout(function() { + _this1.canvas.style.display = ""; + }, 0); + } + return [ + 2 + ]; + } + }); + }); + _this.handleResume = function() { + _this.emit("update", { + player: _assert_this_initialized(_this), + playing: true + }); + }; + _this.handleClick = function(e) { + var x = e.x, y = e.y; + var hitInfos = []; + // 收集所有的点击测试结果,click 回调执行可能会对 composition 点击结果有影响,放在点击测试执行完后再统一触发。 + _this.compositions.forEach(function(composition) { + var regions = composition.hitTest(x, y); + for(var _iterator = _create_for_of_iterator_helper_loose(regions), _step; !(_step = _iterator()).done;){ + var region = _step.value; + hitInfos.push(_extends({}, region, { + player: _assert_this_initialized(_this), + composition: composition + })); + } + }); + for(var i = 0; i < hitInfos.length; i++){ + var hitInfo = hitInfos[i]; + var behavior = hitInfo.behavior || InteractBehavior.NOTIFY; + if (behavior === InteractBehavior.NOTIFY) { + _this.emit("click", _extends({}, hitInfo, { + compositionId: hitInfo.composition.id, + compositionName: hitInfo.composition.name + })); + hitInfo.composition.emit("click", _extends({}, hitInfo, { + compositionId: hitInfo.composition.id, + compositionName: hitInfo.composition.name + })); + } else if (behavior === InteractBehavior.RESUME_PLAYER) { + void _this.resume(); + } + } + }; + var container = config.container, canvas = config.canvas, fps = config.fps, name = config.name, pixelRatio = config.pixelRatio, manualRender = config.manualRender, reportGPUTime = config.reportGPUTime, glType = config.renderFramework, notifyTouch = config.notifyTouch, onError = config.onError, _config_interactive = config.interactive, interactive = _config_interactive === void 0 ? false : _config_interactive, _config_renderOptions = config.renderOptions, renderOptions = _config_renderOptions === void 0 ? {} : _config_renderOptions, _config_env = config.env, env = _config_env === void 0 ? "" : _config_env; + var preserveDrawingBuffer = renderOptions.willCaptureImage, premultipliedAlpha = renderOptions.premultipliedAlpha; + _this.onError = onError; + // 原 debug-disable 直接返回 + if (enableDebugType || glType === "debug-disable") { + return _possible_constructor_return(_this); + } + // 注意: iOS 13/iOS 16.5 在 WebGL2 下有渲染或卡顿问题,故默认使用 WebGL1 + var framework = isDowngradeIOS() ? "webgl" : "webgl2"; + // 用户可以通过传入 renderFramework,手动强制使用 WebGL 1/2 来渲染 + if (glType) { + framework = glType === "webgl" ? "webgl" : "webgl2"; + } + _this.reportGPUTime = reportGPUTime; + _this.pixelRatio = Number.isFinite(pixelRatio) ? pixelRatio : getPixelRatio(); + _this.offscreenMode = true; + _this.env = env; + _this.name = name || "" + seed++; + try { + if (initErrors.length) { + throw new Error("Errors before player create: " + initErrors.map(function(message, index) { + return "\n " + (index + 1) + ": " + message; + }) + ".", { + cause: "webgliniterror" + }); + } + if (canvas) { + _this.canvas = canvas; + } else { + assertContainer(container); + _this.canvas = document.createElement("canvas"); + container.appendChild(_this.canvas); + } + _this.container = _this.canvas.parentElement; + _this.renderer = Renderer.create(_this.canvas, framework, { + preserveDrawingBuffer: preserveDrawingBuffer, + premultipliedAlpha: premultipliedAlpha + }); + _this.renderer.env = env; + _this.renderer.addLostHandler({ + lost: _this.lost + }); + _this.renderer.addRestoreHandler({ + restore: _this.restore + }); + _this.gpuCapability = _this.renderer.engine.gpuCapability; + _this.assetService = new AssetService(_this.renderer.engine); + if (!manualRender) { + _this.ticker = new Ticker(fps); + _this.ticker.add(_this.tick.bind(_assert_this_initialized(_this))); + } + _this.event = new EventSystem(_this.canvas, !!notifyTouch); + _this.event.bindListeners(); + _this.event.addEventListener(EVENT_TYPE_CLICK, _this.handleClick); + _this.interactive = interactive; + _this.resize(); + setSpriteMeshMaxItemCountByGPU(_this.gpuCapability.detail); + } catch (e) { + _this.handleThrowError(e); + } + // 如果存在 WebGL 和 WebGL2 的 Player,需要给出警告 + playerMap.forEach(function(player) { + if (player.gpuCapability.type !== _this.gpuCapability.type) { + logger.warn("Create player with different WebGL version: old=" + player.gpuCapability.type + ", new=" + _this.gpuCapability.type + ".\nsee " + HELP_LINK["Create player with different WebGL version"] + "."); + } + }); + playerMap.set(_this.canvas, _assert_this_initialized(_this)); + assertNoConcurrentPlayers(); + broadcastPlayerEvent(_assert_this_initialized(_this), true); + return _this; + } + var _proto = Player.prototype; + /** + * 设置当前 Player 的播放速度 + * @param speed - 播放速度 + */ _proto.setSpeed = function setSpeed(speed) { + if (!isNaN(speed)) { + this.speed = speed; + } + }; + /** + * 获取当前 Player 的播放速度 + * @returns + */ _proto.getSpeed = function getSpeed() { + return this.speed; + }; + /** + * 根据名称查找对应的合成(可能找不到,如果有同名的合成,默认返回第一个) + * @example + * ``` ts + * const composition = player.getCompositionByName('新建合成1'); + * ``` + * @param name - 目标合成名称 + */ _proto.getCompositionByName = function getCompositionByName(name) { + return this.compositions.find(function(comp) { + return comp.name === name; + }); + }; + /** + * 获取当前播放的所有合成(请不要修改返回的数组内容) + */ _proto.getCompositions = function getCompositions() { + return this.compositions.sort(function(a, b) { + return a.getIndex() - b.getIndex(); + }); + }; + /** + * Gets the array of asset managers. + * @returns + */ _proto.getAssetManager = function getAssetManager() { + return this.assetManagers; + }; + _proto.loadScene = function loadScene(scene, options) { + var _this = this; + return _async_to_generator(function() { + var _this_renderer_engine_gpuCapability_detail, _this_renderer_engine_gpuCapability, _this_ticker, last, scenes, compositions, _options_autoplay, autoplay, asyncShaderCompile, baseOrder, _scenes, autoplayFlags, compileStart, compileTime, i, compositionNames, firstFrameTime, _iterator, _step, composition; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + assertExist(_this.renderer, "Renderer is not exist, maybe the Player has been disabled or in gl 'debug-disable' mode."); + last = performance.now(); + scenes = []; + compositions = []; + autoplay = (_options_autoplay = options == null ? void 0 : options.autoplay) != null ? _options_autoplay : true; + asyncShaderCompile = (_this_renderer_engine_gpuCapability = _this.renderer.engine.gpuCapability) == null ? void 0 : (_this_renderer_engine_gpuCapability_detail = _this_renderer_engine_gpuCapability.detail) == null ? void 0 : _this_renderer_engine_gpuCapability_detail.asyncShaderCompile; + baseOrder = _this.baseCompositionIndex; + if (isArray(scene)) { + (_scenes = scenes).push.apply(_scenes, [].concat(scene)); + } else { + scenes.push(scene); + } + _this.baseCompositionIndex += scenes.length; + if (autoplay) { + _this.autoPlaying = true; + } + autoplayFlags = []; + return [ + 4, + Promise.all(scenes.map(/*#__PURE__*/ _async_to_generator(function(url, index) { + var _this_assetService_assembleSceneLoadOptions, source, opts, _opts_autoplay, compositionAutoplay, assetManager, _$scene, composition; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + _this_assetService_assembleSceneLoadOptions = _this.assetService.assembleSceneLoadOptions(url, _extends({ + autoplay: autoplay + }, options)), source = _this_assetService_assembleSceneLoadOptions.source, opts = _this_assetService_assembleSceneLoadOptions.options; + compositionAutoplay = (_opts_autoplay = opts == null ? void 0 : opts.autoplay) != null ? _opts_autoplay : autoplay; + assetManager = new AssetManager(opts); + // TODO 多 json 之间目前不共用资源,如果后续需要多 json 共用,这边缓存机制需要额外处理 + _this.assetManagers.push(assetManager); + return [ + 4, + assetManager.loadScene(source, _this.renderer, { + env: _this.env + }) + ]; + case 1: + _$scene = _state.sent(); + _this.assetService.prepareAssets(_$scene, assetManager.getAssets()); + _this.assetService.updateTextVariables(_$scene, assetManager.options.variables); + _this.assetService.initializeTexture(_$scene); + _$scene.pluginSystem.precompile(_$scene.jsonScene.compositions, _this.renderer); + composition = _this.createComposition(_$scene, opts); + composition.setIndex(baseOrder + index); + compositions[index] = composition; + autoplayFlags[index] = compositionAutoplay; + return [ + 2 + ]; + } + }); + }))) + ]; + case 1: + _state.sent(); + compileStart = performance.now(); + return [ + 4, + new Promise(function(resolve) { + var _this_renderer_getShaderLibrary; + (_this_renderer_getShaderLibrary = _this.renderer.getShaderLibrary()) == null ? void 0 : _this_renderer_getShaderLibrary.compileAllShaders(function() { + return resolve(null); + }); + }) + ]; + case 2: + _state.sent(); + compileTime = performance.now() - compileStart; + for(i = 0; i < compositions.length; i++){ + if (autoplayFlags[i]) { + compositions[i].play(); + } else { + compositions[i].pause(); + } + } + (_this_ticker = _this.ticker) == null ? void 0 : _this_ticker.start(); + compositionNames = compositions.map(function(composition) { + return composition.name; + }); + firstFrameTime = performance.now() - last; + for(_iterator = _create_for_of_iterator_helper_loose(compositions); !(_step = _iterator()).done;){ + composition = _step.value; + composition.statistic.compileTime = compileTime; + composition.statistic.firstFrameTime = firstFrameTime; + } + logger.info("First frame [" + compositionNames + "]: " + firstFrameTime.toFixed(4) + "ms."); + logger.info("Shader " + (asyncShaderCompile ? "async" : "sync") + " compile [" + compositionNames + "]: " + compileTime.toFixed(4) + "ms."); + return [ + 2, + isArray(scene) ? compositions : compositions[0] + ]; + } + }); + })(); + }; + _proto.createComposition = function createComposition(scene, options) { + var _this = this; + if (options === void 0) options = {}; + var renderer = this.renderer; + // 加载期间 player 销毁 + if (this.disposed) { + throw new Error("Disposed player can not used to create Composition."); + } + var composition = new Composition(_extends({}, options, { + renderer: renderer, + width: renderer.getWidth(), + height: renderer.getHeight(), + event: this.event, + handleItemMessage: function(message) { + _this.emit("message", message); + } + }), scene); + // 中低端设备降帧到 30fps· + if (this.ticker && options.renderLevel === RenderLevel.B) { + this.ticker.setFPS(Math.min(this.ticker.getFPS(), 30)); + } + // TODO 目前编辑器会每帧调用 loadScene, 在这编译会导致闪帧,待编辑器渲染逻辑优化后移除。 + if (this.env !== PLAYER_OPTIONS_ENV_EDITOR) { + this.assetService.createShaderVariant(); + } + this.compositions.push(composition); + return composition; + }; + /** + * 播放通过 player 加载好的全部合成 + */ _proto.play = function play() { + var _this_ticker; + if (this.offscreenMode) { + this.resize(); + this.offscreenMode = false; + } + this.autoPlaying = true; + this.compositions.map(function(composition) { + composition.play(); + }); + (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.start(); + }; + /** + * 跳转全部合成到指定时间后播放 + * @param time - 指定时间, 单位秒 + */ _proto.gotoAndPlay = function gotoAndPlay(time) { + if (this.offscreenMode) { + this.resize(); + this.offscreenMode = false; + } + this.autoPlaying = true; + this.compositions.map(function(composition) { + composition.gotoAndPlay(time); + }); + if (this.ticker) { + this.ticker.start(); + } else { + this.doTick(0, true); + } + }; + /** + * 跳转全部合成到指定时间并停留 + * @param time - 指定时间, 单位秒 + */ _proto.gotoAndStop = function gotoAndStop(time) { + var _this_ticker; + if (this.offscreenMode) { + this.resize(); + this.offscreenMode = false; + } + this.autoPlaying = false; + this.compositions.map(function(composition) { + composition.gotoAndStop(time); + }); + if (!this.ticker || ((_this_ticker = this.ticker) == null ? void 0 : _this_ticker.getPaused())) { + this.doTick(0, true); + } + this.emit("update", { + player: this, + playing: false + }); + }; + /** + * 顺序播放一组还未开始播放的合成 + * @param compositions - 要播放的合成数组 + */ _proto.playSequence = function playSequence(compositions) { + var _loop = function(i) { + compositions[i].on("end", function() { + compositions[i + 1].play(); + }); + }; + var _this_ticker; + for(var i = 0; i < compositions.length - 1; i++)_loop(i); + compositions[0].play(); + (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.start(); + }; + /** + * 暂停播放器 + * @param options + * @param options.offloadTexture - 是否卸载贴图纹理,减少内存 + * @returns + */ _proto.pause = function pause(options) { + var _this_ticker; + if (this.paused) { + return; + } + (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.pause(); + this.emit("pause"); + this.emit("update", { + player: this, + playing: false + }); + if (options && options.offloadTexture) { + this.offloadTexture(); + } + }; + /** + * 恢复播放器 + * > 如果暂停时卸载了纹理贴图,此函数将自动请求网络重新加载纹理 + * @returns + */ _proto.resume = function resume() { + var _this = this; + return _async_to_generator(function() { + var _this_ticker; + return __generator(this, function(_state) { + switch(_state.label){ + case 0: + if (_this.resumePending) { + return [ + 2 + ]; + } + if (!_this.paused) return [ + 3, + 2 + ]; + _this.resumePending = true; + return [ + 4, + Promise.all(_this.compositions.map(function(c) { + return c.reloadTexture(); + })) + ]; + case 1: + _state.sent(); + _this.resumePending = false; + _this.handleResume(); + _state.label = 2; + case 2: + (_this_ticker = _this.ticker) == null ? void 0 : _this_ticker.resume(); + return [ + 2 + ]; + } + }); + })(); + }; + /** + * player 在定时器每帧的回调 + * @param dt - 时间差,毫秒 + */ _proto.tick = function tick(dt) { + this.doTick(dt, this.forceRenderNextFrame); + this.forceRenderNextFrame = false; + }; + _proto.doTick = function doTick(dt, forceRender) { + var _this = this; + var renderErrors = this.renderer.engine.renderErrors; + if (renderErrors.size > 0) { + var // 有渲染错误时暂停播放 + _this_ticker; + this.handleEmitEvent("rendererror", renderErrors.values().next().value); + (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.pause(); + } + dt = Math.min(dt, 33) * this.speed; + var comps = this.compositions; + var skipRender = false; + comps.sort(function(a, b) { + return a.getIndex() - b.getIndex(); + }); + var currentCompositions = []; + for(var i = 0; i < comps.length; i++){ + var composition = comps[i]; + if (composition.textureOffloaded) { + skipRender = true; + logger.error("Composition " + composition.name + " texture offloaded, skip render."); + currentCompositions.push(composition); + continue; + } + if (!composition.isDestroyed && composition.renderer) { + composition.update(dt); + } + if (!composition.isDestroyed) { + currentCompositions.push(composition); + } + } + this.compositions = currentCompositions; + this.baseCompositionIndex = this.compositions.length; + if (skipRender) { + var _this_ticker1; + this.handleEmitEvent("rendererror", new Error("Play when texture offloaded.")); + return (_this_ticker1 = this.ticker) == null ? void 0 : _this_ticker1.pause(); + } + if (!this.paused || forceRender) { + var level = this.gpuCapability.level; + var gl = this.renderer.context.gl; + var time = level === 2 && this.reportGPUTime ? gpuTimer(gl) : undefined; + time == null ? void 0 : time.begin(); + if (this.compositions.length || this.compositions.length < comps.length || forceRender) { + this.renderer.setFramebuffer(null); + this.renderer.clear({ + stencilAction: exports.TextureLoadAction.clear, + clearStencil: 0, + depthAction: exports.TextureLoadAction.clear, + clearDepth: 1, + colorAction: exports.TextureLoadAction.clear, + clearColor: [ + 0, + 0, + 0, + 0 + ] + }); + for(var i1 = 0; i1 < comps.length; i1++){ + !comps[i1].renderFrame.isDestroyed && this.renderer.renderRenderFrame(comps[i1].renderFrame); + } + } + time == null ? void 0 : time.end(); + time == null ? void 0 : time.getTime().then(function(t) { + return _this.reportGPUTime == null ? void 0 : _this.reportGPUTime.call(_this, t != null ? t : 0); + }).catch; + if (this.autoPlaying) { + this.emit("update", { + player: this, + playing: true + }); + } + } + }; + /** + * 调整画布的宽高比 + * @param aspect + * @param scale + */ _proto.resizeToAspect = function resizeToAspect(aspect, scale) { + if (scale === void 0) scale = 1; + if (aspect !== this.displayAspect) { + this.displayAspect = aspect; + } + if (scale !== this.displayScale) { + this.displayScale = scale; + } + this.resize(); + }; + /** + * 将播放器重新和父容器大小对齐 + */ _proto.resize = function resize() { + var parentElement = this.canvas.parentElement; + var containerWidth; + var containerHeight; + var canvasWidth; + var canvasHeight; + if (parentElement) { + var size = this.getTargetSize(parentElement); + containerWidth = size[0]; + containerHeight = size[1]; + canvasWidth = size[2]; + canvasHeight = size[3]; + } else { + containerWidth = canvasWidth = this.canvas.width; + containerHeight = canvasHeight = this.canvas.height; + } + var aspect = containerWidth / containerHeight; + if (containerWidth && containerHeight) { + var _this_compositions; + var documentWidth = document.documentElement.clientWidth; + if (canvasWidth > documentWidth * 2) { + logger.error("DPI overflowed, width " + canvasWidth + " is more than 2x document width " + documentWidth + ", see " + HELP_LINK["DPI overflowed"] + "."); + } + var maxSize = this.env ? this.gpuCapability.detail.maxTextureSize : 2048; + if (canvasWidth > maxSize || canvasHeight > maxSize) { + logger.error("Container size overflowed " + canvasWidth + "x" + canvasHeight + ", see " + HELP_LINK["Container size overflowed"] + "."); + if (aspect > 1) { + canvasWidth = Math.round(maxSize); + canvasHeight = Math.round(maxSize / aspect); + } else { + canvasHeight = Math.round(maxSize); + canvasWidth = Math.round(maxSize * aspect); + } + } + // ios 14.1 -ios 14.3 resize canvas will cause memory leak + this.renderer.resize(canvasWidth, canvasHeight); + this.canvas.style.width = containerWidth + "px"; + this.canvas.style.height = containerHeight + "px"; + logger.info("Resize player " + this.name + " [" + canvasWidth + "," + canvasHeight + "," + containerWidth + "," + containerHeight + "]."); + (_this_compositions = this.compositions) == null ? void 0 : _this_compositions.forEach(function(comp) { + comp.camera.aspect = aspect; + }); + } + }; + /** + * 清空 canvas 的画面 + * @param immediate - 如果立即清理,当前画面将会消失,如果 player 还有合成在渲染,可能出现闪烁 + */ _proto.clearCanvas = function clearCanvas(immediate) { + if (immediate) { + this.renderer.clear({ + stencilAction: exports.TextureLoadAction.clear, + clearStencil: 0, + depthAction: exports.TextureLoadAction.clear, + clearDepth: 1, + colorAction: exports.TextureLoadAction.clear, + clearColor: [ + 0, + 0, + 0, + 0 + ] + }); + } else { + this.forceRenderNextFrame = true; + } + }; + /** + * 销毁当前播放的所有 Composition + */ _proto.destroyCurrentCompositions = function destroyCurrentCompositions() { + this.compositions.forEach(function(comp) { + return comp.dispose(); + }); + this.compositions.length = 0; + this.baseCompositionIndex = 0; + }; + /** + * 销毁播放器 + * @param keepCanvas - 是否保留 canvas 画面,默认不保留,canvas 不能再被使用 + */ _proto.dispose = function dispose(keepCanvas) { + var _this_ticker; + logger.info("Call player destroyed: " + this.name + "."); + if (this.disposed) { + return; + } + playerMap.delete(this.canvas); + this.pause(); + (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.stop(); + this.assetManagers.forEach(function(assetManager) { + return assetManager.dispose(); + }); + this.compositions.forEach(function(comp) { + return comp.dispose(); + }); + this.compositions.length = 0; + if (this.renderer) { + this.renderer.context.removeLostHandler({ + lost: this.lost + }); + this.renderer.context.removeRestoreHandler({ + restore: this.restore + }); + this.renderer.dispose(!keepCanvas); + } + if (this.event) { + this.event.dispose(); + } + this.assetService.dispose(); + broadcastPlayerEvent(this, false); + if (_instanceof1(this.canvas, HTMLCanvasElement) && !keepCanvas && this.renderer.context) { + // TODO: 数据模版下掉可以由文本模块单独管理 + canvasPool.dispose(); + // canvas will become a cry emoji in Android if still in dom + if (this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + this.canvas.remove(); + } + // 在报错函数中传入 player.name + var errorMsg = getDestroyedErrorMessage(this.name); + var throwErrorFunc = function() { + return throwError(errorMsg); + }; + var throwErrorPromiseFunc = function() { + return throwErrorPromise(errorMsg); + }; + this.tick = throwErrorFunc; + this.resize = throwErrorFunc; + this.loadScene = throwErrorPromiseFunc; + this.play = throwErrorPromiseFunc; + this.gotoAndPlay = throwErrorPromiseFunc; + this.gotoAndStop = throwErrorPromiseFunc; + this.playSequence = throwErrorFunc; + this.destroyCurrentCompositions = throwErrorFunc; + this.resume = throwErrorPromiseFunc; + this.disposed = true; + }; + _proto.offloadTexture = function offloadTexture() { + this.compositions.forEach(function(comp) { + return comp.offloadTexture(); + }); + }; + _proto.getTargetSize = function getTargetSize(parentEle) { + assertContainer(parentEle); + var displayAspect = this.displayAspect; + // 小程序环境没有 getComputedStyle + var computedStyle = window.getComputedStyle == null ? void 0 : window.getComputedStyle.call(window, parentEle); + var targetWidth; + var targetHeight; + var finalWidth = 0; + var finalHeight = 0; + if (computedStyle) { + finalWidth = parseInt(computedStyle.width, 10); + finalHeight = parseInt(computedStyle.height, 10); + } else { + finalWidth = parentEle.clientWidth; + finalHeight = parentEle.clientHeight; + } + if (displayAspect) { + var parentAspect = finalWidth / finalHeight; + if (parentAspect > displayAspect) { + targetHeight = finalHeight * this.displayScale; + targetWidth = targetHeight * displayAspect; + } else { + targetWidth = finalWidth * this.displayScale; + targetHeight = targetWidth / displayAspect; + } + } else { + targetWidth = finalWidth; + targetHeight = finalHeight; + } + var ratio = this.pixelRatio; + var containerWidth = targetWidth; + var containerHeight = targetHeight; + targetWidth = Math.round(targetWidth * ratio); + targetHeight = Math.round(targetHeight * ratio); + if (targetHeight < 1 || targetHeight < 1) { + if (this.offscreenMode) { + targetWidth = targetHeight = containerWidth = containerHeight = 1; + } else { + throw new Error("Invalid container size " + targetWidth + "x" + targetHeight + ", see " + HELP_LINK["Invalid container size"] + "."); + } + } + return [ + containerWidth, + containerHeight, + targetWidth, + targetHeight + ]; + }; + _proto.handleThrowError = function handleThrowError(e) { + if (this.onError) { + this.onError(e); + } else { + throw e; + } + }; + _proto.handleEmitEvent = function handleEmitEvent(name, e) { + if (this.onError) { + if (_instanceof1(e, Event)) { + this.onError(new Error(e.type, { + cause: name + }), e); + } else if (_instanceof1(e, Error)) { + this.onError(new Error(e.message, { + cause: name + }), e); + } else { + this.onError(new Error("Unknown error.", { + cause: name + }), e); + } + } else { + console.warn("[" + name + "] event is deprecated, please use 'onError' instead."); + this.emit(name, e); + } + }; + _create_class(Player, [ + { + key: "compositionCount", + get: /** + * 获取当前播放的合成数量 + */ function get() { + return this.compositions.length; + } + }, + { + key: "hasPlayable", + get: /** + * 是否有合成在播放 + */ function get() { + return this.compositions.length > 0; + } + }, + { + key: "paused", + get: /** + * 播放器是否已暂停 + */ function get() { + var _this_ticker; + return (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.getPaused(); + } + }, + { + key: "interactive", + get: /** + * 获取播放器是否可交互 + */ function get() { + return this.event.enabled; + }, + set: /** + * 设置播放器是否可交互 + */ function set(enable) { + this.event.enabled = enable; + } + } + ]); + return Player; +}(EventEmitter); +__decorate([ + handleThrowError +], Player.prototype, "loadScene", null); +/** + * 禁止/允许创建新的播放器,已创建的不受影响 + * @param disable - 是否禁止 + */ function disableAllPlayer(disable) { + enableDebugType = !!disable; +} +/** + * 播放器在实例化、销毁(`dispose`)时分别触发插件的 `onPlayerCreated`、`onPlayerDestroy` 回调 + * @param player - 播放器 + * @param isCreate - 是否处于实例化时 + */ function broadcastPlayerEvent(player, isCreate) { + Object.keys(pluginLoaderMap).forEach(function(key) { + var ctrl = pluginLoaderMap[key]; + var func = isCreate ? ctrl.onPlayerCreated : ctrl.onPlayerDestroy; + func == null ? void 0 : func(player); + }); +} +/** + * 创建播放器传入的容器不是 `HTMLElement` 时抛出错误 + * @param container + */ function assertContainer(container) { + if (container === undefined || container === null) { + throw new Error("Container is not an HTMLElement, see " + HELP_LINK["Container is not an HTMLElement"] + "."); + } +} +function getDestroyedErrorMessage(name) { + return "Never use destroyed player: " + name + " again, see " + HELP_LINK["Never use destroyed player again"] + "."; +} + +Texture.create = function(engine, props) { + return new GLTexture(engine, props); +}; +Texture.createWithData = function(engine, data, options) { + if (data === void 0) data = imageDataFromColor("#fff"); + if (options === void 0) options = {}; + var _options_type = options.type, type = _options_type === void 0 ? glContext.UNSIGNED_BYTE : _options_type, _options_format = options.format, format = _options_format === void 0 ? glContext.RGBA : _options_format, internalFormat = options.internalFormat, _options_wrapS = options.wrapS, wrapS = _options_wrapS === void 0 ? glContext.MIRRORED_REPEAT : _options_wrapS, _options_wrapT = options.wrapT, wrapT = _options_wrapT === void 0 ? glContext.MIRRORED_REPEAT : _options_wrapT, _options_minFilter = options.minFilter, minFilter = _options_minFilter === void 0 ? glContext.NEAREST : _options_minFilter, _options_magFilter = options.magFilter, magFilter = _options_magFilter === void 0 ? glContext.NEAREST : _options_magFilter, _options_flipY = options.flipY, flipY = _options_flipY === void 0 ? false : _options_flipY; + var tex = new GLTexture(engine, { + data: data, + type: type, + sourceType: exports.TextureSourceType.data, + format: format, + internalFormat: internalFormat || format, + wrapS: wrapS, + wrapT: wrapT, + minFilter: minFilter, + magFilter: magFilter, + flipY: flipY + }); + return tex; +}; +Material.create = function(engine, props) { + return new GLMaterial(engine, props); +}; +Geometry.create = function(engine, props) { + return new GLGeometry(engine, props); +}; +Mesh.create = function(engine, props) { + return new Mesh(engine, props); +}; +Renderbuffer.create = function(props) { + return new GLRenderbuffer(props); +}; +Framebuffer.create = function(props, renderer) { + return new GLFramebuffer(props, renderer); +}; +Renderer.create = function(canvas, framework, renderOptions) { + return new GLRenderer(canvas, framework, renderOptions); +}; +Engine.create = function(gl) { + return new GLEngine(gl); +}; +/** + * Player 版本号 + */ var version = "2.4.3"; +logger.info("Player version: " + version + "."); + +exports.AbstractPlugin = AbstractPlugin; +exports.ActivationPlayable = ActivationPlayable; +exports.AnimationClipPlayable = AnimationClipPlayable; +exports.Asset = Asset; +exports.AssetLoader = AssetLoader; +exports.AssetManager = AssetManager; +exports.AssetService = AssetService; +exports.BYTES_TYPE_MAP = BYTES_TYPE_MAP; +exports.BaseRenderComponent = BaseRenderComponent; +exports.Behaviour = Behaviour; +exports.BezierCurve = BezierCurve; +exports.BezierCurvePath = BezierCurvePath; +exports.BezierCurveQuat = BezierCurveQuat; +exports.COPY_FRAGMENT_SHADER = COPY_FRAGMENT_SHADER; +exports.COPY_MESH_SHADER_ID = COPY_MESH_SHADER_ID; +exports.COPY_VERTEX_SHADER = COPY_VERTEX_SHADER; +exports.CalculateLoader = CalculateLoader; +exports.Camera = Camera; +exports.CameraVFXItemLoader = CameraVFXItemLoader; +exports.ColorCurve = ColorCurve; +exports.Component = Component; +exports.Composition = Composition; +exports.DEFAULT_FONTS = DEFAULT_FONTS; +exports.DEFAULT_FPS = DEFAULT_FPS; +exports.Database = Database; +exports.Downloader = Downloader; +exports.EFFECTS_COPY_MESH_NAME = EFFECTS_COPY_MESH_NAME; +exports.EVENT_TYPE_CLICK = EVENT_TYPE_CLICK; +exports.EVENT_TYPE_TOUCH_END = EVENT_TYPE_TOUCH_END; +exports.EVENT_TYPE_TOUCH_MOVE = EVENT_TYPE_TOUCH_MOVE; +exports.EVENT_TYPE_TOUCH_START = EVENT_TYPE_TOUCH_START; +exports.EffectsObject = EffectsObject; +exports.EffectsPackage = EffectsPackage; +exports.Ellipse = Ellipse; +exports.Engine = Engine; +exports.EventEmitter = EventEmitter; +exports.EventSystem = EventSystem; +exports.Float16ArrayWrapper = Float16ArrayWrapper; +exports.Framebuffer = Framebuffer; +exports.GLEngine = GLEngine; +exports.GLGeometry = GLGeometry; +exports.GLRenderer = GLRenderer; +exports.GPUCapability = GPUCapability; +exports.Geometry = Geometry; +exports.GlobalUniforms = GlobalUniforms; +exports.GradientValue = GradientValue; +exports.GraphicsPath = GraphicsPath; +exports.HELP_LINK = HELP_LINK$1; +exports.InteractLoader = InteractLoader; +exports.InteractMesh = InteractMesh; +exports.KTXTexture = KTXTexture; +exports.LineSegments = LineSegments; +exports.LinearValue = LinearValue; +exports.MaskProcessor = MaskProcessor; +exports.Material = Material; +exports.MaterialDataBlock = MaterialDataBlock; +exports.Mesh = Mesh; +exports.MeshCollider = MeshCollider; +exports.PLAYER_OPTIONS_ENV_EDITOR = PLAYER_OPTIONS_ENV_EDITOR; +exports.POST_PROCESS_SETTINGS = POST_PROCESS_SETTINGS; +exports.ParticleBehaviourPlayable = ParticleBehaviourPlayable; +exports.ParticleBehaviourPlayableAsset = ParticleBehaviourPlayableAsset; +exports.ParticleLoader = ParticleLoader; +exports.ParticleMesh = ParticleMesh; +exports.ParticleSystemRenderer = ParticleSystemRenderer; +exports.ParticleTrack = ParticleTrack; +exports.PassTextureCache = PassTextureCache; +exports.PathSegments = PathSegments; +exports.Player = Player; +exports.PluginSystem = PluginSystem; +exports.PolyStar = PolyStar; +exports.Polygon = Polygon; +exports.PropertyTrack = PropertyTrack; +exports.RENDER_PASS_NAME_PREFIX = RENDER_PASS_NAME_PREFIX; +exports.RENDER_PREFER_LOOKUP_TEXTURE = RENDER_PREFER_LOOKUP_TEXTURE; +exports.RUNTIME_ENV = RUNTIME_ENV; +exports.RandomSetValue = RandomSetValue; +exports.RandomValue = RandomValue; +exports.RandomVectorValue = RandomVectorValue; +exports.RenderFrame = RenderFrame; +exports.RenderPass = RenderPass; +exports.RenderPassPriorityNormal = RenderPassPriorityNormal; +exports.RenderPassPriorityPostprocess = RenderPassPriorityPostprocess; +exports.RenderPassPriorityPrepare = RenderPassPriorityPrepare; +exports.RenderTargetHandle = RenderTargetHandle; +exports.Renderbuffer = Renderbuffer; +exports.Renderer = Renderer; +exports.RendererComponent = RendererComponent; +exports.RuntimeClip = RuntimeClip; +exports.SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0 = SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0; +exports.SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0 = SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0; +exports.SEMANTIC_PRE_COLOR_ATTACHMENT_0 = SEMANTIC_PRE_COLOR_ATTACHMENT_0; +exports.SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0 = SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0; +exports.SPRITE_VERTEX_STRIDE = SPRITE_VERTEX_STRIDE; +exports.SemanticMap = SemanticMap; +exports.SerializationHelper = SerializationHelper; +exports.ShaderFactory = ShaderFactory; +exports.ShaderVariant = ShaderVariant; +exports.ShapePath = ShapePath; +exports.SpriteLoader = SpriteLoader; +exports.StaticValue = StaticValue; +exports.TEMPLATE_USE_OFFSCREEN_CANVAS = TEMPLATE_USE_OFFSCREEN_CANVAS; +exports.TextComponentBase = TextComponentBase; +exports.TextLayout = TextLayout; +exports.TextLoader = TextLoader; +exports.TextStyle = TextStyle; +exports.Texture = Texture; +exports.TextureFactory = TextureFactory; +exports.Ticker = Ticker; +exports.TimelineClip = TimelineClip; +exports.TimelinePlayable = TimelinePlayable; +exports.TrackSortWrapper = TrackSortWrapper; +exports.Transform = Transform; +exports.TransformAnimationPlayable = TransformAnimationPlayable; +exports.ValueGetter = ValueGetter; +exports.Vector2Curve = Vector2Curve; +exports.Vector4Curve = Vector4Curve; +exports.addByOrder = addByOrder; +exports.addItem = addItem; +exports.addItemWithOrder = addItemWithOrder; +exports.applyMixins = applyMixins; +exports.assertExist = assertExist; +exports.asserts = asserts; +exports.base64ToFile = base64ToFile; +exports.blend = blend; +exports.buildLine = buildLine; +exports.calculateTranslation = calculateTranslation; +exports.canvasPool = canvasPool; +exports.closePointEps = closePointEps; +exports.colorGradingFrag = colorGradingFrag; +exports.colorStopsFromGradient = colorStopsFromGradient; +exports.colorToArr = colorToArr$1; +exports.combineImageTemplate = combineImageTemplate; +exports.createCopyShader = createCopyShader; +exports.createGLContext = createGLContext; +exports.createKeyFrameMeta = createKeyFrameMeta; +exports.createShape = createShape; +exports.createValueGetter = createValueGetter; +exports.curveEps = curveEps; +exports.decimalEqual = decimalEqual; +exports.defaultPlugins = defaultPlugins; +exports.deserializeMipmapTexture = deserializeMipmapTexture; +exports.disableAllPlayer = disableAllPlayer; +exports.earcut = earcut; +exports.effectsClass = effectsClass; +exports.effectsClassStore = effectsClassStore; +exports.enlargeBuffer = enlargeBuffer; +exports.ensureFixedNumber = ensureFixedNumber; +exports.ensureVec3 = ensureVec3; +exports.findPreviousRenderPass = findPreviousRenderPass; +exports.gaussianDownFrag = gaussianDown_frag; +exports.gaussianDownHFrag = gaussianDownHFrag; +exports.gaussianDownVFrag = gaussianDownVFrag; +exports.gaussianUpFrag = gaussianUpFrag; +exports.generateEmptyTypedArray = generateEmptyTypedArray; +exports.generateGUID = generateGUID; +exports.generateHalfFloatTexture = generateHalfFloatTexture; +exports.generateTransparentTexture = generateTransparentTexture; +exports.generateWhiteTexture = generateWhiteTexture; +exports.getActivePlayers = getActivePlayers; +exports.getBackgroundImage = getBackgroundImage; +exports.getColorFromGradientStops = getColorFromGradientStops; +exports.getConfig = getConfig; +exports.getDefaultTextureFactory = getDefaultTextureFactory; +exports.getGeometryByShape = getGeometryByShape; +exports.getGeometryTriangles = getGeometryTriangles; +exports.getKTXTextureOptions = getKTXTextureOptions; +exports.getKeyFrameMetaByRawValue = getKeyFrameMetaByRawValue; +exports.getMergedStore = getMergedStore; +exports.getParticleMeshShader = getParticleMeshShader; +exports.getPixelRatio = getPixelRatio; +exports.getPlayerByCanvas = getPlayerByCanvas; +exports.getPreMultiAlpha = getPreMultiAlpha; +exports.getStandardComposition = getStandardComposition; +exports.getStandardImage = getStandardImage; +exports.getStandardItem = getStandardItem; +exports.getStandardJSON = getStandardJSON; +exports.getTextureSize = getTextureSize; +exports.glContext = glContext; +exports.glType2VertexFormatType = glType2VertexFormatType; +exports.gpuTimer = gpuTimer; +exports.imageDataFromColor = imageDataFromColor; +exports.imageDataFromGradient = imageDataFromGradient; +exports.initErrors = initErrors; +exports.initGLContext = initGLContext; +exports.integrate = integrate; +exports.interpolateColor = interpolateColor; +exports.isAlipayMiniApp = isAlipayMiniApp; +exports.isAndroid = isAndroid; +exports.isArray = isArray; +exports.isCanvas = isCanvas; +exports.isCanvasUsedByPlayer = isCanvasUsedByPlayer; +exports.isFunction = isFunction; +exports.isIOS = isIOS; +exports.isIOSByUA = isIOSByUA; +exports.isMiniProgram = isMiniProgram; +exports.isObject = isObject; +exports.isOpenHarmony = isOpenHarmony; +exports.isSimulatorCellPhone = isSimulatorCellPhone; +exports.isString = isString; +exports.isUniformStruct = isUniformStruct; +exports.isUniformStructArray = isUniformStructArray; +exports.isValidFontFamily = isValidFontFamily; +exports.isWebGL2 = isWebGL2; +exports.isWechatMiniApp = isWechatMiniApp; +exports.itemFrag = itemFrag; +exports.itemFrameFrag = itemFrame_frag; +exports.itemVert = itemVert; +exports.loadAVIFOptional = loadAVIFOptional; +exports.loadBinary = loadBinary; +exports.loadBlob = loadBlob; +exports.loadImage = loadImage; +exports.loadMedia = loadMedia; +exports.loadVideo = loadVideo; +exports.loadWebPOptional = loadWebPOptional; +exports.logger = logger; +exports.math = index; +exports.modifyMaxKeyframeShader = modifyMaxKeyframeShader; +exports.nearestPowerOfTwo = nearestPowerOfTwo; +exports.noop = noop; +exports.normalizeColor = normalizeColor; +exports.numberToFix = numberToFix; +exports.parsePercent = parsePercent$1; +exports.particleFrag = particleFrag; +exports.particleOriginTranslateMap = particleOriginTranslateMap$1; +exports.particleUniformTypeMap = particleUniformTypeMap; +exports.particleVert = particleVert; +exports.passRenderLevel = passRenderLevel; +exports.pluginLoaderMap = pluginLoaderMap; +exports.randomInRange = randomInRange; +exports.registerPlugin = registerPlugin; +exports.removeItem = removeItem; +exports.rotateVec2 = rotateVec2; +exports.screenMeshVert = screenMeshVert; +exports.serialize = serialize; +exports.setBlendMode = setBlendMode; +exports.setConfig = setConfig; +exports.setDefaultTextureFactory = setDefaultTextureFactory; +exports.setMaskMode = setMaskMode; +exports.setMaxSpriteMeshItemCount = setMaxSpriteMeshItemCount; +exports.setRayFromCamera = setRayFromCamera; +exports.setSideMode = setSideMode; +exports.setSpriteMeshMaxItemCountByGPU = setSpriteMeshMaxItemCountByGPU; +exports.sortByOrder = sortByOrder; +exports.spec = index$1; +exports.thresholdFrag = thresholdFrag; +exports.throwDestroyedError = throwDestroyedError; +exports.trailVert = trailVert; +exports.translatePoint = translatePoint; +exports.trianglesFromRect = trianglesFromRect; +exports.unregisterPlugin = unregisterPlugin; +exports.valIfUndefined = valIfUndefined; +exports.value = value; +exports.valueDefine = valueDefine; +exports.vecFill = vecFill; +exports.vecMulCombine = vecMulCombine; +exports.version = version; +exports.vertexFormatType2GLType = vertexFormatType2GLType; +//# sourceMappingURL=index.js.map + +}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); }) +return __REQUIRE__(1748338798564); +})() +//miniprogram-npm-outsideDeps=[] +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/src/miniprogram_npm/@galacean/effects/index.js.map b/src/miniprogram_npm/@galacean/effects/index.js.map new file mode 100644 index 0000000..12b9fde --- /dev/null +++ b/src/miniprogram_npm/@galacean/effects/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.js"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":["/*!\n * Name: @galacean/effects\n * Description: Galacean Effects runtime player for the web\n * Author: Ant Group CO., Ltd.\n * Contributors: 燃然,飂兮,十弦,云垣,茂安,意绮\n * Version: v2.4.3\n */\n\n\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}\n\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n return function() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _instanceof1(left, right) {\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else return _instanceof1(left, right);\n}\n\nfunction _type_of(obj) {\n \"@swc/helpers - typeof\";\n return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\n\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n return this;\n }), g;\n function verb(n) {\n return function(v) {\n return step([\n n,\n v\n ]);\n };\n }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while(g && (g = 0, op[0] && (_ = 0)), _)try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [\n op[0] & 2,\n t.value\n ];\n switch(op[0]){\n case 0:\n case 1:\n t = op;\n break;\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n case 5:\n _.label++;\n y = op[1];\n op = [\n 0\n ];\n continue;\n case 7:\n op = _.ops.pop();\n _.trys.pop();\n continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n if (t && _.label < t[2]) {\n _.label = t[2];\n _.ops.push(op);\n break;\n }\n if (t[2]) _.ops.pop();\n _.trys.pop();\n continue;\n }\n op = body.call(thisArg, _);\n } catch (e) {\n op = [\n 6,\n e\n ];\n y = 0;\n } finally{\n f = t = 0;\n }\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function _SuppressedError(error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\n// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nfunction rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== \"undefined\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n if (!getRandomValues) {\n throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n }\n }\n return getRandomValues(rnds8);\n}\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */ var byteToHex = [];\nfor(var i = 0; i < 256; ++i){\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nfunction unsafeStringify(arr, offset) {\n if (offset === void 0) offset = 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + \"-\" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + \"-\" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + \"-\" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + \"-\" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nvar randomUUID = typeof crypto !== \"undefined\" && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nvar native = {\n randomUUID: randomUUID\n};\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for(var i = 0; i < 16; ++i){\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\n\nfunction addItem(arr, value) {\n if (!arr.includes(value)) {\n arr.push(value);\n }\n return arr;\n}\n/**\n * 性能测试:https://blog.mutoe.com/2019/compare-filter-vs-splice-in-javascript/\n * @param arr\n * @param value\n * @returns\n */ function removeItem(arr, value) {\n var index = arr.indexOf(value);\n if (index > -1) {\n arr.splice(index, 1);\n }\n return arr;\n}\n/**\n * 原 arrAddWithOrder 根据property的大小在arr中插入item\n * @param arr\n * @param item\n * @param property\n * @param descending\n * @returns\n */ function addItemWithOrder(arr, item, property, descending) {\n if (descending === void 0) descending = false;\n if (arr.includes(item)) {\n return;\n }\n arr.push(item);\n if (arr.length === 1) {\n return;\n }\n //单次插入排序\n var index = arr.length - 1;\n if (index) {\n var currentItem = arr[index];\n if (descending) {\n while(arr[index - 1][property] < currentItem[property]){\n arr[index] = arr[index - 1];\n index--;\n if (index === 0) {\n break;\n }\n }\n } else {\n while(arr[index - 1][property] > currentItem[property]){\n arr[index] = arr[index - 1];\n index--;\n if (index === 0) {\n break;\n }\n }\n }\n arr[index] = currentItem;\n }\n}\nfunction enlargeBuffer(typeArray, length, maxSize, increase) {\n if (increase === void 0) increase = 1;\n var buffer = typeArray.buffer;\n if (buffer.byteLength < typeArray.BYTES_PER_ELEMENT * length) {\n var size = Math.ceil(length * increase);\n if (!Number.isNaN(maxSize)) {\n size = Math.min(size, maxSize);\n }\n var nbuffer = new ArrayBuffer(typeArray.BYTES_PER_ELEMENT * size);\n var nArr = new typeArray.constructor(nbuffer);\n nArr.set(typeArray);\n return nArr;\n }\n return typeArray;\n}\n\nfunction colorToArr$1(hex, normalized) {\n var ret = [\n 0,\n 0,\n 0,\n 0\n ];\n if (isString(hex)) {\n hex = hex.replace(/[\\s\\t\\r\\n]/g, \"\");\n var m = /rgba?\\(([.\\d]+),([.\\d]+),([.\\d]+),?([.\\d]+)?\\)/.exec(hex);\n if (m) {\n var a = +m[4];\n ret = [\n +m[1],\n +m[2],\n +m[3],\n isNaN(a) ? 255 : a * 255\n ];\n } else if (/^#[a-f\\d]{3}$/i.test(hex)) {\n ret = [\n parseInt(hex[1] + hex[1], 16),\n parseInt(hex[2] + hex[2], 16),\n parseInt(hex[3] + hex[3], 16),\n 255\n ];\n // eslint-disable-next-line no-cond-assign\n } else if (m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)) {\n ret = [\n parseInt(m[1], 16),\n parseInt(m[2], 16),\n parseInt(m[3], 16),\n 255\n ] || [\n 0,\n 0,\n 0,\n 255\n ];\n }\n } else if (_instanceof1(hex, Array)) {\n ret = [\n hex[0],\n hex[1],\n hex[2],\n isNaN(hex[3]) ? 255 : hex[3]\n ];\n }\n if (normalized) {\n for(var i = 0; i < 4; i++){\n ret[i] /= 255;\n }\n }\n return ret;\n}\nfunction getColorFromGradientStops(stops, key, normalize) {\n if (stops.length) {\n var color;\n for(var j = 1; j <= stops.length - 1; j++){\n var s0 = stops[j - 1];\n var s1 = stops[j];\n if (s0.stop <= key && key <= s1.stop) {\n color = interpolateColor(s0.color, s1.color, (key - s0.stop) / (s1.stop - s0.stop));\n break;\n }\n }\n if (!color) {\n color = stops[stops.length - 1].color;\n }\n return normalize ? color.map(function(n) {\n return n / 255;\n }) : color;\n }\n return [\n 0,\n 0,\n 0,\n 0\n ];\n}\nfunction colorStopsFromGradient(gradient) {\n var stops = [];\n if (_instanceof1(gradient, Array)) {\n gradient.forEach(function(val) {\n var s = val[0], r = val[1], g = val[2], b = val[3], a = val[4];\n stops.push({\n // TODO\n // @ts-expect-error\n stop: parsePercent$1(s),\n color: [\n r,\n g,\n b,\n a\n ]\n });\n });\n } else {\n Object.keys(gradient).forEach(function(stop) {\n var colorRGB = gradient[stop];\n var color = colorToArr$1(colorRGB);\n stops.push({\n stop: parsePercent$1(stop),\n color: color\n });\n });\n }\n stops = stops.sort(function(a, b) {\n return a.stop - b.stop;\n });\n if (stops.length) {\n if (stops[0].stop !== 0) {\n stops.unshift({\n stop: 0,\n color: stops[0].color.slice()\n });\n }\n var lastStop = stops[stops.length - 1];\n if (lastStop.stop !== 1) {\n stops.push({\n stop: 1,\n color: lastStop.color.slice()\n });\n }\n }\n return stops;\n}\nfunction interpolateColor(a, b, s, origin) {\n var ret = [];\n var ms = 1 - s;\n if (origin) {\n for(var i = 0; i < 4; i++){\n ret[i] = a[i] * ms + b[i] * s;\n }\n } else {\n for(var i1 = 0; i1 < 3; i1++){\n ret[i1] = Math.round(Math.sqrt(a[i1] * a[i1] * ms + b[i1] * b[i1] * s));\n }\n ret[3] = Math.round(a[3] * ms + b[3] * s);\n }\n return ret;\n}\nfunction parsePercent$1(c) {\n var match = /^(-)?([\\d+.]+)%$/.exec(c);\n if (match) {\n return +match[2] / 100 * (match[1] ? -1 : 1);\n }\n return +c;\n}\n\nfunction getPixelRatio() {\n if (typeof screen === \"object\" && typeof document === \"object\") {\n var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n var screenWidth = screen.width;\n var viewportScale = screenWidth / viewportWidth;\n return Math.min(2 * viewportScale, 2);\n }\n return 1;\n}\nfunction isIOS() {\n // real ios device not in simulator\n return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);\n}\nfunction isIOSByUA() {\n var str = navigator.userAgent.toLowerCase();\n var ver = str.match(/cpu (iphone )?os (.*?) like mac os/);\n return ver ? parseInt(ver[2], 10) : 0;\n}\nfunction isAndroid() {\n return /\\b[Aa]ndroid\\b/.test(navigator.userAgent);\n}\nfunction isOpenHarmony() {\n return /\\bOpenHarmony\\b/.test(navigator.userAgent);\n}\nfunction isSimulatorCellPhone() {\n return isAndroid() || isOpenHarmony() || /\\b(iPad|iPhone|iPod)\\b/.test(navigator.userAgent);\n}\nfunction isMiniProgram() {\n return isAlipayMiniApp() || isWechatMiniApp();\n}\nfunction isAlipayMiniApp() {\n var _my;\n return typeof my !== \"undefined\" && ((_my = my) == null ? void 0 : _my.renderTarget) === \"web\";\n}\nfunction isWechatMiniApp() {\n return window.__wxjs_environment === \"miniprogram\";\n}\n\nfunction imageDataFromColor(value) {\n if (isString(value)) {\n value = colorToArr$1(value);\n }\n var color = value;\n var image = {\n width: 1,\n height: 1,\n data: new Uint8Array(1 * 1 * 4)\n };\n var data = image.data;\n for(var i = 0; i < 4; i++){\n data[i] = color[i];\n }\n return image;\n}\nfunction imageDataFromGradient(gradient) {\n var width = 128;\n var image = {\n width: width,\n height: 1,\n data: new Uint8Array(width * 1 * 4)\n };\n var data = image.data;\n var stops = colorStopsFromGradient(gradient);\n if (stops.length) {\n data.set(stops[0].color, 0);\n for(var i = 1, cursor = 0; i < width - 1; i++){\n var index = i / width;\n var s0 = void 0;\n var s1 = void 0;\n for(var j = cursor; j < stops.length; j++){\n s0 = stops[j];\n s1 = stops[j + 1];\n if (s0.stop <= index && s1.stop > index) {\n break;\n }\n }\n var color = interpolateColor(s0.color, s1.color, (index - s0.stop) / (s1.stop - s0.stop));\n data.set(color, i * 4);\n }\n data.set(stops[stops.length - 1].color, (width - 1) * 4);\n }\n return image;\n}\n\nexports.OrderType = void 0;\n(function(OrderType) {\n OrderType[OrderType[\"none\"] = 1] = \"none\";\n OrderType[OrderType[\"ascending\"] = 2] = \"ascending\";\n OrderType[OrderType[\"descending\"] = 3] = \"descending\";\n})(exports.OrderType || (exports.OrderType = {}));\n/**\n * 按照指定排序方式对数组排序\n * @param arr - 要排序的数组\n * @param order - 排序方式\n * @returns\n */ function sortByOrder(arr, order) {\n if (order === void 0) order = 2;\n var length = arr.length;\n if (length <= 1 || order === 1) {\n return arr;\n }\n if (length <= 30) {\n for(var i = 1; i < length; i++){\n insertionSort(arr, i, order);\n }\n return arr;\n } else {\n return fastSort(arr, order);\n }\n}\n/**\n * 按照指定排序方式往Sortable数组中添加成员\n * @param arr - 被添加的数组\n * @param item - 要添加的成员\n * @param order - 排序方式\n * @returns\n */ function addByOrder(arr, item, order) {\n if (order === void 0) order = 2;\n if (arr.includes(item)) {\n return arr;\n }\n arr.push(item);\n if (arr.length === 1) {\n return arr;\n }\n if (order !== 1) {\n insertionSort(arr, arr.length - 1, order);\n }\n return arr;\n}\nfunction insertionSort(array, index, order) {\n var currentItem = array[index];\n if (order !== 2) {\n while(index >= 1 && array[index - 1].priority < currentItem.priority){\n array[index] = array[index - 1];\n index--;\n if (index === 0) {\n break;\n }\n }\n } else {\n while(index >= 1 && array[index - 1].priority > currentItem.priority){\n array[index] = array[index - 1];\n index--;\n if (index === 0) {\n break;\n }\n }\n }\n array[index] = currentItem;\n}\nfunction fastSort(arr, order, start, end) {\n if (start === void 0) start = 0;\n if (end === void 0) end = arr.length - 1;\n // 终止条件\n if (start >= end) {\n return arr;\n }\n var base = arr[start];\n var left = start;\n var right = end;\n while(left < right){\n if (order === 2) {\n // 从右向左,寻找第一个小于base的值\n while(arr[right].priority > base.priority && right >= left){\n right--;\n }\n // 从左向右,寻找第一个大于base的值\n while(arr[left].priority <= base.priority && left < right){\n left++;\n }\n } else {\n // 从右向左,寻找第一个大于base的值\n while(arr[right].priority < base.priority && right >= left){\n right--;\n }\n // 从左向右,寻找第一个小于base的值\n while(arr[left].priority >= base.priority && left < right){\n left++;\n }\n }\n var ref;\n // 将两个值交换位置\n ref = [\n arr[right],\n arr[left]\n ], arr[left] = ref[0], arr[right] = ref[1];\n }\n var ref1;\n // 将最后两个游标相遇的位置的值与base值交换\n ref1 = [\n arr[left],\n arr[start]\n ], arr[start] = ref1[0], arr[left] = ref1[1];\n fastSort(arr, order, start, left - 1);\n fastSort(arr, order, right + 1, end);\n return arr;\n}\n\nfunction assertExist(item, msg) {\n if (msg === void 0) msg = \"item doesn't exist\";\n if (item === undefined || item === null) {\n throw new Error(msg);\n }\n}\nfunction asserts(condition, msg) {\n if (msg === void 0) msg = \"asserts failed\";\n if (!condition) {\n throw new Error(msg);\n }\n}\n\n/**\n * 判断是否为可解析的字体\n * - 首字母不能为数字或 `.`\n * - 不能包含特殊字符,`_-` 是被允许的\n * @param fontFamily - 字体名称\n * @returns\n */ function isValidFontFamily(fontFamily) {\n // iOS 11/12 不支持自定义字体开头为数字的名称,特殊字符也有风险\n return /^[^\\d.][\\w-]*$/.test(fontFamily);\n}\n\nvar prefix = \"[Galacean Effects]\";\nvar localLogger;\nfunction format(message) {\n return [\n \"%c\" + prefix,\n \"color: #AA0100\",\n \"\" + message\n ];\n}\nfunction error(message) {\n for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n args[_key - 1] = arguments[_key];\n }\n var _console;\n (_console = console).error.apply(_console, [].concat(format(message), [\n args\n ]));\n localLogger == null ? void 0 : localLogger(\"error\", message, args);\n}\n/**\n * info 会转换成浏览器的 console.debug\n * @param message\n * @param args\n */ function info(message) {\n for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n args[_key - 1] = arguments[_key];\n }\n var _console;\n (_console = console).debug.apply(_console, [].concat(format(message)));\n localLogger == null ? void 0 : localLogger(\"info\", message, args);\n}\nfunction warn(message) {\n for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n args[_key - 1] = arguments[_key];\n }\n var _console;\n (_console = console).warn.apply(_console, [].concat(format(message)));\n localLogger == null ? void 0 : localLogger(\"warn\", message, args);\n}\n/**\n * 注册自定义埋点函数\n *\n * @param fn\n */ function register(fn) {\n if (fn && isFunction(fn)) {\n localLogger = fn;\n }\n}\nvar logger = {\n error: error,\n info: info,\n warn: warn,\n register: register\n};\n\nexports.DestroyOptions = void 0;\n(function(DestroyOptions) {\n DestroyOptions[DestroyOptions[\"destroy\"] = 0] = \"destroy\";\n DestroyOptions[DestroyOptions[\"keep\"] = 1] = \"keep\";\n DestroyOptions[DestroyOptions[\"force\"] = 0] = \"force\";\n})(exports.DestroyOptions || (exports.DestroyOptions = {}));\nfunction noop() {}\n/**\n * 判断对象是否是`String`类型\n *\n * @static\n * @function isString\n * @param obj - 要判断的对象\n * @return\n */ function isString(obj) {\n return typeof obj === \"string\";\n}\n/**\n * 判断对象是否是`Array`类型\n *\n * @static\n * @function isArray\n * @param obj - 要判断的对象\n * @return\n */ var isArray = Array.isArray || function(obj) {\n return Object.prototype.toString.call(obj) === \"[object Array]\";\n};\n/**\n * 判断对象是否是函数类型\n *\n * @static\n * @function isFunction\n * @param obj - 要判断的对象\n * @return\n */ function isFunction(obj) {\n return Object.prototype.toString.call(obj) === \"[object Function]\";\n}\n/**\n * 判断对象是否是`Object`类型\n *\n * @static\n * @function isObject\n * @param obj - 要判断的对象\n * @return\n */ function isObject(obj) {\n return Object.prototype.toString.call(obj) === \"[object Object]\";\n}\nfunction isCanvas(canvas) {\n var _canvas_tagName;\n // 小程序 Canvas 无法使用 instanceof HTMLCanvasElement 判断\n return typeof canvas === \"object\" && canvas !== null && ((_canvas_tagName = canvas.tagName) == null ? void 0 : _canvas_tagName.toUpperCase()) === \"CANVAS\";\n}\n/**\n * 生成一个位于 min 和 max 之间的随机数\n * @param min\n * @param max\n * @returns\n */ function randomInRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction throwDestroyedError() {\n throw new Error(\"Destroyed item cannot be used again.\");\n}\nfunction generateGUID() {\n return v4().replace(/-/g, \"\");\n}\nfunction base64ToFile(base64, filename, contentType) {\n if (filename === void 0) filename = \"base64File\";\n if (contentType === void 0) contentType = \"\";\n // 去掉 Base64 字符串的 Data URL 部分(如果存在)\n var base64WithoutPrefix = base64.split(\",\")[1] || base64;\n // 将 base64 编码的字符串转换为二进制字符串\n var byteCharacters = atob(base64WithoutPrefix);\n // 创建一个 8 位无符号整数值的数组,即“字节数组”\n var byteArrays = [];\n // 切割二进制字符串为多个片段,并将每个片段转换成一个字节数组\n for(var offset = 0; offset < byteCharacters.length; offset += 512){\n var slice = byteCharacters.slice(offset, offset + 512);\n var byteNumbers = new Array(slice.length);\n for(var i = 0; i < slice.length; i++){\n byteNumbers[i] = slice.charCodeAt(i);\n }\n var byteArray = new Uint8Array(byteNumbers);\n byteArrays.push(byteArray);\n }\n // 使用字节数组创建 Blob 对象\n var blob = new Blob(byteArrays, {\n type: contentType\n });\n // 创建 File 对象\n var file = new File([\n blob\n ], filename, {\n type: contentType\n });\n return file;\n}\nfunction applyMixins(derivedCtrl, baseCtrls) {\n baseCtrls.forEach(function(baseCtrl) {\n Object.getOwnPropertyNames(baseCtrl.prototype).forEach(function(name) {\n var propertyDescriptor = Object.getOwnPropertyDescriptor(baseCtrl.prototype, name);\n if (!propertyDescriptor) {\n throw new Error(\"Cannot find property descriptor of class \" + baseCtrl);\n }\n Object.defineProperty(derivedCtrl.prototype, name, propertyDescriptor);\n });\n });\n}\n\nvar pluginLoaderMap = {};\nvar defaultPlugins = [];\nvar pluginCtrlMap = {};\n/**\n * 注册 plugin\n * @param name\n * @param pluginClass class of plugin\n * @param itemClass class of item\n * @param isDefault load\n */ function registerPlugin(name, pluginClass, itemClass) {\n if (pluginCtrlMap[name]) {\n logger.error(\"Duplicate registration for plugin \" + name + \".\");\n }\n pluginCtrlMap[name] = itemClass;\n pluginLoaderMap[name] = pluginClass;\n addItem(defaultPlugins, name);\n}\nfunction unregisterPlugin(name) {\n delete pluginCtrlMap[name];\n delete pluginLoaderMap[name];\n removeItem(defaultPlugins, name);\n}\nvar PluginSystem = /*#__PURE__*/ function() {\n function PluginSystem(pluginNames) {\n var loaders = {};\n var loaded = [];\n var addLoader = function(name) {\n var loader = pluginLoaderMap[name];\n if (!loaded.includes(loader)) {\n loaded.push(loader);\n loaders[name] = loader;\n }\n };\n defaultPlugins.forEach(addLoader);\n for(var _iterator = _create_for_of_iterator_helper_loose(pluginNames), _step; !(_step = _iterator()).done;){\n var customPluginName = _step.value;\n if (!pluginLoaderMap[customPluginName]) {\n throw new Error(\"The plugin '\" + customPluginName + \"' not found.\" + getPluginUsageInfo(customPluginName));\n }\n }\n this.plugins = Object.keys(loaders).map(function(name) {\n var pluginConstructor = pluginLoaderMap[name];\n var loader = new pluginConstructor();\n loader.name = name;\n return loader;\n }).sort(function(a, b) {\n return a.order - b.order;\n });\n }\n var _proto = PluginSystem.prototype;\n _proto.initializeComposition = function initializeComposition(composition, scene) {\n this.plugins.forEach(function(loader) {\n return loader.onCompositionConstructed(composition, scene);\n });\n };\n _proto.destroyComposition = function destroyComposition(comp) {\n this.plugins.forEach(function(loader) {\n return loader.onCompositionDestroyed(comp);\n });\n };\n _proto.resetComposition = function resetComposition(comp, renderFrame) {\n this.plugins.forEach(function(loader) {\n return loader.onCompositionReset(comp, renderFrame);\n });\n };\n _proto.processRawJSON = function processRawJSON(json, options) {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n _this.callStatic(\"processRawJSON\", json, options)\n ];\n });\n })();\n };\n _proto.processAssets = function processAssets(json, options) {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n _this.callStatic(\"processAssets\", json, options)\n ];\n });\n })();\n };\n _proto.precompile = function precompile(compositions, renderer) {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.plugins), _step; !(_step = _iterator()).done;){\n var plugin = _step.value;\n plugin.precompile(compositions, renderer);\n }\n };\n _proto.loadResources = function loadResources(scene, options) {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n _this.callStatic(\"prepareResource\", scene, options)\n ];\n });\n })();\n };\n _proto.callStatic = function callStatic(name) {\n for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n args[_key - 1] = arguments[_key];\n }\n var _this = this;\n return _async_to_generator(function() {\n var pendings, plugins, i, plugin, ctrl, _ctrl_name, _ctrl_name1;\n return __generator(this, function(_state) {\n pendings = [];\n plugins = _this.plugins;\n for(i = 0; i < plugins.length; i++){\n plugin = plugins[i];\n ctrl = pluginLoaderMap[plugin.name];\n if (name in ctrl) {\n pendings.push(Promise.resolve((_ctrl_name1 = ctrl[name]) == null ? void 0 : (_ctrl_name = _ctrl_name1).call.apply(_ctrl_name, [].concat([\n ctrl\n ], args))));\n }\n }\n return [\n 2,\n Promise.all(pendings)\n ];\n });\n })();\n };\n return PluginSystem;\n}();\nvar pluginInfoMap = {\n \"alipay-downgrade\": \"@galacean/effects-plugin-alipay-downgrade\",\n \"downgrade\": \"@galacean/effects-plugin-downgrade\",\n \"editor-gizmo\": \"@galacean/effects-plugin-editor-gizmo\",\n \"model\": \"@galacean/effects-plugin-model\",\n \"video\": \"@galacean/effects-plugin-multimedia\",\n \"audio\": \"@galacean/effects-plugin-multimedia\",\n \"orientation-transformer\": \"@galacean/effects-plugin-orientation-transformer\",\n \"rich-text\": \"@galacean/effects-plugin-rich-text\",\n \"spine\": \"@galacean/effects-plugin-spine\"\n};\nfunction getPluginUsageInfo(name) {\n var info = pluginInfoMap[name];\n if (info) {\n return \"\\n请按如下命令进行操作(Please follow the commands below to proceed):\\n1、使用 npm 安装插件(Install Plugin):npm i \" + info + \"@latest --save\\n2、导入插件(Import Plugin):import '\" + info + \"'\";\n } else {\n return \"\";\n }\n}\n\n/**\n * 抽象插件类\n * 注册合成不同生命周期的回调函数\n */ var AbstractPlugin = /*#__PURE__*/ function() {\n function AbstractPlugin() {\n this.order = 100;\n this.name = \"\";\n }\n var _proto = AbstractPlugin.prototype;\n /**\n * 在加载到 JSON 后,就可以进行提前编译\n * @param json\n * @param player\n */ _proto.precompile = function precompile(compositions, renderer) {};\n _proto.onCompositionConstructed = function onCompositionConstructed(composition, scene) {};\n _proto.onCompositionItemLifeBegin = function onCompositionItemLifeBegin(composition, item) {};\n _proto.onCompositionItemLifeEnd = function onCompositionItemLifeEnd(composition, item) {};\n _proto.onCompositionItemRemoved = function onCompositionItemRemoved(composition, item) {};\n _proto.onCompositionReset = function onCompositionReset(composition, frame) {};\n _proto.onCompositionWillReset = function onCompositionWillReset(composition, frame) {};\n _proto.onCompositionDestroyed = function onCompositionDestroyed(composition) {};\n _proto.onCompositionUpdate = function onCompositionUpdate(composition, dt) {};\n _proto.prepareRenderFrame = function prepareRenderFrame(composition, frame) {\n return false;\n };\n _proto.postProcessFrame = function postProcessFrame(composition, frame) {};\n return AbstractPlugin;\n}();\n\nfunction _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _set_prototype_of(o, p);\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _set_prototype_of(subClass, superClass);\n}\n\n/**\n * JSON 版本\n */ var JSONSceneVersion;\n(function(JSONSceneVersion) {\n JSONSceneVersion[\"1_0\"] = \"1.0\";\n JSONSceneVersion[\"1_1\"] = \"1.1\";\n JSONSceneVersion[\"1_2\"] = \"1.2\";\n JSONSceneVersion[\"1_3\"] = \"1.3\";\n JSONSceneVersion[\"1_5\"] = \"1.5\";\n JSONSceneVersion[\"1_8\"] = \"1.8\";\n JSONSceneVersion[\"2_0\"] = \"2.0\";\n JSONSceneVersion[\"2_1\"] = \"2.1\";\n JSONSceneVersion[\"2_2\"] = \"2.2\";\n JSONSceneVersion[\"2_3\"] = \"2.3\";\n JSONSceneVersion[\"2_4\"] = \"2.4\";\n JSONSceneVersion[\"3_0\"] = \"3.0\";\n JSONSceneVersion[\"3_1\"] = \"3.1\";\n JSONSceneVersion[\"3_2\"] = \"3.2\";\n JSONSceneVersion[\"3_3\"] = \"3.3\";\n JSONSceneVersion[\"LATEST\"] = \"3.3\";\n})(JSONSceneVersion || (JSONSceneVersion = {}));\n\n/*********************************************/ /* 元素属性参数类型 */ /*********************************************/ /**\n * 渲染等级\n */ var RenderLevel;\n(function(RenderLevel) {\n RenderLevel[\"S\"] = \"S\";\n RenderLevel[\"APlus\"] = \"A+\";\n RenderLevel[\"A\"] = \"A\";\n RenderLevel[\"BPlus\"] = \"B+\";\n RenderLevel[\"B\"] = \"B\";\n})(RenderLevel || (RenderLevel = {}));\n/**\n * 混合模式\n */ var BlendingMode;\n(function(BlendingMode) {\n /**\n * 普通混合模式\n */ BlendingMode[BlendingMode[\"ALPHA\"] = 0] = \"ALPHA\";\n /**\n * 叠加混合模式\n */ BlendingMode[BlendingMode[\"ADD\"] = 1] = \"ADD\";\n /**\n * 相乘混合模式\n */ BlendingMode[BlendingMode[\"MULTIPLY\"] = 2] = \"MULTIPLY\";\n /**\n * 亮度混合模式\n */ BlendingMode[BlendingMode[\"BRIGHTNESS\"] = 3] = \"BRIGHTNESS\";\n /**\n * 减色混合模式\n */ BlendingMode[BlendingMode[\"SUBTRACTION\"] = 4] = \"SUBTRACTION\";\n /**\n * 强光混合模式\n */ BlendingMode[BlendingMode[\"STRONG_LIGHT\"] = 5] = \"STRONG_LIGHT\";\n /**\n * 弱光混合模式\n */ BlendingMode[BlendingMode[\"WEAK_LIGHT\"] = 6] = \"WEAK_LIGHT\";\n /**\n * 亮度叠加混合模式\n */ BlendingMode[BlendingMode[\"SUPERPOSITION\"] = 7] = \"SUPERPOSITION\";\n})(BlendingMode || (BlendingMode = {}));\n/**\n * 单双面模式\n */ var SideMode;\n(function(SideMode) {\n /**\n * 双面模式\n */ SideMode[SideMode[\"DOUBLE\"] = 1032] = \"DOUBLE\";\n /**\n * 正面模式\n */ SideMode[SideMode[\"FRONT\"] = 1028] = \"FRONT\";\n /**\n * 背面模式\n */ SideMode[SideMode[\"BACK\"] = 1029] = \"BACK\";\n})(SideMode || (SideMode = {}));\n/**\n * 元素是否被蒙版遮挡/反向遮挡\n */ var ObscuredMode;\n(function(ObscuredMode) {\n /**\n * 无\n */ // NONE = 0,\n // /**\n // * 蒙版\n // */\n // MASK = 1,\n /**\n * 被遮挡\n */ ObscuredMode[ObscuredMode[\"OBSCURED\"] = 2] = \"OBSCURED\";\n /**\n * 被反向遮挡\n */ ObscuredMode[ObscuredMode[\"REVERSE_OBSCURED\"] = 3] = \"REVERSE_OBSCURED\";\n})(ObscuredMode || (ObscuredMode = {}));\n/**\n * 发射器形状\n */ var ParticleEmitterShapeType;\n(function(ParticleEmitterShapeType) {\n /**\n * 没有类型\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"NONE\"] = 0] = \"NONE\";\n /**\n * 圆球\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"SPHERE\"] = 1] = \"SPHERE\";\n /**\n * 圆锥\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"CONE\"] = 2] = \"CONE\";\n /**\n * 半球\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"HEMISPHERE\"] = 3] = \"HEMISPHERE\";\n /**\n * 圆\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"CIRCLE\"] = 4] = \"CIRCLE\";\n /**\n * 圆环\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"DONUT\"] = 5] = \"DONUT\";\n /**\n * 矩形\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"RECTANGLE\"] = 6] = \"RECTANGLE\";\n /**\n * 矩形框\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"RECTANGLE_EDGE\"] = 7] = \"RECTANGLE_EDGE\";\n /**\n * 直线\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"EDGE\"] = 8] = \"EDGE\";\n /**\n * 贴图\n */ ParticleEmitterShapeType[ParticleEmitterShapeType[\"TEXTURE\"] = 9] = \"TEXTURE\";\n})(ParticleEmitterShapeType || (ParticleEmitterShapeType = {}));\n/**\n * 插件类型\n */ var PluginType;\n(function(PluginType) {\n /**\n * 陀螺仪\n */ PluginType[PluginType[\"GYROSCOPE\"] = 0] = \"GYROSCOPE\";\n /**\n * Spine\n */ PluginType[PluginType[\"SPINE\"] = 1] = \"SPINE\";\n})(PluginType || (PluginType = {}));\n/**\n * 交互类型\n */ var InteractType;\n(function(InteractType) {\n /**\n * 点击\n */ InteractType[InteractType[\"CLICK\"] = 0] = \"CLICK\";\n /**\n * 消息\n * 前端收到 onMessageItem 回调\n */ InteractType[InteractType[\"MESSAGE\"] = 1] = \"MESSAGE\";\n /**\n * 拖拽\n */ InteractType[InteractType[\"DRAG\"] = 2] = \"DRAG\";\n})(InteractType || (InteractType = {}));\n/**\n * 交互行为\n */ var InteractBehavior;\n(function(InteractBehavior) {\n /**\n * 无\n */ InteractBehavior[InteractBehavior[\"NONE\"] = 0] = \"NONE\";\n /**\n * 通知\n */ InteractBehavior[InteractBehavior[\"NOTIFY\"] = 1] = \"NOTIFY\";\n /**\n * 重置播放器\n */ InteractBehavior[InteractBehavior[\"RESUME_PLAYER\"] = 2] = \"RESUME_PLAYER\";\n /**\n * 清除元素\n */ InteractBehavior[InteractBehavior[\"REMOVE\"] = 3] = \"REMOVE\";\n /**\n * 暂停播放器\n */ InteractBehavior[InteractBehavior[\"PAUSE\"] = 4] = \"PAUSE\";\n})(InteractBehavior || (InteractBehavior = {}));\n/**\n * 元素类型\n */ var ItemType;\n(function(ItemType) {\n /**\n * 错误元素\n */ ItemType[\"base\"] = \"0\";\n /**\n * 图层元素\n */ ItemType[\"sprite\"] = \"1\";\n /**\n * 粒子元素\n */ ItemType[\"particle\"] = \"2\";\n /**\n * 空节点元素\n */ ItemType[\"null\"] = \"3\";\n /**\n * 交互元素\n */ ItemType[\"interact\"] = \"4\";\n /**\n * 插件元素\n */ ItemType[\"plugin\"] = \"5\";\n /**\n * 相机元素\n */ ItemType[\"camera\"] = \"6\";\n /**\n * 预合成元素\n */ ItemType[\"composition\"] = \"7\";\n /**\n * Spine 元素\n */ ItemType[\"spine\"] = \"spine\";\n /**\n * Mesh 元素\n */ ItemType[\"mesh\"] = \"mesh\";\n /**\n * 节点树元素\n */ ItemType[\"tree\"] = \"tree\";\n /**\n * 文本元素\n */ ItemType[\"text\"] = \"text\";\n /**\n * 灯光元素\n */ ItemType[\"light\"] = \"light\";\n /**\n * 天空盒元素\n */ ItemType[\"skybox\"] = \"skybox\";\n /**\n * 特效元素\n */ ItemType[\"effect\"] = \"effect\";\n /**\n * 形状元素\n */ ItemType[\"shape\"] = \"shape\";\n /**\n * 后处理元素\n */ ItemType[\"postProcessVolume\"] = \"postProcessVolume\";\n /**\n * 节点元素\n */ ItemType[\"node\"] = \"node\";\n /**\n * 视频元素\n */ ItemType[\"video\"] = \"video\";\n /**\n * 音频元素\n */ ItemType[\"audio\"] = \"audio\";\n /**\n * 富文本元素\n */ ItemType[\"richtext\"] = \"richtext\";\n})(ItemType || (ItemType = {}));\n/**\n * 渲染模式\n */ var RenderMode;\n(function(RenderMode) {\n /**\n * 广告牌模式\n */ RenderMode[RenderMode[\"BILLBOARD\"] = 0] = \"BILLBOARD\";\n /**\n * 网格模式\n */ RenderMode[RenderMode[\"MESH\"] = 1] = \"MESH\";\n /**\n * 垂直广告牌模式\n */ RenderMode[RenderMode[\"VERTICAL_BILLBOARD\"] = 2] = \"VERTICAL_BILLBOARD\";\n /**\n * 水平广告牌模式\n */ RenderMode[RenderMode[\"HORIZONTAL_BILLBOARD\"] = 3] = \"HORIZONTAL_BILLBOARD\";\n})(RenderMode || (RenderMode = {}));\n/**\n * 变换中心\n */ var ParticleOrigin;\n(function(ParticleOrigin) {\n /**\n * 水平和垂直中点\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_CENTER\"] = 0] = \"PARTICLE_ORIGIN_CENTER\";\n /**\n * 水平左侧 垂直顶部\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_LEFT_TOP\"] = 1] = \"PARTICLE_ORIGIN_LEFT_TOP\";\n /**\n * 水平左侧 垂直中间\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_LEFT_CENTER\"] = 2] = \"PARTICLE_ORIGIN_LEFT_CENTER\";\n /**\n * 水平左侧 垂直底部\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_LEFT_BOTTOM\"] = 3] = \"PARTICLE_ORIGIN_LEFT_BOTTOM\";\n /**\n * 水平中间 垂直顶部\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_CENTER_TOP\"] = 4] = \"PARTICLE_ORIGIN_CENTER_TOP\";\n /**\n * 水平中间 垂直底部\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_CENTER_BOTTOM\"] = 5] = \"PARTICLE_ORIGIN_CENTER_BOTTOM\";\n /**\n * 水平右侧 垂直顶部\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_RIGHT_TOP\"] = 6] = \"PARTICLE_ORIGIN_RIGHT_TOP\";\n /**\n * 水平右侧 垂直中间\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_RIGHT_CENTER\"] = 7] = \"PARTICLE_ORIGIN_RIGHT_CENTER\";\n /**\n * 水平右侧 垂直底部\n */ ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_RIGHT_BOTTOM\"] = 8] = \"PARTICLE_ORIGIN_RIGHT_BOTTOM\";\n})(ParticleOrigin || (ParticleOrigin = {}));\nvar RenderType;\n(function(RenderType) {\n RenderType[\"Opaque\"] = \"Opaque\";\n RenderType[\"Transparent\"] = \"Transparent\";\n})(RenderType || (RenderType = {}));\nvar RenderFace;\n(function(RenderFace) {\n RenderFace[\"Both\"] = \"Both\";\n RenderFace[\"Back\"] = \"Back\";\n RenderFace[\"Front\"] = \"Front\";\n})(RenderFace || (RenderFace = {}));\n\n/**\n * 销毁\n */ var END_BEHAVIOR_DESTROY = 0;\n/**\n * 暂停\n * @deprecated since 2.0 - use `END_BEHAVIOR_FREEZE` instead\n */ var END_BEHAVIOR_PAUSE = 1;\n/**\n * 无限播放\n */ var END_BEHAVIOR_FORWARD = 2;\n/**\n * 销毁并保留最后一帧\n * @deprecated since 2.0\n */ var END_BEHAVIOR_PAUSE_AND_DESTROY = 3;\n/**\n * 冻结\n */ var END_BEHAVIOR_FREEZE = 4;\n/**\n * 重播\n */ var END_BEHAVIOR_RESTART = 5;\n/**\n *\n */ var END_BEHAVIOR_DESTROY_CHILDREN = 6;\nvar CAMERA_CLIP_MODE_VERTICAL = 1;\nvar CAMERA_CLIP_MODE_NORMAL = 0;\n/**\n * 消息开始\n */ var MESSAGE_ITEM_PHRASE_BEGIN = 2;\n/**\n * 消息结束\n */ var MESSAGE_ITEM_PHRASE_END = 1;\n\nvar CameraClipMode;\n(function(CameraClipMode) {\n /**\n * 剪裁上下\n */ CameraClipMode[CameraClipMode[\"portrait\"] = 1] = \"portrait\";\n /**\n * 剪裁左右\n */ CameraClipMode[CameraClipMode[\"landscape\"] = 0] = \"landscape\";\n})(CameraClipMode || (CameraClipMode = {}));\n\n/*********************************************/ /* 基本数值属性参数 */ /*********************************************/ var ValueType;\n(function(ValueType) {\n /**\n * 常数\n */ ValueType[ValueType[\"CONSTANT\"] = 0] = \"CONSTANT\";\n /**\n * 二维常数向量\n */ ValueType[ValueType[\"CONSTANT_VEC2\"] = 1] = \"CONSTANT_VEC2\";\n /**\n * 三维常数向量\n */ ValueType[ValueType[\"CONSTANT_VEC3\"] = 2] = \"CONSTANT_VEC3\";\n /**\n * 四维常数向量\n */ ValueType[ValueType[\"CONSTANT_VEC4\"] = 3] = \"CONSTANT_VEC4\";\n /**\n * 随机数\n */ ValueType[ValueType[\"RANDOM\"] = 4] = \"RANDOM\";\n /**\n * 直线\n */ ValueType[ValueType[\"LINE\"] = 5] = \"LINE\";\n /**\n * 曲线\n */ ValueType[ValueType[\"CURVE\"] = 6] = \"CURVE\";\n /**\n * 贝塞尔路径\n */ ValueType[ValueType[\"BEZIER_PATH\"] = 7] = \"BEZIER_PATH\";\n /**\n * 颜色\n */ ValueType[ValueType[\"RGBA_COLOR\"] = 8] = \"RGBA_COLOR\";\n /**\n * 渐变色\n */ ValueType[ValueType[\"GRADIENT_COLOR\"] = 9] = \"GRADIENT_COLOR\";\n /**\n * 蒙版形状点集\n */ ValueType[ValueType[\"SHAPE_POINTS\"] = 10] = \"SHAPE_POINTS\";\n /**\n * 蒙版形状切分\n */ ValueType[ValueType[\"SHAPE_SPLITS\"] = 11] = \"SHAPE_SPLITS\";\n /**\n * 直线路径\n */ ValueType[ValueType[\"LINEAR_PATH\"] = 12] = \"LINEAR_PATH\";\n /**\n * 多色\n */ ValueType[ValueType[\"COLORS\"] = 13] = \"COLORS\";\n /**\n * 二进制指针\n */ ValueType[ValueType[\"BINARY\"] = 20] = \"BINARY\";\n /**\n * 贝塞尔曲线\n */ ValueType[ValueType[\"BEZIER_CURVE\"] = 21] = \"BEZIER_CURVE\";\n /**\n * 贝塞尔曲线路径\n */ ValueType[ValueType[\"BEZIER_CURVE_PATH\"] = 22] = \"BEZIER_CURVE_PATH\";\n /**\n * 贝塞尔曲线四元数\n */ ValueType[ValueType[\"BEZIER_CURVE_QUAT\"] = 23] = \"BEZIER_CURVE_QUAT\";\n /**\n * 颜色曲线\n */ ValueType[ValueType[\"COLOR_CURVE\"] = 24] = \"COLOR_CURVE\";\n /**\n * Vector4 曲线\n */ ValueType[ValueType[\"VECTOR4_CURVE\"] = 25] = \"VECTOR4_CURVE\";\n /**\n * Vector2 曲线\n */ ValueType[ValueType[\"VECTOR2_CURVE\"] = 26] = \"VECTOR2_CURVE\";\n})(ValueType || (ValueType = {}));\n/**\n * 关键帧类型\n */ var BezierKeyframeType;\n(function(BezierKeyframeType) {\n BezierKeyframeType[BezierKeyframeType[\"AUTO\"] = 0] = \"AUTO\";\n BezierKeyframeType[BezierKeyframeType[\"EASE\"] = 1] = \"EASE\";\n BezierKeyframeType[BezierKeyframeType[\"EASE_IN\"] = 2] = \"EASE_IN\";\n BezierKeyframeType[BezierKeyframeType[\"EASE_OUT\"] = 3] = \"EASE_OUT\";\n BezierKeyframeType[BezierKeyframeType[\"LINE\"] = 4] = \"LINE\";\n BezierKeyframeType[BezierKeyframeType[\"HOLD\"] = 5] = \"HOLD\";\n BezierKeyframeType[BezierKeyframeType[\"LINE_OUT\"] = 6] = \"LINE_OUT\";\n})(BezierKeyframeType || (BezierKeyframeType = {}));\n\n/**\n * 结束行为\n */ var EndBehavior;\n(function(EndBehavior) {\n /**\n * 销毁\n */ EndBehavior[EndBehavior[\"destroy\"] = 0] = \"destroy\";\n /**\n * 重播\n */ EndBehavior[EndBehavior[\"restart\"] = 5] = \"restart\";\n /**\n * 无限播放\n */ EndBehavior[EndBehavior[\"forward\"] = 2] = \"forward\";\n /**\n * 冻结\n */ EndBehavior[EndBehavior[\"freeze\"] = 4] = \"freeze\";\n})(EndBehavior || (EndBehavior = {}));\n\n/**\n * 粒子交互行为\n */ var ParticleInteractionBehavior;\n(function(ParticleInteractionBehavior) {\n /**\n * 无\n */ ParticleInteractionBehavior[ParticleInteractionBehavior[\"none\"] = 0] = \"none\";\n /**\n * 移出粒子\n */ ParticleInteractionBehavior[ParticleInteractionBehavior[\"removeParticle\"] = 1] = \"removeParticle\";\n})(ParticleInteractionBehavior || (ParticleInteractionBehavior = {}));\n\nvar ShapeArcMode;\n(function(ShapeArcMode) {\n /**\n * 随机\n */ ShapeArcMode[ShapeArcMode[\"RANDOM\"] = 0] = \"RANDOM\";\n /**\n * 单向循环\n */ ShapeArcMode[ShapeArcMode[\"UNIDIRECTIONAL_CYCLE\"] = 1] = \"UNIDIRECTIONAL_CYCLE\";\n /**\n * 双向循环\n */ ShapeArcMode[ShapeArcMode[\"BIDIRECTIONAL_CYCLE\"] = 2] = \"BIDIRECTIONAL_CYCLE\";\n /**\n * 均匀爆发\n */ ShapeArcMode[ShapeArcMode[\"UNIFORM_BURST\"] = 3] = \"UNIFORM_BURST\";\n})(ShapeArcMode || (ShapeArcMode = {}));\n\nvar LightType;\n(function(LightType) {\n /**\n * 点光源\n */ LightType[\"point\"] = \"point\";\n /**\n * 聚光灯\n */ LightType[\"spot\"] = \"spot\";\n /**\n * 方向光\n */ LightType[\"directional\"] = \"directional\";\n /**\n * 环境光\n */ LightType[\"ambient\"] = \"ambient\";\n})(LightType || (LightType = {}));\n\nvar ModelBoundingType;\n(function(ModelBoundingType) {\n ModelBoundingType[ModelBoundingType[\"box\"] = 2] = \"box\";\n ModelBoundingType[ModelBoundingType[\"sphere\"] = 3] = \"sphere\";\n})(ModelBoundingType || (ModelBoundingType = {}));\n\nvar CameraType;\n(function(CameraType) {\n CameraType[\"orthographic\"] = \"orthographic\";\n CameraType[\"perspective\"] = \"perspective\";\n})(CameraType || (CameraType = {}));\n\n// 材质类型\nvar MaterialType;\n(function(MaterialType) {\n MaterialType[\"unlit\"] = \"unlit\";\n MaterialType[\"pbr\"] = \"pbr\";\n // 头发材质,在 pbr 材质基础上扩展\n MaterialType[\"hair\"] = \"hair\";\n})(MaterialType || (MaterialType = {}));\n// 混合模式\nvar MaterialBlending;\n(function(MaterialBlending) {\n MaterialBlending[MaterialBlending[\"opaque\"] = 100] = \"opaque\";\n MaterialBlending[MaterialBlending[\"masked\"] = 101] = \"masked\";\n MaterialBlending[MaterialBlending[\"translucent\"] = 102] = \"translucent\";\n MaterialBlending[MaterialBlending[\"additive\"] = 103] = \"additive\";\n})(MaterialBlending || (MaterialBlending = {}));\n\n/**\n * 3D渲染模式:将渲染过程中的中间结果输出,主要用于排查渲染效果问题,支持 pbr 和 unlit 材质\n */ var RenderMode3D;\n(function(RenderMode3D) {\n /**\n * 正常渲染\n */ RenderMode3D[\"none\"] = \"none\";\n /**\n * 纹理坐标\n */ RenderMode3D[\"uv\"] = \"uv\";\n /**\n * 世界坐标法线\n */ RenderMode3D[\"normal\"] = \"normal\";\n /**\n * 基础颜色\n */ RenderMode3D[\"basecolor\"] = \"basecolor\";\n /**\n * 基础颜色 Alpha\n */ RenderMode3D[\"alpha\"] = \"alpha\";\n /**\n * 金属度\n */ RenderMode3D[\"metallic\"] = \"metallic\";\n /**\n * 粗超度\n */ RenderMode3D[\"roughness\"] = \"roughness\";\n /**\n * 环境遮蔽\n */ RenderMode3D[\"ao\"] = \"ao\";\n /**\n * 自发光\n */ RenderMode3D[\"emissive\"] = \"emissive\";\n /**\n * 漫反射\n */ RenderMode3D[\"diffuse\"] = \"diffuse\";\n})(RenderMode3D || (RenderMode3D = {}));\n\nvar TextOverflow;\n(function(TextOverflow) {\n /**\n * display 模式下,会显示所有文本,文本大小会根据边界框调整。\n */ TextOverflow[TextOverflow[\"display\"] = 0] = \"display\";\n /**\n * clip 模式下,当文本内容超出边界框时,多余的会被截断。\n */ TextOverflow[TextOverflow[\"clip\"] = 1] = \"clip\";\n /**\n * ellipsis 模式下,会使用(...)来代替超出边界框的内容。\n */ TextOverflow[TextOverflow[\"ellipsis\"] = 2] = \"ellipsis\";\n})(TextOverflow || (TextOverflow = {}));\nvar TextBaseline;\n(function(TextBaseline) {\n /**\n * 文本顶对齐。\n */ TextBaseline[TextBaseline[\"top\"] = 0] = \"top\";\n /**\n * 文本垂直居中对齐。\n */ TextBaseline[TextBaseline[\"middle\"] = 1] = \"middle\";\n /**\n * 文本底对齐。\n */ TextBaseline[TextBaseline[\"bottom\"] = 2] = \"bottom\";\n})(TextBaseline || (TextBaseline = {}));\nvar TextAlignment;\n(function(TextAlignment) {\n /**\n * text alignment starts from(x,y) to right direction\n * 从 (x,y) 开始第一个字符,向右边延伸\n */ TextAlignment[TextAlignment[\"left\"] = 0] = \"left\";\n /**\n * (x,y) is middle position of text, where (left + right)/2 =(x,y)\n * (x,y) 为文字中间位置,(最左位置 + 最右位置)/2 = (x,y)\n */ TextAlignment[TextAlignment[\"middle\"] = 1] = \"middle\";\n /**\n * text alignment ends with(x,y) from left direction\n * 从 (x,y) 结束最后一个字符,向左边延伸\n */ TextAlignment[TextAlignment[\"right\"] = 2] = \"right\";\n})(TextAlignment || (TextAlignment = {}));\n/**\n * 文本字重\n */ var TextWeight;\n(function(TextWeight) {\n /**\n * 正常\n */ TextWeight[\"normal\"] = \"normal\";\n /**\n * 粗体\n */ TextWeight[\"bold\"] = \"bold\";\n /**\n * 瘦体\n */ TextWeight[\"lighter\"] = \"lighter\";\n})(TextWeight || (TextWeight = {}));\n/**\n * 文本样式\n */ var FontStyle;\n(function(FontStyle) {\n /**\n * 正常\n */ FontStyle[\"normal\"] = \"normal\";\n /**\n * 斜体\n */ FontStyle[\"italic\"] = \"italic\";\n /**\n * 倾斜体\n */ FontStyle[\"oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n\nvar BuiltinObjectGUID = {\n WhiteTexture: \"whitetexture00000000000000000000\",\n TransparentTexture: \"transparenttexture00000000000000000000\",\n PBRShader: \"pbr00000000000000000000000000000\",\n UnlitShader: \"unlit000000000000000000000000000\"\n};\n\n/**\n * 矢量图形类型\n */ var ShapePrimitiveType;\n(function(ShapePrimitiveType) {\n /**\n * 自定义图形\n */ ShapePrimitiveType[ShapePrimitiveType[\"Custom\"] = 0] = \"Custom\";\n /**\n * 矩形\n */ ShapePrimitiveType[ShapePrimitiveType[\"Rectangle\"] = 1] = \"Rectangle\";\n /**\n * 椭圆\n */ ShapePrimitiveType[ShapePrimitiveType[\"Ellipse\"] = 2] = \"Ellipse\";\n /**\n * 多边形\n */ ShapePrimitiveType[ShapePrimitiveType[\"Polygon\"] = 3] = \"Polygon\";\n /**\n * 星形\n */ ShapePrimitiveType[ShapePrimitiveType[\"Star\"] = 4] = \"Star\";\n})(ShapePrimitiveType || (ShapePrimitiveType = {}));\n\nvar LineCap;\n(function(LineCap) {\n /** 默认值。向线条的每个末端添加平直的边缘 */ LineCap[LineCap[\"Butt\"] = 0] = \"Butt\";\n /** 向线条的每个末端添加圆形线帽 */ LineCap[LineCap[\"Round\"] = 1] = \"Round\";\n /** 向线条的每个末端添加正方形线帽 */ LineCap[LineCap[\"Square\"] = 2] = \"Square\";\n})(LineCap || (LineCap = {}));\nvar LineJoin;\n(function(LineJoin) {\n /** 创建圆角 */ LineJoin[LineJoin[\"Round\"] = 0] = \"Round\";\n /** 创建斜角 */ LineJoin[LineJoin[\"Bevel\"] = 1] = \"Bevel\";\n /** 创建尖角 */ LineJoin[LineJoin[\"Miter\"] = 2] = \"Miter\";\n})(LineJoin || (LineJoin = {}));\n\n/**\n * 动态换图类型\n * @since 1.1.0\n */ var BackgroundType;\n(function(BackgroundType) {\n BackgroundType[\"video\"] = \"video\";\n BackgroundType[\"image\"] = \"image\";\n})(BackgroundType || (BackgroundType = {}));\n/**\n * 多媒体资源类型\n * @since 2.1.0\n */ var MultimediaType;\n(function(MultimediaType) {\n MultimediaType[\"video\"] = \"video\";\n MultimediaType[\"audio\"] = \"audio\";\n})(MultimediaType || (MultimediaType = {}));\n\nvar DataType;\n(function(DataType) {\n DataType[\"VFXItemData\"] = \"VFXItemData\";\n // Assets\n DataType[\"Material\"] = \"Material\";\n DataType[\"Shader\"] = \"Shader\";\n DataType[\"Geometry\"] = \"Geometry\";\n DataType[\"Texture\"] = \"Texture\";\n DataType[\"Image\"] = \"Image\";\n DataType[\"AnimationClip\"] = \"AnimationClip\";\n DataType[\"BinaryAsset\"] = \"BinaryAsset\";\n // Timeline\n DataType[\"TrackAsset\"] = \"TrackAsset\";\n DataType[\"TimelineAsset\"] = \"TimelineAsset\";\n DataType[\"ObjectBindingTrack\"] = \"ObjectBindingTrack\";\n DataType[\"TransformTrack\"] = \"TransformTrack\";\n DataType[\"SpriteColorTrack\"] = \"SpriteColorTrack\";\n DataType[\"ActivationTrack\"] = \"ActivationTrack\";\n DataType[\"SubCompositionTrack\"] = \"SubCompositionTrack\";\n DataType[\"FloatPropertyTrack\"] = \"FloatPropertyTrack\";\n DataType[\"ColorPropertyTrack\"] = \"ColorPropertyTrack\";\n DataType[\"Vector2PropertyTrack\"] = \"Vector2PropertyTrack\";\n DataType[\"Vector4PropertyTrack\"] = \"Vector4PropertyTrack\";\n DataType[\"TransformPlayableAsset\"] = \"TransformPlayableAsset\";\n DataType[\"SpriteColorPlayableAsset\"] = \"SpriteColorPlayableAsset\";\n DataType[\"ActivationPlayableAsset\"] = \"ActivationPlayableAsset\";\n DataType[\"SubCompositionPlayableAsset\"] = \"SubCompositionPlayableAsset\";\n DataType[\"FloatPropertyPlayableAsset\"] = \"FloatPropertyPlayableAsset\";\n DataType[\"ColorPropertyPlayableAsset\"] = \"ColorPropertyPlayableAsset\";\n DataType[\"Vector2PropertyPlayableAsset\"] = \"Vector2PropertyPlayableAsset\";\n DataType[\"Vector4PropertyPlayableAsset\"] = \"Vector4PropertyPlayableAsset\";\n // Components\n DataType[\"MeshComponent\"] = \"MeshComponent\";\n DataType[\"SkyboxComponent\"] = \"SkyboxComponent\";\n DataType[\"LightComponent\"] = \"LightComponent\";\n DataType[\"CameraComponent\"] = \"CameraComponent\";\n DataType[\"ModelPluginComponent\"] = \"ModelPluginComponent\";\n DataType[\"TreeComponent\"] = \"TreeComponent\";\n DataType[\"AnimationComponent\"] = \"AnimationComponent\";\n DataType[\"SpineComponent\"] = \"SpineComponent\";\n DataType[\"VideoComponent\"] = \"VideoComponent\";\n DataType[\"AudioComponent\"] = \"AudioComponent\";\n DataType[\"RichTextComponent\"] = \"RichTextComponent\";\n DataType[\"OrientationComponent\"] = \"OrientationComponent\";\n DataType[\"ShapeComponent\"] = \"ShapeComponent\";\n DataType[\"SpriteComponent\"] = \"SpriteComponent\";\n DataType[\"ParticleSystem\"] = \"ParticleSystem\";\n DataType[\"InteractComponent\"] = \"InteractComponent\";\n DataType[\"CameraController\"] = \"CameraController\";\n DataType[\"PostProcessVolume\"] = \"PostProcessVolume\";\n DataType[\"EffectComponent\"] = \"EffectComponent\";\n DataType[\"TextComponent\"] = \"TextComponent\";\n // Non-EffectObject\n DataType[\"TimelineClip\"] = \"TimelineClip\";\n})(DataType || (DataType = {}));\n\nvar GeometryType;\n(function(GeometryType) {\n /**\n * Draw single points.\n */ GeometryType[GeometryType[\"POINTS\"] = 0] = \"POINTS\";\n /**\n * Draw lines. Each vertex connects to the one after it.\n */ GeometryType[GeometryType[\"LINES\"] = 1] = \"LINES\";\n /**\n * Draw lines. Each set of two vertices is treated as a separate line segment.\n */ GeometryType[GeometryType[\"LINE_LOOP\"] = 2] = \"LINE_LOOP\";\n /**\n * Draw a connected group of line segments from the first vertex to the last.\n */ GeometryType[GeometryType[\"LINE_STRIP\"] = 3] = \"LINE_STRIP\";\n /**\n * Draw triangles. Each set of three vertices creates a separate triangle.\n */ GeometryType[GeometryType[\"TRIANGLES\"] = 4] = \"TRIANGLES\";\n /**\n * Draw a connected strip of triangles.\n */ GeometryType[GeometryType[\"TRIANGLE_STRIP\"] = 5] = \"TRIANGLE_STRIP\";\n /**\n * Draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan.\n */ GeometryType[GeometryType[\"TRIANGLE_FAN\"] = 6] = \"TRIANGLE_FAN\";\n})(GeometryType || (GeometryType = {}));\nvar VertexFormatType;\n(function(VertexFormatType) {\n VertexFormatType[VertexFormatType[\"Float16\"] = 0] = \"Float16\";\n VertexFormatType[VertexFormatType[\"Float32\"] = 1] = \"Float32\";\n VertexFormatType[VertexFormatType[\"Int8\"] = 2] = \"Int8\";\n VertexFormatType[VertexFormatType[\"Int16\"] = 3] = \"Int16\";\n VertexFormatType[VertexFormatType[\"Int32\"] = 4] = \"Int32\";\n VertexFormatType[VertexFormatType[\"UInt8\"] = 5] = \"UInt8\";\n VertexFormatType[VertexFormatType[\"UInt16\"] = 6] = \"UInt16\";\n VertexFormatType[VertexFormatType[\"UInt32\"] = 7] = \"UInt32\";\n})(VertexFormatType || (VertexFormatType = {}));\nvar IndexFormatType;\n(function(IndexFormatType) {\n IndexFormatType[IndexFormatType[\"None\"] = -1] = \"None\";\n IndexFormatType[IndexFormatType[\"UInt8\"] = 0] = \"UInt8\";\n IndexFormatType[IndexFormatType[\"UInt16\"] = 1] = \"UInt16\";\n IndexFormatType[IndexFormatType[\"UInt32\"] = 2] = \"UInt32\";\n})(IndexFormatType || (IndexFormatType = {}));\n// BINORMAL[n]\tBinormal\tfloat4\n// BLENDINDICES[n]\t混合索引\tuint\n// BLENDWEIGHT[n]\t混合权重\tFLOAT\n// COLOR[n]\t漫射和反射颜色\tfloat4\n// NORMAL[n]\t法向矢量\tfloat4\n// POSITION[n]\t对象空间中的顶点位置。\tfloat4\n// POSITIONT\t变换的顶点位置。\tfloat4\n// PSIZE[n]\t点大小\tFLOAT\n// TANGENT[n]\t正切\tfloat4\n// TEXCOORD[n]\t纹理坐标\tfloat4\n// POSITION_BS[n]\tBlend Shape 空间中的顶点位置\tfloat4\n// NORMAL_BS[n]\tBlend Shape 空间中的法向矢量\tfloat4\n// TANGENT_BS[n]\tBlend Shape 空间中的正切矢量\tfloat4\nvar VertexBufferSemantic;\n(function(VertexBufferSemantic) {\n VertexBufferSemantic[\"Position\"] = \"POSITION\";\n VertexBufferSemantic[\"Uv\"] = \"TEXCOORD0\";\n VertexBufferSemantic[\"Uv2\"] = \"TEXCOORD1\";\n VertexBufferSemantic[\"Normal\"] = \"NORMAL\";\n VertexBufferSemantic[\"Tangent\"] = \"TANGENT\";\n VertexBufferSemantic[\"Color\"] = \"COLOR\";\n VertexBufferSemantic[\"Joints\"] = \"JOINTS\";\n VertexBufferSemantic[\"Weights\"] = \"WEIGHTS\";\n //\n VertexBufferSemantic[\"PositionBS0\"] = \"POSITION_BS0\";\n VertexBufferSemantic[\"PositionBS1\"] = \"POSITION_BS1\";\n VertexBufferSemantic[\"PositionBS2\"] = \"POSITION_BS2\";\n VertexBufferSemantic[\"PositionBS3\"] = \"POSITION_BS3\";\n VertexBufferSemantic[\"PositionBS4\"] = \"POSITION_BS4\";\n VertexBufferSemantic[\"PositionBS5\"] = \"POSITION_BS5\";\n VertexBufferSemantic[\"PositionBS6\"] = \"POSITION_BS6\";\n VertexBufferSemantic[\"PositionBS7\"] = \"POSITION_BS7\";\n VertexBufferSemantic[\"NormalBS0\"] = \"NORMAL_BS0\";\n VertexBufferSemantic[\"NormalBS1\"] = \"NORMAL_BS1\";\n VertexBufferSemantic[\"NormalBS2\"] = \"NORMAL_BS2\";\n VertexBufferSemantic[\"NormalBS3\"] = \"NORMAL_BS3\";\n VertexBufferSemantic[\"TangentBS0\"] = \"TANGENT_BS0\";\n VertexBufferSemantic[\"TangentBS1\"] = \"TANGENT_BS1\";\n VertexBufferSemantic[\"TangentBS2\"] = \"TANGENT_BS2\";\n VertexBufferSemantic[\"TangentBS3\"] = \"TANGENT_BS3\";\n})(VertexBufferSemantic || (VertexBufferSemantic = {}));\n\nvar LATEST_VERSION = JSONSceneVersion.LATEST;\n\nvar index$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n LATEST_VERSION: LATEST_VERSION,\n get RenderLevel () { return RenderLevel; },\n get BlendingMode () { return BlendingMode; },\n get SideMode () { return SideMode; },\n get ObscuredMode () { return ObscuredMode; },\n get ParticleEmitterShapeType () { return ParticleEmitterShapeType; },\n get PluginType () { return PluginType; },\n get InteractType () { return InteractType; },\n get InteractBehavior () { return InteractBehavior; },\n get ItemType () { return ItemType; },\n get RenderMode () { return RenderMode; },\n get ParticleOrigin () { return ParticleOrigin; },\n get RenderType () { return RenderType; },\n get RenderFace () { return RenderFace; },\n get CameraClipMode () { return CameraClipMode; },\n END_BEHAVIOR_DESTROY: END_BEHAVIOR_DESTROY,\n END_BEHAVIOR_PAUSE: END_BEHAVIOR_PAUSE,\n END_BEHAVIOR_FORWARD: END_BEHAVIOR_FORWARD,\n END_BEHAVIOR_PAUSE_AND_DESTROY: END_BEHAVIOR_PAUSE_AND_DESTROY,\n END_BEHAVIOR_FREEZE: END_BEHAVIOR_FREEZE,\n END_BEHAVIOR_RESTART: END_BEHAVIOR_RESTART,\n END_BEHAVIOR_DESTROY_CHILDREN: END_BEHAVIOR_DESTROY_CHILDREN,\n CAMERA_CLIP_MODE_VERTICAL: CAMERA_CLIP_MODE_VERTICAL,\n CAMERA_CLIP_MODE_NORMAL: CAMERA_CLIP_MODE_NORMAL,\n MESSAGE_ITEM_PHRASE_BEGIN: MESSAGE_ITEM_PHRASE_BEGIN,\n MESSAGE_ITEM_PHRASE_END: MESSAGE_ITEM_PHRASE_END,\n get ValueType () { return ValueType; },\n get BezierKeyframeType () { return BezierKeyframeType; },\n get JSONSceneVersion () { return JSONSceneVersion; },\n get EndBehavior () { return EndBehavior; },\n get ParticleInteractionBehavior () { return ParticleInteractionBehavior; },\n get ShapeArcMode () { return ShapeArcMode; },\n get LightType () { return LightType; },\n get ModelBoundingType () { return ModelBoundingType; },\n get CameraType () { return CameraType; },\n get MaterialType () { return MaterialType; },\n get MaterialBlending () { return MaterialBlending; },\n get RenderMode3D () { return RenderMode3D; },\n get TextOverflow () { return TextOverflow; },\n get TextBaseline () { return TextBaseline; },\n get TextAlignment () { return TextAlignment; },\n get TextWeight () { return TextWeight; },\n get FontStyle () { return FontStyle; },\n BuiltinObjectGUID: BuiltinObjectGUID,\n get ShapePrimitiveType () { return ShapePrimitiveType; },\n get LineCap () { return LineCap; },\n get LineJoin () { return LineJoin; },\n get BackgroundType () { return BackgroundType; },\n get MultimediaType () { return MultimediaType; },\n get DataType () { return DataType; },\n get GeometryType () { return GeometryType; },\n get VertexFormatType () { return VertexFormatType; },\n get IndexFormatType () { return IndexFormatType; },\n get VertexBufferSemantic () { return VertexBufferSemantic; }\n});\n\nfunction _defineProperties(target, props) {\n for(var i = 0; i < props.length; i++){\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nvar decoratorInitialStore = new Map();\nvar mergedStore = new Map();\nvar effectsClassStore = {};\nfunction effectsClass(className) {\n return function(target, context) {\n if (effectsClassStore[className]) {\n console.warn(\"Class \" + className + \" is already registered.\");\n }\n // TODO: three修改json dataType, 这边重复注册直接 return\n effectsClassStore[className] = target;\n };\n}\nfunction serialize(type, sourceName) {\n return generateSerializableMember(type, sourceName); // value member\n}\nfunction getMergedStore(target) {\n var classKey = target.constructor;\n if (mergedStore.get(classKey)) {\n return mergedStore.get(classKey);\n }\n var store = {};\n mergedStore.set(classKey, store);\n var currentTarget = target;\n var currentKey = classKey;\n while(currentKey){\n var initialStore = decoratorInitialStore.get(currentKey);\n for(var property in initialStore){\n store[property] = initialStore[property];\n }\n var parent = Object.getPrototypeOf(currentTarget);\n currentKey = Object.getPrototypeOf(parent).constructor;\n if (currentKey === Object) {\n break;\n }\n currentTarget = parent;\n }\n return store;\n}\nfunction generateSerializableMember(type, sourceName) {\n return function(target, propertyKey) {\n var classStore = getDirectStore(target);\n if (!classStore) {\n return;\n }\n if (!classStore[propertyKey]) {\n classStore[propertyKey] = {\n type: type,\n sourceName: sourceName\n };\n }\n };\n}\nfunction getDirectStore(target) {\n var classKey = target.constructor;\n if (!decoratorInitialStore.get(classKey)) {\n decoratorInitialStore.set(classKey, {});\n }\n return decoratorInitialStore.get(classKey);\n}\n\n/**\n * @since 2.0.0\n */ var EffectsObject = /*#__PURE__*/ function() {\n function EffectsObject(engine) {\n this.engine = engine;\n this.guid = generateGUID();\n this.defination = {};\n this.engine.addInstance(this);\n }\n var _proto = EffectsObject.prototype;\n /**\n *\n * @returns\n */ _proto.getInstanceId = function getInstanceId() {\n return this.guid;\n };\n /**\n *\n * @param guid\n */ _proto.setInstanceId = function setInstanceId(guid) {\n this.engine.removeInstance(this.guid);\n this.guid = guid;\n this.engine.addInstance(this);\n };\n /**\n *\n */ _proto.toData = function toData() {};\n /**\n * 反序列化函数\n *\n * @param data - 对象的序列化的数据\n */ _proto.fromData = function fromData(data) {};\n /**\n *\n */ _proto.dispose = function dispose() {};\n /**\n *\n * @param obj\n * @returns\n */ EffectsObject.is = function is(obj) {\n return _instanceof1(obj, EffectsObject) && \"guid\" in obj;\n };\n return EffectsObject;\n}();\n\n/**\n * @since 2.0.0\n */ var Component = /*#__PURE__*/ function(EffectsObject) {\n _inherits(Component, EffectsObject);\n function Component() {\n var _this;\n _this = EffectsObject.apply(this, arguments) || this;\n _this.isAwakeCalled = false;\n _this.isStartCalled = false;\n _this.isEnableCalled = false;\n _this._enabled = true;\n return _this;\n }\n var _proto = Component.prototype;\n /**\n * 生命周期函数,初始化后调用,生命周期内只调用一次\n */ _proto.onAwake = function onAwake() {\n // OVERRIDE\n };\n /**\n * 在 enabled 变为 true 时触发\n */ _proto.onEnable = function onEnable() {\n // OVERRIDE\n };\n /**\n * 在 enabled 变为 false 时触发\n */ _proto.onDisable = function onDisable() {\n // OVERRIDE\n };\n /**\n * 生命周期函数,在第一次 update 前调用,生命周期内只调用一次\n */ _proto.onStart = function onStart() {\n // OVERRIDE\n };\n /**\n * 生命周期函数,每帧调用一次\n */ _proto.onUpdate = function onUpdate(dt) {\n // OVERRIDE\n };\n /**\n * 生命周期函数,每帧调用一次,在 update 之后调用\n */ _proto.onLateUpdate = function onLateUpdate(dt) {\n // OVERRIDE\n };\n /**\n * 生命周期函数,在组件销毁时调用\n */ _proto.onDestroy = function onDestroy() {\n // OVERRIDE\n };\n /**\n * @internal\n */ _proto.enable = function enable() {\n if (this.item.composition) {\n this.item.composition.sceneTicking.addComponent(this);\n this.isEnableCalled = true;\n }\n this.onEnable();\n };\n /**\n * @internal\n */ _proto.disable = function disable() {\n this.onDisable();\n if (this.item.composition) {\n this.isEnableCalled = false;\n this.item.composition.sceneTicking.removeComponent(this);\n }\n };\n _proto.setVFXItem = function setVFXItem(item) {\n this.item = item;\n if (item.isDuringPlay) {\n if (!this.isAwakeCalled) {\n this.onAwake();\n this.isAwakeCalled = true;\n }\n if (item.isActive && this.enabled) {\n this.start();\n this.enable();\n }\n }\n };\n _proto.fromData = function fromData(data) {\n EffectsObject.prototype.fromData.call(this, data);\n };\n _proto.dispose = function dispose() {\n if (this.isEnableCalled) {\n this.disable();\n }\n if (this.isAwakeCalled) {\n this.isAwakeCalled = false;\n this.onDestroy();\n }\n if (this.item) {\n removeItem(this.item.components, this);\n }\n };\n _proto.start = function start() {\n if (this.isStartCalled) {\n return;\n }\n this.isStartCalled = true;\n this.onStart();\n };\n _create_class(Component, [\n {\n key: \"transform\",\n get: /**\n * 附加到的 VFXItem 对象 Transform 组件\n */ function get() {\n return this.item.transform;\n }\n },\n {\n key: \"isActiveAndEnabled\",\n get: /**\n * 组件是否可以更新,true 更新,false 不更新\n */ function get() {\n return this.item.isActive && this.enabled;\n }\n },\n {\n key: \"enabled\",\n get: function get() {\n return this._enabled;\n },\n set: function set(value) {\n if (this.enabled !== value) {\n this._enabled = value;\n if (value) {\n if (this.isActiveAndEnabled) {\n this.enable();\n if (!this.isStartCalled) {\n this.onStart();\n this.isStartCalled = true;\n }\n }\n } else {\n if (this.isEnableCalled) {\n this.disable();\n }\n }\n }\n }\n }\n ]);\n return Component;\n}(EffectsObject);\n__decorate([\n serialize()\n], Component.prototype, \"item\", void 0);\n__decorate([\n serialize()\n], Component.prototype, \"_enabled\", void 0);\n/**\n * @since 2.0.0\n * @deprecated 2.4.0 Please use Component instead\n */ var Behaviour = /*#__PURE__*/ function(Component) {\n _inherits(Behaviour, Component);\n function Behaviour() {\n return Component.apply(this, arguments);\n }\n var _proto = Behaviour.prototype;\n _proto.setVFXItem = function setVFXItem(item) {\n Component.prototype.setVFXItem.call(this, item);\n };\n _proto.dispose = function dispose() {\n Component.prototype.dispose.call(this);\n };\n return Behaviour;\n}(Component);\n\n/**\n * 所有渲染组件的基类\n * @since 2.0.0\n */ var RendererComponent = /*#__PURE__*/ function(Component) {\n _inherits(RendererComponent, Component);\n function RendererComponent() {\n var _this;\n _this = Component.apply(this, arguments) || this;\n _this.materials = [];\n _this._priority = 0;\n return _this;\n }\n var _proto = RendererComponent.prototype;\n _proto.render = function render(renderer) {};\n _proto.onEnable = function onEnable() {\n var _this_item_composition;\n (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.renderFrame.addMeshToDefaultRenderPass(this);\n };\n _proto.onDisable = function onDisable() {\n var _this_item_composition;\n (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.renderFrame.removeMeshFromDefaultRenderPass(this);\n };\n _create_class(RendererComponent, [\n {\n key: \"priority\",\n get: function get() {\n return this._priority;\n },\n set: function set(value) {\n this._priority = value;\n }\n },\n {\n key: \"material\",\n get: function get() {\n return this.materials[0];\n },\n set: function set(material) {\n if (this.materials.length === 0) {\n this.materials.push(material);\n } else {\n this.materials[0] = material;\n }\n }\n }\n ]);\n return RendererComponent;\n}(Component);\n__decorate([\n serialize()\n], RendererComponent.prototype, \"materials\", void 0);\n__decorate([\n serialize()\n], RendererComponent.prototype, \"_priority\", void 0);\n\nvar PI2 = Math.PI * 2;\nvar DEG2RAD = Math.PI / 180;\nvar RAD2DEG = 180 / Math.PI;\nvar NumberEpsilon = 1e-6;\nfunction isZero(v) {\n return isNaN(v) || Math.abs(v) < NumberEpsilon;\n}\nfunction isEqual(a, b) {\n return Math.abs(a - b) < NumberEpsilon || a === Infinity && b === Infinity || a === -Infinity && b === -Infinity;\n}\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nvar damp = function(x, y, lambda, dt) {\n return lerp(x, y, 1 - Math.exp(-lambda * dt));\n};\n// https://en.wikipedia.org/wiki/Linear_interpolation\nvar lerp = function(x, y, t) {\n return (1 - t) * x + t * y;\n};\nvar degToRad = function(degrees) {\n return degrees * DEG2RAD;\n};\nvar radToDeg = function(radians) {\n return radians * RAD2DEG;\n};\nfunction clamp$1(value, min, max) {\n var fixedMin = isNaN(min) ? -Infinity : min;\n var fixedMax = isNaN(max) ? Infinity : max;\n var lower = Math.min(fixedMin, fixedMax);\n var upper = Math.max(fixedMin, fixedMax);\n return Math.min(Math.max(value, lower), upper);\n}\n\n/**\n * 二维向量\n */ var Vector2 = /*#__PURE__*/ function() {\n function Vector2(x, y) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n this.x = x;\n this.y = y;\n }\n var _proto = Vector2.prototype;\n /**\n * 设置向量\n * @param x - x 轴分量\n * @param y - y 轴分量\n * @returns\n */ _proto.set = function set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n };\n /**\n * 设置零向量\n * @returns 向量\n */ _proto.setZero = function setZero() {\n this.x = 0;\n this.y = 0;\n return this;\n };\n /**\n * 通过标量数值创建向量\n * @param num - 数值\n * @returns 向量\n */ _proto.setFromNumber = function setFromNumber(num) {\n this.x = num;\n this.y = num;\n return this;\n };\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n var _array_offset;\n this.x = (_array_offset = array[offset]) != null ? _array_offset : 0;\n var _array_;\n this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0;\n return this;\n };\n /**\n * 拷贝向量\n * @param src - 要拷贝的对象\n * @returns 向量\n */ _proto.copyFrom = function copyFrom(src) {\n this.x = src.x;\n this.y = src.y;\n return this;\n };\n /**\n * 克隆向量\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Vector2(this.x, this.y);\n };\n /**\n * 根据下标设置元素值\n * @param index - 下标值\n * @param value - 数字\n * @returns 向量\n */ _proto.setElement = function setElement(index, value) {\n switch(index){\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return this;\n };\n /**\n * 根据下标获取值\n * @param index - 下标\n * @returns 值\n */ _proto.getElement = function getElement(index) {\n switch(index){\n case 0:\n return this.x;\n case 1:\n return this.y;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return 0;\n };\n /**\n * 向量相加\n * @param right - 向量 | 数字\n * @returns 向量\n */ _proto.add = function add(right) {\n if (typeof right === \"number\") {\n this.x += right;\n this.y += right;\n } else if (_instanceof1(right, Array)) {\n this.x += right[0];\n this.y += right[1];\n } else {\n this.x += right.x;\n this.y += right.y;\n }\n return this;\n };\n /**\n * 向量相加\n * @param left - 向量\n * @param right - 向量\n * @returns 相加结果\n */ _proto.addVectors = function addVectors(left, right) {\n this.x = left.x + right.x;\n this.y = left.y + right.y;\n return this;\n };\n /**\n * 向量相减\n * @param right - 向量 | 数字\n * @returns 相减结果\n */ _proto.subtract = function subtract(right) {\n if (typeof right === \"number\") {\n this.x -= right;\n this.y -= right;\n } else if (_instanceof1(right, Array)) {\n this.x -= right[0];\n this.y -= right[1];\n } else {\n this.x -= right.x;\n this.y -= right.y;\n }\n return this;\n };\n /**\n * 向量相减\n * @param left - 向量\n * @param right - 向量\n * @returns 相减结果\n */ _proto.subtractVectors = function subtractVectors(left, right) {\n this.x = left.x - right.x;\n this.y = left.y - right.y;\n return this;\n };\n /**\n * 向量相乘\n * @param right - 向量 | 数字\n * @returns 相乘结果\n */ _proto.multiply = function multiply(right) {\n if (typeof right === \"number\") {\n this.x *= right;\n this.y *= right;\n } else if (_instanceof1(right, Array)) {\n this.x *= right[0];\n this.y *= right[1];\n } else {\n this.x *= right.x;\n this.y *= right.y;\n }\n return this;\n };\n /**\n * 向量相乘\n * @param left - 向量\n * @param right - 向量\n * @returns 相乘结果\n */ _proto.multiplyVectors = function multiplyVectors(left, right) {\n this.x = left.x * right.x;\n this.y = left.y * right.y;\n return this;\n };\n /**\n * 向量相除\n * @param right - 向量 | 数字\n * @returns 相除结果\n */ _proto.divide = function divide(right) {\n if (typeof right === \"number\") {\n this.x /= right;\n this.y /= right;\n } else if (_instanceof1(right, Array)) {\n this.x /= right[0];\n this.y /= right[1];\n } else {\n this.x /= right.x;\n this.y /= right.y;\n }\n return this;\n };\n /**\n * 向量缩放\n * @param v - 数字\n * @returns 缩放结果\n */ _proto.scale = function scale(v) {\n this.x *= v;\n this.y *= v;\n return this;\n };\n /**\n * 分量求和\n * @returns 求和结果\n */ _proto.sum = function sum() {\n return this.x + this.y;\n };\n /**\n * 向量求最小值\n * @param v - 向量\n * @returns 最小值\n */ _proto.min = function min(v) {\n if (typeof v === \"number\") {\n this.x = Math.min(this.x, v);\n this.y = Math.min(this.y, v);\n } else {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n }\n return this;\n };\n /**\n * 向量求最大值\n * @param v - 向量\n * @returns 最大值\n */ _proto.max = function max(v) {\n if (typeof v === \"number\") {\n this.x = Math.max(this.x, v);\n this.y = Math.max(this.y, v);\n } else {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n }\n return this;\n };\n /**\n * 向量阈值约束\n * @param min - 极小值\n * @param max - 极大值\n * @returns 向量\n */ _proto.clamp = function clamp(min, max) {\n return this.max(min).min(max);\n };\n /**\n * 向量向下取整\n * @returns 取整结果\n */ _proto.floor = function floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n return this;\n };\n /**\n * 向量向上取整\n * @returns 取整结果\n */ _proto.ceil = function ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n return this;\n };\n /**\n * 向量取四舍五入\n * @returns 四舍五入结果\n */ _proto.round = function round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n };\n /**\n * 向量取绝对值\n * @returns 向量\n */ _proto.abs = function abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n return this;\n };\n /**\n * 向量取反\n * @returns 取反结果\n */ _proto.negate = function negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n };\n /**\n * 向量长度\n * @returns 求值结果\n */ _proto.length = function length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n };\n /**\n * 向量长度平方\n * @returns 求值结果\n */ _proto.lengthSquared = function lengthSquared() {\n return this.x * this.x + this.y * this.y;\n };\n /**\n * 向量归一化\n * @returns 归一化结果\n */ _proto.normalize = function normalize() {\n return this.divide(this.length() || 1);\n };\n /**\n * 设置向量长度\n * @param length - 长度\n * @returns 向量\n */ _proto.setLength = function setLength(length) {\n return this.normalize().multiply(length);\n };\n /**\n * 向量线性插值\n * @param other - 向量\n * @param alpha - 插值比\n * @returns 计算结果\n */ _proto.lerp = function lerp(other, alpha) {\n this.x += (other.x - this.x) * alpha;\n this.y += (other.y - this.y) * alpha;\n return this;\n };\n /**\n * 向量线性插值\n * @param v1 - 向量\n * @param v2 - 向量\n * @param alpha - 插值比\n * @returns 计算结果\n */ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n return this;\n };\n /**\n * 向量点乘\n * @param v - 向量\n * @returns 点乘结果\n */ _proto.dot = function dot(v) {\n return this.x * v.x + this.y * v.y;\n };\n /**\n * 向量叉乘\n * @param v - 向量\n * @returns 叉乘结果\n */ _proto.cross = function cross(v) {\n return this.x * v.y - this.y * v.x;\n };\n /**\n * 点距离\n * @param v - 点\n * @returns 距离\n */ _proto.distance = function distance(v) {\n var dx = this.x - v.x;\n var dy = this.y - v.y;\n return Math.sqrt(dx * dx + dy * dy);\n };\n /**\n * 点距离平方\n * @param v - 点\n * @returns 距离平方\n */ _proto.distanceSquared = function distanceSquared(v) {\n var dx = this.x - v.x;\n var dy = this.y - v.y;\n return dx * dx + dy * dy;\n };\n /**\n * 向量判等\n * @param v - 向量\n * @returns 判等结果\n */ _proto.equals = function equals(v) {\n return this.x === v.x && this.y === v.y;\n };\n /**\n * 是否零向量\n * @returns 是否零向量\n */ _proto.isZero = function isZero() {\n var eps = NumberEpsilon;\n var _this = this, x = _this.x, y = _this.y;\n return Math.abs(x) <= eps && Math.abs(y) <= eps;\n };\n /**\n * 向量转数组\n * @returns 数组\n */ _proto.toArray = function toArray() {\n return [\n this.x,\n this.y\n ];\n };\n _proto.fill = function fill(array, offset) {\n if (offset === void 0) offset = 0;\n array[offset] = this.x;\n array[offset + 1] = this.y;\n };\n /**\n * 随机生成向量\n * @returns 向量\n */ _proto.random = function random() {\n this.x = Math.random();\n this.y = Math.random();\n return this;\n };\n /**\n * 通过标量创建向量\n * @param num - 数值\n * @returns 向量\n */ Vector2.fromNumber = function fromNumber(num) {\n return new Vector2().setFromNumber(num);\n };\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */ Vector2.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Vector2().setFromArray(array, offset);\n };\n return Vector2;\n}();\n/**\n * 二维向量的常量\n */ Vector2.ONE = new Vector2(1.0, 1.0);\nVector2.ZERO = new Vector2(0.0, 0.0);\n\n/**\n * 三维向量\n */ var Vector3 = /*#__PURE__*/ function() {\n function Vector3(x, y, z) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n this.x = x;\n this.y = y;\n this.z = z;\n }\n var _proto = Vector3.prototype;\n /**\n * 设置向量\n * @param x - x 轴分量\n * @param y - y 轴分量\n * @param z - z 轴分量\n * @returns 向量\n */ _proto.set = function set(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n };\n /**\n * 设置零向量\n * @returns 向量\n */ _proto.setZero = function setZero() {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n return this;\n };\n /**\n * 通过标量数值设置向量\n * @param num - 数值\n * @returns 向量\n */ _proto.setFromNumber = function setFromNumber(num) {\n this.x = num;\n this.y = num;\n this.z = num;\n return this;\n };\n /**\n * 通过数组设置向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n var _array_offset;\n this.x = (_array_offset = array[offset]) != null ? _array_offset : 0;\n var _array_;\n this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0;\n var _array_1;\n this.z = (_array_1 = array[offset + 2]) != null ? _array_1 : 0;\n return this;\n };\n /**\n * 拷贝向量\n * @param v - 要拷贝的对象\n * @returns 向量\n */ _proto.copyFrom = function copyFrom(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n };\n /**\n * 克隆向量\n * @returns 向量\n */ _proto.clone = function clone() {\n return new Vector3(this.x, this.y, this.z);\n };\n /**\n * 根据下标设置向量分量\n * @param index - 下标值\n * @param value - 数字\n * @returns 向量\n */ _proto.setElement = function setElement(index, value) {\n switch(index){\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return this;\n };\n /**\n * 根据下标获取向量分量\n * @param index - 下标\n * @returns\n */ _proto.getElement = function getElement(index) {\n switch(index){\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return 0;\n };\n /**\n * 向量相加\n * @param right - 向量 | 数字\n * @returns 相加结果\n */ _proto.add = function add(right) {\n if (typeof right === \"number\") {\n this.x += right;\n this.y += right;\n this.z += right;\n } else if (_instanceof1(right, Array)) {\n this.x += right[0];\n this.y += right[1];\n this.z += right[2];\n } else {\n this.x += right.x;\n this.y += right.y;\n this.z += right.z;\n }\n return this;\n };\n /**\n * 向量相加\n * @param left - 向量\n * @param right - 向量\n * @returns 相加结果\n */ _proto.addVectors = function addVectors(left, right) {\n this.x = left.x + right.x;\n this.y = left.y + right.y;\n this.z = left.z + right.z;\n return this;\n };\n /**\n * 向量乘比例后相加\n * @param right - 向量\n * @param s - 比例\n * @returns 相加结果\n */ _proto.addScaledVector = function addScaledVector(right, s) {\n this.x += right.x * s;\n this.y += right.y * s;\n this.z += right.z * s;\n return this;\n };\n /**\n * 向量相减\n * @param right - 向量 | 数字\n * @returns 相减\n */ _proto.subtract = function subtract(right) {\n if (typeof right === \"number\") {\n this.x -= right;\n this.y -= right;\n this.z -= right;\n } else if (_instanceof1(right, Array)) {\n this.x -= right[0];\n this.y -= right[1];\n this.z -= right[2];\n } else {\n this.x -= right.x;\n this.y -= right.y;\n this.z -= right.z;\n }\n return this;\n };\n /**\n * 向量相减\n * @param left - 向量\n * @param right - 向量\n * @returns 相减结果\n */ _proto.subtractVectors = function subtractVectors(left, right) {\n this.x = left.x - right.x;\n this.y = left.y - right.y;\n this.z = left.z - right.z;\n return this;\n };\n /**\n * 向量相乘\n * @param right - 向量 | 数字\n * @returns 相乘结果\n */ _proto.multiply = function multiply(right) {\n if (typeof right === \"number\") {\n this.x *= right;\n this.y *= right;\n this.z *= right;\n } else if (_instanceof1(right, Array)) {\n this.x *= right[0];\n this.y *= right[1];\n this.z *= right[2];\n } else {\n this.x *= right.x;\n this.y *= right.y;\n this.z *= right.z;\n }\n return this;\n };\n /**\n * 向量相乘\n * @param left - 向量\n * @param right - 向量\n * @returns 相乘结果\n */ _proto.multiplyVectors = function multiplyVectors(left, right) {\n this.x = left.x * right.x;\n this.y = left.y * right.y;\n this.z = left.z * right.z;\n return this;\n };\n /**\n * 向量相除\n * @param right - 向量 | 数字\n * @returns 相除结果\n */ _proto.divide = function divide(right) {\n if (typeof right === \"number\") {\n this.x /= right;\n this.y /= right;\n this.z /= right;\n } else if (_instanceof1(right, Array)) {\n this.x /= right[0];\n this.y /= right[1];\n this.z /= right[2];\n } else {\n this.x /= right.x;\n this.y /= right.y;\n this.z /= right.z;\n }\n return this;\n };\n /**\n * 向量缩放\n * @param v - 数字\n * @returns 缩放结果\n */ _proto.scale = function scale(v) {\n this.x *= v;\n this.y *= v;\n this.z *= v;\n return this;\n };\n /**\n * 分量求和\n * @returns 求和结果\n */ _proto.sum = function sum() {\n return this.x + this.y + this.z;\n };\n /**\n * 向量求最小值\n * @param v - 向量或数值\n * @returns 求值结果\n */ _proto.min = function min(v) {\n if (typeof v === \"number\") {\n this.x = Math.min(this.x, v);\n this.y = Math.min(this.y, v);\n this.z = Math.min(this.z, v);\n } else {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n }\n return this;\n };\n /**\n * 向量求最大值\n * @param v - 向量或数值\n * @returns 求值结果\n */ _proto.max = function max(v) {\n if (typeof v === \"number\") {\n this.x = Math.max(this.x, v);\n this.y = Math.max(this.y, v);\n this.z = Math.max(this.z, v);\n } else {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n }\n return this;\n };\n /**\n * 向量阈值约束\n * @param min - 向量\n * @param max - 向量\n * @returns 求值结果\n */ _proto.clamp = function clamp(min, max) {\n return this.max(min).min(max);\n };\n /**\n * 向量向下取整\n * @returns 取整结果\n */ _proto.floor = function floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n return this;\n };\n /**\n * 向量向上取整\n * @returns 取整结果\n */ _proto.ceil = function ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n return this;\n };\n /**\n * 向量四舍五入\n * @returns 计算结果\n */ _proto.round = function round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n return this;\n };\n /**\n * 向量取绝对值\n * @returns 向量\n */ _proto.abs = function abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n this.z = Math.abs(this.z);\n return this;\n };\n /**\n * 向量取反\n * @returns 向量\n */ _proto.negate = function negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n };\n /**\n * 向量长度\n * @returns 长度\n */ _proto.length = function length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n };\n /**\n * 向量长度平方\n * @returns 长度平方\n */ _proto.lengthSquared = function lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n };\n /**\n * 向量归一化\n * @returns 向量\n */ _proto.normalize = function normalize() {\n return this.divide(this.length() || 1);\n };\n /**\n * 设置向量长度\n * @param length - 长度\n * @returns 向量\n */ _proto.setLength = function setLength(length) {\n return this.normalize().multiply(length);\n };\n /**\n * 向量间求线性插值\n * @param other - 向量\n * @param alpha - 插值比例\n * @returns 插值结果\n */ _proto.lerp = function lerp(other, alpha) {\n this.x += (other.x - this.x) * alpha;\n this.y += (other.y - this.y) * alpha;\n this.z += (other.z - this.z) * alpha;\n return this;\n };\n /**\n * 向量间求线性插值\n * @param v1 - 第一个向量\n * @param v2 - 第二个向量\n * @param alpha - 插值比例\n * @returns 求值结果\n */ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n };\n /**\n * 向量求点积,点积为零表示两向量垂直\n * @param v - 向量\n * @returns 点积结果\n */ _proto.dot = function dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n };\n /**\n * 向量求叉积\n * @param right - 向量\n * @returns 叉积结果\n */ _proto.cross = function cross(right) {\n return this.crossVectors(this, right);\n };\n /**\n * 向量(a 与 b)求叉积\n * @param left - 向量\n * @param right - 向量\n * @returns 叉积结果\n */ _proto.crossVectors = function crossVectors(left, right) {\n var ax = left.x, ay = left.y, az = left.z;\n var bx = right.x, by = right.y, bz = right.z;\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n return this;\n };\n /**\n * 向量反射\n * @param normal - 法线\n * @returns 反射结果\n */ _proto.reflect = function reflect(normal) {\n // reflect incident vector off plane orthogonal to normal\n // normal is assumed to have unit length\n return this.subtract(normal.clone().multiply(2 * this.dot(normal)));\n };\n /**\n * 计算向量距离\n * @param v - 向量\n * @returns 距离\n */ _proto.distance = function distance(v) {\n return Math.sqrt(this.distanceSquared(v));\n };\n /**\n * 计算向量距离平方\n * @param v - 向量\n * @returns 距离平方\n */ _proto.distanceSquared = function distanceSquared(v) {\n var dx = this.x - v.x;\n var dy = this.y - v.y;\n var dz = this.z - v.z;\n return dx * dx + dy * dy + dz * dz;\n };\n /**\n * 向量判等\n * @param v - 向量\n * @returns 判等结果\n */ _proto.equals = function equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z;\n };\n /**\n * 是否零向量\n * @returns 是否零向量\n */ _proto.isZero = function isZero() {\n var eps = NumberEpsilon;\n var _this = this, x = _this.x, y = _this.y, z = _this.z;\n return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps;\n };\n /**\n * 向量转数组\n * @param array - 目标保存对象\n * @returns 数组\n */ _proto.toArray = function toArray() {\n return [\n this.x,\n this.y,\n this.z\n ];\n };\n _proto.toVector2 = function toVector2() {\n return new Vector2(this.x, this.y);\n };\n _proto.fill = function fill(array, offset) {\n if (offset === void 0) offset = 0;\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n };\n /**\n * 获取随机向量\n * @returns\n */ _proto.random = function random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n return this;\n };\n /**\n * 用欧拉角旋转向量\n * @param euler - 欧拉角\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 旋转结果\n */ _proto.applyEuler = function applyEuler(euler, out) {\n return euler.rotateVector3(this, out);\n };\n /**\n * 用四元数旋转向量\n * @param q - 四元数\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 旋转结果\n */ _proto.applyQuaternion = function applyQuaternion(q, out) {\n return q.rotateVector3(this, out);\n };\n /**\n * 用矩阵变换点\n * @param m - 变换矩阵\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 结果点\n */ _proto.applyMatrix = function applyMatrix(m, out) {\n return m.transformPoint(this, out);\n };\n /**\n * 用法向量矩阵变换法向量\n * @param m - 法向量矩阵\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 向量\n */ _proto.applyNormalMatrix = function applyNormalMatrix(m, out) {\n return m.transformNormal(this, out);\n };\n /**\n * 用投影矩阵变换点\n * @param m - 投影矩阵\n * @param [out] - 输出结果,如果没有就覆盖当前向量值\n * @returns 结果点\n */ _proto.applyProjectionMatrix = function applyProjectionMatrix(m, out) {\n return m.projectPoint(this, out);\n };\n /**\n * 通过标量数值创建向量\n * @param num - 数值\n * @returns 向量\n */ Vector3.fromNumber = function fromNumber(num) {\n return new Vector3().setFromNumber(num);\n };\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */ Vector3.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Vector3().setFromArray(array, offset);\n };\n return Vector3;\n}();\n/**\n * 三维向量的常量\n */ Vector3.X = new Vector3(1.0, 0.0, 0.0);\nVector3.Y = new Vector3(0.0, 1.0, 0.0);\nVector3.Z = new Vector3(0.0, 0.0, 1.0);\nVector3.ONE = new Vector3(1.0, 1.0, 1.0);\nVector3.ZERO = new Vector3(0.0, 0.0, 0.0);\n\n/**\n * 四维向量\n */ var Vector4$1 = /*#__PURE__*/ function() {\n function Vector4(x, y, z, w) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n if (w === void 0) w = 0;\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n var _proto = Vector4.prototype;\n /**\n * 设置向量\n * @param x - x 轴分量\n * @param y - y 轴分量\n * @param z - z 轴分量\n * @param w - w 轴分量\n * @returns\n */ _proto.set = function set(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n };\n /**\n * 设置零向量\n * @returns 向量\n */ _proto.setZero = function setZero() {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 0;\n return this;\n };\n /**\n * 通过标量数值设置向量\n * @param num - 数值\n * @returns 向量\n */ _proto.setFromNumber = function setFromNumber(num) {\n this.x = num;\n this.y = num;\n this.z = num;\n this.w = num;\n return this;\n };\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n var _array_offset;\n this.x = (_array_offset = array[offset]) != null ? _array_offset : 0;\n var _array_;\n this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0;\n var _array_1;\n this.z = (_array_1 = array[offset + 2]) != null ? _array_1 : 0;\n var _array_2;\n this.w = (_array_2 = array[offset + 3]) != null ? _array_2 : 0;\n return this;\n };\n /**\n * 拷贝向量\n * @param v - 复制对象\n * @returns 拷贝结果\n */ _proto.copyFrom = function copyFrom(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n this.w = v.w;\n return this;\n };\n /**\n * 克隆向量\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Vector4(this.x, this.y, this.z, this.w);\n };\n /**\n * 根据下标设置向量分量\n * @param index - 下标值\n * @param value - 分量值\n * @returns 向量\n */ _proto.setElement = function setElement(index, value) {\n switch(index){\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n case 3:\n this.w = value;\n break;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return this;\n };\n /**\n * 根据下标获取向量分量\n * @param index - 下标\n * @returns 分量值\n */ _proto.getElement = function getElement(index) {\n switch(index){\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n case 3:\n return this.w;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return 0;\n };\n /**\n * 向量相加\n * @param right - 相加对象,向量 | 数字\n * @returns 相加结果\n */ _proto.add = function add(right) {\n if (typeof right === \"number\") {\n this.x += right;\n this.y += right;\n this.z += right;\n this.w += right;\n } else if (_instanceof1(right, Array)) {\n this.x += right[0];\n this.y += right[1];\n this.z += right[2];\n this.w += right[3];\n } else {\n this.x += right.x;\n this.y += right.y;\n this.z += right.z;\n this.w += right.w;\n }\n return this;\n };\n /**\n * 向量相加\n * @param left - 向量\n * @param right - 向量\n * @returns 求和结果\n */ _proto.addVectors = function addVectors(left, right) {\n this.x = left.x + right.x;\n this.y = left.y + right.y;\n this.z = left.z + right.z;\n this.w = left.w + right.w;\n return this;\n };\n /**\n * 向量比例缩放后相加\n * @param right - 向量\n * @param s - 比例\n * @returns 求和结果\n */ _proto.addScaledVector = function addScaledVector(right, s) {\n this.x += right.x * s;\n this.y += right.y * s;\n this.z += right.z * s;\n this.w += right.w * s;\n return this;\n };\n /**\n * 向量相减\n * @param right - 相减对象,向量 | 数字\n * @returns 相减结果\n */ _proto.subtract = function subtract(right) {\n if (typeof right === \"number\") {\n this.x -= right;\n this.y -= right;\n this.z -= right;\n this.w -= right;\n } else if (_instanceof1(right, Array)) {\n this.x -= right[0];\n this.y -= right[1];\n this.z -= right[2];\n this.w -= right[3];\n } else {\n this.x -= right.x;\n this.y -= right.y;\n this.z -= right.z;\n this.w -= right.w;\n }\n return this;\n };\n /**\n * 向量相减\n * @param left - 向量\n * @param right - 向量\n * @returns 向量\n */ _proto.subtractVectors = function subtractVectors(left, right) {\n this.x = left.x - right.x;\n this.y = left.y - right.y;\n this.z = left.z - right.z;\n this.w = left.w - right.w;\n return this;\n };\n /**\n * 向量相乘\n * @param right - 相乘对象,对象 | 数字\n * @returns 向量\n */ _proto.multiply = function multiply(right) {\n if (typeof right === \"number\") {\n this.x *= right;\n this.y *= right;\n this.z *= right;\n this.w *= right;\n } else if (_instanceof1(right, Array)) {\n this.x *= right[0];\n this.y *= right[1];\n this.z *= right[2];\n this.w *= right[3];\n } else {\n this.x *= right.x;\n this.y *= right.y;\n this.z *= right.z;\n this.w *= right.w;\n }\n return this;\n };\n /**\n * 向量相乘\n * @param left - 向量\n * @param right - 向量\n * @returns 向量\n */ _proto.multiplyVectors = function multiplyVectors(left, right) {\n this.x = left.x * right.x;\n this.y = left.y * right.y;\n this.z = left.z * right.z;\n this.w = left.w * right.w;\n return this;\n };\n /**\n * 向量相除\n * @param right - 相除对象,对象 | 数字\n * @returns 向量\n */ _proto.divide = function divide(right) {\n if (typeof right === \"number\") {\n this.x /= right;\n this.y /= right;\n this.z /= right;\n this.w /= right;\n } else if (_instanceof1(right, Array)) {\n this.x /= right[0];\n this.y /= right[1];\n this.z /= right[2];\n this.w /= right[3];\n } else {\n this.x /= right.x;\n this.y /= right.y;\n this.z /= right.z;\n this.w /= right.w;\n }\n return this;\n };\n /**\n * 向量缩放\n * @param v - 数字\n * @returns 缩放结果\n */ _proto.scale = function scale(v) {\n this.x *= v;\n this.y *= v;\n this.z *= v;\n this.w *= v;\n return this;\n };\n /**\n * 分量求和\n * @returns 求和结果\n */ _proto.sum = function sum() {\n return this.x + this.y + this.z + this.w;\n };\n /**\n * 向量求最小值\n * @param v - 向量或数值\n * @returns 最小值\n */ _proto.min = function min(v) {\n if (typeof v === \"number\") {\n this.x = Math.min(this.x, v);\n this.y = Math.min(this.y, v);\n this.z = Math.min(this.z, v);\n this.w = Math.min(this.w, v);\n } else {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n this.w = Math.min(this.w, v.w);\n }\n return this;\n };\n /**\n * 向量求最大值\n * @param v - 向量或数值\n * @returns 最大值\n */ _proto.max = function max(v) {\n if (typeof v === \"number\") {\n this.x = Math.max(this.x, v);\n this.y = Math.max(this.y, v);\n this.z = Math.max(this.z, v);\n this.w = Math.max(this.w, v);\n } else {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n this.w = Math.max(this.w, v.w);\n }\n return this;\n };\n /**\n * 向量阈值约束\n * @param min - 最小值\n * @param max - 最大值\n * @returns 向量\n */ _proto.clamp = function clamp(min, max) {\n return this.max(min).min(max);\n };\n /**\n * 向量向下取整\n * @returns 取整结果\n */ _proto.floor = function floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n this.w = Math.floor(this.w);\n return this;\n };\n /**\n * 向量向上取整\n * @returns 取整结果\n */ _proto.ceil = function ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n this.w = Math.ceil(this.w);\n return this;\n };\n /**\n * 向量四舍五入\n * @returns 求值结果\n */ _proto.round = function round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n this.w = Math.round(this.w);\n return this;\n };\n /**\n * 向量取绝对值\n * @returns 向量\n */ _proto.abs = function abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n this.z = Math.abs(this.z);\n this.w = Math.abs(this.w);\n return this;\n };\n /**\n * 向量取反\n * @returns 取反结果\n */ _proto.negate = function negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n this.w = -this.w;\n return this;\n };\n /**\n * 向量长度平方\n * @returns 长度平方\n */ _proto.lengthSquared = function lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n };\n /**\n * 向量长度\n * @returns 长度\n */ _proto.length = function length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n };\n /**\n * 向量归一化\n * @returns 归一化结果\n */ _proto.normalize = function normalize() {\n return this.divide(this.length() || 1);\n };\n /**\n * 设置向量长度\n * @param length - 长度\n * @returns 向量\n */ _proto.setLength = function setLength(length) {\n return this.normalize().multiply(length);\n };\n /**\n * 向量求线性插值\n * @param v - 向量\n * @param alpha - 插值比例\n * @returns 插值结果\n */ _proto.lerp = function lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n this.w += (v.w - this.w) * alpha;\n return this;\n };\n /**\n * 两向量求线性插值\n * @param v1 - 第一个向量\n * @param v2 - 第二个向量\n * @param alpha - 插值比例\n * @returns 插值结果\n */ _proto.lerpVectors = function lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n this.w = v1.w + (v2.w - v1.w) * alpha;\n return this;\n };\n /**\n * 向量求点积\n * @param v - 向量\n * @returns 点积结果\n */ _proto.dot = function dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n };\n /**\n * 向量判等\n * @param v - 向量\n * @returns 判等结果\n */ _proto.equals = function equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;\n };\n /**\n * 是否零向量\n * @returns 是否零向量\n */ _proto.isZero = function isZero() {\n var eps = NumberEpsilon;\n var _this = this, x = _this.x, y = _this.y, z = _this.z, w = _this.w;\n return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps && Math.abs(w) <= eps;\n };\n /**\n * 向量转数组\n * @returns 数组\n */ _proto.toArray = function toArray() {\n return [\n this.x,\n this.y,\n this.z,\n this.w\n ];\n };\n _proto.toVector3 = function toVector3() {\n return new Vector3(this.x, this.y, this.z);\n };\n _proto.fill = function fill(array, offset) {\n if (offset === void 0) offset = 0;\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n array[offset + 3] = this.w;\n };\n /**\n * 生成随机向量\n * @returns 向量\n */ _proto.random = function random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n this.w = Math.random();\n return this;\n };\n /**\n * 变换矩阵作用于向量\n * @param m - 变换矩阵\n * @param [out] - 输出结果,如果没有设置就直接覆盖当前值\n * @returns 向量\n */ _proto.applyMatrix = function applyMatrix(m, out) {\n return m.transformVector4(this, out);\n };\n /**\n * 通过标量数值创建向量\n * @param num - 数值\n * @returns 向量\n */ Vector4.fromNumber = function fromNumber(num) {\n return new Vector4().setFromNumber(num);\n };\n /**\n * 通过数组创建向量\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 向量\n */ Vector4.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Vector4().setFromArray(array, offset);\n };\n return Vector4;\n}();\n/**\n * 四维向量的常量\n */ Vector4$1.ONE = new Vector4$1(1.0, 1.0, 1.0, 1.0);\nVector4$1.ZERO = new Vector4$1(0.0, 0.0, 0.0, 0.0);\n\n/**\n * Mesh 组件\n */ var MeshComponent = /*#__PURE__*/ function(RendererComponent) {\n _inherits(MeshComponent, RendererComponent);\n function MeshComponent() {\n var _this;\n _this = RendererComponent.apply(this, arguments) || this;\n /**\n * 用于点击测试的碰撞器\n */ _this.meshCollider = new MeshCollider();\n // TODO 点击测试后续抽象一个 Collider 组件\n _this.getHitTestParams = function(force) {\n var worldMatrix = _this.transform.getWorldMatrix();\n _this.meshCollider.setGeometry(_this.geometry, worldMatrix);\n var area = _this.meshCollider.getBoundingBoxData();\n if (area) {\n return {\n type: area.type,\n triangles: area.area\n };\n }\n };\n return _this;\n }\n var _proto = MeshComponent.prototype;\n _proto.render = function render(renderer) {\n if (renderer.renderingData.currentFrame.globalUniforms) {\n renderer.setGlobalMatrix(\"effects_ObjectToWorld\", this.transform.getWorldMatrix());\n }\n for(var i = 0; i < this.materials.length; i++){\n renderer.drawGeometry(this.geometry, this.materials[i], i);\n }\n };\n _proto.getBoundingBox = function getBoundingBox() {\n var worldMatrix = this.transform.getWorldMatrix();\n this.meshCollider.setGeometry(this.geometry, worldMatrix);\n var boundingBox = this.meshCollider.getBoundingBox();\n return boundingBox;\n };\n return MeshComponent;\n}(RendererComponent);\n__decorate([\n serialize()\n], MeshComponent.prototype, \"geometry\", void 0);\n\nexports.EffectComponent = /*#__PURE__*/ function(MeshComponent) {\n _inherits(EffectComponent, MeshComponent);\n function EffectComponent(engine) {\n var _this;\n _this = MeshComponent.call(this, engine) || this;\n _this.name = \"EffectComponent\";\n return _this;\n }\n var _proto = EffectComponent.prototype;\n _proto.onStart = function onStart() {\n this.item.getHitTestParams = this.getHitTestParams;\n };\n _proto.onUpdate = function onUpdate(dt) {\n var time = this.item.time;\n var _this_material_getVector4;\n var _Time = (_this_material_getVector4 = this.material.getVector4(\"_Time\")) != null ? _this_material_getVector4 : new Vector4$1();\n this.material.setVector4(\"_Time\", _Time.set(time / 20, time, time * 2, time * 3));\n };\n _proto.fromData = function fromData(data) {\n MeshComponent.prototype.fromData.call(this, data);\n this.material = this.materials[0];\n };\n return EffectComponent;\n}(MeshComponent);\nexports.EffectComponent = __decorate([\n effectsClass(DataType.EffectComponent)\n], exports.EffectComponent);\n\nexports.PostProcessVolume = /*#__PURE__*/ function(Component) {\n _inherits(PostProcessVolume, Component);\n function PostProcessVolume(engine) {\n var _this;\n _this = Component.call(this, engine) || this;\n _this.bloom = {\n threshold: 0,\n intensity: 0,\n active: false\n };\n _this.vignette = {\n intensity: 0,\n smoothness: 0,\n roundness: 0,\n active: false\n };\n _this.tonemapping = {\n active: false\n };\n _this.colorAdjustments = {\n brightness: 0,\n saturation: 0,\n contrast: 0,\n active: false\n };\n return _this;\n }\n var _proto = PostProcessVolume.prototype;\n _proto.onStart = function onStart() {\n var composition = this.item.composition;\n if (composition) {\n composition.renderFrame.globalVolume = this;\n }\n };\n return PostProcessVolume;\n}(Component);\n__decorate([\n serialize()\n], exports.PostProcessVolume.prototype, \"bloom\", void 0);\n__decorate([\n serialize()\n], exports.PostProcessVolume.prototype, \"vignette\", void 0);\n__decorate([\n serialize()\n], exports.PostProcessVolume.prototype, \"tonemapping\", void 0);\n__decorate([\n serialize()\n], exports.PostProcessVolume.prototype, \"colorAdjustments\", void 0);\nexports.PostProcessVolume = __decorate([\n effectsClass(DataType.PostProcessVolume)\n], exports.PostProcessVolume);\n\nvar Color = /*#__PURE__*/ function() {\n function Color(r, g, b, a) {\n if (r === void 0) r = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n if (a === void 0) a = 0;\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n }\n var _proto = Color.prototype;\n /**\n * 设置颜色\n * @param r - r 分量\n * @param g - g 分量\n * @param b - b 分量\n * @param a - a 分量\n * @returns\n */ _proto.set = function set(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n return this;\n };\n /**\n * 设置零颜色\n * @returns\n */ _proto.setZero = function setZero() {\n this.r = 0;\n this.g = 0;\n this.b = 0;\n this.a = 0;\n return this;\n };\n /**\n * 通过标量数值设置颜色\n * @param num - 数值\n * @returns\n */ _proto.setFromNumber = function setFromNumber(num) {\n this.r = num;\n this.g = num;\n this.b = num;\n this.a = num;\n return this;\n };\n /**\n * 通过Vector4创建颜色\n * @param v - Vector4\n * @returns\n */ _proto.setFromVector4 = function setFromVector4(v) {\n this.r = v.x;\n this.g = v.y;\n this.b = v.z;\n this.a = v.w;\n return this;\n };\n /**\n * 通过数组创建颜色\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n var _array_offset;\n this.r = (_array_offset = array[offset]) != null ? _array_offset : 0;\n var _array_;\n this.g = (_array_ = array[offset + 1]) != null ? _array_ : 0;\n var _array_1;\n this.b = (_array_1 = array[offset + 2]) != null ? _array_1 : 0;\n var _array_2;\n this.a = (_array_2 = array[offset + 3]) != null ? _array_2 : 0;\n return this;\n };\n _proto.setFromHSV = function setFromHSV(hue, saturation, value, alpha) {\n if (alpha === void 0) alpha = 1;\n var chroma = value * saturation;\n var h = hue / 60;\n var x = chroma * (1 - Math.abs(h % 2 - 1));\n var r = 0;\n var g = 0;\n var b = 0;\n if (h >= 0 && h <= 1) {\n r = chroma;\n g = x;\n } else if (h >= 1 && h <= 2) {\n r = x;\n g = chroma;\n } else if (h >= 2 && h <= 3) {\n g = chroma;\n b = x;\n } else if (h >= 3 && h <= 4) {\n g = x;\n b = chroma;\n } else if (h >= 4 && h <= 5) {\n r = x;\n b = chroma;\n } else if (h >= 5 && h <= 6) {\n r = chroma;\n b = x;\n }\n var m = value - chroma;\n return this.set(r + m, g + m, b + m, alpha);\n };\n _proto.setFromHexString = function setFromHexString(hex) {\n if (hex.substring(0, 1) !== \"#\" || hex.length !== 9 && hex.length !== 7) {\n return this;\n }\n var r = parseInt(hex.substring(1, 3), 16) / 255.0;\n var g = parseInt(hex.substring(3, 5), 16) / 255.0;\n var b = parseInt(hex.substring(5, 7), 16) / 255.0;\n var a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) / 255.0 : 1.0;\n return this.set(r, g, b, a);\n };\n /**\n * 拷贝颜色\n * @param v - 复制对象\n * @returns 拷贝结果\n */ _proto.copyFrom = function copyFrom(v) {\n this.r = v.r;\n this.g = v.g;\n this.b = v.b;\n this.a = v.a;\n return this;\n };\n /**\n * 克隆颜色\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Color(this.r, this.g, this.b, this.a);\n };\n /**\n * 根据下标设置颜色分量\n * @param index - 下标值\n * @param value - 分量值\n * @returns\n */ _proto.setElement = function setElement(index, value) {\n switch(index){\n case 0:\n this.r = value;\n break;\n case 1:\n this.g = value;\n break;\n case 2:\n this.b = value;\n break;\n case 3:\n this.a = value;\n break;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return this;\n };\n /**\n * 根据下标获取颜色分量\n * @param index - 下标\n * @returns 分量值\n */ _proto.getElement = function getElement(index) {\n switch(index){\n case 0:\n return this.r;\n case 1:\n return this.g;\n case 2:\n return this.b;\n case 3:\n return this.a;\n default:\n console.error(\"index is out of range: \" + index);\n }\n return 0;\n };\n /**\n * 颜色相加\n * @param right - 相加对象,颜色 | 数字\n * @returns 相加结果\n */ _proto.add = function add(right) {\n if (typeof right === \"number\") {\n this.r += right;\n this.g += right;\n this.b += right;\n this.a += right;\n } else if (_instanceof1(right, Array)) {\n this.r += right[0];\n this.g += right[1];\n this.b += right[2];\n this.a += right[3];\n } else {\n this.r += right.r;\n this.g += right.g;\n this.b += right.b;\n this.a += right.a;\n }\n return this;\n };\n /**\n * 颜色相减\n * @param right - 相减对象,颜色 | 数字\n * @returns 相减结果\n */ _proto.subtract = function subtract(right) {\n if (typeof right === \"number\") {\n this.r -= right;\n this.g -= right;\n this.b -= right;\n this.a -= right;\n } else if (_instanceof1(right, Array)) {\n this.r -= right[0];\n this.g -= right[1];\n this.b -= right[2];\n this.a -= right[3];\n } else {\n this.r -= right.r;\n this.g -= right.g;\n this.b -= right.b;\n this.a -= right.a;\n }\n return this;\n };\n /**\n * 颜色相乘\n * @param right - 相乘对象,对象 | 数字\n * @returns 颜色\n */ _proto.multiply = function multiply(right) {\n if (typeof right === \"number\") {\n this.r *= right;\n this.g *= right;\n this.b *= right;\n this.a *= right;\n } else if (_instanceof1(right, Array)) {\n this.r *= right[0];\n this.g *= right[1];\n this.b *= right[2];\n this.a *= right[3];\n } else {\n this.r *= right.r;\n this.g *= right.g;\n this.b *= right.b;\n this.a *= right.a;\n }\n return this;\n };\n /**\n * 颜色相除\n * @param right - 相除对象,对象 | 数字\n * @returns 颜色\n */ _proto.divide = function divide(right) {\n if (typeof right === \"number\") {\n this.r /= right;\n this.g /= right;\n this.b /= right;\n this.a /= right;\n } else if (_instanceof1(right, Array)) {\n this.r /= right[0];\n this.g /= right[1];\n this.b /= right[2];\n this.a /= right[3];\n } else {\n this.r /= right.r;\n this.g /= right.g;\n this.b /= right.b;\n this.a /= right.a;\n }\n return this;\n };\n /**\n * 颜色缩放\n * @param v - 数字\n * @returns 缩放结果\n */ _proto.scale = function scale(v) {\n this.r *= v;\n this.g *= v;\n this.b *= v;\n this.a *= v;\n return this;\n };\n /**\n * 颜色求最小值\n * @param v - 颜色或数值\n * @returns 最小值\n */ _proto.min = function min(v) {\n if (typeof v === \"number\") {\n this.r = Math.min(this.r, v);\n this.g = Math.min(this.g, v);\n this.b = Math.min(this.b, v);\n this.a = Math.min(this.a, v);\n } else {\n this.r = Math.min(this.r, v.r);\n this.g = Math.min(this.g, v.g);\n this.b = Math.min(this.b, v.b);\n this.a = Math.min(this.a, v.a);\n }\n return this;\n };\n /**\n * 颜色求最大值\n * @param v - 颜色或数值\n * @returns 最大值\n */ _proto.max = function max(v) {\n if (typeof v === \"number\") {\n this.r = Math.max(this.r, v);\n this.g = Math.max(this.g, v);\n this.b = Math.max(this.b, v);\n this.a = Math.max(this.a, v);\n } else {\n this.r = Math.max(this.r, v.r);\n this.g = Math.max(this.g, v.g);\n this.b = Math.max(this.b, v.b);\n this.a = Math.max(this.a, v.a);\n }\n return this;\n };\n /**\n * 颜色阈值约束\n * @param min - 最小值\n * @param max - 最大值\n * @returns 颜色\n */ _proto.clamp = function clamp(min, max) {\n return this.max(min).min(max);\n };\n /**\n * 颜色求线性插值\n * @param v - 颜色\n * @param alpha - 插值比例\n * @returns 插值结果\n */ _proto.lerp = function lerp(v, alpha) {\n this.r += (v.r - this.r) * alpha;\n this.g += (v.g - this.g) * alpha;\n this.b += (v.b - this.b) * alpha;\n this.a += (v.a - this.a) * alpha;\n return this;\n };\n /**\n * 计算颜色亮度值\n * @returns 亮度值\n */ _proto.luminance = function luminance() {\n return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;\n };\n /**\n * 颜色判等\n * @param v - 颜色\n * @returns 判等结果\n */ _proto.equals = function equals(v) {\n return v.r === this.r && v.g === this.g && v.b === this.b && v.a === this.a;\n };\n _proto.toLinear = function toLinear() {\n this.r = Color.gammaToLinear(this.r);\n this.g = Color.gammaToLinear(this.g);\n this.b = Color.gammaToLinear(this.b);\n return this;\n };\n _proto.toGamma = function toGamma() {\n this.r = Color.linearToGamma(this.r);\n this.g = Color.linearToGamma(this.g);\n this.b = Color.linearToGamma(this.b);\n return this;\n };\n /**\n * 颜色转数组\n * @returns 数组\n */ _proto.toArray = function toArray() {\n return [\n this.r,\n this.g,\n this.b,\n this.a\n ];\n };\n _proto.toVector4 = function toVector4() {\n return new Vector4$1(this.r, this.g, this.b, this.a);\n };\n /**\n * RGB 颜色空间转 HSV\n * @param result HSV 值\n */ _proto.toHSV = function toHSV() {\n var _this = this, r = _this.r, g = _this.g, b = _this.b, a = _this.a;\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var v = max;\n var dm = max - min;\n var h = 0;\n var s = 0;\n if (max !== 0) {\n s = dm / max;\n }\n if (max != min) {\n if (max == r) {\n h = (g - b) / dm;\n if (g < b) {\n h += 6;\n }\n } else if (max == g) {\n h = (b - r) / dm + 2;\n } else if (max == b) {\n h = (r - g) / dm + 4;\n }\n h *= 60;\n }\n return new Color(h, s, v, a);\n };\n _proto.toHexString = function toHexString(includeAlpha) {\n if (includeAlpha === void 0) includeAlpha = true;\n var R = Color.ToHex(Math.round(this.r * 255));\n var G = Color.ToHex(Math.round(this.g * 255));\n var B = Color.ToHex(Math.round(this.b * 255));\n var A = Color.ToHex(Math.round(this.a * 255));\n if (includeAlpha) {\n return \"#\" + R + G + B + A;\n } else {\n return \"#\" + R + G + B;\n }\n };\n _proto.fill = function fill(array, offset) {\n if (offset === void 0) offset = 0;\n array[offset] = this.r;\n array[offset + 1] = this.g;\n array[offset + 2] = this.b;\n array[offset + 3] = this.a;\n };\n /**\n * 通过标量数值创建颜色\n * @param num - 数值\n * @returns\n */ Color.fromNumber = function fromNumber(num) {\n return new Color().setFromNumber(num);\n };\n /**\n * 通过数组创建颜色\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns\n */ Color.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Color().setFromArray(array, offset);\n };\n /**\n * 通过 hex 字符串创建颜色\n * @param hex - hex 字符串\n * @returns\n */ Color.fromHexString = function fromHexString(hex) {\n return new Color().setFromHexString(hex);\n };\n Color.fromHSV = function fromHSV(hue, saturation, value, alpha) {\n if (alpha === void 0) alpha = 1;\n return new Color().setFromHSV(hue, saturation, value, alpha);\n };\n /**\n * 颜色值从 Gamma 空间转到线性空间\n * @param v - Gamma 空间颜色值\n * @returns 线性空间颜色值\n */ Color.gammaToLinear = function gammaToLinear(v) {\n if (v <= 0.0) {\n return 0.0;\n } else if (v <= 0.04045) {\n return v / 12.92;\n } else if (v < 1.0) {\n return Math.pow((v + 0.055) / 1.055, 2.4);\n } else {\n return Math.pow(v, 2.4);\n }\n };\n /**\n * 颜色值从线性空间转到 Gamma 空间\n * @param value - 线性空间颜色值\n * @returns Gamma 空间颜色值\n */ Color.linearToGamma = function linearToGamma(value) {\n if (value <= 0.0) {\n return 0.0;\n } else if (value < 0.0031308) {\n return 12.92 * value;\n } else if (value < 1.0) {\n return 1.055 * Math.pow(value, 0.41666) - 0.055;\n } else {\n return Math.pow(value, 0.41666);\n }\n };\n Color.ToHex = function ToHex(i) {\n var str = i.toString(16);\n if (i <= 15) {\n return (\"0\" + str).toUpperCase();\n }\n return str.toUpperCase();\n };\n return Color;\n}();\n/**\n * 颜色的常量\n */ Color.BLACK = new Color(0, 0, 0, 1) // 纯黑色\n;\nColor.BLUE = new Color(0, 0, 1, 1) // 纯蓝色\n;\nColor.CLEAR = new Color(0, 0, 0, 0) // 完全透明\n;\nColor.CYAN = new Color(0, 1, 1, 1) // 青色\n;\nColor.GRAY = new Color(0.5, 0.5, 0.5, 1) // 灰色\n;\nColor.GREEN = new Color(0, 1, 0, 1) // 纯绿色\n;\nColor.MAGENTA = new Color(1, 0, 1, 1) // 洋红色\n;\nColor.RED = new Color(1, 0, 0, 1) // 纯红色\n;\nColor.WHITE = new Color(1, 1, 1, 1) // 纯白色\n;\nColor.YELLOW = new Color(1, 0.92, 0.016, 1) // 黄色\n;\n\n/**\n * 四元数\n */ var Quaternion = /*#__PURE__*/ function() {\n function Quaternion(x, y, z, w) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n if (w === void 0) w = 1;\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n var _proto = Quaternion.prototype;\n /**\n * 四元数设置\n * @param x - x 分量\n * @param y - y 分量\n * @param z - z 分量\n * @param w - w 分量\n * @returns 四元数\n */ _proto.set = function set(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n };\n /**\n * 通过欧拉角设置四元数\n * @param euler - 欧拉角\n * @returns\n */ _proto.setFromEuler = function setFromEuler(euler) {\n euler.toQuaternion(this);\n return this;\n };\n /**\n * 通过旋转轴和旋转角度设置四元数\n * @param axis - 旋转轴\n * @param angle - 旋转角度(弧度)\n * @returns\n */ _proto.setFromAxisAngle = function setFromAxisAngle(axis, angle) {\n var halfAngle = angle / 2;\n var s = Math.sin(halfAngle);\n var v = Quaternion.tempVec0;\n v.copyFrom(axis).normalize();\n this.x = v.x * s;\n this.y = v.y * s;\n this.z = v.z * s;\n this.w = Math.cos(halfAngle);\n return this;\n };\n /**\n * 通过 Vector4Like 创建四元数\n * @param v - Vector4Like\n * @returns\n */ _proto.setFromVector4 = function setFromVector4(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n this.w = v.w;\n return this;\n };\n /**\n * 通过数组设置四元数\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n this.w = array[offset + 3];\n return this;\n };\n /**\n * 通过矩阵设置四元数\n * @param m - 矩阵\n * @returns\n */ _proto.setFromRotationMatrix = function setFromRotationMatrix(m) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n var te = m.elements;\n var m11 = te[0];\n var m12 = te[4];\n var m13 = te[8];\n var m21 = te[1];\n var m22 = te[5];\n var m23 = te[9];\n var m31 = te[2];\n var m32 = te[6];\n var m33 = te[10];\n var trace = m11 + m22 + m33;\n if (trace > 0) {\n var s = 0.5 / Math.sqrt(trace + 1.0);\n this.w = 0.25 / s;\n this.x = (m32 - m23) * s;\n this.y = (m13 - m31) * s;\n this.z = (m21 - m12) * s;\n } else if (m11 > m22 && m11 > m33) {\n var s1 = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n this.w = (m32 - m23) / s1;\n this.x = 0.25 * s1;\n this.y = (m12 + m21) / s1;\n this.z = (m13 + m31) / s1;\n this.negate();\n } else if (m22 > m33) {\n var s2 = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n this.w = (m13 - m31) / s2;\n this.x = (m12 + m21) / s2;\n this.y = 0.25 * s2;\n this.z = (m23 + m32) / s2;\n this.negate();\n } else {\n var s3 = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n this.w = (m21 - m12) / s3;\n this.x = (m13 + m31) / s3;\n this.y = (m23 + m32) / s3;\n this.z = 0.25 * s3;\n this.negate();\n }\n // 兼容原先数学库\n return this;\n };\n /**\n * 通过开始和结束向量设置四元数\n * @param from - 开始向量\n * @param to - 结束向量\n * @returns\n */ _proto.setFromUnitVectors = function setFromUnitVectors(from, to) {\n // assumes direction vectors vFrom and vTo are normalized\n var r = from.dot(to) + 1;\n if (r < Number.EPSILON) {\n r = 0;\n if (Math.abs(from.x) > Math.abs(from.z)) {\n this.x = -from.y;\n this.y = from.x;\n this.z = 0;\n this.w = r;\n } else {\n this.x = 0;\n this.y = -from.z;\n this.z = from.y;\n this.w = r;\n }\n } else {\n this.x = from.y * to.z - from.z * to.y;\n this.y = from.z * to.x - from.x * to.z;\n this.z = from.x * to.y - from.y * to.x;\n this.w = r;\n }\n return this.normalize();\n };\n /**\n * 四元数拷贝\n * @param quat - 拷贝目标四元数\n * @returns 拷贝四元数\n */ _proto.copyFrom = function copyFrom(quat) {\n this.x = quat.x;\n this.y = quat.y;\n this.z = quat.z;\n this.w = quat.w;\n return this;\n };\n /**\n * 四元数克隆\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Quaternion(this.x, this.y, this.z, this.w);\n };\n /**\n * 四元数间的夹角计算\n * @param other - 其他四元数\n * @returns 夹角\n */ _proto.angleTo = function angleTo(other) {\n return 2 * Math.acos(Math.abs(clamp$1(this.dot(other), -1, 1)));\n };\n /**\n * 四元数向目标旋转\n * @param q - 四元数\n * @param step - 旋转弧度\n * @returns 目标四元数\n */ _proto.rotateTowards = function rotateTowards(q, step) {\n var angle = this.angleTo(q);\n if (angle === 0) {\n return this;\n }\n var t = Math.min(1, step / angle);\n this.slerp(q, t);\n return this;\n };\n /**\n * 四元数单位化\n * @returns 单位四元数\n */ _proto.identity = function identity() {\n return this.set(0, 0, 0, 1);\n };\n /**\n * 四元数求逆\n * @returns 四元数的逆\n */ _proto.invert = function invert() {\n return this.conjugate();\n };\n /**\n * 四元数取负\n * @returns 负四元数\n */ _proto.negate = function negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n this.w = -this.w;\n return this;\n };\n /**\n * 四元数求共轭值\n * @returns 四元数的共轭值\n */ _proto.conjugate = function conjugate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n };\n /**\n * 四元数点乘结果\n * @param v\n * @return\n */ _proto.dot = function dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n };\n /**\n * 四元数的模平方\n * @return\n */ _proto.lengthSquared = function lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n };\n /**\n * 四元数的欧式长度\n * @returns 长度\n */ _proto.length = function length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n };\n /**\n * 四元数归一化\n * @returns 归一化值\n */ _proto.normalize = function normalize() {\n var l = this.length();\n if (l === 0) {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n } else {\n l = 1 / l;\n this.x = this.x * l;\n this.y = this.y * l;\n this.z = this.z * l;\n this.w = this.w * l;\n }\n return this;\n };\n /**\n * 四元数右乘\n * @param right - 右乘的四元数\n * @returns\n */ _proto.multiply = function multiply(right) {\n return this.multiplyQuaternions(this, right);\n };\n /**\n * 四元数左乘\n * @param left - 左乘的四元数\n * @returns\n */ _proto.premultiply = function premultiply(left) {\n return this.multiplyQuaternions(left, this);\n };\n /**\n * 四元数乘法\n * @param left - 四元数\n * @param right - 四元数\n * @returns 四元数\n */ _proto.multiplyQuaternions = function multiplyQuaternions(left, right) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n var qax = left.x;\n var qay = left.y;\n var qaz = left.z;\n var qaw = left.w;\n var qbx = right.x;\n var qby = right.y;\n var qbz = right.z;\n var qbw = right.w;\n this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n return this;\n };\n /**\n * 四元数线性插值\n * @see http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n * @param other - 四元数\n * @param t - 插值比\n * @returns 插值结果\n */ _proto.slerp = function slerp(other, t) {\n if (t === 0) {\n return this;\n }\n if (t === 1) {\n return this.copyFrom(other);\n }\n var _this = this, x = _this.x, y = _this.y, z = _this.z, w = _this.w;\n var cosHalfTheta = w * other.w + x * other.x + y * other.y + z * other.z;\n if (cosHalfTheta < 0) {\n this.w = -other.w;\n this.x = -other.x;\n this.y = -other.y;\n this.z = -other.z;\n cosHalfTheta = -cosHalfTheta;\n } else {\n this.copyFrom(other);\n }\n if (cosHalfTheta >= 1.0) {\n this.w = w;\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n if (sqrSinHalfTheta <= Number.EPSILON) {\n var s = 1 - t;\n this.w = s * w + t * this.w;\n this.x = s * x + t * this.x;\n this.y = s * y + t * this.y;\n this.z = s * z + t * this.z;\n this.normalize();\n return this;\n }\n var sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;\n var ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n this.w = w * ratioA + this.w * ratioB;\n this.x = x * ratioA + this.x * ratioB;\n this.y = y * ratioA + this.y * ratioB;\n this.z = z * ratioA + this.z * ratioB;\n return this;\n };\n /**\n * 两个四元数的线性插值\n * @param qa - 四元数\n * @param qb - 四元数\n * @param t - 插值比\n */ _proto.slerpQuaternions = function slerpQuaternions(qa, qb, t) {\n this.copyFrom(qa).slerp(qb, t);\n };\n /**\n * 通过四元数旋转向量\n * @param v - 待旋转向量\n * @param [out] - 旋转结果,如果没有传入直接覆盖输入值\n * @returns\n */ _proto.rotateVector3 = function rotateVector3(v, out) {\n var _this = this, qx = _this.x, qy = _this.y, qz = _this.z, qw = _this.w;\n var vx = v.x, vy = v.y, vz = v.z;\n var ix = qw * vx + qy * vz - qz * vy;\n var iy = qw * vy + qz * vx - qx * vz;\n var iz = qw * vz + qx * vy - qy * vx;\n var iw = -qx * vx - qy * vy - qz * vz;\n var res = out != null ? out : v;\n res.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n res.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n res.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return res;\n };\n /**\n * 四元数判等\n * @param quaternion - 四元数\n * @returns 判等结果\n */ _proto.equals = function equals(quaternion) {\n return quaternion.x === this.x && quaternion.y === this.y && quaternion.z === this.z && quaternion.w === this.w;\n };\n /**\n * 四元数保存为数组\n * @returns\n */ _proto.toArray = function toArray() {\n return [\n this.x,\n this.y,\n this.z,\n this.w\n ];\n };\n /**\n * 四元数转四维向量数组\n * @param vec - 目标保存对象\n * @returns 保存结果\n */ _proto.toVector4 = function toVector4(vec) {\n return vec.set(this.x, this.y, this.z, this.w);\n };\n /**\n * 四元数转欧拉角\n * @param euler - 目标欧拉角\n * @returns 欧拉角\n */ _proto.toEuler = function toEuler(euler) {\n return euler.setFromQuaternion(this);\n };\n /**\n * 四元数转矩阵\n * @param mat - 目标矩阵\n * @returns\n */ _proto.toMatrix4 = function toMatrix4(mat) {\n return mat.compose(Vector3.ZERO, this, Vector3.ONE);\n };\n /**\n * 通过欧拉角创建四元数\n * @param euler - 欧拉角\n * @returns 四元数\n */ Quaternion.fromEuler = function fromEuler(euler) {\n return new Quaternion().setFromEuler(euler);\n };\n /**\n * 通过旋转轴和旋转角度创建四元数\n * @param axis - 旋转轴\n * @param angle - 旋转角(弧度值)\n * @returns 四元数\n */ Quaternion.fromAxisAngle = function fromAxisAngle(axis, angle) {\n return new Quaternion().setFromAxisAngle(axis, angle);\n };\n /**\n * 通过 Vector4Like 创建四元数\n * @param v - Vector4Like\n * @returns 四元数\n */ Quaternion.fromVector4 = function fromVector4(v) {\n return new Quaternion().setFromVector4(v);\n };\n /**\n * 通过数组创建四元数\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 四元数\n */ Quaternion.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Quaternion().setFromArray(array, offset);\n };\n /**\n * 通过旋转矩阵创建四元数\n * @param m - 旋转矩阵\n * @returns 四元数\n */ Quaternion.fromRotationMatrix = function fromRotationMatrix(m) {\n return new Quaternion().setFromRotationMatrix(m);\n };\n /**\n * 通过开始和结束向量创建四元数\n * @param from - 开始向量\n * @param to - 结束向量\n * @returns\n */ Quaternion.fromUnitVectors = function fromUnitVectors(from, to) {\n return new Quaternion().setFromUnitVectors(from, to);\n };\n return Quaternion;\n}();\nQuaternion.tempVec0 = new Vector3();\n\n/**\n * 四阶矩阵(列优先矩阵)\n */ var Matrix4$1 = /*#__PURE__*/ function() {\n function Matrix4(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44) {\n if (m11 === void 0) m11 = 1;\n if (m21 === void 0) m21 = 0;\n if (m31 === void 0) m31 = 0;\n if (m41 === void 0) m41 = 0;\n if (m12 === void 0) m12 = 0;\n if (m22 === void 0) m22 = 1;\n if (m32 === void 0) m32 = 0;\n if (m42 === void 0) m42 = 0;\n if (m13 === void 0) m13 = 0;\n if (m23 === void 0) m23 = 0;\n if (m33 === void 0) m33 = 1;\n if (m43 === void 0) m43 = 0;\n if (m14 === void 0) m14 = 0;\n if (m24 === void 0) m24 = 0;\n if (m34 === void 0) m34 = 0;\n if (m44 === void 0) m44 = 1;\n this.elements = [\n m11,\n m21,\n m31,\n m41,\n m12,\n m22,\n m32,\n m42,\n m13,\n m23,\n m33,\n m43,\n m14,\n m24,\n m34,\n m44\n ];\n }\n var _proto = Matrix4.prototype;\n /**\n * 设置矩阵\n * @param m11 - 第 1 行,第 1 列\n * @param m21 - 第 2 行,第 1 列\n * @param m31 - 第 3 行,第 1 列\n * @param m41 - 第 4 行,第 1 列\n * @param m12 - 第 1 行,第 2 列\n * @param m22 - 第 2 行,第 2 列\n * @param m32 - 第 3 行,第 2 列\n * @param m42 - 第 4 行,第 2 列\n * @param m13 - 第 1 行,第 3 列\n * @param m23 - 第 2 行,第 3 列\n * @param m33 - 第 3 行,第 3 列\n * @param m43 - 第 4 行,第 3 列\n * @param m14 - 第 1 行,第 4 列\n * @param m24 - 第 2 行,第 4 列\n * @param m34 - 第 3 行,第 4 列\n * @param m44 - 第 4 行,第 4 列\n * @returns 矩阵\n */ _proto.set = function set(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44) {\n var e = this.elements;\n e[0] = m11;\n e[1] = m21;\n e[2] = m31;\n e[3] = m41;\n e[4] = m12;\n e[5] = m22;\n e[6] = m32;\n e[7] = m42;\n e[8] = m13;\n e[9] = m23;\n e[10] = m33;\n e[11] = m43;\n e[12] = m14;\n e[13] = m24;\n e[14] = m34;\n e[15] = m44;\n return this;\n };\n /**\n * 通过行优先数据设置矩阵\n * @param m11 - 第 1 行,第 1 列\n * @param m12 - 第 1 行,第 2 列\n * @param m13 - 第 1 行,第 3 列\n * @param m14 - 第 1 行,第 4 列\n * @param m21 - 第 2 行,第 1 列\n * @param m22 - 第 2 行,第 2 列\n * @param m23 - 第 2 行,第 3 列\n * @param m24 - 第 2 行,第 4 列\n * @param m31 - 第 3 行,第 1 列\n * @param m32 - 第 3 行,第 2 列\n * @param m33 - 第 3 行,第 3 列\n * @param m34 - 第 3 行,第 4 列\n * @param m41 - 第 4 行,第 1 列\n * @param m42 - 第 4 行,第 2 列\n * @param m43 - 第 4 行,第 3 列\n * @param m44 - 第 4 行,第 4 列\n * @returns 矩阵\n */ _proto.setFromRowMajorData = function setFromRowMajorData(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) {\n var e = this.elements;\n e[0] = m11;\n e[4] = m12;\n e[8] = m13;\n e[12] = m14;\n e[1] = m21;\n e[5] = m22;\n e[9] = m23;\n e[13] = m24;\n e[2] = m31;\n e[6] = m32;\n e[10] = m33;\n e[14] = m34;\n e[3] = m41;\n e[7] = m42;\n e[11] = m43;\n e[15] = m44;\n return this;\n };\n /**\n * 通过四个列向量设置矩阵\n * @param c1 - 第一列\n * @param c2 - 第二列\n * @param c3 - 第三列\n * @param c4 - 第四列\n * @returns 矩阵\n */ _proto.setFromColumnVectors = function setFromColumnVectors(c1, c2, c3, c4) {\n return this.set(c1.x, c1.y, c1.z, c1.w, c2.x, c2.y, c2.z, c2.w, c3.x, c3.y, c3.z, c3.w, c4.x, c4.y, c4.z, c4.w);\n };\n /**\n * 通过三维矩阵设置矩阵\n * @param m - 三维矩阵\n * @returns 设置结果\n */ _proto.setFromMatrix3 = function setFromMatrix3(m) {\n var me = m.elements;\n this.set(me[0], me[1], me[2], 0, me[3], me[4], me[5], 0, me[6], me[7], me[8], 0, 0, 0, 0, 1);\n return this;\n };\n /**\n * 通过数组设置矩阵\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 矩阵\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n for(var i = 0; i < 16; i++){\n this.elements[i] = array[offset + i];\n }\n return this;\n };\n /**\n * 通过缩放设置矩阵\n * @param x - x 方向缩放\n * @param y - y 方向缩放\n * @param z - z 方向缩放\n * @returns 缩放矩阵\n */ _proto.setFromScale = function setFromScale(x, y, z) {\n return this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n };\n /**\n * 通过平移设置矩阵\n * @param x - x 方向平移\n * @param y - y 方向平移\n * @param z - z 方向平移\n * @returns 平移矩阵\n */ _proto.setFromTranslation = function setFromTranslation(x, y, z) {\n return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1);\n };\n /**\n * 通过 x 轴旋转角度设置矩阵\n * @param theta - x 轴旋转弧度\n * @returns 矩阵\n */ _proto.setFromRotationX = function setFromRotationX(theta) {\n var c = Math.cos(theta);\n var s = Math.sin(theta);\n return this.set(1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1);\n };\n /**\n * 通过 y 轴旋转角度设置矩阵\n * @param theta - y 轴旋转弧度\n * @returns 矩阵\n */ _proto.setFromRotationY = function setFromRotationY(theta) {\n var c = Math.cos(theta);\n var s = Math.sin(theta);\n return this.set(c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1);\n };\n /**\n * 通过 z 轴旋转角度设置矩阵\n * @param theta - z 轴旋转弧度\n * @returns 矩阵\n */ _proto.setFromRotationZ = function setFromRotationZ(theta) {\n var c = Math.cos(theta);\n var s = Math.sin(theta);\n return this.set(c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n };\n /**\n * 根据三维旋转轴与弧度设置矩阵\n * @param axis - 三维旋转轴\n * @param angle - 旋转弧度\n * @returns 矩阵\n */ _proto.setFromRotationAxis = function setFromRotationAxis(axis, angle) {\n // Based on http://www.gamedev.net/reference/articles/article1199.asp\n var v = Matrix4.tempVec0;\n v.copyFrom(axis).normalize();\n var c = Math.cos(angle);\n var s = Math.sin(angle);\n var t = 1 - c;\n var x = v.x, y = v.y, z = v.z;\n var tx = t * x;\n var ty = t * y;\n return this.set(tx * x + c, tx * y + s * z, tx * z - s * y, 0, tx * y - s * z, ty * y + c, ty * z + s * x, 0, tx * z + s * y, ty * z - s * x, t * z * z + c, 0, 0, 0, 0, 1);\n };\n /**\n * 通过欧拉角设置矩阵\n * @param euler - 欧拉角\n * @returns 矩阵\n */ _proto.setFromEuler = function setFromEuler(euler) {\n euler.toMatrix4(this);\n return this;\n };\n /**\n * 通过四元数设置矩阵\n * @param quat - 四元数\n * @returns 矩阵\n */ _proto.setFromQuaternion = function setFromQuaternion(quat) {\n return this.compose(Vector3.ZERO, quat, Vector3.ONE);\n };\n /**\n * 通过倾斜参数设置矩阵\n * @param x - x 方向倾斜分量\n * @param y - y 方向倾斜分量\n * @param z - z 方向倾斜分量\n * @returns 倾斜矩阵\n */ _proto.setFromShear = function setFromShear(x, y, z) {\n return this.set(1, x, x, 0, y, 1, y, 0, z, z, 1, 0, 0, 0, 0, 1);\n };\n /**\n * 通过基轴设置矩阵\n * @param xAxis - x 轴\n * @param yAxis - y 轴\n * @param zAxis - z 轴\n * @returns 倾斜矩阵\n */ _proto.setFromBasis = function setFromBasis(xAxis, yAxis, zAxis) {\n return this.set(xAxis.x, xAxis.y, xAxis.z, 0, yAxis.x, yAxis.y, yAxis.z, 0, zAxis.x, zAxis.y, zAxis.z, 0, 0, 0, 0, 1);\n };\n /**\n * 矩阵清零\n * @returns 零矩阵\n */ _proto.setZero = function setZero() {\n for(var i = 0; i < 16; i++){\n this.elements[i] = 0;\n }\n return this;\n };\n /**\n * 矩阵单位化\n * @returns 单位矩阵\n */ _proto.identity = function identity() {\n return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n };\n /**\n * 单位阵判断\n * @returns 判断结果\n */ _proto.isIdentity = function isIdentity() {\n var e = this.elements;\n return e[0] === 1 && e[4] === 0 && e[8] === 0 && e[12] === 0 && e[1] === 0 && e[5] === 1 && e[9] === 0 && e[13] === 0 && e[2] === 0 && e[6] === 0 && e[10] === 1 && e[14] === 0 && e[3] === 0 && e[7] === 0 && e[11] === 0 && e[15] === 1;\n };\n /**\n * 矩阵克隆\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n var e = this.elements;\n return new Matrix4(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], e[10], e[11], e[12], e[13], e[14], e[15]);\n };\n /**\n * 矩阵复制\n * @param m - 复制对象\n * @returns 复制结果\n */ _proto.copyFrom = function copyFrom(m) {\n this.elements = [].concat(m.elements);\n return this;\n };\n /**\n * 得到列向量\n * @param i - 列向量索引,从 0 开始\n * @param v\n * @returns 矩阵\n */ _proto.getColumnVector = function getColumnVector(i, v) {\n return v.set(this.elements[i * 4], this.elements[i * 4 + 1], this.elements[i * 4 + 2], this.elements[i * 4 + 3]);\n };\n /**\n * 设置相机矩阵\n * @param eye - 相机位置\n * @param target - 目标位置\n * @param up - 相机方向\n * @returns 矩阵\n */ _proto.lookAt = function lookAt(eye, target, up) {\n var vX = Matrix4.tempVec0;\n var vY = Matrix4.tempVec1;\n var vZ = Matrix4.tempVec2;\n vZ.subtractVectors(eye, target);\n vZ.normalize();\n vX.crossVectors(up, vZ);\n vX.normalize();\n vY.crossVectors(vZ, vX);\n var te = this.elements;\n te[0] = vX.x;\n te[1] = vY.x;\n te[2] = vZ.x;\n te[3] = 0;\n te[4] = vX.y;\n te[5] = vY.y;\n te[6] = vZ.y;\n te[7] = 0;\n te[8] = vX.z;\n te[9] = vY.z;\n te[10] = vZ.z;\n te[11] = 0;\n te[12] = -vX.dot(eye);\n te[13] = -vY.dot(eye);\n te[14] = -vZ.dot(eye);\n te[15] = 1;\n return this;\n };\n /**\n * 矩阵乘比例后相加\n * @param right - 矩阵\n * @param s - 比例\n * @returns 相加结果\n */ _proto.addScaledMatrix = function addScaledMatrix(right, s) {\n var te = this.elements;\n var re = right.elements;\n for(var i = 0; i < 16; i++){\n te[i] += re[i] * s;\n }\n return this;\n };\n /**\n * 矩阵右乘\n * @param right - 右侧矩阵或数值\n * @returns 右乘结果\n */ _proto.multiply = function multiply(right) {\n if (typeof right === \"number\") {\n for(var i = 0; i < 16; i++){\n this.elements[i] *= right;\n }\n return this;\n } else {\n return this.multiplyMatrices(this, right);\n }\n };\n /**\n * 矩阵左乘\n * @param left - 左侧矩阵\n * @returns 左乘结果\n */ _proto.premultiply = function premultiply(left) {\n return this.multiplyMatrices(left, this);\n };\n /**\n * 矩阵相乘\n * @param left - 矩阵\n * @param right - 矩阵\n * @returns 相乘结果\n */ _proto.multiplyMatrices = function multiplyMatrices(left, right) {\n var ae = left.elements;\n var be = right.elements;\n var te = this.elements;\n var a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\n var a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\n var a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\n var a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\n var b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\n var b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\n var b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\n var b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\n te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n return this;\n };\n /**\n * 矩阵缩放\n * @param s - 缩放比例\n * @returns 缩放结果\n */ _proto.multiplyScalar = function multiplyScalar(s) {\n var e = this.elements;\n e[0] *= s;\n e[4] *= s;\n e[8] *= s;\n e[12] *= s;\n e[1] *= s;\n e[5] *= s;\n e[9] *= s;\n e[13] *= s;\n e[2] *= s;\n e[6] *= s;\n e[10] *= s;\n e[14] *= s;\n e[3] *= s;\n e[7] *= s;\n e[11] *= s;\n e[15] *= s;\n return this;\n };\n /**\n * 矩阵求行列式值\n * @returns 行列式值\n */ _proto.determinant = function determinant() {\n var e = this.elements;\n var m11 = e[0], m12 = e[4], m13 = e[8], m14 = e[12];\n var m21 = e[1], m22 = e[5], m23 = e[9], m24 = e[13];\n var m31 = e[2], m32 = e[6], m33 = e[10], m34 = e[14];\n var m41 = e[3], m42 = e[7], m43 = e[11], m44 = e[15];\n return m41 * (+m14 * m23 * m32 - m13 * m24 * m32 - m14 * m22 * m33 + m12 * m24 * m33 + m13 * m22 * m34 - m12 * m23 * m34) + m42 * (+m11 * m23 * m34 - m11 * m24 * m33 + m14 * m21 * m33 - m13 * m21 * m34 + m13 * m24 * m31 - m14 * m23 * m31) + m43 * (+m11 * m24 * m32 - m11 * m22 * m34 - m14 * m21 * m32 + m12 * m21 * m34 + m14 * m22 * m31 - m12 * m24 * m31) + m44 * (-m13 * m22 * m31 - m11 * m23 * m32 + m11 * m22 * m33 + m13 * m21 * m32 - m12 * m21 * m33 + m12 * m23 * m31);\n };\n /**\n * 矩阵转置\n * @returns 转置结果\n */ _proto.transpose = function transpose() {\n var e = this.elements;\n var t;\n t = e[1];\n e[1] = e[4];\n e[4] = t;\n t = e[2];\n e[2] = e[8];\n e[8] = t;\n t = e[3];\n e[3] = e[12];\n e[12] = t;\n //\n t = e[6];\n e[6] = e[9];\n e[9] = t;\n t = e[7];\n e[7] = e[13];\n e[13] = t;\n t = e[11];\n e[11] = e[14];\n e[14] = t;\n return this;\n };\n /**\n * 矩阵求逆\n * @returns 逆矩阵\n */ _proto.invert = function invert() {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n var e = this.elements;\n var m11 = e[0], m21 = e[1], m31 = e[2], m41 = e[3];\n var m12 = e[4], m22 = e[5], m32 = e[6], m42 = e[7];\n var m13 = e[8], m23 = e[9], m33 = e[10], m43 = e[11];\n var m14 = e[12], m24 = e[13], m34 = e[14], m44 = e[15];\n var t11 = m23 * m34 * m42 - m24 * m33 * m42 + m24 * m32 * m43 - m22 * m34 * m43 - m23 * m32 * m44 + m22 * m33 * m44;\n var t12 = m14 * m33 * m42 - m13 * m34 * m42 - m14 * m32 * m43 + m12 * m34 * m43 + m13 * m32 * m44 - m12 * m33 * m44;\n var t13 = m13 * m24 * m42 - m14 * m23 * m42 + m14 * m22 * m43 - m12 * m24 * m43 - m13 * m22 * m44 + m12 * m23 * m44;\n var t14 = m14 * m23 * m32 - m13 * m24 * m32 - m14 * m22 * m33 + m12 * m24 * m33 + m13 * m22 * m34 - m12 * m23 * m34;\n var det = m11 * t11 + m21 * t12 + m31 * t13 + m41 * t14;\n if (det === 0) {\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n var detInv = 1 / det;\n e[0] = t11 * detInv;\n e[1] = (m24 * m33 * m41 - m23 * m34 * m41 - m24 * m31 * m43 + m21 * m34 * m43 + m23 * m31 * m44 - m21 * m33 * m44) * detInv;\n e[2] = (m22 * m34 * m41 - m24 * m32 * m41 + m24 * m31 * m42 - m21 * m34 * m42 - m22 * m31 * m44 + m21 * m32 * m44) * detInv;\n e[3] = (m23 * m32 * m41 - m22 * m33 * m41 - m23 * m31 * m42 + m21 * m33 * m42 + m22 * m31 * m43 - m21 * m32 * m43) * detInv;\n e[4] = t12 * detInv;\n e[5] = (m13 * m34 * m41 - m14 * m33 * m41 + m14 * m31 * m43 - m11 * m34 * m43 - m13 * m31 * m44 + m11 * m33 * m44) * detInv;\n e[6] = (m14 * m32 * m41 - m12 * m34 * m41 - m14 * m31 * m42 + m11 * m34 * m42 + m12 * m31 * m44 - m11 * m32 * m44) * detInv;\n e[7] = (m12 * m33 * m41 - m13 * m32 * m41 + m13 * m31 * m42 - m11 * m33 * m42 - m12 * m31 * m43 + m11 * m32 * m43) * detInv;\n e[8] = t13 * detInv;\n e[9] = (m14 * m23 * m41 - m13 * m24 * m41 - m14 * m21 * m43 + m11 * m24 * m43 + m13 * m21 * m44 - m11 * m23 * m44) * detInv;\n e[10] = (m12 * m24 * m41 - m14 * m22 * m41 + m14 * m21 * m42 - m11 * m24 * m42 - m12 * m21 * m44 + m11 * m22 * m44) * detInv;\n e[11] = (m13 * m22 * m41 - m12 * m23 * m41 - m13 * m21 * m42 + m11 * m23 * m42 + m12 * m21 * m43 - m11 * m22 * m43) * detInv;\n e[12] = t14 * detInv;\n e[13] = (m13 * m24 * m31 - m14 * m23 * m31 + m14 * m21 * m33 - m11 * m24 * m33 - m13 * m21 * m34 + m11 * m23 * m34) * detInv;\n e[14] = (m14 * m22 * m31 - m12 * m24 * m31 - m14 * m21 * m32 + m11 * m24 * m32 + m12 * m21 * m34 - m11 * m22 * m34) * detInv;\n e[15] = (m12 * m23 * m31 - m13 * m22 * m31 + m13 * m21 * m32 - m11 * m23 * m32 - m12 * m21 * m33 + m11 * m22 * m33) * detInv;\n return this;\n };\n /**\n * 提取基轴\n * @param xAxis - 提取的 x 轴\n * @param yAxis - 提取的 y 轴\n * @param zAxis - 提取的 z 轴\n * @returns\n */ _proto.extractBasis = function extractBasis(xAxis, yAxis, zAxis) {\n var te = this.elements;\n xAxis.set(te[0], te[1], te[2]);\n yAxis.set(te[4], te[5], te[6]);\n zAxis.set(te[8], te[9], te[10]);\n return this;\n };\n /**\n * 根据基础信息组装矩阵\n * @param translation - 位置信息\n * @param rotation - 旋转信息\n * @param scale - 缩放信息\n * @param [anchor] - 锚点信息\n * @returns 矩阵\n */ _proto.compose = function compose(translation, rotation, scale, anchor) {\n if (anchor === void 0) anchor = Vector3.ZERO;\n var te = this.elements;\n var x = rotation.x, y = rotation.y, z = rotation.z, w = rotation.w;\n var l = -anchor.x;\n var m = -anchor.y;\n var n = -anchor.z;\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = scale.x, sy = scale.y, sz = scale.z;\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n te[12] = l * te[0] + m * te[4] + n * te[8] - l + translation.x;\n te[13] = l * te[1] + m * te[5] + n * te[9] - m + translation.y;\n te[14] = l * te[2] + m * te[6] + n * te[10] - n + translation.z;\n return this;\n };\n /**\n * 矩阵拆分为基础信息\n * @param translation - 位置信息\n * @param rotation - 旋转信息\n * @param scale - 缩放信息\n * @returns 矩阵\n */ _proto.decompose = function decompose(translation, rotation, scale) {\n var v = Matrix4.tempVec0;\n var te = this.elements;\n var sx = v.set(te[0], te[1], te[2]).length();\n var sy = v.set(te[4], te[5], te[6]).length();\n var sz = v.set(te[8], te[9], te[10]).length();\n // if determine is negative, we need to invert one scale\n var det = this.determinant();\n if (det < 0) {\n sx = -sx;\n }\n translation.x = te[12];\n translation.y = te[13];\n translation.z = te[14];\n // scale the rotation part\n var m = Matrix4.tempMat0;\n m.copyFrom(this);\n var invSX = 1 / sx;\n var invSY = 1 / sy;\n var invSZ = 1 / sz;\n m.elements[0] *= invSX;\n m.elements[1] *= invSX;\n m.elements[2] *= invSX;\n m.elements[4] *= invSY;\n m.elements[5] *= invSY;\n m.elements[6] *= invSY;\n m.elements[8] *= invSZ;\n m.elements[9] *= invSZ;\n m.elements[10] *= invSZ;\n rotation.setFromRotationMatrix(m);\n scale.x = sx;\n scale.y = sy;\n scale.z = sz;\n return this;\n };\n _proto.getTranslation = function getTranslation(translation) {\n var te = this.elements;\n return translation.set(te[12], te[13], te[14]);\n };\n _proto.getScale = function getScale(scale) {\n var te = this.elements;\n return scale.set(Math.hypot(te[0], te[1], te[2]), Math.hypot(te[4], te[5], te[6]), Math.hypot(te[8], te[9], te[10]));\n };\n /**\n * 获得矩阵分解的结果\n * @returns 分解的结果\n */ _proto.getTransform = function getTransform() {\n var translation = new Vector3();\n var rotation = new Quaternion();\n var scale = new Vector3();\n this.decompose(translation, rotation, scale);\n return {\n translation: translation,\n rotation: rotation,\n scale: scale\n };\n };\n /**\n * 根据视窗信息设置正交相机投影矩阵\n * @param left - 视窗左平面位置\n * @param right - 视窗右平面位置\n * @param top - 视窗上平面位置\n * @param bottom - 视窗下平面位置\n * @param near - 视窗近平面位置\n * @param far - 视窗远平面位置\n * @returns 矩阵\n */ _proto.orthographic = function orthographic(left, right, top, bottom, near, far) {\n var a = 1.0 / (right - left);\n var b = 1.0 / (top - bottom);\n var c = 1.0 / (far - near);\n var tx = -(right + left) * a;\n var ty = -(top + bottom) * b;\n var tz = -(far + near) * c;\n a *= 2.0;\n b *= 2.0;\n c *= -2.0;\n var te = this.elements;\n te[0] = a;\n te[1] = 0.0;\n te[2] = 0.0;\n te[3] = 0.0;\n //\n te[4] = 0.0;\n te[5] = b;\n te[6] = 0.0;\n te[7] = 0.0;\n //\n te[8] = 0.0;\n te[9] = 0.0;\n te[10] = c;\n te[11] = 0.0;\n //\n te[12] = tx;\n te[13] = ty;\n te[14] = tz;\n te[15] = 1.0;\n return this;\n };\n /**\n * 通过透视相机基础参数设置投影矩阵\n * @param fov - 视角(弧度)\n * @param aspect - 视窗比例\n * @param near - 近平面\n * @param far - 远平面\n * @param [reverse] - 视锥体长宽反转(3D这里反了?)\n * @returns 投影矩阵\n */ _proto.perspective = function perspective(fov, aspect, near, far, reverse) {\n var f = 1.0 / Math.tan(fov * 0.5);\n var nf = 1 / (near - far);\n var te = this.elements;\n te[0] = reverse ? f : f / aspect;\n te[1] = 0;\n te[2] = 0;\n te[3] = 0;\n //\n te[4] = 0;\n te[5] = reverse ? f * aspect : f;\n te[6] = 0;\n te[7] = 0;\n //\n te[8] = 0;\n te[9] = 0;\n te[10] = (far + near) * nf;\n te[11] = -1;\n //\n te[12] = 0;\n te[13] = 0;\n te[14] = 2 * far * near * nf;\n te[15] = 0;\n if (far === null || far === Infinity) {\n te[10] = -1;\n te[14] = -2 * near;\n }\n return this;\n };\n /**\n * 对点进行投影变换\n * @param v - 输入点\n * @param [out] - 输出点,如果没有就覆盖输入的数据\n * @returns 投影后的点\n */ _proto.projectPoint = function projectPoint(v, out) {\n var x = v.x, y = v.y, z = v.z;\n var e = this.elements;\n var res = out != null ? out : v;\n res.x = e[0] * x + e[4] * y + e[8] * z + e[12];\n res.y = e[1] * x + e[5] * y + e[9] * z + e[13];\n res.z = e[2] * x + e[6] * y + e[10] * z + e[14];\n var w = e[3] * x + e[7] * y + e[11] * z + e[15];\n return res.multiply(1 / w);\n };\n /**\n * 对点进行矩阵变换\n * @param v - 输入点\n * @param [out] - 输出点,如果没有就覆盖输入的数据\n * @returns 变换后的点\n */ _proto.transformPoint = function transformPoint(v, out) {\n var x = v.x, y = v.y, z = v.z;\n var e = this.elements;\n var res = out != null ? out : v;\n res.x = e[0] * x + e[4] * y + e[8] * z + e[12];\n res.y = e[1] * x + e[5] * y + e[9] * z + e[13];\n res.z = e[2] * x + e[6] * y + e[10] * z + e[14];\n return res;\n };\n /**\n * 对法向量进行矩阵变换\n * @param v - 输入法向量\n * @param [out] - 输出法向量,如果没有就覆盖输入的数据\n * @returns 变换后的法向量\n */ _proto.transformNormal = function transformNormal(v, out) {\n var x = v.x, y = v.y, z = v.z;\n var e = this.elements;\n var res = out != null ? out : v;\n res.x = e[0] * x + e[4] * y + e[8] * z;\n res.y = e[1] * x + e[5] * y + e[9] * z;\n res.z = e[2] * x + e[6] * y + e[10] * z;\n return res.normalize();\n };\n /**\n * 对四维向量进行矩阵变换\n * @param v - 输入向量\n * @param [out] - 输出向量,如果没有就覆盖输入的数据\n * @returns 变换后向量\n */ _proto.transformVector4 = function transformVector4(v, out) {\n var x = v.x, y = v.y, z = v.z, w = v.w;\n var e = this.elements;\n var res = out != null ? out : v;\n res.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n res.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n res.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n res.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n return res;\n };\n /**\n * 矩阵判等\n * @param matrix - 矩阵\n * @returns 判等结果\n */ _proto.equals = function equals(matrix) {\n var te = this.elements;\n var me = matrix.elements;\n for(var i = 0; i < 16; i++){\n if (!isEqual(te[i], me[i])) {\n return false;\n }\n }\n return true;\n };\n /**\n * 矩阵转数组\n * @returns\n */ _proto.toArray = function toArray() {\n return [].concat(this.elements);\n };\n _proto.fill = function fill(array, offset) {\n if (offset === void 0) offset = 0;\n var te = this.elements;\n array[offset] = te[0];\n array[offset + 1] = te[1];\n array[offset + 2] = te[2];\n array[offset + 3] = te[3];\n array[offset + 4] = te[4];\n array[offset + 5] = te[5];\n array[offset + 6] = te[6];\n array[offset + 7] = te[7];\n array[offset + 8] = te[8];\n array[offset + 9] = te[9];\n array[offset + 10] = te[10];\n array[offset + 11] = te[11];\n array[offset + 12] = te[12];\n array[offset + 13] = te[13];\n array[offset + 14] = te[14];\n array[offset + 15] = te[15];\n };\n /**\n * 创建单位阵\n * @returns 单位矩阵\n */ Matrix4.fromIdentity = function fromIdentity() {\n return new Matrix4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n };\n /**\n * 创建相机矩阵\n * @param eye - 相机位置\n * @param target - 目标位置\n * @param up - 相机方向\n * @returns 矩阵\n */ Matrix4.fromLookAt = function fromLookAt(eye, target, up) {\n return new Matrix4().lookAt(eye, target, up);\n };\n /**\n * 创建投影矩阵\n * @param fov - 视角\n * @param aspect - 视窗比例\n * @param near - 近平面\n * @param far - 远平面\n * @param [reverse] - 视锥体长宽反转\n * @returns 投影矩阵\n */ Matrix4.fromPerspective = function fromPerspective(fov, aspect, near, far, reverse) {\n return new Matrix4().perspective(fov, aspect, near, far, reverse);\n };\n /**\n * 通过四个列向量创建矩阵\n * @param c1 - 第一列\n * @param c2 - 第二列\n * @param c3 - 第三列\n * @param c4 - 第四列\n * @returns\n */ Matrix4.fromColumnVectors = function fromColumnVectors(c1, c2, c3, c4) {\n return new Matrix4().setFromColumnVectors(c1, c2, c3, c4);\n };\n /**\n * 通过三阶矩阵创建矩阵\n * @param m - 三阶矩阵\n * @returns 创建的矩阵\n */ Matrix4.fromMatrix3 = function fromMatrix3(m) {\n return new Matrix4().setFromMatrix3(m);\n };\n /**\n * 通过数组创建矩阵\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 矩阵\n */ Matrix4.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Matrix4().setFromArray(array, offset);\n };\n /**\n * 通过缩放创建矩阵\n * @param x - x 缩放\n * @param y - y 缩放\n * @param z - z 缩放\n * @returns 缩放结果\n */ Matrix4.fromScale = function fromScale(x, y, z) {\n return new Matrix4().setFromScale(x, y, z);\n };\n /**\n * 通过平移创建矩阵\n * @param x - x 平移\n * @param y - y 平移\n * @param z - z 平移\n * @returns 平移结果\n */ Matrix4.fromTranslation = function fromTranslation(x, y, z) {\n return new Matrix4().setFromTranslation(x, y, z);\n };\n /**\n * 通过 x 轴旋转创建矩阵\n * @param theta - x 轴旋转弧度\n * @returns 矩阵\n */ Matrix4.fromRotationX = function fromRotationX(theta) {\n return new Matrix4().setFromRotationX(theta);\n };\n /**\n * 通过 y 轴旋转创建矩阵\n * @param theta - y 轴旋转弧度\n * @returns 矩阵\n */ Matrix4.fromRotationY = function fromRotationY(theta) {\n return new Matrix4().setFromRotationY(theta);\n };\n /**\n * 通过 z 轴旋转创建矩阵\n * @param theta - z 轴旋转弧度\n * @returns\n */ Matrix4.fromRotationZ = function fromRotationZ(theta) {\n return new Matrix4().setFromRotationZ(theta);\n };\n /**\n * 通过旋转轴与旋转弧度创建矩阵\n * @param axis - 旋转轴\n * @param angle - 旋转弧度\n * @returns\n */ Matrix4.fromRotationAxis = function fromRotationAxis(axis, angle) {\n return new Matrix4().setFromRotationAxis(axis, angle);\n };\n /**\n * 通过欧拉角创建矩阵\n * @param euler - 欧拉角\n * @returns\n */ Matrix4.fromEuler = function fromEuler(euler) {\n return new Matrix4().setFromEuler(euler);\n };\n /**\n * 通过四元数创建矩阵\n * @param quat - 四元数\n * @returns\n */ Matrix4.fromQuaternion = function fromQuaternion(quat) {\n return new Matrix4().setFromQuaternion(quat);\n };\n /**\n * 通过倾斜创建矩阵\n * @param x - x 方向倾斜分量\n * @param y - y 方向倾斜分量\n * @param z - z 方向倾斜分量\n * @returns 倾斜矩阵\n */ Matrix4.fromShear = function fromShear(x, y, z) {\n return new Matrix4().setFromShear(x, y, z);\n };\n /**\n * 通过基轴创建矩阵\n * @param xAxis - x 轴\n * @param yAxis - y 轴\n * @param zAxis - z 轴\n * @returns\n */ Matrix4.fromBasis = function fromBasis(xAxis, yAxis, zAxis) {\n return new Matrix4().setFromBasis(xAxis, yAxis, zAxis);\n };\n /**\n * 通过行优先数据设置矩阵\n * @param m11 - 第 1 行,第 1 列\n * @param m12 - 第 1 行,第 2 列\n * @param m13 - 第 1 行,第 3 列\n * @param m14 - 第 1 行,第 4 列\n * @param m21 - 第 2 行,第 1 列\n * @param m22 - 第 2 行,第 2 列\n * @param m23 - 第 2 行,第 3 列\n * @param m24 - 第 2 行,第 4 列\n * @param m31 - 第 3 行,第 1 列\n * @param m32 - 第 3 行,第 2 列\n * @param m33 - 第 3 行,第 3 列\n * @param m34 - 第 3 行,第 4 列\n * @param m41 - 第 4 行,第 1 列\n * @param m42 - 第 4 行,第 2 列\n * @param m43 - 第 4 行,第 3 列\n * @param m44 - 第 4 行,第 4 列\n * @returns\n */ Matrix4.fromRowMajorData = function fromRowMajorData(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) {\n return new Matrix4(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44);\n };\n return Matrix4;\n}();\nMatrix4$1.IDENTITY = new Matrix4$1(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\nMatrix4$1.ZERO = new Matrix4$1(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\nMatrix4$1.tempVec0 = new Vector3();\nMatrix4$1.tempVec1 = new Vector3();\nMatrix4$1.tempVec2 = new Vector3();\nMatrix4$1.tempMat0 = new Matrix4$1();\n\n/**\n * Helper class to create a WebGL Context\n *\n * @param canvas\n * @param glType\n * @param options\n * @returns\n */ function createGLContext(canvas, glType, options) {\n if (glType === void 0) glType = \"webgl\";\n var context;\n if (glType === \"webgl2\") {\n context = canvas.getContext(\"webgl2\", options);\n if (!context) {\n console.debug(\"WebGL2 context retrieval failed, falling back to WebGL context.\");\n }\n }\n if (!context || glType === \"webgl\") {\n context = canvas.getContext(\"webgl\", options);\n }\n if (!context) {\n throw new Error(\"This browser does not support WebGL or the WebGL version is incorrect. Please check your WebGL version.\");\n }\n return context;\n}\n\nfunction gpuTimer(gl) {\n var ext = gl.getExtension(\"EXT_disjoint_timer_query_webgl2\");\n if (ext) {\n var query = gl.createQuery();\n var getTime = /*#__PURE__*/ _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n new Promise(function(resolve, reject) {\n if (query) {\n var available = gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE);\n var disjoint = gl.getParameter(ext.GPU_DISJOINT_EXT);\n if (available && !disjoint) {\n // See how much time the rendering of the object took in nanoseconds.\n var timeElapsed = gl.getQueryParameter(query, gl.QUERY_RESULT); // Do something useful with the time. Note that care should be\n // taken to use all significant bits of the result, not just the\n // least significant 32 bits.\n resolve(timeElapsed / 1000 / 1000);\n }\n if (available || disjoint) {\n // Clean up the query object.\n gl.deleteQuery(query); // Don't re-enter this polling loop.\n query = null;\n }\n available !== null && query && window.setTimeout(function() {\n getTime().then(resolve).catch;\n }, 1);\n }\n })\n ];\n });\n });\n if (!query) {\n return;\n }\n return {\n begin: function() {\n query && gl.beginQuery(ext.TIME_ELAPSED_EXT, query);\n },\n end: function() {\n gl.endQuery(ext.TIME_ELAPSED_EXT);\n },\n getTime: getTime\n };\n }\n}\n\nvar initErrors = [];\nvar glContext = {};\nif (!initErrors.length) {\n initGLContext();\n}\nfunction initGLContext() {\n // 重要:iOS 9/10 低版本需要拷贝 gl context 的 prototype,要不然会有属性值的缺失\n if (typeof WebGL2RenderingContext === \"function\") {\n copy(WebGL2RenderingContext);\n } else if (typeof WebGLRenderingContext !== \"undefined\") {\n copy(WebGLRenderingContext);\n copy(WebGLRenderingContext.prototype);\n } else {\n initErrors.push(// iOS 16 lockdown mode\n \"iOS16 lockdown mode, WebGL Constants not in global\");\n }\n if (!initErrors.length && !(\"HALF_FLOAT\" in glContext)) {\n // @ts-expect-error set default value\n glContext[\"HALF_FLOAT\"] = 5131;\n }\n}\nfunction isWebGL2(gl) {\n return typeof WebGL2RenderingContext !== \"undefined\" && gl.constructor.name === \"WebGL2RenderingContext\";\n}\nfunction copy(target) {\n for(var name in target){\n if (/^[A-Z_]/.test(name)) {\n // @ts-expect-error safe to assign\n glContext[name] = target[name];\n }\n }\n}\nfunction vertexFormatType2GLType(formatType) {\n switch(formatType){\n case VertexFormatType.Float32:\n return WebGLRenderingContext[\"FLOAT\"];\n case VertexFormatType.Int16:\n return WebGLRenderingContext[\"SHORT\"];\n case VertexFormatType.Int8:\n return WebGLRenderingContext[\"BYTE\"];\n case VertexFormatType.UInt16:\n return WebGLRenderingContext[\"UNSIGNED_SHORT\"];\n case VertexFormatType.UInt8:\n return WebGLRenderingContext[\"UNSIGNED_BYTE\"];\n default:\n return WebGLRenderingContext[\"FLOAT\"];\n }\n}\nfunction glType2VertexFormatType(webglType) {\n switch(webglType){\n case WebGLRenderingContext[\"FLOAT\"]:\n return VertexFormatType.Float32;\n case WebGLRenderingContext[\"SHORT\"]:\n return VertexFormatType.Int16;\n case WebGLRenderingContext[\"BYTE\"]:\n return VertexFormatType.Int8;\n case WebGLRenderingContext[\"UNSIGNED_SHORT\"]:\n return VertexFormatType.UInt16;\n case WebGLRenderingContext[\"UNSIGNED_BYTE\"]:\n return VertexFormatType.UInt8;\n default:\n return VertexFormatType.Float32;\n }\n}\n\nexports.ShaderType = void 0;\n(function(ShaderType) {\n ShaderType[ShaderType[\"vertex\"] = 0] = \"vertex\";\n ShaderType[ShaderType[\"fragment\"] = 1] = \"fragment\";\n})(exports.ShaderType || (exports.ShaderType = {}));\nexports.MaskMode = void 0;\n(function(MaskMode) {\n /**\n * 无\n */ MaskMode[MaskMode[\"NONE\"] = 0] = \"NONE\";\n /**\n * 蒙版\n */ MaskMode[MaskMode[\"MASK\"] = 1] = \"MASK\";\n /**\n * 被遮挡\n */ MaskMode[MaskMode[\"OBSCURED\"] = 2] = \"OBSCURED\";\n /**\n * 被反向遮挡\n */ MaskMode[MaskMode[\"REVERSE_OBSCURED\"] = 3] = \"REVERSE_OBSCURED\";\n})(exports.MaskMode || (exports.MaskMode = {}));\n\nfunction valIfUndefined(val, def) {\n if (val === undefined || val === null) {\n return def;\n }\n return val;\n}\nfunction getPreMultiAlpha(blending) {\n switch(blending){\n case BlendingMode.ALPHA:\n return 1;\n case BlendingMode.ADD:\n return 1;\n case BlendingMode.SUBTRACTION:\n return 1;\n case BlendingMode.STRONG_LIGHT:\n return 1;\n case BlendingMode.WEAK_LIGHT:\n return 1;\n case BlendingMode.SUPERPOSITION:\n return 2;\n case BlendingMode.BRIGHTNESS:\n return 3;\n case BlendingMode.MULTIPLY:\n return 0;\n default:\n // 处理undefined\n return 1;\n }\n}\nfunction setBlendMode(material, blendMode) {\n switch(blendMode){\n case undefined:\n material.blendFunction = [\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA,\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA\n ];\n break;\n case BlendingMode.ALPHA:\n material.blendFunction = [\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA,\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA\n ];\n break;\n case BlendingMode.ADD:\n material.blendFunction = [\n glContext.ONE,\n glContext.ONE,\n glContext.ONE,\n glContext.ONE\n ];\n break;\n case BlendingMode.SUBTRACTION:\n material.blendFunction = [\n glContext.ONE,\n glContext.ONE,\n glContext.ZERO,\n glContext.ONE\n ];\n material.blendEquation = [\n glContext.FUNC_REVERSE_SUBTRACT,\n glContext.FUNC_REVERSE_SUBTRACT\n ];\n break;\n case BlendingMode.SUPERPOSITION:\n material.blendFunction = [\n glContext.ONE,\n glContext.ONE,\n glContext.ONE,\n glContext.ONE\n ];\n break;\n case BlendingMode.MULTIPLY:\n material.blendFunction = [\n glContext.DST_COLOR,\n glContext.ONE_MINUS_SRC_ALPHA,\n glContext.DST_COLOR,\n glContext.ONE_MINUS_SRC_ALPHA\n ];\n break;\n case BlendingMode.BRIGHTNESS:\n material.blendFunction = [\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA,\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA\n ];\n break;\n case BlendingMode.STRONG_LIGHT:\n material.blendFunction = [\n glContext.DST_COLOR,\n glContext.DST_ALPHA,\n glContext.ZERO,\n glContext.ONE\n ];\n break;\n case BlendingMode.WEAK_LIGHT:\n material.blendFunction = [\n glContext.DST_COLOR,\n glContext.ZERO,\n glContext.ZERO,\n glContext.ONE\n ];\n break;\n default:\n console.warn(\"BlendMode \" + blendMode + \" not in specification, please set blend params separately.\");\n }\n}\nfunction setSideMode(material, side) {\n if (side === SideMode.DOUBLE) {\n material.culling = false;\n } else {\n material.culling = true;\n material.frontFace = glContext.CW;\n material.cullFace = side === SideMode.BACK ? glContext.BACK : glContext.FRONT;\n }\n}\nfunction setMaskMode(material, maskMode) {\n switch(maskMode){\n case undefined:\n material.stencilTest = false;\n break;\n case exports.MaskMode.MASK:\n material.stencilTest = true;\n material.stencilFunc = [\n glContext.ALWAYS,\n glContext.ALWAYS\n ];\n material.stencilOpZPass = [\n glContext.REPLACE,\n glContext.REPLACE\n ];\n break;\n case exports.MaskMode.OBSCURED:\n material.stencilTest = true;\n material.stencilFunc = [\n glContext.EQUAL,\n glContext.EQUAL\n ];\n break;\n case exports.MaskMode.REVERSE_OBSCURED:\n material.stencilTest = true;\n material.stencilFunc = [\n glContext.NOTEQUAL,\n glContext.NOTEQUAL\n ];\n break;\n case exports.MaskMode.NONE:\n material.stencilTest = false;\n break;\n default:\n console.warn(\"MaskMode \" + maskMode + \" not in specification, please set stencil params seperately.\");\n }\n}\n\nfunction _extends() {\n _extends = Object.assign || function assign(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexports.TextureLoadAction = void 0;\n(function(TextureLoadAction) {\n TextureLoadAction[TextureLoadAction[\"whatever\"] = 0] = \"whatever\";\n //preserve previous attachment\n //load = 1,\n //clear attachment\n TextureLoadAction[TextureLoadAction[\"clear\"] = 2] = \"clear\";\n})(exports.TextureLoadAction || (exports.TextureLoadAction = {}));\nexports.TextureSourceType = void 0;\n(function(TextureSourceType) {\n TextureSourceType[TextureSourceType[\"none\"] = 0] = \"none\";\n TextureSourceType[TextureSourceType[\"data\"] = 1] = \"data\";\n TextureSourceType[TextureSourceType[\"image\"] = 2] = \"image\";\n TextureSourceType[TextureSourceType[\"compressed\"] = 3] = \"compressed\";\n TextureSourceType[TextureSourceType[\"video\"] = 4] = \"video\";\n TextureSourceType[TextureSourceType[\"canvas\"] = 5] = \"canvas\";\n TextureSourceType[TextureSourceType[\"framebuffer\"] = 6] = \"framebuffer\";\n TextureSourceType[TextureSourceType[\"mipmaps\"] = 7] = \"mipmaps\";\n})(exports.TextureSourceType || (exports.TextureSourceType = {}));\n\n/**\n * 负责下载各种资源,并提供了一些异步加载和缓存管理的功能\n */ var Downloader = /*#__PURE__*/ function() {\n function Downloader() {\n /**\n * 存储多个回调函数的对象\n */ this.callbacks = {};\n }\n var _proto = Downloader.prototype;\n /**\n * 下载一个 JSON 文件\n * @param url - 要下载的 JSON 文件的 URL\n * @param onSuccess - 下载成功后的回调函数\n * @param onError - 下载失败后的回调函数\n */ _proto.downloadJSON = function downloadJSON(url, onSuccess, onError) {\n this.download(url, \"json\", onSuccess, onError);\n };\n /**\n * 下载一个二进制文件\n * @param url - 要下载的二进制文件的 URL\n * @param onSuccess - 下载成功后的回调函数\n * @param onError - 下载失败后的回调函数\n */ _proto.downloadBinary = function downloadBinary(url, onSuccess, onError) {\n this.download(url, \"arraybuffer\", onSuccess, onError);\n };\n /**\n * 下载一个 Blob 文件\n * @param url - 要下载的 Blob 文件的 URL\n * @param onSuccess - 下载成功后的回调函数\n * @param onError - 下载失败后的回调函数\n */ _proto.downloadBlob = function downloadBlob(url, onSuccess, onError) {\n this.download(url, \"blob\", onSuccess, onError);\n };\n _proto.download = function download(url, responseType, onSuccess, onError) {\n var _this = this;\n if (responseType === void 0) responseType = \"json\";\n if (this.start(url, onSuccess, onError)) {\n return;\n }\n var xhr = new XMLHttpRequest();\n var handleError = function() {\n _this.finish(url, xhr.status, xhr.response);\n };\n var handleLoad = function() {\n if (xhr.status == 200) {\n _this.finish(url, 200, xhr.response);\n } else {\n handleError();\n }\n };\n xhr.responseType = responseType;\n xhr.addEventListener(\"load\", handleLoad);\n xhr.addEventListener(\"error\", handleError);\n xhr.open(\"GET\", url, true);\n xhr.send();\n };\n _proto.start = function start(url, onSuccess, onError) {\n var callbacks = this.callbacks[url];\n try {\n if (callbacks) {\n return true;\n }\n this.callbacks[url] = callbacks = [];\n } finally{\n callbacks.push(onSuccess, onError);\n }\n };\n _proto.finish = function finish(url, status, data) {\n var callbacks = this.callbacks[url];\n delete this.callbacks[url];\n var args = status == 200 ? [\n data\n ] : [\n status,\n data\n ];\n for(var i = args.length - 1, n = callbacks.length; i < n; i += 2){\n callbacks[i].apply(null, args);\n }\n };\n return Downloader;\n}();\nvar webPFailed = false;\nvar avifFailed = false;\n/**\n * 异步加载一个 WebP 图片文件,如果不支持 WebP,则加载 PNG 图片文件\n * @param png - PNG 图片文件的 URL\n * @param webp - WebP 图片文件的 URL\n */ function loadWebPOptional(png, webp) {\n return _loadWebPOptional.apply(this, arguments);\n}\nfunction _loadWebPOptional() {\n _loadWebPOptional = _async_to_generator(function(png, webp) {\n var image, image1, image2;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!(webPFailed || !webp)) return [\n 3,\n 2\n ];\n return [\n 4,\n loadImage(png)\n ];\n case 1:\n image = _state.sent();\n return [\n 2,\n {\n image: image,\n url: png\n }\n ];\n case 2:\n _state.trys.push([\n 2,\n 4,\n ,\n 6\n ]);\n return [\n 4,\n loadImage(webp)\n ];\n case 3:\n image1 = _state.sent();\n return [\n 2,\n {\n image: image1,\n url: webp\n }\n ];\n case 4:\n _state.sent();\n webPFailed = true;\n return [\n 4,\n loadImage(png)\n ];\n case 5:\n image2 = _state.sent();\n return [\n 2,\n {\n image: image2,\n url: png\n }\n ];\n case 6:\n return [\n 2\n ];\n }\n });\n });\n return _loadWebPOptional.apply(this, arguments);\n}\n/**\n * 异步加载一个 AVIF 图片文件,如果不支持 AVIF,则加载 PNG 图片文件\n * @param png - PNG 图片文件的 URL\n * @param avif - AVIF 图片文件的 URL\n */ function loadAVIFOptional(png, avif) {\n return _loadAVIFOptional.apply(this, arguments);\n}\nfunction _loadAVIFOptional() {\n _loadAVIFOptional = _async_to_generator(function(png, avif) {\n var image, image1, image2;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!(avifFailed || !avif)) return [\n 3,\n 2\n ];\n return [\n 4,\n loadImage(png)\n ];\n case 1:\n image = _state.sent();\n return [\n 2,\n {\n image: image,\n url: png\n }\n ];\n case 2:\n _state.trys.push([\n 2,\n 4,\n ,\n 6\n ]);\n return [\n 4,\n loadImage(avif)\n ];\n case 3:\n image1 = _state.sent();\n return [\n 2,\n {\n image: image1,\n url: avif\n }\n ];\n case 4:\n _state.sent();\n avifFailed = true;\n return [\n 4,\n loadImage(png)\n ];\n case 5:\n image2 = _state.sent();\n return [\n 2,\n {\n image: image2,\n url: png\n }\n ];\n case 6:\n return [\n 2\n ];\n }\n });\n });\n return _loadAVIFOptional.apply(this, arguments);\n}\n/**\n * 异步加载一个图片文件\n * @param source - 图片文件的 URL、Blob 或 HTMLImageElement 对象\n */ function loadImage(source) {\n return _loadImage.apply(this, arguments);\n}\nfunction _loadImage() {\n _loadImage = _async_to_generator(function(source) {\n var url, revokeURL;\n return __generator(this, function(_state) {\n url = \"\";\n // 1. string | Blob | HTMLImageElement 处理逻辑\n if (_instanceof1(source, HTMLImageElement)) {\n if (source.complete) {\n return [\n 2,\n source\n ];\n }\n url = source.src;\n } else if (_instanceof1(source, Blob)) {\n url = URL.createObjectURL(source);\n revokeURL = true;\n } else if (typeof source === \"string\") {\n url = source;\n }\n // 2. 非法类型\n if (!url) {\n throw new Error(\"Invalid url type: \" + JSON.stringify(source) + \".\");\n }\n return [\n 2,\n new Promise(function(resolve, reject) {\n var img = new Image();\n if (!/^data:/.test(url)) {\n img.crossOrigin = \"*\";\n }\n img.onload = function() {\n img.onload = null;\n if (revokeURL) {\n URL.revokeObjectURL(url);\n }\n return resolve(img);\n };\n img.onerror = function(e) {\n img.onerror = null;\n if (revokeURL) {\n URL.revokeObjectURL(url);\n }\n return reject(\"Load image fail: \" + url + \", reason: \" + JSON.stringify(e));\n };\n img.src = url;\n })\n ];\n });\n });\n return _loadImage.apply(this, arguments);\n}\n/**\n * 异步加载一个二进制文件\n * @param url - 二进制文件的 URL\n */ function loadBinary(url) {\n return _loadBinary.apply(this, arguments);\n}\nfunction _loadBinary() {\n _loadBinary = _async_to_generator(function(url) {\n return __generator(this, function(_state) {\n return [\n 2,\n new Promise(function(resolve, reject) {\n new Downloader().downloadBinary(url, resolve, function(status, responseText) {\n reject(\"Couldn't load bins \" + url + \": status \" + status + \", \" + responseText);\n });\n })\n ];\n });\n });\n return _loadBinary.apply(this, arguments);\n}\n/**\n * 异步加载一个 Blob 文件\n * @param url - Blob 文件的 URL\n */ function loadBlob(url) {\n return _loadBlob.apply(this, arguments);\n}\nfunction _loadBlob() {\n _loadBlob = _async_to_generator(function(url) {\n return __generator(this, function(_state) {\n return [\n 2,\n new Promise(function(resolve, reject) {\n new Downloader().downloadBlob(url, resolve, function(status, responseText) {\n reject(\"Couldn't load blob \" + url + \": status \" + status + \", \" + responseText);\n });\n })\n ];\n });\n });\n return _loadBlob.apply(this, arguments);\n}\n/**\n * 异步加载一个视频文件\n * @param url - 视频文件的 URL 或 MediaProvider 对象\n */ function loadVideo(url) {\n return _loadVideo.apply(this, arguments);\n}\nfunction _loadVideo() {\n _loadVideo = _async_to_generator(function(url) {\n var video;\n return __generator(this, function(_state) {\n video = document.createElement(\"video\");\n if (typeof url === \"string\") {\n video.src = url;\n } else {\n video.srcObject = url;\n }\n video.crossOrigin = \"anonymous\";\n video.muted = true;\n if (isAndroid()) {\n video.setAttribute(\"renderer\", \"standard\");\n }\n video.setAttribute(\"playsinline\", \"playsinline\");\n return [\n 2,\n new Promise(function(resolve, reject) {\n var pending = video.play();\n if (pending) {\n void pending.then(function() {\n return resolve(video);\n });\n } else {\n video.addEventListener(\"loadeddata\", function listener() {\n resolve(video);\n video.removeEventListener(\"loadeddata\", listener);\n }, true);\n }\n video.addEventListener(\"error\", function(e) {\n reject(\"Load video fail.\");\n });\n })\n ];\n });\n });\n return _loadVideo.apply(this, arguments);\n}\n/**\n * 异步加载一个媒体文件\n * @param url\n * @param loadFn\n * @returns\n */ function loadMedia(url, loadFn) {\n return _loadMedia.apply(this, arguments);\n}\nfunction _loadMedia() {\n _loadMedia = _async_to_generator(function(url, loadFn) {\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!Array.isArray(url)) return [\n 3,\n 5\n ];\n _state.label = 1;\n case 1:\n _state.trys.push([\n 1,\n 3,\n ,\n 5\n ]);\n return [\n 4,\n loadFn(url[0])\n ];\n case 2:\n return [\n 2,\n _state.sent()\n ];\n case 3:\n _state.sent();\n return [\n 4,\n loadFn(url[1])\n ];\n case 4:\n return [\n 2,\n _state.sent()\n ];\n case 5:\n return [\n 2,\n loadFn(url)\n ];\n }\n });\n });\n return _loadMedia.apply(this, arguments);\n}\n\nfunction deserializeMipmapTexture(textureOptions, bins, assets) {\n return _deserializeMipmapTexture.apply(this, arguments);\n}\nfunction _deserializeMipmapTexture() {\n _deserializeMipmapTexture = _async_to_generator(function(textureOptions, bins, assets, files) {\n var mipmaps, target, jobs, loadedMipmaps, mipmaps1, target1, jobs1, loadedMipmaps1, bin;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (files === void 0) files = [];\n if (!(textureOptions.target === 34067)) return [\n 3,\n 2\n ];\n mipmaps = textureOptions.mipmaps, target = textureOptions.target;\n jobs = mipmaps.map(function(mipmap) {\n return Promise.all(mipmap.map(function(pointer) {\n // @ts-expect-error\n if (pointer.id) {\n // @ts-expect-error\n var loadedImage = assets[pointer.id];\n return loadedImage;\n } else {\n return loadMipmapImage(pointer, bins);\n }\n }));\n });\n return [\n 4,\n Promise.all(jobs)\n ];\n case 1:\n loadedMipmaps = _state.sent();\n return [\n 2,\n _extends({\n keepImageSource: false\n }, textureOptions, {\n mipmaps: loadedMipmaps,\n sourceFrom: {\n target: target,\n // bin,\n type: exports.TextureSourceType.mipmaps\n }\n })\n ];\n case 2:\n // TODO: 补充测试用例\n mipmaps1 = textureOptions.mipmaps, target1 = textureOptions.target;\n jobs1 = mipmaps1.map(function(pointer) {\n return loadMipmapImage(pointer, bins);\n });\n return [\n 4,\n Promise.all(jobs1)\n ];\n case 3:\n loadedMipmaps1 = _state.sent();\n bin = files[mipmaps1[0][1][0]].url;\n return [\n 2,\n _extends({\n keepImageSource: false\n }, textureOptions, {\n mipmaps: loadedMipmaps1,\n sourceType: exports.TextureSourceType.mipmaps,\n sourceFrom: {\n target: target1,\n bin: bin,\n type: exports.TextureSourceType.mipmaps,\n mipmaps: mipmaps1.map(function(pointer) {\n return [\n pointer[1][1],\n pointer[1][2]\n ];\n })\n }\n })\n ];\n case 4:\n return [\n 2\n ];\n }\n });\n });\n return _deserializeMipmapTexture.apply(this, arguments);\n}\nfunction loadMipmapImage(pointer, bins) {\n return _loadMipmapImage.apply(this, arguments);\n}\nfunction _loadMipmapImage() {\n _loadMipmapImage = _async_to_generator(function(pointer, bins) {\n var _pointer_, index, start, length, bin;\n return __generator(this, function(_state) {\n _pointer_ = pointer[1], index = _pointer_[0], start = _pointer_[1], length = _pointer_[2];\n bin = bins[index];\n if (!bin) {\n throw new Error(\"Invalid bin pointer: \" + JSON.stringify(pointer) + \".\");\n }\n return [\n 2,\n loadImage(new Blob([\n new Uint8Array(bin, start, length)\n ]))\n ];\n });\n });\n return _loadMipmapImage.apply(this, arguments);\n}\n\nvar seed$d = 1;\n/**\n * Texture 抽象类\n */ var Texture = /*#__PURE__*/ function(EffectsObject) {\n _inherits(Texture, EffectsObject);\n function Texture(engine) {\n var _this;\n _this = EffectsObject.call(this, engine) || this;\n _this.destroyed = false;\n _this.id = \"Tex\" + seed$d++;\n return _this;\n }\n var _proto = Texture.prototype;\n /**\n * 获取 Texture 的宽度。\n */ _proto.getWidth = function getWidth() {\n return this.width || 0;\n };\n /**\n * 获取 Texture 的高度。\n */ _proto.getHeight = function getHeight() {\n return this.height || 0;\n };\n _proto.uploadCurrentVideoFrame = function uploadCurrentVideoFrame() {\n // OVERRIDE\n };\n /**\n * 释放 Texture GPU 资源。\n * 注意:该方法只释放资源,并不销毁 GPU textureBuffer 对象。\n * @override\n */ _proto.offloadData = function offloadData() {\n // OVERRIDE\n };\n /**\n * 重新加载 Texture GPU 资源。\n * @override\n */ _proto.reloadData = function reloadData() {\n // OVERRIDE\n };\n /**\n * 初始化 GPU 资源\n * @override\n */ _proto.initialize = function initialize() {\n // OVERRIDE\n };\n _proto.assembleOptions = function assembleOptions(options) {\n var _options_target = options.target, target = _options_target === void 0 ? glContext.TEXTURE_2D : _options_target, tmp = options.format, internalFormat = tmp === void 0 ? glContext.RGBA : tmp;\n if (!options.sourceType) {\n if (\"image\" in options) {\n options.sourceType = exports.TextureSourceType.image;\n } else if (\"data\" in options) {\n options.sourceType = exports.TextureSourceType.data;\n } else if (\"video\" in options) {\n options.sourceType = exports.TextureSourceType.video;\n } else {\n options.sourceType = 0; // TextureSourceType.none\n }\n }\n return _extends({\n minFilter: glContext.NEAREST,\n magFilter: glContext.NEAREST,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n target: target,\n format: glContext.RGBA,\n internalFormat: internalFormat,\n type: glContext.UNSIGNED_BYTE\n }, options);\n };\n /**\n * 通过 URL 创建 Texture 对象。\n * @param url - 要创建的 Texture URL\n * @since 2.0.0\n */ Texture.fromImage = function fromImage(url, engine, options) {\n return _async_to_generator(function() {\n var image, texture;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n return [\n 4,\n loadImage(url)\n ];\n case 1:\n image = _state.sent();\n texture = Texture.create(engine, _extends({\n sourceType: exports.TextureSourceType.image,\n image: image,\n target: glContext.TEXTURE_2D,\n id: generateGUID(),\n flipY: true\n }, options));\n texture.initialize();\n return [\n 2,\n texture\n ];\n }\n });\n })();\n };\n /**\n * 通过视频 URL 创建 Texture 对象。\n * @param url - 要创建的 Texture URL\n * @param engine - 引擎对象\n * @param options - 可选的 Texture 选项\n * @since 2.1.0\n * @returns\n */ Texture.fromVideo = function fromVideo(url, engine, options) {\n return _async_to_generator(function() {\n var video, texture;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n return [\n 4,\n loadVideo(url)\n ];\n case 1:\n video = _state.sent();\n texture = Texture.create(engine, _extends({\n sourceType: exports.TextureSourceType.video,\n video: video,\n id: generateGUID(),\n flipY: true\n }, options));\n texture.initialize();\n return [\n 2,\n texture\n ];\n }\n });\n })();\n };\n _create_class(Texture, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return Texture;\n}(EffectsObject);\nfunction generateHalfFloatTexture(engine, data, width, height) {\n var channel = data.length / width / height;\n var format;\n var internalFormat;\n if (channel === 4 || channel === 0) {\n internalFormat = format = glContext.RGBA;\n } else if (channel === 3) {\n internalFormat = format = glContext.RGB;\n } else if (channel === 2) {\n internalFormat = format = glContext.LUMINANCE_ALPHA;\n } else {\n internalFormat = format = glContext.LUMINANCE;\n }\n return Texture.createWithData(engine, {\n data: data,\n width: width,\n height: height\n }, {\n type: glContext.HALF_FLOAT,\n format: format,\n internalFormat: internalFormat,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE\n });\n}\nvar sourceOptions = {\n type: glContext.UNSIGNED_BYTE,\n format: glContext.RGBA,\n internalFormat: glContext.RGBA,\n wrapS: glContext.MIRRORED_REPEAT,\n wrapT: glContext.MIRRORED_REPEAT,\n minFilter: glContext.NEAREST,\n magFilter: glContext.NEAREST\n};\nfunction generateWhiteTexture(engine) {\n return Texture.create(engine, _extends({\n id: BuiltinObjectGUID.WhiteTexture,\n data: {\n width: 1,\n height: 1,\n data: new Uint8Array([\n 255,\n 255,\n 255,\n 255\n ])\n },\n sourceType: exports.TextureSourceType.data\n }, sourceOptions));\n}\nfunction generateTransparentTexture(engine) {\n return Texture.create(engine, _extends({\n id: BuiltinObjectGUID.TransparentTexture,\n data: {\n width: 1,\n height: 1,\n data: new Uint8Array([\n 0,\n 0,\n 0,\n 0\n ])\n },\n sourceType: exports.TextureSourceType.data\n }, sourceOptions));\n}\n\nvar HEADER_LEN = 12 + 13 * 4; // identifier + header elements (not including key value meta-data pairs)\nvar COMPRESSED_2D = 0; // uses a gl.compressedTexImage2D()\n//const COMPRESSED_3D = 1; // uses a gl.compressedTexImage3D()\nvar TEX_2D = 2; // uses a gl.texImage2D()\n//const TEX_3D = 3; // uses a gl.texImage3D()\nvar KTXTexture = /*#__PURE__*/ function() {\n function KTXTexture(arrayBuffer, facesExpected, baseOffset) {\n if (baseOffset === void 0) baseOffset = 0;\n this.arrayBuffer = arrayBuffer;\n this.baseOffset = baseOffset;\n // Test that it is a ktx formatted file, based on the first 12 bytes, character representation is:\n // '´', 'K', 'T', 'X', ' ', '1', '1', 'ª', '\\r', '\\n', '\\x1A', '\\n'\n // 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A\n var identifier = new Uint8Array(this.arrayBuffer, this.baseOffset, 12);\n if (identifier[0] !== 0xab || identifier[1] !== 0x4b || identifier[2] !== 0x54 || identifier[3] !== 0x58 || identifier[4] !== 0x20 || identifier[5] !== 0x31 || identifier[6] !== 0x31 || identifier[7] !== 0xbb || identifier[8] !== 0x0d || identifier[9] !== 0x0a || identifier[10] !== 0x1a || identifier[11] !== 0x0a) {\n throw new Error(\"Texture missing KTX identifier.\");\n }\n // load the reset of the header in native 32 bit uint\n var dataSize = Uint32Array.BYTES_PER_ELEMENT;\n var headerDataView = new DataView(this.arrayBuffer, this.baseOffset + 12, 13 * dataSize);\n var endianness = headerDataView.getUint32(0, true);\n var littleEndian = endianness === 0x04030201;\n this.glType = headerDataView.getUint32(1 * dataSize, littleEndian); // must be 0 for compressed textures\n this.glTypeSize = headerDataView.getUint32(2 * dataSize, littleEndian); // must be 1 for compressed textures\n this.glFormat = headerDataView.getUint32(3 * dataSize, littleEndian); // must be 0 for compressed textures\n this.glInternalFormat = headerDataView.getUint32(4 * dataSize, littleEndian); // the value of arg passed to gl.compressedTexImage2D(,,x,,,,)\n this.glBaseInternalFormat = headerDataView.getUint32(5 * dataSize, littleEndian); // specify GL_RGB, GL_RGBA, GL_ALPHA, etc (un-compressed only)\n this.pixelWidth = headerDataView.getUint32(6 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,x,,,)\n this.pixelHeight = headerDataView.getUint32(7 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage2D(,,,,x,,)\n this.pixelDepth = headerDataView.getUint32(8 * dataSize, littleEndian); // level 0 value of arg passed to gl.compressedTexImage3D(,,,,,x,,)\n this.numberOfArrayElements = headerDataView.getUint32(9 * dataSize, littleEndian); // used for texture arrays\n this.numberOfFaces = headerDataView.getUint32(10 * dataSize, littleEndian); // used for cubemap textures, should either be 1 or 6\n this.numberOfMipmapLevels = headerDataView.getUint32(11 * dataSize, littleEndian); // number of levels; disregard possibility of 0 for compressed textures\n this.bytesOfKeyValueData = headerDataView.getUint32(12 * dataSize, littleEndian); // the amount of space after the header for meta-data\n // value of zero is an indication to generate mipmaps @ runtime. Not usually allowed for compressed, so disregard.\n this.numberOfMipmapLevels = Math.max(1, this.numberOfMipmapLevels);\n if (this.pixelHeight === 0 || this.pixelDepth !== 0) {\n logger.warn(\"Only 2D textures currently supported.\");\n return;\n }\n if (this.numberOfArrayElements !== 0) {\n logger.warn(\"Texture arrays not currently supported.\");\n return;\n }\n if (this.numberOfFaces !== facesExpected) {\n logger.warn(\"Number of faces expected \" + facesExpected + \", but found \" + this.numberOfFaces + \".\");\n return;\n }\n // we now have a completely validated file, so could use existence of loadType as success\n // would need to make this more elaborate & adjust checks above to support more than one load type\n if (this.glType === 0) {\n this.loadType = COMPRESSED_2D;\n } else {\n this.loadType = TEX_2D;\n }\n }\n var _proto = KTXTexture.prototype;\n _proto.mipmaps = function mipmaps(loadMipmaps) {\n var mipmaps = [];\n // initialize width & height for level 1\n var dataOffset = HEADER_LEN + this.bytesOfKeyValueData;\n var width = this.pixelWidth;\n var height = this.pixelHeight;\n var mipmapCount = loadMipmaps ? this.numberOfMipmapLevels : 1;\n for(var level = 0; level < mipmapCount; level++){\n var imageSize = new Int32Array(this.arrayBuffer, this.baseOffset + dataOffset, 1)[0]; // size per face, since not supporting array cubemaps\n for(var face = 0; face < this.numberOfFaces; face++){\n var data = new Uint8Array(this.arrayBuffer, this.baseOffset + dataOffset + 4, imageSize);\n mipmaps.push({\n data: data,\n width: width,\n height: height\n });\n dataOffset += imageSize + 4; // size of the image + 4 for the imageSize field\n dataOffset += 3 - (imageSize + 3) % 4; // add padding for odd sized image\n }\n width = Math.max(1.0, width * 0.5);\n height = Math.max(1.0, height * 0.5);\n }\n return mipmaps;\n };\n return KTXTexture;\n}();\nfunction getKTXTextureOptions(data) {\n var tex = new KTXTexture(data, 1);\n var numberOfMipmapLevels = tex.numberOfMipmapLevels, pixelWidth = tex.pixelWidth, pixelHeight = tex.pixelHeight, glType = tex.glType, numberOfFaces = tex.numberOfFaces, glInternalFormat = tex.glInternalFormat, glFormat = tex.glFormat;\n var useMipmaps = numberOfMipmapLevels >= Math.floor(Math.log2(Math.max(pixelWidth, pixelHeight)) + 1);\n return {\n sourceType: exports.TextureSourceType.compressed,\n type: glType,\n target: numberOfFaces === 6 ? glContext.TEXTURE_CUBE_MAP : glContext.TEXTURE_2D,\n internalFormat: glInternalFormat,\n format: glFormat,\n mipmaps: tex.mipmaps(useMipmaps)\n };\n}\n\nvar TextureFactory = /*#__PURE__*/ function() {\n function TextureFactory() {\n this.reloadPending = {};\n }\n var _proto = TextureFactory.prototype;\n _proto.reload = function reload(texture) {\n var _this = this;\n return _async_to_generator(function() {\n var id, sourceOpts;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n id = texture.id;\n if (_this.reloadPending[id]) {\n return [\n 2\n ];\n }\n if (!texture.sourceFrom) return [\n 3,\n 2\n ];\n _this.reloadPending[id] = true;\n return [\n 4,\n _this.loadSource(texture.sourceFrom)\n ];\n case 1:\n sourceOpts = _state.sent();\n texture.updateSource(sourceOpts);\n _this.reloadPending[id] = false;\n return [\n 3,\n 3\n ];\n case 2:\n throw new Error(\"No source from.\");\n case 3:\n return [\n 2\n ];\n }\n });\n })();\n };\n _proto.canOffloadTexture = function canOffloadTexture(sourceFrom) {\n if (sourceFrom) {\n var type = sourceFrom.type;\n if (type === exports.TextureSourceType.compressed || type === exports.TextureSourceType.image) {\n var target = sourceFrom.target, map = sourceFrom.map;\n var url = sourceFrom.url;\n if (target === glContext.TEXTURE_CUBE_MAP) {\n return typeof map === \"object\" && !!map;\n }\n return isString(url) && url.length > 0;\n }\n if (type === exports.TextureSourceType.mipmaps) {\n var bin = sourceFrom.bin, mipmaps = sourceFrom.mipmaps;\n var target1 = sourceFrom.target, maps = sourceFrom.maps;\n var urls = sourceFrom.urls;\n if (bin) {\n return mipmaps.length > 0;\n }\n if (target1 === glContext.TEXTURE_CUBE_MAP) {\n return maps.every(function(map) {\n return typeof map === \"object\" && map;\n });\n }\n return urls.every(function(url) {\n return isString(url) && url.length > 0;\n });\n }\n }\n return false;\n };\n _proto.loadSource = function loadSource(sourceFrom, config) {\n var _this = this;\n return _async_to_generator(function() {\n var type, target, map, url, bin, mipmaps, urls, maps, cube, image, video, buffer, data, newTarget, newMipmaps, loadedMipmaps, loadedMipmaps1, loadedMipmaps2;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n type = sourceFrom.type, target = sourceFrom.target;\n map = sourceFrom.map;\n url = sourceFrom.url;\n bin = sourceFrom.bin, mipmaps = sourceFrom.mipmaps;\n urls = sourceFrom.urls;\n maps = sourceFrom.maps;\n if (!(target === glContext.TEXTURE_CUBE_MAP && type !== exports.TextureSourceType.mipmaps)) return [\n 3,\n 2\n ];\n return [\n 4,\n _this.loadCubeMap(map)\n ];\n case 1:\n cube = _state.sent();\n return [\n 2,\n _extends({}, config, {\n cube: cube,\n target: glContext.TEXTURE_CUBE_MAP,\n sourceType: exports.TextureSourceType.image,\n sourceFrom: {\n type: exports.TextureSourceType.image,\n map: _extends({}, map),\n target: glContext.TEXTURE_CUBE_MAP\n }\n })\n ];\n case 2:\n if (!(type === exports.TextureSourceType.image)) return [\n 3,\n 4\n ];\n return [\n 4,\n loadImage(url)\n ];\n case 3:\n image = _state.sent();\n return [\n 2,\n _extends({}, config, {\n image: image,\n sourceType: exports.TextureSourceType.image,\n sourceFrom: {\n type: type,\n url: url,\n target: glContext.TEXTURE_2D\n }\n })\n ];\n case 4:\n if (!(type === exports.TextureSourceType.video)) return [\n 3,\n 6\n ];\n return [\n 4,\n loadVideo(url)\n ];\n case 5:\n video = _state.sent();\n return [\n 2,\n _extends({}, config, {\n video: video,\n sourceType: exports.TextureSourceType.video\n })\n ];\n case 6:\n if (!(type === exports.TextureSourceType.compressed)) return [\n 3,\n 8\n ];\n return [\n 4,\n loadBinary(url)\n ];\n case 7:\n buffer = _state.sent();\n return [\n 2,\n _extends({}, getKTXTextureOptions(buffer), config, {\n sourceFrom: {\n url: url,\n type: exports.TextureSourceType.compressed\n }\n })\n ];\n case 8:\n if (!(type === exports.TextureSourceType.mipmaps)) return [\n 3,\n 17\n ];\n if (!bin) return [\n 3,\n 13\n ];\n return [\n 4,\n loadBinary(bin)\n ];\n case 9:\n data = _state.sent();\n newTarget = target != null ? target : glContext.TEXTURE_2D;\n newMipmaps = newTarget === glContext.TEXTURE_2D ? mipmaps.slice() : mipmaps.map(function(s) {\n return s.slice();\n });\n if (!(target === glContext.TEXTURE_CUBE_MAP)) return [\n 3,\n 11\n ];\n return [\n 4,\n Promise.all(mipmaps.map(function(mipmap) {\n return _this.loadMipmapImages(mipmap, data);\n }))\n ];\n case 10:\n loadedMipmaps = _state.sent();\n return [\n 3,\n 12\n ];\n case 11:\n loadedMipmaps = _this.loadMipmapImages(mipmaps, data);\n _state.label = 12;\n case 12:\n return [\n 2,\n _extends({}, config, {\n mipmaps: loadedMipmaps,\n target: newTarget,\n sourceType: exports.TextureSourceType.mipmaps,\n sourceFrom: {\n bin: bin,\n mipmaps: newMipmaps,\n target: newTarget,\n type: exports.TextureSourceType.mipmaps\n }\n })\n ];\n case 13:\n if (!(target === glContext.TEXTURE_2D || !target)) return [\n 3,\n 15\n ];\n return [\n 4,\n Promise.all(urls.map(function(url) {\n return loadImage(url);\n }))\n ];\n case 14:\n loadedMipmaps1 = _state.sent();\n return [\n 2,\n _extends({}, config, {\n mipmaps: loadedMipmaps1,\n target: glContext.TEXTURE_2D,\n sourceType: exports.TextureSourceType.mipmaps,\n sourceFrom: {\n type: type,\n urls: urls.slice(),\n target: glContext.TEXTURE_2D\n }\n })\n ];\n case 15:\n if (!(target === glContext.TEXTURE_CUBE_MAP)) return [\n 3,\n 17\n ];\n return [\n 4,\n Promise.all(maps.map(function(map) {\n return _this.loadCubeMap(map);\n }))\n ];\n case 16:\n loadedMipmaps2 = _state.sent();\n return [\n 2,\n _extends({}, config, {\n mipmaps: loadedMipmaps2,\n target: glContext.TEXTURE_CUBE_MAP,\n sourceType: exports.TextureSourceType.mipmaps,\n sourceFrom: {\n type: type,\n maps: maps.map(function(map) {\n return _extends({}, map);\n }),\n target: glContext.TEXTURE_CUBE_MAP\n }\n })\n ];\n case 17:\n throw new Error(\"Invalid resource type: \" + type + \".\");\n }\n });\n })();\n };\n _proto.loadMipmapImages = function loadMipmapImages(pointers, bin) {\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n Promise.all(pointers.map(function(pointer) {\n var blob = new Blob([\n new Uint8Array(bin, pointer[0], pointer[1])\n ]);\n return loadImage(blob);\n }))\n ];\n });\n })();\n };\n _proto.loadCubeMap = function loadCubeMap(cubemap) {\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n Promise.all(cubemap.map(function(key) {\n return loadImage(key);\n }))\n ];\n });\n })();\n };\n return TextureFactory;\n}();\nvar g;\nfunction getDefaultTextureFactory() {\n if (!g) {\n g = new TextureFactory();\n }\n return g;\n}\nfunction setDefaultTextureFactory(factory) {\n g = factory;\n}\n\n/**\n * 引擎接入暂时不需要实现\n */ var MaterialDataBlock = /*#__PURE__*/ function() {\n function MaterialDataBlock(props) {\n this.destroyed = false;\n var _props_name = props.name, name = _props_name === void 0 ? \"defaultDataBlock\" : _props_name;\n this.name = name;\n }\n var _proto = MaterialDataBlock.prototype;\n _proto.setUniformValues = function setUniformValues(uniformValue) {\n var _this = this;\n Object.keys(uniformValue).forEach(function(key) {\n _this.setUniformValue(key, uniformValue[key]);\n });\n };\n _proto.invalidAllFlags = function invalidAllFlags() {\n // OVERRIDE\n };\n _proto.updateUniformSubData = function updateUniformSubData(name, start, count) {\n // OVERRIDE\n };\n return MaterialDataBlock;\n}();\nfunction isUniformStruct(value) {\n return typeof value === \"object\" && value && value.length === undefined && _instanceof1(value, Texture);\n}\nfunction isUniformStructArray(value) {\n return value && value.length !== undefined && isUniformStruct(value[0]);\n}\n\nexports.MaterialRenderType = void 0;\n(function(MaterialRenderType) {\n MaterialRenderType[MaterialRenderType[\"normal\"] = 0] = \"normal\";\n MaterialRenderType[MaterialRenderType[\"transformFeedback\"] = 1] = \"transformFeedback\";\n})(exports.MaterialRenderType || (exports.MaterialRenderType = {}));\n/**\n * 用于设置材质默认名称的自增序号\n * @internal\n */ var seed$c = 1;\n/**\n * Material 抽象类\n */ var Material = /*#__PURE__*/ function(EffectsObject) {\n _inherits(Material, EffectsObject);\n function Material(engine, props) {\n var _this;\n _this = EffectsObject.call(this, engine) || this;\n _this.stringTags = {};\n _this.enabledMacros = {};\n _this.destroyed = false;\n _this.initialized = false;\n _this.shaderDirty = true;\n if (props) {\n var _props_name = props.name, name = _props_name === void 0 ? \"Material\" + seed$c++ : _props_name, _props_renderType = props.renderType, renderType = _props_renderType === void 0 ? 0 : _props_renderType, shader = props.shader, uniformSemantics = props.uniformSemantics;\n _this.name = name;\n _this.renderType = renderType; // TODO 没有地方用到\n _this.shaderSource = shader;\n _this.props = props;\n _this.uniformSemantics = _extends({}, uniformSemantics); // TODO 废弃,待移除\n } else {\n _this.name = \"Material\" + seed$c++;\n _this.renderType = 0;\n }\n return _this;\n }\n var _proto = Material.prototype;\n /**\n * 初始化 GPU 资源\n * @override\n */ _proto.initialize = function initialize() {\n // OVERRIDE\n };\n _proto.createShaderVariant = function createShaderVariant() {\n // OVERRIDE\n };\n _proto.use = function use(render, globalUniforms) {\n // OVERRIDE\n };\n _create_class(Material, [\n {\n key: \"shader\",\n get: function get() {\n return this._shader;\n },\n set: function set(value) {\n if (this._shader === value) {\n return;\n }\n this._shader = value;\n this.shaderDirty = true;\n }\n },\n {\n key: \"mainTexture\",\n get: /**\n * 材质的主纹理\n */ function get() {\n return this.getTexture(\"_MainTex\");\n },\n set: function set(value) {\n this.setTexture(\"_MainTex\", value);\n }\n },\n {\n key: \"color\",\n get: /**\n * 材质的主颜色\n */ function get() {\n return this.getColor(\"_Color\");\n },\n set: function set(value) {\n this.setColor(\"_Color\", value);\n }\n },\n {\n key: \"blending\",\n set: /******** effects-core 中会调用 引擎必须实现 ***********************/ /**\n * 设置 Material 的颜色融合开关\n * @param blending - 是否开启混合效果\n */ function set(blending) {}\n },\n {\n key: \"blendFunction\",\n set: /**\n * 分别指定 Material 的颜色混合函数乘数\n * @param func - 混合函数参数\n */ function set(func) {}\n },\n {\n key: \"blendEquation\",\n set: /**\n * 分别指定 Material 的颜色混合方式\n * @param equation - 混合方程参数\n */ function set(equation) {}\n },\n {\n key: \"depthTest\",\n set: /**\n * 设置 Material 的深度测试开关\n * @param value - 是否开启深度测试\n */ function set(value) {}\n },\n {\n key: \"depthMask\",\n set: /**\n * 设置 Material 的写入深度缓冲开关\n * @param value - 是否开启深度写入\n */ function set(value) {}\n },\n {\n key: \"stencilTest\",\n set: /**\n * 设置 Material 的模板测试开关\n * @param value - 是否开启模板测试\n */ function set(value) {}\n },\n {\n key: \"stencilRef\",\n set: /**\n * 分别指定 Material 的模板测试参考值\n * @param value - 模板测试参考值参数\n */ function set(value) {}\n },\n {\n key: \"stencilFunc\",\n set: /**\n * 分别指定 Material 的模板测试函数\n * @param value - 模板测试函数参数\n */ function set(value) {}\n },\n {\n key: \"stencilOpZPass\",\n set: /**\n * 分别指定 Material 的模板测试和深度测试都通过时使用的函数\n * @param value - 模板测试深度测试通过时的操作参数\n */ function set(value) {}\n },\n {\n key: \"culling\",\n set: /**\n * 设置 Material 的正反面剔除开关\n * @param value - 是否开启剔除\n */ function set(value) {}\n },\n {\n key: \"frontFace\",\n set: /**\n * 设置 Material 的正反面计算方向\n * @param value\n */ function set(value) {}\n },\n {\n key: \"cullFace\",\n set: /**\n * 设置 Material 要剔除的面\n * @param value - 剔除面参数\n */ function set(value) {}\n },\n {\n key: \"blendColor\",\n set: /***************************************************/ /******** effects-core 中暂无调用 引擎可以先不实现 ***********************/ /**\n * 设置 Material 的源和目标混合因子\n * @param color\n */ function set(color) {}\n },\n {\n key: \"depthRange\",\n set: /**\n * 设置 Material 的深度映射范围\n * @param value\n */ function set(value) {}\n },\n {\n key: \"depthFunc\",\n set: /**\n * 设置 Material 的深度比较函数\n * @param value - 深度测试函数参数\n */ function set(value) {}\n },\n {\n key: \"polygonOffsetFill\",\n set: /**\n * 设置 Material 的多边形偏移(实现类似深度偏移的效果)\n * @param value - 多边形偏移参数\n */ function set(value) {}\n },\n {\n key: \"polygonOffset\",\n set: /**\n * 指定 Material 计算深度值的比例因子 factor 和单位 units\n * @param value\n */ function set(value) {}\n },\n {\n key: \"sampleAlphaToCoverage\",\n set: /**\n * 设置 Material 的通过 alpha 值决定临时覆盖值计算的开关\n * @param value - 是否开启 alpha 抖动\n */ function set(value) {}\n },\n {\n key: \"stencilMask\",\n set: /**\n * 分别指定 Material 的模板测试掩码\n * @param value - 模板测试写入掩码参数\n */ function set(value) {}\n },\n {\n key: \"stencilOpFail\",\n set: /**\n * 分别指定 Material 模板测试失败时要使用的函数\n * @param value - 模板测试失败时的操作参数\n */ function set(value) {}\n },\n {\n key: \"stencilOpZFail\",\n set: /**\n * 分别指定 Material 模板测试通过但深度测试失败时要使用的函数\n * @param value - 模板测试深度测试失败时的操作参数\n */ function set(value) {}\n }\n ]);\n return Material;\n}(EffectsObject);\n\nvar MaskProcessor = /*#__PURE__*/ function() {\n function MaskProcessor(engine) {\n this.engine = engine;\n this.maskable = null;\n this.stencilClearAction = {\n stencilAction: exports.TextureLoadAction.clear\n };\n }\n var _proto = MaskProcessor.prototype;\n _proto.getRefValue = function getRefValue() {\n return 1;\n };\n _proto.getMaskMode = function getMaskMode(data) {\n var maskMode = exports.MaskMode.NONE;\n if (data.mask) {\n var _data_mask = data.mask, _data_mask_mask = _data_mask.mask, mask = _data_mask_mask === void 0 ? false : _data_mask_mask, _data_mask_mode = _data_mask.mode, mode = _data_mask_mode === void 0 ? exports.MaskMode.NONE : _data_mask_mode, ref = _data_mask.ref;\n if (mask) {\n maskMode = exports.MaskMode.MASK;\n } else if (mode === ObscuredMode.OBSCURED || mode === ObscuredMode.REVERSE_OBSCURED) {\n maskMode = mode === ObscuredMode.OBSCURED ? exports.MaskMode.OBSCURED : exports.MaskMode.REVERSE_OBSCURED;\n if (ref) {\n this.maskable = ref;\n }\n }\n }\n return maskMode;\n };\n _proto.drawStencilMask = function drawStencilMask(renderer) {\n if (this.maskable) {\n renderer.clear(this.stencilClearAction);\n this.maskable.drawStencilMask(renderer);\n }\n };\n return MaskProcessor;\n}();\n\nexports.ShaderCompileResultStatus = void 0;\n(function(ShaderCompileResultStatus) {\n ShaderCompileResultStatus[ShaderCompileResultStatus[\"noShader\"] = 0] = \"noShader\";\n ShaderCompileResultStatus[ShaderCompileResultStatus[\"success\"] = 1] = \"success\";\n ShaderCompileResultStatus[ShaderCompileResultStatus[\"fail\"] = 2] = \"fail\";\n ShaderCompileResultStatus[ShaderCompileResultStatus[\"compiling\"] = 3] = \"compiling\";\n})(exports.ShaderCompileResultStatus || (exports.ShaderCompileResultStatus = {}));\nexports.GLSLVersion = void 0;\n(function(GLSLVersion) {\n GLSLVersion[\"GLSL1\"] = \"100\";\n GLSLVersion[\"GLSL3\"] = \"300 es\";\n})(exports.GLSLVersion || (exports.GLSLVersion = {}));\nvar ShaderVariant = /*#__PURE__*/ function(EffectsObject) {\n _inherits(ShaderVariant, EffectsObject);\n function ShaderVariant(engine, source) {\n var _this;\n _this = EffectsObject.call(this, engine) || this;\n _this.source = source;\n return _this;\n }\n return ShaderVariant;\n}(EffectsObject);\nexports.Shader = /*#__PURE__*/ function(EffectsObject) {\n _inherits(Shader, EffectsObject);\n function Shader() {\n return EffectsObject.apply(this, arguments);\n }\n var _proto = Shader.prototype;\n _proto.createVariant = function createVariant(macros) {\n var shaderMacros = [];\n if (macros) {\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(macros)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n shaderMacros.push([\n key,\n macros[key]\n ]);\n }\n }\n var shaderVariant = this.engine.getShaderLibrary().createShader(this.shaderData, shaderMacros);\n shaderVariant.shader = this;\n return shaderVariant;\n };\n _proto.fromData = function fromData(data) {\n EffectsObject.prototype.fromData.call(this, data);\n this.shaderData = data;\n };\n return Shader;\n}(EffectsObject);\nexports.Shader = __decorate([\n effectsClass(DataType.Shader)\n], exports.Shader);\n\nvar EFFECTS_COPY_MESH_NAME = \"effects-internal-copy\";\nvar COPY_MESH_SHADER_ID = \"effects-internal-copy-mesh\";\nvar COPY_VERTEX_SHADER = \"\\nprecision highp float;\\nattribute vec2 aPos;\\nvarying vec2 vTex;\\nvoid main(){\\n gl_Position = vec4(aPos,0.,1.0);\\n vTex = (aPos + vec2(1.0))/2.;\\n}\";\nvar COPY_FRAGMENT_SHADER = \"precision mediump float;\\nvarying vec2 vTex;\\n\\n#ifdef DEPTH_TEXTURE\\nuniform sampler2D uDepth;\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvoid main(){\\n #ifdef DEPTH_TEXTURE\\n gl_FragDepthEXT = texture2D(uDepth,vTex).r;\\n #endif\\n}\\n\";\nfunction createCopyShader(level, writeDepth) {\n var webgl2 = level === 2;\n return {\n name: EFFECTS_COPY_MESH_NAME,\n vertex: COPY_VERTEX_SHADER,\n fragment: COPY_FRAGMENT_SHADER,\n glslVersion: webgl2 ? exports.GLSLVersion.GLSL3 : exports.GLSLVersion.GLSL1,\n macros: [\n [\n \"DEPTH_TEXTURE\",\n !!writeDepth\n ]\n ],\n // @ts-expect-error\n cacheId: COPY_MESH_SHADER_ID + +writeDepth\n };\n}\n\nvar def = {\n format: glContext.RGBA,\n type: glContext.UNSIGNED_BYTE,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE\n};\nvar disposeSymbol = Symbol(\"dispose\");\nvar PassTextureCache = /*#__PURE__*/ function() {\n function PassTextureCache(engine) {\n this.textureCache = {};\n this.textureRef = {};\n this.engine = engine;\n }\n var _proto = PassTextureCache.prototype;\n _proto.requestColorAttachmentTexture = function requestColorAttachmentTexture(request) {\n var _this = this;\n var width = request.width, height = request.height, name = request.name;\n var options = {\n sourceType: exports.TextureSourceType.framebuffer,\n data: {\n width: width,\n height: height\n },\n name: name\n };\n var keys = [\n name\n ];\n Object.getOwnPropertyNames(def).forEach(function(name) {\n var _request_name;\n var value = (_request_name = request[name]) != null ? _request_name : def[name];\n options[name] = value;\n keys.push(name, value);\n });\n var cacheId = keys.join(\":\");\n var tex = this.textureCache[cacheId];\n if (tex) {\n this.textureRef[cacheId]++;\n } else {\n var engine = this.engine;\n assertExist(engine);\n tex = Texture.create(engine, options);\n this.textureCache[cacheId] = tex;\n this.textureRef[cacheId] = 1;\n // @ts-expect-error\n tex[disposeSymbol] = tex.dispose;\n tex.dispose = function() {\n return _this.removeTexture(cacheId);\n };\n }\n return tex;\n };\n _proto.removeTexture = function removeTexture(id) {\n var refCount = this.textureRef[id];\n if (refCount <= 1) {\n if (refCount < 0) {\n console.error(\"Ref count < 0.\");\n }\n var tex = this.textureCache[id];\n if (tex) {\n // @ts-expect-error\n tex[disposeSymbol]();\n // @ts-expect-error\n tex.dispose = tex[disposeSymbol];\n }\n delete this.textureCache[id];\n delete this.textureRef[id];\n } else {\n this.textureRef[id] = refCount - 1;\n }\n };\n _proto.dispose = function dispose() {\n var _this = this;\n Object.keys(this.textureCache).forEach(function(key) {\n var texture = _this.textureCache[key];\n // @ts-expect-error\n texture[disposeSymbol]();\n // @ts-expect-error\n texture.dispose = texture[disposeSymbol];\n });\n this.textureCache = {};\n this.textureRef = {};\n this.engine = undefined;\n };\n return PassTextureCache;\n}();\n\nvar SemanticMap = /*#__PURE__*/ function() {\n function SemanticMap(semantics) {\n if (semantics === void 0) semantics = {};\n this.semantics = _extends({}, semantics);\n }\n var _proto = SemanticMap.prototype;\n _proto.toObject = function toObject() {\n return _extends({}, this.semantics);\n };\n _proto.setSemantic = function setSemantic(name, value) {\n if (value === undefined) {\n delete this.semantics[name];\n } else {\n this.semantics[name] = value;\n }\n };\n _proto.getSemanticValue = function getSemanticValue(name, state) {\n var ret = this.semantics[name];\n if (isFunction(ret)) {\n return ret(state);\n }\n return ret;\n };\n _proto.hasSemanticValue = function hasSemanticValue(name) {\n return name in this.semantics;\n };\n _proto.dispose = function dispose() {\n var _this = this;\n Object.keys(this.semantics).forEach(function(name) {\n delete _this.semantics[name];\n });\n };\n return SemanticMap;\n}();\n\nvar _obj$9;\nvar BYTES_TYPE_MAP = (_obj$9 = {}, _obj$9[glContext.FLOAT] = Float32Array.BYTES_PER_ELEMENT, _obj$9[glContext.INT] = Int32Array.BYTES_PER_ELEMENT, _obj$9[glContext.SHORT] = Int16Array.BYTES_PER_ELEMENT, _obj$9[glContext.BYTE] = Int8Array.BYTES_PER_ELEMENT, _obj$9);\n/**\n * Geometry 抽象类\n */ var Geometry = /*#__PURE__*/ function(EffectsObject) {\n _inherits(Geometry, EffectsObject);\n function Geometry() {\n var _this;\n _this = EffectsObject.apply(this, arguments) || this;\n /**\n * Geometry 的名称\n */ _this.name = \"\";\n /**\n * 子网格数据\n */ _this.subMeshes = [];\n return _this;\n }\n var _proto = Geometry.prototype;\n /**\n * 初始化 GPU 资源\n * @override\n */ _proto.initialize = function initialize() {\n // OVERRIDE\n };\n /**\n * 几何数据刷新\n */ _proto.flush = function flush() {\n // OVERRIDE\n };\n return Geometry;\n}(EffectsObject);\nfunction generateEmptyTypedArray(type) {\n if (type === glContext.INT) {\n return new Int32Array(0);\n }\n if (type === glContext.SHORT) {\n return new Int16Array(0);\n }\n return new Float32Array(0);\n}\n\n/**\n * 欧拉角顺序\n */ var EulerOrder;\n(function(EulerOrder) {\n EulerOrder[EulerOrder[\"XYZ\"] = 0] = \"XYZ\";\n EulerOrder[EulerOrder[\"XZY\"] = 1] = \"XZY\";\n EulerOrder[EulerOrder[\"YXZ\"] = 2] = \"YXZ\";\n EulerOrder[EulerOrder[\"YZX\"] = 3] = \"YZX\";\n EulerOrder[EulerOrder[\"ZXY\"] = 4] = \"ZXY\";\n EulerOrder[EulerOrder[\"ZYX\"] = 5] = \"ZYX\";\n})(EulerOrder || (EulerOrder = {}));\n/**\n * 欧拉角\n */ var Euler = /*#__PURE__*/ function() {\n function Euler(x, y, z, order) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n if (order === void 0) order = Euler.DEFAULT_ORDER;\n this.x = x;\n this.y = y;\n this.z = z;\n this.order = order;\n }\n var _proto = Euler.prototype;\n /**\n * 设置欧拉角\n * @param x - x 方向分量\n * @param y - y 方向分量\n * @param z - z 方向分量\n * @param [order] - 欧拉角顺序\n * @returns\n */ _proto.set = function set(x, y, z, order) {\n if (order === void 0) order = this.order;\n this.x = x;\n this.y = y;\n this.z = z;\n this.order = order;\n return this;\n };\n _proto.setZero = function setZero(order) {\n if (order === void 0) order = this.order;\n return this.set(0, 0, 0, order);\n };\n /**\n * 通过矩阵设置欧拉角\n * @param m - 矩阵\n * @param [order] - 欧拉角顺序\n * @returns\n */ _proto.setFromRotationMatrix4 = function setFromRotationMatrix4(m, order) {\n if (order === void 0) order = this.order;\n var te = m.elements;\n var m11 = te[0];\n var m12 = te[4];\n var m13 = te[8];\n var m21 = te[1];\n var m22 = te[5];\n var m23 = te[9];\n var m31 = te[2];\n var m32 = te[6];\n var m33 = te[10];\n switch(order){\n case EulerOrder.XYZ:\n this.y = Math.asin(clamp$1(m13, -1, 1));\n if (Math.abs(m13) < 0.9999999) {\n this.x = Math.atan2(-m23, m33);\n this.z = Math.atan2(-m12, m11);\n } else {\n this.x = Math.atan2(m32, m22);\n this.z = 0;\n }\n break;\n case EulerOrder.YXZ:\n this.x = Math.asin(-clamp$1(m23, -1, 1));\n if (Math.abs(m23) < 0.9999999) {\n this.y = Math.atan2(m13, m33);\n this.z = Math.atan2(m21, m22);\n } else {\n this.y = Math.atan2(-m31, m11);\n this.z = 0;\n }\n break;\n case EulerOrder.ZXY:\n this.x = Math.asin(clamp$1(m32, -1, 1));\n if (Math.abs(m32) < 0.9999999) {\n this.y = Math.atan2(-m31, m33);\n this.z = Math.atan2(-m12, m22);\n } else {\n this.y = 0;\n this.z = Math.atan2(m21, m11);\n }\n break;\n case EulerOrder.ZYX:\n this.y = Math.asin(-clamp$1(m31, -1, 1));\n if (Math.abs(m31) < 0.9999999) {\n this.x = Math.atan2(m32, m33);\n this.z = Math.atan2(m21, m11);\n } else {\n this.x = 0;\n this.z = Math.atan2(-m12, m22);\n }\n break;\n case EulerOrder.YZX:\n this.z = Math.asin(clamp$1(m21, -1, 1));\n if (Math.abs(m21) < 0.9999999) {\n this.x = Math.atan2(-m23, m22);\n this.y = Math.atan2(-m31, m11);\n } else {\n this.x = 0;\n this.y = Math.atan2(m13, m33);\n }\n break;\n case EulerOrder.XZY:\n this.z = Math.asin(-clamp$1(m12, -1, 1));\n if (Math.abs(m12) < 0.9999999) {\n this.x = Math.atan2(m32, m22);\n this.y = Math.atan2(m13, m11);\n } else {\n this.x = Math.atan2(-m23, m33);\n this.y = 0;\n }\n break;\n default:\n console.error(\"setFromRotationMatrix: unknown order: \" + order);\n }\n this.x *= RAD2DEG;\n this.y *= RAD2DEG;\n this.z *= RAD2DEG;\n this.order = order;\n return this;\n };\n /**\n * 通过四元数设置欧拉角\n * @param quat - 四元数\n * @param [order] - 欧拉角顺序\n * @returns\n */ _proto.setFromQuaternion = function setFromQuaternion(quat, order) {\n if (order === void 0) order = this.order;\n var matrix = Euler.tempMat0;\n matrix.setFromQuaternion(quat);\n return this.setFromRotationMatrix4(matrix, order);\n };\n /**\n * 通过三维向量设置欧拉角\n * @param v - 三维向量\n * @param [order] - 欧拉角顺序\n * @returns\n */ _proto.setFromVector3 = function setFromVector3(v, order) {\n if (order === void 0) order = this.order;\n return this.set(v.x, v.y, v.z, order);\n };\n /**\n * 通过数组设置欧拉角\n * @param array - 数组\n * @param [offset=0] - 偏移\n * @param [order] - 欧拉角顺序\n * @returns\n */ _proto.setFromArray = function setFromArray(array, offset, order) {\n if (offset === void 0) offset = 0;\n if (order === void 0) order = this.order;\n var _array_offset;\n this.x = (_array_offset = array[offset]) != null ? _array_offset : 0;\n var _array_;\n this.y = (_array_ = array[offset + 1]) != null ? _array_ : 0;\n var _array_1;\n this.z = (_array_1 = array[offset + 2]) != null ? _array_1 : 0;\n var _array_2;\n this.order = (_array_2 = array[offset + 3]) != null ? _array_2 : order;\n return this;\n };\n /**\n * 克隆欧拉角\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Euler(this.x, this.y, this.z, this.order);\n };\n /**\n * 复制欧拉角\n * @param euler - 复制对象\n * @returns 复制结果\n */ _proto.copyFrom = function copyFrom(euler) {\n this.x = euler.x;\n this.y = euler.y;\n this.z = euler.z;\n this.order = euler.order;\n return this;\n };\n _proto.add = function add(euler) {\n if (this.order != euler.order) {\n console.error(\"add euler with different order\");\n return this;\n }\n this.x += euler.x;\n this.y += euler.y;\n this.z += euler.z;\n return this;\n };\n _proto.addEulers = function addEulers(left, right) {\n if (left.order != right.order) {\n console.error(\"add euler with different order\");\n return this;\n }\n this.x = left.x + right.x;\n this.y = left.y + right.y;\n this.z = left.z + right.z;\n this.order = left.order;\n return this;\n };\n _proto.negate = function negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n };\n /**\n * 修改欧拉角顺序\n * @param newOrder - 欧拉角顺序\n * @returns 修改结果\n */ _proto.reorder = function reorder(newOrder) {\n var quaternion = new Quaternion();\n quaternion.setFromEuler(this);\n return this.setFromQuaternion(quaternion, newOrder);\n };\n /**\n * 通过四元数旋转向量\n * @param v - 待旋转向量\n * @param out - 旋转结果,如果没有传入直接覆盖输入值\n * @returns\n */ _proto.rotateVector3 = function rotateVector3(v, out) {\n var q = Euler.tempQuat0;\n return q.setFromEuler(this).rotateVector3(v, out);\n };\n /**\n * 欧拉角相等判断\n * @param euler - 欧拉角\n * @returns 判断结果\n */ _proto.equals = function equals(euler) {\n return euler.x === this.x && euler.y === this.y && euler.z === this.z && euler.order === this.order;\n };\n /**\n * 欧拉角保存于三维向量\n * @param vec - 目标保存对象\n * @returns 保存结果\n */ _proto.toVector3 = function toVector3(vec) {\n return vec.set(this.x, this.y, this.z);\n };\n /**\n * 欧拉角转数组\n * @returns 保存结果\n */ _proto.toArray = function toArray() {\n return [\n this.x,\n this.y,\n this.z\n ];\n };\n /**\n * 欧拉角转四元数\n * @param quat - 目标四元数\n * @returns 目标四元数\n */ _proto.toQuaternion = function toQuaternion(quat) {\n var _this = this, x = _this.x, y = _this.y, z = _this.z, order = _this.order;\n var c1 = Math.cos(x * DEG2RAD * 0.5);\n var c2 = Math.cos(y * DEG2RAD * 0.5);\n var c3 = Math.cos(z * DEG2RAD * 0.5);\n var s1 = Math.sin(x * DEG2RAD * 0.5);\n var s2 = Math.sin(y * DEG2RAD * 0.5);\n var s3 = Math.sin(z * DEG2RAD * 0.5);\n switch(order){\n case EulerOrder.XYZ:\n quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3);\n break;\n case EulerOrder.YXZ:\n quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3);\n break;\n case EulerOrder.ZXY:\n quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3);\n break;\n case EulerOrder.ZYX:\n quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3);\n break;\n case EulerOrder.YZX:\n quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3);\n break;\n case EulerOrder.XZY:\n quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3);\n break;\n default:\n console.error(\"unknown euler order: \" + order);\n }\n return quat;\n };\n /**\n * 欧拉角转矩阵\n * @param mat - 目标矩阵\n * @returns 返回目标矩阵\n */ _proto.toMatrix4 = function toMatrix4(mat) {\n var me = mat.elements;\n var _this = this, x = _this.x, y = _this.y, z = _this.z, order = _this.order;\n var cosX = Math.cos(x * DEG2RAD), sinX = Math.sin(x * DEG2RAD);\n var cosY = Math.cos(y * DEG2RAD), sinY = Math.sin(y * DEG2RAD);\n var cosZ = Math.cos(z * DEG2RAD), sinZ = Math.sin(z * DEG2RAD);\n if (order === EulerOrder.XYZ) {\n var cosXcosZ = cosX * cosZ;\n var cosXsinZ = cosX * sinZ;\n var sinXcosZ = sinX * cosZ;\n var sinXsinZ = sinX * sinZ;\n me[0] = cosY * cosZ;\n me[4] = -cosY * sinZ;\n me[8] = sinY;\n me[1] = cosXsinZ + sinXcosZ * sinY;\n me[5] = cosXcosZ - sinXsinZ * sinY;\n me[9] = -sinX * cosY;\n me[2] = sinXsinZ - cosXcosZ * sinY;\n me[6] = sinXcosZ + cosXsinZ * sinY;\n me[10] = cosX * cosY;\n } else if (order === EulerOrder.YXZ) {\n var cosYcosZ = cosY * cosZ;\n var cosYsinZ = cosY * sinZ;\n var sinYcosZ = sinY * cosZ;\n var sinYsinZ = sinY * sinZ;\n me[0] = cosYcosZ + sinYsinZ * sinX;\n me[4] = sinYcosZ * sinX - cosYsinZ;\n me[8] = cosX * sinY;\n me[1] = cosX * sinZ;\n me[5] = cosX * cosZ;\n me[9] = -sinX;\n me[2] = cosYsinZ * sinX - sinYcosZ;\n me[6] = sinYsinZ + cosYcosZ * sinX;\n me[10] = cosX * cosY;\n } else if (order === EulerOrder.ZXY) {\n var cosYcosZ1 = cosY * cosZ;\n var cosYsinZ1 = cosY * sinZ;\n var sinYcosZ1 = sinY * cosZ;\n var sinYsinZ1 = sinY * sinZ;\n me[0] = cosYcosZ1 - sinYsinZ1 * sinX;\n me[4] = -cosX * sinZ;\n me[8] = sinYcosZ1 + cosYsinZ1 * sinX;\n me[1] = cosYsinZ1 + sinYcosZ1 * sinX;\n me[5] = cosX * cosZ;\n me[9] = sinYsinZ1 - cosYcosZ1 * sinX;\n me[2] = -cosX * sinY;\n me[6] = sinX;\n me[10] = cosX * cosY;\n } else if (order === EulerOrder.ZYX) {\n var cosXcosZ1 = cosX * cosZ;\n var cosXsinZ1 = cosX * sinZ;\n var sinXcosZ1 = sinX * cosZ;\n var sinXsinZ1 = sinX * sinZ;\n me[0] = cosY * cosZ;\n me[4] = sinXcosZ1 * sinY - cosXsinZ1;\n me[8] = cosXcosZ1 * sinY + sinXsinZ1;\n me[1] = cosY * sinZ;\n me[5] = sinXsinZ1 * sinY + cosXcosZ1;\n me[9] = cosXsinZ1 * sinY - sinXcosZ1;\n me[2] = -sinY;\n me[6] = sinX * cosY;\n me[10] = cosX * cosY;\n } else if (order === EulerOrder.YZX) {\n var cosXcosY = cosX * cosY;\n var cosXsinY = cosX * sinY;\n var sinXcosY = sinX * cosY;\n var sinXsinY = sinX * sinY;\n me[0] = cosY * cosZ;\n me[4] = sinXsinY - cosXcosY * sinZ;\n me[8] = sinXcosY * sinZ + cosXsinY;\n me[1] = sinZ;\n me[5] = cosX * cosZ;\n me[9] = -sinX * cosZ;\n me[2] = -sinY * cosZ;\n me[6] = cosXsinY * sinZ + sinXcosY;\n me[10] = cosXcosY - sinXsinY * sinZ;\n } else if (order === EulerOrder.XZY) {\n var cosXcosY1 = cosX * cosY;\n var cosXsinY1 = cosX * sinY;\n var sinXcosY1 = sinX * cosY;\n var sinXsinY1 = sinX * sinY;\n me[0] = cosY * cosZ;\n me[4] = -sinZ;\n me[8] = sinY * cosZ;\n me[1] = cosXcosY1 * sinZ + sinXsinY1;\n me[5] = cosX * cosZ;\n me[9] = cosXsinY1 * sinZ - sinXcosY1;\n me[2] = sinXcosY1 * sinZ - cosXsinY1;\n me[6] = sinX * cosZ;\n me[10] = sinXsinY1 * sinZ + cosXcosY1;\n } else {\n console.error(\"toMatrix4: Invalid order \" + order);\n }\n // bottom row\n me[3] = 0;\n me[7] = 0;\n me[11] = 0;\n // last column\n me[12] = 0;\n me[13] = 0;\n me[14] = 0;\n me[15] = 1;\n return mat;\n };\n /**\n * 通过矩阵创建欧拉角\n * @param m - 矩阵\n * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n * @returns 创建结果\n */ Euler.fromRotationMatrix4 = function fromRotationMatrix4(m, order) {\n if (order === void 0) order = Euler.DEFAULT_ORDER;\n return new Euler().setFromRotationMatrix4(m, order);\n };\n /**\n * 通过四元数创建欧拉角\n * @param quat - 四元数\n * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n * @returns 创建结果\n */ Euler.fromQuaternion = function fromQuaternion(quat, order) {\n if (order === void 0) order = Euler.DEFAULT_ORDER;\n return new Euler().setFromQuaternion(quat, order);\n };\n /**\n * 通过三维向量创建欧拉角\n * @param v - 三维向量\n * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n * @returns 创建结果\n */ Euler.fromVector3 = function fromVector3(v, order) {\n if (order === void 0) order = Euler.DEFAULT_ORDER;\n return new Euler().setFromVector3(v, order);\n };\n /**\n * 通过数组创建欧拉角\n * @param array - 数组\n * @param [offset=0] - 偏移\n * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n * @returns 创建结果\n */ Euler.fromArray = function fromArray(array, offset, order) {\n if (offset === void 0) offset = 0;\n if (order === void 0) order = Euler.DEFAULT_ORDER;\n return new Euler().setFromArray(array, offset, order);\n };\n return Euler;\n}();\nEuler.DEFAULT_ORDER = EulerOrder.ZYX;\nEuler.tempQuat0 = new Quaternion();\nEuler.tempMat0 = new Matrix4$1();\n\n/**\n * 三维矩阵(列优先矩阵)\n */ var Matrix3 = /*#__PURE__*/ function() {\n function Matrix3(m11, m21, m31, m12, m22, m32, m13, m23, m33) {\n if (m11 === void 0) m11 = 1;\n if (m21 === void 0) m21 = 0;\n if (m31 === void 0) m31 = 0;\n if (m12 === void 0) m12 = 0;\n if (m22 === void 0) m22 = 1;\n if (m32 === void 0) m32 = 0;\n if (m13 === void 0) m13 = 0;\n if (m23 === void 0) m23 = 0;\n if (m33 === void 0) m33 = 1;\n this.elements = [\n m11,\n m21,\n m31,\n m12,\n m22,\n m32,\n m13,\n m23,\n m33\n ];\n }\n var _proto = Matrix3.prototype;\n /**\n * 设置矩阵\n * @param m11 - 第 1 行,第 1 列\n * @param m21 - 第 2 行,第 1 列\n * @param m31 - 第 3 行,第 1 列\n * @param m12 - 第 1 行,第 2 列\n * @param m22 - 第 2 行,第 2 列\n * @param m32 - 第 3 行,第 2 列\n * @param m13 - 第 1 行,第 3 列\n * @param m23 - 第 2 行,第 3 列\n * @param m33 - 第 3 行,第 3 列\n * @returns\n */ _proto.set = function set(m11, m21, m31, m12, m22, m32, m13, m23, m33) {\n var e = this.elements;\n e[0] = m11;\n e[3] = m12;\n e[6] = m13;\n e[1] = m21;\n e[4] = m22;\n e[7] = m23;\n e[2] = m31;\n e[5] = m32;\n e[8] = m33;\n return this;\n };\n /**\n * 设置矩阵通过行优先数据\n * @param m11 - 第 1 行,第 1 列\n * @param m12 - 第 1 行,第 2 列\n * @param m13 - 第 1 行,第 3 列\n * @param m21 - 第 2 行,第 1 列\n * @param m22 - 第 2 行,第 2 列\n * @param m23 - 第 2 行,第 3 列\n * @param m31 - 第 3 行,第 1 列\n * @param m32 - 第 3 行,第 2 列\n * @param m33 - 第 3 行,第 3 列\n * @returns 矩阵\n */ _proto.setFromRowMajorData = function setFromRowMajorData(m11, m12, m13, m21, m22, m23, m31, m32, m33) {\n var e = this.elements;\n e[0] = m11;\n e[3] = m12;\n e[6] = m13;\n e[1] = m21;\n e[4] = m22;\n e[7] = m23;\n e[2] = m31;\n e[5] = m32;\n e[8] = m33;\n return this;\n };\n /**\n * 通过列向量设置矩阵\n * @param c1 - 第一列\n * @param c2 - 第二列\n * @param c3 - 第三列\n * @returns 矩阵\n */ _proto.setFromColumnVectors = function setFromColumnVectors(c1, c2, c3) {\n return this.set(c1.x, c1.y, c1.z, c2.x, c2.y, c2.z, c3.x, c3.y, c3.z);\n };\n /**\n * 通过四阶矩阵设置三阶矩阵\n * @param m - 四阶矩阵\n * @returns 矩阵\n */ _proto.setFromMatrix4 = function setFromMatrix4(m) {\n var me = m.elements;\n return this.set(me[0], me[1], me[2], me[4], me[5], me[6], me[8], me[9], me[10]);\n };\n /**\n * 通过数组设置矩阵\n * @param array - 数组\n * @param [offset=0] - 起始偏移值\n * @returns 矩阵\n */ _proto.setFromArray = function setFromArray(array, offset) {\n if (offset === void 0) offset = 0;\n for(var i = 0; i < 9; i++){\n this.elements[i] = array[offset + i];\n }\n return this;\n };\n /**\n * 通过四元数设置矩阵\n * @param quat - 四元数\n * @returns 矩阵\n */ _proto.setFromQuaternion = function setFromQuaternion(quat) {\n var x = quat.x, y = quat.y, z = quat.z, w = quat.w;\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var te = this.elements;\n te[0] = 1 - (yy + zz);\n te[1] = xy + wz;\n te[2] = xz - wy;\n te[3] = xy - wz;\n te[4] = 1 - (xx + zz);\n te[5] = yz + wx;\n te[6] = xz + wy;\n te[7] = yz - wx;\n te[8] = 1 - (xx + yy);\n return this;\n };\n /**\n * 矩阵清零\n * @returns 零矩阵\n */ _proto.setZero = function setZero() {\n for(var i = 0; i < 9; i++){\n this.elements[i] = 0;\n }\n return this;\n };\n /**\n * 矩阵单位化\n * @returns 单位矩阵\n */ _proto.identity = function identity() {\n return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);\n };\n /**\n * 矩阵克隆\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n var e = this.elements;\n return new Matrix3(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8]);\n };\n /**\n * 矩阵复制\n * @param m - 复制对象\n * @returns 复制结果\n */ _proto.copyFrom = function copyFrom(m) {\n this.elements = [].concat(m.elements);\n return this;\n };\n /**\n * 得到列向量\n * @param i - 列向量索引,从 0 开始\n * @returns 列向量\n */ _proto.getColumnVector = function getColumnVector(i, v) {\n return v.set(this.elements[i * 3], this.elements[i * 3 + 1], this.elements[i * 3 + 2]);\n };\n /**\n * 矩阵缩放\n * @param sx - x 轴缩放分量\n * @param sy - y 轴缩放分量\n * @returns 缩放结果\n */ _proto.scale = function scale(sx, sy) {\n var e = this.elements;\n e[0] *= sx;\n e[3] *= sx;\n e[6] *= sx;\n e[1] *= sy;\n e[4] *= sy;\n e[7] *= sy;\n return this;\n };\n /**\n * 矩阵旋转\n * @param theta - 旋转角度(弧度)\n * @returns 旋转结果\n */ _proto.rotate = function rotate(theta) {\n var c = Math.cos(theta);\n var s = Math.sin(theta);\n var e = this.elements;\n var m11 = e[0], m12 = e[3], m13 = e[6];\n var m21 = e[1], m22 = e[4], m23 = e[7];\n e[0] = c * m11 + s * m21;\n e[3] = c * m12 + s * m22;\n e[6] = c * m13 + s * m23;\n e[1] = -s * m11 + c * m21;\n e[4] = -s * m12 + c * m22;\n e[7] = -s * m13 + c * m23;\n return this;\n };\n /**\n * 矩阵平移\n * @param x - x 轴平移分量\n * @param y - y 轴平移分量\n * @returns 平移结果\n */ _proto.translate = function translate(x, y) {\n var e = this.elements;\n e[0] += x * e[2];\n e[3] += x * e[5];\n e[6] += x * e[8];\n e[1] += y * e[2];\n e[4] += y * e[5];\n e[7] += y * e[8];\n return this;\n };\n /**\n * 矩阵右乘\n * @param right - 相乘矩阵\n * @returns 右乘结果\n */ _proto.multiply = function multiply(right) {\n if (typeof right === \"number\") {\n for(var i = 0; i < 9; i++){\n this.elements[i] *= right;\n }\n return this;\n } else {\n return this.multiplyMatrices(this, right);\n }\n };\n /**\n * 矩阵左乘\n * @param left - 相乘矩阵\n * @returns 左乘结果\n */ _proto.premultiply = function premultiply(left) {\n return this.multiplyMatrices(left, this);\n };\n /**\n * 矩阵乘法\n * @param left - 矩阵\n * @param right - 矩阵\n * @returns 相乘结果\n */ _proto.multiplyMatrices = function multiplyMatrices(left, right) {\n var ae = left.elements;\n var be = right.elements;\n var te = this.elements;\n var a11 = ae[0], a12 = ae[3], a13 = ae[6];\n var a21 = ae[1], a22 = ae[4], a23 = ae[7];\n var a31 = ae[2], a32 = ae[5], a33 = ae[8];\n var b11 = be[0], b12 = be[3], b13 = be[6];\n var b21 = be[1], b22 = be[4], b23 = be[7];\n var b31 = be[2], b32 = be[5], b33 = be[8];\n te[0] = a11 * b11 + a12 * b21 + a13 * b31;\n te[3] = a11 * b12 + a12 * b22 + a13 * b32;\n te[6] = a11 * b13 + a12 * b23 + a13 * b33;\n te[1] = a21 * b11 + a22 * b21 + a23 * b31;\n te[4] = a21 * b12 + a22 * b22 + a23 * b32;\n te[7] = a21 * b13 + a22 * b23 + a23 * b33;\n te[2] = a31 * b11 + a32 * b21 + a33 * b31;\n te[5] = a31 * b12 + a32 * b22 + a33 * b32;\n te[8] = a31 * b13 + a32 * b23 + a33 * b33;\n return this;\n };\n /**\n * 矩阵求行列式值\n * @returns 行列式结果\n */ _proto.determinant = function determinant() {\n var e = this.elements;\n var m11 = e[0], m21 = e[3], m31 = e[6];\n var m12 = e[1], m22 = e[4], m32 = e[7];\n var m13 = e[2], m23 = e[5], m33 = e[8];\n return m11 * (m22 * m33 - m23 * m32) + m12 * (m23 * m31 - m21 * m33) + m13 * (m21 * m32 - m22 * m31);\n };\n /**\n * 矩阵求逆\n * @returns 逆矩阵\n */ _proto.invert = function invert() {\n var e = this.elements;\n var m11 = e[0], m12 = e[3], m13 = e[6];\n var m21 = e[1], m22 = e[4], m23 = e[7];\n var m31 = e[2], m32 = e[5], m33 = e[8];\n var t11 = m33 * m22 - m32 * m23;\n var t12 = m32 * m13 - m33 * m12;\n var t13 = m23 * m12 - m22 * m13;\n var det = m11 * t11 + m21 * t12 + m31 * t13;\n if (det === 0) {\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n var detInv = 1 / det;\n e[0] = t11 * detInv;\n e[1] = (m31 * m23 - m33 * m21) * detInv;\n e[2] = (m32 * m21 - m31 * m22) * detInv;\n e[3] = t12 * detInv;\n e[4] = (m33 * m11 - m31 * m13) * detInv;\n e[5] = (m31 * m12 - m32 * m11) * detInv;\n e[6] = t13 * detInv;\n e[7] = (m21 * m13 - m23 * m11) * detInv;\n e[8] = (m22 * m11 - m21 * m12) * detInv;\n return this;\n };\n /**\n * 矩阵转置\n * @returns 转置结果\n */ _proto.transpose = function transpose() {\n var t;\n var m = this.elements;\n t = m[1];\n m[1] = m[3];\n m[3] = t;\n t = m[2];\n m[2] = m[6];\n m[6] = t;\n t = m[5];\n m[5] = m[7];\n m[7] = t;\n return this;\n };\n /**\n * 对点进行矩阵变换\n * @param v - 输入点\n * @param out - 输出点,如果没有会覆盖输入的数据\n * @returns 变换后的结果\n */ _proto.transformPoint = function transformPoint(v, out) {\n var x = v.x, y = v.y, z = v.z;\n var e = this.elements;\n var res = out != null ? out : v;\n res.x = e[0] * x + e[3] * y + e[6] * z;\n res.y = e[1] * x + e[4] * y + e[7] * z;\n res.z = e[2] * x + e[5] * y + e[8] * z;\n return res;\n };\n /**\n * 对法向量进行矩阵变换\n * @param v - 输入向量\n * @param out - 输出向量,如果没有会覆盖输入的数据\n * @returns 变换后的结果\n */ _proto.transformNormal = function transformNormal(v, out) {\n return this.transformPoint(v, out).normalize();\n };\n /**\n * 矩阵判等\n * @param matrix - 矩阵\n * @returns 判等结果\n */ _proto.equals = function equals(matrix) {\n var te = this.elements;\n var me = matrix.elements;\n for(var i = 0; i < 9; i++){\n if (!isEqual(te[i], me[i])) {\n return false;\n }\n }\n return true;\n };\n /**\n * 矩阵转为数组\n * @returns\n */ _proto.toArray = function toArray() {\n return [].concat(this.elements);\n };\n _proto.fill = function fill(array, offset) {\n if (offset === void 0) offset = 0;\n var e = this.elements;\n array[offset] = e[0];\n array[offset + 1] = e[1];\n array[offset + 2] = e[2];\n array[offset + 3] = e[3];\n array[offset + 4] = e[4];\n array[offset + 5] = e[5];\n array[offset + 6] = e[6];\n array[offset + 7] = e[7];\n array[offset + 8] = e[8];\n };\n /**\n * 创建单位阵\n * @returns 单位矩阵\n */ Matrix3.fromIdentity = function fromIdentity() {\n return new Matrix3(1, 0, 0, 0, 1, 0, 0, 0, 1);\n };\n /**\n * 通过列向量创建矩阵\n * @param c1 - 第一列\n * @param c2 - 第二列\n * @param c3 - 第三列\n * @returns 矩阵\n */ Matrix3.fromColumnVectors = function fromColumnVectors(c1, c2, c3) {\n return new Matrix3().setFromColumnVectors(c1, c2, c3);\n };\n /**\n * 通过四阶矩阵创建矩阵(获取空间变换矩阵旋转缩放部分)\n * @param m - 四阶矩阵\n * @returns 矩阵\n */ Matrix3.fromMatrix4 = function fromMatrix4(m) {\n return new Matrix3().setFromMatrix4(m);\n };\n /**\n * 通过数组创建矩阵\n * @param array - 数组(列优先)\n * @param [offset=0] - 起始偏移值\n * @returns 矩阵\n */ Matrix3.fromArray = function fromArray(array, offset) {\n if (offset === void 0) offset = 0;\n return new Matrix3().setFromArray(array, offset);\n };\n /**\n * 通过四元数创建矩阵\n * @param quat - 四元数\n * @returns 矩阵\n */ Matrix3.fromQuaternion = function fromQuaternion(quat) {\n return new Matrix3().setFromQuaternion(quat);\n };\n /**\n * 设置矩阵通过行优先数据\n * @param m11 - 第 1 行,第 1 列\n * @param m12 - 第 1 行,第 2 列\n * @param m13 - 第 1 行,第 3 列\n * @param m21 - 第 2 行,第 1 列\n * @param m22 - 第 2 行,第 2 列\n * @param m23 - 第 2 行,第 3 列\n * @param m31 - 第 3 行,第 1 列\n * @param m32 - 第 3 行,第 2 列\n * @param m33 - 第 3 行,第 3 列\n * @returns 矩阵\n */ Matrix3.fromRowMajorData = function fromRowMajorData(m11, m12, m13, m21, m22, m23, m31, m32, m33) {\n return new Matrix3(m11, m21, m31, m12, m22, m32, m13, m23, m33);\n };\n return Matrix3;\n}();\n\n/**\n * 光线类\n */ var Ray = /*#__PURE__*/ function() {\n function Ray(origin, direction) {\n if (origin === void 0) origin = Vector3.ZERO;\n if (direction === void 0) direction = Vector3.X;\n /**\n * 光线的原点\n */ this.origin = new Vector3();\n /**\n * 光线的方向\n */ this.direction = new Vector3();\n // 注意这里必须拷贝\n this.origin.copyFrom(origin);\n this.direction.copyFrom(direction).normalize();\n }\n var _proto = Ray.prototype;\n /**\n * 光线设置\n * @param origin - 原点\n * @param direction - 方向\n * @returns\n */ _proto.set = function set(origin, direction) {\n this.origin.copyFrom(origin);\n this.direction.copyFrom(direction).normalize();\n return this;\n };\n /**\n * 光线克隆\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Ray(this.origin, this.direction);\n };\n /**\n * 光线拷贝\n * @param ray - 要拷贝对象\n * @returns 拷贝结果\n */ _proto.copyFrom = function copyFrom(ray) {\n return this.set(ray.origin, ray.direction);\n };\n /**\n * 根据t计算新的光线原点\n * @param t - 光线的系数 t\n * @returns\n */ _proto.recast = function recast(t) {\n this.origin.copyFrom(this.at(t, Ray.tempVec0));\n return this;\n };\n /**\n * 根据t值计算光线上的点\n * @param t - 光线的系数 t\n * @param [out] - 计算的点\n * @returns\n */ _proto.at = function at(t, out) {\n var ret = out ? out : new Vector3();\n ret.copyFrom(this.origin);\n return ret.addScaledVector(this.direction, t);\n };\n /**\n * 光线相等判断\n * @param other - 其他对象\n * @returns\n */ _proto.equals = function equals(other) {\n return this.origin.equals(other.origin) && this.direction.equals(other.direction);\n };\n /**\n * 根据矩阵对光线进行变换\n * @param m - 变换矩阵\n * @returns\n */ _proto.applyMatrix = function applyMatrix(m) {\n this.origin.applyProjectionMatrix(m);\n this.direction.applyNormalMatrix(m);\n return this;\n };\n /**\n * 光线和包围盒求交\n * @param box - 类包围盒对象\n * @param [out] - 交点\n * @returns\n */ _proto.intersectBox = function intersectBox(box, out) {\n var _this_origin = this.origin, ox = _this_origin.x, oy = _this_origin.y, oz = _this_origin.z;\n var _this_direction = this.direction, dx = _this_direction.x, dy = _this_direction.y, dz = _this_direction.z;\n var _box_min = box.min, bxmin = _box_min.x, bymin = _box_min.y, bzmin = _box_min.z;\n var _box_max = box.max, bxmax = _box_max.x, bymax = _box_max.y, bzmax = _box_max.z;\n var tmin, tmax, tymin, tymax, tzmin, tzmax;\n var invdirx = 1 / dx;\n var invdiry = 1 / dy;\n var invdirz = 1 / dz;\n if (invdirx >= 0) {\n tmin = (bxmin - ox) * invdirx;\n tmax = (bxmax - ox) * invdirx;\n } else {\n tmin = (bxmax - ox) * invdirx;\n tmax = (bxmin - ox) * invdirx;\n }\n if (invdiry >= 0) {\n tymin = (bymin - oy) * invdiry;\n tymax = (bymax - oy) * invdiry;\n } else {\n tymin = (bymax - oy) * invdiry;\n tymax = (bymin - oy) * invdiry;\n }\n if (tmin > tymax || tymin > tmax) {\n return;\n }\n if (tymin > tmin || tmin !== tmin) {\n tmin = tymin;\n }\n if (tymax < tmax || tmax !== tmax) {\n tmax = tymax;\n }\n if (tymin > tmin || tmin !== tmin) {\n tmin = tymin;\n }\n if (tymax < tmax || tmax !== tmax) {\n tmax = tymax;\n }\n if (invdirz >= 0) {\n tzmin = (bzmin - oz) * invdirz;\n tzmax = (bzmax - oz) * invdirz;\n } else {\n tzmin = (bzmax - oz) * invdirz;\n tzmax = (bzmin - oz) * invdirz;\n }\n if (tmin > tzmax || tzmin > tmax) {\n return;\n }\n if (tzmin > tmin || tmin !== tmin) {\n tmin = tzmin;\n }\n if (tzmax < tmax || tmax !== tmax) {\n tmax = tzmax;\n }\n if (tmax < 0) {\n return;\n }\n return tmin >= 0 ? this.at(tmin, out) : this.at(tmax, out);\n };\n /**\n * 光线和平面求交\n * @param plane - 类平面对象\n * @param [out] - 交点\n * @returns\n */ _proto.intersectPlane = function intersectPlane(plane, out) {\n var normal = plane.normal;\n var distance = plane.distance;\n var denominator = normal.dot(this.direction);\n if (denominator === 0) {\n // line is coplanar, return origin\n var t = normal.dot(this.origin) + distance;\n if (t === 0) {\n var ret = out ? out : new Vector3();\n return ret.copyFrom(this.origin);\n }\n // Null is preferable to undefined since undefined means.... it is undefined\n return;\n }\n var t1 = -(this.origin.dot(normal) + distance) / denominator;\n // Return if the ray never intersects the plane\n return t1 >= 0 ? this.at(t1, out) : undefined;\n };\n /**\n * 光线和圆求交\n * @param sphere - 类球对象\n * @param [out] - 交点\n * @returns\n */ _proto.intersectSphere = function intersectSphere(sphere, out) {\n var center = sphere.center;\n var vector = Ray.tempVec0.subtractVectors(center, this.origin);\n var tca = vector.dot(this.direction);\n var d2 = vector.dot(vector) - tca * tca;\n var radius2 = sphere.radius * sphere.radius;\n if (d2 > radius2) {\n return;\n }\n var thc = Math.sqrt(radius2 - d2);\n // t0 = first intersect point - entrance on front of sphere\n var t0 = tca - thc;\n // t1 = second intersect point - exit point on back of sphere\n var t1 = tca + thc;\n // test to see if t1 is behind the ray - if so, return null\n if (t1 < 0) {\n return;\n }\n // test to see if t0 is behind the ray:\n // if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n // in order to always return an intersect point that is in front of the ray.\n // else t0 is in front of the ray, so return the first collision point scaled by t0\n return t0 >= 0 ? this.at(t0, out) : this.at(t1, out);\n };\n /**\n * 光线和三角形求交\n * @param triangle - 类三角形对象\n * @param [out] - 交点\n * @param [backfaceCulling] - 是否背面剔除\n * @returns\n */ _proto.intersectTriangle = function intersectTriangle(triangle, out, backfaceCulling) {\n // FIXME: 交换out和backfaceCulling\n // Compute the offset origin, edges, and normal.\n // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n var a = triangle.p0;\n var b = triangle.p1;\n var c = triangle.p2;\n var edge1 = Ray.tempVec0.subtractVectors(b, a);\n var edge2 = Ray.tempVec1.subtractVectors(c, a);\n var diff = Ray.tempVec2.subtractVectors(this.origin, a);\n var normal = Ray.tempVec3.crossVectors(edge1, edge2);\n // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n var DdN = this.direction.dot(normal);\n var sign;\n if (DdN > 0) {\n if (backfaceCulling) {\n return;\n }\n sign = 1;\n } else if (DdN < 0) {\n sign = -1;\n DdN = -DdN;\n } else {\n return;\n }\n edge2.crossVectors(diff, edge2);\n var DdQxE2 = sign * this.direction.dot(edge2);\n // b1 < 0, no intersection\n if (DdQxE2 < 0) {\n return;\n }\n edge1.cross(diff);\n var DdE1xQ = sign * this.direction.dot(edge1);\n // b2 < 0, no intersection\n if (DdE1xQ < 0) {\n return;\n }\n // b1+b2 > 1, no intersection\n if (DdQxE2 + DdE1xQ > DdN) {\n return;\n }\n // Line intersects triangle, check if ray does.\n var QdN = -sign * diff.dot(normal);\n // t < 0, no intersection\n if (QdN < 0) {\n return;\n }\n // Ray intersects triangle.\n return this.at(QdN / DdN, out);\n };\n return Ray;\n}();\nRay.tempVec0 = new Vector3();\nRay.tempVec1 = new Vector3();\nRay.tempVec2 = new Vector3();\nRay.tempVec3 = new Vector3();\n\n/**\n * 三维包围盒\n */ var Box3 = /*#__PURE__*/ function() {\n function Box3(min, max) {\n if (min === void 0) min = new Vector3(Infinity, Infinity, Infinity);\n if (max === void 0) max = new Vector3(-Infinity, -Infinity, -Infinity);\n this.min = min.clone();\n this.max = max.clone();\n }\n var _proto = Box3.prototype;\n /**\n * 设置三维包围盒的值\n * @param min - 三维包围盒最小点\n * @param max - 三维包围盒最大点\n * @returns\n */ _proto.set = function set(min, max) {\n this.min.copyFrom(min);\n this.max.copyFrom(max);\n return this;\n };\n /**\n * 通过数组构建三维包围盒\n * @param array - 数组集合(每三个数视为一个三维空间点)\n * @returns 三维包围盒\n */ _proto.setFromArray = function setFromArray(array) {\n var minX = Number(Infinity);\n var minY = Number(Infinity);\n var minZ = Number(Infinity);\n var maxX = -Infinity;\n var maxY = -Infinity;\n var maxZ = -Infinity;\n for(var i = 0, l = array.length; i < l; i += 3){\n var x = array[i];\n var y = array[i + 1];\n var z = array[i + 2];\n if (x < minX) {\n minX = x;\n }\n if (y < minY) {\n minY = y;\n }\n if (z < minZ) {\n minZ = z;\n }\n if (x > maxX) {\n maxX = x;\n }\n if (y > maxY) {\n maxY = y;\n }\n if (z > maxZ) {\n maxZ = z;\n }\n }\n this.min.set(minX, minY, minZ);\n this.max.set(maxX, maxY, maxZ);\n return this;\n };\n /**\n * 通过三维空间点构建三维包围盒\n * @param points - 三维空间点集合\n * @returns 三维包围盒\n */ _proto.setFromPoints = function setFromPoints(points) {\n this.makeEmpty();\n for(var i = 0, il = points.length; i < il; i++){\n this.expandByPoint(points[i]);\n }\n return this;\n };\n /**\n * 通过三维空间点(包围盒中心)和大小确定包围盒\n * @param center - 三维包围盒中心点\n * @param size - 三维包围盒大小值\n * @returns 三维包围盒\n */ _proto.setFromCenterAndSize = function setFromCenterAndSize(center, size) {\n var halfSize = size.clone().multiply(0.5);\n this.min.copyFrom(center).subtract(halfSize);\n this.max.copyFrom(center).add(halfSize);\n return this;\n };\n // TODO\n /**\n * 通过实体构建包围盒\n * @param object - 构件实体\n * @returns 三维包围盒\n */ _proto.setFromObject = function setFromObject(object) {\n this.makeEmpty();\n return this.expandByObject(object);\n };\n /**\n * 克隆三维包围盒\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Box3().copyFrom(this);\n };\n /**\n * 复制三维包围盒\n * @param box - 复制对象\n * @returns 复制结果\n */ _proto.copyFrom = function copyFrom(box) {\n this.min.copyFrom(box.min);\n this.max.copyFrom(box.max);\n return this;\n };\n /**\n * 三维包围盒置空\n * @returns 置空结果\n */ _proto.makeEmpty = function makeEmpty() {\n this.min.x = this.min.y = this.min.z = Number(Infinity);\n this.max.x = this.max.y = this.max.z = -Infinity;\n return this;\n };\n /**\n * 三维包围盒判空\n * @returns 判空结果\n */ _proto.isEmpty = function isEmpty() {\n // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;\n };\n /**\n * 获取三维包围盒中心\n * @param [target=new Vector3()]\n * @returns\n */ _proto.getCenter = function getCenter(target) {\n if (target === void 0) target = new Vector3();\n return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiply(0.5);\n };\n /**\n * 获取三维包围盒大小\n * @param [target=new Vector3()] - 结果保存对象\n * @returns 三维包围盒大小\n */ _proto.getSize = function getSize(target) {\n if (target === void 0) target = new Vector3();\n return this.isEmpty() ? target.set(0, 0, 0) : target.subtractVectors(this.max, this.min);\n };\n /**\n * 通过三维空间点扩展三维包围盒\n * @param point - 三维空间点\n * @returns 扩展结果\n */ _proto.expandByPoint = function expandByPoint(point) {\n this.min.min(point);\n this.max.max(point);\n return this;\n };\n /**\n * 通过三维向量扩展三维包围盒\n * @param vector - 三维向量\n * @returns 扩展结果\n */ _proto.expandByVector = function expandByVector(vector) {\n this.min.subtract(vector);\n this.max.add(vector);\n return this;\n };\n /**\n * 通过实数扩展三维包围盒\n * @param scalar - 扩展大小\n * @returns 扩展结果\n */ _proto.expandByScalar = function expandByScalar(scalar) {\n this.min.add(-scalar);\n this.max.add(scalar);\n return this;\n };\n /**\n * 通过包围盒扩展三维包围盒\n * @param box\n * @returns\n */ _proto.expandByBox = function expandByBox(box) {\n this.min.min(box.min);\n this.max.max(box.max);\n return this;\n };\n // TODO\n /**\n * 通过实体扩展三维包围盒\n * @param object - 构件实体\n * @returns 扩展结果\n */ _proto.expandByObject = function expandByObject(object) {\n // Computes the world-axis-aligned bounding box of an object (including its children),\n // accounting for both the object's, and children's, world transforms\n object.updateWorldMatrix(false, false);\n var geometry = object.geometry;\n if (geometry !== undefined) {\n if (geometry.boundingBox === null) {\n geometry.computeBoundingBox();\n }\n var box3 = new Box3();\n box3.copyFrom(geometry.boundingBox);\n box3.applyMatrix4(object.matrixWorld);\n this.union(box3);\n }\n var children = object.children;\n for(var i = 0, l = children.length; i < l; i++){\n this.expandByObject(children[i]);\n }\n return this;\n };\n /**\n * 判断三维包围盒相交关系(if this intersect other)\n * @param point - 三维空间点\n * @returns 点包含判断结果\n */ _proto.containsPoint = function containsPoint(point) {\n return !(point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z);\n };\n /**\n * 判断三维包围盒与三维包围盒的包含关系\n * @param other - 三维包围盒\n * @returns 包围盒包含结果(true 表示包含 other, false 表示不包含 other)\n */ _proto.containsBox = function containsBox(other) {\n return this.min.x <= other.min.x && this.max.x >= other.max.x && this.min.y <= other.min.y && this.max.y >= other.max.y && this.min.z <= other.min.z && this.max.z >= other.max.z;\n };\n // TODO\n /**\n * 获取点在三维包围盒的比例位置\n * @param point - 三维空间点\n * @param [target=new Vector3()] - 结果保存对象\n * @returns 点在包围盒比例位置\n */ _proto.getParameter = function getParameter(point, target) {\n if (target === void 0) target = new Vector3();\n // This can potentially have a divide by zero if the box\n // has a size dimension of 0.\n return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y), (point.z - this.min.z) / (this.max.z - this.min.z));\n };\n /**\n * 判断三维包围盒相交关系(if this intersect other)\n * @param other - 三维包围盒\n * @returns 相交判断结果\n */ _proto.intersectsBox = function intersectsBox(other) {\n // using 6 splitting planes to rule out intersections.\n return !(other.max.x < this.min.x || other.min.x > this.max.x || other.max.y < this.min.y || other.min.y > this.max.y || other.max.z < this.min.z || other.min.z > this.max.z);\n };\n /**\n * 判断三维包围盒和球是否相交\n * @param sphere\n * @returns\n */ _proto.intersectsSphere = function intersectsSphere(sphere) {\n // Find the point on the AABB closest to the sphere center.\n var vector = new Vector3();\n this.clampPoint(sphere.center, vector);\n // If that point is inside the sphere, the AABB and sphere intersect.\n return vector.distanceSquared(sphere.center) <= sphere.radius * sphere.radius;\n };\n /**\n * 求点与三维包围盒的最近点\n * @param point - 三维空间点\n * @param [target=new Vector3()] - 结果存放对象\n * @returns 计算结果\n */ _proto.clampPoint = function clampPoint(point, target) {\n if (target === void 0) target = new Vector3();\n return target.copyFrom(point).clamp(this.min, this.max);\n };\n /**\n * 三维空间点到三维包围盒的距离\n * @param point - 三维包围盒\n * @returns 距离结果\n */ _proto.distanceToPoint = function distanceToPoint(point) {\n var clampedPoint = point.clone().clamp(this.min, this.max);\n return clampedPoint.subtract(point).length();\n };\n /**\n * 三维包围盒求交集\n * @param box - 三维包围盒\n * @returns 求交结果\n */ _proto.intersect = function intersect(box) {\n this.min.max(box.min);\n this.max.min(box.max);\n // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n if (this.isEmpty()) {\n this.makeEmpty();\n }\n return this;\n };\n /**\n * 三维包围盒求并集\n * @param box - 三维包围盒\n * @returns 求并结果\n */ _proto.union = function union(box) {\n this.min.min(box.min);\n this.max.max(box.max);\n return this;\n };\n /**\n * 通过三维变换矩阵变化三维包围盒\n * @param matrix - 三维变换矩阵\n * @returns 变换结果\n */ _proto.applyMatrix4 = function applyMatrix4(matrix, center) {\n if (center === void 0) center = new Vector3();\n // transform of empty box is an empty box.\n if (this.isEmpty()) {\n return this;\n }\n var points = this.getOBBPoints(matrix, center);\n this.setFromPoints(points);\n return this;\n };\n _proto.getOBBPoints = function getOBBPoints(matrix, center) {\n if (center === void 0) center = new Vector3();\n // transform of empty box is an empty box.\n if (this.isEmpty()) {\n return [];\n }\n var points = [];\n // NOTE: I am using a binary pattern to specify all 2^3 combinations below\n points[0] = new Vector3(this.min.x, this.min.y, this.min.z); // 000\n points[1] = new Vector3(this.min.x, this.min.y, this.max.z); // 001\n points[2] = new Vector3(this.min.x, this.max.y, this.min.z); // 010\n points[3] = new Vector3(this.min.x, this.max.y, this.max.z); // 011\n points[4] = new Vector3(this.max.x, this.min.y, this.min.z); // 100\n points[5] = new Vector3(this.max.x, this.min.y, this.max.z); // 101\n points[6] = new Vector3(this.max.x, this.max.y, this.min.z); // 110\n points[7] = new Vector3(this.max.x, this.max.y, this.max.z); // 111\n points.forEach(function(p) {\n p.subtract(center);\n p.applyMatrix(matrix);\n p.add(center);\n });\n return points;\n };\n /**\n * 通过包围盒获取包围球\n * @param target\n * @returns\n */ _proto.getBoundingSphere = function getBoundingSphere(target) {\n this.getCenter(target.center);\n var vector = new Vector3();\n target.radius = this.getSize(vector).length() * 0.5;\n return target;\n };\n /**\n * 三维包围盒位移\n * @param offset - 三维位移向量\n * @returns 位移结果\n */ _proto.translate = function translate(offset) {\n this.min.add(offset);\n this.max.add(offset);\n return this;\n };\n /**\n * 三维包围盒判等\n * @param other - 三维包围盒\n * @returns 判等结果\n */ _proto.equals = function equals(other) {\n return other.min.equals(this.min) && other.max.equals(this.max);\n };\n return Box3;\n}();\n\n/**\n * 球\n */ var Sphere$1 = /*#__PURE__*/ function() {\n function Sphere(center, radius) {\n if (center === void 0) center = Vector3.ZERO;\n if (radius === void 0) radius = -1;\n this.center = center.clone();\n this.radius = radius;\n }\n var _proto = Sphere.prototype;\n /**\n * 通过参数设置球\n * @param center - 球心\n * @param radius - 半径\n * @returns\n */ _proto.set = function set(center, radius) {\n this.center.copyFrom(center);\n this.radius = radius;\n return this;\n };\n /**\n * 通过空间点与球心设置球\n * @param points - 三维空间点\n * @param [optionalCenter] - 指定球心\n * @returns\n */ _proto.setFromPoints = function setFromPoints(points, optionalCenter) {\n var center = this.center;\n if (optionalCenter !== undefined) {\n center.copyFrom(optionalCenter);\n var maxRadiusSq = 0;\n for(var i = 0; i < points.length; i++){\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceSquared(points[i]));\n }\n this.radius = Math.sqrt(maxRadiusSq);\n } else {\n var box = new Box3().setFromPoints(points);\n box.getCenter(center);\n this.radius = box.getSize().length() / 2;\n }\n return this;\n };\n /**\n * 复制球\n * @param sphere - 球信息\n * @returns 复制结果\n */ _proto.copyFrom = function copyFrom(sphere) {\n this.center.copyFrom(sphere.center);\n this.radius = sphere.radius;\n return this;\n };\n /**\n * 球判空\n * @returns 判空结果\n */ _proto.isEmpty = function isEmpty() {\n return this.radius < 0;\n };\n /**\n * 球置空\n * @returns 置空结果\n */ _proto.makeEmpty = function makeEmpty() {\n this.center.set(0, 0, 0);\n this.radius = -1;\n return this;\n };\n /**\n * 三维空间点包围判断\n * @param point - 三维空间点\n * @returns 空间点包含判断\n */ _proto.containsPoint = function containsPoint(point) {\n return point.distanceSquared(this.center) <= this.radius * this.radius;\n };\n /**\n * 空间点与球表面的最短距离\n * @param point - 三维空间点\n * @returns 距离结果\n */ _proto.distanceToPoint = function distanceToPoint(point) {\n return point.distance(this.center) - this.radius;\n };\n /**\n * 与球相交判断\n * @param sphere - 球\n * @returns 相交判断结果\n */ _proto.intersectsSphere = function intersectsSphere(sphere) {\n var radiusSum = this.radius + sphere.radius;\n return sphere.center.distanceSquared(this.center) <= radiusSum * radiusSum;\n };\n /**\n * 与包围盒相交判断\n * @param box - 三维包围盒\n * @returns 相交判断结果\n */ _proto.intersectsBox = function intersectsBox(box) {\n return box.intersectsSphere(this);\n };\n /**\n * 收敛空间点在球范围内\n * 注:乘法的效率要比开方高很多\n * @param point - 三维空间点\n * @param [target] - 结果保存对象\n * @returns 收敛结果\n */ _proto.clampPoint = function clampPoint(point, target) {\n var deltaLengthSq = this.center.distanceSquared(point);\n if (target === undefined) {\n target = new Vector3();\n }\n target.copyFrom(point);\n if (deltaLengthSq > this.radius * this.radius) {\n target.subtract(this.center).normalize();\n target.multiply(this.radius).add(this.center);\n }\n return target;\n };\n /**\n * 根据包围盒获取球\n * @param target - 包围盒\n * @returns 球\n */ _proto.getBoundingBox = function getBoundingBox(target) {\n if (target === undefined) {\n target = new Box3();\n }\n if (this.isEmpty()) {\n // Empty sphere produces empty bounding box\n target.makeEmpty();\n return target;\n }\n target.set(this.center, this.center);\n target.expandByScalar(this.radius);\n return target;\n };\n /**\n * 球空间变换\n * @param matrix - 空间变化矩阵\n * @returns 变换结果\n */ _proto.applyMatrix4 = function applyMatrix4(matrix) {\n var mt = matrix.elements;\n var scaleXSq = mt[0] * mt[0] + mt[1] * mt[1] + mt[2] * mt[2];\n var scaleYSq = mt[4] * mt[4] + mt[5] * mt[5] + mt[6] * mt[6];\n var scaleZSq = mt[8] * mt[8] + mt[9] * mt[9] + mt[10] * mt[10];\n var maxScale = Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n this.center.applyMatrix(matrix);\n this.radius = this.radius * maxScale;\n return this;\n };\n /**\n * 球位移\n * @param offset - 位移信息\n * @returns 位移结果\n */ _proto.translate = function translate(offset) {\n this.center.add(offset);\n return this;\n };\n /**\n * 通过三维空间点对球进行扩展\n * @param point - 扩展点\n * @returns 扩展结果\n */ _proto.expandByPoint = function expandByPoint(point) {\n var vector = new Vector3().subtractVectors(point, this.center);\n var lengthSquared = vector.lengthSquared();\n if (lengthSquared > this.radius * this.radius) {\n var length = Math.sqrt(lengthSquared);\n var missingRadiusHalf = (length - this.radius) * 0.5;\n // Nudge this sphere towards the target point. Add half the missing distance to radius,\n // and the other half to position. This gives a tighter enclosure, instead of if\n // the whole missing distance were just added to radius.\n this.center.add(vector.multiply(missingRadiusHalf / length));\n this.radius += missingRadiusHalf;\n }\n return this;\n };\n /**\n * 包围球求并集\n * @param sphere - 包围球\n * @returns 求并结果\n */ _proto.union = function union(sphere) {\n // To enclose another sphere into this sphere, we only need to enclose two points:\n // 1) Enclose the farthest point on the other sphere into this sphere.\n // 2) Enclose the opposite point of the farthest point into this sphere.\n var v1 = new Vector3();\n var toFarthestPoint = new Vector3();\n toFarthestPoint.subtractVectors(sphere.center, this.center).normalize().multiply(sphere.radius);\n this.expandByPoint(v1.copyFrom(sphere.center).add(toFarthestPoint));\n this.expandByPoint(v1.copyFrom(sphere.center).subtract(toFarthestPoint));\n return this;\n };\n /**\n * 包围球求交集\n * @param other - 其它包围球\n * @returns 求交结果\n */ _proto.intersect = function intersect(other) {\n var vector = new Vector3().subtractVectors(this.center, other.center);\n var distance = vector.length();\n var radiusSum = this.radius + other.radius;\n if (distance > radiusSum) {\n return this.makeEmpty();\n }\n this.center = this.center.add(vector.normalize().multiply(distance / 2));\n this.radius = this.radius + other.radius - distance;\n return this;\n };\n /**\n * 包围球判等\n * @param sphere - 包围球\n * @returns 判等结果\n */ _proto.equals = function equals(sphere) {\n return sphere.center.equals(this.center) && sphere.radius === this.radius;\n };\n /**\n * 包围球克隆\n * @returns 克隆结果\n */ _proto.clone = function clone() {\n return new Sphere().copyFrom(this);\n };\n return Sphere;\n}();\n\nvar index = /*#__PURE__*/Object.freeze({\n __proto__: null,\n get EulerOrder () { return EulerOrder; },\n Euler: Euler,\n Quaternion: Quaternion,\n Vector2: Vector2,\n Vector3: Vector3,\n Vector4: Vector4$1,\n Matrix3: Matrix3,\n Matrix4: Matrix4$1,\n Ray: Ray,\n PI2: PI2,\n DEG2RAD: DEG2RAD,\n RAD2DEG: RAD2DEG,\n NumberEpsilon: NumberEpsilon,\n isZero: isZero,\n isEqual: isEqual,\n damp: damp,\n lerp: lerp,\n degToRad: degToRad,\n radToDeg: radToDeg,\n clamp: clamp$1,\n Color: Color,\n Box3: Box3,\n Sphere: Sphere$1\n});\n\nvar seed$b = 1;\n/**\n * Mesh 抽象类\n */ var Mesh = /*#__PURE__*/ function(RendererComponent) {\n _inherits(Mesh, RendererComponent);\n function Mesh(engine, props) {\n var _this;\n _this = RendererComponent.call(this, engine) || this;\n _this.destroyed = false;\n _this.visible = true;\n if (props) {\n var material = props.material, geometry = props.geometry, _props_name = props.name, name = _props_name === void 0 ? \"\" : _props_name, _props_priority = props.priority, priority = _props_priority === void 0 ? 0 : _props_priority, _props_worldMatrix = props.worldMatrix, worldMatrix = _props_worldMatrix === void 0 ? Matrix4$1.fromIdentity() : _props_worldMatrix;\n _this.id = \"Mesh\" + seed$b++;\n _this.name = name;\n _this.geometry = geometry;\n _this.material = material;\n _this.priority = priority;\n _this.worldMatrix = worldMatrix;\n } else {\n _this.id = \"Mesh\" + seed$b++;\n _this.name = \"\";\n _this.worldMatrix = Matrix4$1.fromIdentity();\n _this._priority = 0;\n }\n return _this;\n }\n var _proto = Mesh.prototype;\n /**\n * 设置当前 Mesh 的可见性。\n * @param visible - true:可见,false:不可见\n */ _proto.setVisible = function setVisible(visible) {\n this.visible = visible;\n };\n /**\n * 获取当前 Mesh 的可见性。\n */ _proto.getVisible = function getVisible() {\n return this.visible;\n };\n _proto.render = function render(renderer) {\n if (this.isDestroyed) {\n // console.error(`mesh ${mesh.name} destroyed`, mesh);\n return;\n }\n if (!this.getVisible()) {\n return;\n }\n if (renderer.renderingData.currentFrame.globalUniforms) {\n renderer.setGlobalMatrix(\"effects_ObjectToWorld\", this.worldMatrix);\n }\n renderer.drawGeometry(this.geometry, this.material);\n };\n /**\n * 获取当前 Mesh 的第一个 geometry。\n */ _proto.firstGeometry = function firstGeometry() {\n return this.geometry;\n };\n /**\n * 设置当前 Mesh 的材质\n * @param material - 要设置的材质\n * @param destroy - 可选的材质销毁选项\n */ _proto.setMaterial = function setMaterial(material, destroy) {\n if (destroy !== exports.DestroyOptions.keep) {\n this.material.dispose(destroy);\n }\n this.material = material;\n };\n _proto.restore = function restore() {};\n /**\n * 销毁当前资源\n * @param options - 可选的销毁选项\n */ _proto.dispose = function dispose(options) {\n if (this.destroyed) {\n //console.error('call mesh.destroy multiple times', this);\n return;\n }\n if ((options == null ? void 0 : options.geometries) !== exports.DestroyOptions.keep) {\n this.geometry.dispose();\n }\n var materialDestroyOption = options == null ? void 0 : options.material;\n if (materialDestroyOption !== exports.DestroyOptions.keep) {\n this.material.dispose(materialDestroyOption);\n }\n this.destroyed = true;\n if (this.engine !== undefined) {\n this.engine.removeMesh(this);\n // @ts-expect-error\n this.engine = undefined;\n }\n };\n _create_class(Mesh, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return Mesh;\n}(RendererComponent);\n\nvar RenderPassPriorityPrepare = 0;\nvar RenderPassPriorityNormal = 1000;\nvar RenderPassPriorityPostprocess = 3000;\nexports.RenderPassAttachmentStorageType = void 0;\n(function(RenderPassAttachmentStorageType) {\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"none\"] = 0] = \"none\";\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"color\"] = 1] = \"color\";\n //stencil 8 render buffer\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"stencil_8_opaque\"] = 2] = \"stencil_8_opaque\";\n //stencil 16 render buffer\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"depth_16_opaque\"] = 3] = \"depth_16_opaque\";\n //depth 16 & stencil 8 render buffer\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"depth_stencil_opaque\"] = 4] = \"depth_stencil_opaque\";\n //depth 16 texture, need gpu.capability.readableDepthStencilTextures\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"depth_16_texture\"] = 5] = \"depth_16_texture\";\n //depth 24 texture, need gpu.capability.readableDepthStencilTextures\n RenderPassAttachmentStorageType[RenderPassAttachmentStorageType[\"depth_24_stencil_8_texture\"] = 6] = \"depth_24_stencil_8_texture\";\n})(exports.RenderPassAttachmentStorageType || (exports.RenderPassAttachmentStorageType = {}));\nexports.TextureStoreAction = void 0;\n(function(TextureStoreAction) {\n /**\n * 不清除 Attachment\n */ TextureStoreAction[TextureStoreAction[\"store\"] = 0] = \"store\";\n /**\n * 清除 Attachment\n */ TextureStoreAction[TextureStoreAction[\"clear\"] = 2] = \"clear\";\n})(exports.TextureStoreAction || (exports.TextureStoreAction = {}));\nvar RenderTargetHandle = /*#__PURE__*/ function() {\n function RenderTargetHandle(engine, options) {\n this.destroyed = false;\n if (!options) {\n return;\n }\n var texture = options.texture, size = options.size;\n if (_instanceof1(texture, Texture)) {\n this.texture = texture;\n this.externalTexture = true;\n } else if (texture) {\n var wrapT = texture.wrapT, wrapS = texture.wrapS, minFilter = texture.minFilter, magFilter = texture.magFilter, internalFormat = texture.internalFormat, _texture_format = texture.format, format = _texture_format === void 0 ? glContext.RGBA : _texture_format, _texture_type = texture.type, type = _texture_type === void 0 ? glContext.UNSIGNED_BYTE : _texture_type;\n this.externalTexture = false;\n this.textureOptions = {\n size: size,\n format: format,\n type: type,\n internalFormat: internalFormat || format,\n wrapT: wrapT,\n wrapS: wrapS,\n minFilter: minFilter,\n magFilter: magFilter,\n name: options.name\n };\n this.texture = Texture.create(engine, _extends({}, this.textureOptions, {\n sourceType: exports.TextureSourceType.framebuffer,\n data: {\n width: size[0],\n height: size[1]\n }\n }));\n } else ;\n }\n var _proto = RenderTargetHandle.prototype;\n _proto.dispose = function dispose() {\n if (this.destroyed) {\n return;\n }\n this.texture.dispose();\n this.destroyed = true;\n };\n _create_class(RenderTargetHandle, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n },\n {\n key: \"storageType\",\n get: function get() {\n return 1;\n }\n },\n {\n key: \"size\",\n get: function get() {\n var tex = this.texture;\n return tex ? [\n tex.getWidth(),\n tex.getHeight()\n ] : [\n 0,\n 0\n ];\n }\n },\n {\n key: \"width\",\n get: function get() {\n return this.texture.getWidth() || 0;\n }\n },\n {\n key: \"height\",\n get: function get() {\n return this.texture.getHeight() || 0;\n }\n }\n ]);\n return RenderTargetHandle;\n}();\nexports.RenderPassDestroyAttachmentType = void 0;\n(function(RenderPassDestroyAttachmentType) {\n /**\n * 强制销毁\n */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType[\"force\"] = 0] = \"force\";\n /**\n * 保留,不销毁\n */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType[\"keep\"] = 1] = \"keep\";\n /**\n * 如果是外部传入的 Attachment,就不销毁\n */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType[\"keepExternal\"] = 2] = \"keepExternal\";\n /**\n * 强制销毁\n */ RenderPassDestroyAttachmentType[RenderPassDestroyAttachmentType[\"destroy\"] = 0] = \"destroy\";\n})(exports.RenderPassDestroyAttachmentType || (exports.RenderPassDestroyAttachmentType = {}));\nvar seed$a = 1;\n/**\n * RenderPass 抽象类\n */ var RenderPass = /*#__PURE__*/ function() {\n function RenderPass(renderer, options) {\n /**\n * ColorAttachment 数组\n */ this.attachments = [];\n this.destroyed = false;\n this.initialized = false;\n var _options_name = options.name, name = _options_name === void 0 ? \"RenderPass_\" + seed$a++ : _options_name, clearAction = options.clearAction, semantics = options.semantics, depthStencilAttachment = options.depthStencilAttachment, storeAction = options.storeAction, _options_priority = options.priority, priority = _options_priority === void 0 ? 0 : _options_priority, _options_meshOrder = options.meshOrder, meshOrder = _options_meshOrder === void 0 ? exports.OrderType.ascending : _options_meshOrder, _options_meshes = options.meshes, meshes = _options_meshes === void 0 ? [] : _options_meshes, _options_delegate = options.delegate, delegate = _options_delegate === void 0 ? {} : _options_delegate;\n this.name = name;\n this.renderer = renderer;\n this.priority = priority;\n this.meshOrder = meshOrder;\n this.meshes = sortByOrder(meshes.slice(), this.meshOrder);\n this.depthStencilType = (depthStencilAttachment == null ? void 0 : depthStencilAttachment.storageType) || 0;\n this.clearAction = _extends({}, clearAction);\n this.storeAction = _extends({\n colorAction: 0,\n depthAction: 0,\n stencilAction: 0\n }, storeAction);\n this.semantics = new SemanticMap(semantics);\n this.options = options;\n this.delegate = delegate;\n this.setViewportOptions(options);\n }\n var _proto = RenderPass.prototype;\n _proto.addMesh = function addMesh(mesh) {\n addByOrder(this.meshes, mesh, this.meshOrder);\n };\n _proto.removeMesh = function removeMesh(mesh) {\n removeItem(this.meshes, mesh);\n };\n _proto.setMeshes = function setMeshes(meshes) {\n var _this_meshes;\n this.meshes.length = 0;\n (_this_meshes = this.meshes).splice.apply(_this_meshes, [].concat([\n 0,\n 0\n ], meshes));\n sortByOrder(this.meshes, this.meshOrder);\n return this.meshes;\n };\n /**\n * 获取当前 Attachment 数组,注意 RenderPass 可能没有创建完成\n */ _proto.getInitAttachments = function getInitAttachments() {\n if (this.attachments.length > 0) {\n return this.attachments;\n } else {\n return this.options.attachments;\n }\n };\n // TODO 所有pass在子类配置\n /**\n * 配置当前pass的RT,在每帧渲染前调用\n */ _proto.configure = function configure(renderer) {\n if (this.framebuffer) {\n renderer.setFramebuffer(this.framebuffer);\n } else {\n var _this_getViewport = this.getViewport(), x = _this_getViewport[0], y = _this_getViewport[1], width = _this_getViewport[2], height = _this_getViewport[3];\n renderer.setViewport(x, y, width, height);\n }\n };\n /**\n * 执行当前pass,每帧调用一次\n */ _proto.execute = function execute(renderer) {\n renderer.clear(this.clearAction);\n renderer.renderMeshes(this.meshes);\n renderer.clear(this.storeAction);\n };\n /**\n * 每帧所有的pass渲染完后调用,通常用于清空临时的RT资源\n */ _proto.frameCleanup = function frameCleanup(renderer) {};\n /**\n * 重置 ColorAttachment 数组,会直接替换掉\n * @param colors - 纹理数组,作为新的 ColorAttachment\n */ _proto.resetColorAttachments = function resetColorAttachments(colors) {\n var _this = this;\n if (!colors.length) {\n this.resetAttachments({\n attachments: []\n });\n }\n if (!this.attachments.length) {\n this.resetAttachments({\n attachments: colors.map(function(t) {\n return {\n texture: t\n };\n })\n });\n } else {\n var attachments = colors.map(function(texture) {\n texture.updateSource({\n sourceType: exports.TextureSourceType.framebuffer\n });\n return new RenderTargetHandle(_this.renderer.engine, {\n texture: texture\n });\n });\n this.attachments.forEach(function(att) {\n return !att.externalTexture && att.dispose();\n });\n this.attachments = attachments;\n if (this.framebuffer) {\n this.framebuffer.bind();\n this.framebuffer.resetColorTextures(colors.map(function(color) {\n return color;\n }));\n }\n }\n };\n /**\n * 重置所有 Attachment,会替换掉所有 Attachment\n * @param options - Attachment 和视口数据\n */ _proto.resetAttachments = function resetAttachments(options) {\n this.options = options;\n this.setViewportOptions(options);\n if (this.renderer) {\n this._resetAttachments();\n }\n };\n _proto.setViewportOptions = function setViewportOptions(options) {\n if (options.viewport) {\n this.isCustomViewport = true;\n this.viewportScale = 1;\n this.customViewport = options.viewport.slice(0, 4);\n if (this.framebuffer) {\n var vp = this.customViewport;\n // TODO 为什么framebuffer和renderpass的isCustomViewport不一样?\n this.framebuffer.isCustomViewport = false;\n this.framebuffer.resize(vp[0], vp[1], vp[2], vp[3]);\n }\n } else {\n this.isCustomViewport = false;\n this.viewportScale = options.viewportScale || 1;\n if (this.framebuffer) {\n this.framebuffer.isCustomViewport = true;\n this.framebuffer.viewportScale = this.viewportScale;\n }\n }\n };\n _proto._resetAttachments = function _resetAttachments() {\n var _this = this;\n var _options_attachments;\n var renderer = this.renderer;\n var options = this.options;\n if (this.attachments.length) {\n var _this_framebuffer;\n this.attachments.forEach(function(att) {\n return !att.externalTexture && att.dispose();\n });\n this.attachments.length = 0;\n (_this_framebuffer = this.framebuffer) == null ? void 0 : _this_framebuffer.dispose({\n depthStencilAttachment: 2\n });\n this.framebuffer = null;\n }\n var vs = this.viewportScale;\n // renderpass 的 viewport 相关参数都需要动态的修改\n var viewport = this.isCustomViewport ? this.customViewport : [\n 0,\n 0,\n renderer.getWidth() * vs,\n renderer.getHeight() * vs\n ];\n var size = [\n viewport[2],\n viewport[3]\n ];\n var name = this.name;\n if ((_options_attachments = options.attachments) == null ? void 0 : _options_attachments.length) {\n var attachments = options.attachments.map(function(attr, index) {\n var _attr_texture;\n var attachment = new RenderTargetHandle(_this.renderer.engine, _extends({\n size: size,\n name: ((_attr_texture = attr.texture) == null ? void 0 : _attr_texture.name) || name + \"##color_\" + index\n }, attr));\n return attachment;\n });\n this.attachments = attachments;\n var framebuffer = Framebuffer.create({\n storeAction: this.storeAction,\n name: name,\n viewport: viewport,\n viewportScale: this.viewportScale,\n isCustomViewport: this.isCustomViewport,\n attachments: attachments.map(function(att) {\n return att.texture;\n }),\n depthStencilAttachment: options.depthStencilAttachment || {\n storageType: 0\n }\n }, renderer);\n framebuffer.bind();\n framebuffer.unbind();\n this.framebuffer = framebuffer;\n } else {\n this.attachments.length = 0;\n }\n };\n /**\n * 获取当前视口大小,格式:[x偏移,y偏移,宽度,高度]\n */ _proto.getViewport = function getViewport() {\n var _this_framebuffer;\n var ret = ((_this_framebuffer = this.framebuffer) == null ? void 0 : _this_framebuffer.viewport) || this.customViewport;\n if (ret) {\n return ret;\n }\n var renderer = this.renderer;\n var vs = this.viewportScale;\n return renderer ? [\n 0,\n 0,\n renderer.getWidth() * vs,\n renderer.getHeight() * vs\n ] : [\n 0,\n 0,\n 0,\n 0\n ];\n };\n /**\n * 获取深度 Attachment,可能没有\n */ _proto.getDepthAttachment = function getDepthAttachment() {\n var framebuffer = this.framebuffer;\n if (framebuffer) {\n var depthTexture = framebuffer.getDepthTexture();\n var texture = depthTexture ? this.getDepthTexture(depthTexture, framebuffer.externalStorage) : undefined;\n return {\n storageType: framebuffer.depthStencilStorageType,\n storage: framebuffer.depthStorage,\n texture: texture\n };\n }\n };\n /**\n * 获取蒙版 Attachment,可能没有\n */ _proto.getStencilAttachment = function getStencilAttachment() {\n var framebuffer = this.framebuffer;\n if (framebuffer) {\n var stencilTexture = framebuffer.getStencilTexture();\n var texture = stencilTexture ? this.getDepthTexture(stencilTexture, framebuffer.externalStorage) : undefined;\n return {\n storageType: framebuffer.depthStencilStorageType,\n storage: framebuffer.stencilStorage,\n texture: texture\n };\n }\n };\n _proto.getDepthTexture = function getDepthTexture(texture, external) {\n if (!this.depthTexture) {\n var _this_options_depthStencilAttachment;\n var outTex = (_this_options_depthStencilAttachment = this.options.depthStencilAttachment) == null ? void 0 : _this_options_depthStencilAttachment.texture;\n var tex = texture === outTex ? outTex : texture;\n // TODO 为什么要initialize?\n //tex.initialize(this.renderer.glRenderer.pipelineContext);\n if (!external) {\n this.depthTexture = tex;\n }\n return tex;\n }\n return this.depthTexture;\n };\n _proto.getStencilTexture = function getStencilTexture(texture, external) {\n if (!this.stencilTexture) {\n var _this_options_depthStencilAttachment;\n var outTex = (_this_options_depthStencilAttachment = this.options.depthStencilAttachment) == null ? void 0 : _this_options_depthStencilAttachment.texture;\n var tex = texture === outTex ? outTex : texture;\n if (!external) {\n this.stencilTexture = tex;\n }\n return tex;\n }\n return this.stencilTexture;\n };\n // 生成并初始化帧缓冲\n _proto.initialize = function initialize(renderer) {\n if (!this.initialized) {\n this._resetAttachments();\n this.initialized = true;\n }\n return this;\n };\n /**\n * 销毁 RenderPass\n * @param options - 有选择销毁内部对象\n */ _proto.dispose = function dispose(options) {\n if (this.destroyed) {\n return;\n }\n var destroyMeshOption = (options == null ? void 0 : options.meshes) || undefined;\n if (destroyMeshOption !== exports.DestroyOptions.keep) {\n this.meshes.forEach(function(mesh) {\n mesh.dispose(destroyMeshOption);\n });\n }\n this.meshes.length = 0;\n var colorOpt = (options == null ? void 0 : options.colorAttachment) ? options.colorAttachment : 0;\n this.attachments.forEach(function(att) {\n var keep = att.externalTexture && colorOpt === 2 || colorOpt === 1;\n if (!keep) {\n att.dispose();\n }\n });\n this.attachments.length = 0;\n if ((options == null ? void 0 : options.semantics) !== exports.DestroyOptions.keep) {\n this.semantics.dispose();\n }\n this.destroyed = true;\n var depthStencilOpt = (options == null ? void 0 : options.depthStencilAttachment) ? options.depthStencilAttachment : 0;\n var fbo = this.framebuffer;\n if (fbo) {\n fbo.dispose({\n depthStencilAttachment: depthStencilOpt\n });\n var keep = fbo.externalStorage && depthStencilOpt === 2 || depthStencilOpt === 1;\n if (!keep) {\n var _this_stencilTexture, _this_depthTexture;\n (_this_stencilTexture = this.stencilTexture) == null ? void 0 : _this_stencilTexture.dispose();\n (_this_depthTexture = this.depthTexture) == null ? void 0 : _this_depthTexture.dispose();\n }\n }\n // @ts-expect-error safe to assign\n this.options = this.renderer = null;\n this.initialize = throwDestroyedError;\n };\n _create_class(RenderPass, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n },\n {\n key: \"viewport\",\n get: function get() {\n return this.getViewport();\n }\n },\n {\n key: \"stencilAttachment\",\n get: function get() {\n return this.getStencilAttachment();\n }\n },\n {\n key: \"depthAttachment\",\n get: function get() {\n return this.getDepthAttachment();\n }\n }\n ]);\n return RenderPass;\n}();\n\nvar blend = \"vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}\";\n\nvar itemFrame_frag = \"#version 100\\nprecision highp float;vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}varying vec4 vColor;varying vec4 vTexCoord;varying highp vec2 vParams;uniform vec3 uFrameColor;void main(){gl_FragColor=vec4(uFrameColor.xyz,1.0);}\";\n\nvar integrate = \"float calculateMovement(float t,vec2 p1,vec2 p2,vec2 p3,vec2 p4){float movement=0.0;float h=(t-p1.x)*0.05;for(int i=0;i<=20;i++){float t=float(i)*h;float nt=binarySearchT(t,p1.x,p2.x,p3.x,p4.x);float y=cubicBezier(nt,p1.y,p2.y,p3.y,p4.y);float weight=(i==0||i==20)? 1.0 :(mod(float(i),2.)!=0.)? 4.0 : 2.0;movement+=weight*y;}movement*=h/3.;return movement;}float integrateFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;i=k1.x){ret+=calculateMovement(k1.x,p1,p2,p3,p4);}if(time>=k0.x&&timecount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateLineSeg(time,k0,k1);}ret+=integrateLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateLineSeg(time,k1,k2);}ret+=integrateLineSeg(k2.x,k1,k2);}return ret;}float integrateByTimeFromLineSeg(float time,float frameStart,float frameCount){if(time==0.){return 0.;}int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;icount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateByTimeLineSeg(time,k0,k1);}ret+=integrateByTimeLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateByTimeLineSeg(time,k1,k2);}ret+=integrateByTimeLineSeg(k2.x,k1,k2);}return ret;}float getIntegrateFromTime0(float t1,vec4 value){float type=value.x;if(type==0.){return value.y*t1;}if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateLineSeg(t1,p0,p1);}if(type==3.){return integrateFromLineSeg(t1,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*t1;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w);}return 0.;}float getIntegrateByTimeFromTime(float t0,float t1,vec4 value){float type=value.x;if(type==0.){return value.y*(t1*t1-t0*t0)/2.;}else if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateByTimeLineSeg(t1,p0,p1)-integrateByTimeLineSeg(t0,p0,p1);}if(type==3.){return integrateByTimeFromLineSeg(t1,value.y,value.z)-integrateByTimeFromLineSeg(t0,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*(t1*t1-t0*t0)/2.;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w)-integrateFromBezierCurveFrames(t0,value.z,value.w);}return 0.;}\";\n\nvar itemVert = \"precision highp float;attribute vec2 atlasOffset;attribute vec3 aPos;varying vec2 vTexCoord;varying vec3 vParams;varying vec4 vColor;uniform vec2 _Size;uniform vec3 _Scale;uniform vec4 _Color;uniform vec4 _TexParams;uniform vec4 _TexOffset;uniform mat4 effects_MatrixVP;uniform mat4 effects_ObjectToWorld;uniform mat4 effects_MatrixV;\\n#ifdef ENV_EDITOR\\nuniform vec4 uEditorTransform;\\n#endif\\nvoid main(){vec4 texParams=_TexParams;vTexCoord=vec2(atlasOffset.xy*_TexOffset.zw+_TexOffset.xy);vColor=_Color;vParams=vec3(texParams.w,texParams.y,texParams.x);if(texParams.z==1.0){vec4 pos=vec4(aPos.xy*_Size,aPos.z,1.0);gl_Position=effects_MatrixVP*effects_ObjectToWorld*pos;}else{mat4 view=effects_MatrixV;vec3 camRight=vec3(view[0][0],view[1][0],view[2][0]);vec3 camUp=vec3(view[0][1],view[1][1],view[2][1]);vec3 worldPosition=vec3(effects_ObjectToWorld*vec4(0.0,0.0,0.0,1.0));vec3 vertexPosition=worldPosition+camRight*aPos.x*_Size.x*_Scale.x+camUp*aPos.y*_Size.y*_Scale.y;gl_Position=effects_MatrixVP*vec4(vertexPosition,1.0);}\\n#ifdef ENV_EDITOR\\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\\n#endif\\n}\";\n\nvar itemFrag = \"precision highp float;varying vec4 vColor;varying vec2 vTexCoord;varying vec3 vParams;uniform sampler2D _MainTex;vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}void main(){vec4 color=vec4(0.);\\n#ifdef TRANSPARENT_VIDEO\\nfloat halfX=vTexCoord.x*0.5;vec2 uv_rgb=vec2(halfX,vTexCoord.y);vec2 uv_alpha=vec2(halfX+0.5,vTexCoord.y);vec3 rgb=texture2D(_MainTex,uv_rgb).rgb;float alpha=max(texture2D(_MainTex,uv_alpha).r,1e-5);vec4 texColor=vec4(rgb/alpha,alpha);\\n#else\\nvec4 texColor=texture2D(_MainTex,vTexCoord.xy);\\n#endif\\ncolor=blendColor(texColor,vColor,floor(0.5+vParams.y));\\n#ifdef ALPHA_CLIP\\nif(color.a<0.04){discard;}\\n#endif\\ncolor.a=clamp(color.a,0.0,1.0);gl_FragColor=color;}\";\n\nvar particleFrag = \"#version 100\\nprecision mediump float;vec4 blendColor(vec4 color,vec4 vc,float mode){vec4 ret=color*vc;float alpha=ret.a;if(mode==1.){ret.rgb*=alpha;}else if(mode==2.){ret.rgb*=alpha;ret.a=dot(ret.rgb,vec3(0.33333333));}else if(mode==3.){alpha=color.r*alpha;ret=vec4(vc.rgb*alpha,alpha);}return ret;}\\n#define PATICLE_SHADER 1\\nvarying float vLife;varying vec2 vTexCoord;varying vec4 vColor;uniform vec3 emissionColor;uniform float emissionIntensity;uniform sampler2D uMaskTex;uniform vec4 uColorParams;uniform vec2 uTexOffset;\\n#ifdef COLOR_OVER_LIFETIME\\nuniform sampler2D uColorOverLifetime;\\n#endif\\n#ifdef USE_SPRITE\\nvarying vec4 vTexCoordBlend;\\n#endif\\nvarying float vSeed;\\n#ifdef PREVIEW_BORDER\\nuniform vec4 uPreviewColor;\\n#endif\\n#ifdef USE_SPRITE\\nvec4 getTextureColor(sampler2D tex,vec2 texCoord){if(vTexCoordBlend.w>0.){return mix(texture2D(tex,texCoord),texture2D(tex,vTexCoordBlend.xy+texCoord),vTexCoordBlend.z);}return texture2D(tex,texCoord);}\\n#else\\n#define getTextureColor texture2D\\n#endif\\n#ifndef WEBGL2\\n#define round(a) floor(0.5+a)\\n#endif\\n#ifdef PREVIEW_BORDER\\nvoid main(){gl_FragColor=uPreviewColor;}\\n#else\\nvoid main(){vec4 color=vec4(1.0);vec4 tempColor=vColor;vec2 texOffset=uTexOffset;if(vLife<0.){discard;}if(uColorParams.x>0.0){color=getTextureColor(uMaskTex,vTexCoord);}\\n#ifdef COLOR_OVER_LIFETIME\\n#ifndef ENABLE_VERTEX_TEXTURE\\ntempColor*=texture2D(uColorOverLifetime,vec2(vLife,0.));\\n#endif\\n#endif\\ncolor=blendColor(color,tempColor,round(uColorParams.y));if(color.a<=0.01&&uColorParams.w>0.){float _at=texture2D(uMaskTex,vTexCoord+texOffset).a+texture2D(uMaskTex,vTexCoord+texOffset*-1.).a;if(_at<=0.02){discard;}}vec3 emission=emissionColor*pow(2.0,emissionIntensity);color=vec4(pow(pow(color.rgb,vec3(2.2))+emission,vec3(1.0/2.2)),color.a);gl_FragColor=color;}\\n#endif\\n\";\n\nvar particleVert = \"#version 100\\nprecision mediump float;\\n#define SHADER_VERTEX 1\\n#define PATICLE_SHADER 1\\n#ifdef SHADER_VERTEX\\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\\n#define CURVE_VALUE_ARRAY uVCurveValues\\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\\n#define FRAG_CURVE_VALUE_COUNT 0\\n#else\\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\\n#define CURVE_VALUE_ARRAY uFCurveValues\\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\\n#define VERT_CURVE_VALUE_COUNT 0\\n#endif\\n#if CURVE_VALUE_COUNT > 0\\n#if LOOKUP_TEXTURE_CURVE\\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\\n#else\\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\\n#endif\\n#else\\n#define lookup_curve(i) vec4(0.)\\n#endif\\n#ifdef WEBGL2\\n#define ITR_END (count + 1)\\n#else\\n#define ITR_END MAX_C\\n#endif\\n#define NONE_CONST_INDEX 1\\n#ifdef SHADER_VERTEX\\nattribute float aSeed;varying float vSeed;\\n#endif\\n#ifdef SHADER_VERTEX\\n#define MAX_C VERT_MAX_KEY_FRAME_COUNT\\n#else\\n#define MAX_C FRAG_MAX_KEY_FRAME_COUNT\\n#endif\\nmat4 cubicBezierMatrix=mat4(1.0,-3.0,3.0,-1.0,0.0,3.0,-6.0,3.0,0.0,0.0,3.0,-3.0,0.0,0.0,0.0,1.0);float cubicBezier(float t,float y1,float y2,float y3,float y4){vec4 tVec=vec4(1.0,t,t*t,t*t*t);vec4 yVec=vec4(y1,y2,y3,y4);vec4 result=tVec*cubicBezierMatrix*yVec;return result.x+result.y+result.z+result.w;}float binarySearchT(float x,float x1,float x2,float x3,float x4){float left=0.0;float right=1.0;float mid=0.0;float computedX;for(int i=0;i<8;i++){mid=(left+right)*0.5;computedX=cubicBezier(mid,x1,x2,x3,x4);if(abs(computedX-x)<0.0001){break;}else if(computedX>x){right=mid;}else{left=mid;}}return mid;}float valueFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);for(int i=0;i=count){break;}vec4 k0=lookup_curve(i+start);vec4 k1=lookup_curve(i+1+start);if(i==0&&time=k1.x){return k1.y;}if(time>=k0.x&&time<=k1.x){float t=(time-k0.x)/(k1.x-k0.x);float nt=binarySearchT(time,k0.x,k0.z,k1.z,k1.x);return cubicBezier(nt,k0.y,k0.w,k1.w,k1.y);}}}float evaluteLineSeg(float t,vec2 p0,vec2 p1){return p0.y+(p1.y-p0.y)*(t-p0.x)/(p1.x-p0.x);}float valueFromLineSegs(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);int end=start+count;for(int i=0;icount){return lookup_curve(i).w;}vec4 seg=lookup_curve(i+start);vec2 p0=seg.xy;vec2 p1=seg.zw;if(time>=p0.x&&time<=p1.x){return evaluteLineSeg(time,p0,p1);}vec2 p2=lookup_curve(i+start+1).xy;if(time>p1.x&&time<=p2.x){return evaluteLineSeg(time,p1,p2);}}return lookup_curve(0).y;}float getValueFromTime(float time,vec4 value){float type=value.x;if(type==0.){return value.y;}if(type==1.){return mix(value.y,value.z,time/value.w);}if(type==3.){return valueFromLineSegs(time,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed);}if(type==5.){return valueFromBezierCurveFrames(time,value.z,value.w);}return 0.;}float calculateMovement(float t,vec2 p1,vec2 p2,vec2 p3,vec2 p4){float movement=0.0;float h=(t-p1.x)*0.05;for(int i=0;i<=20;i++){float t=float(i)*h;float nt=binarySearchT(t,p1.x,p2.x,p3.x,p4.x);float y=cubicBezier(nt,p1.y,p2.y,p3.y,p4.y);float weight=(i==0||i==20)? 1.0 :(mod(float(i),2.)!=0.)? 4.0 : 2.0;movement+=weight*y;}movement*=h/3.;return movement;}float integrateFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;i=k1.x){ret+=calculateMovement(k1.x,p1,p2,p3,p4);}if(time>=k0.x&&timecount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateLineSeg(time,k0,k1);}ret+=integrateLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateLineSeg(time,k1,k2);}ret+=integrateLineSeg(k2.x,k1,k2);}return ret;}float integrateByTimeFromLineSeg(float time,float frameStart,float frameCount){if(time==0.){return 0.;}int start=int(frameStart);int count=int(frameCount-1.);float ret=0.;for(int i=0;icount){return ret;}vec4 ks=lookup_curve(i+start);vec2 k0=ks.xy;vec2 k1=ks.zw;if(time>k0.x&&time<=k1.x){return ret+integrateByTimeLineSeg(time,k0,k1);}ret+=integrateByTimeLineSeg(k1.x,k0,k1);vec2 k2=lookup_curve(i+start+1).xy;if(time>k1.x&&time<=k2.x){return ret+integrateByTimeLineSeg(time,k1,k2);}ret+=integrateByTimeLineSeg(k2.x,k1,k2);}return ret;}float getIntegrateFromTime0(float t1,vec4 value){float type=value.x;if(type==0.){return value.y*t1;}if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateLineSeg(t1,p0,p1);}if(type==3.){return integrateFromLineSeg(t1,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*t1;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w);}return 0.;}float getIntegrateByTimeFromTime(float t0,float t1,vec4 value){float type=value.x;if(type==0.){return value.y*(t1*t1-t0*t0)/2.;}else if(type==1.){vec2 p0=vec2(0.,value.y);vec2 p1=vec2(value.w,value.z);return integrateByTimeLineSeg(t1,p0,p1)-integrateByTimeLineSeg(t0,p0,p1);}if(type==3.){return integrateByTimeFromLineSeg(t1,value.y,value.z)-integrateByTimeFromLineSeg(t0,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed)*(t1*t1-t0*t0)/2.;}if(type==5.){return integrateFromBezierCurveFrames(t1,value.z,value.w)-integrateFromBezierCurveFrames(t0,value.z,value.w);}return 0.;}const float d2r=3.141592653589793/180.;attribute vec3 aPos;attribute vec4 aOffset;attribute vec4 aColor;attribute vec3 aDirX;attribute vec3 aDirY;attribute vec3 aTranslation;attribute vec3 aRotation0;attribute vec3 aRotation1;attribute vec3 aRotation2;attribute vec3 aLinearMove;\\n#ifdef USE_SPRITE\\nattribute vec3 aSprite;uniform vec4 uSprite;struct UVDetail{vec2 uv0;vec3 uv1;};UVDetail getSpriteUV(vec2 uv,float lifeTime);varying vec4 vTexCoordBlend;\\n#endif\\n#ifdef FINAL_TARGET\\nuniform vec3 uFinalTarget;uniform vec4 uForceCurve;\\n#endif\\nuniform mat4 effects_ObjectToWorld;uniform mat4 effects_MatrixV;uniform mat4 effects_MatrixVP;uniform vec4 uParams;uniform vec4 uOpacityOverLifetimeValue;\\n#ifdef COLOR_OVER_LIFETIME\\nuniform sampler2D uColorOverLifetime;\\n#endif\\nuniform vec4 uOrbXByLifetimeValue;uniform vec4 uOrbYByLifetimeValue;uniform vec4 uOrbZByLifetimeValue;uniform vec3 uOrbCenter;uniform vec4 uSizeByLifetimeValue;\\n#ifdef SIZE_Y_BY_LIFE\\nuniform vec4 uSizeYByLifetimeValue;\\n#endif\\nvarying float vLife;varying vec4 vColor;varying vec2 vTexCoord;\\n#ifdef ENV_EDITOR\\nuniform vec4 uEditorTransform;\\n#endif\\nvec3 calOrbitalMov(float _life,float _dur){vec3 orb=vec3(0.0);\\n#ifdef AS_ORBITAL_MOVEMENT\\n#define FUNC(a) getValueFromTime(_life,a)\\n#else\\n#define FUNC(a) getIntegrateFromTime0(_life,a) * _dur\\n#endif\\n#if ORB_VEL_X\\norb.x=FUNC(uOrbXByLifetimeValue);\\n#endif\\n#if ORB_VEL_Y\\norb.y=FUNC(uOrbYByLifetimeValue);\\n#endif\\n#if ORB_VEL_Z\\norb.z=FUNC(uOrbZByLifetimeValue);\\n#endif\\n#undef FUNC\\nreturn orb;}mat3 mat3FromRotation(vec3 rotation){vec3 sinR=sin(rotation*d2r);vec3 cosR=cos(rotation*d2r);return mat3(cosR.z,-sinR.z,0.,sinR.z,cosR.z,0.,0.,0.,1.)*mat3(cosR.y,0.,sinR.y,0.,1.,0.,-sinR.y,0,cosR.y)*mat3(1.,0.,0.,0,cosR.x,-sinR.x,0.,sinR.x,cosR.x);}\\n#ifdef USE_SPRITE\\nUVDetail getSpriteUV(vec2 uv,float lifeTime){float t=fract(clamp((lifeTime-aSprite.x)/aSprite.y,0.0,1.)*aSprite.z);float frame=uSprite.z*t;float frameIndex=max(ceil(frame)-1.,0.);float row=floor((frameIndex+0.1)/uSprite.x);float col=frameIndex-row*uSprite.x;vec2 retUV=(vec2(col,row)+uv)/uSprite.xy;UVDetail ret;if(uSprite.w>0.){float blend=frame-frameIndex;float frameIndex1=min(ceil(frame),uSprite.z-1.);float row1=floor((frameIndex1+0.1)/uSprite.x);float col1=frameIndex1-row1*uSprite.x;vec2 coord=(vec2(col1,row1)+uv)/uSprite.xy-retUV;ret.uv1=vec3(coord.x,1.-coord.y,blend);}ret.uv0=vec2(retUV.x,1.-retUV.y);return ret;}\\n#endif\\nvoid main(){float time=uParams.x-aOffset.z;float dur=aOffset.w;if(time<0.||time>dur){gl_Position=vec4(-3.,-3.,-3.,1.);}else{float life=clamp(time/dur,0.0,1.0);vLife=life;\\n#ifdef USE_SPRITE\\nUVDetail uvD=getSpriteUV(aOffset.xy,time);vTexCoord=uvD.uv0;vTexCoordBlend=vec4(uvD.uv1,uSprite.w);\\n#else\\nvTexCoord=aOffset.xy;\\n#endif\\nvColor=aColor;\\n#ifdef COLOR_OVER_LIFETIME\\n#ifdef ENABLE_VERTEX_TEXTURE\\nvColor*=texture2D(uColorOverLifetime,vec2(life,0.));\\n#endif\\n#endif\\nvColor.a*=clamp(getValueFromTime(life,uOpacityOverLifetimeValue),0.,1.);vec3 size=vec3(vec2(getValueFromTime(life,uSizeByLifetimeValue)),1.0);\\n#ifdef SIZE_Y_BY_LIFE\\nsize.y=getValueFromTime(life,uSizeYByLifetimeValue);\\n#endif\\nmat3 aRotation=mat3(aRotation0,aRotation1,aRotation2);vec3 point=aRotation*(aDirX*size.x+aDirY*size.y);vec3 _pos=aPos+aTranslation;\\n#if ORB_VEL_X + ORB_VEL_Y + ORB_VEL_Z\\n_pos=mat3FromRotation(calOrbitalMov(life,dur))*(_pos-uOrbCenter);_pos+=uOrbCenter;\\n#endif\\n_pos.xyz+=aLinearMove;\\n#ifdef FINAL_TARGET\\nfloat force=getValueFromTime(life,uForceCurve);vec4 pos=vec4(mix(_pos,uFinalTarget,force),1.);\\n#else\\nvec4 pos=vec4(_pos,1.0);\\n#endif\\n#if RENDER_MODE == 1\\npos.xyz+=point;pos=effects_ObjectToWorld*pos;\\n#elif RENDER_MODE == 3\\npos=effects_ObjectToWorld*pos;pos.xyz+=effects_MatrixV[0].xyz*point.x+effects_MatrixV[2].xyz*point.y;\\n#elif RENDER_MODE == 2\\npos=effects_ObjectToWorld*pos;pos.xy+=point.xy;\\n#elif RENDER_MODE == 0\\npos=effects_ObjectToWorld*pos;pos.xyz+=effects_MatrixV[0].xyz*point.x+effects_MatrixV[1].xyz*point.y;\\n#endif\\ngl_Position=effects_MatrixVP*pos;vSeed=aSeed;gl_PointSize=6.0;\\n#ifdef ENV_EDITOR\\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\\n#endif\\n}}\";\n\nvar trailVert = \"#version 100\\nprecision mediump float;\\n#define SHADER_VERTEX 1\\n#ifdef SHADER_VERTEX\\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\\n#define CURVE_VALUE_ARRAY uVCurveValues\\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\\n#define FRAG_CURVE_VALUE_COUNT 0\\n#else\\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\\n#define CURVE_VALUE_ARRAY uFCurveValues\\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\\n#define VERT_CURVE_VALUE_COUNT 0\\n#endif\\n#if CURVE_VALUE_COUNT > 0\\n#if LOOKUP_TEXTURE_CURVE\\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\\n#else\\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\\n#endif\\n#else\\n#define lookup_curve(i) vec4(0.)\\n#endif\\n#ifdef WEBGL2\\n#define ITR_END (count + 1)\\n#else\\n#define ITR_END MAX_C\\n#endif\\n#define NONE_CONST_INDEX 1\\n#ifdef SHADER_VERTEX\\nattribute float aSeed;varying float vSeed;\\n#endif\\n#ifdef SHADER_VERTEX\\n#define MAX_C VERT_MAX_KEY_FRAME_COUNT\\n#else\\n#define MAX_C FRAG_MAX_KEY_FRAME_COUNT\\n#endif\\nmat4 cubicBezierMatrix=mat4(1.0,-3.0,3.0,-1.0,0.0,3.0,-6.0,3.0,0.0,0.0,3.0,-3.0,0.0,0.0,0.0,1.0);float cubicBezier(float t,float y1,float y2,float y3,float y4){vec4 tVec=vec4(1.0,t,t*t,t*t*t);vec4 yVec=vec4(y1,y2,y3,y4);vec4 result=tVec*cubicBezierMatrix*yVec;return result.x+result.y+result.z+result.w;}float binarySearchT(float x,float x1,float x2,float x3,float x4){float left=0.0;float right=1.0;float mid=0.0;float computedX;for(int i=0;i<8;i++){mid=(left+right)*0.5;computedX=cubicBezier(mid,x1,x2,x3,x4);if(abs(computedX-x)<0.0001){break;}else if(computedX>x){right=mid;}else{left=mid;}}return mid;}float valueFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);for(int i=0;i=count){break;}vec4 k0=lookup_curve(i+start);vec4 k1=lookup_curve(i+1+start);if(i==0&&time=k1.x){return k1.y;}if(time>=k0.x&&time<=k1.x){float t=(time-k0.x)/(k1.x-k0.x);float nt=binarySearchT(time,k0.x,k0.z,k1.z,k1.x);return cubicBezier(nt,k0.y,k0.w,k1.w,k1.y);}}}float evaluteLineSeg(float t,vec2 p0,vec2 p1){return p0.y+(p1.y-p0.y)*(t-p0.x)/(p1.x-p0.x);}float valueFromLineSegs(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);int end=start+count;for(int i=0;icount){return lookup_curve(i).w;}vec4 seg=lookup_curve(i+start);vec2 p0=seg.xy;vec2 p1=seg.zw;if(time>=p0.x&&time<=p1.x){return evaluteLineSeg(time,p0,p1);}vec2 p2=lookup_curve(i+start+1).xy;if(time>p1.x&&time<=p2.x){return evaluteLineSeg(time,p1,p2);}}return lookup_curve(0).y;}float getValueFromTime(float time,vec4 value){float type=value.x;if(type==0.){return value.y;}if(type==1.){return mix(value.y,value.z,time/value.w);}if(type==3.){return valueFromLineSegs(time,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed);}if(type==5.){return valueFromBezierCurveFrames(time,value.z,value.w);}return 0.;}attribute vec4 aPos;attribute vec3 aDir;attribute vec3 aInfo;attribute vec4 aColor;attribute float aTime;\\n#ifdef ATTR_TRAIL_START\\nattribute float aTrailStart;\\n#else\\nuniform float uTrailStart[64];attribute float aTrailStartIndex;\\n#endif\\nuniform mat4 effects_MatrixInvV;uniform mat4 effects_ObjectToWorld;uniform mat4 effects_MatrixVP;uniform vec4 uTextureMap;uniform float uTime;uniform vec4 uParams;uniform vec4 uColorParams;uniform vec4 uOpacityOverLifetimeValue;uniform vec4 uWidthOverTrail;\\n#ifdef COLOR_OVER_TRAIL\\nuniform sampler2D uColorOverTrail;\\n#endif\\n#ifdef COLOR_OVER_LIFETIME\\nuniform sampler2D uColorOverLifetime;\\n#endif\\nvarying float vLife;varying vec2 vTexCoord;varying vec4 vColor;\\n#ifdef ENV_EDITOR\\nuniform vec4 uEditorTransform;\\n#endif\\nvoid main(){vec4 _pa=effects_MatrixVP*vec4(aPos.xyz,1.);vec4 _pb=effects_MatrixVP*vec4(aPos.xyz+aDir,1.);vec2 dir=normalize(_pb.xy/_pb.w-_pa.xy/_pa.w);vec2 screen_xy=vec2(-dir.y,dir.x);vec4 pos=effects_ObjectToWorld*vec4(aPos.xyz,1.);\\n#ifdef ATTR_TRAIL_START\\nfloat ts=aTrailStart;\\n#else\\nfloat ts=uTrailStart[int(aTrailStartIndex)];\\n#endif\\nfloat trail=(ts-aInfo.y)/uParams.y;float width=aPos.w*getValueFromTime(trail,uWidthOverTrail)/max(abs(screen_xy.x),abs(screen_xy.y));pos.xyz+=(effects_MatrixInvV[0].xyz*screen_xy.x+effects_MatrixInvV[1].xyz*screen_xy.y)*width;float time=min((uTime-aTime)/aInfo.x,1.0);gl_Position=effects_MatrixVP*pos;vColor=aColor;\\n#ifdef COLOR_OVER_LIFETIME\\n#ifdef ENABLE_VERTEX_TEXTURE\\nvColor*=texture2D(uColorOverLifetime,vec2(time,0.));\\n#endif\\n#endif\\n#ifdef COLOR_OVER_TRAIL\\nvColor*=texture2D(uColorOverTrail,vec2(trail,0.));\\n#endif\\nvColor.a*=clamp(getValueFromTime(time,uOpacityOverLifetimeValue),0.,1.);vLife=time;vTexCoord=uTextureMap.xy+vec2(trail,aInfo.z)*uTextureMap.zw;vSeed=aSeed;\\n#ifdef ENV_EDITOR\\ngl_Position=vec4(gl_Position.xy*uEditorTransform.xy+uEditorTransform.zw*gl_Position.w,gl_Position.zw);\\n#endif\\n}\";\n\nvar value = \"#ifdef SHADER_VERTEX\\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\\n#define CURVE_VALUE_ARRAY uVCurveValues\\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\\n#define FRAG_CURVE_VALUE_COUNT 0\\n#else\\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\\n#define CURVE_VALUE_ARRAY uFCurveValues\\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\\n#define VERT_CURVE_VALUE_COUNT 0\\n#endif\\n#if CURVE_VALUE_COUNT > 0\\n#if LOOKUP_TEXTURE_CURVE\\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\\n#else\\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\\n#endif\\n#else\\n#define lookup_curve(i) vec4(0.)\\n#endif\\n#ifdef WEBGL2\\n#define ITR_END (count + 1)\\n#else\\n#define ITR_END MAX_C\\n#endif\\n#define NONE_CONST_INDEX 1\\n#ifdef SHADER_VERTEX\\nattribute float aSeed;varying float vSeed;\\n#endif\\n#ifdef SHADER_VERTEX\\n#define MAX_C VERT_MAX_KEY_FRAME_COUNT\\n#else\\n#define MAX_C FRAG_MAX_KEY_FRAME_COUNT\\n#endif\\nmat4 cubicBezierMatrix=mat4(1.0,-3.0,3.0,-1.0,0.0,3.0,-6.0,3.0,0.0,0.0,3.0,-3.0,0.0,0.0,0.0,1.0);float cubicBezier(float t,float y1,float y2,float y3,float y4){vec4 tVec=vec4(1.0,t,t*t,t*t*t);vec4 yVec=vec4(y1,y2,y3,y4);vec4 result=tVec*cubicBezierMatrix*yVec;return result.x+result.y+result.z+result.w;}float binarySearchT(float x,float x1,float x2,float x3,float x4){float left=0.0;float right=1.0;float mid=0.0;float computedX;for(int i=0;i<8;i++){mid=(left+right)*0.5;computedX=cubicBezier(mid,x1,x2,x3,x4);if(abs(computedX-x)<0.0001){break;}else if(computedX>x){right=mid;}else{left=mid;}}return mid;}float valueFromBezierCurveFrames(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);for(int i=0;i=count){break;}vec4 k0=lookup_curve(i+start);vec4 k1=lookup_curve(i+1+start);if(i==0&&time=k1.x){return k1.y;}if(time>=k0.x&&time<=k1.x){float t=(time-k0.x)/(k1.x-k0.x);float nt=binarySearchT(time,k0.x,k0.z,k1.z,k1.x);return cubicBezier(nt,k0.y,k0.w,k1.w,k1.y);}}}float evaluteLineSeg(float t,vec2 p0,vec2 p1){return p0.y+(p1.y-p0.y)*(t-p0.x)/(p1.x-p0.x);}float valueFromLineSegs(float time,float frameStart,float frameCount){int start=int(frameStart);int count=int(frameCount-1.);int end=start+count;for(int i=0;icount){return lookup_curve(i).w;}vec4 seg=lookup_curve(i+start);vec2 p0=seg.xy;vec2 p1=seg.zw;if(time>=p0.x&&time<=p1.x){return evaluteLineSeg(time,p0,p1);}vec2 p2=lookup_curve(i+start+1).xy;if(time>p1.x&&time<=p2.x){return evaluteLineSeg(time,p1,p2);}}return lookup_curve(0).y;}float getValueFromTime(float time,vec4 value){float type=value.x;if(type==0.){return value.y;}if(type==1.){return mix(value.y,value.z,time/value.w);}if(type==3.){return valueFromLineSegs(time,value.y,value.z);}if(type==4.){return mix(value.y,value.z,aSeed);}if(type==5.){return valueFromBezierCurveFrames(time,value.z,value.w);}return 0.;}\";\n\nvar valueDefine = \"#ifdef SHADER_VERTEX\\n#define CURVE_VALUE_TEXTURE uVCurveValueTexture\\n#define CURVE_VALUE_ARRAY uVCurveValues\\n#define CURVE_VALUE_COUNT VERT_CURVE_VALUE_COUNT\\n#define FRAG_CURVE_VALUE_COUNT 0\\n#else\\n#define CURVE_VALUE_TEXTURE uFCurveValueTexture\\n#define CURVE_VALUE_ARRAY uFCurveValues\\n#define CURVE_VALUE_COUNT FRAG_CURVE_VALUE_COUNT\\n#define VERT_CURVE_VALUE_COUNT 0\\n#endif\\n#if CURVE_VALUE_COUNT > 0\\n#if LOOKUP_TEXTURE_CURVE\\nuniform sampler2D CURVE_VALUE_TEXTURE;const float uCurveCount=1./float(CURVE_VALUE_COUNT);\\n#define lookup_curve(i) texture2D(CURVE_VALUE_TEXTURE,vec2(float(i) * uCurveCount,0.))\\n#else\\nuniform vec4 CURVE_VALUE_ARRAY[CURVE_VALUE_COUNT];\\n#define lookup_curve(i) CURVE_VALUE_ARRAY[i]\\n#endif\\n#else\\n#define lookup_curve(i) vec4(0.)\\n#endif\\n#ifdef WEBGL2\\n#define ITR_END (count + 1)\\n#else\\n#define ITR_END MAX_C\\n#endif\\n\";\n\nvar screenMeshVert = \"precision highp float;attribute vec2 aPos;varying vec2 uv;void main(){gl_Position=vec4(aPos,0.,1.0);uv=(aPos+vec2(1.0))/2.;}\";\n\nvar colorGradingFrag = \"precision highp float;\\n#define HALF_MAX 60000.0\\n#define ACEScc_MIDGRAY 0.4135884\\nvarying vec2 uv;uniform sampler2D _GaussianTex;uniform sampler2D _SceneTex;uniform float _BloomIntensity;uniform float _Brightness;uniform float _Saturation;uniform float _Contrast;uniform bool _UseBloom;uniform bool _UseToneMapping;uniform vec3 _VignetteColor;uniform vec2 _VignetteCenter;uniform float _VignetteIntensity;uniform float _VignetteSmoothness;uniform float _VignetteRoundness;mat3 LinearToACES=mat3(0.59719,0.07600,0.02840,0.35458,0.90834,0.13383,0.04823,0.01566,0.83777);mat3 ACESToLinear=mat3(1.60475,-0.10208,-0.00327,-0.53108,1.10813,-0.07276,-0.07367,-0.00605,1.07602);float log10(float x){return log(x)/log(10.0);}vec3 log10(vec3 v){return vec3(log10(v.x),log10(v.y),log10(v.z));}vec3 LinearToLogC(vec3 x){return 0.244161*log10(5.555556*x+0.047996)+0.386036;}vec3 LogCToLinear(vec3 x){return(pow(vec3(10.0),(x-0.386036)/0.244161)-0.047996)/5.555556;}vec3 rrt_and_odt_fit(vec3 col){vec3 a=col*(col+0.0245786)-0.000090537;vec3 b=col*(0.983729*col+0.4329510)+0.238081;return a/b;}vec3 ACESToneMapping(vec3 col){vec3 aces=LinearToACES*col;aces=rrt_and_odt_fit(aces);col=ACESToLinear*aces;return col;}vec3 LinearToSrgb(vec3 c){return mix(1.055*pow(c,vec3(1./2.4))-0.055,12.92*c,step(c,vec3(0.0031308)));}vec3 GammaCorrection(vec3 c){return pow(c,vec3(1.0/2.2));}vec3 ApplyVignette(vec3 inputColor,vec2 uv,vec2 center,float intensity,float roundness,float smoothness,vec3 color){vec2 dist=abs(uv-center)*intensity;dist.x*=roundness;float vfactor=pow(clamp((1.0-dot(dist,dist)),0.0,1.0),smoothness);return inputColor*mix(color,vec3(1.0),vfactor);}void main(){vec4 hdrColor=texture2D(_SceneTex,uv);hdrColor.rgb=pow(hdrColor.rgb,vec3(2.2));vec3 finalColor=hdrColor.rgb;if(_UseBloom){vec4 bloomColor=texture2D(_GaussianTex,uv);bloomColor.rgb*=_BloomIntensity;finalColor+=bloomColor.rgb;}if(_VignetteIntensity>0.0){finalColor=ApplyVignette(finalColor,uv,_VignetteCenter,_VignetteIntensity,_VignetteRoundness,_VignetteSmoothness,_VignetteColor);}finalColor=finalColor*_Brightness;vec3 colorLog=LinearToLogC(finalColor);colorLog=(colorLog-ACEScc_MIDGRAY)*_Contrast+ACEScc_MIDGRAY;finalColor=LogCToLinear(colorLog);finalColor=max(finalColor,0.0);float luminance=0.2125*finalColor.r+0.7154*finalColor.g+0.0721*finalColor.b;vec3 luminanceColor=vec3(luminance,luminance,luminance);finalColor=(finalColor-luminanceColor)*_Saturation+luminanceColor;finalColor=max(finalColor,0.0);if(_UseToneMapping){finalColor=max(vec3(0.0),ACESToneMapping(finalColor));}float alpha=min(hdrColor.a,1.0);gl_FragColor=vec4(clamp(GammaCorrection(finalColor),0.0,1.0),alpha);}\";\n\nvar gaussianDown_frag = \"precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform vec2 _TextureSize;float GaussWeight2D(float x,float y,float sigma){float PI=3.14159265358;float E=2.71828182846;float sigma_2=pow(sigma,2.0);float a=-(x*x+y*y)/(2.0*sigma_2);return pow(E,a)/(2.0*PI*sigma_2);}vec3 GaussNxN(sampler2D tex,vec2 uv,vec2 stride,float sigma){vec3 color=vec3(0.,0.,0.);const int r=5/2;float weight=0.0;for(int i=-r;i<=r;i++){for(int j=-r;j<=r;j++){float w=GaussWeight2D(float(i),float(j),sigma);vec2 coord=uv+vec2(i,j)*stride;color+=texture2D(tex,coord).rgb*w;weight+=w;}}color/=weight;return color;}void main(){vec4 mainColor=texture2D(_MainTex,uv);vec3 color=mainColor.rgb;color=GaussNxN(_MainTex,uv,1.0/_TextureSize,1.0);gl_FragColor=vec4(color,1.0);}\";\n\nvar gaussianDownHFrag = \"precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform vec2 _TextureSize;vec3 GaussH(sampler2D tex,vec2 uv){vec3 color=vec3(0.0);float offsets[9];offsets[0]=-4.0;offsets[1]=-3.0;offsets[2]=-2.0;offsets[3]=-1.0;offsets[4]=0.0;offsets[5]=1.0;offsets[6]=2.0;offsets[7]=3.0;offsets[8]=4.0;float weights[9];weights[0]=0.01621622;weights[1]=0.05405405;weights[2]=0.12162162;weights[3]=0.19459459;weights[4]=0.22702703;weights[5]=0.19459459;weights[6]=0.12162162;weights[7]=0.05405405;weights[8]=0.01621622;for(int i=0;i<9;i++){vec2 offset=vec2(offsets[i]*2.0*(1.0/_TextureSize.x),0);color+=texture2D(tex,uv+offset).rgb*weights[i];}return color;}void main(){vec3 color=GaussH(_MainTex,uv);gl_FragColor=vec4(color,1.0);}\";\n\nvar gaussianDownVFrag = \"precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform vec2 _TextureSize;vec3 GaussV(sampler2D tex,vec2 uv){vec3 color=vec3(0.0);float offsets[5];offsets[0]=-3.23076923;offsets[1]=-1.38461538;offsets[2]=0.0;offsets[3]=1.38461538;offsets[4]=3.23076923;float weights[5];weights[0]=0.07027027;weights[1]=0.31621622;weights[2]=0.22702703;weights[3]=0.31621622;weights[4]=0.07027027;for(int i=0;i<5;i++){vec2 offset=vec2(0,offsets[i]*(1.0/_TextureSize.y));color+=texture2D(tex,uv+offset).rgb*weights[i];}return color;}void main(){vec3 color=GaussV(_MainTex,uv);gl_FragColor=vec4(color,1.0);}\";\n\nvar gaussianUpFrag = \"precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform sampler2D _GaussianDownTex;uniform vec2 _GaussianDownTextureSize;float GaussWeight2D(float x,float y,float sigma){float PI=3.14159265358;float E=2.71828182846;float sigma_2=pow(sigma,2.0);float a=-(x*x+y*y)/(2.0*sigma_2);return pow(E,a)/(2.0*PI*sigma_2);}vec3 GaussNxN(sampler2D tex,vec2 uv,vec2 stride,float sigma){vec3 color=vec3(0.,0.,0.);const int r=1;float weight=0.0;for(int i=-r;i<=r;i++){for(int j=-r;j<=r;j++){float w=GaussWeight2D(float(i),float(j),sigma);vec2 coord=uv+vec2(i,j)*stride;color+=texture2D(tex,coord).rgb*w;weight+=w;}}color/=weight;return color;}void main(){vec3 lowResColor=GaussNxN(_MainTex,uv,0.5/_GaussianDownTextureSize,1.0);vec3 highResColor=GaussNxN(_GaussianDownTex,uv,1.0/_GaussianDownTextureSize,1.0);vec3 color=mix(highResColor,lowResColor,0.7);gl_FragColor=vec4(color,1.0);}\";\n\nvar thresholdFrag = \"precision highp float;varying vec2 uv;uniform sampler2D _MainTex;uniform float _Threshold;void main(){vec4 mainTex=texture2D(_MainTex,uv);mainTex.rgb=pow(mainTex.rgb,vec3(2.2));float brightness=max(mainTex.r,max(mainTex.g,mainTex.b));float w=max(0.0,brightness-_Threshold)/max(brightness,0.00001);mainTex.rgb*=w;mainTex.rgb*=mainTex.a;gl_FragColor=vec4(mainTex.rgb,1.0);}\";\n\nvar shaderLib = {};\nvar ShaderFactory = /*#__PURE__*/ function() {\n function ShaderFactory() {}\n ShaderFactory.registerInclude = function registerInclude(includeName, includeSource) {\n if (shaderLib[includeName]) {\n logger.warn('The \"' + includeName + '\" shader include already exist.');\n }\n shaderLib[includeName] = includeSource;\n };\n ShaderFactory.unRegisterInclude = function unRegisterInclude(includeName) {\n delete shaderLib[includeName];\n };\n ShaderFactory.unRegisterAllIncludes = function unRegisterAllIncludes() {\n Object.keys(shaderLib).forEach(function(key) {\n ShaderFactory.unRegisterInclude(key);\n });\n };\n /**\n * 生成 shader,检测到 WebGL1 上下文会降级\n * @param macros - 宏定义数组\n * @param shader - 原始 shader 文本\n * @param shaderType - shader 类型\n * @return 去除版本号的 shader 文本\n */ ShaderFactory.genFinalShaderCode = function genFinalShaderCode(options) {\n var level = options.level, shaderType = options.shaderType, shader = options.shader, macros = options.macros, removeVersion = options.removeVersion;\n var macroString = ShaderFactory.genMacroString(level, macros);\n var versionString = ShaderFactory.genShaderVersion(level);\n var source = ShaderFactory.parseIncludes(shader);\n var isVersion300 = ShaderFactory.isVersion300(source);\n source = ShaderFactory.removeWebGLVersion(source);\n if (level === 2 && !isVersion300) {\n source = ShaderFactory.convertTo300(source, shaderType === exports.ShaderType.fragment);\n }\n if (removeVersion) {\n return macroString + source;\n }\n return versionString + macroString + source;\n };\n /**\n * Convert lower GLSL version to GLSL 300 es.\n * @param source - code\n * @param isFragment - Whether it is a fragment shader.\n * */ ShaderFactory.convertTo300 = function convertTo300(source, isFragment) {\n source = source.replace(/\\bvarying\\b/g, isFragment ? \"in\" : \"out\");\n source = source.replace(/\\btexture(2D|Cube)\\b/g, \"texture\");\n // Remove extensions\n var regex = /#extension.+(GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\n source = source.replace(regex, \"\");\n if (isFragment) {\n source = source.replace(/\\btexture(2D|Cube)LodEXT\\b/g, \"textureLod\");\n source = source.replace(/\\btexture(2D|Cube)GradEXT\\b/g, \"textureGrad\");\n source = source.replace(/\\bgl_FragDepthEXT\\b/g, \"gl_FragDepth\");\n if (!ShaderFactory.has300Output(source)) {\n var isMRT = /\\bgl_FragData\\[.+?\\]/g.test(source);\n if (isMRT) {\n source = source.replace(/\\bgl_FragColor\\b/g, \"gl_FragData[0]\");\n var result = source.match(/\\bgl_FragData\\[.+?\\]/g);\n if (result) {\n source = ShaderFactory.replaceMRTShader(source, result);\n }\n } else {\n source = source.replace(/void\\s+?main\\s*\\(/g, \"out vec4 glFragColor;\\nvoid main(\");\n source = source.replace(/\\bgl_FragColor\\b/g, \"glFragColor\");\n }\n }\n } else {\n source = source.replace(/\\battribute\\b/g, \"in\");\n }\n return source;\n };\n ShaderFactory.parseIncludes = function parseIncludes(source, regex) {\n if (regex === void 0) regex = /#include <(.+)>/gm;\n var match;\n while((match = regex.exec(source)) !== null){\n var shaderName = match[1];\n var replace = shaderLib[shaderName];\n if (replace === undefined) {\n throw new Error(\"Can't find include shader name \" + shaderName);\n }\n source = source.replace(match[0], replace);\n }\n return source;\n };\n ShaderFactory.genMacroString = function genMacroString(level, macros, addRuntimeMacro) {\n if (addRuntimeMacro === void 0) addRuntimeMacro = true;\n var macroList = [];\n var webGLVersion = \"WEBGL\" + level;\n macroList.push(\"#ifndef \" + webGLVersion);\n macroList.push(\"#define \" + webGLVersion);\n macroList.push(\"#endif\");\n if (addRuntimeMacro) {\n macroList.push(\"#define GE_RUNTIME\");\n }\n if (macros && macros.length) {\n macros.forEach(function(param) {\n var key = param[0], value = param[1];\n if (value === true) {\n macroList.push(\"#define \" + key);\n } else if (Number.isFinite(value)) {\n macroList.push(\"#define \" + key + \" \" + value);\n }\n });\n }\n if (macroList.length) {\n return macroList.join(\"\\n\") + \"\\n\";\n }\n return \"\";\n };\n ShaderFactory.genShaderVersion = function genShaderVersion(level) {\n if (level === 1) {\n return \"#version 100\\n\";\n }\n return \"#version 300 es\\n\";\n };\n ShaderFactory.isVersion300 = function isVersion300(source) {\n var versionTag = /#version\\s+\\b\\d{3}\\b\\s*(es)?/;\n var match = source.match(versionTag);\n var version = match ? match[0] : \"\";\n return version.includes(\"300\");\n };\n ShaderFactory.removeWebGLVersion = function removeWebGLVersion(source) {\n var versionTag = /#version\\s+\\b\\d{3}\\b\\s*(es)?/;\n var match = source.match(versionTag);\n if (match) {\n return source.replace(match[0], \"\");\n }\n return source;\n };\n ShaderFactory.has300Output = function has300Output(fragmentShader) {\n // [layout(location = 0)] out [highp] vec4 [color];\n var fragReg = /\\bout\\s+(?:\\w+\\s+)?(?:vec4)\\s+(?:\\w+)\\s*;/;\n return fragReg.test(fragmentShader);\n };\n ShaderFactory.replaceMRTShader = function replaceMRTShader(source, result) {\n var mrtIndexSet = new Set();\n var declaration = \"\";\n for(var i = 0; i < result.length; i++){\n var res = result[i].match(/\\bgl_FragData\\[(.+?)\\]/);\n if (res) {\n mrtIndexSet.add(res[1]);\n }\n }\n mrtIndexSet.forEach(function(index) {\n declaration += \"layout(location=\" + index + \") out vec4 fragOutColor\" + index + \";\\n\";\n });\n declaration += \"void main(\";\n source = source.replace(/\\bgl_FragData\\[(.+?)\\]/g, \"fragOutColor$1\");\n source = source.replace(/void\\s+?main\\s*\\(/g, declaration);\n return source;\n };\n return ShaderFactory;\n}();\n\n// Bloom 阈值 Pass\nvar BloomThresholdPass = /*#__PURE__*/ function(RenderPass) {\n _inherits(BloomThresholdPass, RenderPass);\n function BloomThresholdPass(renderer, option) {\n var _this;\n _this = RenderPass.call(this, renderer, option) || this;\n var engine = _this.renderer.engine;\n var geometry = Geometry.create(engine, {\n mode: glContext.TRIANGLE_STRIP,\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array([\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1\n ])\n }\n },\n drawCount: 4\n });\n var material = Material.create(engine, {\n shader: {\n vertex: screenMeshVert,\n fragment: thresholdFrag,\n glslVersion: exports.GLSLVersion.GLSL1\n }\n });\n material.blending = false;\n material.depthTest = false;\n material.culling = false;\n _this.screenMesh = Mesh.create(engine, {\n geometry: geometry,\n material: material,\n priority: 0\n });\n _this.priority = 5000;\n return _this;\n }\n var _proto = BloomThresholdPass.prototype;\n _proto.configure = function configure(renderer) {\n this.mainTexture = renderer.getFramebuffer().getColorTextures()[0];\n this.sceneTextureHandle.texture = this.mainTexture;\n renderer.setFramebuffer(this.framebuffer);\n };\n _proto.execute = function execute(renderer) {\n var _renderer_renderingData_currentFrame_globalVolume_bloom, _renderer_renderingData_currentFrame_globalVolume;\n renderer.clear({\n colorAction: exports.TextureStoreAction.clear,\n depthAction: exports.TextureStoreAction.clear,\n stencilAction: exports.TextureStoreAction.clear\n });\n this.screenMesh.material.setTexture(\"_MainTex\", this.mainTexture);\n var _renderer_renderingData_currentFrame_globalVolume_bloom_threshold;\n var threshold = (_renderer_renderingData_currentFrame_globalVolume_bloom_threshold = (_renderer_renderingData_currentFrame_globalVolume = renderer.renderingData.currentFrame.globalVolume) == null ? void 0 : (_renderer_renderingData_currentFrame_globalVolume_bloom = _renderer_renderingData_currentFrame_globalVolume.bloom) == null ? void 0 : _renderer_renderingData_currentFrame_globalVolume_bloom.threshold) != null ? _renderer_renderingData_currentFrame_globalVolume_bloom_threshold : 1.0;\n this.screenMesh.material.setFloat(\"_Threshold\", threshold);\n renderer.renderMeshes([\n this.screenMesh\n ]);\n };\n return BloomThresholdPass;\n}(RenderPass);\nvar HQGaussianDownSamplePass = /*#__PURE__*/ function(RenderPass) {\n _inherits(HQGaussianDownSamplePass, RenderPass);\n function HQGaussianDownSamplePass(renderer, type, options) {\n var _this;\n _this = RenderPass.call(this, renderer, options) || this;\n _this.type = type;\n var engine = _this.renderer.engine;\n var name = \"PostProcess\";\n var geometry = Geometry.create(engine, {\n name: name,\n mode: glContext.TRIANGLE_STRIP,\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array([\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1\n ])\n }\n },\n drawCount: 4\n });\n var fragment = type == \"H\" ? gaussianDownHFrag : gaussianDownVFrag;\n var shader = {\n vertex: screenMeshVert,\n fragment: fragment,\n glslVersion: exports.GLSLVersion.GLSL1\n };\n var material = Material.create(engine, {\n name: name,\n shader: shader\n });\n material.blending = false;\n material.depthTest = false;\n material.culling = false;\n _this.screenMesh = Mesh.create(engine, {\n name: name,\n geometry: geometry,\n material: material,\n priority: 0\n });\n _this.priority = 5000;\n return _this;\n }\n var _proto = HQGaussianDownSamplePass.prototype;\n _proto.configure = function configure(renderer) {\n this.mainTexture = renderer.getFramebuffer().getColorTextures()[0];\n renderer.setFramebuffer(this.framebuffer);\n };\n _proto.execute = function execute(renderer) {\n renderer.clear({\n colorAction: exports.TextureStoreAction.clear,\n depthAction: exports.TextureStoreAction.clear,\n stencilAction: exports.TextureStoreAction.clear\n });\n this.screenMesh.material.setTexture(\"_MainTex\", this.mainTexture);\n this.screenMesh.material.setVector2(\"_TextureSize\", getTextureSize(this.mainTexture));\n renderer.renderMeshes([\n this.screenMesh\n ]);\n if (this.type === \"V\") {\n this.gaussianResult.texture = renderer.getFramebuffer().getColorTextures()[0];\n }\n };\n return HQGaussianDownSamplePass;\n}(RenderPass);\nvar HQGaussianUpSamplePass = /*#__PURE__*/ function(RenderPass) {\n _inherits(HQGaussianUpSamplePass, RenderPass);\n function HQGaussianUpSamplePass(renderer, options) {\n var _this;\n _this = RenderPass.call(this, renderer, options) || this;\n var name = \"PostProcess\";\n var engine = _this.renderer.engine;\n var geometry = Geometry.create(engine, {\n name: name,\n mode: glContext.TRIANGLE_STRIP,\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array([\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1\n ])\n }\n },\n drawCount: 4\n });\n var shader = {\n vertex: screenMeshVert,\n fragment: gaussianUpFrag\n };\n var material = Material.create(engine, {\n name: name,\n shader: shader\n });\n material.blending = false;\n material.depthTest = false;\n material.culling = false;\n _this.screenMesh = Mesh.create(engine, {\n name: name,\n geometry: geometry,\n material: material,\n priority: 0\n });\n _this.priority = 5000;\n return _this;\n }\n var _proto = HQGaussianUpSamplePass.prototype;\n _proto.configure = function configure(renderer) {\n this.mainTexture = renderer.getFramebuffer().getColorTextures()[0];\n renderer.setFramebuffer(this.framebuffer);\n };\n _proto.execute = function execute(renderer) {\n renderer.clear({\n colorAction: exports.TextureStoreAction.clear,\n depthAction: exports.TextureStoreAction.clear,\n stencilAction: exports.TextureStoreAction.clear\n });\n this.screenMesh.material.setTexture(\"_MainTex\", this.mainTexture);\n this.screenMesh.material.setTexture(\"_GaussianDownTex\", this.gaussianDownSampleResult.texture);\n this.screenMesh.material.setVector2(\"_GaussianDownTextureSize\", getTextureSize(this.gaussianDownSampleResult.texture));\n renderer.renderMeshes([\n this.screenMesh\n ]);\n };\n return HQGaussianUpSamplePass;\n}(RenderPass);\n// 合并Bloom的高斯模糊结果,并应用ACES Tonemapping\nvar ToneMappingPass = /*#__PURE__*/ function(RenderPass) {\n _inherits(ToneMappingPass, RenderPass);\n function ToneMappingPass(renderer, sceneTextureHandle) {\n var _this;\n _this = RenderPass.call(this, renderer, {}) || this;\n var name = \"PostProcess\";\n var engine = _this.renderer.engine;\n _this.sceneTextureHandle = sceneTextureHandle ? sceneTextureHandle : new RenderTargetHandle(engine);\n var geometry = Geometry.create(engine, {\n name: name,\n mode: glContext.TRIANGLE_STRIP,\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array([\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1\n ])\n }\n },\n drawCount: 4\n });\n var material = Material.create(engine, {\n name: name,\n shader: {\n vertex: screenMeshVert,\n fragment: colorGradingFrag,\n glslVersion: exports.GLSLVersion.GLSL1\n }\n });\n material.blending = false;\n material.depthTest = false;\n material.culling = false;\n _this.screenMesh = Mesh.create(engine, {\n name: name,\n geometry: geometry,\n material: material,\n priority: 0\n });\n _this.priority = 5000;\n return _this;\n }\n var _proto = ToneMappingPass.prototype;\n _proto.configure = function configure(renderer) {\n this.mainTexture = renderer.getFramebuffer().getColorTextures()[0];\n if (!this.sceneTextureHandle.texture) {\n this.sceneTextureHandle.texture = this.mainTexture;\n }\n renderer.setFramebuffer(null);\n };\n _proto.execute = function execute(renderer) {\n renderer.clear({\n colorAction: exports.TextureStoreAction.clear,\n depthAction: exports.TextureStoreAction.clear,\n stencilAction: exports.TextureStoreAction.clear\n });\n var globalVolume = renderer.renderingData.currentFrame.globalVolume;\n var bloom = _extends({\n threshold: 0,\n intensity: 0,\n active: false\n }, globalVolume == null ? void 0 : globalVolume.bloom);\n var vignette = _extends({\n intensity: 0,\n smoothness: 0,\n roundness: 0,\n active: false\n }, globalVolume == null ? void 0 : globalVolume.vignette);\n var colorAdjustments = _extends({\n brightness: 0,\n saturation: 0,\n contrast: 0,\n active: false\n }, globalVolume == null ? void 0 : globalVolume.colorAdjustments);\n var tonemapping = _extends({\n active: false\n }, globalVolume == null ? void 0 : globalVolume.tonemapping);\n this.screenMesh.material.setTexture(\"_SceneTex\", this.sceneTextureHandle.texture);\n this.screenMesh.material.setFloat(\"_Brightness\", Math.pow(2, colorAdjustments.brightness));\n this.screenMesh.material.setFloat(\"_Saturation\", colorAdjustments.saturation * 0.01 + 1);\n this.screenMesh.material.setFloat(\"_Contrast\", colorAdjustments.contrast * 0.01 + 1);\n this.screenMesh.material.setInt(\"_UseBloom\", Number(bloom.active));\n if (bloom.active) {\n this.screenMesh.material.setTexture(\"_GaussianTex\", this.mainTexture);\n this.screenMesh.material.setFloat(\"_BloomIntensity\", bloom.intensity);\n }\n if (vignette.intensity > 0) {\n this.screenMesh.material.setFloat(\"_VignetteIntensity\", vignette.intensity);\n this.screenMesh.material.setFloat(\"_VignetteSmoothness\", vignette.smoothness);\n this.screenMesh.material.setFloat(\"_VignetteRoundness\", vignette.roundness);\n this.screenMesh.material.setVector2(\"_VignetteCenter\", new Vector2(0.5, 0.5));\n this.screenMesh.material.setVector3(\"_VignetteColor\", new Vector3(0.0, 0.0, 0.0));\n }\n this.screenMesh.material.setInt(\"_UseToneMapping\", Number(tonemapping.active));\n renderer.renderMeshes([\n this.screenMesh\n ]);\n };\n return ToneMappingPass;\n}(RenderPass);\n\nvar RENDER_PASS_NAME_PREFIX = \"_effects_default_\";\nvar seed$9 = 1;\n/**\n * RenderFrame 抽象类\n */ var RenderFrame = /*#__PURE__*/ function() {\n function RenderFrame(options) {\n var _this_renderer_getShaderLibrary;\n // TODO: 是否有用\n this.renderQueue = [];\n this.destroyed = false;\n this.renderPassInfoMap = new WeakMap();\n var camera = options.camera, keepColorBuffer = options.keepColorBuffer, renderer = options.renderer, _options_editorTransform = options.editorTransform, editorTransform = _options_editorTransform === void 0 ? [\n 1,\n 1,\n 0,\n 0\n ] : _options_editorTransform, globalVolume = options.globalVolume, _options_postProcessingEnabled = options.postProcessingEnabled, postProcessingEnabled = _options_postProcessingEnabled === void 0 ? false : _options_postProcessingEnabled, _options_clearAction = options.clearAction, clearAction = _options_clearAction === void 0 ? {\n colorAction: exports.TextureLoadAction.whatever,\n stencilAction: exports.TextureLoadAction.clear,\n depthAction: exports.TextureLoadAction.whatever\n } : _options_clearAction;\n var engine = renderer.engine;\n if (globalVolume) {\n this.globalVolume = globalVolume;\n }\n this.globalUniforms = new GlobalUniforms();\n var attachments = []; //渲染场景物体Pass的RT\n var depthStencilAttachment;\n var drawObjectPassClearAction = {};\n this.renderer = renderer;\n if (postProcessingEnabled) {\n var enableHDR = true;\n if (!this.renderer.engine.gpuCapability.detail.halfFloatTexture) {\n throw new Error(\"Half float texture is not supported.\");\n }\n // 使用HDR浮点纹理,FLOAT在IOS上报错,使用HALF_FLOAT\n var textureType = enableHDR ? glContext.HALF_FLOAT : glContext.UNSIGNED_BYTE;\n attachments = [\n {\n texture: {\n format: glContext.RGBA,\n type: textureType,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR\n }\n }\n ];\n depthStencilAttachment = {\n storageType: exports.RenderPassAttachmentStorageType.depth_stencil_opaque\n };\n drawObjectPassClearAction = {\n colorAction: exports.TextureLoadAction.clear,\n stencilAction: exports.TextureLoadAction.clear,\n depthAction: exports.TextureLoadAction.clear\n };\n }\n this.drawObjectPass = new RenderPass(renderer, {\n name: RENDER_PASS_NAME_PREFIX,\n priority: RenderPassPriorityNormal,\n meshOrder: exports.OrderType.ascending,\n depthStencilAttachment: depthStencilAttachment,\n attachments: attachments,\n clearAction: drawObjectPassClearAction\n });\n var renderPasses = [\n this.drawObjectPass\n ];\n this.setRenderPasses(renderPasses);\n if (postProcessingEnabled) {\n var sceneTextureHandle = new RenderTargetHandle(engine); //保存后处理前的屏幕图像\n var gaussianStep = 7; // 高斯模糊的迭代次数,次数越高模糊范围越大\n var viewport = [\n 0,\n 0,\n this.renderer.getWidth() / 2,\n this.renderer.getHeight() / 2\n ];\n var gaussianDownResults = new Array(gaussianStep); //存放多个高斯Pass的模糊结果,用于Bloom\n var enableHDR1 = true;\n var textureType1 = enableHDR1 ? glContext.HALF_FLOAT : glContext.UNSIGNED_BYTE;\n var bloomThresholdPass = new BloomThresholdPass(renderer, {\n name: \"BloomThresholdPass\",\n attachments: [\n {\n texture: {\n format: glContext.RGBA,\n type: textureType1,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR\n }\n }\n ]\n });\n bloomThresholdPass.sceneTextureHandle = sceneTextureHandle;\n this.addRenderPass(bloomThresholdPass);\n for(var i = 0; i < gaussianStep; i++){\n gaussianDownResults[i] = new RenderTargetHandle(engine);\n var gaussianDownHPass = new HQGaussianDownSamplePass(renderer, \"H\", {\n name: \"GaussianDownPassH\" + i,\n viewport: viewport,\n attachments: [\n {\n texture: {\n format: glContext.RGBA,\n type: textureType1,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR\n }\n }\n ]\n });\n var gaussianDownVPass = new HQGaussianDownSamplePass(renderer, \"V\", {\n name: \"GaussianDownPassV\" + i,\n viewport: viewport,\n attachments: [\n {\n texture: {\n format: glContext.RGBA,\n type: textureType1,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR\n }\n }\n ]\n });\n gaussianDownVPass.gaussianResult = gaussianDownResults[i];\n this.addRenderPass(gaussianDownHPass);\n this.addRenderPass(gaussianDownVPass);\n viewport[2] /= 2;\n viewport[3] /= 2;\n // TODO 限制最大迭代\n }\n viewport[2] *= 4;\n viewport[3] *= 4;\n for(var i1 = 0; i1 < gaussianStep - 1; i1++){\n var gaussianUpPass = new HQGaussianUpSamplePass(renderer, {\n name: \"GaussianUpPass\" + i1,\n viewport: viewport,\n attachments: [\n {\n texture: {\n format: glContext.RGBA,\n type: textureType1,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR\n }\n }\n ]\n });\n gaussianUpPass.gaussianDownSampleResult = gaussianDownResults[gaussianStep - 2 - i1];\n this.addRenderPass(gaussianUpPass);\n viewport[2] *= 2;\n viewport[3] *= 2;\n }\n var postProcessPass = new ToneMappingPass(renderer, sceneTextureHandle);\n this.addRenderPass(postProcessPass);\n }\n this.semantics = new SemanticMap(options.semantics);\n this.clearAction = clearAction;\n this.name = \"RenderFrame\" + seed$9++;\n var firstRP = renderPasses[0];\n this.emptyTexture = generateWhiteTexture(engine);\n this.transparentTexture = generateTransparentTexture(engine);\n this.camera = camera;\n this.keepColorBuffer = keepColorBuffer;\n this.renderPassInfoMap.set(firstRP, {\n listStart: 0,\n listEnd: 0,\n renderPass: firstRP,\n intermedia: false\n });\n this.editorTransform = Vector4$1.fromArray(editorTransform);\n if (!options.clearAction) {\n this.resetClearActions();\n }\n this.passTextureCache = new PassTextureCache(engine);\n // FIXME: addShader是为了性能考虑,如果影响不大,下面代码可以删除\n var _engine_gpuCapability = engine.gpuCapability, detail = _engine_gpuCapability.detail, level = _engine_gpuCapability.level;\n var writeDepth = detail.readableDepthStencilTextures && detail.writableFragDepth;\n var shader = createCopyShader(level, writeDepth);\n (_this_renderer_getShaderLibrary = this.renderer.getShaderLibrary()) == null ? void 0 : _this_renderer_getShaderLibrary.addShader(shader);\n }\n var _proto = RenderFrame.prototype;\n /**\n * 根据 Mesh 优先级添加到 RenderPass\n * @param mesh - 要添加的 Mesh 对象\n */ _proto.addMeshToDefaultRenderPass = function addMeshToDefaultRenderPass(mesh) {\n this.drawObjectPass.addMesh(mesh);\n };\n /**\n * 把 Mesh 从 RenderPass 中移除,\n * 如果 renderPass 中没有 mesh,此 renderPass 会被删除\n * @param mesh - 要删除的 Mesh 对象\n */ _proto.removeMeshFromDefaultRenderPass = function removeMeshFromDefaultRenderPass(mesh) {\n this.drawObjectPass.removeMesh(mesh);\n };\n /**\n * 销毁 RenderFrame\n * @param options - 可以有选择销毁一些对象\n */ _proto.dispose = function dispose(options) {\n if ((options == null ? void 0 : options.semantics) !== exports.DestroyOptions.keep) {\n this.semantics.dispose();\n }\n var pass = (options == null ? void 0 : options.passes) ? options.passes : undefined;\n if (pass !== exports.DestroyOptions.keep) {\n this._renderPasses.forEach(function(renderPass) {\n renderPass.dispose(pass);\n });\n }\n this.passTextureCache.dispose();\n this._renderPasses.length = 0;\n this.emptyTexture.dispose();\n this.transparentTexture.dispose();\n if (this.resource) {\n var _this_resource_depthStencil_texture, _this_resource_depthStencil;\n this.resource.color_a.dispose();\n this.resource.color_b.dispose();\n (_this_resource_depthStencil = this.resource.depthStencil) == null ? void 0 : (_this_resource_depthStencil_texture = _this_resource_depthStencil.texture) == null ? void 0 : _this_resource_depthStencil_texture.dispose();\n this.resource.finalCopyRP.dispose();\n this.resource.resRP.dispose();\n // @ts-expect-error\n this.resource = null;\n }\n this.destroyed = true;\n };\n /**\n * 重置 RenderPass ColorAttachment,解决 Framebuffer 即读又写的问题\n * @param renderPasses - RenderPass 对象数组\n * @param startIndex - 开始重置的索引\n */ _proto.resetRenderPassDefaultAttachment = function resetRenderPassDefaultAttachment(renderPasses, startIndex) {\n var pre;\n var _this_resource = this.resource, color_a = _this_resource.color_a, color_b = _this_resource.color_b;\n for(var i = startIndex; i < renderPasses.length; i++){\n var _rp_attachments_, _rp_attachments_1;\n var rp = renderPasses[i];\n var tex = (_rp_attachments_ = rp.attachments[0]) == null ? void 0 : _rp_attachments_.texture;\n // @ts-expect-error\n if (tex && pre === tex) {\n var next = tex === color_a ? color_b : color_a;\n rp.resetColorAttachments([\n next\n ]);\n //this.renderer.extension.resetColorAttachments?.(rp as GLRenderPass, [next as GLTexture]);\n }\n tex = (_rp_attachments_1 = rp.attachments[0]) == null ? void 0 : _rp_attachments_1.texture;\n if (tex) {\n pre = tex;\n }\n }\n };\n /**\n * 查找 Mesh 所在的 RenderPass 索引,没找到是-1\n * @param mesh - 需要查找的 Mesh\n */ _proto.findMeshRenderPassIndex = function findMeshRenderPassIndex(mesh) {\n var index = -1;\n this.renderPasses.every(function(rp, idx) {\n if (rp.name.startsWith(RENDER_PASS_NAME_PREFIX) && rp.meshes.includes(mesh)) {\n index = idx;\n return false;\n }\n return true;\n });\n return index;\n };\n _proto.addToRenderPass = function addToRenderPass(renderPass, mesh) {\n var info = this.renderPassInfoMap.get(renderPass);\n var priority = mesh.priority;\n if (!info) {\n return;\n }\n if (renderPass.meshes.length === 0) {\n info.listStart = info.listEnd = priority;\n } else {\n if (priority < info.listStart) {\n info.listStart = priority;\n } else if (priority > info.listEnd) {\n info.listEnd = priority;\n }\n }\n renderPass.addMesh(mesh);\n };\n _proto.getRPAttachments = function getRPAttachments(attachments, preRP) {\n if ((attachments == null ? void 0 : attachments.length) === 1) {\n var _attachments_ = attachments[0], texture = _attachments_.texture, persistent = _attachments_.persistent;\n var format = texture.format;\n var _preRP_getInitAttachments;\n var previousAttachmens = (_preRP_getInitAttachments = preRP == null ? void 0 : preRP.getInitAttachments()) != null ? _preRP_getInitAttachments : [];\n if (format === glContext.RGBA && !persistent) {\n var texA = this.resource.color_a;\n if (previousAttachmens.length === 0) {\n return [\n {\n texture: texA\n }\n ];\n }\n var texture1 = previousAttachmens[0].texture === texA ? this.resource.color_b : texA;\n return [\n {\n texture: texture1\n }\n ];\n }\n }\n return attachments;\n };\n _proto.resetClearActions = function resetClearActions() {\n var action = this.renderPasses.length > 1 ? exports.TextureLoadAction.clear : exports.TextureLoadAction.whatever;\n this.clearAction.stencilAction = action;\n this.clearAction.depthAction = action;\n this.clearAction.colorAction = action;\n if (this.keepColorBuffer) {\n this.clearAction.colorAction = exports.TextureLoadAction.whatever;\n }\n };\n /**\n * 设置 RenderPass 数组,直接修改内部的 RenderPass 数组\n * @param passes - RenderPass 数组\n */ _proto.setRenderPasses = function setRenderPasses(passes) {\n var _this = this;\n if (this.renderer !== undefined) {\n passes.forEach(function(pass) {\n return pass.initialize(_this.renderer);\n });\n }\n this._renderPasses = passes.slice();\n };\n /**\n * 添加 RenderPass\n * @param pass - 需要添加的 RenderPass\n */ _proto.addRenderPass = function addRenderPass(pass) {\n if (this.renderer !== undefined) {\n pass.initialize(this.renderer);\n }\n this._renderPasses.push(pass);\n };\n /**\n * 创建 RenderPass 切分时需要的 GPU 资源\n */ _proto.createResource = function createResource() {\n var engine = this.renderer.engine;\n if (!this.resource) {\n var _resRP_getDepthAttachment;\n var _engine_gpuCapability = engine.gpuCapability, detail = _engine_gpuCapability.detail, level = _engine_gpuCapability.level;\n var width = this.renderer.getWidth();\n var height = this.renderer.getHeight();\n var filter = level === 2 ? glContext.LINEAR : glContext.NEAREST;\n var texA = Texture.create(engine, {\n sourceType: exports.TextureSourceType.framebuffer,\n format: glContext.RGBA,\n name: \"frame_a\",\n minFilter: filter,\n magFilter: filter\n });\n var texB = Texture.create(engine, {\n sourceType: exports.TextureSourceType.framebuffer,\n format: glContext.RGBA,\n data: {\n width: width,\n height: height\n },\n minFilter: filter,\n magFilter: filter,\n name: \"frame_b\"\n });\n var depthStencilType = detail.readableDepthStencilTextures && detail.writableFragDepth ? exports.RenderPassAttachmentStorageType.depth_24_stencil_8_texture : exports.RenderPassAttachmentStorageType.depth_stencil_opaque;\n var resRP = new RenderPass(this.renderer, {\n depthStencilAttachment: {\n storageType: depthStencilType\n },\n attachments: [\n {\n texture: texA\n }\n ]\n }).initialize(this.renderer);\n var finalCopyRP = new FinalCopyRP(this.renderer, {\n name: \"effects-final-copy\",\n priority: RenderPassPriorityNormal + 600,\n clearAction: {\n depthAction: exports.TextureLoadAction.clear,\n stencilAction: exports.TextureLoadAction.clear,\n colorAction: exports.TextureLoadAction.clear\n },\n meshOrder: exports.OrderType.ascending,\n meshes: [\n this.createCopyMesh({\n blend: true,\n depthTexture: (_resRP_getDepthAttachment = resRP.getDepthAttachment()) == null ? void 0 : _resRP_getDepthAttachment.texture\n })\n ]\n });\n this.resource = {\n color_a: resRP.attachments[0].texture,\n color_b: texB,\n finalCopyRP: finalCopyRP,\n depthStencil: resRP.depthAttachment,\n resRP: resRP\n };\n }\n };\n // TODO tex和size没有地方用到。\n /**\n * 创建拷贝 RenderPass 用到的 Mesh 对象\n * @param semantics - RenderPass 渲染时 Framebuffer 的颜色和深度纹理、大小和是否混合\n */ _proto.createCopyMesh = function createCopyMesh(semantics) {\n var // FIXME: 如果不把shader添加进shaderLibrary,这里可以移到core中,有性能上的考虑\n _this_renderer_getShaderLibrary;\n var name = EFFECTS_COPY_MESH_NAME;\n var engine = this.renderer.engine;\n var geometry = Geometry.create(engine, {\n name: name,\n mode: glContext.TRIANGLE_STRIP,\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array([\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1\n ])\n }\n },\n drawCount: 4\n });\n var shader = createCopyShader(engine.gpuCapability.level, !!(semantics == null ? void 0 : semantics.depthTexture));\n (_this_renderer_getShaderLibrary = this.renderer.getShaderLibrary()) == null ? void 0 : _this_renderer_getShaderLibrary.addShader(shader);\n var material = Material.create(engine, {\n uniformValues: {\n // @ts-expect-error\n uDepth: semantics == null ? void 0 : semantics.depthTexture\n },\n name: name,\n shader: shader\n });\n material.blending = false;\n material.depthTest = false;\n material.culling = false;\n if (semantics == null ? void 0 : semantics.blend) {\n material.blending = true;\n material.blendFunction = [\n glContext.SRC_ALPHA,\n glContext.ONE_MINUS_SRC_ALPHA,\n glContext.SRC_ALPHA,\n glContext.ONE_MINUS_SRC_ALPHA\n ];\n }\n return Mesh.create(engine, {\n name: name,\n geometry: geometry,\n material: material,\n priority: 0\n });\n };\n /**\n * 移除 RenderPass\n * @param pass - 需要移除的 RenderPass\n */ _proto.removeRenderPass = function removeRenderPass(pass) {\n removeItem(this._renderPasses, pass);\n };\n _create_class(RenderFrame, [\n {\n key: \"renderPasses\",\n get: function get() {\n return this._renderPasses.slice();\n }\n },\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return RenderFrame;\n}();\nfunction getTextureSize(tex) {\n return tex ? new Vector2(tex.getWidth(), tex.getHeight()) : new Vector2();\n}\nfunction findPreviousRenderPass(renderPasses, renderPass) {\n var index = renderPasses.indexOf(renderPass);\n return renderPasses[index - 1];\n}\nvar FinalCopyRP = /*#__PURE__*/ function(RenderPass) {\n _inherits(FinalCopyRP, RenderPass);\n function FinalCopyRP() {\n return RenderPass.apply(this, arguments);\n }\n var _proto = FinalCopyRP.prototype;\n _proto.configure = function configure(renderer) {\n var framebuffer = renderer.getFramebuffer();\n if (framebuffer) {\n this.prePassTexture = framebuffer.getColorTextures()[0];\n }\n renderer.setFramebuffer(null);\n };\n _proto.execute = function execute(renderer) {\n renderer.clear(this.clearAction);\n this.meshes[0].material.setTexture(\"uFilterSource\", this.prePassTexture);\n this.meshes[0].material.setVector2(\"uFilterSourceSize\", getTextureSize(this.prePassTexture));\n renderer.renderMeshes(this.meshes);\n if (this.storeAction) {\n renderer.clear(this.storeAction);\n }\n };\n return FinalCopyRP;\n}(RenderPass);\nvar GlobalUniforms = function GlobalUniforms() {\n this.floats = {};\n this.ints = {};\n this.vector3s = {};\n this.vector4s = {};\n this.matrices = {};\n //...\n this.samplers = [] // 存放的sampler名称。\n ;\n this.uniforms = [] // 存放的uniform名称(不包括sampler)。\n ;\n};\n\nvar Renderbuffer = /*#__PURE__*/ function() {\n function Renderbuffer(props) {\n this.size = [\n 0,\n 0\n ];\n this.multiSample = 1;\n this.destroyed = false;\n var storageType = props.storageType, format = props.format, attachment = props.attachment;\n this.storageType = storageType;\n this.format = format;\n this.attachment = attachment;\n }\n _create_class(Renderbuffer, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return Renderbuffer;\n}();\n\nvar isWebGL2Available = typeof WebGL2RenderingContext === \"function\";\nvar GPUCapability = /*#__PURE__*/ function() {\n function GPUCapability(gl) {\n this.setupCapability(gl);\n }\n var _proto = GPUCapability.prototype;\n _proto.setupCapability = function setupCapability(gl) {\n var _gl_getExtension;\n var level = isWebGL2Available && _instanceof1(gl, WebGL2RenderingContext) ? 2 : 1;\n var level2 = level === 2;\n var textureAnisotropicExt = gl.getExtension(\"EXT_texture_filter_anisotropic\") || gl.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");\n var depthTextureExtension = gl.getExtension(\"WEBGL_depth_texture\");\n var halfFloatLinear = !!gl.getExtension(\"OES_texture_half_float_linear\");\n var floatLinear = !!gl.getExtension(\"OES_texture_float_linear\");\n this.level = level;\n this.type = level2 ? \"webgl2\" : \"webgl\";\n this.vaoExt = gl.getExtension(\"OES_vertex_array_object\");\n this.glAsyncCompileExt = gl.getExtension(\"KHR_parallel_shader_compile\");\n this.UNSIGNED_INT_24_8 = gl.UNSIGNED_INT_24_8;\n this.drawBufferExtension = gl.getExtension(\"WEBGL_draw_buffers\");\n if (depthTextureExtension) {\n this.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL;\n }\n if (level2 && !halfFloatLinear) {\n halfFloatLinear = checkLinearTextureFilter(gl, gl.HALF_FLOAT);\n }\n if (level2 && !floatLinear) {\n floatLinear = checkLinearTextureFilter(gl, gl.FLOAT);\n }\n this.internalFormatDepth16 = level2 ? gl.DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT;\n this.internalFormatDepth24_stencil8 = level2 ? gl.DEPTH24_STENCIL8 : gl.DEPTH_STENCIL;\n var floatTexture = level2 || gl.getExtension(\"OES_texture_float\") ? gl.FLOAT : 0;\n var halfFloatTexture = level2 ? WebGL2RenderingContext.HALF_FLOAT : ((_gl_getExtension = gl.getExtension(\"OES_texture_half_float\")) == null ? void 0 : _gl_getExtension.HALF_FLOAT_OES) || 0;\n var detail = {\n floatTexture: floatTexture,\n halfFloatTexture: halfFloatTexture,\n maxSample: level2 ? gl.getParameter(gl.MAX_SAMPLES) : 1,\n maxVertexUniforms: gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS),\n maxVertexTextures: gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n maxFragmentUniforms: gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS),\n maxFragmentTextures: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),\n floatColorAttachment: level2 ? !!gl.getExtension(\"EXT_color_buffer_float\") : floatTexture > 0 && !!gl.getExtension(\"WEBGL_color_buffer_float\"),\n halfFloatColorAttachment: level2 ? !!gl.getExtension(\"EXT_color_buffer_float\") : halfFloatTexture > 0 && !!gl.getExtension(\"EXT_color_buffer_half_float\"),\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxShaderTexCount: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n compressedTexture: registerCompressedTexture(gl),\n halfFloatLinear: halfFloatLinear,\n floatLinear: floatLinear,\n maxTextureAnisotropy: textureAnisotropicExt ? gl.getParameter(textureAnisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0,\n shaderTextureLod: level2 || !!gl.getExtension(\"EXT_shader_texture_lod\"),\n instanceDraw: level2 || !!gl.getExtension(\"ANGLE_instanced_arrays\"),\n drawBuffers: level2 || !!this.drawBufferExtension,\n asyncShaderCompile: !!this.glAsyncCompileExt,\n intIndexElementBuffer: !!gl.getExtension(\"OES_element_index_uint\"),\n standardDerivatives: level2 || !!gl.getExtension(\"OES_standard_derivatives\"),\n readableDepthStencilTextures: level2 || !!depthTextureExtension,\n writableFragDepth: level2 || !!gl.getExtension(\"EXT_frag_depth\")\n };\n this[\"detail\"] = detail;\n if (textureAnisotropicExt) {\n this.textureMaxAnisotropyExt = textureAnisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT;\n }\n };\n _proto.framebufferTexture2D = function framebufferTexture2D(gl, target, index, textarget, texture) {\n var ext = this.drawBufferExtension;\n if (this.level === 1 && !ext && index > 0) {\n throw new Error(\"Draw multiple color buffers not available.\");\n }\n var attachment = ext ? ext[\"COLOR_ATTACHMENT\" + index + \"_WEBGL\"] : gl[\"COLOR_ATTACHMENT\" + index];\n if (attachment) {\n gl.framebufferTexture2D(target, attachment, textarget, texture, 0);\n } else {\n console.error(\"Invalid color attachment index: \" + index + \".\");\n }\n };\n _proto.drawBuffers = function drawBuffers(gl, bufferStates) {\n var ext = this.drawBufferExtension;\n if (this.level === 1 && !ext) {\n if (bufferStates.length > 1) {\n throw new Error(\"Draw buffers not available.\");\n } else {\n return;\n }\n }\n var buffers = bufferStates.map(function(enabled, index) {\n if (enabled) {\n return ext ? ext[\"COLOR_ATTACHMENT\" + index + \"_WEBGL\"] : gl[\"COLOR_ATTACHMENT\" + index];\n }\n return gl.NONE;\n });\n if (ext) {\n ext.drawBuffersWEBGL(buffers);\n } else {\n gl.drawBuffers(buffers);\n }\n };\n _proto.setTextureAnisotropic = function setTextureAnisotropic(gl, target, level) {\n var maxTextureAnisotropy = this.detail.maxTextureAnisotropy;\n if (maxTextureAnisotropy) {\n gl.texParameterf(target, this.textureMaxAnisotropyExt, Math.min(maxTextureAnisotropy, level || 4));\n }\n };\n return GPUCapability;\n}();\nfunction checkLinearTextureFilter(gl, type) {\n var tex = gl.createTexture();\n var ret = false;\n gl.getError();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.R16F, 1, 1, 0, gl.RED, type, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n if (!gl.getError()) {\n ret = true;\n }\n gl.deleteTexture(tex);\n return ret;\n}\nexports.COMPRESSED_TEXTURE = void 0;\n(function(COMPRESSED_TEXTURE) {\n COMPRESSED_TEXTURE[COMPRESSED_TEXTURE[\"NONE\"] = 0] = \"NONE\";\n COMPRESSED_TEXTURE[COMPRESSED_TEXTURE[\"PVRTC\"] = 1] = \"PVRTC\";\n COMPRESSED_TEXTURE[COMPRESSED_TEXTURE[\"ASTC\"] = 2] = \"ASTC\";\n})(exports.COMPRESSED_TEXTURE || (exports.COMPRESSED_TEXTURE = {}));\nfunction registerCompressedTexture(gl) {\n if (gl.getExtension(\"WEBGL_compressed_texture_astc\")) {\n return 2;\n }\n if (gl.getExtension(\"WEBGL_compressed_texture_pvrtc\") || gl.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\")) {\n return 1;\n }\n return 0;\n}\n\nexports.FilterMode = void 0;\n(function(FilterMode) {\n FilterMode[FilterMode[\"Nearest\"] = 0] = \"Nearest\";\n FilterMode[FilterMode[\"Linear\"] = 1] = \"Linear\";\n})(exports.FilterMode || (exports.FilterMode = {}));\nexports.RenderTextureFormat = void 0;\n(function(RenderTextureFormat) {\n RenderTextureFormat[RenderTextureFormat[\"RGBA32\"] = 0] = \"RGBA32\";\n RenderTextureFormat[RenderTextureFormat[\"RGBAHalf\"] = 1] = \"RGBAHalf\";\n})(exports.RenderTextureFormat || (exports.RenderTextureFormat = {}));\n/**\n *\n */ var Framebuffer = /*#__PURE__*/ function() {\n function Framebuffer() {}\n var _proto = Framebuffer.prototype;\n _proto.resize = function resize(x, y, width, height) {\n // OVERRIDE\n };\n _proto.resetColorTextures = function resetColorTextures(textures) {\n // OVERRIDE\n };\n _proto.unbind = function unbind() {\n // OVERRIDE\n };\n _proto.bind = function bind() {\n // OVERRIDE\n };\n _proto.getDepthTexture = function getDepthTexture() {\n // OVERRIDE\n return undefined;\n };\n _proto.getStencilTexture = function getStencilTexture() {\n // OVERRIDE\n return undefined;\n };\n _proto.getColorTextures = function getColorTextures() {\n // OVERRIDE\n return [];\n };\n _proto.dispose = function dispose(options) {\n // OVERRIDE\n };\n _create_class(Framebuffer, [\n {\n key: \"stencilStorage\",\n get: function get() {\n // OVERRIDE\n return undefined;\n }\n },\n {\n key: \"depthStorage\",\n get: function get() {\n // OVERRIDE\n return undefined;\n }\n }\n ]);\n return Framebuffer;\n}();\n\nvar Renderer = /*#__PURE__*/ function() {\n function Renderer() {}\n var _proto = Renderer.prototype;\n _proto.setGlobalFloat = function setGlobalFloat(name, value) {\n // OVERRIDE\n };\n _proto.setGlobalInt = function setGlobalInt(name, value) {\n // OVERRIDE\n };\n _proto.setGlobalVector4 = function setGlobalVector4(name, value) {\n // OVERRIDE\n };\n _proto.setGlobalVector3 = function setGlobalVector3(name, value) {\n // OVERRIDE\n };\n _proto.setGlobalMatrix = function setGlobalMatrix(name, value) {\n // OVERRIDE\n };\n _proto.getFramebuffer = function getFramebuffer() {\n // OVERRIDE\n return null;\n };\n _proto.setFramebuffer = function setFramebuffer(framebuffer) {\n // OVERRIDE\n };\n _proto.setViewport = function setViewport(x, y, width, height) {\n // OVERRIDE\n };\n _proto.resize = function resize(canvasWidth, canvasHeight) {\n // OVERRIDE\n };\n _proto.clear = function clear(action) {\n // OVERRIDE\n };\n _proto.getWidth = function getWidth() {\n // OVERRIDE\n return 0;\n };\n _proto.getHeight = function getHeight() {\n // OVERRIDE\n return 0;\n };\n /**\n * 添加 webglcontextlost 事件回调\n * @override\n * @param lostHandler\n */ _proto.addLostHandler = function addLostHandler(lostHandler) {\n // OVERRIDE\n };\n /**\n * 添加 webglContextrestored 事件的回调\n * @override\n * @param restoreHandler\n */ _proto.addRestoreHandler = function addRestoreHandler(restoreHandler) {\n // OVERRIDE\n };\n /**\n * @override\n * @param e\n */ _proto.lost = function lost(e) {\n // OVERRIDE\n };\n /**\n * @override\n */ _proto.restore = function restore() {\n // OVERRIDE\n };\n /**\n *\n * @override\n * @returns\n */ _proto.getShaderLibrary = function getShaderLibrary() {\n // OVERRIDE\n return undefined;\n };\n _proto.renderRenderFrame = function renderRenderFrame(renderFrame) {\n // OVERRIDE\n };\n _proto.renderMeshes = function renderMeshes(meshes) {\n // OVERRIDE\n };\n _proto.drawGeometry = function drawGeometry(geometry, material, subMeshIndex) {\n // OVERRIDE\n };\n _proto.getTemporaryRT = function getTemporaryRT(name, width, height, depthBuffer, filter, format) {\n // OVERRIDE\n return null;\n };\n _proto.dispose = function dispose(haltGL) {\n // OVERRIDE\n };\n return Renderer;\n}();\n\nvar Cone = /*#__PURE__*/ function() {\n function Cone(props) {\n var _this = this;\n Object.keys(props).forEach(function(key) {\n _this[key] = props[key];\n });\n }\n var _proto = Cone.prototype;\n _proto.generate = function generate(opt) {\n var arc = getArcAngle(this.arc, this.arcMode, opt);\n var a = arc * DEG2RAD;\n var x = Math.cos(a) * this.radius;\n var y = Math.sin(a) * this.radius;\n var position = new Vector3(x, y, 0);\n var l = Math.tan(this.angle * DEG2RAD);\n var dir = position.clone().multiply(l);\n // dir + [0,0,1]\n dir.z += 1;\n return {\n position: position.multiply(randomInRange(0, 1)),\n direction: dir.normalize()\n };\n };\n return Cone;\n}();\nfunction getArcAngle(arc, arcMode, opt) {\n if (arcMode === ShapeArcMode.RANDOM) {\n arc = randomInRange(0, arc);\n } else if (arcMode === ShapeArcMode.UNIDIRECTIONAL_CYCLE) {\n var d = opt.index % (opt.total + 1);\n arc = arc / opt.total * d;\n } else if (arcMode === ShapeArcMode.BIDIRECTIONAL_CYCLE) {\n var d1 = opt.index / (opt.total + 1);\n var i = d1 - Math.floor(d1);\n arc = arc * (Math.floor(d1) % 2 ? 1 - i : i);\n } else if (arcMode === ShapeArcMode.UNIFORM_BURST) {\n arc = arc * opt.burstIndex / opt.burstCount;\n }\n return arc;\n}\n\nvar Circle = /*#__PURE__*/ function() {\n function Circle(props) {\n var _this = this;\n Object.keys(props).forEach(function(key) {\n _this[key] = props[key];\n });\n }\n var _proto = Circle.prototype;\n _proto.generate = function generate(opt) {\n var arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n var direction = new Vector3(Math.cos(arc), Math.sin(arc), 0);\n var radius = this.radius;\n return {\n direction: direction,\n position: direction.clone().multiply(radius)\n };\n };\n return Circle;\n}();\nvar Rectangle$1 = /*#__PURE__*/ function() {\n function Rectangle(arg) {\n this._d = (arg.width || 1) / 2;\n this._h = (arg.height || 1) / 2;\n }\n var _proto = Rectangle.prototype;\n _proto.generate = function generate(opt) {\n var x = randomInRange(-this._d, this._d);\n var y = randomInRange(-this._h, this._h);\n return {\n direction: new Vector3(0, 0, 1),\n position: new Vector3(x, y, 0)\n };\n };\n return Rectangle;\n}();\nvar RectangleEdge = /*#__PURE__*/ function() {\n function RectangleEdge(arg) {\n this._d = (arg.width || 1) / 2;\n this._h = (arg.height || 1) / 2;\n this.arcMode = arg.arcMode;\n this.arc = arg.arc;\n }\n var _proto = RectangleEdge.prototype;\n _proto.generate = function generate(opt) {\n var arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n var direction = new Vector3(Math.cos(arc), Math.sin(arc), 0);\n var w = this._d;\n var h = this._h;\n var r0 = Math.atan2(h, w);\n var tan = Math.tan(arc);\n var position = new Vector3();\n if (arc < r0) {\n position.set(w, w * tan, 0);\n } else if (arc >= r0 && arc < Math.PI - r0) {\n position.set(h / tan, h, 0);\n } else if (arc < Math.PI + r0) {\n position.set(-w, -w * tan, 0);\n } else if (arc < Math.PI * 2 - r0) {\n position.set(-h / tan, -h, 0);\n } else {\n position.set(w, w * tan, 0);\n }\n return {\n direction: direction,\n position: position\n };\n };\n return RectangleEdge;\n}();\nvar Edge = /*#__PURE__*/ function() {\n function Edge(args) {\n this._d = args.width || 1;\n this.arcMode = args.arcMode;\n }\n var _proto = Edge.prototype;\n _proto.generate = function generate(options) {\n var x = this.arcMode === ShapeArcMode.UNIFORM_BURST ? options.burstIndex % options.burstCount / (options.burstCount - 1) : randomInRange(0, 1);\n return {\n direction: new Vector3(0, 1, 0),\n position: new Vector3(this._d * (x - 0.5), 0, 0)\n };\n };\n return Edge;\n}();\n\nvar tempMat4$3 = new Matrix4$1();\nvar Donut = /*#__PURE__*/ function() {\n function Donut(props) {\n var _this = this;\n Object.keys(props).forEach(function(key) {\n _this[key] = props[key];\n });\n }\n var _proto = Donut.prototype;\n _proto.generate = function generate(opt) {\n var dradius = this.donutRadius;\n var center = this.radius - dradius;\n var angle = randomInRange(0, Math.PI * 2);\n var arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n var rot = tempMat4$3.setFromRotationZ(arc);\n var direction = new Vector3(Math.cos(angle), Math.sin(angle), 0);\n var position = new Vector3(center + Math.cos(angle) * dradius, 0, Math.sin(angle) * dradius);\n return {\n direction: rot.transformNormal(direction),\n position: rot.transformPoint(position)\n };\n };\n return Donut;\n}();\n\nvar tempMat4$2 = new Matrix4$1();\nvar Sphere = /*#__PURE__*/ function() {\n function Sphere(props) {\n var _this = this;\n Object.keys(props).forEach(function(key) {\n _this[key] = props[key];\n });\n }\n var _proto = Sphere.prototype;\n _proto.getHorizontalAngle = function getHorizontalAngle() {\n return randomInRange(-90, 90);\n };\n _proto.generate = function generate(opt) {\n var rz = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n var rh = this.getHorizontalAngle() * DEG2RAD;\n var radius = this.radius;\n var point = new Vector3(Math.cos(rh), 0, Math.sin(rh));\n var mat4 = tempMat4$2.setFromRotationZ(rz);\n var p = mat4.transformNormal(point);\n return {\n position: p.clone().multiply(radius),\n direction: p\n };\n };\n return Sphere;\n}();\nvar Hemisphere = /*#__PURE__*/ function(Sphere) {\n _inherits(Hemisphere, Sphere);\n function Hemisphere() {\n return Sphere.apply(this, arguments);\n }\n var _proto = Hemisphere.prototype;\n _proto.getHorizontalAngle = function getHorizontalAngle() {\n return randomInRange(0, 90);\n };\n return Hemisphere;\n}(Sphere);\n\nvar TextureShape = /*#__PURE__*/ function() {\n function TextureShape(arg) {\n var detail = arg.detail || {\n anchors: [\n 0.5,\n 0.5\n ],\n block: [\n 0,\n 0\n ]\n };\n this.anchors = new Float32Array(detail.anchors);\n this.width = arg.width || 1;\n this.height = arg.height || 1;\n this.block = detail.block;\n this.arcMode = arg.arcMode;\n this.random = clamp$1(arg.random || 0, 0, 1);\n }\n var _proto = TextureShape.prototype;\n _proto.generate = function generate(opt) {\n var anchors = this.anchors;\n var pointCount = anchors.length / 2 - 1;\n var index = Math.floor(getArcAngle(pointCount, this.arcMode, opt));\n var pointX = (anchors[index * 2] + this.block[0] * this.random * Math.random()) % 1 - 0.5;\n var pointY = (anchors[index * 2 + 1] + this.block[1] * this.random * Math.random()) % 1 - 0.5;\n var dir = new Vector3(pointX, pointY, 0);\n return {\n position: new Vector3(pointX * this.width, pointY * this.height, 0),\n direction: dir.normalize()\n };\n };\n return TextureShape;\n}();\n\nvar ShapeNone = /*#__PURE__*/ function() {\n function ShapeNone() {}\n var _proto = ShapeNone.prototype;\n _proto.generate = function generate() {\n return {\n position: new Vector3(),\n direction: new Vector3()\n };\n };\n return ShapeNone;\n}();\nvar _obj$8;\nvar map$2 = (_obj$8 = {}, _obj$8[ParticleEmitterShapeType.NONE] = ShapeNone, _obj$8[ParticleEmitterShapeType.CONE] = Cone, _obj$8[ParticleEmitterShapeType.SPHERE] = Sphere, _obj$8[ParticleEmitterShapeType.HEMISPHERE] = Hemisphere, _obj$8[ParticleEmitterShapeType.CIRCLE] = Circle, _obj$8[ParticleEmitterShapeType.DONUT] = Donut, _obj$8[ParticleEmitterShapeType.RECTANGLE] = Rectangle$1, _obj$8[ParticleEmitterShapeType.EDGE] = Edge, _obj$8[ParticleEmitterShapeType.RECTANGLE_EDGE] = RectangleEdge, _obj$8[ParticleEmitterShapeType.TEXTURE] = TextureShape, _obj$8);\nfunction createShape(shapeOptions) {\n if (!shapeOptions) {\n return new ShapeNone();\n }\n var options = _extends({\n radius: 1,\n arc: 360,\n angle: 0,\n arcMode: ShapeArcMode.RANDOM\n }, shapeOptions);\n var type = shapeOptions.type;\n var Ctrl = map$2[type];\n if (!Ctrl) {\n throw new Error(\"Invalid shape: \" + type + \".\");\n }\n var ctrl = new Ctrl(options);\n if (type !== ParticleEmitterShapeType.NONE) {\n var alignSpeedDirection = shapeOptions.alignSpeedDirection, _shapeOptions_upDirection = shapeOptions.upDirection, upDirection = _shapeOptions_upDirection === void 0 ? [\n 0,\n 0,\n 1\n ] : _shapeOptions_upDirection;\n ctrl.alignSpeedDirection = alignSpeedDirection;\n ctrl.upDirection = Vector3.fromArray(upDirection).normalize();\n }\n return ctrl;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var i, last;\n if (clockwise === signedArea(data, start, end, dim) > 0) {\n for(i = start; i < end; i += dim)last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for(i = end - dim; i >= start; i -= dim)last = insertNode(i, data[i], data[i + 1], last);\n }\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n return last;\n}\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n var p = start, again;\n do {\n again = false;\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n } else {\n p = p.next;\n }\n }while (again || p !== end);\n return end;\n}\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev, b = ear, c = ear.next;\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n while(p !== ear.prev){\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n return true;\n}\nfunction isEarHashed(ear, minX, minY, invSize) {\n var a = ear.prev, b = ear, c = ear.next;\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x, minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y, maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x, maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y;\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n var p = ear.prevZ, n = ear.nextZ;\n // look for points inside the triangle in both directions\n while(p && p.z >= minZ && n && n.z <= maxZ){\n if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n // look for remaining points in decreasing z-order\n while(p && p.z >= minZ){\n if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n // look for remaining points in increasing z-order\n while(n && n.z <= maxZ){\n if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n return true;\n}\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [], i, len, start, end, list;\n for(i = 0, len = holeIndices.length; i < len; i++){\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n queue.sort(compareX);\n // process holes from left to right\n for(i = 0; i < queue.length; i++){\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n return outerNode;\n}\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n // filter collinear points around the cuts\n filterPoints(outerNode, outerNode.next);\n filterPoints(b, b.next);\n }\n}\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m;\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n if (x === hx) {\n if (hy === p.y) return p;\n if (hy === p.next.y) return p.next;\n }\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n }while (p !== outerNode);\n if (!m) return null;\n if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan;\n p = m;\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {\n m = p;\n tanMin = tan;\n }\n }\n p = p.next;\n }while (p !== stop);\n return m;\n}\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n }while (p !== start);\n p.prevZ.nextZ = null;\n p.prevZ = null;\n sortLinked(p);\n}\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n while(p){\n numMerges++;\n q = p;\n pSize = 0;\n for(i = 0; i < inSize; i++){\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n qSize = inSize;\n while(pSize > 0 || qSize > 0 && q){\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n if (tail) tail.nextZ = e;\n else list = e;\n e.prevZ = tail;\n tail = e;\n }\n p = q;\n }\n tail.nextZ = null;\n inSize *= 2;\n }while (numMerges > 1);\n return list;\n}\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) * invSize;\n y = 32767 * (y - minY) * invSize;\n x = (x | x << 8) & 0x00FF00FF;\n x = (x | x << 4) & 0x0F0F0F0F;\n x = (x | x << 2) & 0x33333333;\n x = (x | x << 1) & 0x55555555;\n y = (y | y << 8) & 0x00FF00FF;\n y = (y | y << 4) & 0x0F0F0F0F;\n y = (y | y << 2) & 0x33333333;\n y = (y | y << 1) & 0x55555555;\n return x | y << 1;\n}\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start, leftmost = start;\n do {\n if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;\n p = p.next;\n }while (p !== start);\n return leftmost;\n}\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n var o1 = sign(area(p1, q1, p2));\n var o2 = sign(area(p1, q1, q2));\n var o3 = sign(area(p2, q2, p1));\n var o4 = sign(area(p2, q2, q1));\n if (o1 !== o2 && o3 !== o4) return true; // general case\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n return false;\n}\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;\n p = p.next;\n }while (p !== a);\n return false;\n}\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2;\n do {\n if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;\n p = p.next;\n }while (p !== a);\n return inside;\n}\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev;\n a.next = b;\n b.prev = a;\n a2.next = an;\n an.prev = a2;\n b2.next = a2;\n a2.prev = b2;\n bp.next = b2;\n b2.prev = bp;\n return b2;\n}\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n if (!last) {\n p.prev = p;\n p.next = p;\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\nfunction Node(i, x, y) {\n // vertex index in coordinates array\n this.i = i;\n // vertex coordinates\n this.x = x;\n this.y = y;\n // previous and next vertex nodes in a polygon ring\n this.prev = null;\n this.next = null;\n // z-order curve value\n this.z = null;\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n // indicates whether this is a steiner point\n this.steiner = false;\n}\nfunction signedArea(data, start, end, dim) {\n var sum = 0;\n for(var i = start, j = end - dim; i < end; i += dim){\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\nvar indexBase = 0;\nfunction earcut(data, holeIndices, dim, ib) {\n dim = dim || 2;\n indexBase = ib || 0;\n var hasHoles = holeIndices && holeIndices.length;\n var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n var outerNode = linkedList(data, 0, outerLen, dim, true);\n var triangles = [];\n if (!outerNode || outerNode.next === outerNode.prev) {\n return triangles;\n }\n var minX, minY, maxX, maxY, x, y, invSize;\n if (hasHoles) {\n outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n }\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n for(var i = dim; i < outerLen; i += dim){\n x = data[i];\n y = data[i + 1];\n if (x < minX) {\n minX = x;\n }\n if (y < minY) {\n minY = y;\n }\n if (x > maxX) {\n maxX = x;\n }\n if (y > maxY) {\n maxY = y;\n }\n }\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 1 / invSize : 0;\n }\n hackEarcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n return triangles;\n}\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction hackEarcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) {\n return;\n }\n // interlink polygon nodes in z-order\n if (!pass && invSize) {\n indexCurve(ear, minX, minY, invSize);\n }\n var stop = ear, prev, next;\n // iterate through ears, slicing them one by one\n while(ear.prev !== ear.next){\n prev = ear.prev;\n next = ear.next;\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim + indexBase);\n triangles.push(ear.i / dim + indexBase);\n triangles.push(next.i / dim + indexBase);\n removeNode(ear);\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n continue;\n }\n ear = next;\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering triangles and slicing again\n if (!pass) {\n hackEarcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = hackCureLocalIntersections(filterPoints(ear), triangles, dim);\n hackEarcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n hackSplitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n break;\n }\n }\n}\n// go through all polygon nodes and cure small local self-intersections\nfunction hackCureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev, b = p.next.next;\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n triangles.push(a.i / dim + indexBase);\n triangles.push(p.i / dim + indexBase);\n triangles.push(b.i / dim + indexBase);\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n p = start = b;\n }\n p = p.next;\n }while (p !== start);\n return filterPoints(p);\n}\n// try splitting polygon into two and triangulate them independently\nfunction hackSplitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while(b !== a.prev){\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n // filter colinear triangles around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n // run earcut on each half\n hackEarcutLinked(a, triangles, dim, minX, minY, invSize);\n hackEarcutLinked(c, triangles, dim, minX, minY, invSize);\n return;\n }\n b = b.next;\n }\n a = a.next;\n }while (a !== start);\n}\n\nvar SPRITE_VERTEX_STRIDE = 6;\nvar SEMANTIC_PRE_COLOR_ATTACHMENT_0 = \"PRE_COLOR_0\";\nvar SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0 = \"PRE_COLOR_SIZE_0\";\nvar SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0 = \"PRE_MAIN_COLOR_0\";\nvar SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0 = \"PRE_MAIN_COLOR_SIZE_0\";\nvar PLAYER_OPTIONS_ENV_EDITOR = \"editor\";\nvar HELP_LINK$1 = {\n \"Item duration can't be less than 0\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#AOnQS\",\n \"ValueType: 21/22 is not supported\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#smO1b\"\n};\n\nvar POINT_INDEX = 2;\nfunction getGeometryTriangles(geometry, options) {\n var s = geometry.s, p = geometry.p;\n var segments = s[1];\n var points = p[1];\n var pointCount = 0;\n for(var i = 0; i < segments.length; i++){\n var segment = segments[i];\n pointCount += segment.length - 1;\n }\n var pointData = new Float32Array(pointCount * SPRITE_VERTEX_STRIDE);\n var _options_indexBase = options.indexBase, indexBase = _options_indexBase === void 0 ? 0 : _options_indexBase, uvTransform = options.uvTransform;\n var index = 0;\n var dx = 0, dy = 0, sw = 1, sh = 1, r;\n if (uvTransform) {\n dx = uvTransform[0];\n dy = uvTransform[1];\n r = uvTransform[4];\n sw = r ? uvTransform[3] : uvTransform[2];\n sh = r ? uvTransform[2] : uvTransform[3];\n }\n var temp = [\n 0,\n 0\n ];\n var angle = r === 0 ? 0 : -Math.PI / 2;\n for(var i1 = 0; i1 < segments.length; i1++){\n var segment1 = segments[i1];\n var p0 = points[i1];\n var p1 = points[i1 + 1] || points[0];\n var keys = segment1;\n var point = [\n 0,\n 0\n ];\n for(var j = 0; j < keys.length - 1; j++){\n var key = keys[j];\n getBezier2DValue(point, key, p0, p1, p0[4], p0[5], p1[2], p1[3]);\n setPoint(point[0], point[1]);\n }\n }\n var indices = earcut(Array.from(pointData), null, SPRITE_VERTEX_STRIDE, indexBase);\n return {\n aPoint: pointData,\n index: new Uint16Array(indices)\n };\n function setPoint(x, y) {\n pointData[index++] = x / 2;\n pointData[index++] = y / 2;\n if (uvTransform) {\n temp[0] = x;\n temp[1] = y;\n rotateVec2(temp, temp, angle);\n pointData[index++] = dx + (temp[0] + 1) / 2 * sw;\n pointData[index++] = dy + (temp[1] + 1) / 2 * sh;\n } else {\n pointData[index++] = (x + 1) / 2;\n pointData[index++] = (y + 1) / 2;\n }\n index += POINT_INDEX;\n }\n}\n/**\n * 根据新老版形状数据获取形状几何数据\n * @param shape 新老版形状数据\n */ function getGeometriesByShapeData(shape) {\n var geometries = [];\n // 该版本的单个形状数据可以包含多个形状,可以加个埋点,五福之后没有就可以下掉\n if (\"gs\" in shape) {\n shape.gs.forEach(function(gs) {\n geometries.push({\n p: [\n ValueType.SHAPE_POINTS,\n gs.p\n ],\n s: [\n ValueType.SHAPE_SPLITS,\n gs.s\n ]\n });\n });\n } else if (\"g\" in shape) {\n geometries.push({\n p: [\n ValueType.SHAPE_POINTS,\n shape.g.p\n ],\n s: [\n ValueType.SHAPE_SPLITS,\n shape.g.s\n ]\n });\n } else {\n geometries.push(shape);\n }\n return geometries;\n}\nfunction getGeometryByShape(shape, uvTransform) {\n var datas = [];\n // 老数据兼容处理\n var geometries = getGeometriesByShapeData(shape);\n var indexBase = 0;\n var aPoint = 0;\n var index = 0;\n for(var i = 0; i < geometries.length; i++){\n var geometry = geometries[i];\n var data = getGeometryTriangles(geometry, {\n indexBase: indexBase,\n uvTransform: uvTransform\n });\n indexBase += data.aPoint.length / 5;\n datas.push(data);\n aPoint += data.aPoint.length;\n index += data.index.length;\n }\n if (datas.length === 1) {\n return datas[0];\n }\n var aPointData = new Float32Array(aPoint);\n var indexData = new Uint16Array(index);\n // @ts-expect-error\n for(var i1 = 0, pointIndex = 0, idx = 0; i1 < datas[i1]; i1++){\n var data1 = datas[i1];\n aPointData.set(data1.aPoint, pointIndex);\n pointIndex += data1.aPoint.length;\n indexData.set(data1.index, idx);\n idx += data1.index.length;\n }\n return {\n aPoint: aPointData,\n index: indexData\n };\n}\nfunction rotateVec2(out, vec2, angleInRad) {\n var c = Math.cos(angleInRad);\n var s = Math.sin(angleInRad);\n var x = vec2[0];\n var y = vec2[1];\n out[0] = c * x + s * y;\n out[1] = -s * x + c * y;\n return out;\n}\nfunction getBezier2DValue(out, t, p0, p1, cpx0, cpy0, cpx1, cpy1) {\n var ddt = 1 - t;\n var a = ddt * ddt * ddt;\n var b = 3 * t * ddt * ddt;\n var c = 3 * t * t * ddt;\n var d = t * t * t;\n out[0] = a * p0[0] + b * cpx0 + c * cpx1 + d * p1[0];\n out[1] = a * p0[1] + b * cpy0 + c * cpy1 + d * p1[1];\n return out;\n}\n\n/**\n * @since 2.1.0\n */ var BaseRenderComponent = /*#__PURE__*/ function(RendererComponent) {\n _inherits(BaseRenderComponent, RendererComponent);\n function BaseRenderComponent(engine) {\n var _this;\n _this = RendererComponent.call(this, engine) || this;\n _this.color = new Color(1, 1, 1, 1);\n _this.visible = true;\n /**\n * 用于点击测试的碰撞器\n */ _this.meshCollider = new MeshCollider();\n // TODO 点击测试后续抽象一个 Collider 组件\n _this.getHitTestParams = function(force) {\n var sizeMatrix = Matrix4$1.fromScale(_this.transform.size.x, _this.transform.size.y, 1);\n var worldMatrix = sizeMatrix.premultiply(_this.transform.getWorldMatrix());\n var ui = _this.interaction;\n if (force || ui) {\n _this.meshCollider.setGeometry(_this.geometry, worldMatrix);\n var area = _this.meshCollider.getBoundingBoxData();\n if (area) {\n var _this_interaction;\n return {\n behavior: ((_this_interaction = _this.interaction) == null ? void 0 : _this_interaction.behavior) || 0,\n type: area.type,\n triangles: area.area,\n backfaceCulling: _this.renderer.side === SideMode.FRONT\n };\n }\n }\n };\n _this.renderer = {\n renderMode: RenderMode.MESH,\n blending: BlendingMode.ALPHA,\n texture: _this.engine.emptyTexture,\n occlusion: false,\n transparentOcclusion: false,\n side: SideMode.DOUBLE,\n maskMode: exports.MaskMode.NONE,\n mask: 0\n };\n var material = Material.create(_this.engine, {\n shader: {\n fragment: itemFrag,\n vertex: itemVert,\n shared: true\n }\n });\n _this.material = material;\n _this.material.setColor(\"_Color\", new Color().setFromArray([\n 1,\n 1,\n 1,\n 1\n ]));\n _this.maskManager = new MaskProcessor(engine);\n return _this;\n }\n var _proto = BaseRenderComponent.prototype;\n /**\n * 设置当前 Mesh 的可见性。\n * @param visible - true:可见,false:不可见\n * @deprecated 2.4.0 Please use enabled instead\n */ _proto.setVisible = function setVisible(visible) {\n this.visible = visible;\n };\n /**\n * 获取当前 Mesh 的可见性。\n * @deprecated 2.4.0 Please use enabled instead\n */ _proto.getVisible = function getVisible() {\n return this.visible;\n };\n _proto.setColor = function setColor(color) {\n if (_instanceof1(color, Color)) {\n this.color.copyFrom(color);\n } else {\n this.color.setFromArray(color);\n }\n this.material.setColor(\"_Color\", this.color);\n };\n _proto.setTexture = function setTexture(input) {\n var _this = this;\n return _async_to_generator(function() {\n var texture;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!(typeof input === \"string\")) return [\n 3,\n 2\n ];\n return [\n 4,\n Texture.fromImage(input, _this.item.engine)\n ];\n case 1:\n texture = _state.sent();\n return [\n 3,\n 3\n ];\n case 2:\n texture = input;\n _state.label = 3;\n case 3:\n _this.renderer.texture = texture;\n _this.material.setTexture(\"_MainTex\", texture);\n return [\n 2\n ];\n }\n });\n })();\n };\n _proto.render = function render(renderer) {\n if (!this.getVisible()) {\n return;\n }\n this.maskManager.drawStencilMask(renderer);\n this.draw(renderer);\n };\n /**\n * @internal\n */ _proto.drawStencilMask = function drawStencilMask(renderer) {\n if (!this.isActiveAndEnabled) {\n return;\n }\n var previousColorMask = this.material.colorMask;\n this.material.colorMask = false;\n this.draw(renderer);\n this.material.colorMask = previousColorMask;\n };\n _proto.onStart = function onStart() {\n this.item.getHitTestParams = this.getHitTestParams;\n };\n _proto.getBoundingBox = function getBoundingBox() {\n var worldMatrix = this.transform.getWorldMatrix();\n this.meshCollider.setGeometry(this.geometry, worldMatrix);\n var boundingBox = this.meshCollider.getBoundingBox();\n return boundingBox;\n };\n _proto.getItemGeometryData = function getItemGeometryData(geometry) {\n var renderer = this.renderer;\n if (renderer.shape) {\n var _renderer_shape = renderer.shape, _renderer_shape_index = _renderer_shape.index, index = _renderer_shape_index === void 0 ? [] : _renderer_shape_index, _renderer_shape_aPoint = _renderer_shape.aPoint, aPoint = _renderer_shape_aPoint === void 0 ? [] : _renderer_shape_aPoint;\n var point = new Float32Array(aPoint);\n var position = [];\n var atlasOffset = [];\n for(var i = 0; i < point.length; i += 6){\n atlasOffset.push(aPoint[i + 2], aPoint[i + 3]);\n position.push(point[i], point[i + 1], 0.0);\n }\n geometry.setAttributeData(\"aPos\", new Float32Array(position));\n return {\n index: index,\n atlasOffset: atlasOffset\n };\n } else {\n geometry.setAttributeData(\"aPos\", new Float32Array([\n -0.5,\n 0.5,\n 0,\n -0.5,\n -0.5,\n 0,\n 0.5,\n 0.5,\n 0,\n 0.5,\n -0.5,\n 0\n ]));\n return {\n index: [\n 0,\n 1,\n 2,\n 2,\n 1,\n 3\n ],\n atlasOffset: [\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n };\n }\n };\n _proto.createGeometry = function createGeometry() {\n var geometry = Geometry.create(this.engine, {\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 3,\n data: new Float32Array([\n -0.5,\n 0.5,\n 0,\n -0.5,\n -0.5,\n 0,\n 0.5,\n 0.5,\n 0,\n 0.5,\n -0.5,\n 0\n ])\n },\n atlasOffset: {\n size: 2,\n offset: 0,\n releasable: true,\n type: glContext.FLOAT,\n data: new Float32Array(0)\n }\n },\n indices: {\n data: new Uint16Array(0),\n releasable: true\n },\n mode: glContext.TRIANGLES\n });\n var geoData = this.getItemGeometryData(geometry);\n var index = geoData.index, atlasOffset = geoData.atlasOffset;\n geometry.setIndexData(new Uint16Array(index));\n geometry.setAttributeData(\"atlasOffset\", new Float32Array(atlasOffset));\n geometry.setDrawCount(index.length);\n return geometry;\n };\n _proto.configureMaterial = function configureMaterial(renderer) {\n var side = renderer.side, occlusion = renderer.occlusion, blendMode = renderer.blending, maskMode = renderer.maskMode, mask = renderer.mask, texture = renderer.texture;\n var material = this.material;\n material.blending = true;\n material.depthTest = true;\n material.depthMask = occlusion;\n material.stencilRef = mask !== undefined ? [\n mask,\n mask\n ] : undefined;\n setBlendMode(material, blendMode);\n // 兼容旧数据中模板需要渲染的情况\n setMaskMode(material, maskMode);\n setSideMode(material, side);\n material.shader.shaderData.properties = '_MainTex(\"_MainTex\",2D) = \"white\" {}';\n material.setColor(\"_Color\", new Color(0, 0, 0, 1));\n material.setVector4(\"_TexOffset\", new Vector4$1(0, 0, 1, 1));\n material.setTexture(\"_MainTex\", texture);\n this.preMultiAlpha = getPreMultiAlpha(blendMode);\n var texParams = new Vector4$1();\n texParams.x = renderer.occlusion ? +renderer.transparentOcclusion : 1;\n texParams.y = +this.preMultiAlpha;\n texParams.z = renderer.renderMode;\n texParams.w = renderer.maskMode;\n material.setVector4(\"_TexParams\", texParams);\n if (texParams.x === 0 || renderer.maskMode === exports.MaskMode.MASK && !renderer.shape) {\n material.enableMacro(\"ALPHA_CLIP\");\n } else {\n material.disableMacro(\"ALPHA_CLIP\");\n }\n return material;\n };\n _proto.draw = function draw(renderer) {\n if (renderer.renderingData.currentFrame.globalUniforms) {\n renderer.setGlobalMatrix(\"effects_ObjectToWorld\", this.transform.getWorldMatrix());\n }\n for(var i = 0; i < this.materials.length; i++){\n var material = this.materials[i];\n material.setVector2(\"_Size\", this.transform.size);\n if (this.renderer.renderMode === RenderMode.BILLBOARD || this.renderer.renderMode === RenderMode.VERTICAL_BILLBOARD || this.renderer.renderMode === RenderMode.HORIZONTAL_BILLBOARD) {\n material.setVector3(\"_Scale\", this.transform.scale);\n }\n renderer.drawGeometry(this.geometry, material, i);\n }\n };\n _proto.fromData = function fromData(data) {\n RendererComponent.prototype.fromData.call(this, data);\n var _data_renderer;\n var renderer = (_data_renderer = data.renderer) != null ? _data_renderer : {};\n var maskProps = data.mask;\n if (maskProps && maskProps.ref) {\n maskProps.ref = this.engine.findObject(maskProps.ref);\n }\n var maskMode = this.maskManager.getMaskMode(data);\n // TODO 新蒙板上线后移除\n //-------------------------------------------------------------------------\n var shapeData = renderer.shape;\n //@ts-expect-error\n var split = data.splits && !data.textureSheetAnimation ? data.splits[0] : undefined;\n var shapeGeometry = undefined;\n if (shapeData !== undefined && shapeData !== null && !(\"aPoint\" in shapeData && \"index\" in shapeData)) {\n shapeGeometry = getGeometryByShape(shapeData, split);\n }\n var _renderer_renderMode, _renderer_blending, _renderer_side;\n //-------------------------------------------------------------------------\n this.renderer = {\n renderMode: (_renderer_renderMode = renderer.renderMode) != null ? _renderer_renderMode : RenderMode.MESH,\n blending: (_renderer_blending = renderer.blending) != null ? _renderer_blending : BlendingMode.ALPHA,\n texture: renderer.texture ? this.engine.findObject(renderer.texture) : this.engine.emptyTexture,\n occlusion: !!renderer.occlusion,\n transparentOcclusion: !!renderer.transparentOcclusion || maskMode === exports.MaskMode.MASK,\n side: (_renderer_side = renderer.side) != null ? _renderer_side : SideMode.DOUBLE,\n mask: this.maskManager.getRefValue(),\n shape: shapeGeometry,\n maskMode: maskMode\n };\n this.configureMaterial(this.renderer);\n };\n return BaseRenderComponent;\n}(RendererComponent);\n\nexports.ShapeComponent = /*#__PURE__*/ function(BaseRenderComponent) {\n _inherits(ShapeComponent, BaseRenderComponent);\n function ShapeComponent(engine) {\n var _this;\n _this = BaseRenderComponent.call(this, engine) || this;\n _this.hasStroke = false;\n _this.hasFill = false;\n _this.shapeDirty = true;\n _this.graphicsPath = new GraphicsPath();\n _this.vert = \"\\nprecision highp float;\\n\\nattribute vec3 aPos;//x y\\n\\nuniform mat4 effects_MatrixVP;\\nuniform mat4 effects_MatrixInvV;\\nuniform mat4 effects_ObjectToWorld;\\n\\nvoid main() {\\n vec4 pos = vec4(aPos.xyz, 1.0);\\n gl_Position = effects_MatrixVP * effects_ObjectToWorld * pos;\\n}\\n\";\n _this.frag = \"\\nprecision highp float;\\n\\nuniform vec4 _Color;\\n\\nvoid main() {\\n vec4 color = _Color;\\n color.rgb *= color.a;\\n gl_FragColor = color;\\n}\\n\";\n // Create Geometry\n //-------------------------------------------------------------------------\n _this.geometry = Geometry.create(engine, {\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 3,\n data: new Float32Array([\n -0.5,\n 0.5,\n 0,\n -0.5,\n -0.5,\n 0,\n 0.5,\n 0.5,\n 0,\n 0.5,\n -0.5,\n 0\n ])\n },\n aUV: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array()\n }\n },\n mode: glContext.TRIANGLES,\n drawCount: 4\n });\n _this.geometry.subMeshes.push({\n offset: 0,\n indexCount: 0,\n vertexCount: 0\n }, {\n offset: 0,\n indexCount: 0,\n vertexCount: 0\n });\n // Create Material\n //-------------------------------------------------------------------------\n var materialProps = {\n shader: {\n vertex: _this.vert,\n fragment: _this.frag,\n glslVersion: exports.GLSLVersion.GLSL1\n }\n };\n var fillMaterial = Material.create(engine, materialProps);\n var strokeMaterial = Material.create(engine, materialProps);\n fillMaterial.color = new Color(1, 1, 1, 1);\n fillMaterial.depthMask = false;\n fillMaterial.depthTest = true;\n fillMaterial.blending = true;\n _this.material = fillMaterial;\n strokeMaterial.color = new Color(0.25, 0.25, 0.25, 1);\n strokeMaterial.depthMask = false;\n strokeMaterial.depthTest = true;\n strokeMaterial.blending = true;\n _this.materials[1] = strokeMaterial;\n // Create Shape Attrributes\n //-------------------------------------------------------------------------\n _this.strokeAttributes = {\n width: 1,\n alignment: 0.5,\n cap: LineCap.Butt,\n join: LineJoin.Miter,\n miterLimit: 10,\n color: new Color(1, 1, 1, 1)\n };\n _this.fillAttribute = {\n color: new Color(1, 1, 1, 1)\n };\n _this.shapeAttribute = {\n type: ShapePrimitiveType.Custom,\n points: [],\n easingIns: [],\n easingOuts: [],\n shapes: []\n };\n return _this;\n }\n var _proto = ShapeComponent.prototype;\n _proto.onStart = function onStart() {\n this.item.getHitTestParams = this.getHitTestParams;\n };\n _proto.onUpdate = function onUpdate(dt) {\n this.material.color = this.fillAttribute.color;\n this.materials[1].color = this.strokeAttributes.color;\n if (this.shapeDirty) {\n this.buildPath(this.shapeAttribute);\n this.buildGeometryFromPath(this.graphicsPath.shapePath);\n this.shapeDirty = false;\n }\n };\n _proto.buildGeometryFromPath = function buildGeometryFromPath(shapePath) {\n var shapePrimitives = shapePath.shapePrimitives;\n var vertices = [];\n var indices = [];\n // Triangulate shapePrimitive\n //---------------------------------------------------\n if (this.hasFill) {\n for(var _iterator = _create_for_of_iterator_helper_loose(shapePrimitives), _step; !(_step = _iterator()).done;){\n var shapePrimitive = _step.value;\n var shape = shapePrimitive.shape;\n var points = [];\n var indexOffset = indices.length;\n var vertOffset = vertices.length / 2;\n shape.build(points);\n shape.triangulate(points, vertices, vertOffset, indices, indexOffset);\n }\n }\n var fillIndexCount = indices.length;\n if (this.hasStroke) {\n for(var _iterator1 = _create_for_of_iterator_helper_loose(shapePrimitives), _step1; !(_step1 = _iterator1()).done;){\n var shapePrimitive1 = _step1.value;\n var shape1 = shapePrimitive1.shape;\n var points1 = [];\n indices.length;\n var vertOffset1 = vertices.length / 2;\n var lineStyle = this.strokeAttributes;\n var close = true;\n if (this.shapeAttribute.type === ShapePrimitiveType.Custom) {\n close = shape1.closePath;\n }\n shape1.build(points1);\n buildLine(points1, lineStyle, false, close, vertices, 2, vertOffset1, indices);\n }\n }\n var strokeIndexCount = indices.length - fillIndexCount;\n var vertexCount = vertices.length / 2;\n // get the current attribute and index arrays from the geometry, avoiding re-creation\n var positionArray = this.geometry.getAttributeData(\"aPos\");\n var uvArray = this.geometry.getAttributeData(\"aUV\");\n var indexArray = this.geometry.getIndexData();\n if (!positionArray || positionArray.length < vertexCount * 3) {\n positionArray = new Float32Array(vertexCount * 3);\n }\n if (!uvArray || uvArray.length < vertexCount * 2) {\n uvArray = new Float32Array(vertexCount * 2);\n }\n if (!indexArray || indexArray.length < indices.length) {\n indexArray = new Uint16Array(indices.length);\n }\n // set position and uv attribute array\n for(var i = 0; i < vertexCount; i++){\n var pointsOffset = i * 3;\n var positionArrayOffset = i * 2;\n var uvOffset = i * 2;\n positionArray[pointsOffset] = vertices[positionArrayOffset];\n positionArray[pointsOffset + 1] = vertices[positionArrayOffset + 1];\n positionArray[pointsOffset + 2] = 0;\n uvArray[uvOffset] = positionArray[pointsOffset];\n uvArray[uvOffset + 1] = positionArray[pointsOffset + 1];\n }\n // set index array\n indexArray.set(indices);\n // rewrite to geometry\n this.geometry.setAttributeData(\"aPos\", positionArray);\n this.geometry.setAttributeData(\"aUV\", uvArray);\n this.geometry.setIndexData(indexArray);\n this.geometry.setDrawCount(indices.length);\n var u16Size = 2;\n var fillSubMesh = this.geometry.subMeshes[0];\n var strokeSubMesh = this.geometry.subMeshes[1];\n fillSubMesh.indexCount = fillIndexCount;\n strokeSubMesh.offset = fillIndexCount * u16Size;\n strokeSubMesh.indexCount = strokeIndexCount;\n };\n _proto.buildPath = function buildPath(shapeAttribute) {\n this.graphicsPath.clear();\n switch(shapeAttribute.type){\n case ShapePrimitiveType.Custom:\n {\n var customShapeAtribute = this.shapeAttribute;\n var points = customShapeAtribute.points;\n var easingIns = customShapeAtribute.easingIns;\n var easingOuts = customShapeAtribute.easingOuts;\n for(var _iterator = _create_for_of_iterator_helper_loose(customShapeAtribute.shapes), _step; !(_step = _iterator()).done;){\n var shape = _step.value;\n var indices = shape.indexes;\n var startPoint = points[indices[0].point];\n this.graphicsPath.moveTo(startPoint.x, startPoint.y);\n for(var i = 1; i < indices.length; i++){\n var pointIndex = indices[i];\n var lastPointIndex = indices[i - 1];\n var point = points[pointIndex.point];\n var lastPoint = points[lastPointIndex.point];\n var control1 = easingOuts[lastPointIndex.easingOut];\n var control2 = easingIns[pointIndex.easingIn];\n this.graphicsPath.bezierCurveTo(control1.x + lastPoint.x, control1.y + lastPoint.y, control2.x + point.x, control2.y + point.y, point.x, point.y, 1);\n }\n if (shape.close) {\n var pointIndex1 = indices[0];\n var lastPointIndex1 = indices[indices.length - 1];\n var point1 = points[pointIndex1.point];\n var lastPoint1 = points[lastPointIndex1.point];\n var control11 = easingOuts[lastPointIndex1.easingOut];\n var control21 = easingIns[pointIndex1.easingIn];\n this.graphicsPath.bezierCurveTo(control11.x + lastPoint1.x, control11.y + lastPoint1.y, control21.x + point1.x, control21.y + point1.y, point1.x, point1.y, 1);\n this.graphicsPath.closePath();\n }\n }\n break;\n }\n case ShapePrimitiveType.Ellipse:\n {\n var ellipseData = shapeAttribute;\n this.graphicsPath.ellipse(0, 0, ellipseData.xRadius, ellipseData.yRadius);\n break;\n }\n case ShapePrimitiveType.Rectangle:\n {\n var rectangleData = shapeAttribute;\n this.graphicsPath.rect(-rectangleData.width / 2, -rectangleData.height / 2, rectangleData.width, rectangleData.height, rectangleData.roundness);\n break;\n }\n case ShapePrimitiveType.Star:\n {\n var starData = shapeAttribute;\n this.graphicsPath.polyStar(starData.pointCount, starData.outerRadius, starData.innerRadius, starData.outerRoundness, starData.innerRoundness, exports.StarType.Star);\n break;\n }\n case ShapePrimitiveType.Polygon:\n {\n var polygonData = shapeAttribute;\n this.graphicsPath.polyStar(polygonData.pointCount, polygonData.radius, polygonData.radius, polygonData.roundness, polygonData.roundness, exports.StarType.Polygon);\n break;\n }\n }\n };\n _proto.fromData = function fromData(data) {\n BaseRenderComponent.prototype.fromData.call(this, data);\n this.shapeDirty = true;\n var strokeParam = data.stroke;\n if (strokeParam) {\n this.hasStroke = true;\n this.strokeAttributes.width = strokeParam.width;\n this.strokeAttributes.color.copyFrom(strokeParam.color);\n this.strokeAttributes.cap = strokeParam.cap;\n this.strokeAttributes.join = strokeParam.join;\n }\n var fillParam = data.fill;\n if (fillParam) {\n this.hasFill = true;\n this.fillAttribute.color.copyFrom(fillParam.color);\n }\n switch(data.type){\n case ShapePrimitiveType.Custom:\n {\n var customShapeData = data;\n var customShapeAttribute = {\n type: ShapePrimitiveType.Custom,\n points: [],\n easingIns: [],\n easingOuts: [],\n shapes: [],\n fill: customShapeData.fill\n };\n for(var _iterator = _create_for_of_iterator_helper_loose(customShapeData.points), _step; !(_step = _iterator()).done;){\n var point = _step.value;\n customShapeAttribute.points.push(new Vector2(point.x, point.y));\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(customShapeData.easingIns), _step1; !(_step1 = _iterator1()).done;){\n var easingIn = _step1.value;\n customShapeAttribute.easingIns.push(new Vector2(easingIn.x, easingIn.y));\n }\n for(var _iterator2 = _create_for_of_iterator_helper_loose(customShapeData.easingOuts), _step2; !(_step2 = _iterator2()).done;){\n var easingOut = _step2.value;\n customShapeAttribute.easingOuts.push(new Vector2(easingOut.x, easingOut.y));\n }\n customShapeAttribute.shapes = customShapeData.shapes;\n this.shapeAttribute = customShapeAttribute;\n break;\n }\n case ShapePrimitiveType.Ellipse:\n {\n var ellipseData = data;\n var ellipseAttribute = {\n type: ShapePrimitiveType.Ellipse,\n xRadius: ellipseData.xRadius,\n yRadius: ellipseData.yRadius,\n fill: ellipseData.fill\n };\n this.shapeAttribute = ellipseAttribute;\n break;\n }\n case ShapePrimitiveType.Rectangle:\n {\n var rectangleData = data;\n var rectangleAttribute = {\n type: ShapePrimitiveType.Rectangle,\n width: rectangleData.width,\n height: rectangleData.height,\n roundness: rectangleData.roundness,\n fill: rectangleData.fill\n };\n this.shapeAttribute = rectangleAttribute;\n break;\n }\n case ShapePrimitiveType.Star:\n {\n var starData = data;\n var starAttribute = {\n type: ShapePrimitiveType.Star,\n pointCount: starData.pointCount,\n innerRadius: starData.innerRadius,\n outerRadius: starData.outerRadius,\n innerRoundness: starData.innerRoundness,\n outerRoundness: starData.outerRoundness,\n fill: starData.fill\n };\n this.shapeAttribute = starAttribute;\n break;\n }\n case ShapePrimitiveType.Polygon:\n {\n var polygonData = data;\n var polygonAttribute = {\n type: ShapePrimitiveType.Polygon,\n pointCount: polygonData.pointCount,\n radius: polygonData.radius,\n roundness: polygonData.roundness,\n fill: polygonData.fill\n };\n this.shapeAttribute = polygonAttribute;\n break;\n }\n }\n var maskProps = data.mask;\n if (maskProps && maskProps.ref) {\n maskProps.ref = this.engine.findObject(maskProps.ref);\n }\n var maskMode = this.maskManager.getMaskMode(data);\n var maskRef = this.maskManager.getRefValue();\n this.material.stencilRef = maskRef !== undefined ? [\n maskRef,\n maskRef\n ] : undefined;\n setMaskMode(this.material, maskMode);\n };\n _create_class(ShapeComponent, [\n {\n key: \"shape\",\n get: function get() {\n this.shapeDirty = true;\n return this.shapeAttribute;\n }\n }\n ]);\n return ShapeComponent;\n}(BaseRenderComponent);\nexports.ShapeComponent = __decorate([\n effectsClass(\"ShapeComponent\")\n], exports.ShapeComponent);\n\nexports.Fake3DComponent = /*#__PURE__*/ function(Component) {\n _inherits(Fake3DComponent, Component);\n function Fake3DComponent() {\n var _this;\n _this = Component.apply(this, arguments) || this;\n _this.loop = false;\n _this.amountOfMotion = 1.0;\n _this.animationLength = 2.0;\n _this.mode = 1;\n _this.startPositionX = 0;\n _this.startPositionY = 0;\n _this.startPositionZ = 0;\n _this.endPositionX = 0;\n _this.endPositionY = 0;\n _this.endPositionZ = 0;\n _this.amplitudeX = 0;\n _this.amplitudeY = 0;\n _this.amplitudeZ = 0;\n _this.phaseX = 0;\n _this.phaseY = 0;\n _this.phaseZ = 0;\n return _this;\n }\n var _proto = Fake3DComponent.prototype;\n _proto.onStart = function onStart() {\n this.effectComponent = this.item.getComponent(exports.EffectComponent);\n };\n _proto.onUpdate = function onUpdate(dt) {\n this.updateFake3D();\n };\n _proto.updateFake3D = function updateFake3D() {\n if (!this.effectComponent) {\n return;\n }\n var time = this.item.time % this.animationLength / this.animationLength;\n var _PosX = 0;\n var _PosY = 0;\n var _PosZ = 0;\n switch(this.mode){\n case 0:\n {\n var PI = Math.PI;\n _PosX = Math.sin(2.0 * PI * (time + this.phaseX)) * this.amplitudeX;\n _PosY = Math.sin(2.0 * PI * (time + this.phaseY)) * this.amplitudeY;\n _PosZ = Math.sin(2.0 * PI * (time + this.phaseZ)) * this.amplitudeZ;\n break;\n }\n case 1:\n {\n var localTime = time;\n if (this.loop) {\n if (localTime > 0.5) {\n localTime = 1 - localTime;\n }\n localTime *= 2;\n }\n _PosX = this.startPositionX * (1 - localTime) + localTime * this.endPositionX;\n _PosY = this.startPositionY * (1 - localTime) + localTime * this.endPositionY;\n _PosZ = this.startPositionZ * (1 - localTime) + localTime * this.endPositionZ;\n break;\n }\n }\n var material = this.effectComponent.material;\n material.setFloat(\"_PosX\", _PosX * this.amountOfMotion);\n material.setFloat(\"_PosY\", _PosY * this.amountOfMotion);\n material.setFloat(\"_PosZ\", _PosZ * this.amountOfMotion);\n };\n return Fake3DComponent;\n}(Component);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"loop\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"amountOfMotion\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"animationLength\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"mode\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"startPositionX\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"startPositionY\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"startPositionZ\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"endPositionX\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"endPositionY\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"endPositionZ\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"amplitudeX\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"amplitudeY\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"amplitudeZ\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"phaseX\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"phaseY\", void 0);\n__decorate([\n serialize()\n], exports.Fake3DComponent.prototype, \"phaseZ\", void 0);\nexports.Fake3DComponent = __decorate([\n effectsClass(\"Fake3DComponent\")\n], exports.Fake3DComponent);\nexports.Fake3DAnimationMode = void 0;\n(function(Fake3DAnimationMode) {\n Fake3DAnimationMode[Fake3DAnimationMode[\"Circular\"] = 0] = \"Circular\";\n Fake3DAnimationMode[Fake3DAnimationMode[\"Linear\"] = 1] = \"Linear\";\n})(exports.Fake3DAnimationMode || (exports.Fake3DAnimationMode = {}));\n\nexports.CameraController = /*#__PURE__*/ function(Component) {\n _inherits(CameraController, Component);\n function CameraController(engine, props) {\n var _this;\n _this = Component.call(this, engine) || this;\n if (props) {\n _this.fromData(props);\n }\n return _this;\n }\n var _proto = CameraController.prototype;\n _proto.onUpdate = function onUpdate() {\n if (this.item.composition && this.item.transform.getValid()) {\n var camera = this.item.composition.camera;\n camera.near = this.options.near;\n camera.far = this.options.far;\n camera.fov = this.options.fov;\n camera.clipMode = this.options.clipMode;\n camera.transform.parentTransform = this.transform.parentTransform;\n camera.position = this.transform.position;\n // TODO 修正 GE 四元数旋转共轭问题\n camera.setQuat(this.transform.getQuaternion().clone().conjugate());\n }\n };\n _proto.fromData = function fromData(data) {\n Component.prototype.fromData.call(this, data);\n this.options = data.options;\n };\n return CameraController;\n}(Component);\nexports.CameraController = __decorate([\n effectsClass(DataType.CameraController)\n], exports.CameraController);\n\nvar CameraVFXItemLoader = /*#__PURE__*/ function(AbstractPlugin) {\n _inherits(CameraVFXItemLoader, AbstractPlugin);\n function CameraVFXItemLoader() {\n return AbstractPlugin.apply(this, arguments);\n }\n return CameraVFXItemLoader;\n}(AbstractPlugin);\n\nexports.HitTestType = void 0;\n(function(HitTestType) {\n HitTestType[HitTestType[\"triangle\"] = 1] = \"triangle\";\n HitTestType[HitTestType[\"box\"] = 2] = \"box\";\n HitTestType[HitTestType[\"sphere\"] = 3] = \"sphere\";\n HitTestType[HitTestType[\"custom\"] = 4] = \"custom\";\n})(exports.HitTestType || (exports.HitTestType = {}));\n\nvar EVENT_TYPE_CLICK = \"click\";\nvar EVENT_TYPE_TOUCH_START = \"touchstart\";\nvar EVENT_TYPE_TOUCH_MOVE = \"touchmove\";\nvar EVENT_TYPE_TOUCH_END = \"touchend\";\nvar EventSystem = /*#__PURE__*/ function() {\n function EventSystem(target, allowPropagation) {\n if (allowPropagation === void 0) allowPropagation = false;\n this.target = target;\n this.allowPropagation = allowPropagation;\n this.enabled = true;\n this.handlers = {};\n this.nativeHandlers = {};\n }\n var _proto = EventSystem.prototype;\n _proto.bindListeners = function bindListeners() {\n var _this = this;\n var x;\n var y;\n var currentTouch;\n var lastTouch;\n var getTouch;\n getTouch = function(event) {\n return event;\n };\n var touchstart = \"mousedown\";\n var touchmove = \"mousemove\";\n var touchend = \"mouseup\";\n var getTouchEventValue = function(event, x, y, dx, dy) {\n if (dx === void 0) dx = 0;\n if (dy === void 0) dy = 0;\n var vx = 0;\n var vy = 0;\n var ts = performance.now();\n if (!_this.target) {\n logger.warn(\"Trigger TouchEvent after EventSystem is disposed.\");\n return {\n x: x,\n y: y,\n vx: 0,\n vy: vy,\n dx: dx,\n dy: dy,\n ts: ts,\n width: 0,\n height: 0,\n origin: event\n };\n }\n var _this_target = _this.target, width = _this_target.width, height = _this_target.height;\n if (lastTouch) {\n var dt = ts - lastTouch.ts;\n vx = (dx - lastTouch.dx) / dt || 0;\n vy = (dy - lastTouch.dy) / dt || 0;\n lastTouch = {\n dx: dx,\n dy: dy,\n ts: ts\n };\n }\n return {\n x: x,\n y: y,\n vx: vx,\n vy: vy,\n dx: dx,\n dy: dy,\n ts: ts,\n width: width,\n height: height,\n origin: event\n };\n };\n if (isSimulatorCellPhone()) {\n getTouch = function(event) {\n var touches = event.touches, changedTouches = event.changedTouches;\n return touches[0] || changedTouches[0];\n };\n touchstart = \"touchstart\";\n touchmove = \"touchmove\";\n touchend = \"touchend\";\n }\n var _obj;\n this.nativeHandlers = (_obj = {}, _obj[touchstart] = function(event) {\n if (_this.enabled) {\n var touch = getTouch(event);\n var cood = getCoord(touch);\n x = cood.x;\n y = cood.y;\n lastTouch = currentTouch = {\n clientX: touch.clientX,\n clientY: touch.clientY,\n ts: performance.now(),\n x: x,\n y: y\n };\n _this.dispatchEvent(EVENT_TYPE_TOUCH_START, getTouchEventValue(event, x, y));\n }\n }, _obj[touchmove] = function(event) {\n if (currentTouch && _this.enabled) {\n var cood = getCoord(getTouch(event));\n x = cood.x;\n y = cood.y;\n _this.dispatchEvent(EVENT_TYPE_TOUCH_MOVE, getTouchEventValue(event, x, y, x - currentTouch.x, y - currentTouch.y));\n }\n }, _obj[touchend] = function(event) {\n if (currentTouch && _this.enabled) {\n if (!_this.allowPropagation && event.cancelable) {\n event.preventDefault();\n event.stopPropagation();\n }\n var touch = getTouch(event);\n var cood = getCoord(touch);\n var dt = Math.abs(currentTouch.clientX - touch.clientX) + Math.abs(currentTouch.clientY - touch.clientY);\n x = cood.x;\n y = cood.y;\n if (dt < 4) {\n _this.dispatchEvent(EVENT_TYPE_CLICK, getTouchEventValue(event, x, y));\n }\n _this.dispatchEvent(EVENT_TYPE_TOUCH_END, getTouchEventValue(event, x, y, x - currentTouch.x, y - currentTouch.y));\n }\n currentTouch = 0;\n }, _obj);\n Object.keys(this.nativeHandlers).forEach(function(name) {\n var _this_target;\n (_this_target = _this.target) == null ? void 0 : _this_target.addEventListener(String(name), _this.nativeHandlers[name]);\n });\n };\n _proto.dispatchEvent = function dispatchEvent(type, event) {\n var handlers = this.handlers[type];\n handlers == null ? void 0 : handlers.forEach(function(fn) {\n return fn(event);\n });\n };\n _proto.addEventListener = function addEventListener(type, callback) {\n var handlers = this.handlers[type];\n if (!handlers) {\n handlers = this.handlers[type] = [];\n }\n addItem(handlers, callback);\n return function() {\n removeItem(handlers, callback);\n };\n };\n _proto.removeEventListener = function removeEventListener(type, callback) {\n var handlers = this.handlers[type];\n if (handlers) {\n removeItem(handlers, callback);\n }\n };\n _proto.dispose = function dispose() {\n var _this = this;\n if (this.target) {\n this.handlers = {};\n Object.keys(this.nativeHandlers).forEach(function(name) {\n var _this_target;\n (_this_target = _this.target) == null ? void 0 : _this_target.removeEventListener(String(name), _this.nativeHandlers[name]);\n });\n this.nativeHandlers = {};\n this.target = null;\n }\n };\n return EventSystem;\n}();\nfunction getCoord(event) {\n var ele = event.target;\n var clientX = event.clientX, clientY = event.clientY;\n var _ele_getBoundingClientRect = ele.getBoundingClientRect(), left = _ele_getBoundingClientRect.left, top = _ele_getBoundingClientRect.top, width = _ele_getBoundingClientRect.width, height = _ele_getBoundingClientRect.height;\n var x = (clientX - left) / width * 2 - 1;\n var y = 1 - (clientY - top) / height * 2;\n return {\n x: x,\n y: y\n };\n}\n\nvar InteractLoader = /*#__PURE__*/ function(AbstractPlugin) {\n _inherits(InteractLoader, AbstractPlugin);\n function InteractLoader() {\n return AbstractPlugin.apply(this, arguments);\n }\n return InteractLoader;\n}(AbstractPlugin);\n\nvar toHalf = function() {\n var floatView = new Float32Array(1);\n var int32View = new Int32Array(floatView.buffer);\n /* This method is faster than the OpenEXR implementation (very often\n * used, eg. in Ogre), with the additional benefit of rounding, inspired\n * by James Tursa?s half-precision code. */ return function toHalf(val) {\n floatView[0] = val;\n var x = int32View[0];\n var bits = x >> 16 & 0x8000; /* Get the sign */ \n var m = x >> 12 & 0x07ff; /* Keep one extra bit for rounding */ \n var e = x >> 23 & 0xff; /* Using int is faster here */ \n /* If zero, or denormal, or exponent underflows too much for a denormal\n * half, return signed zero. */ if (e < 103) {\n return bits;\n }\n /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */ if (e > 142) {\n bits |= 0x7c00;\n /* If exponent was 0xff and one mantissa bit was set, it means NaN,\n * not Inf, so make sure we set one mantissa bit too. */ bits |= (e == 255 ? 0 : 1) && x & 0x007fffff;\n return bits;\n }\n /* If exponent underflows but not too much, return a denormal */ if (e < 113) {\n m |= 0x0800;\n /* Extra rounding may overflow and set mantissa to 0 and exponent\n * to 1, which is OK. */ bits |= (m >> 114 - e) + (m >> 113 - e & 1);\n return bits;\n }\n bits |= e - 112 << 10 | m >> 1;\n /* Extra rounding. An overflow will set mantissa to 0 and increment\n * the exponent, which is OK. */ bits += m & 1;\n return bits;\n };\n}();\nvar Float16ArrayWrapper = /*#__PURE__*/ function() {\n function Float16ArrayWrapper(num) {\n if (Number.isInteger(num)) {\n this.data = new Uint16Array(num);\n } else if (num && typeof num === \"object\" && Number.isInteger(num.length)) {\n var data = this.data = new Uint16Array(num.length);\n for(var i = 0; i < data.length; i++){\n data[i] = toHalf(num[i]);\n }\n }\n }\n var _proto = Float16ArrayWrapper.prototype;\n _proto.set = function set(number, startIndex) {\n for(var i = 0; i < number.length; i++){\n this.data[i + startIndex] = toHalf(number[i]);\n }\n };\n return Float16ArrayWrapper;\n}();\n\nfunction translatePoint(x, y) {\n var origin = [\n -.5,\n .5,\n -.5,\n -.5,\n .5,\n .5,\n .5,\n -.5\n ];\n for(var i = 0; i < 8; i += 2){\n origin[i] += x;\n origin[i + 1] += y;\n }\n return origin;\n}\nvar tempEuler$1 = new Euler();\nvar tempMat4$1 = new Matrix4$1();\nfunction calculateTranslation(out, target, acc, time, duration, posData, velData) {\n var ret = out;\n var lifetime = time / duration;\n var speedIntegrate = time;\n var speedOverLifetime = target.speedOverLifetime;\n if (speedOverLifetime) {\n speedIntegrate = speedOverLifetime.getIntegrateValue(0, time, duration);\n }\n var d = target.gravityModifier ? target.gravityModifier.getIntegrateByTime(0, time) : 0;\n ret.copyFrom(posData);\n ret.addScaledVector(velData, speedIntegrate);\n ret.addScaledVector(acc, d);\n var linearVelocityOverLifetime = target.linearVelOverLifetime || {};\n var orbVelOverLifetime = target.orbitalVelOverLifetime || {};\n var map = [\n \"x\",\n \"y\",\n \"z\"\n ];\n if (orbVelOverLifetime.enabled) {\n var center = new Vector3();\n if (orbVelOverLifetime.center) {\n center.setFromArray(orbVelOverLifetime.center);\n }\n var pos = ret.clone().subtract(center);\n var asRotation = orbVelOverLifetime.asRotation;\n var orbVel = map.map(function(pro) {\n var value = orbVelOverLifetime[pro];\n if (value) {\n return asRotation ? value.getValue(lifetime) : value.getIntegrateValue(0, time, duration);\n }\n return 0;\n });\n tempEuler$1.setFromArray(orbVel).negate();\n tempMat4$1.setFromEuler(tempEuler$1);\n var rot = tempMat4$1.transformPoint(pos);\n ret.addVectors(center, rot);\n }\n if (linearVelocityOverLifetime.enabled) {\n var asMovement = linearVelocityOverLifetime.asMovement;\n var velocityXCurve = linearVelocityOverLifetime.x;\n var velocityYCurve = linearVelocityOverLifetime.y;\n var velocityZCurve = linearVelocityOverLifetime.z;\n if (velocityXCurve) {\n var curveValue = asMovement ? velocityXCurve.getValue(lifetime) : velocityXCurve.getIntegrateValue(0, time, duration);\n ret.x = ret.x + curveValue;\n }\n if (velocityYCurve) {\n var curveValue1 = asMovement ? velocityYCurve.getValue(lifetime) : velocityYCurve.getIntegrateValue(0, time, duration);\n ret.y = ret.y + curveValue1;\n }\n if (velocityZCurve) {\n var curveValue2 = asMovement ? velocityZCurve.getValue(lifetime) : velocityZCurve.getIntegrateValue(0, time, duration);\n ret.z = ret.z + curveValue2;\n }\n }\n return ret;\n}\n\nfunction ensureVec3(num) {\n return Array.isArray(num) ? [\n num[0],\n num[1],\n num[2]\n ] : [\n 0,\n 0,\n 0\n ];\n}\nfunction vecFill(out, number) {\n for(var i = 0, len = out.length; i < len; i++){\n out[i] = number;\n }\n return out;\n}\nfunction vecMulCombine(out, a, b) {\n if (a && b) {\n for(var i = 0, len = a.length; i < len; i++){\n out[i] = a[i] * b[i];\n }\n } else if (a) {\n if (out !== a) {\n for(var i1 = 0; i1 < a.length; i1++){\n out[i1] = a[i1];\n }\n }\n } else if (b) {\n if (out !== b) {\n for(var i2 = 0; i2 < b.length; i2++){\n out[i2] = b[i2];\n }\n }\n }\n return out;\n}\nvar _obj$7;\nvar particleOriginTranslateMap$1 = (_obj$7 = {}, _obj$7[ParticleOrigin.PARTICLE_ORIGIN_CENTER] = [\n 0,\n 0\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_CENTER_BOTTOM] = [\n 0,\n -0.5\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_CENTER_TOP] = [\n 0,\n 0.5\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_LEFT_TOP] = [\n -0.5,\n 0.5\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_LEFT_CENTER] = [\n -0.5,\n 0\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_LEFT_BOTTOM] = [\n -0.5,\n -0.5\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_CENTER] = [\n 0.5,\n 0\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_BOTTOM] = [\n 0.5,\n -0.5\n], _obj$7[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_TOP] = [\n 0.5,\n 0.5\n], _obj$7);\nfunction nearestPowerOfTwo(value) {\n return Math.pow(2, Math.round(Math.log(value) / Math.LN2));\n}\nfunction setRayFromCamera(x, y, camera) {\n var origin = camera.position;\n var direction = new Vector3(x, y, 0);\n var dir = new Vector3();\n var mat = camera.getInverseViewProjectionMatrix();\n mat.projectPoint(direction, dir);\n dir.subtract(origin);\n return new Ray(origin, dir);\n}\nfunction trianglesFromRect(position, halfWidth, halfHeight) {\n var x = position.x, y = position.y, z = position.z;\n var p0 = new Vector3(x - halfWidth, y + halfHeight, z);\n var p1 = new Vector3(x - halfWidth, y - halfHeight, z);\n var p2 = new Vector3(x + halfWidth, y - halfHeight, z);\n var p3 = new Vector3(x + halfWidth, y + halfHeight, z);\n return [\n {\n p0: p0,\n p1: p1,\n p2: p2\n },\n {\n p0: p0.clone(),\n p1: p2.clone(),\n p2: p3\n }\n ];\n}\nfunction decimalEqual(a, b, epsilon) {\n if (epsilon === void 0) epsilon = 0.000001;\n return Math.abs(a - b) < epsilon;\n}\nfunction numberToFix(a, fixed) {\n if (fixed === void 0) fixed = 2;\n var base = Math.pow(10, fixed);\n return Math.floor(a * base) / base;\n}\n\nvar keyframeInfo = {\n pointIndexCache: {\n xIndex: 0,\n yIndex: 0\n },\n /**\n * 根据不同关键帧类型,获取位于曲线上的点\n */ getPointInCurve: function getPointInCurve(keyframe) {\n keyframe[0]; var data = keyframe[1];\n var _this_getPointIndexInCurve = this.getPointIndexInCurve(keyframe, this.pointIndexCache), xIndex = _this_getPointIndexInCurve.xIndex, yIndex = _this_getPointIndexInCurve.yIndex;\n var time = data[xIndex];\n var value = data[yIndex];\n return new Vector2(time, value);\n },\n /**\n * 根据不同关键帧类型,获取位于曲线上的点的索引\n */ getPointIndexInCurve: function getPointIndexInCurve(keyframe, res) {\n var type = keyframe[0], markType = keyframe[2];\n // 不同类型,存放的时间不同\n var index = type === BezierKeyframeType.LINE ? 0 : type === BezierKeyframeType.EASE_OUT ? 0 : type === BezierKeyframeType.EASE_IN ? 2 : type === BezierKeyframeType.EASE ? 2 : type === BezierKeyframeType.HOLD ? markType === BezierKeyframeType.EASE_IN ? 2 : 0 : 0;\n if (res) {\n res.xIndex = index;\n res.yIndex = index + 1;\n return res;\n } else {\n return {\n xIndex: index,\n yIndex: index + 1\n };\n }\n },\n /**\n * 关键帧左侧是否为缓动类型(否则为线段)\n */ isLeftSideEase: function isLeftSideEase(keyframe) {\n var keyframeType = keyframe[0]; keyframe[1]; var markType = keyframe[2];\n // 定格关键帧的左侧类型,需要借助markType判断\n if (keyframeType === BezierKeyframeType.HOLD && this.isKeyframeTypeLeftSideEase(markType)) {\n return true;\n }\n return this.isKeyframeTypeLeftSideEase(keyframeType);\n },\n /**\n * 关键帧右侧是否为缓动类型(否则为线段)\n */ isRightSideEase: function isRightSideEase(keyframe) {\n var keyframeType = keyframe[0]; keyframe[1]; var markType = keyframe[2];\n // 定格关键帧的右侧类型,需要借助markType判断\n if (keyframeType === BezierKeyframeType.HOLD && this.isKeyframeTypeRightSideEase(markType)) {\n return true;\n }\n return this.isKeyframeTypeRightSideEase(keyframeType);\n },\n /**\n * 关键帧左侧是否为缓动类型(否则为线段)\n */ isKeyframeTypeLeftSideEase: function isKeyframeTypeLeftSideEase(keyframeType) {\n return [\n BezierKeyframeType.EASE,\n BezierKeyframeType.EASE_IN,\n BezierKeyframeType.AUTO\n ].includes(keyframeType);\n },\n /**\n * 关键帧右侧是否为缓动类型(否则为线段)\n */ isKeyframeTypeRightSideEase: function isKeyframeTypeRightSideEase(keyframeType) {\n return [\n BezierKeyframeType.EASE,\n BezierKeyframeType.EASE_OUT,\n BezierKeyframeType.AUTO\n ].includes(keyframeType);\n },\n /**\n * 是否为定格进关键帧\n */ isHoldInKeyframe: function isHoldInKeyframe(keyframe) {\n var keyframeType = keyframe[0]; keyframe[1]; var leftSubType = keyframe[2];\n return keyframeType === BezierKeyframeType.HOLD && [\n BezierKeyframeType.HOLD,\n BezierKeyframeType.LINE_OUT,\n BezierKeyframeType.EASE_OUT\n ].includes(leftSubType);\n },\n /**\n * 是否为定格出关键帧\n */ isHoldOutKeyframe: function isHoldOutKeyframe(keyframe) {\n var keyframeType = keyframe[0]; keyframe[1]; var leftSubType = keyframe[2];\n return keyframeType === BezierKeyframeType.HOLD && [\n BezierKeyframeType.HOLD,\n BezierKeyframeType.LINE,\n BezierKeyframeType.EASE_IN\n ].includes(leftSubType);\n }\n};\n\nvar BezierLengthData = function BezierLengthData(points, totalLength) {\n this.points = points;\n this.totalLength = totalLength;\n};\nvar BezierMap = {};\nvar BezierDataMap = {};\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\nvar CURVE_SEGMENTS = 300;\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\nfunction A(a1, a2) {\n return 1.0 - 3.0 * a2 + 3.0 * a1;\n}\nfunction B(a1, a2) {\n return 3.0 * a2 - 6.0 * a1;\n}\nfunction C(a1) {\n return 3.0 * a1;\n}\n// A * t ^ 3 + B * t ^ 2 + C * t\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(t, a1, a2) {\n return ((A(a1, a2) * t + B(a1, a2)) * t + C(a1)) * t;\n}\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(t, a1, a2) {\n return 3.0 * A(a1, a2) * t * t + 2.0 * B(a1, a2) * t + C(a1);\n}\nfunction binarySubdivide(aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n }while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\nfunction newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {\n for(var i = 0; i < NEWTON_ITERATIONS; ++i){\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n// de Casteljau算法构建曲线\n/**\n * @param p1 起始点\n * @param p2 终点\n * @param p3 起始控制点\n * @param p4 终止控制点\n * @returns\n */ function buildBezierData(p1, p2, p3, p4) {\n // 使用平移后的终点、控制点作为key\n var s1 = numberToFix(p2.x - p1.x, 3) + \"_\" + numberToFix(p2.y - p1.y, 3) + \"_\" + numberToFix(p2.z - p1.z, 3);\n var s2 = numberToFix(p3.x - p1.x, 3) + \"_\" + numberToFix(p3.y - p1.y, 3) + \"_\" + numberToFix(p3.z - p1.z, 3);\n var s3 = numberToFix(p4.x - p1.x, 3) + \"_\" + numberToFix(p4.y - p1.y, 3) + \"_\" + numberToFix(p4.z - p1.z, 3);\n var str = s1 + \"&\" + s2 + \"&\" + s3;\n if (BezierDataMap[str]) {\n return {\n data: BezierDataMap[str],\n interval: p1\n };\n } else {\n var samples = [];\n var lastPoint = null, addedLength = 0, ptDistance = 0;\n var curveSegments = CURVE_SEGMENTS;\n for(var k = 0; k < curveSegments; k += 1){\n var point = new Vector3();\n var perc = k / (curveSegments - 1);\n ptDistance = 0;\n point.x = 3 * Math.pow(1 - perc, 2) * perc * (p3.x - p1.x) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.x - p1.x) + Math.pow(perc, 3) * (p2.x - p1.x);\n point.y = 3 * Math.pow(1 - perc, 2) * perc * (p3.y - p1.y) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.y - p1.y) + Math.pow(perc, 3) * (p2.y - p1.y);\n point.z = 3 * Math.pow(1 - perc, 2) * perc * (p3.z - p1.z) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.z - p1.z) + Math.pow(perc, 3) * (p2.z - p1.z);\n if (lastPoint !== null) {\n ptDistance += Math.pow(point.x - lastPoint.x, 2);\n ptDistance += Math.pow(point.y - lastPoint.y, 2);\n ptDistance += Math.pow(point.z - lastPoint.z, 2);\n }\n lastPoint = point;\n ptDistance = Math.sqrt(ptDistance);\n addedLength += ptDistance;\n samples[k] = {\n partialLength: ptDistance,\n point: point\n };\n }\n var data = new BezierLengthData(samples, addedLength);\n BezierDataMap[str] = data;\n return {\n data: data,\n interval: new Vector3(p1.x, p1.y, p1.z)\n };\n }\n}\nvar BezierPath = /*#__PURE__*/ function() {\n function BezierPath(p1, p2, p3, p4) {\n this.p1 = p1;\n this.p2 = p2;\n this.p3 = p3;\n this.p4 = p4;\n this.catching = {\n lastPoint: 0,\n lastAddedLength: 0\n };\n var _buildBezierData = buildBezierData(p1, p2, p3, p4), data = _buildBezierData.data, interval = _buildBezierData.interval;\n this.lengthData = data;\n this.interval = interval;\n this.totalLength = data.totalLength;\n }\n var _proto = BezierPath.prototype;\n /**\n * 获取路径在指定比例长度上点的坐标\n * @param percent 路径长度的比例\n */ _proto.getPointInPercent = function getPointInPercent(percent) {\n var bezierData = this.lengthData;\n if (percent === 0) {\n return bezierData.points[0].point.clone().add(this.interval);\n }\n if (decimalEqual(1 - percent, 0)) {\n return bezierData.points[CURVE_SEGMENTS - 1].point.clone().add(this.interval);\n }\n if (decimalEqual(bezierData.totalLength, 0)) {\n return this.p1.clone();\n }\n var point = new Vector3();\n var segmentLength = numberToFix(bezierData.totalLength * percent, 4);\n var addedLength = this.catching.lastAddedLength;\n var j = this.catching.lastPoint;\n if (decimalEqual(addedLength, segmentLength)) {\n return bezierData.points[j].point.clone().add(this.interval);\n }\n var flag = true;\n var dir = 1;\n if (segmentLength < addedLength) {\n dir = -1;\n }\n while(flag){\n if (segmentLength >= addedLength) {\n if (j === CURVE_SEGMENTS - 1) {\n point.x = bezierData.points[j].point.x;\n point.y = bezierData.points[j].point.y;\n point.z = bezierData.points[j].point.z;\n break;\n }\n if (segmentLength < addedLength + bezierData.points[j + 1].partialLength) {\n var segmentPerc = (segmentLength - addedLength) / bezierData.points[j + 1].partialLength;\n point.x = bezierData.points[j].point.x + (bezierData.points[j + 1].point.x - bezierData.points[j].point.x) * segmentPerc;\n point.y = bezierData.points[j].point.y + (bezierData.points[j + 1].point.y - bezierData.points[j].point.y) * segmentPerc;\n point.z = bezierData.points[j].point.z + (bezierData.points[j + 1].point.z - bezierData.points[j].point.z) * segmentPerc;\n break;\n }\n }\n if (dir > 0 && j < CURVE_SEGMENTS - 1) {\n j += dir;\n addedLength += numberToFix(bezierData.points[j].partialLength, 5);\n } else if (dir < 0 && j > 0) {\n addedLength -= numberToFix(bezierData.points[j].partialLength, 5);\n j += dir;\n } else {\n flag = false;\n }\n }\n this.catching.lastPoint = j;\n this.catching.lastAddedLength = addedLength;\n point.add(this.interval);\n return point;\n };\n return BezierPath;\n}();\nvar BezierQuat = /*#__PURE__*/ function() {\n function BezierQuat(p1, p2, p3, p4) {\n this.p1 = p1;\n this.p2 = p2;\n this.p3 = p3;\n this.p4 = p4;\n this.temp = new Quaternion();\n this.totalLength = 0;\n }\n var _proto = BezierQuat.prototype;\n /**\n * 获取路径在指定比例长度上点的坐标\n * @param percent 路径长度的比例\n */ _proto.getPointInPercent = function getPointInPercent(percent) {\n if (percent === 0) {\n return this.temp.copyFrom(this.p1);\n }\n if (decimalEqual(1 - percent, 0)) {\n return this.temp.copyFrom(this.p2);\n }\n QuaternionInner.slerpFlat(this.temp, this.p1, this.p2, percent);\n return this.temp;\n };\n return BezierQuat;\n}();\nvar BezierEasing = /*#__PURE__*/ function() {\n function BezierEasing(mX1, mY1, mX2, mY2) {\n this.mX1 = mX1;\n this.mY1 = mY1;\n this.mX2 = mX2;\n this.mY2 = mY2;\n this.precomputed = false;\n this.mSampleValues = new Array(kSplineTableSize);\n }\n var _proto = BezierEasing.prototype;\n _proto.precompute = function precompute() {\n this.precomputed = true;\n if (this.mX1 !== this.mY1 || this.mX2 !== this.mY2) {\n this.calcSampleValues();\n }\n };\n _proto.getValue = function getValue(x) {\n if (this.mX1 === this.mY1 && this.mX2 === this.mY2) {\n return x;\n }\n if (isNaN(this.mY1) || isNaN(this.mY2)) {\n return 0;\n }\n if (x === 0 || x === 1) {\n return x;\n }\n if (!this.precomputed) {\n this.precompute();\n }\n var value = calcBezier(this.getTForX(x), this.mY1, this.mY2);\n return value;\n };\n _proto.calcSampleValues = function calcSampleValues() {\n for(var i = 0; i < kSplineTableSize; ++i){\n this.mSampleValues[i] = calcBezier(i * kSampleStepSize, this.mX1, this.mX2);\n }\n };\n _proto.getTForX = function getTForX(aX) {\n var mSampleValues = this.mSampleValues, lastSample = kSplineTableSize - 1;\n var intervalStart = 0, currentSample = 1;\n for(; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample){\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n // Interpolate to provide an initial guess for t\n var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n var initialSlope = getSlope(guessForT, this.mX1, this.mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, this.mX1, this.mX2);\n }\n if (initialSlope === 0.0) {\n return guessForT;\n }\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, this.mX1, this.mX2);\n };\n return BezierEasing;\n}();\nfunction buildEasingCurve(leftKeyframe, rightKeyframe) {\n // 获取控制点和曲线类型\n var _getControlPoints = getControlPoints(leftKeyframe, rightKeyframe, true), p0 = _getControlPoints.p0, p1 = _getControlPoints.p1, p2 = _getControlPoints.p2, p3 = _getControlPoints.p3;\n assertExist(p2);\n assertExist(p3);\n var timeInterval = p3.x - p0.x;\n var valueInterval = p3.y - p0.y;\n var y1, y2;\n var x1 = numberToFix((p1.x - p0.x) / timeInterval, 5);\n var x2 = numberToFix((p2.x - p0.x) / timeInterval, 5);\n if (decimalEqual(valueInterval, 0)) {\n y1 = y2 = NaN;\n } else {\n y1 = numberToFix((p1.y - p0.y) / valueInterval, 5);\n y2 = numberToFix((p2.y - p0.y) / valueInterval, 5);\n }\n if (x1 < 0) {\n console.error(\"Invalid bezier points, x1 < 0\", p0, p1, p2, p3);\n x1 = 0;\n }\n if (x2 < 0) {\n console.error(\"Invalid bezier points, x2 < 0\", p0, p1, p2, p3);\n x2 = 0;\n }\n if (x1 > 1) {\n console.error(\"Invalid bezier points, x1 >= 1\", p0, p1, p2, p3);\n x1 = 1;\n }\n if (x2 > 1) {\n console.error(\"Invalid bezier points, x2 >= 1\", p0, p1, p2, p3);\n x2 = 1;\n }\n var str = (\"bez_\" + x1 + \"_\" + y1 + \"_\" + x2 + \"_\" + y2).replace(/\\./g, \"p\");\n var bezEasing;\n if (BezierMap[str]) {\n bezEasing = BezierMap[str];\n } else {\n bezEasing = new BezierEasing(x1, y1, x2, y2);\n BezierMap[str] = bezEasing;\n }\n return {\n points: [\n p0,\n p1,\n p2,\n p3\n ],\n timeInterval: timeInterval,\n valueInterval: valueInterval,\n curve: bezEasing\n };\n}\n/**\n * 根据关键帧类型获取贝塞尔曲线上的关键点\n */ function getControlPoints(leftKeyframe, rightKeyframe, lineToBezier) {\n var leftValue = leftKeyframe[1];\n var leftHoldLine = keyframeInfo.isHoldOutKeyframe(leftKeyframe);\n var rightHoldLine = keyframeInfo.isHoldInKeyframe(rightKeyframe);\n var leftEase = !rightHoldLine && keyframeInfo.isRightSideEase(leftKeyframe);\n var rightEase = !leftHoldLine && keyframeInfo.isLeftSideEase(rightKeyframe);\n // 1. 左边为ease,右边为line(补充右边的控制点,该点在曲线上的点的偏左边位置)\n if (leftEase && !rightEase && !rightHoldLine) {\n var p0 = new Vector2(leftValue[leftValue.length - 4], leftValue[leftValue.length - 3]);\n var p1 = new Vector2(leftValue[leftValue.length - 2], leftValue[leftValue.length - 1]);\n var rightPoint = keyframeInfo.getPointInCurve(rightKeyframe);\n var p3 = new Vector2(rightPoint.x, rightPoint.y);\n var p2 = new Vector2(p3.x - (p3.x - p0.x) / 10, p3.y);\n return {\n type: \"ease\",\n p0: p0,\n p1: p1,\n p2: p2,\n p3: p3\n };\n }\n // 2. 左边为line,右边为ease(补充左边的控制点,该点在曲线上的点的偏右边位置)\n if (!leftEase && rightEase && !leftHoldLine) {\n var rightValue = rightKeyframe[1];\n var leftPoint = keyframeInfo.getPointInCurve(leftKeyframe);\n var p01 = new Vector2(leftPoint.x, leftPoint.y);\n var p21 = new Vector2(rightValue[0], rightValue[1]);\n var p31 = new Vector2(rightValue[2], rightValue[3]);\n var p11 = new Vector2(p01.x + (p31.x - p01.x) / 10, p01.y);\n return {\n type: \"ease\",\n p0: p01,\n p1: p11,\n p2: p21,\n p3: p31\n };\n }\n // 3. 左边为ease,右边为ease\n if (leftEase && rightEase) {\n var rightValue1 = rightKeyframe[1];\n var p02 = new Vector2(leftValue[leftValue.length - 4], leftValue[leftValue.length - 3]);\n var p12 = new Vector2(leftValue[leftValue.length - 2], leftValue[leftValue.length - 1]);\n var p22 = new Vector2(rightValue1[0], rightValue1[1]);\n var p32 = new Vector2(rightValue1[2], rightValue1[3]);\n return {\n type: \"ease\",\n p0: p02,\n p1: p12,\n p2: p22,\n p3: p32\n };\n }\n // 4. 左边为line,右边为line\n var p03 = keyframeInfo.getPointInCurve(leftKeyframe);\n var p13 = keyframeInfo.getPointInCurve(rightKeyframe);\n if (leftHoldLine) {\n p13.y = p03.y; // 定格关键帧使用相同的点\n } else if (rightHoldLine) {\n p03.y = p13.y;\n }\n if (lineToBezier) {\n // 补上两个在直线上的控制点\n var p23 = new Vector2((p13.x - p03.x) / 3 + p03.x, (p13.y - p03.y) / 3 + p03.y);\n var p33 = new Vector2((p13.x - p03.x) / 3 * 2 + p03.x, (p13.y - p03.y) / 3 * 2 + p03.y);\n return {\n type: \"ease\",\n p0: p03,\n p1: p23,\n p2: p33,\n p3: p13,\n isHold: leftHoldLine || rightHoldLine,\n leftHoldLine: leftHoldLine,\n rightHoldLine: rightHoldLine\n };\n } else {\n return {\n type: \"line\",\n p0: p03,\n p1: p13,\n isHold: leftHoldLine || rightHoldLine,\n leftHoldLine: leftHoldLine,\n rightHoldLine: rightHoldLine\n };\n }\n}\nvar QuaternionInner = /*#__PURE__*/ function() {\n function QuaternionInner() {}\n QuaternionInner.slerpFlat = function slerpFlat(dst, src0, src1, t) {\n // fuzz-free, array-based Quaternion SLERP operation\n var x0 = src0.x;\n var y0 = src0.y;\n var z0 = src0.z;\n var w0 = src0.w;\n var x1 = src1.x;\n var y1 = src1.y;\n var z1 = src1.z;\n var w1 = src1.w;\n if (t === 0) {\n dst.x = x0;\n dst.y = y0;\n dst.z = z0;\n dst.w = w0;\n return;\n }\n if (t === 1) {\n dst.x = x1;\n dst.y = y1;\n dst.z = z1;\n dst.w = w1;\n return;\n }\n if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n var s = 1 - t;\n var cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n var dir = cos >= 0 ? 1 : -1;\n var sqrSin = 1 - cos * cos;\n // Skip the Slerp for tiny steps to avoid numeric problems:\n if (sqrSin > Number.EPSILON) {\n var sin = Math.sqrt(sqrSin);\n var len = Math.atan2(sin, cos * dir);\n s = Math.sin(s * len) / sin;\n t = Math.sin(t * len) / sin;\n }\n var tDir = t * dir;\n x0 = x0 * s + x1 * tDir;\n y0 = y0 * s + y1 * tDir;\n z0 = z0 * s + z1 * tDir;\n w0 = w0 * s + w1 * tDir;\n // Normalize in case we just did a lerp:\n if (s === 1 - t) {\n var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n x0 *= f;\n y0 *= f;\n z0 *= f;\n w0 *= f;\n }\n }\n dst.x = x0;\n dst.y = y0;\n dst.z = z0;\n dst.w = w0;\n };\n return QuaternionInner;\n}();\n\nvar CURVE_PRO_TIME = 0;\nvar CURVE_PRO_VALUE = 1;\nvar CURVE_PRO_IN_TANGENT = 2;\nvar CURVE_PRO_OUT_TANGENT = 3;\nvar NOT_IMPLEMENT = \"not_implement\";\nvar ValueGetter = /*#__PURE__*/ function() {\n function ValueGetter(arg) {\n this.onCreate(arg);\n }\n var _proto = ValueGetter.prototype;\n _proto.onCreate = function onCreate(props) {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.getIntegrateValue = function getIntegrateValue(t0, t1, timeScale) {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.getIntegrateByTime = function getIntegrateByTime(t0, time) {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.getValue = function getValue(time) {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.getMaxTime = function getMaxTime() {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.toUniform = function toUniform(meta) {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.map = function map(func) {\n throw new Error(NOT_IMPLEMENT);\n };\n _proto.scaleXCoord = function scaleXCoord(scale) {\n return this;\n };\n _proto.toData = function toData() {\n throw new Error(NOT_IMPLEMENT);\n };\n ValueGetter.getAllData = function getAllData(meta, halfFloat) {\n var ret = new (halfFloat ? Float16ArrayWrapper : Float32Array)(meta.index * 4);\n for(var i = 0, cursor = 0, curves = meta.curves; i < curves.length; i++){\n var data = curves[i].toData();\n ret.set(data, cursor);\n cursor += data.length;\n }\n return halfFloat ? ret.data : ret;\n };\n return ValueGetter;\n}();\nvar StaticValue = /*#__PURE__*/ function(ValueGetter) {\n _inherits(StaticValue, ValueGetter);\n function StaticValue() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = StaticValue.prototype;\n _proto.onCreate = function onCreate(arg) {\n this.value = arg;\n };\n _proto.getIntegrateValue = function getIntegrateValue(t0, t1, ts) {\n return this.value * (t1 - t0);\n };\n _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) {\n return 0.5 * this.value * (t1 * t1 - t0 * t0);\n };\n _proto.getValue = function getValue(time) {\n return this.value;\n };\n _proto.toUniform = function toUniform() {\n return new Float32Array([\n 0,\n this.value,\n 0,\n 0\n ]);\n };\n _proto.map = function map(func) {\n var val = this.value;\n this.value = func(val);\n return this;\n };\n _proto.getMaxTime = function getMaxTime() {\n return 0;\n };\n return StaticValue;\n}(ValueGetter);\nvar RandomSetValue = /*#__PURE__*/ function(ValueGetter) {\n _inherits(RandomSetValue, ValueGetter);\n function RandomSetValue() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = RandomSetValue.prototype;\n _proto.onCreate = function onCreate(arg) {\n this.items = arg;\n };\n _proto.getValue = function getValue(t) {\n var items = this.items;\n return items[Math.floor(Math.random() * items.length)];\n };\n _proto.map = function map(func) {\n this.items = this.items.map(func);\n return this;\n };\n return RandomSetValue;\n}(ValueGetter);\nvar RandomValue = /*#__PURE__*/ function(ValueGetter) {\n _inherits(RandomValue, ValueGetter);\n function RandomValue() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = RandomValue.prototype;\n _proto.onCreate = function onCreate(props) {\n this.min = props[0];\n this.max = props[1];\n };\n _proto.getValue = function getValue(time, seed) {\n var randomSeed = seed != null ? seed : Math.random();\n return this.min + randomSeed * (this.max - this.min);\n };\n _proto.getIntegrateValue = function getIntegrateValue(t0, t1, timeScale) {\n var seed = timeScale != null ? timeScale : 1.0;\n return (this.min + seed * (this.max - this.min)) * (t1 - t0);\n };\n _proto.toUniform = function toUniform() {\n return new Float32Array([\n 4,\n this.min,\n this.max,\n 0\n ]);\n };\n _proto.map = function map(func) {\n this.min = func(this.min);\n this.max = func(this.max);\n return this;\n };\n return RandomValue;\n}(ValueGetter);\nvar RandomVectorValue = /*#__PURE__*/ function(ValueGetter) {\n _inherits(RandomVectorValue, ValueGetter);\n function RandomVectorValue() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = RandomVectorValue.prototype;\n _proto.onCreate = function onCreate(props) {\n this.min = props[0];\n this.max = props[1];\n };\n _proto.getValue = function getValue(time) {\n var min = this.min;\n var max = this.max;\n var ret = [];\n for(var i = 0; i < min.length; i++){\n var t = Math.random();\n ret[i] = min[i] * (1 - t) + max[i] * t;\n }\n return ret;\n };\n // TODO:\n _proto.map = function map(func) {\n this.min = this.min.map(func);\n this.max = this.max.map(func);\n return this;\n };\n return RandomVectorValue;\n}(ValueGetter);\nvar LinearValue = /*#__PURE__*/ function(ValueGetter) {\n _inherits(LinearValue, ValueGetter);\n function LinearValue() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = LinearValue.prototype;\n _proto.onCreate = function onCreate(props) {\n this.min = props[0];\n this.max = props[1];\n this.xCoord = 1;\n };\n _proto.getValue = function getValue(t) {\n t /= this.xCoord;\n return this.min * (1 - t) + this.max * t;\n };\n _proto.toUniform = function toUniform() {\n return new Float32Array([\n 1,\n this.min,\n this.max,\n this.xCoord\n ]);\n };\n _proto.getIntegrateValue = function getIntegrateValue(t0, t1, timeScale) {\n if (timeScale === void 0) timeScale = 1;\n var min = this.min;\n var max = this.max;\n var ts = this.xCoord * timeScale;\n var v1 = min + (max - min) * (t1 / ts);\n var v0 = min + (max - min) * (t0 / ts);\n return ((v1 + min) * t1 - (v0 + min) * t0) / 2;\n };\n _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) {\n return lineSegIntegrateByTime(t1, 0, this.xCoord, this.min, this.max) - lineSegIntegrateByTime(t0, 0, this.xCoord, this.min, this.max);\n };\n _proto.map = function map(func) {\n this.min = func(this.min);\n this.max = func(this.max);\n return this;\n };\n _proto.scaleXCoord = function scaleXCoord(scale) {\n this.xCoord = scale;\n return this;\n };\n return LinearValue;\n}(ValueGetter);\nvar GradientValue = /*#__PURE__*/ function(ValueGetter) {\n _inherits(GradientValue, ValueGetter);\n function GradientValue() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = GradientValue.prototype;\n _proto.onCreate = function onCreate(props) {\n this.stops = colorStopsFromGradient(props);\n };\n _proto.getStops = function getStops() {\n return this.stops;\n };\n _proto.getValue = function getValue(time) {\n var stops = this.stops;\n var last = stops.length - 1;\n for(var i = 0; i < last; i++){\n var a = stops[i];\n var b = stops[i + 1];\n if (a.stop <= time && b.stop > time) {\n var t = (time - a.stop) / (b.stop - a.stop);\n return interpolateColor(a.color, b.color, t, true);\n }\n }\n return stops[last].color.slice();\n };\n return GradientValue;\n}(ValueGetter);\nvar LineSegments = /*#__PURE__*/ function(ValueGetter) {\n _inherits(LineSegments, ValueGetter);\n function LineSegments() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = LineSegments.prototype;\n _proto.onCreate = function onCreate(props) {\n this.keys = props.map(function(p) {\n if (p.slice) {\n return p.slice(0, 2);\n }\n return [\n p.time,\n p.value\n ];\n }).sort(function(a, b) {\n return a[0] - b[0];\n });\n var last = this.keys[this.keys.length - 1];\n if (last[0] < 1) {\n this.keys.push([\n 1,\n last[1]\n ]);\n }\n var first = this.keys[0];\n if (first[0] > 0) {\n this.keys.unshift([\n 0,\n first[1]\n ]);\n }\n this.isLineSeg = true;\n };\n _proto.getValue = function getValue(time) {\n var keys = this.keys;\n if (time < keys[0][0]) {\n return keys[0][1];\n }\n var end = keys.length - 1;\n for(var i = 0; i < end; i++){\n var key = keys[i];\n var k2 = keys[i + 1];\n var x0 = key[0];\n var x1 = k2[0];\n if (time >= x0 && time <= x1) {\n var p = (time - x0) / (x1 - x0);\n var y0 = key[1];\n return y0 + p * (k2[1] - y0);\n }\n }\n return keys[end][1];\n };\n _proto.getIntegrateValue = function getIntegrateValue(t0, t1, ts) {\n if (ts === void 0) ts = 1;\n return (this.integrate(t1, false) - this.integrate(t0, false)) * ts;\n };\n _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) {\n return this.integrate(t1, true) - this.integrate(t0, true);\n };\n _proto.integrate = function integrate(time, byTime) {\n var keys = this.keys;\n if (time <= keys[0][0]) {\n return 0;\n }\n var ret = 0;\n var end = keys.length - 1;\n var func = byTime ? lineSegIntegrateByTime : lineSegIntegrate;\n for(var i = 0; i < end; i++){\n var k1 = keys[i];\n var k2 = keys[i + 1];\n var t0 = k1[0];\n var t1 = k2[0];\n if (time > t0 && time <= t1) {\n return ret + func(time, t0, t1, k1[1], k2[1]);\n } else {\n ret += func(t1, t0, t1, k1[1], k2[1]);\n }\n }\n return ret;\n };\n _proto.toData = function toData() {\n var keys = this.keys;\n var data = new Float32Array(Math.ceil(keys.length / 2) * 4);\n for(var i = 0, cursor = 0; i < keys.length; i++, cursor += 2){\n data.set(keys[i], cursor);\n }\n data.set(keys[keys.length - 1], data.length - 2);\n return data;\n };\n _proto.toUniform = function toUniform(meta) {\n var index = meta.index;\n var keys = this.keys;\n var uniformCount = Math.ceil(keys.length / 2);\n meta.lineSegCount += uniformCount;\n meta.curves.push(this);\n meta.index += uniformCount;\n meta.max = Math.max(meta.max, uniformCount);\n return new Float32Array([\n 3,\n index,\n uniformCount,\n 0\n ]);\n };\n _proto.map = function map(func) {\n this.keys.forEach(function(k) {\n return k[1] = func(k[1]);\n });\n return this;\n };\n _proto.scaleXCoord = function scaleXCoord(scale) {\n this.keys.forEach(function(k) {\n return k[0] = scale * k[0];\n });\n return this;\n };\n return LineSegments;\n}(ValueGetter);\nvar BezierCurve = /*#__PURE__*/ function(ValueGetter) {\n _inherits(BezierCurve, ValueGetter);\n function BezierCurve() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = BezierCurve.prototype;\n _proto.onCreate = function onCreate(props) {\n var keyframes = props;\n this.curveMap = {};\n this.keys = [];\n for(var i = 0; i < keyframes.length - 1; i++){\n var leftKeyframe = keyframes[i];\n var rightKeyframe = keyframes[i + 1];\n var _buildEasingCurve = buildEasingCurve(leftKeyframe, rightKeyframe), points = _buildEasingCurve.points, curve = _buildEasingCurve.curve, timeInterval = _buildEasingCurve.timeInterval, valueInterval = _buildEasingCurve.valueInterval;\n var s = points[0];\n var e = points[points.length - 1];\n this.keys.push([].concat(s.toArray(), points[1].toArray()));\n this.keys.push([].concat(e.toArray(), points[2].toArray()));\n this.curveMap[s.x + \"&\" + e.x] = {\n points: points,\n timeInterval: timeInterval,\n valueInterval: valueInterval,\n curve: curve,\n timeStart: Number(s.x),\n timeEnd: Number(e.x)\n };\n }\n this.startKeyframe = keyframes[0];\n this.endKeyframe = keyframes[keyframes.length - 1];\n this.keyTimeData = Object.keys(this.curveMap);\n };\n _proto.getValue = function getValue(time) {\n var result = 0;\n var keyTimeData = this.keyTimeData;\n var keyTimeStart = this.curveMap[keyTimeData[0]].timeStart;\n var keyTimeEnd = this.curveMap[keyTimeData[keyTimeData.length - 1]].timeEnd;\n if (time <= keyTimeStart) {\n keyframeInfo.getPointIndexInCurve(this.startKeyframe, keyframeInfo.pointIndexCache);\n return this.startKeyframe[1][keyframeInfo.pointIndexCache.yIndex];\n }\n if (time >= keyTimeEnd) {\n keyframeInfo.getPointIndexInCurve(this.endKeyframe, keyframeInfo.pointIndexCache);\n return this.endKeyframe[1][keyframeInfo.pointIndexCache.yIndex];\n }\n for(var i = 0; i < keyTimeData.length; i++){\n var xMin = this.curveMap[keyTimeData[i]].timeStart;\n var xMax = this.curveMap[keyTimeData[i]].timeEnd;\n // const [xMin, xMax] = keyTimeData[i].split('&');\n if (time >= Number(xMin) && time < Number(xMax)) {\n result = this.getCurveValue(keyTimeData[i], time);\n break;\n }\n }\n return result;\n };\n _proto.getIntegrateValue = function getIntegrateValue(t0, t1, ts) {\n if (ts === void 0) ts = 1;\n var time = (t1 - t0) / ts;\n var result = 0;\n var keyTimeData = Object.keys(this.curveMap);\n var keyTimeStart = this.curveMap[keyTimeData[0]].timeStart;\n if (time <= keyTimeStart) {\n return 0;\n }\n for(var i = 0; i < keyTimeData.length; i++){\n var xMin = this.curveMap[keyTimeData[i]].timeStart;\n var xMax = this.curveMap[keyTimeData[i]].timeEnd;\n if (time >= Number(xMax)) {\n result += ts * this.getCurveIntegrateValue(keyTimeData[i], Number(xMax));\n }\n if (time >= Number(xMin) && time < Number(xMax)) {\n result += ts * this.getCurveIntegrateValue(keyTimeData[i], time);\n break;\n }\n }\n return result;\n };\n _proto.getIntegrateByTime = function getIntegrateByTime(t0, t1) {\n return this.getIntegrateValue(0, t1) - this.getIntegrateValue(0, t0);\n };\n // 速度变化曲线面板移除后下线\n _proto.getCurveIntegrateValue = function getCurveIntegrateValue(curveKey, time) {\n var curveInfo = this.curveMap[curveKey];\n var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0];\n var timeInterval = curveInfo.timeInterval;\n var valueInterval = curveInfo.valueInterval;\n var segments = 20;\n var total = 0;\n var h = (time - p0.x) / segments;\n for(var i = 0; i <= segments; i++){\n var t = i * h;\n var normalizeTime = t / timeInterval;\n var y = p0.y + valueInterval * curveInfo.curve.getValue(normalizeTime);\n if (i === 0 || i === segments) {\n total += y;\n } else if (i % 2 === 1) {\n total += 4 * y;\n } else {\n total += 2 * y;\n }\n }\n total *= h / 3;\n return total;\n };\n _proto.getCurveValue = function getCurveValue(curveKey, time) {\n var curveInfo = this.curveMap[curveKey];\n var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0];\n var timeInterval = curveInfo.timeInterval;\n var valueInterval = curveInfo.valueInterval;\n var normalizeTime = (time - p0.x) / timeInterval;\n var value = curveInfo.curve.getValue(normalizeTime);\n return p0.y + valueInterval * value;\n };\n _proto.toUniform = function toUniform(meta) {\n var index = meta.index;\n var count = this.keys.length;\n meta.curves.push(this);\n meta.index = index + count;\n // 兼容 WebGL1\n meta.max = Math.max(meta.max, count);\n meta.curveCount += count;\n return new Float32Array([\n 5,\n index + 1 / count,\n index,\n count\n ]);\n };\n _proto.toData = function toData() {\n var keys = this.keys;\n var data = new Float32Array(keys.length * 4);\n for(var i = 0, cursor = 0; i < keys.length; i++, cursor += 4){\n data.set(keys[i], cursor);\n }\n return data;\n };\n _proto.getMaxTime = function getMaxTime() {\n var keyTimeData = this.keyTimeData;\n return this.curveMap[keyTimeData[keyTimeData.length - 1]].timeEnd;\n };\n return BezierCurve;\n}(ValueGetter);\nvar PathSegments = /*#__PURE__*/ function(ValueGetter) {\n _inherits(PathSegments, ValueGetter);\n function PathSegments() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = PathSegments.prototype;\n _proto.onCreate = function onCreate(props) {\n this.keys = props[0];\n this.values = props[1];\n };\n _proto.getValue = function getValue(time) {\n var keys = this.keys;\n var values = this.values;\n for(var i = 0; i < keys.length - 1; i++){\n var k0 = keys[i];\n var k1 = keys[i + 1];\n if (k0[0] <= time && k1[0] >= time) {\n var dis = k1[1] - k0[1];\n var dt = void 0;\n if (dis === 0) {\n dt = (time - k0[0]) / (k1[0] - k0[0]);\n } else {\n var val = curveValueEvaluate(time, k0, k1);\n dt = (val - k0[1]) / dis;\n }\n return this.calculateVec(i, dt);\n }\n }\n if (time <= keys[0][0]) {\n return values[0].slice();\n }\n return values[values.length - 1].slice();\n };\n _proto.calculateVec = function calculateVec(i, dt) {\n var vec0 = this.values[i];\n var vec1 = this.values[i + 1];\n var ret = [\n 0,\n 0,\n 0\n ];\n for(var j = 0; j < vec0.length; j++){\n ret[j] = vec0[j] * (1 - dt) + vec1[j] * dt;\n }\n return ret;\n };\n return PathSegments;\n}(ValueGetter);\nvar BezierCurvePath = /*#__PURE__*/ function(ValueGetter) {\n _inherits(BezierCurvePath, ValueGetter);\n function BezierCurvePath() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = BezierCurvePath.prototype;\n _proto.onCreate = function onCreate(props) {\n var keyframes = props[0], points = props[1], controlPoints = props[2];\n this.curveSegments = {};\n if (!controlPoints.length) {\n return;\n }\n for(var i = 0; i < keyframes.length - 1; i++){\n var leftKeyframe = keyframes[i];\n var rightKeyframe = keyframes[i + 1];\n var ps1 = new Vector3(points[i][0], points[i][1], points[i][2]), ps2 = new Vector3(points[i + 1][0], points[i + 1][1], points[i + 1][2]);\n var cp1 = new Vector3(controlPoints[2 * i][0], controlPoints[2 * i][1], controlPoints[2 * i][2]), cp2 = new Vector3(controlPoints[2 * i + 1][0], controlPoints[2 * i + 1][1], controlPoints[2 * i + 1][2]);\n var _buildEasingCurve = buildEasingCurve(leftKeyframe, rightKeyframe), ps = _buildEasingCurve.points, easingCurve = _buildEasingCurve.curve, timeInterval = _buildEasingCurve.timeInterval, valueInterval = _buildEasingCurve.valueInterval;\n var s = ps[0];\n var e = ps[ps.length - 1];\n var pathCurve = new BezierPath(ps1, ps2, cp1, cp2);\n this.curveSegments[s.x + \"&\" + e.x] = {\n points: ps,\n timeInterval: timeInterval,\n valueInterval: valueInterval,\n easingCurve: easingCurve,\n pathCurve: pathCurve,\n timeStart: Number(s.x),\n timeEnd: Number(e.x)\n };\n }\n this.keyTimeData = Object.keys(this.curveSegments);\n };\n _proto.getValue = function getValue(time) {\n var t = numberToFix(time, 5);\n var perc = 0, point = new Vector3();\n var keyTimeData = this.keyTimeData;\n if (!keyTimeData.length) {\n return point;\n }\n var keyTimeStart = this.curveSegments[keyTimeData[0]].timeStart;\n var keyTimeEnd = this.curveSegments[keyTimeData[keyTimeData.length - 1]].timeEnd;\n if (t <= keyTimeStart) {\n var pathCurve = this.curveSegments[keyTimeData[0]].pathCurve;\n point = pathCurve.getPointInPercent(0);\n return point;\n }\n if (t >= keyTimeEnd) {\n var pathCurve1 = this.curveSegments[keyTimeData[keyTimeData.length - 1]].pathCurve;\n point = pathCurve1.getPointInPercent(1);\n return point;\n }\n for(var i = 0; i < keyTimeData.length; i++){\n var xMin = this.curveSegments[keyTimeData[i]].timeStart;\n var xMax = this.curveSegments[keyTimeData[i]].timeEnd;\n if (t >= Number(xMin) && t < Number(xMax)) {\n var bezierPath = this.curveSegments[keyTimeData[i]].pathCurve;\n perc = this.getPercValue(keyTimeData[i], t);\n point = bezierPath.getPointInPercent(perc);\n }\n }\n return point;\n };\n _proto.getPercValue = function getPercValue(curveKey, time) {\n var curveInfo = this.curveSegments[curveKey];\n var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0];\n var timeInterval = curveInfo.timeInterval;\n var normalizeTime = numberToFix((time - p0.x) / timeInterval, 4);\n var value = curveInfo.easingCurve.getValue(normalizeTime);\n // TODO 测试用 编辑器限制值域后移除clamp\n return clamp$1(value, 0, 1);\n };\n _proto.getMaxTime = function getMaxTime() {\n var keyTimeData = this.keyTimeData;\n return this.curveSegments[keyTimeData[keyTimeData.length - 1]].timeEnd;\n };\n return BezierCurvePath;\n}(ValueGetter);\nvar BezierCurveQuat = /*#__PURE__*/ function(ValueGetter) {\n _inherits(BezierCurveQuat, ValueGetter);\n function BezierCurveQuat() {\n return ValueGetter.apply(this, arguments);\n }\n var _proto = BezierCurveQuat.prototype;\n _proto.onCreate = function onCreate(props) {\n var keyframes = props[0], points = props[1], controlPoints = props[2];\n this.curveSegments = {};\n if (!controlPoints.length) {\n return;\n }\n for(var i = 0; i < keyframes.length - 1; i++){\n var leftKeyframe = keyframes[i];\n var rightKeyframe = keyframes[i + 1];\n var ps1 = Quaternion.fromArray(points[i]);\n var ps2 = Quaternion.fromArray(points[i + 1]);\n var cp1 = Quaternion.fromArray(controlPoints[2 * i]);\n var cp2 = Quaternion.fromArray(controlPoints[2 * i + 1]);\n var _buildEasingCurve = buildEasingCurve(leftKeyframe, rightKeyframe), ps = _buildEasingCurve.points, easingCurve = _buildEasingCurve.curve, timeInterval = _buildEasingCurve.timeInterval, valueInterval = _buildEasingCurve.valueInterval;\n var s = ps[0];\n var e = ps[ps.length - 1];\n var pathCurve = new BezierQuat(ps1, ps2, cp1, cp2);\n this.curveSegments[s.x + \"&\" + e.x] = {\n points: ps,\n timeInterval: timeInterval,\n valueInterval: valueInterval,\n easingCurve: easingCurve,\n pathCurve: pathCurve\n };\n }\n };\n _proto.getValue = function getValue(time) {\n var perc = 0;\n var t = numberToFix(time, 5);\n var keyTimeData = Object.keys(this.curveSegments);\n var keyTimeStart = Number(keyTimeData[0].split(\"&\")[0]);\n var keyTimeEnd = Number(keyTimeData[keyTimeData.length - 1].split(\"&\")[1]);\n if (t <= keyTimeStart) {\n var pathCurve = this.curveSegments[keyTimeData[0]].pathCurve;\n return pathCurve.getPointInPercent(0);\n }\n if (t >= keyTimeEnd) {\n var pathCurve1 = this.curveSegments[keyTimeData[keyTimeData.length - 1]].pathCurve;\n return pathCurve1.getPointInPercent(1);\n }\n for(var i = 0; i < keyTimeData.length; i++){\n var _keyTimeData_i_split = keyTimeData[i].split(\"&\"), xMin = _keyTimeData_i_split[0], xMax = _keyTimeData_i_split[1];\n if (t >= Number(xMin) && t < Number(xMax)) {\n var pathCurve2 = this.curveSegments[keyTimeData[i]].pathCurve;\n perc = this.getPercValue(keyTimeData[i], t);\n return pathCurve2.getPointInPercent(perc);\n }\n }\n var pathCurve3 = this.curveSegments[keyTimeData[0]].pathCurve;\n return pathCurve3.getPointInPercent(0);\n };\n _proto.getPercValue = function getPercValue(curveKey, time) {\n var curveInfo = this.curveSegments[curveKey];\n var _curveInfo_points = curveInfo.points, p0 = _curveInfo_points[0];\n var timeInterval = curveInfo.timeInterval;\n var normalizeTime = numberToFix((time - p0.x) / timeInterval, 4);\n var value = curveInfo.easingCurve.getValue(normalizeTime);\n // TODO 测试用 编辑器限制值域后移除clamp\n return clamp$1(value, 0, 1);\n };\n _proto.getMaxTime = function getMaxTime() {\n var keyTimeData = Object.keys(this.curveSegments);\n return Number(keyTimeData[keyTimeData.length - 1].split(\"&\")[1]);\n };\n return BezierCurveQuat;\n}(ValueGetter);\nfunction lineSegIntegrate(t, t0, t1, y0, y1) {\n var h = t - t0;\n return (y0 + y0 + (y1 - y0) * h / (t1 - t0)) * h / 2;\n}\nfunction lineSegIntegrateByTime(t, t0, t1, y0, y1) {\n var t2 = t * t;\n var t3 = t2 * t;\n var t02 = t0 * t0;\n var t03 = t02 * t0;\n return (2 * t3 * (y0 - y1) + 3 * t2 * (t0 * y1 - t1 * y0) - t03 * (2 * y0 + y1) + 3 * t02 * t1 * y0) / (6 * (t0 - t1));\n}\nfunction curveValueEvaluate(time, keyframe0, keyframe1) {\n var dt = keyframe1[CURVE_PRO_TIME] - keyframe0[CURVE_PRO_TIME];\n var m0 = keyframe0[CURVE_PRO_OUT_TANGENT] * dt;\n var m1 = keyframe1[CURVE_PRO_IN_TANGENT] * dt;\n var t = (time - keyframe0[CURVE_PRO_TIME]) / dt;\n var t2 = t * t;\n var t3 = t2 * t;\n var a = 2 * t3 - 3 * t2 + 1;\n var b = t3 - 2 * t2 + t;\n var c = t3 - t2;\n var d = -2 * t3 + 3 * t2;\n //(2*v0+m0+m1-2*v1)*(t-t0)^3/k^3+(3*v1-3*v0-2*m0-m1)*(t-t0)^2/k^2+m0 *(t-t0)/k+v0\n return a * keyframe0[CURVE_PRO_VALUE] + b * m0 + c * m1 + d * keyframe1[CURVE_PRO_VALUE];\n}\nfunction getKeyFrameMetaByRawValue(meta, value) {\n if (value) {\n var type = value[0];\n var keys = value[1];\n if (type === ValueType.CURVE) {\n meta.curves.push(keys);\n var keyLen = keys.length;\n if (keys[0][0] > 0) {\n keyLen++;\n }\n if (keys[keys.length - 1][0] < 1) {\n keyLen++;\n }\n meta.index += keyLen;\n meta.max = Math.max(meta.max, keyLen);\n meta.curveCount += keyLen;\n } else if (type === ValueType.LINE) {\n var keyLen1 = keys.length;\n if (keyLen1 === 2 && keys[0][0] === 0 && keys[1][0] === 1) {\n return;\n }\n if (keys[0][0] > 0) {\n keyLen1++;\n }\n if (keys[keys.length - 1][0] < 1) {\n keyLen1++;\n }\n var uniformCount = Math.ceil(keyLen1 / 2);\n meta.lineSegCount += uniformCount;\n meta.curves.push(keys);\n meta.index += uniformCount;\n meta.max = Math.max(meta.max, uniformCount);\n } else if (type === ValueType.BEZIER_CURVE) {\n var keyLen2 = keys.length - 1;\n meta.index += 2 * keyLen2;\n meta.curves.push(keys);\n meta.max = Math.max(meta.max, 2 * keyLen2);\n meta.curveCount += 2 * keyLen2;\n }\n }\n}\nfunction createKeyFrameMeta() {\n return {\n curves: [],\n index: 0,\n max: 0,\n lineSegCount: 0,\n curveCount: 0\n };\n}\n\nfunction _is_native_reflect_construct() {\n // Since Reflect.construct can't be properly polyfilled, some\n // implementations (e.g. core-js@2) don't set the correct internal slots.\n // Those polyfills don't allow us to subclass built-ins, so we need to\n // use our fallback implementation.\n try {\n // If the internal slots aren't set, this throws an error similar to\n // TypeError: this is not a Boolean object.\n var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n } catch (_) {}\n return (_is_native_reflect_construct = function _is_native_reflect_construct() {\n return !!result;\n })();\n}\n\nfunction _construct(Parent, args, Class) {\n if (_is_native_reflect_construct()) _construct = Reflect.construct;\n else {\n _construct = function construct(Parent, args, Class) {\n var a = [\n null\n ];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _set_prototype_of(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}\n\nvar Vector4Curve = /*#__PURE__*/ function(ValueGetter) {\n _inherits(Vector4Curve, ValueGetter);\n function Vector4Curve() {\n var _this;\n _this = ValueGetter.apply(this, arguments) || this;\n _this.value = new Vector4$1();\n return _this;\n }\n var _proto = Vector4Curve.prototype;\n _proto.onCreate = function onCreate(arg) {\n this.xCurve = createValueGetter(arg[0]);\n this.yCurve = createValueGetter(arg[1]);\n this.zCurve = createValueGetter(arg[2]);\n this.wCurve = createValueGetter(arg[3]);\n };\n _proto.getValue = function getValue(t) {\n var x = this.xCurve.getValue(t);\n var y = this.yCurve.getValue(t);\n var z = this.zCurve.getValue(t);\n var w = this.wCurve.getValue(t);\n this.value.set(x, y, z, w);\n return this.value;\n };\n return Vector4Curve;\n}(ValueGetter);\nvar Vector2Curve = /*#__PURE__*/ function(ValueGetter) {\n _inherits(Vector2Curve, ValueGetter);\n function Vector2Curve() {\n var _this;\n _this = ValueGetter.apply(this, arguments) || this;\n _this.value = new Vector2();\n return _this;\n }\n var _proto = Vector2Curve.prototype;\n _proto.onCreate = function onCreate(arg) {\n this.xCurve = createValueGetter(arg[0]);\n this.yCurve = createValueGetter(arg[1]);\n };\n _proto.getValue = function getValue(t) {\n var x = this.xCurve.getValue(t);\n var y = this.yCurve.getValue(t);\n this.value.set(x, y);\n return this.value;\n };\n return Vector2Curve;\n}(ValueGetter);\n\nvar _obj$6;\nvar map$1 = (_obj$6 = {}, _obj$6[ValueType.RANDOM] = function(props) {\n if (_instanceof1(props[0], Array)) {\n return new RandomVectorValue(props);\n }\n return new RandomValue(props);\n}, _obj$6[ValueType.CONSTANT] = function(props) {\n return new StaticValue(props);\n}, _obj$6[ValueType.CONSTANT_VEC2] = function(props) {\n return new StaticValue(props);\n}, _obj$6[ValueType.CONSTANT_VEC3] = function(props) {\n return new StaticValue(props);\n}, _obj$6[ValueType.CONSTANT_VEC4] = function(props) {\n return new StaticValue(props);\n}, _obj$6[ValueType.RGBA_COLOR] = function(props) {\n return new StaticValue(props);\n}, _obj$6[ValueType.COLORS] = function(props) {\n return new RandomSetValue(props.map(function(c) {\n return colorToArr$1(c, false);\n }));\n}, _obj$6[ValueType.LINE] = function(props) {\n if (props.length === 2 && props[0][0] === 0 && props[1][0] === 1) {\n return new LinearValue([\n props[0][1],\n props[1][1]\n ]);\n }\n return new LineSegments(props);\n}, _obj$6[ValueType.GRADIENT_COLOR] = function(props) {\n return new GradientValue(props);\n}, _obj$6[ValueType.LINEAR_PATH] = function(pros) {\n return new PathSegments(pros);\n}, _obj$6[ValueType.BEZIER_CURVE] = function(props) {\n if (props.length === 1) {\n return new StaticValue(props[0][1][1]);\n }\n return new BezierCurve(props);\n}, _obj$6[ValueType.BEZIER_CURVE_PATH] = function(props) {\n if (props[0].length === 1) {\n return new StaticValue(_construct(Vector3, [].concat(props[1][0])));\n }\n return new BezierCurvePath(props);\n}, _obj$6[ValueType.BEZIER_CURVE_QUAT] = function(props) {\n if (props[0].length === 1) {\n return new StaticValue(_construct(Quaternion, [].concat(props[1][0])));\n }\n return new BezierCurveQuat(props);\n}, _obj$6[ValueType.COLOR_CURVE] = function(props) {\n return new ColorCurve(props);\n}, _obj$6[ValueType.VECTOR4_CURVE] = function(props) {\n return new Vector4Curve(props);\n}, _obj$6[ValueType.VECTOR2_CURVE] = function(props) {\n return new Vector2Curve(props);\n}, _obj$6);\nfunction createValueGetter(args) {\n if (!args || !isNaN(+args)) {\n return new StaticValue(args || 0);\n }\n if (_instanceof1(args, ValueGetter)) {\n return args;\n }\n if (isFunction(map$1[args[0]])) {\n return map$1[args[0]](args[1]);\n } else {\n throw new Error(\"ValueType: \" + args[0] + \" is not supported, see \" + HELP_LINK$1[\"ValueType: 21/22 is not supported\"] + \".\");\n }\n}\n\nvar ColorCurve = /*#__PURE__*/ function(ValueGetter) {\n _inherits(ColorCurve, ValueGetter);\n function ColorCurve() {\n var _this;\n _this = ValueGetter.apply(this, arguments) || this;\n _this.value = new Color();\n return _this;\n }\n var _proto = ColorCurve.prototype;\n _proto.onCreate = function onCreate(arg) {\n this.rCurve = createValueGetter(arg[0]);\n this.gCurve = createValueGetter(arg[1]);\n this.bCurve = createValueGetter(arg[2]);\n this.aCurve = createValueGetter(arg[3]);\n };\n _proto.getValue = function getValue(t) {\n var r = this.rCurve.getValue(t);\n var g = this.gCurve.getValue(t);\n var b = this.bCurve.getValue(t);\n var a = this.aCurve.getValue(t);\n this.value.set(r, g, b, a);\n return this.value;\n };\n return ColorCurve;\n}(ValueGetter);\n\nvar vertex = \"\\nprecision highp float;\\n\\nattribute vec2 aPoint;\\nuniform vec4 uPos;\\nuniform vec2 uSize;\\nuniform vec4 uQuat;\\nuniform vec4 uColor;\\nuniform mat4 effects_ObjectToWorld;\\nuniform mat4 effects_MatrixInvV;\\nuniform mat4 effects_MatrixVP;\\nvarying vec4 vColor;\\n#ifdef ENV_EDITOR\\n uniform vec4 uEditorTransform;\\n#endif\\n\\nvec3 rotateByQuat(vec3 a, vec4 quat){\\n vec3 qvec = quat.xyz;\\n vec3 uv = cross(qvec, a);\\n vec3 uuv = cross(qvec, uv) * 2.;\\n return a +(uv * 2. * quat.w + uuv);\\n}\\n\\nvoid main() {\\n vec4 _pos = uPos;\\n vec3 point = rotateByQuat(vec3(aPoint.xy * uSize, 0.),uQuat);\\n vec4 pos = vec4(_pos.xyz, 1.0);\\n pos = effects_ObjectToWorld * pos;\\n pos.xyz += effects_MatrixInvV[0].xyz * point.x+ effects_MatrixInvV[1].xyz * point.y;\\n gl_Position = effects_MatrixVP * pos;\\n vColor = uColor;\\n #ifdef ENV_EDITOR\\n gl_Position = vec4(gl_Position.xy * uEditorTransform.xy + uEditorTransform.zw * gl_Position.w, gl_Position.zw);\\n #endif\\n}\\n\";\nvar fragment = \"\\nprecision highp float;\\n\\n#define fragColor gl_FragColor\\n\\nvarying vec4 vColor;\\nvoid main() {\\n gl_FragColor = vColor*vColor.a;\\n}\\n\";\nvar seed$8 = 1;\nvar InteractMesh = /*#__PURE__*/ function() {\n function InteractMesh(props, rendererOptions, transform, engine) {\n this.transform = transform;\n this.engine = engine;\n this.color = props.options.previewColor;\n var material = this.createMaterial(rendererOptions);\n var geometry = this.createGeometry();\n this.mesh = this.createMesh(geometry, material);\n this.updateMesh();\n }\n var _proto = InteractMesh.prototype;\n _proto.updateMesh = function updateMesh() {\n var material = this.mesh.material;\n var uSize = material.getVector2(\"uSize\").clone();\n var uPos = material.getVector4(\"uPos\").clone();\n var tempPos = new Vector3();\n var tempQuat = new Quaternion();\n var tempScale = this.transform.scale.clone();\n this.transform.assignWorldTRS(tempPos, tempQuat, tempScale);\n uSize.x = tempScale.x;\n uSize.y = tempScale.y;\n uPos.x = tempPos.x;\n uPos.y = tempPos.y;\n uPos.z = tempPos.z;\n material.setVector2(\"uSize\", uSize);\n material.setVector4(\"uPos\", uPos);\n material.setQuaternion(\"uQuat\", tempQuat);\n };\n _proto.createMaterial = function createMaterial(rendererOptions) {\n var _this_engine_renderer;\n var macros = [\n [\n \"ENV_EDITOR\",\n ((_this_engine_renderer = this.engine.renderer) == null ? void 0 : _this_engine_renderer.env) === PLAYER_OPTIONS_ENV_EDITOR\n ]\n ];\n var color = createValueGetter(this.color).getValue(0);\n var materialProps = {\n shader: {\n vertex: vertex,\n fragment: fragment,\n glslVersion: exports.GLSLVersion.GLSL1,\n cacheId: \"\" + rendererOptions.cachePrefix + \"_effects_interact\",\n macros: macros\n },\n uniformSemantics: {\n effects_MatrixVP: \"VIEWPROJECTION\",\n effects_MatrixInvV: \"VIEWINVERSE\",\n effects_ObjectToWorld: \"MODEL\",\n uEditorTransform: \"EDITOR_TRANSFORM\"\n }\n };\n var material = Material.create(this.engine, materialProps);\n material.blending = true;\n material.depthTest = false;\n material.setVector4(\"uPos\", new Vector4$1(0, 0, 0, 0));\n material.setVector2(\"uSize\", new Vector2(1, 1));\n material.setVector4(\"uColor\", new Vector4$1(color[0] / 255, color[1] / 255, color[2] / 255, color[3]));\n material.setQuaternion(\"uQuat\", new Quaternion(0, 0, 0, 0));\n return material;\n };\n _proto.createGeometry = function createGeometry() {\n var indexData = new Uint8Array([\n 0,\n 1,\n 1,\n 2,\n 2,\n 3,\n 3,\n 0\n ]);\n return Geometry.create(this.engine, {\n attributes: {\n aPoint: {\n size: 2,\n offset: 0,\n stride: 2 * Float32Array.BYTES_PER_ELEMENT,\n data: new Float32Array([\n -0.5,\n 0.5,\n 0.5,\n 0.5,\n 0.5,\n -0.5,\n -0.5,\n -0.5\n ])\n }\n },\n drawCount: indexData.length,\n indices: {\n data: indexData\n },\n mode: glContext.LINES,\n maxVertex: 4\n });\n };\n _proto.createMesh = function createMesh(geometry, material) {\n return Mesh.create(this.engine, {\n name: \"Interact_preview\" + seed$8++,\n priority: 0,\n worldMatrix: Matrix4$1.fromIdentity(),\n geometry: geometry,\n material: material\n });\n };\n return InteractMesh;\n}();\n\nexports.InteractComponent = /*#__PURE__*/ function(RendererComponent) {\n _inherits(InteractComponent, RendererComponent);\n function InteractComponent() {\n var _this;\n _this = RendererComponent.apply(this, arguments) || this;\n /**\n * 拖拽的惯性衰减系数,范围[0, 1], 越大惯性越强\n */ _this.downgrade = 0.95;\n /**\n * 拖拽的距离映射系数,越大越容易拖动\n */ _this.dragRatio = [\n 1,\n 1\n ];\n /**\n * 拖拽X范围\n */ _this.dragRange = {\n dxRange: [\n 0,\n 0\n ],\n dyRange: [\n 0,\n 0\n ]\n };\n _this.duringPlay = false;\n /** 是否响应点击和拖拽交互事件 */ _this._interactive = true;\n _this.lastTime = -1;\n _this.getHitTestParams = function(force) {\n if (!_this.clickable) {\n return;\n }\n var behavior = _this.item.props.content.options.behavior;\n var area = _this.getBoundingBox();\n if (area) {\n return {\n type: area.type,\n triangles: area.area,\n behavior: behavior\n };\n }\n };\n return _this;\n }\n var _proto = InteractComponent.prototype;\n _proto.getDragRangeX = function getDragRangeX() {\n return this.dragRange.dxRange;\n };\n _proto.setDragRangeX = function setDragRangeX(min, max) {\n this.dragRange.dxRange = [\n min,\n max\n ];\n };\n _proto.getDragRangeY = function getDragRangeY() {\n return this.dragRange.dyRange;\n };\n _proto.setDragRangeY = function setDragRangeY(min, max) {\n this.dragRange.dyRange = [\n min,\n max\n ];\n };\n _proto.onStart = function onStart() {\n var options = this.item.props.content.options;\n var env = this.item.engine.renderer.env;\n var composition = this.item.composition;\n var _this_interactData_options = this.interactData.options, type = _this_interactData_options.type, showPreview = _this_interactData_options.showPreview;\n if (type === InteractType.CLICK) {\n this.clickable = true;\n if (showPreview && env === PLAYER_OPTIONS_ENV_EDITOR) {\n var rendererOptions = composition == null ? void 0 : composition.getRendererOptions();\n if (rendererOptions !== undefined) {\n this.previewContent = new InteractMesh(this.item.props.content, rendererOptions, this.transform, this.engine);\n }\n }\n }\n if (options.type === InteractType.DRAG) {\n if (env !== PLAYER_OPTIONS_ENV_EDITOR || options.enableInEditor) {\n (composition == null ? void 0 : composition.event) && this.beginDragTarget(options, composition.event);\n }\n }\n if (this.previewContent) {\n this.previewContent.mesh.item = this.item;\n this.materials = this.previewContent.mesh.materials;\n }\n this.item.getHitTestParams = this.getHitTestParams;\n };\n _proto.onDisable = function onDisable() {\n RendererComponent.prototype.onDisable.call(this);\n if (this.item && this.item.composition) {\n if (this.duringPlay && !this.item.transform.getValid()) {\n this.item.composition.removeInteractiveItem(this.item, this.item.props.content.options.type);\n this.duringPlay = false;\n }\n this.clickable = false;\n this.endDragTarget();\n }\n };\n _proto.onEnable = function onEnable() {\n RendererComponent.prototype.onEnable.call(this);\n var type = this.interactData.options.type;\n var env = this.item.engine.renderer.env;\n if (type === InteractType.CLICK) {\n this.clickable = true;\n } else if (type === InteractType.DRAG) {\n var options = this.interactData.options;\n var enableInEditor = options.enableInEditor;\n if (env !== PLAYER_OPTIONS_ENV_EDITOR || enableInEditor) {\n var _this_item_composition;\n ((_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.event) && this.beginDragTarget(options, this.item.composition.event);\n }\n }\n };\n _proto.onUpdate = function onUpdate(dt) {\n var _this_previewContent;\n this.duringPlay = true;\n // trigger messageBegin when item enter\n if (this.lastTime <= this.item.time) {\n if (this.item.time >= 0 && this.lastTime < 0) {\n var _this_item_composition;\n var options = this.item.props.content.options;\n (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.addInteractiveItem(this.item, options.type);\n }\n } else {\n // loop trigger\n if (this.item.time >= 0) {\n var _this_item_composition1;\n var options1 = this.item.props.content.options;\n (_this_item_composition1 = this.item.composition) == null ? void 0 : _this_item_composition1.addInteractiveItem(this.item, options1.type);\n }\n }\n this.lastTime = this.item.time;\n (_this_previewContent = this.previewContent) == null ? void 0 : _this_previewContent.updateMesh();\n if (!this.dragEvent || !this.bouncingArg) {\n return;\n }\n this.bouncingArg.vx *= this.downgrade;\n this.bouncingArg.vy *= this.downgrade;\n this.bouncingArg.dy += this.bouncingArg.vy;\n this.bouncingArg.dx += this.bouncingArg.vx;\n if (shouldIgnoreBouncing(this.bouncingArg)) {\n this.dragEvent = null;\n this.bouncingArg = null;\n } else {\n this.handleDragMove(this.dragEvent, this.bouncingArg);\n }\n };\n _proto.render = function render(renderer) {\n if (this.previewContent) {\n this.previewContent.mesh.render(renderer);\n }\n };\n _proto.onDestroy = function onDestroy() {\n var _this_previewContent;\n (_this_previewContent = this.previewContent) == null ? void 0 : _this_previewContent.mesh.dispose();\n };\n _proto.endDragTarget = function endDragTarget() {\n // OVERRIDE\n };\n _proto.handleDragMove = function handleDragMove(evt, event) {\n if (!(evt == null ? void 0 : evt.cameraParam) || !this.canInteract() || !this.item.composition) {\n return;\n }\n var _evt_cameraParam = evt.cameraParam, position = _evt_cameraParam.position, fov = _evt_cameraParam.fov;\n var dy = event.dy;\n var dx = event.dx * event.width / event.height;\n var depth = position[2];\n var sp = Math.tan(fov * Math.PI / 180 / 2) * Math.abs(depth);\n var height = dy * sp;\n var width = dx * sp;\n var _this_dragRange = this.dragRange, dxRange = _this_dragRange.dxRange, dyRange = _this_dragRange.dyRange;\n var nx = position[0] - this.dragRatio[0] * width;\n var ny = position[1] - this.dragRatio[1] * height;\n var xMin = dxRange[0], xMax = dxRange[1];\n var yMin = dyRange[0], yMax = dyRange[1];\n nx = clamp$1(nx, xMin, xMax);\n ny = clamp$1(ny, yMin, yMax);\n if (nx !== xMin && nx !== xMax && xMin !== xMax) {\n var _event_origin;\n (_event_origin = event.origin) == null ? void 0 : _event_origin.preventDefault();\n }\n if (ny !== yMin && ny !== yMax && yMin !== yMax) {\n var _event_origin1;\n (_event_origin1 = event.origin) == null ? void 0 : _event_origin1.preventDefault();\n }\n this.item.composition.camera.position = new Vector3(nx, ny, depth);\n };\n _proto.beginDragTarget = function beginDragTarget(options, eventSystem) {\n var _this = this;\n if (options.target !== \"camera\") {\n return;\n }\n var dragEvent;\n var handlerMap = {\n touchstart: function(event) {\n var _this_item_composition;\n if (!_this.canInteract()) {\n return;\n }\n _this.dragEvent = null;\n _this.bouncingArg = null;\n var camera = (_this_item_composition = _this.item.composition) == null ? void 0 : _this_item_composition.camera;\n dragEvent = {\n x: event.x,\n y: event.y,\n cameraParam: {\n position: (camera == null ? void 0 : camera.position.toArray()) || [\n 0,\n 0,\n 8\n ],\n fov: (camera == null ? void 0 : camera.fov) || 60\n }\n };\n },\n touchmove: function(event) {\n _this.handleDragMove(dragEvent, event);\n _this.bouncingArg = event;\n },\n touchend: function(event) {\n if (!_this.canInteract()) {\n return;\n }\n var bouncingArg = _this.bouncingArg;\n if (!shouldIgnoreBouncing(bouncingArg, 3) && bouncingArg) {\n var speed = 5;\n bouncingArg.vx *= speed;\n bouncingArg.vy *= speed;\n _this.dragEvent = _extends({}, dragEvent);\n }\n dragEvent = null;\n }\n };\n Object.keys(handlerMap).forEach(function(name) {\n eventSystem.addEventListener(name, handlerMap[name]);\n });\n handlerMap.touchmove({\n dx: 0,\n dy: 0,\n width: 1,\n height: 1\n });\n this.item.getComponent(InteractComponent).endDragTarget = function() {\n Object.keys(handlerMap).forEach(function(name) {\n eventSystem.removeEventListener(name, handlerMap[name]);\n });\n };\n };\n _proto.getBoundingBox = function getBoundingBox() {\n var worldMatrix = this.transform.getWorldMatrix();\n var triangles = trianglesFromRect(Vector3.ZERO, 0.5 * this.transform.size.x, 0.5 * this.transform.size.y);\n triangles.forEach(function(triangle) {\n worldMatrix.transformPoint(triangle.p0);\n worldMatrix.transformPoint(triangle.p1);\n worldMatrix.transformPoint(triangle.p2);\n });\n return {\n type: exports.HitTestType.triangle,\n area: triangles\n };\n };\n _proto.fromData = function fromData(data) {\n RendererComponent.prototype.fromData.call(this, data);\n this.interactData = data;\n if (data.options.type === InteractType.DRAG) {\n var options = data.options;\n if (options.dxRange) {\n this.dragRange.dxRange = options.dxRange;\n }\n if (options.dyRange) {\n this.dragRange.dyRange = options.dyRange;\n }\n }\n };\n _proto.canInteract = function canInteract() {\n var _this_item_composition;\n return Boolean((_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.interactive) && this._interactive;\n };\n _create_class(InteractComponent, [\n {\n key: \"interactive\",\n get: function get() {\n return this._interactive;\n },\n set: function set(enable) {\n this._interactive = enable;\n if (!enable) {\n // 立刻停止惯性滑动\n this.bouncingArg = null;\n }\n }\n }\n ]);\n return InteractComponent;\n}(RendererComponent);\nexports.InteractComponent = __decorate([\n effectsClass(DataType.InteractComponent)\n], exports.InteractComponent);\nfunction shouldIgnoreBouncing(arg, mul) {\n var threshold = 0.00001 * (mul || 1);\n return arg && Math.abs(arg.vx || 0) < threshold && Math.abs(arg.vy || 0) < threshold;\n}\n\n/**\n *\n */ var MeshCollider = /*#__PURE__*/ function() {\n function MeshCollider() {\n this.triangles = [];\n this.worldMatrix = new Matrix4$1();\n this.assemblyTriangles = function(vertices, indices, indexStart, indexEnd, res) {\n for(var i = indexStart; i < indexEnd; i += 3){\n var index0 = indices[i] * 3;\n var index1 = indices[i + 1] * 3;\n var index2 = indices[i + 2] * 3;\n var p0 = {\n x: vertices[index0],\n y: vertices[index0 + 1],\n z: vertices[index0 + 2]\n };\n var p1 = {\n x: vertices[index1],\n y: vertices[index1 + 1],\n z: vertices[index1 + 2]\n };\n var p2 = {\n x: vertices[index2],\n y: vertices[index2 + 1],\n z: vertices[index2 + 2]\n };\n res.push({\n p0: p0,\n p1: p1,\n p2: p2\n });\n }\n };\n }\n var _proto = MeshCollider.prototype;\n _proto.getBoundingBoxData = function getBoundingBoxData() {\n this.applyWorldMatrix(this.boundingBoxData.area);\n return this.boundingBoxData;\n };\n _proto.getBoundingBox = function getBoundingBox() {\n var maxX = -Number.MAX_VALUE;\n var maxY = -Number.MAX_VALUE;\n var minX = Number.MAX_VALUE;\n var minY = Number.MAX_VALUE;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.boundingBoxData.area), _step; !(_step = _iterator()).done;){\n var triangle = _step.value;\n maxX = Math.max(triangle.p0.x, triangle.p1.x, triangle.p2.x, maxX);\n maxY = Math.max(triangle.p0.y, triangle.p1.y, triangle.p2.y, maxY);\n minX = Math.min(triangle.p0.x, triangle.p1.x, triangle.p2.x, minX);\n minY = Math.min(triangle.p0.y, triangle.p1.y, triangle.p2.y, minY);\n }\n var area = [];\n var point0 = new Vector3(minX, maxY, 0);\n var point1 = new Vector3(maxX, maxY, 0);\n var point2 = new Vector3(maxX, minY, 0);\n var point3 = new Vector3(minX, minY, 0);\n area.push({\n p0: point0,\n p1: point1,\n p2: point2\n });\n area.push({\n p0: point0,\n p1: point2,\n p2: point3\n });\n this.applyWorldMatrix(area);\n return {\n type: exports.HitTestType.triangle,\n area: area\n };\n };\n _proto.setGeometry = function setGeometry(geometry, worldMatrix) {\n this.triangles = this.geometryToTriangles(geometry);\n var area = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(this.triangles), _step; !(_step = _iterator()).done;){\n var triangle = _step.value;\n area.push({\n p0: triangle.p0,\n p1: triangle.p1,\n p2: triangle.p2\n });\n }\n if (worldMatrix) {\n this.worldMatrix.copyFrom(worldMatrix);\n }\n this.boundingBoxData = {\n type: exports.HitTestType.triangle,\n area: area\n };\n };\n _proto.geometryToTriangles = function geometryToTriangles(geometry) {\n var indices = geometry.getIndexData();\n var vertices = geometry.getAttributeData(\"aPos\");\n var res = [];\n if (!indices || !vertices) {\n return res;\n }\n if (geometry.subMeshes.length === 0) {\n this.assemblyTriangles(vertices, indices, 0, indices.length, res);\n } else {\n for(var _iterator = _create_for_of_iterator_helper_loose(geometry.subMeshes), _step; !(_step = _iterator()).done;){\n var subMesh = _step.value;\n if (subMesh.indexCount === undefined) {\n continue;\n }\n var elementSize = indices.BYTES_PER_ELEMENT;\n var start = subMesh.offset / elementSize;\n var end = start + subMesh.indexCount;\n this.assemblyTriangles(vertices, indices, start, end, res);\n }\n }\n return res;\n };\n _proto.applyWorldMatrix = function applyWorldMatrix(area) {\n var _this = this;\n area.forEach(function(triangle) {\n triangle.p0 = _this.worldMatrix.transformPoint(triangle.p0, new Vector3());\n triangle.p1 = _this.worldMatrix.transformPoint(triangle.p1, new Vector3());\n triangle.p2 = _this.worldMatrix.transformPoint(triangle.p2, new Vector3());\n });\n return area;\n };\n return MeshCollider;\n}();\n\nvar SpriteLoader = /*#__PURE__*/ function(AbstractPlugin) {\n _inherits(SpriteLoader, AbstractPlugin);\n function SpriteLoader() {\n var _this;\n _this = AbstractPlugin.apply(this, arguments) || this;\n _this.name = \"sprite\";\n return _this;\n }\n return SpriteLoader;\n}(AbstractPlugin);\n\n/**\n * 动画图,负责更新所有的动画节点\n * @since 2.0.0\n */ var PlayableGraph = /*#__PURE__*/ function() {\n function PlayableGraph() {\n this.playableOutputs = [];\n this.playables = [];\n }\n var _proto = PlayableGraph.prototype;\n _proto.evaluate = function evaluate(dt) {\n // 初始化输出节点状态\n for(var _iterator = _create_for_of_iterator_helper_loose(this.playableOutputs), _step; !(_step = _iterator()).done;){\n var playableOutput = _step.value;\n playableOutput.context.deltaTime = dt;\n }\n // 执行生命周期函数\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.playableOutputs), _step1; !(_step1 = _iterator1()).done;){\n var playableOutput1 = _step1.value;\n this.prepareFrameWithRoot(playableOutput1);\n }\n for(var _iterator2 = _create_for_of_iterator_helper_loose(this.playableOutputs), _step2; !(_step2 = _iterator2()).done;){\n var playableOutput2 = _step2.value;\n this.processFrameWithRoot(playableOutput2);\n }\n // 更新节点时间\n // for (const playable of this.playables) {\n // this.updatePlayableTime(playable, dt / 1000);\n // }\n };\n _proto.addOutput = function addOutput(output) {\n this.playableOutputs.push(output);\n };\n _proto.addPlayable = function addPlayable(playable) {\n this.playables.push(playable);\n };\n _proto.processFrameWithRoot = function processFrameWithRoot(output) {\n output.sourcePlayable.processFrame(output.context);\n output.processFrame();\n };\n _proto.prepareFrameWithRoot = function prepareFrameWithRoot(output) {\n output.prepareFrame();\n output.sourcePlayable.prepareFrame(output.context);\n };\n _proto.updatePlayableTime = function updatePlayableTime(playable, deltaTime) {\n if (playable.getPlayState() !== 0) {\n return;\n }\n playable.setTime(playable.getTime() + deltaTime);\n };\n return PlayableGraph;\n}();\n/**\n * 动画图可播放节点对象\n * @since 2.0.0\n */ var Playable = /*#__PURE__*/ function() {\n function Playable(graph, inputCount) {\n this.onPlayablePlayFlag = true;\n this.onPlayablePauseFlag = false;\n this.duration = 0;\n this.destroyed = false;\n this.playState = 0;\n /**\n * 当前本地播放的时间\n */ this.time = 0;\n graph.addPlayable(this);\n }\n var _proto = Playable.prototype;\n _proto.play = function play() {\n switch(this.playState){\n case 0:\n break;\n case 1:\n this.playState = 0;\n this.onPlayablePlayFlag = true;\n this.onPlayablePauseFlag = false;\n break;\n }\n };\n _proto.pause = function pause() {\n switch(this.playState){\n case 0:\n this.playState = 1;\n this.onPlayablePauseFlag = true;\n this.onPlayablePlayFlag = false;\n break;\n }\n };\n _proto.setTime = function setTime(time) {\n this.time = time;\n };\n _proto.getTime = function getTime() {\n return this.time;\n };\n _proto.setDuration = function setDuration(duration) {\n this.duration = duration;\n };\n _proto.getDuration = function getDuration() {\n return this.duration;\n };\n _proto.getPlayState = function getPlayState() {\n return this.playState;\n };\n // onGraphStart () {\n // }\n // onGraphStop () {\n // }\n // onPlayablePlay (context: FrameContext) {\n // }\n // onPlayablePause (context: FrameContext) {\n // }\n _proto.prepareFrame = function prepareFrame(context) {};\n _proto.processFrame = function processFrame(context) {};\n _proto.onPlayableDestroy = function onPlayableDestroy() {};\n _proto.dispose = function dispose() {\n if (this.destroyed) {\n return;\n }\n this.onPlayableDestroy();\n // TODO 将节点从动画图中移除\n this.destroyed = true;\n };\n return Playable;\n}();\n/**\n * 动画图输出节点对象,将动画数据采样到绑定的元素属性上\n * @since 2.0.0\n */ var PlayableOutput = /*#__PURE__*/ function() {\n function PlayableOutput() {\n this.context = {\n deltaTime: 0,\n output: this\n };\n }\n var _proto = PlayableOutput.prototype;\n _proto.setSourcePlayable = function setSourcePlayable(playable) {\n this.sourcePlayable = playable;\n };\n _proto.setUserData = function setUserData(value) {\n this.userData = value;\n };\n _proto.getUserData = function getUserData() {\n return this.userData;\n };\n // onGraphStart () {\n // }\n _proto.prepareFrame = function prepareFrame() {};\n _proto.processFrame = function processFrame() {};\n return PlayableOutput;\n}();\nvar PlayableAsset = /*#__PURE__*/ function(EffectsObject) {\n _inherits(PlayableAsset, EffectsObject);\n function PlayableAsset() {\n return EffectsObject.apply(this, arguments);\n }\n return PlayableAsset;\n}(EffectsObject);\nvar PlayState;\n(function(PlayState) {\n PlayState[PlayState[\"Playing\"] = 0] = \"Playing\";\n PlayState[PlayState[\"Paused\"] = 1] = \"Paused\";\n})(PlayState || (PlayState = {}));\n\nfunction _assert_this_initialized(self) {\n if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return self;\n}\n\nvar tempQuat$1 = new Quaternion();\nvar seed$7 = 1;\n// TODO 继承 Component\n/**\n *\n */ var Transform = /*#__PURE__*/ function() {\n function Transform(props, parent) {\n if (props === void 0) props = {};\n this.taggedProperties = {};\n /**\n * 自身位移\n */ this.position = new Vector3(0, 0, 0);\n /**\n * 自身旋转对应的四元数,右手坐标系,旋转正方向左手螺旋(轴向的顺时针),旋转欧拉角的顺序为 ZYX\n */ this.quat = new Quaternion(0, 0, 0, 1);\n /**\n * 自身旋转角度\n */ this.rotation = new Euler(0, 0, 0);\n /**\n * 自身缩放\n */ this.scale = new Vector3(1, 1, 1);\n /**\n * 自身锚点\n */ this.anchor = new Vector3(0, 0, 0);\n /**\n * 元素矩形宽高\n */ this.size = new Vector2(1, 1);\n /**\n * 子变换,可以有多个\n */ this.children = [];\n /**\n * 包含父变换的最终模型矩阵\n */ this.worldMatrix = Matrix4$1.fromIdentity();\n /**\n * 仅包含自身变换的模型矩阵\n */ this.localMatrix = Matrix4$1.fromIdentity();\n /**\n * 变换是否需要生效,不生效返回的模型矩阵为单位矩阵,需要随元素生命周期改变\n */ this.valid = true;\n /**\n * 数据变化标志位\n */ this.dirtyFlags = {\n /* 自身变换是否有修改,若修改,localMatrix 需要更新 */ localData: false,\n /* localMatrix 是否有修改,若修改,WorldMatrix 需要更新 */ localMatrix: false,\n /* worldMatrix 是否有修改,若修改,worldTRS 需要更新 */ worldMatrix: false,\n /* parentMatrix 是否有修改,若修改,WorldMatrix需要更新 */ parentMatrix: false\n };\n /**\n * 最终模型矩阵对应变换的缓存,当自身矩阵或父矩阵有修改时需要更新\n */ this.worldTRSCache = {\n position: new Vector3(0, 0, 0),\n quat: new Quaternion(0, 0, 0, 1),\n scale: new Vector3(1, 1, 1)\n };\n this.name = \"transform_\" + seed$7++;\n if (props) {\n this.setTransform(props);\n }\n if (parent) {\n this.parentTransform = parent;\n }\n if (props.valid !== undefined) {\n this.setValid(props.valid);\n }\n }\n var _proto = Transform.prototype;\n // /**\n // * 自身数据修改 / 父变换修改 / 父变换的数据修改\n // * @returns\n // */\n // get traceDirty (): boolean {\n // if (this.dirty || this.parentDirty) {\n // return true;\n // }\n //\n // return !!(this.parent && this.parent.traceDirty);\n // }\n /**\n * 设置位置\n * @param x\n * @param y\n * @param z\n */ _proto.setPosition = function setPosition(x, y, z) {\n if (this.position.x !== x || this.position.y !== y || this.position.z !== z) {\n this.position.x = x;\n this.position.y = y;\n this.position.z = z;\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n /**\n * 在当前位置的基础上添加位置偏移\n * @param x\n * @param y\n * @param z\n */ _proto.translate = function translate(x, y, z) {\n if (x !== 0 || y !== 0 || z !== 0) {\n this.position.x += x;\n this.position.y += y;\n this.position.z += z;\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n /**\n * 设置旋转\n * @param x\n * @param y\n * @param z\n */ _proto.setRotation = function setRotation(x, y, z) {\n if (this.rotation.x !== x || this.rotation.y !== y || this.rotation.z !== z) {\n this.rotation.x = x;\n this.rotation.y = y;\n this.rotation.z = z;\n this.quat.setFromEuler(this.rotation);\n // TODO 修正 GE 四元数旋转共轭问题\n this.quat.conjugate();\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n /**\n * 设置四元数\n * @param x\n * @param y\n * @param z\n * @param w\n * @private\n */ _proto.setQuaternion = function setQuaternion(x, y, z, w) {\n if (this.quat.x !== x || this.quat.y !== y || this.quat.z !== z || this.quat.w !== w) {\n this.quat.x = x;\n this.quat.y = y;\n this.quat.z = z;\n this.quat.w = w;\n this.rotation.setFromQuaternion(this.quat);\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n /**\n * 设置缩放\n * @param x\n * @param y\n * @param z\n */ _proto.setScale = function setScale(x, y, z) {\n if (this.scale.x !== x || this.scale.y !== y || this.scale.z !== z) {\n this.scale.x = x;\n this.scale.y = y;\n this.scale.z = z;\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n _proto.setSize = function setSize(x, y) {\n if (this.size.x !== x || this.size.y !== y) {\n this.size.x = x;\n this.size.y = y;\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n /**\n * 在当前旋转的基础上使用四元素添加旋转\n * @param quat\n */ _proto.rotateByQuat = function rotateByQuat(quat) {\n this.quat.multiply(quat);\n this.rotation.setFromQuaternion(this.quat);\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n };\n /**\n * 在当前缩放基础上设置缩放系数\n * @param x\n * @param y\n * @param z\n */ _proto.scaleBy = function scaleBy(x, y, z) {\n this.scale.x *= x;\n this.scale.y *= y;\n this.scale.z *= z;\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n };\n /**\n * 设置锚点\n * @param x\n * @param y\n */ _proto.setAnchor = function setAnchor(x, y) {\n if (this.anchor.x !== x || this.anchor.y !== y) {\n this.anchor.x = x;\n this.anchor.y = y;\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n }\n };\n /**\n * 批量设置 transform 属性\n * @param props - 要设置的属性\n * @param reverseEuler - 设置 rotation时,欧拉角是否需要取负值\n */ _proto.setTransform = function setTransform(props, reverseEuler) {\n var position = props.position, rotation = props.rotation, scale = props.scale, size = props.size, quat = props.quat, name = props.name, anchor = props.anchor;\n if (name) {\n this.name = name;\n }\n if (position) {\n if (_instanceof1(position, Vector3)) {\n this.setPosition(position.x, position.y, position.z);\n } else {\n this.setPosition(position[0], position[1], position[2]);\n }\n }\n if (quat) {\n if (_instanceof1(quat, Quaternion)) {\n this.setQuaternion(quat.x, quat.y, quat.z, quat.w);\n } else {\n this.setQuaternion(quat[0], quat[1], quat[2], quat[3]);\n }\n } else if (rotation) {\n var mul = reverseEuler ? -1 : 1;\n if (_instanceof1(rotation, Euler)) {\n this.setRotation(rotation.x * mul, rotation.y * mul, rotation.z * mul);\n } else {\n this.setRotation(rotation[0] * mul, rotation[1] * mul, rotation[2] * mul);\n }\n }\n if (scale) {\n if (_instanceof1(scale, Vector3)) {\n this.setScale(scale.x, scale.y, scale.z);\n } else {\n this.setScale(scale[0], scale[1], scale[2]);\n }\n }\n if (size) {\n this.setSize(size.x, size.y);\n }\n if (anchor) {\n if (_instanceof1(anchor, Vector2)) {\n this.setAnchor(anchor.x, anchor.y);\n } else {\n this.setAnchor(anchor[0], anchor[1]);\n }\n }\n };\n /**\n * 添加子变换\n * @param child - 要添加的子变换\n */ _proto.addChild = function addChild(child) {\n addItem(this.children, child);\n };\n /**\n * 移除子变换\n */ _proto.removeChild = function removeChild(child) {\n removeItem(this.children, child);\n };\n /**\n * 获取当前的旋转量\n * @returns\n */ _proto.getRotation = function getRotation() {\n return Transform.getRotation(this.quat, new Euler());\n };\n /**\n * 获取当前的四元数\n * @returns\n */ _proto.getQuaternion = function getQuaternion() {\n return this.quat;\n };\n /**\n * 更新元素自身变换矩阵\n */ _proto.updateLocalMatrix = function updateLocalMatrix() {\n if (this.valid) {\n if (this.dirtyFlags.localData) {\n this.localMatrix.compose(this.position, this.quat, this.scale, this.anchor);\n this.dirtyFlags.localMatrix = true;\n }\n this.dirtyFlags.localData = false;\n } else {\n if (!this.localMatrix.isIdentity()) {\n this.localMatrix.identity();\n this.dirtyFlags.localMatrix = true;\n }\n }\n };\n /**\n * 获取自身变换对应的模型矩阵\n * 数据修改且需要生效时更新自身矩阵\n * 当变换不需要生效时返回单位矩阵\n * @returns\n */ _proto.getMatrix = function getMatrix() {\n this.updateLocalMatrix();\n return this.localMatrix;\n };\n /**\n * 获取父矩阵,如果有多级父节点,返回整体变换\n * @returns\n */ _proto.getParentMatrix = function getParentMatrix() {\n if (this.parent) {\n this.parentMatrix = this.parent.getWorldMatrix();\n this.dirtyFlags.parentMatrix = this.dirtyFlags.parentMatrix || this.parent.dirtyFlags.localMatrix || this.parent.dirtyFlags.worldMatrix;\n }\n return this.parentMatrix;\n };\n /**\n * 获取包含自身变换和父变换的模型变换矩阵\n * @returns\n */ _proto.getWorldMatrix = function getWorldMatrix() {\n var localMatrix = this.getMatrix();\n var parentMatrix = this.getParentMatrix();\n if (this.dirtyFlags.localMatrix || this.dirtyFlags.parentMatrix) {\n if (parentMatrix) {\n this.worldMatrix.multiplyMatrices(parentMatrix, localMatrix);\n } else {\n this.worldMatrix.copyFrom(localMatrix);\n }\n this.dirtyFlags.worldMatrix = true;\n this.dirtyFlags.localMatrix = false;\n this.dirtyFlags.parentMatrix = false;\n }\n return this.worldMatrix;\n };\n /**\n * 获取联合变换后的最终缩放因子\n * @returns\n */ _proto.getWorldScale = function getWorldScale() {\n var cache = this.worldTRSCache;\n if (this.dirtyFlags.worldMatrix) {\n var mat = this.getWorldMatrix();\n mat.decompose(cache.position, cache.quat, cache.scale);\n this.dirtyFlags.worldMatrix = false;\n }\n return this.worldTRSCache.scale.clone();\n };\n /**\n * 获取联合变换后的最终位置\n * @returns\n */ _proto.getWorldPosition = function getWorldPosition() {\n this.updateTRSCache();\n return this.worldTRSCache.position.clone();\n };\n /**\n * 获取联合变换后的最终旋转量\n * @returns\n */ _proto.getWorldRotation = function getWorldRotation() {\n this.updateTRSCache();\n return Transform.getRotation(this.worldTRSCache.quat, new Euler());\n };\n /**\n * 根据世界变换矩阵计算位移、旋转、缩放向量\n * @param position\n * @param quat\n * @param scale\n */ _proto.assignWorldTRS = function assignWorldTRS(position, quat, scale) {\n this.updateTRSCache();\n if (position) {\n position.copyFrom(this.worldTRSCache.position);\n }\n if (quat) {\n quat.copyFrom(this.worldTRSCache.quat);\n }\n if (scale) {\n scale.copyFrom(this.worldTRSCache.scale);\n }\n };\n /**\n * 拆解并复制指定矩阵到自身变换\n * @param m4\n * @param scale\n * @returns\n */ _proto.cloneFromMatrix = function cloneFromMatrix(m4, scale) {\n m4.decompose(this.position, this.quat, this.scale);\n this.rotation.setFromQuaternion(this.quat.clone().conjugate());\n if (scale) {\n scale.copyFrom(this.scale);\n }\n this.dirtyFlags.localData = true;\n this.dispatchValueChange();\n };\n /**\n * 设置 Transform 生效 / 失效, 默认元素生命周期开始后生效,结束后失效\n */ _proto.setValid = function setValid(val) {\n if (this.valid !== val) {\n this.valid = val;\n if (!val) {\n this.localMatrix.identity();\n this.dirtyFlags.localMatrix = true;\n } else {\n this.dirtyFlags.localData = true;\n }\n this.dispatchValueChange();\n }\n };\n /**\n * 获取 Transform 是否生效\n */ _proto.getValid = function getValid() {\n return this.valid;\n };\n _proto.toData = function toData() {\n var transformData = this.taggedProperties;\n transformData.position = this.position.clone();\n transformData.eulerHint = {\n x: this.rotation.x,\n y: this.rotation.y,\n z: this.rotation.z\n };\n transformData.scale = this.scale.clone();\n return transformData;\n };\n _proto.fromData = function fromData(data) {\n var transformData = {\n position: new Vector3().copyFrom(data.position),\n rotation: new Euler(data.eulerHint.x, data.eulerHint.y, data.eulerHint.z),\n scale: new Vector3().copyFrom(data.scale)\n };\n this.setTransform(transformData);\n };\n _proto.dispose = function dispose() {};\n _proto.updateTRSCache = function updateTRSCache() {\n var worldMatrix = this.getWorldMatrix();\n if (this.dirtyFlags.worldMatrix) {\n var cache = this.worldTRSCache;\n worldMatrix.decompose(cache.position, cache.quat, cache.scale);\n this.dirtyFlags.worldMatrix = false;\n }\n };\n _proto.dispatchValueChange = function dispatchValueChange() {\n this.children.forEach(function(c) {\n c.parentMatrixDirty = true;\n });\n };\n /**\n * 转换右手坐标系左手螺旋对应的四元数到对应的旋转角\n * @param quat - 四元数\n * @param out - 欧拉角\n * @returns\n */ Transform.getRotation = function getRotation(quat, out) {\n var newQuat = tempQuat$1.copyFrom(quat);\n newQuat.conjugate();\n return out.setFromQuaternion(newQuat);\n };\n _create_class(Transform, [\n {\n key: \"parentTransform\",\n get: function get() {\n return this.parent;\n },\n set: function set(transform) {\n if (!transform || this.parent === transform || this === transform) {\n return;\n }\n if (this.parent) {\n this.parent.removeChild(this);\n }\n transform.addChild(this);\n this.parent = transform;\n this.parentMatrixDirty = true;\n }\n },\n {\n key: \"parentMatrixDirty\",\n get: function get() {\n return this.dirtyFlags.parentMatrix;\n },\n set: function set(val) {\n if (this.dirtyFlags.parentMatrix !== val) {\n this.dirtyFlags.parentMatrix = val;\n this.dispatchValueChange();\n }\n }\n }\n ]);\n return Transform;\n}();\n\nvar tmpScale = new Vector3(1, 1, 1);\n/**\n * 合成的相机对象,采用透视投影\n */ var Camera = /*#__PURE__*/ function() {\n function Camera(name, options) {\n if (options === void 0) options = {};\n this.name = name;\n this./**\n * @internal\n */ transform = new Transform();\n this.viewportMatrix = Matrix4$1.fromIdentity();\n this.viewMatrix = Matrix4$1.fromIdentity();\n this.projectionMatrix = Matrix4$1.fromIdentity();\n this.viewProjectionMatrix = Matrix4$1.fromIdentity();\n this.inverseViewMatrix = Matrix4$1.fromIdentity();\n this.dirty = true;\n var _options_near = options.near, near = _options_near === void 0 ? 0.1 : _options_near, _options_far = options.far, far = _options_far === void 0 ? 20 : _options_far, _options_fov = options.fov, fov = _options_fov === void 0 ? 60 : _options_fov, _options_aspect = options.aspect, aspect = _options_aspect === void 0 ? 1 : _options_aspect, _options_clipMode = options.clipMode, clipMode = _options_clipMode === void 0 ? CameraClipMode.portrait : _options_clipMode, _options_position = options.position, position = _options_position === void 0 ? [\n 0,\n 0,\n 8\n ] : _options_position, _options_rotation = options.rotation, rotation = _options_rotation === void 0 ? [\n 0,\n 0,\n 0\n ] : _options_rotation;\n var euler = new Euler(rotation[0], rotation[1], rotation[2]);\n var quat = new Quaternion().setFromEuler(euler);\n this.options = {\n near: near,\n far: far,\n fov: fov,\n aspect: aspect,\n clipMode: clipMode\n };\n this.transform.setPosition(position[0], position[1], position[2]);\n this.transform.setQuaternion(quat.x, quat.y, quat.z, quat.w);\n this.dirty = true;\n this.updateMatrix();\n }\n var _proto = Camera.prototype;\n /**\n * 设置相机变换\n * @since 2.3.0\n * @param transform\n */ _proto.setTransform = function setTransform(transform) {\n this.transform.parentTransform = transform.parentTransform;\n this.transform.cloneFromMatrix(transform.getMatrix());\n this.dirty = true;\n };\n _proto.setViewportMatrix = function setViewportMatrix(matrix) {\n this.viewportMatrix = matrix.clone();\n this.dirty = true;\n };\n _proto.getViewportMatrix = function getViewportMatrix() {\n return this.viewportMatrix;\n };\n /**\n * 获取相机的视图变换矩阵\n * @return\n */ _proto.getViewMatrix = function getViewMatrix() {\n this.updateMatrix();\n return this.viewMatrix.clone();\n };\n /**\n * 获取视图变换的逆矩阵\n */ _proto.getInverseViewMatrix = function getInverseViewMatrix() {\n this.updateMatrix();\n return this.inverseViewMatrix.clone();\n };\n /**\n * 获取相机的投影矩阵\n * @return\n */ _proto.getProjectionMatrix = function getProjectionMatrix() {\n this.updateMatrix();\n return this.projectionMatrix.clone();\n };\n /**\n * 获取相机投影矩阵的逆矩阵\n * @return\n */ _proto.getInverseProjectionMatrix = function getInverseProjectionMatrix() {\n var _this_inverseProjectionMatrix;\n this.updateMatrix();\n return (_this_inverseProjectionMatrix = this.inverseProjectionMatrix) == null ? void 0 : _this_inverseProjectionMatrix.clone();\n };\n /**\n * 获取相机的 VP 矩阵\n * @return\n */ _proto.getViewProjectionMatrix = function getViewProjectionMatrix() {\n this.updateMatrix();\n return this.viewProjectionMatrix.clone();\n };\n /**\n * 获取相机 VP 矩阵的逆矩阵\n * @return\n */ _proto.getInverseViewProjectionMatrix = function getInverseViewProjectionMatrix() {\n this.updateMatrix();\n if (!this.inverseViewProjectionMatrix) {\n this.inverseViewProjectionMatrix = this.viewProjectionMatrix.clone();\n this.inverseViewProjectionMatrix.invert();\n }\n return this.inverseViewProjectionMatrix.clone();\n };\n /**\n * 根据相机的视图投影矩阵对指定模型矩阵做变换\n * @param out - 结果矩阵\n * @param model - 模型变换矩阵\n */ _proto.getModelViewProjection = function getModelViewProjection(out, model) {\n return out.multiplyMatrices(this.viewProjectionMatrix, model);\n };\n /**\n * 获取归一化坐标和 3D 世界坐标的换算比例,使用 ViewProjection 矩阵\n * @param z - 当前的位置 z\n */ _proto.getInverseVPRatio = function getInverseVPRatio(z) {\n var pos = new Vector3(this.position.x, this.position.y, z);\n var mat = this.getViewProjectionMatrix();\n var inverseMat = this.getInverseViewProjectionMatrix();\n if (!this.viewportMatrix.isIdentity()) {\n var viewportMatrix = this.viewportMatrix.clone();\n inverseMat.premultiply(viewportMatrix);\n mat.multiply(viewportMatrix.invert());\n }\n var _mat_projectPoint = mat.projectPoint(pos), nz = _mat_projectPoint.z;\n var _inverseMat_projectPoint = inverseMat.projectPoint(new Vector3(1, 1, nz)), xMax = _inverseMat_projectPoint.x, yMax = _inverseMat_projectPoint.y;\n var _inverseMat_projectPoint1 = inverseMat.projectPoint(new Vector3(-1, -1, nz)), xMin = _inverseMat_projectPoint1.x, yMin = _inverseMat_projectPoint1.y;\n return new Vector3((xMax - xMin) / 2, (yMax - yMin) / 2, 0);\n };\n /**\n * 设置相机的旋转四元数\n * @param value - 旋转四元数\n */ _proto.setQuat = function setQuat(value) {\n if (!this.transform.getQuaternion().equals(value)) {\n this.transform.setQuaternion(value.x, value.y, value.z, value.w);\n this.dirty = true;\n }\n };\n /**\n * 获取相机旋转对应的四元数\n * @returns\n */ _proto.getQuat = function getQuat() {\n return this.transform.quat.clone();\n };\n /**\n * 获取相机内部的 options\n * @returns 相机 options\n */ _proto.getOptions = function getOptions() {\n return _extends({}, this.options, {\n position: this.position.clone(),\n rotation: this.rotation.clone()\n });\n };\n /**\n * 复制指定相机元素的属性到当前相机\n * @param camera\n */ _proto.copy = function copy(camera) {\n var near = camera.near, far = camera.far, fov = camera.fov, clipMode = camera.clipMode, aspect = camera.aspect, position = camera.position, rotation = camera.rotation;\n this.near = near;\n this.far = far;\n this.fov = fov;\n this.clipMode = clipMode;\n this.aspect = aspect;\n this.position = position;\n this.rotation = rotation;\n this.updateMatrix();\n };\n /**\n * 更新相机相关的矩阵,获取矩阵前会自动调用\n */ _proto.updateMatrix = function updateMatrix() {\n if (this.dirty) {\n var _this_options = this.options, fov = _this_options.fov, aspect = _this_options.aspect, near = _this_options.near, far = _this_options.far, clipMode = _this_options.clipMode;\n this.projectionMatrix.perspective(fov * DEG2RAD, aspect, near, far, clipMode === CameraClipMode.portrait);\n this.projectionMatrix.premultiply(this.viewportMatrix);\n this.inverseViewMatrix.compose(this.position, this.getQuat(), tmpScale);\n var _this_transform_getParentMatrix;\n this.inverseViewMatrix.premultiply((_this_transform_getParentMatrix = this.transform.getParentMatrix()) != null ? _this_transform_getParentMatrix : Matrix4$1.IDENTITY);\n this.viewMatrix.copyFrom(this.inverseViewMatrix).invert();\n this.viewProjectionMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix);\n this.inverseViewProjectionMatrix = null;\n this.dirty = false;\n }\n };\n _create_class(Camera, [\n {\n key: \"near\",\n get: function get() {\n return this.options.near;\n },\n set: /**\n * 设置相机近平面\n * @param near\n */ function set(near) {\n if (this.options.near !== near) {\n this.options.near = near;\n this.dirty = true;\n }\n }\n },\n {\n key: \"far\",\n get: function get() {\n return this.options.far;\n },\n set: /**\n * 设置相机远平面\n * @param far\n */ function set(far) {\n if (this.options.far !== far) {\n this.options.far = far;\n this.dirty = true;\n }\n }\n },\n {\n key: \"fov\",\n get: function get() {\n return this.options.fov;\n },\n set: /**\n * 设置相机视锥体垂直视野角度\n * @param fov\n */ function set(fov) {\n if (this.options.fov !== fov) {\n this.options.fov = fov;\n this.dirty = true;\n }\n }\n },\n {\n key: \"aspect\",\n get: function get() {\n return this.options.aspect;\n },\n set: /**\n * 设置相机视锥体的长宽比\n * @param aspect\n */ function set(aspect) {\n if (this.options.aspect !== aspect) {\n this.options.aspect = aspect;\n this.dirty = true;\n }\n }\n },\n {\n key: \"clipMode\",\n get: function get() {\n return this.options.clipMode;\n },\n set: /**\n * 相机的裁剪模式\n * @param clipMode\n */ function set(clipMode) {\n if (clipMode !== undefined && this.options.clipMode !== clipMode) {\n this.options.clipMode = clipMode;\n this.dirty = true;\n }\n }\n },\n {\n key: \"position\",\n get: /**\n * 获取相机的本地位置\n */ function get() {\n return this.transform.position.clone();\n },\n set: /**\n * 设置相机的本地位置\n * @param value\n */ function set(value) {\n if (!this.transform.position.equals(value)) {\n this.transform.setPosition(value.x, value.y, value.z);\n this.dirty = true;\n }\n }\n },\n {\n key: \"worldPosition\",\n get: /**\n * 获取相机的世界位置\n * @since 2.3.0\n */ function get() {\n return this.transform.getWorldPosition();\n }\n },\n {\n key: \"rotation\",\n get: function get() {\n return this.transform.rotation.clone();\n },\n set: /**\n * 设置相机的旋转角度\n * @param value\n */ function set(value) {\n if (!this.transform.rotation.equals(value)) {\n this.transform.setRotation(value.x, value.y, value.z);\n this.dirty = true;\n }\n }\n }\n ]);\n return Camera;\n}();\n\nvar Burst = /*#__PURE__*/ function() {\n function Burst(options) {\n var time = options.time, interval = options.interval, count = options.count, cycles = options.cycles, probability = options.probability;\n this.time = +time || 0;\n this.interval = +interval || 1;\n this.count = _instanceof1(count, ValueGetter) ? count : createValueGetter(count);\n this.cycles = +cycles || Infinity;\n this.probability = isNaN(probability) ? 1 : +probability;\n this.reset();\n }\n var _proto = Burst.prototype;\n _proto.getGeneratorOptions = function getGeneratorOptions(timePassed, lifetime) {\n var dt = timePassed - this.time - this.now;\n if (dt > this.interval * this.index && this.internalCycles > 0) {\n this.internalCycles--;\n this.index++;\n return Math.random() <= this.probability ? {\n index: this.index,\n total: 1 / this.interval,\n count: this.count.getValue(lifetime),\n cycleIndex: this.cycles - this.internalCycles - 1\n } : null;\n }\n };\n _proto.reset = function reset() {\n this.internalCycles = this.cycles;\n this.index = 0;\n this.now = 0;\n };\n _proto.clone = function clone() {\n var options = {\n time: this.time,\n interval: this.interval,\n count: this.count,\n cycles: this.cycles,\n probability: this.probability\n };\n return new Burst(options);\n };\n return Burst;\n}();\n\nvar LinkNode = function LinkNode(content) {\n this.content = content;\n};\nvar Link = /*#__PURE__*/ function() {\n function Link(sort) {\n this.sort = sort;\n this.length = 0;\n }\n var _proto = Link.prototype;\n _proto.findNodeByContent = function findNodeByContent(filter) {\n var node = this.first;\n if (node) {\n do {\n if (filter(node.content)) {\n return node;\n }\n // @ts-expect-error\n // eslint-disable-next-line no-cond-assign\n }while (node = node.next);\n }\n };\n _proto.insertNode = function insertNode(a, next) {\n var b = a.next;\n a.next = next;\n next.pre = a;\n next.next = b;\n if (b) {\n b.pre = next;\n }\n // a -> next -> b\n };\n _proto.shiftNode = function shiftNode(content) {\n var node = new LinkNode(content);\n this.length++;\n if (this.length === 1) {\n return this.first = this.last = node;\n }\n var current = this.first;\n while(current){\n if (this.sort(current.content, node.content) <= 0) {\n if (current.next) {\n current = current.next;\n } else {\n this.insertNode(current, node);\n return this.last = node;\n }\n } else {\n if (current.pre) {\n this.insertNode(current.pre, node);\n } else {\n this.first = node;\n node.next = current;\n current.pre = node;\n }\n return node;\n }\n }\n };\n _proto.pushNode = function pushNode(content) {\n var node = new LinkNode(content);\n this.length++;\n if (this.length === 1) {\n return this.last = this.first = node;\n }\n var current = this.last;\n while(current){\n if (this.sort(node.content, current.content) <= 0) {\n if (this.first === current) {\n current.pre = node;\n node.next = current;\n return this.first = node;\n } else {\n // @ts-expect-error\n current = current.pre;\n }\n } else {\n this.insertNode(current, node);\n if (current === this.last) {\n this.last = node;\n }\n return node;\n }\n }\n };\n _proto.removeNode = function removeNode(node) {\n var current = this.first;\n this.length--;\n if (current === node) {\n // @ts-expect-error\n var a = this.first = current.next;\n if (a) {\n a.pre = null;\n }\n } else if ((current = this.last) === node) {\n // @ts-expect-error\n var a1 = this.last = current.pre;\n if (a1) {\n a1.next = null;\n }\n } else if (node) {\n var pre = node.pre;\n var next = node.next;\n // @ts-expect-error\n pre.next = next;\n if (next) {\n next.pre = pre;\n }\n }\n node.pre = null;\n node.next = null;\n };\n _proto.forEach = function forEach(func, thisObj) {\n var node = this.first;\n var i = 0;\n if (node) {\n do {\n func.call(thisObj || this, node.content, i++);\n // @ts-expect-error\n // eslint-disable-next-line no-cond-assign\n }while (node = node.next);\n }\n };\n _proto.forEachReverse = function forEachReverse(func, thisObj) {\n var node = this.last;\n var i = this.length - 1;\n if (node) {\n do {\n func.call(thisObj || this, node.content, i--);\n // @ts-expect-error\n // eslint-disable-next-line no-cond-assign\n }while (node = node.pre);\n }\n };\n _proto.getNodeByIndex = function getNodeByIndex(index) {\n var i = 0, res = this.first;\n if (!res || index >= this.length || index < 0) {\n return null;\n }\n while(i < index){\n res = res.next;\n i++;\n }\n return res;\n };\n return Link;\n}();\n\nvar RUNTIME_ENV = \"runtime_env\";\nvar RENDER_PREFER_LOOKUP_TEXTURE = \"lookup_texture\";\n// 文本元素使用 offscreen canvas 绘制\nvar TEMPLATE_USE_OFFSCREEN_CANVAS = \"offscreen_canvas\";\n// 后处理配置相关\nvar POST_PROCESS_SETTINGS = \"post_process_settings\";\nvar config = {};\n/**\n * 获取全局配置项\n * @param name\n * @returns\n */ function getConfig(name) {\n return config[name];\n}\n/**\n * 设置全局配置项\n * @param name\n * @param value\n * @returns\n */ function setConfig(name, value) {\n return config[name] = value;\n}\n\nvar tmp0 = new Vector3();\nvar tmp1 = new Vector3();\nvar TrailMesh = /*#__PURE__*/ function() {\n function TrailMesh(engine, props) {\n this.pointStart = [];\n var colorOverLifetime = props.colorOverLifetime, colorOverTrail = props.colorOverTrail, maxTrailCount = props.maxTrailCount, _props_opacityOverLifetime = props.opacityOverLifetime, opacityOverLifetime = _props_opacityOverLifetime === void 0 ? createValueGetter(1) : _props_opacityOverLifetime, widthOverTrail = props.widthOverTrail, name = props.name, occlusion = props.occlusion, blending = props.blending, maskMode = props.maskMode, mask = props.mask, _props_textureMap = props.// order,\n textureMap, textureMap = _props_textureMap === void 0 ? [\n 0,\n 0,\n 1,\n 1\n ] : _props_textureMap, texture = props.texture, transparentOcclusion = props.transparentOcclusion, minimumVertexDistance = props.minimumVertexDistance, lifetime = props.lifetime, matrix = props.matrix;\n var _engine_gpuCapability = engine.gpuCapability, detail = _engine_gpuCapability.detail, level = _engine_gpuCapability.level;\n var pointCountPerTrail = Math.max(props.pointCountPerTrail, 2);\n var keyFrameMeta = createKeyFrameMeta();\n var enableVertexTexture = detail.maxVertexTextures > 0;\n var _engine_renderer;\n var env = ((_engine_renderer = engine.renderer) != null ? _engine_renderer : {}).env;\n var uniformValues = {};\n // const lookUpTexture = getConfig(RENDER_PREFER_LOOKUP_TEXTURE) ? 1 : 0;\n var lookUpTexture = 0;\n var macros = [\n [\n \"ENABLE_VERTEX_TEXTURE\",\n enableVertexTexture\n ],\n [\n \"LOOKUP_TEXTURE_CURVE\",\n lookUpTexture\n ],\n [\n \"ENV_EDITOR\",\n env === PLAYER_OPTIONS_ENV_EDITOR\n ]\n ];\n var useAttributeTrailStart = maxTrailCount > 64;\n var shaderCacheId = 0;\n if (colorOverLifetime) {\n macros.push([\n \"COLOR_OVER_LIFETIME\",\n true\n ]);\n shaderCacheId |= 1;\n uniformValues.uColorOverLifetime = Texture.createWithData(engine, imageDataFromGradient(colorOverLifetime));\n }\n if (colorOverTrail) {\n macros.push([\n \"COLOR_OVER_TRAIL\",\n true\n ]);\n shaderCacheId |= 1 << 2;\n uniformValues.uColorOverTrail = Texture.createWithData(engine, imageDataFromGradient(colorOverTrail));\n }\n if (useAttributeTrailStart) {\n macros.push([\n \"ATTR_TRAIL_START\",\n 1\n ]);\n shaderCacheId |= 1 << 3;\n } else {\n uniformValues.uTrailStart = new Float32Array(maxTrailCount);\n }\n uniformValues.uOpacityOverLifetimeValue = opacityOverLifetime.toUniform(keyFrameMeta);\n var uWidthOverTrail = widthOverTrail.toUniform(keyFrameMeta);\n macros.push([\n \"VERT_CURVE_VALUE_COUNT\",\n keyFrameMeta.index\n ], [\n \"VERT_MAX_KEY_FRAME_COUNT\",\n keyFrameMeta.max\n ]);\n if (enableVertexTexture && lookUpTexture) {\n var tex = generateHalfFloatTexture(engine, ValueGetter.getAllData(keyFrameMeta, true), keyFrameMeta.index, 1);\n uniformValues.uVCurveValueTexture = tex;\n } else {\n uniformValues.uVCurveValues = ValueGetter.getAllData(keyFrameMeta);\n }\n var vertex = trailVert;\n var fragment = particleFrag;\n var mtl = {\n shader: {\n vertex: vertex,\n fragment: fragment,\n macros: macros,\n glslVersion: level === 1 ? exports.GLSLVersion.GLSL1 : exports.GLSLVersion.GLSL3,\n shared: true,\n name: \"trail#\" + name,\n cacheId: \"-t:+\" + shaderCacheId + \"+\" + keyFrameMeta.index + \"+\" + keyFrameMeta.max\n },\n uniformSemantics: {\n effects_MatrixVP: \"VIEWPROJECTION\",\n effects_MatrixInvV: \"VIEWINVERSE\",\n effects_ObjectToWorld: \"MODEL\",\n uEditorTransform: \"EDITOR_TRANSFORM\"\n }\n };\n var maxVertexCount = pointCountPerTrail * maxTrailCount * 2;\n var maxTriangleCount = (pointCountPerTrail - 1) * maxTrailCount;\n var bpe = Float32Array.BYTES_PER_ELEMENT;\n var v12 = 12 * bpe;\n var geometryOptions = {\n attributes: {\n aColor: {\n size: 4,\n stride: v12,\n data: new Float32Array(maxVertexCount * 12)\n },\n aSeed: {\n size: 1,\n stride: v12,\n offset: 4 * bpe,\n dataSource: \"aColor\"\n },\n aInfo: {\n size: 3,\n stride: v12,\n offset: 5 * bpe,\n dataSource: \"aColor\"\n },\n aPos: {\n size: 4,\n stride: v12,\n offset: 8 * bpe,\n dataSource: \"aColor\"\n },\n //\n aTime: {\n size: 1,\n data: new Float32Array(maxVertexCount)\n },\n //\n aDir: {\n size: 3,\n data: new Float32Array(maxVertexCount * 3)\n }\n },\n indices: {\n data: new Uint16Array(maxVertexCount * 6)\n },\n drawCount: maxTriangleCount * 6,\n name: \"trail#\" + name,\n bufferUsage: glContext.DYNAMIC_DRAW\n };\n if (useAttributeTrailStart) {\n geometryOptions.attributes.aTrailStart = {\n size: 1,\n data: new Float32Array(maxVertexCount)\n };\n } else {\n var indexData = new Float32Array(maxVertexCount);\n geometryOptions.attributes.aTrailStartIndex = {\n size: 1,\n data: indexData\n };\n for(var i = 0; i < maxTrailCount; i++){\n var c = pointCountPerTrail * 2;\n var s = i * c;\n for(var j = 0; j < c; j++){\n indexData[s + j] = i;\n }\n }\n }\n var preMulAlpha = getPreMultiAlpha(blending);\n var material = Material.create(engine, mtl);\n material.blending = true;\n material.depthMask = occlusion;\n material.depthTest = true;\n material.stencilRef = mask ? [\n mask,\n mask\n ] : undefined;\n setMaskMode(material, maskMode);\n setBlendMode(material, blending);\n var mesh = this.mesh = Mesh.create(engine, {\n name: \"MTrail_\" + name,\n material: material,\n geometry: Geometry.create(engine, geometryOptions)\n });\n var uMaskTex = texture != null ? texture : Texture.createWithData(engine);\n Object.keys(uniformValues).map(function(name) {\n var value = uniformValues[name];\n if (_instanceof1(value, Texture)) {\n material.setTexture(name, value);\n } else if (name === \"uTrailStart\") {\n material.setFloats(\"uTrailStart\", value);\n } else if (name === \"uVCurveValues\") {\n var array = [];\n for(var i = 0; i < value.length; i = i + 4){\n var v = new Vector4$1(value[i], value[i + 1], value[i + 2], value[i + 3]);\n array.push(v);\n }\n material.setVector4Array(name, array);\n } else {\n material.setVector4(name, Vector4$1.fromArray(value));\n }\n });\n material.setFloat(\"uTime\", 0);\n // TODO: 修改下长度\n material.setVector4(\"uWidthOverTrail\", Vector4$1.fromArray(uWidthOverTrail));\n material.setVector2(\"uTexOffset\", new Vector2(0, 0));\n material.setVector4(\"uTextureMap\", Vector4$1.fromArray(textureMap));\n material.setVector4(\"uParams\", new Vector4$1(0, pointCountPerTrail - 1, 0, 0));\n material.setTexture(\"uMaskTex\", uMaskTex);\n material.setVector4(\"uColorParams\", new Vector4$1(texture ? 1 : 0, +preMulAlpha, 0, +(occlusion && !transparentOcclusion)));\n this.maxTrailCount = maxTrailCount;\n this.pointCountPerTrail = pointCountPerTrail;\n this.checkVertexDistance = minimumVertexDistance > 0;\n this.minimumVertexDistance = Math.pow(minimumVertexDistance || 0.001, 2);\n this.useAttributeTrailStart = useAttributeTrailStart;\n this.lifetime = lifetime;\n if (matrix) {\n this.mesh.worldMatrix = matrix;\n }\n this.geometry = mesh.firstGeometry();\n this.trailCursors = new Uint16Array(maxTrailCount);\n }\n var _proto = TrailMesh.prototype;\n _proto.addPoint = function addPoint(trailIndex, position, opt) {\n opt = opt || {};\n var cursor = this.trailCursors[trailIndex];\n var pointCountPerTrail = this.pointCountPerTrail;\n var geometry = this.geometry;\n var segmentPerTrail = pointCountPerTrail - 1;\n var pointIndex = cursor % pointCountPerTrail;\n var previousIndex = (cursor - 1) % pointCountPerTrail;\n var bpreviousIndex = (cursor - 2) % pointCountPerTrail;\n var previousPoint = this.getTrailPosition(trailIndex, previousIndex, tmp0);\n // point too close\n if (previousPoint && this.checkVertexDistance && (previousPoint == null ? void 0 : previousPoint.distanceSquared(position)) < this.minimumVertexDistance) {\n return;\n }\n var pointStartIndex = trailIndex * pointCountPerTrail + pointIndex;\n var dir = calculateDirection(previousPoint, position);\n var time = opt.time || this.time;\n var info = [\n Math.random(),\n opt.lifetime || this.lifetime,\n cursor\n ];\n var size = opt.size || 1;\n var dirStartIndex = pointStartIndex * 6;\n var dirData = new Float32Array(6);\n dirData.set(dir, 0);\n dirData.set(dir, 3);\n geometry.setAttributeSubData(\"aDir\", dirStartIndex, dirData);\n geometry.setAttributeSubData(\"aTime\", pointStartIndex * 2, new Float32Array([\n time,\n time\n ]));\n var color = opt.color || [\n 1,\n 1,\n 1,\n 1\n ];\n var colorData = new Float32Array(24);\n var positionData = position.toArray();\n colorData.set(color, 0);\n colorData.set(info, 4);\n colorData[7] = 0;\n colorData.set(positionData, 8);\n colorData[11] = 0.5 * size;\n colorData.set(color, 12);\n colorData.set(info, 16);\n colorData[19] = 1;\n colorData.set(positionData, 20);\n colorData[23] = -0.5 * size;\n geometry.setAttributeSubData(\"aColor\", pointStartIndex * 24, colorData);\n if (previousIndex >= 0) {\n var bPreviousPoint = this.getTrailPosition(trailIndex, bpreviousIndex, tmp1);\n var previousDir = new Float32Array(calculateDirection(bPreviousPoint, previousPoint, position));\n var previousDirStartIndex = (trailIndex * pointCountPerTrail + previousIndex) * 6;\n geometry.setAttributeSubData(\"aDir\", previousDirStartIndex, previousDir);\n geometry.setAttributeSubData(\"aDir\", previousDirStartIndex + 3, previousDir);\n var indicesStart = trailIndex * pointCountPerTrail * 2;\n var indicesData = new Uint16Array([\n previousIndex * 2 + indicesStart,\n previousIndex * 2 + 1 + indicesStart,\n pointIndex * 2 + indicesStart,\n pointIndex * 2 + indicesStart,\n previousIndex * 2 + 1 + indicesStart,\n pointIndex * 2 + 1 + indicesStart\n ]);\n var start = (trailIndex * segmentPerTrail + (cursor - 1) % segmentPerTrail) * 6;\n geometry.setIndexSubData(start, indicesData);\n }\n cursor = ++this.trailCursors[trailIndex];\n var mtl = this.mesh.material;\n var params = mtl.getVector4(\"uParams\");\n var trailStart = info[2];\n if (this.useAttributeTrailStart) {\n var len = pointCountPerTrail * 2;\n var startData = new Float32Array(len);\n for(var i = 0; i < len; i++){\n startData[i] = trailStart;\n }\n geometry.setAttributeSubData(\"aTrailStart\", trailIndex * startData.length, startData);\n } else {\n var value = mtl.getFloats(\"uTrailStart\");\n if (value != undefined) {\n value[trailIndex] = trailStart;\n mtl.setFloats(\"uTrailStart\", value);\n }\n }\n if (params) {\n params.y = Math.max(params.y, cursor - 1) - Math.max(0, cursor - pointCountPerTrail);\n mtl.setVector4(\"uParams\", params);\n }\n };\n _proto.getTrailPosition = function getTrailPosition(trail, index, out) {\n var pointCountPerTrail = this.pointCountPerTrail;\n if (index >= 0 && index < pointCountPerTrail) {\n var startIndex = (trail * pointCountPerTrail + index) * 24 + 8;\n var data = this.geometry.getAttributeData(\"aColor\");\n assertExist(data);\n out.x = data[startIndex];\n out.y = data[1 + startIndex];\n out.z = data[2 + startIndex];\n return out;\n }\n };\n _proto.clearAllTrails = function clearAllTrails() {\n var indexData = this.geometry.getIndexData();\n assertExist(indexData);\n this.trailCursors = new Uint16Array(this.trailCursors.length);\n this.geometry.setIndexData(new Uint16Array(indexData.length));\n };\n _proto.minusTime = function minusTime(time) {\n var data = this.geometry.getAttributeData(\"aTime\");\n assertExist(data);\n for(var i = 0; i < data.length; i++){\n data[i] -= time;\n }\n this.geometry.setAttributeData(\"aTime\", data);\n this.time -= time;\n };\n _proto.clearTrail = function clearTrail(index) {\n if (this.trailCursors[index] !== 0) {\n var pointCountPerTrail = this.pointCountPerTrail;\n var indicesPerTrail = (pointCountPerTrail - 1) * 6;\n var indices = this.geometry.getIndexData();\n assertExist(indices);\n indices.set(new Uint16Array(indicesPerTrail), index * indicesPerTrail);\n this.geometry.setIndexData(indices);\n this.trailCursors[index] = 0;\n }\n };\n _proto.getPointStartPos = function getPointStartPos(index) {\n return this.pointStart[index];\n };\n _proto.setPointStartPos = function setPointStartPos(index, pos) {\n this.pointStart[index] = pos;\n };\n _proto.onUpdate = function onUpdate(escapeTime) {};\n _create_class(TrailMesh, [\n {\n key: \"time\",\n get: function get() {\n return this.mesh.material.getFloat(\"uTime\") || 0;\n },\n set: function set(t) {\n this.mesh.material.setFloat(\"uTime\", t != null ? t : 0);\n }\n }\n ]);\n return TrailMesh;\n}();\nvar tempDir$1 = new Vector3();\nvar tempDa = new Vector3();\nvar tempDb = new Vector3();\n// TODO: prePoint 可选,point 必选,顺序有问题\nfunction calculateDirection(prePoint, point, nextPoint) {\n var dir = tempDir$1;\n if (!prePoint && !nextPoint) {\n return [\n 0,\n 0,\n 0\n ];\n } else if (!prePoint) {\n dir.subtractVectors(nextPoint, point);\n } else if (!nextPoint) {\n dir.subtractVectors(point, prePoint);\n } else {\n tempDa.subtractVectors(point, prePoint).normalize();\n // FIXME: 这里有bug。。。\n tempDa.subtractVectors(nextPoint, point);\n tempDb.copyFrom(tempDa).normalize();\n dir.addVectors(tempDa, tempDb);\n }\n return dir.normalize().toArray();\n}\n\n/**\n * @since 2.0.0\n */ var ParticleBehaviourPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(ParticleBehaviourPlayable, Playable);\n function ParticleBehaviourPlayable() {\n var _this;\n _this = Playable.apply(this, arguments) || this;\n _this.lastTime = 0;\n return _this;\n }\n var _proto = ParticleBehaviourPlayable.prototype;\n _proto.start = function start(context) {\n var boundObject = context.output.getUserData();\n if (this.particleSystem || !_instanceof1(boundObject, exports.VFXItem)) {\n return;\n }\n this.particleSystem = boundObject.getComponent(exports.ParticleSystem);\n if (this.particleSystem) {\n this.particleSystem.name = boundObject.name;\n this.particleSystem.startEmit();\n this.particleSystem.initEmitterTransform();\n }\n };\n _proto.processFrame = function processFrame(context) {\n if (this.time >= 0) {\n this.start(context);\n }\n var particleSystem = this.particleSystem;\n if (particleSystem) {\n var deltaTime = context.deltaTime;\n if (this.time >= 0 && this.time < particleSystem.item.duration && particleSystem.isEnded()) {\n particleSystem.reset();\n }\n if (Math.abs(this.time - this.lastTime) < 0.001) {\n deltaTime = 0;\n }\n particleSystem.update(deltaTime);\n }\n this.lastTime = this.time;\n };\n return ParticleBehaviourPlayable;\n}(Playable);\nvar ParticleBehaviourPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(ParticleBehaviourPlayableAsset, PlayableAsset);\n function ParticleBehaviourPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = ParticleBehaviourPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n return new ParticleBehaviourPlayable(graph);\n };\n return ParticleBehaviourPlayableAsset;\n}(PlayableAsset);\nvar particleUniformTypeMap = {\n \"uSprite\": \"vec4\",\n \"uParams\": \"vec4\",\n \"uAcceleration\": \"vec4\",\n \"uGravityModifierValue\": \"vec4\",\n \"uOpacityOverLifetimeValue\": \"vec4\",\n \"uRXByLifeTimeValue\": \"vec4\",\n \"uRYByLifeTimeValue\": \"vec4\",\n \"uRZByLifeTimeValue\": \"vec4\",\n \"uLinearXByLifetimeValue\": \"vec4\",\n \"uLinearYByLifetimeValue\": \"vec4\",\n \"uLinearZByLifetimeValue\": \"vec4\",\n \"uSpeedLifetimeValue\": \"vec4\",\n \"uOrbXByLifetimeValue\": \"vec4\",\n \"uOrbYByLifetimeValue\": \"vec4\",\n \"uOrbZByLifetimeValue\": \"vec4\",\n \"uSizeByLifetimeValue\": \"vec4\",\n \"uSizeYByLifetimeValue\": \"vec4\",\n \"uColorParams\": \"vec4\",\n \"uFSprite\": \"vec4\",\n \"uPreviewColor\": \"vec4\",\n \"uVCurveValues\": \"vec4Array\",\n \"uFCurveValues\": \"vec4\",\n \"uFinalTarget\": \"vec3\",\n \"uForceCurve\": \"vec4\",\n \"uOrbCenter\": \"vec3\",\n \"uTexOffset\": \"vec2\",\n \"uPeriodValue\": \"vec4\",\n \"uMovementValue\": \"vec4\",\n \"uStrengthValue\": \"vec4\",\n \"uWaveParams\": \"vec4\"\n};\n\nvar ParticleMesh = /*#__PURE__*/ function() {\n function ParticleMesh(engine, props) {\n this.particleCount = 0;\n this.cachedRotationVector3 = new Vector3();\n this.cachedRotationMatrix = new Matrix3();\n this.cachedLinearMove = new Vector3();\n this.tempMatrix3 = new Matrix3();\n this.VERT_MAX_KEY_FRAME_COUNT = 0;\n var _engine_renderer;\n var env = ((_engine_renderer = engine.renderer) != null ? _engine_renderer : {}).env;\n var speedOverLifetime = props.speedOverLifetime, colorOverLifetime = props.colorOverLifetime, linearVelOverLifetime = props.linearVelOverLifetime, orbitalVelOverLifetime = props.orbitalVelOverLifetime, sizeOverLifetime = props.sizeOverLifetime, rotationOverLifetime = props.rotationOverLifetime, sprite = props.sprite, gravityModifier = props.gravityModifier, maxCount = props.maxCount, textureFlip = props.textureFlip, useSprite = props.useSprite, name = props.name, gravity = props.gravity, forceTarget = props.forceTarget, side = props.side, occlusion = props.occlusion, anchor = props.anchor, blending = props.blending, maskMode = props.maskMode, mask = props.mask, transparentOcclusion = props.transparentOcclusion, meshSlots = props.meshSlots, _props_renderMode = props.renderMode, renderMode = _props_renderMode === void 0 ? 0 : _props_renderMode, _props_diffuse = props.diffuse, diffuse = _props_diffuse === void 0 ? Texture.createWithData(engine) : _props_diffuse;\n var detail = engine.gpuCapability.detail;\n var halfFloatTexture = detail.halfFloatTexture, maxVertexUniforms = detail.maxVertexUniforms;\n var macros = [\n // spec.RenderMode\n [\n \"RENDER_MODE\",\n +renderMode\n ],\n [\n \"ENV_EDITOR\",\n env === PLAYER_OPTIONS_ENV_EDITOR\n ]\n ];\n var level = engine.gpuCapability.level;\n var vertexKeyFrameMeta = createKeyFrameMeta();\n var fragmentKeyFrameMeta = createKeyFrameMeta();\n var enableVertexTexture = maxVertexUniforms > 0;\n var uniformValues = {};\n var vertex_lookup_texture = 0;\n var shaderCacheId = 0;\n var useOrbitalVel;\n this.useSprite = useSprite;\n if (enableVertexTexture) {\n macros.push([\n \"ENABLE_VERTEX_TEXTURE\",\n true\n ]);\n }\n if (speedOverLifetime) {\n macros.push([\n \"SPEED_OVER_LIFETIME\",\n true\n ]);\n shaderCacheId |= 1 << 1;\n uniformValues.uSpeedLifetimeValue = speedOverLifetime.toUniform(vertexKeyFrameMeta);\n }\n if (sprite == null ? void 0 : sprite.animate) {\n macros.push([\n \"USE_SPRITE\",\n true\n ]);\n shaderCacheId |= 1 << 2;\n uniformValues.uFSprite = uniformValues.uSprite = new Float32Array([\n sprite.col,\n sprite.row,\n sprite.total,\n sprite.blend ? 1 : 0\n ]);\n this.useSprite = true;\n }\n if (colorOverLifetime == null ? void 0 : colorOverLifetime.color) {\n macros.push([\n \"COLOR_OVER_LIFETIME\",\n true\n ]);\n shaderCacheId |= 1 << 4;\n uniformValues.uColorOverLifetime = _instanceof1(colorOverLifetime.color, Texture) ? colorOverLifetime.color : Texture.createWithData(engine, imageDataFromGradient(colorOverLifetime.color));\n }\n if (colorOverLifetime == null ? void 0 : colorOverLifetime.opacity) {\n uniformValues.uOpacityOverLifetimeValue = colorOverLifetime.opacity.toUniform(vertexKeyFrameMeta);\n } else {\n uniformValues.uOpacityOverLifetimeValue = createValueGetter(1).toUniform(vertexKeyFrameMeta);\n }\n [\n \"x\",\n \"y\",\n \"z\"\n ].forEach(function(pro, i) {\n var defL = 0;\n var defO = 0;\n if (linearVelOverLifetime == null ? void 0 : linearVelOverLifetime[pro]) {\n uniformValues[\"uLinear\" + pro.toUpperCase() + \"ByLifetimeValue\"] = linearVelOverLifetime[pro].toUniform(vertexKeyFrameMeta);\n defL = 1;\n shaderCacheId |= 1 << 7 + i;\n linearVelOverLifetime.enabled = true;\n }\n macros.push([\n \"LINEAR_VEL_\" + pro.toUpperCase(),\n defL\n ]);\n if (orbitalVelOverLifetime == null ? void 0 : orbitalVelOverLifetime[pro]) {\n uniformValues[\"uOrb\" + pro.toUpperCase() + \"ByLifetimeValue\"] = orbitalVelOverLifetime[pro].toUniform(vertexKeyFrameMeta);\n defO = 1;\n shaderCacheId |= 1 << 10 + i;\n useOrbitalVel = true;\n orbitalVelOverLifetime.enabled = true;\n }\n macros.push([\n \"ORB_VEL_\" + pro.toUpperCase(),\n defO\n ]);\n });\n if (linearVelOverLifetime == null ? void 0 : linearVelOverLifetime.asMovement) {\n macros.push([\n \"AS_LINEAR_MOVEMENT\",\n true\n ]);\n shaderCacheId |= 1 << 5;\n }\n if (useOrbitalVel) {\n if (orbitalVelOverLifetime == null ? void 0 : orbitalVelOverLifetime.asRotation) {\n macros.push([\n \"AS_ORBITAL_MOVEMENT\",\n true\n ]);\n shaderCacheId |= 1 << 6;\n }\n uniformValues.uOrbCenter = new Float32Array((orbitalVelOverLifetime == null ? void 0 : orbitalVelOverLifetime.center) || [\n 0,\n 0,\n 0\n ]);\n }\n uniformValues.uSizeByLifetimeValue = sizeOverLifetime == null ? void 0 : sizeOverLifetime.x.toUniform(vertexKeyFrameMeta);\n if (sizeOverLifetime == null ? void 0 : sizeOverLifetime.separateAxes) {\n var _sizeOverLifetime_y;\n macros.push([\n \"SIZE_Y_BY_LIFE\",\n 1\n ]);\n shaderCacheId |= 1 << 14;\n uniformValues.uSizeYByLifetimeValue = sizeOverLifetime == null ? void 0 : (_sizeOverLifetime_y = sizeOverLifetime.y) == null ? void 0 : _sizeOverLifetime_y.toUniform(vertexKeyFrameMeta);\n }\n if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.z) {\n uniformValues.uRZByLifeTimeValue = rotationOverLifetime.z.toUniform(vertexKeyFrameMeta);\n shaderCacheId |= 1 << 15;\n macros.push([\n \"ROT_Z_LIFETIME\",\n 1\n ]);\n }\n if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.x) {\n uniformValues.uRXByLifeTimeValue = rotationOverLifetime.x.toUniform(vertexKeyFrameMeta);\n shaderCacheId |= 1 << 16;\n macros.push([\n \"ROT_X_LIFETIME\",\n 1\n ]);\n }\n if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.y) {\n uniformValues.uRYByLifeTimeValue = rotationOverLifetime.y.toUniform(vertexKeyFrameMeta);\n shaderCacheId |= 1 << 17;\n macros.push([\n \"ROT_Y_LIFETIME\",\n 1\n ]);\n }\n if (rotationOverLifetime == null ? void 0 : rotationOverLifetime.asRotation) {\n macros.push([\n \"ROT_LIFETIME_AS_MOVEMENT\",\n 1\n ]);\n shaderCacheId |= 1 << 18;\n }\n uniformValues.uGravityModifierValue = gravityModifier.toUniform(vertexKeyFrameMeta);\n if (forceTarget) {\n macros.push([\n \"FINAL_TARGET\",\n true\n ]);\n shaderCacheId |= 1 << 19;\n uniformValues.uFinalTarget = new Float32Array(forceTarget.target || [\n 0,\n 0,\n 0\n ]);\n uniformValues.uForceCurve = forceTarget.curve.toUniform(vertexKeyFrameMeta);\n }\n if (halfFloatTexture && fragmentKeyFrameMeta.max) {\n shaderCacheId |= 1 << 20;\n uniformValues.uFCurveValueTexture = generateHalfFloatTexture(engine, ValueGetter.getAllData(fragmentKeyFrameMeta, true), fragmentKeyFrameMeta.index, 1);\n } else {\n uniformValues.uFCurveValues = ValueGetter.getAllData(fragmentKeyFrameMeta);\n }\n var vertexCurveTexture = vertexKeyFrameMeta.max + vertexKeyFrameMeta.curves.length - 32 > maxVertexUniforms;\n // if (getConfig(RENDER_PREFER_LOOKUP_TEXTURE)) {\n // vertexCurveTexture = true;\n // }\n if (level === 2) {\n vertexKeyFrameMeta.max = -1;\n vertexKeyFrameMeta.index = meshSlots ? meshSlots[0] : getSlot(vertexKeyFrameMeta.index);\n if (fragmentKeyFrameMeta.index > 0) {\n fragmentKeyFrameMeta.max = -1;\n fragmentKeyFrameMeta.index = meshSlots ? meshSlots[1] : getSlot(fragmentKeyFrameMeta.index);\n }\n }\n if (vertexCurveTexture && halfFloatTexture && enableVertexTexture) {\n var tex = generateHalfFloatTexture(engine, ValueGetter.getAllData(vertexKeyFrameMeta, true), vertexKeyFrameMeta.index, 1);\n uniformValues.uVCurveValueTexture = tex;\n vertex_lookup_texture = 1;\n } else {\n uniformValues.uVCurveValues = ValueGetter.getAllData(vertexKeyFrameMeta);\n }\n var shaderCache = [\n \"-p:\",\n renderMode,\n shaderCacheId,\n vertexKeyFrameMeta.index,\n vertexKeyFrameMeta.max,\n fragmentKeyFrameMeta.index,\n fragmentKeyFrameMeta.max\n ].join(\"+\");\n macros.push([\n \"VERT_CURVE_VALUE_COUNT\",\n vertexKeyFrameMeta.index\n ], [\n \"FRAG_CURVE_VALUE_COUNT\",\n fragmentKeyFrameMeta.index\n ], [\n \"VERT_MAX_KEY_FRAME_COUNT\",\n vertexKeyFrameMeta.max\n ], [\n \"FRAG_MAX_KEY_FRAME_COUNT\",\n fragmentKeyFrameMeta.max\n ]);\n this.VERT_MAX_KEY_FRAME_COUNT = vertexKeyFrameMeta.max;\n var fragment = particleFrag;\n var originalVertex = \"#define LOOKUP_TEXTURE_CURVE \" + vertex_lookup_texture + \"\\n\" + particleVert;\n var vertex = originalVertex;\n var shader = {\n fragment: fragment,\n vertex: vertex,\n glslVersion: level === 1 ? exports.GLSLVersion.GLSL1 : exports.GLSLVersion.GLSL3,\n shared: true,\n cacheId: shaderCache,\n macros: macros,\n name: \"particle#\" + name\n };\n var mtlOptions = {\n shader: shader,\n uniformSemantics: {\n effects_MatrixV: \"VIEW\",\n effects_MatrixVP: \"VIEWPROJECTION\",\n uEditorTransform: \"EDITOR_TRANSFORM\",\n effects_ObjectToWorld: \"MODEL\"\n }\n };\n var preMulAlpha = getPreMultiAlpha(blending);\n uniformValues.uTexOffset = new Float32Array(diffuse ? [\n 1 / diffuse.getWidth(),\n 1 / diffuse.getHeight()\n ] : [\n 0,\n 0\n ]);\n uniformValues.uMaskTex = diffuse;\n uniformValues.uColorParams = new Float32Array([\n diffuse ? 1 : 0,\n +preMulAlpha,\n 0,\n +(!!occlusion && !transparentOcclusion)\n ]);\n uniformValues.uParams = [\n 0,\n 0,\n 0,\n 0\n ];\n uniformValues.uAcceleration = [\n (gravity == null ? void 0 : gravity[0]) || 0,\n (gravity == null ? void 0 : gravity[1]) || 0,\n (gravity == null ? void 0 : gravity[2]) || 0,\n 0\n ];\n // mtlOptions.uniformValues = uniformValues;\n var material = Material.create(engine, mtlOptions);\n material.blending = true;\n material.depthTest = true;\n material.depthMask = !!occlusion;\n material.stencilRef = mask ? [\n mask,\n mask\n ] : undefined;\n setMaskMode(material, maskMode);\n setBlendMode(material, blending);\n setSideMode(material, side);\n Object.keys(uniformValues).map(function(name) {\n var value = uniformValues[name];\n if (_instanceof1(value, Texture)) {\n material.setTexture(name, value);\n return;\n }\n var res = [];\n switch(particleUniformTypeMap[name]){\n case \"vec4\":\n material.setVector4(name, Vector4$1.fromArray(value));\n break;\n case \"vec3\":\n material.setVector3(name, Vector3.fromArray(value));\n break;\n case \"vec2\":\n material.setVector2(name, Vector2.fromArray(value));\n break;\n case \"vec4Array\":\n for(var i = 0; i < value.length; i = i + 4){\n var v = new Vector4$1(value[i], value[i + 1], value[i + 2], value[i + 3]);\n res.push(v);\n }\n material.setVector4Array(name, res);\n res.length = 0;\n break;\n default:\n console.warn(\"Uniform \" + name + \"'s type not in typeMap.\");\n }\n });\n material.setVector3(\"emissionColor\", new Vector3(0, 0, 0));\n material.setFloat(\"emissionIntensity\", 0.0);\n var geometry = Geometry.create(engine, generateGeometryProps(maxCount * 4, this.useSprite, \"particle#\" + name));\n var mesh = Mesh.create(engine, {\n name: \"MParticle_\" + name,\n // priority: listIndex,\n material: material,\n geometry: geometry\n });\n this.anchor = anchor;\n this.mesh = mesh;\n this.geometry = mesh.firstGeometry();\n this.forceTarget = forceTarget;\n this.sizeOverLifetime = sizeOverLifetime;\n this.speedOverLifetime = speedOverLifetime;\n this.linearVelOverLifetime = linearVelOverLifetime;\n this.orbitalVelOverLifetime = orbitalVelOverLifetime;\n this.orbitalVelOverLifetime = orbitalVelOverLifetime;\n this.gravityModifier = gravityModifier;\n this.rotationOverLifetime = rotationOverLifetime;\n this.maxCount = maxCount;\n // this.duration = duration;\n this.textureOffsets = textureFlip ? [\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1\n ] : [\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1,\n 0\n ];\n this.time = 0;\n }\n var _proto = ParticleMesh.prototype;\n // get time () {\n // // const value = this.mesh.material.getVector4('uParams')!;\n // // return value.x;\n // return this._time;\n // }\n // set time (value: number) {\n // this._time = value;\n // // this.mesh.material.setVector4('uParams', new Vector4(+v, this.duration, 0, 0));\n // }\n _proto.getPointColor = function getPointColor(index) {\n var data = this.geometry.getAttributeData(\"aRot\");\n var i = index * 32 + 4;\n assertExist(data);\n return [\n data[i],\n data[i + 1],\n data[i + 2],\n data[i + 3]\n ];\n };\n _proto.clearPoints = function clearPoints() {\n this.resetGeometryData(this.geometry);\n this.particleCount = 0;\n this.geometry.setDrawCount(0);\n this.maxParticleBufferCount = 0;\n };\n _proto.resetGeometryData = function resetGeometryData(geometry) {\n var names = geometry.getAttributeNames();\n var index = geometry.getIndexData();\n for(var i = 0; i < names.length; i++){\n var name = names[i];\n var data = geometry.getAttributeData(name);\n if (data) {\n // @ts-expect-error\n geometry.setAttributeData(name, new data.constructor(0));\n }\n }\n // @ts-expect-error\n geometry.setIndexData(new index.constructor(0));\n };\n _proto.onUpdate = function onUpdate(dt) {\n var aPosArray = this.geometry.getAttributeData(\"aPos\"); // vector3\n var vertexCount = Math.ceil(aPosArray.length / 12);\n this.applyTranslation(vertexCount, dt);\n this.applyRotation(vertexCount, dt);\n this.applyLinearMove(vertexCount, dt);\n };\n _proto.minusTime = function minusTime(time) {\n var aOffset = this.geometry.getAttributeData(\"aOffset\");\n for(var i = 0; i < aOffset.length; i += 4){\n aOffset[i + 2] -= time;\n }\n this.geometry.setAttributeData(\"aOffset\", aOffset);\n this.time -= time;\n };\n _proto.removePoint = function removePoint(index) {\n if (index < this.particleCount) {\n this.geometry.setAttributeSubData(\"aOffset\", index * 16, new Float32Array(16));\n }\n };\n _proto.setPoint = function setPoint(index, point) {\n var maxCount = this.maxCount;\n if (index < maxCount) {\n var particleCount = index + 1;\n var vertexCount = particleCount * 4;\n var geometry = this.geometry;\n var increaseBuffer = particleCount > this.maxParticleBufferCount;\n var inc = 1;\n if (this.particleCount > 300) {\n inc = (this.particleCount + 100) / this.particleCount;\n } else if (this.particleCount > 100) {\n inc = 1.4;\n } else if (this.particleCount > 0) {\n inc = 2;\n }\n var pointData = {\n aPos: new Float32Array(48),\n aRot: new Float32Array(32),\n aOffset: new Float32Array(16),\n aTranslation: new Float32Array(12),\n aLinearMove: new Float32Array(12),\n aRotation0: new Float32Array(36)\n };\n var useSprite = this.useSprite;\n if (useSprite) {\n pointData.aSprite = new Float32Array(12);\n }\n var tempPos = new Vector3();\n var tempQuat = new Quaternion();\n var scale = new Vector3(1, 1, 1);\n point.transform.assignWorldTRS(tempPos, tempQuat, scale);\n var tempEuler = Transform.getRotation(tempQuat, new Euler());\n var position = tempPos.toArray();\n var rotation = tempEuler.toArray();\n var offsets = this.textureOffsets;\n var off = [\n 0,\n 0,\n point.delay,\n point.lifetime\n ];\n var wholeUV = [\n 0,\n 0,\n 1,\n 1\n ];\n var vel = point.vel;\n var color = point.color;\n var sizeOffsets = [\n -.5,\n .5,\n -.5,\n -.5,\n .5,\n .5,\n .5,\n -.5\n ];\n var seed = Math.random();\n var sprite;\n if (useSprite) {\n sprite = point.sprite;\n }\n for(var j = 0; j < 4; j++){\n var offset = j * 2;\n var j3 = j * 3;\n var j4 = j * 4;\n var j12 = j * 12;\n var j8 = j * 8;\n pointData.aPos.set(position, j12);\n vel.fill(pointData.aPos, j12 + 3);\n pointData.aRot.set(rotation, j8);\n pointData.aRot[j8 + 3] = seed;\n pointData.aRot.set(color, j8 + 4);\n if (useSprite) {\n // @ts-expect-error\n pointData.aSprite.set(sprite, j3);\n }\n var uv = point.uv || wholeUV;\n if (uv) {\n var uvy = useSprite ? 1 - offsets[offset + 1] : offsets[offset + 1];\n off[0] = uv[0] + offsets[offset] * uv[2];\n off[1] = uv[1] + uvy * uv[3];\n }\n pointData.aOffset.set(off, j4);\n var ji = j + j;\n var sx = (sizeOffsets[ji] - this.anchor.x) * scale.x;\n var sy = (sizeOffsets[ji + 1] - this.anchor.y) * scale.y;\n for(var k = 0; k < 3; k++){\n pointData.aPos[j12 + 6 + k] = point.dirX.getElement(k) * sx;\n pointData.aPos[j12 + 9 + k] = point.dirY.getElement(k) * sy;\n }\n }\n var indexData = new Uint16Array([\n 0,\n 1,\n 2,\n 2,\n 1,\n 3\n ].map(function(x) {\n return x + index * 4;\n }));\n if (increaseBuffer) {\n var baseIndexData = geometry.getIndexData();\n var idx = enlargeBuffer(baseIndexData, particleCount * 6, maxCount * 6, inc);\n idx.set(indexData, index * 6);\n geometry.setIndexData(idx);\n this.maxParticleBufferCount = idx.length / 6;\n } else {\n geometry.setIndexSubData(index * 6, indexData);\n }\n Object.keys(pointData).forEach(function(name) {\n var data = pointData[name];\n var attrSize = geometry.getAttributeStride(name) / Float32Array.BYTES_PER_ELEMENT;\n if (increaseBuffer) {\n var baseData = geometry.getAttributeData(name);\n assertExist(baseData);\n var geoData = enlargeBuffer(baseData, vertexCount * attrSize, maxCount * 4 * attrSize, inc);\n geoData.set(data, data.length * index);\n geometry.setAttributeData(name, geoData);\n } else {\n geometry.setAttributeSubData(name, data.length * index, data);\n }\n });\n this.particleCount = Math.max(particleCount, this.particleCount);\n geometry.setDrawCount(this.particleCount * 6);\n }\n };\n _proto.applyTranslation = function applyTranslation(vertexCount, deltaTime) {\n var localTime = this.time;\n var aTranslationArray = this.geometry.getAttributeData(\"aTranslation\");\n var aVelArray = this.geometry.getAttributeData(\"aVel\"); // vector3\n var aOffsetArray = this.geometry.getAttributeData(\"aOffset\");\n if (aTranslationArray.length < vertexCount * 3) {\n aTranslationArray = this.expandArray(aTranslationArray, vertexCount * 3);\n }\n // const velocity = this.cachedVelocity;\n var velocityX = 0;\n var velocityY = 0;\n var velocityZ = 0;\n var uAcceleration = this.mesh.material.getVector4(\"uAcceleration\");\n var uGravityModifierValue = this.mesh.material.getVector4(\"uGravityModifierValue\");\n for(var i = 0; i < vertexCount; i += 4){\n var velOffset = i * 12 + 3;\n velocityX = aVelArray[velOffset];\n velocityY = aVelArray[velOffset + 1];\n velocityZ = aVelArray[velOffset + 2];\n // velocity.set(aVelArray[velOffset], aVelArray[velOffset + 1], aVelArray[velOffset + 2]);\n var dt = localTime - aOffsetArray[i * 4 + 2]; // 相对delay的时间\n var duration = aOffsetArray[i * 4 + 3];\n if (uAcceleration && uGravityModifierValue) {\n var d = this.gravityModifier.getIntegrateValue(0, dt, duration);\n // const acc = this.tempVector3.set(uAcceleration.x * d, uAcceleration.y * d, uAcceleration.z * d);\n var accX = uAcceleration.x * d;\n var accY = uAcceleration.y * d;\n var accZ = uAcceleration.z * d;\n // speedIntegrate = speedOverLifetime.getIntegrateValue(0, time, duration);\n if (this.speedOverLifetime) {\n // dt / dur 归一化\n var speed = this.speedOverLifetime.getValue(dt / duration);\n velocityX = velocityX * speed + accX;\n velocityY = velocityY * speed + accY;\n velocityZ = velocityZ * speed + accZ;\n // velocity.multiply(speed).add(acc);\n } else {\n velocityX = velocityX + accX;\n velocityY = velocityY + accY;\n velocityZ = velocityZ + accZ;\n // velocity.add(acc);\n }\n }\n var aTranslationOffset = i * 3;\n if (aOffsetArray[i * 4 + 2] < localTime) {\n // const translation = velocity.multiply(deltaTime / 1000);\n var aTranslationX = velocityX * (deltaTime / 1000);\n var aTranslationY = velocityY * (deltaTime / 1000);\n var aTranslationZ = velocityZ * (deltaTime / 1000);\n aTranslationArray[aTranslationOffset] += aTranslationX;\n aTranslationArray[aTranslationOffset + 1] += aTranslationY;\n aTranslationArray[aTranslationOffset + 2] += aTranslationZ;\n aTranslationArray[aTranslationOffset + 3] += aTranslationX;\n aTranslationArray[aTranslationOffset + 4] += aTranslationY;\n aTranslationArray[aTranslationOffset + 5] += aTranslationZ;\n aTranslationArray[aTranslationOffset + 6] += aTranslationX;\n aTranslationArray[aTranslationOffset + 7] += aTranslationY;\n aTranslationArray[aTranslationOffset + 8] += aTranslationZ;\n aTranslationArray[aTranslationOffset + 9] += aTranslationX;\n aTranslationArray[aTranslationOffset + 10] += aTranslationY;\n aTranslationArray[aTranslationOffset + 11] += aTranslationZ;\n }\n }\n this.geometry.setAttributeData(\"aTranslation\", aTranslationArray);\n };\n _proto.applyRotation = function applyRotation(vertexCount, deltaTime) {\n var aRotationArray = this.geometry.getAttributeData(\"aRotation0\");\n var aOffsetArray = this.geometry.getAttributeData(\"aOffset\");\n var aRotArray = this.geometry.getAttributeData(\"aRot\"); // vector3\n var aSeedArray = this.geometry.getAttributeData(\"aSeed\"); // float\n var localTime = this.time;\n var aRotationMatrix = this.cachedRotationMatrix;\n if (aRotationArray.length < vertexCount * 9) {\n aRotationArray = this.expandArray(aRotationArray, vertexCount * 9);\n }\n for(var i = 0; i < vertexCount; i += 4){\n var time = localTime - aOffsetArray[i * 4 + 2];\n var duration = aOffsetArray[i * 4 + 3];\n var life = clamp$1(time / duration, 0.0, 1.0);\n var aRotOffset = i * 8;\n var aRot = this.cachedRotationVector3.set(aRotArray[aRotOffset], aRotArray[aRotOffset + 1], aRotArray[aRotOffset + 2]);\n var aSeed = aSeedArray[i * 8 + 3];\n var rotation = aRot;\n if (!this.rotationOverLifetime) {\n aRotationMatrix.setZero();\n } else {\n // Adjust rotation based on the specified lifetime components\n if (this.rotationOverLifetime.x) {\n if (_instanceof1(this.rotationOverLifetime.x, RandomValue)) {\n rotation.x += this.rotationOverLifetime.x.getValue(life, aSeed);\n } else {\n rotation.x += this.rotationOverLifetime.x.getValue(life);\n }\n }\n if (this.rotationOverLifetime.y) {\n if (_instanceof1(this.rotationOverLifetime.y, RandomValue)) {\n rotation.y += this.rotationOverLifetime.y.getValue(life, aSeed);\n } else {\n rotation.y += this.rotationOverLifetime.y.getValue(life);\n }\n }\n if (this.rotationOverLifetime.z) {\n if (_instanceof1(this.rotationOverLifetime.z, RandomValue)) {\n rotation.z += this.rotationOverLifetime.z.getValue(life, aSeed);\n } else {\n rotation.z += this.rotationOverLifetime.z.getValue(life);\n }\n }\n }\n // else {\n // // Adjust rotation based on the specified lifetime components\n // if (this.rotationOverLifetime.x) {\n // if (this.rotationOverLifetime.x instanceof RandomValue) {\n // rotation.x += this.rotationOverLifetime.x.getIntegrateValue(0.0, life, aSeed) * duration;\n // } else {\n // rotation.x += this.rotationOverLifetime.x.getIntegrateValue(0.0, life, duration) * duration;\n // }\n // }\n // if (this.rotationOverLifetime.y) {\n // if (this.rotationOverLifetime.y instanceof RandomValue) {\n // rotation.y += this.rotationOverLifetime.y.getIntegrateValue(0.0, life, aSeed) * duration;\n // } else {\n // rotation.y += this.rotationOverLifetime.y.getIntegrateValue(0.0, life, duration) * duration;\n // }\n // }\n // if (this.rotationOverLifetime.z) {\n // if (this.rotationOverLifetime.z instanceof RandomValue) {\n // rotation.z += this.rotationOverLifetime.z.getIntegrateValue(0.0, life, aSeed) * duration;\n // } else {\n // rotation.z += this.rotationOverLifetime.z.getIntegrateValue(0.0, life, duration) * duration;\n // }\n // }\n // }\n // If the rotation vector is zero, return the identity matrix\n if (rotation.dot(rotation) === 0.0) {\n aRotationMatrix.identity();\n }\n var d2r = Math.PI / 180;\n var rotationXD2r = rotation.x * d2r;\n var rotationYD2r = rotation.y * d2r;\n var rotationZD2r = rotation.z * d2r;\n var sinRX = Math.sin(rotationXD2r);\n var sinRY = Math.sin(rotationYD2r);\n var sinRZ = Math.sin(rotationZD2r);\n var cosRX = Math.cos(rotationXD2r);\n var cosRY = Math.cos(rotationYD2r);\n var cosRZ = Math.cos(rotationZD2r);\n // rotZ * rotY * rotX\n aRotationMatrix.set(cosRZ, -sinRZ, 0., sinRZ, cosRZ, 0., 0., 0., 1.); //rotZ\n aRotationMatrix.multiply(this.tempMatrix3.set(cosRY, 0., sinRY, 0., 1., 0., -sinRY, 0, cosRY)); //rotY\n aRotationMatrix.multiply(this.tempMatrix3.set(1., 0., 0., 0, cosRX, -sinRX, 0., sinRX, cosRX)); //rotX\n var aRotationOffset = i * 9;\n var matrixArray = aRotationMatrix.elements;\n aRotationArray.set(matrixArray, aRotationOffset);\n if (i + 4 <= vertexCount) {\n aRotationArray.set(matrixArray, aRotationOffset + 9);\n aRotationArray.set(matrixArray, aRotationOffset + 18);\n aRotationArray.set(matrixArray, aRotationOffset + 27);\n }\n }\n this.geometry.setAttributeData(\"aRotation0\", aRotationArray);\n };\n _proto.applyLinearMove = function applyLinearMove(vertexCount, deltaTime) {\n var aLinearMoveArray = this.geometry.getAttributeData(\"aLinearMove\");\n var aOffsetArray = this.geometry.getAttributeData(\"aOffset\");\n var aSeedArray = this.geometry.getAttributeData(\"aSeed\"); // float\n var localTime = this.time;\n if (aLinearMoveArray.length < vertexCount * 3) {\n aLinearMoveArray = this.expandArray(aLinearMoveArray, vertexCount * 3);\n }\n var linearMove = this.cachedLinearMove;\n if (this.linearVelOverLifetime && this.linearVelOverLifetime.enabled) {\n for(var i = 0; i < vertexCount; i += 4){\n var time = localTime - aOffsetArray[i * 4 + 2];\n var duration = aOffsetArray[i * 4 + 3];\n // const life = math.clamp(time / duration, 0.0, 1.0);\n var lifetime = time / duration;\n var aSeed = aSeedArray[i * 8 + 3];\n linearMove.setZero();\n if (this.linearVelOverLifetime.asMovement) {\n if (this.linearVelOverLifetime.x) {\n if (_instanceof1(this.linearVelOverLifetime.x, RandomValue)) {\n linearMove.x = this.linearVelOverLifetime.x.getValue(lifetime, aSeed);\n } else {\n linearMove.x = this.linearVelOverLifetime.x.getValue(lifetime);\n }\n }\n if (this.linearVelOverLifetime.y) {\n if (_instanceof1(this.linearVelOverLifetime.y, RandomValue)) {\n linearMove.y = this.linearVelOverLifetime.y.getValue(lifetime, aSeed);\n } else {\n linearMove.y = this.linearVelOverLifetime.y.getValue(lifetime);\n }\n }\n if (this.linearVelOverLifetime.z) {\n if (_instanceof1(this.linearVelOverLifetime.z, RandomValue)) {\n linearMove.z = this.linearVelOverLifetime.z.getValue(lifetime, aSeed);\n } else {\n linearMove.z = this.linearVelOverLifetime.z.getValue(lifetime);\n }\n }\n } else {\n // Adjust rotation based on the specified lifetime components\n if (this.linearVelOverLifetime.x) {\n if (_instanceof1(this.linearVelOverLifetime.x, RandomValue)) {\n linearMove.x = this.linearVelOverLifetime.x.getIntegrateValue(0.0, time, aSeed);\n } else {\n linearMove.x = this.linearVelOverLifetime.x.getIntegrateValue(0.0, time, duration);\n }\n }\n if (this.linearVelOverLifetime.y) {\n if (_instanceof1(this.linearVelOverLifetime.y, RandomValue)) {\n linearMove.y = this.linearVelOverLifetime.y.getIntegrateValue(0.0, time, aSeed);\n } else {\n linearMove.y = this.linearVelOverLifetime.y.getIntegrateValue(0.0, time, duration);\n }\n }\n if (this.linearVelOverLifetime.z) {\n if (_instanceof1(this.linearVelOverLifetime.z, RandomValue)) {\n linearMove.z = this.linearVelOverLifetime.z.getIntegrateValue(0.0, time, aSeed);\n } else {\n linearMove.z = this.linearVelOverLifetime.z.getIntegrateValue(0.0, time, duration);\n }\n }\n }\n var aLinearMoveOffset = i * 3;\n aLinearMoveArray[aLinearMoveOffset] = linearMove.x;\n aLinearMoveArray[aLinearMoveOffset + 1] = linearMove.y;\n aLinearMoveArray[aLinearMoveOffset + 2] = linearMove.z;\n aLinearMoveArray[aLinearMoveOffset + 3] = linearMove.x;\n aLinearMoveArray[aLinearMoveOffset + 4] = linearMove.y;\n aLinearMoveArray[aLinearMoveOffset + 5] = linearMove.z;\n aLinearMoveArray[aLinearMoveOffset + 6] = linearMove.x;\n aLinearMoveArray[aLinearMoveOffset + 7] = linearMove.y;\n aLinearMoveArray[aLinearMoveOffset + 8] = linearMove.z;\n aLinearMoveArray[aLinearMoveOffset + 9] = linearMove.x;\n aLinearMoveArray[aLinearMoveOffset + 10] = linearMove.y;\n aLinearMoveArray[aLinearMoveOffset + 11] = linearMove.z;\n }\n }\n this.geometry.setAttributeData(\"aLinearMove\", aLinearMoveArray);\n };\n _proto.expandArray = function expandArray(array, newSize) {\n var newArr = new Float32Array(newSize);\n newArr.set(array);\n return newArr;\n };\n return ParticleMesh;\n}();\nvar gl2UniformSlots = [\n 10,\n 32,\n 64,\n 160\n];\nfunction getSlot(count) {\n for(var w = 0; w < gl2UniformSlots.length; w++){\n var slot = gl2UniformSlots[w];\n if (slot > count) {\n return slot;\n }\n }\n return count || gl2UniformSlots[0];\n}\nfunction generateGeometryProps(maxVertex, useSprite, name) {\n var bpe = Float32Array.BYTES_PER_ELEMENT;\n var j12 = bpe * 12;\n var attributes = {\n aPos: {\n size: 3,\n offset: 0,\n stride: j12,\n data: new Float32Array(0)\n },\n aVel: {\n size: 3,\n offset: 3 * bpe,\n stride: j12,\n dataSource: \"aPos\"\n },\n aDirX: {\n size: 3,\n offset: 6 * bpe,\n stride: j12,\n dataSource: \"aPos\"\n },\n aDirY: {\n size: 3,\n offset: 9 * bpe,\n stride: j12,\n dataSource: \"aPos\"\n },\n //\n aRot: {\n size: 3,\n offset: 0,\n stride: 8 * bpe,\n data: new Float32Array(0)\n },\n aSeed: {\n size: 1,\n offset: 3 * bpe,\n stride: 8 * bpe,\n dataSource: \"aRot\"\n },\n aColor: {\n size: 4,\n offset: 4 * bpe,\n stride: 8 * bpe,\n dataSource: \"aRot\"\n },\n //\n aOffset: {\n size: 4,\n stride: 4 * bpe,\n data: new Float32Array(0)\n },\n aTranslation: {\n size: 3,\n data: new Float32Array(0)\n },\n aLinearMove: {\n size: 3,\n data: new Float32Array(0)\n },\n aRotation0: {\n size: 3,\n offset: 0,\n stride: 9 * bpe,\n data: new Float32Array(0)\n },\n aRotation1: {\n size: 3,\n offset: 3 * bpe,\n stride: 9 * bpe,\n dataSource: \"aRotation0\"\n },\n aRotation2: {\n size: 3,\n offset: 6 * bpe,\n stride: 9 * bpe,\n dataSource: \"aRotation0\"\n }\n };\n if (useSprite) {\n attributes[\"aSprite\"] = {\n size: 3,\n stride: 3 * bpe,\n data: new Float32Array(0)\n };\n }\n return {\n attributes: attributes,\n indices: {\n data: new Uint16Array(0)\n },\n name: name,\n maxVertex: maxVertex\n };\n}\nfunction getParticleMeshShader(item, gpuCapability, env) {\n if (env === void 0) env = \"\";\n var _props_renderer;\n var props = item.content;\n var renderMode = +(((_props_renderer = props.renderer) == null ? void 0 : _props_renderer.renderMode) || 0);\n var macros = [\n [\n \"RENDER_MODE\",\n renderMode\n ],\n [\n \"ENV_EDITOR\",\n env === PLAYER_OPTIONS_ENV_EDITOR\n ]\n ];\n var level = gpuCapability.level, detail = gpuCapability.detail;\n var vertexKeyFrameMeta = createKeyFrameMeta();\n var fragmentKeyFrameMeta = createKeyFrameMeta();\n var enableVertexTexture = detail.maxVertexUniforms > 0;\n var _props_positionOverLifetime;\n var speedOverLifetime = ((_props_positionOverLifetime = props.positionOverLifetime) != null ? _props_positionOverLifetime : {}).speedOverLifetime;\n var vertex_lookup_texture = 0;\n var shaderCacheId = 0;\n if (enableVertexTexture) {\n macros.push([\n \"ENABLE_VERTEX_TEXTURE\",\n true\n ]);\n }\n if (speedOverLifetime) {\n macros.push([\n \"SPEED_OVER_LIFETIME\",\n true\n ]);\n shaderCacheId |= 1 << 1;\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, speedOverLifetime);\n }\n var sprite = props.textureSheetAnimation;\n if (sprite && sprite.animate) {\n macros.push([\n \"USE_SPRITE\",\n true\n ]);\n shaderCacheId |= 1 << 2;\n }\n var colorOverLifetime = props.colorOverLifetime;\n if (colorOverLifetime && colorOverLifetime.color) {\n macros.push([\n \"COLOR_OVER_LIFETIME\",\n true\n ]);\n shaderCacheId |= 1 << 4;\n }\n var opacity = colorOverLifetime && colorOverLifetime.opacity;\n if (opacity) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, opacity);\n }\n var positionOverLifetime = props.positionOverLifetime;\n var useOrbitalVel;\n [\n \"x\",\n \"y\",\n \"z\"\n ].forEach(function(pro, i) {\n var defL = 0;\n var linearPro = \"linear\" + pro.toUpperCase();\n var orbitalPro = \"orbital\" + pro.toUpperCase();\n if (positionOverLifetime == null ? void 0 : positionOverLifetime[linearPro]) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime[linearPro]);\n defL = 1;\n shaderCacheId |= 1 << 7 + i;\n }\n macros.push([\n \"LINEAR_VEL_\" + pro.toUpperCase(),\n defL\n ]);\n var defO = 0;\n if (positionOverLifetime == null ? void 0 : positionOverLifetime[orbitalPro]) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime[orbitalPro]);\n defO = 1;\n shaderCacheId |= 1 << 10 + i;\n useOrbitalVel = true;\n }\n macros.push([\n \"ORB_VEL_\" + pro.toUpperCase(),\n defO\n ]);\n });\n if (positionOverLifetime == null ? void 0 : positionOverLifetime.asMovement) {\n macros.push([\n \"AS_LINEAR_MOVEMENT\",\n true\n ]);\n shaderCacheId |= 1 << 5;\n }\n if (useOrbitalVel) {\n if (positionOverLifetime == null ? void 0 : positionOverLifetime.asRotation) {\n macros.push([\n \"AS_ORBITAL_MOVEMENT\",\n true\n ]);\n shaderCacheId |= 1 << 6;\n }\n }\n if (props.sizeOverLifetime) {\n var sizeOverLifetime = props.sizeOverLifetime;\n var separateAxes = sizeOverLifetime.separateAxes;\n if (separateAxes) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.x);\n macros.push([\n \"SIZE_Y_BY_LIFE\",\n 1\n ]);\n shaderCacheId |= 1 << 14;\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.y);\n } else {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.size);\n }\n }\n if (props.rotationOverLifetime) {\n var rot = props.rotationOverLifetime;\n if (rot.z) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot == null ? void 0 : rot.z);\n shaderCacheId |= 1 << 15;\n macros.push([\n \"ROT_Z_LIFETIME\",\n 1\n ]);\n }\n if (rot.separateAxes) {\n if (rot.x) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot.x);\n shaderCacheId |= 1 << 16;\n macros.push([\n \"ROT_X_LIFETIME\",\n 1\n ]);\n }\n if (rot.y) {\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot.y);\n shaderCacheId |= 1 << 17;\n macros.push([\n \"ROT_Y_LIFETIME\",\n 1\n ]);\n }\n }\n if (rot == null ? void 0 : rot.asRotation) {\n macros.push([\n \"ROT_LIFETIME_AS_MOVEMENT\",\n 1\n ]);\n shaderCacheId |= 1 << 18;\n }\n }\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime == null ? void 0 : positionOverLifetime.gravityOverLifetime);\n var forceOpt = positionOverLifetime == null ? void 0 : positionOverLifetime.forceTarget;\n if (forceOpt) {\n macros.push([\n \"FINAL_TARGET\",\n true\n ]);\n shaderCacheId |= 1 << 19;\n getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime.forceCurve);\n }\n var HALF_FLOAT = detail.halfFloatTexture;\n if (HALF_FLOAT && fragmentKeyFrameMeta.max) {\n shaderCacheId |= 1 << 20;\n }\n var maxVertexUniforms = detail.maxVertexUniforms;\n var vertexCurveTexture = vertexKeyFrameMeta.max + vertexKeyFrameMeta.curves.length - 32 > maxVertexUniforms;\n if (getConfig(RENDER_PREFER_LOOKUP_TEXTURE)) {\n vertexCurveTexture = true;\n }\n if (level === 2) {\n vertexKeyFrameMeta.max = -1;\n // vertexKeyFrameMeta.index = getSlot(vertexKeyFrameMeta.index);\n if (fragmentKeyFrameMeta.index > 0) {\n fragmentKeyFrameMeta.max = -1;\n // fragmentKeyFrameMeta.index = getSlot(fragmentKeyFrameMeta.index);\n }\n }\n if (vertexCurveTexture && HALF_FLOAT && enableVertexTexture) {\n vertex_lookup_texture = 1;\n }\n var shaderCache = [\n \"-p:\",\n renderMode,\n shaderCacheId,\n vertexKeyFrameMeta.index,\n vertexKeyFrameMeta.max,\n fragmentKeyFrameMeta.index,\n fragmentKeyFrameMeta.max\n ].join(\"+\");\n var shader = {\n fragment: particleFrag,\n vertex: \"#define LOOKUP_TEXTURE_CURVE \" + vertex_lookup_texture + \"\\n\" + particleVert,\n shared: true,\n cacheId: shaderCache,\n macros: macros,\n name: \"particle#\" + item.name\n };\n macros.push([\n \"VERT_CURVE_VALUE_COUNT\",\n vertexKeyFrameMeta.index\n ], [\n \"FRAG_CURVE_VALUE_COUNT\",\n fragmentKeyFrameMeta.index\n ], [\n \"VERT_MAX_KEY_FRAME_COUNT\",\n vertexKeyFrameMeta.max\n ], [\n \"FRAG_MAX_KEY_FRAME_COUNT\",\n fragmentKeyFrameMeta.max\n ]);\n return {\n shader: shader,\n vertex: vertexKeyFrameMeta.index,\n fragment: fragmentKeyFrameMeta.index\n };\n}\nfunction modifyMaxKeyframeShader(shader, maxVertex, maxFrag) {\n var _shader_cacheId;\n var shaderIds = (_shader_cacheId = shader.cacheId) == null ? void 0 : _shader_cacheId.split(\"+\");\n shaderIds[3] = maxVertex;\n shaderIds[5] = maxFrag;\n shader.cacheId = shaderIds.join(\"+\");\n if (!shader.macros) {\n return;\n }\n for(var i = 0; i < shader.macros.length; i++){\n var marco = shader.macros[i];\n if (marco[0] === \"VERT_CURVE_VALUE_COUNT\") {\n marco[1] = maxVertex;\n } else if (marco[0] === \"FRAG_CURVE_VALUE_COUNT\") {\n marco[1] = maxFrag;\n break;\n }\n }\n}\n\n/**\n * @since 2.0.0\n */ var ParticleSystemRenderer = /*#__PURE__*/ function(RendererComponent) {\n _inherits(ParticleSystemRenderer, RendererComponent);\n function ParticleSystemRenderer(engine, particleMeshProps, trailMeshProps) {\n var _this;\n _this = RendererComponent.call(this, engine) || this;\n _this.name = \"ParticleSystemRenderer\";\n if (particleMeshProps) {\n _this.particleMesh = new ParticleMesh(engine, particleMeshProps);\n }\n if (trailMeshProps) {\n _this.trailMesh = new TrailMesh(engine, trailMeshProps);\n }\n var meshes = [\n _this.particleMesh.mesh\n ];\n _this.materials.push(_this.particleMesh.mesh.material);\n if (_this.trailMesh) {\n meshes.push(_this.trailMesh.mesh);\n _this.materials.push(_this.trailMesh.mesh.material);\n }\n _this.meshes = meshes;\n return _this;\n }\n var _proto = ParticleSystemRenderer.prototype;\n _proto.onStart = function onStart() {\n this._priority = this.item.renderOrder;\n this.particleMesh.gravityModifier.scaleXCoord(this.item.duration);\n for(var _iterator = _create_for_of_iterator_helper_loose(this.meshes), _step; !(_step = _iterator()).done;){\n var mesh = _step.value;\n mesh.onStart();\n }\n };\n _proto.onUpdate = function onUpdate(dt) {\n var time = this.particleMesh.time;\n var _this_particleMesh_mesh_material_getVector4;\n var uParams = (_this_particleMesh_mesh_material_getVector4 = this.particleMesh.mesh.material.getVector4(\"uParams\")) != null ? _this_particleMesh_mesh_material_getVector4 : new Vector4$1();\n this.particleMesh.mesh.material.setVector4(\"uParams\", uParams.set(time, this.item.duration, 0, 0));\n };\n _proto.render = function render(renderer) {\n this.maskManager.drawStencilMask(renderer);\n for(var _iterator = _create_for_of_iterator_helper_loose(this.meshes), _step; !(_step = _iterator()).done;){\n var mesh = _step.value;\n mesh.render(renderer);\n }\n };\n _proto.reset = function reset() {\n var _this_trailMesh;\n this.particleMesh.clearPoints();\n (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.clearAllTrails();\n };\n _proto.updateTime = function updateTime(now, delta) {\n this.particleMesh.time = now;\n this.particleMesh.onUpdate(delta);\n if (this.trailMesh) {\n this.trailMesh.time = now;\n this.trailMesh.onUpdate(delta);\n }\n };\n _proto.minusTimeForLoop = function minusTimeForLoop(duration) {\n var _this_trailMesh;\n this.particleMesh.minusTime(duration);\n (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.minusTime(duration);\n };\n _proto.updateWorldMatrix = function updateWorldMatrix(worldMatrix) {\n this.particleMesh.mesh.worldMatrix = worldMatrix;\n if (this.trailMesh) {\n this.trailMesh.mesh.worldMatrix = worldMatrix;\n }\n };\n _proto.setVisible = function setVisible(visible) {\n var _this_trailMesh;\n this.particleMesh.mesh.setVisible(visible);\n (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.mesh.setVisible(visible);\n };\n _proto.getTextures = function getTextures() {\n var textures = [];\n // @ts-expect-error textures 是否可以考虑挂在 Material 上\n var particleMeshTextures = this.particleMesh.mesh.material.textures;\n Object.keys(particleMeshTextures).forEach(function(key) {\n textures.push(particleMeshTextures[key]);\n });\n if (this.trailMesh) {\n // @ts-expect-error 同上\n var trailMeshTextures = this.trailMesh.mesh.material.textures;\n Object.keys(trailMeshTextures).forEach(function(key) {\n textures.push(trailMeshTextures[key]);\n });\n }\n return textures;\n };\n _proto.setParticlePoint = function setParticlePoint(index, point) {\n this.particleMesh.setPoint(index, point);\n };\n _proto.removeParticlePoint = function removeParticlePoint(index) {\n this.particleMesh.removePoint(index);\n };\n _proto.getParticlePointColor = function getParticlePointColor(index) {\n return this.particleMesh.getPointColor(index);\n };\n _proto.hasTrail = function hasTrail() {\n return this.trailMesh !== undefined;\n };\n _proto.clearTrail = function clearTrail(pointIndex) {\n var _this_trailMesh;\n (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.clearTrail(pointIndex);\n };\n _proto.addTrailPoint = function addTrailPoint(index, position, options) {\n var _this_trailMesh;\n (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.addPoint(index, position, options);\n };\n _proto.setTrailStartPosition = function setTrailStartPosition(index, position) {\n var _this_trailMesh;\n (_this_trailMesh = this.trailMesh) == null ? void 0 : _this_trailMesh.setPointStartPos(index, position);\n };\n _proto.getTrailStartPosition = function getTrailStartPosition(index) {\n return this.trailMesh.getPointStartPos(index);\n };\n return ParticleSystemRenderer;\n}(RendererComponent);\n\nexports.ParticleSystem = /*#__PURE__*/ function(Component) {\n _inherits(ParticleSystem, Component);\n function ParticleSystem(engine, props) {\n var _this;\n _this = Component.call(this, engine) || this;\n _this.destroyed = false;\n _this.getHitTestParams = function(force) {\n var interactParams = _this.interaction;\n if (force || interactParams) {\n return {\n type: exports.HitTestType.custom,\n collect: function(ray) {\n return _this.raycast({\n radius: (interactParams == null ? void 0 : interactParams.radius) || 0.4,\n multiple: !!(interactParams == null ? void 0 : interactParams.multiple),\n removeParticle: (interactParams == null ? void 0 : interactParams.behavior) === ParticleInteractionBehavior.removeParticle,\n ray: ray\n });\n }\n };\n }\n };\n _this.maskManager = new MaskProcessor(engine);\n if (props) {\n _this.fromData(props);\n }\n return _this;\n }\n var _proto = ParticleSystem.prototype;\n _proto.isFrozen = function isFrozen() {\n return this.frozen;\n };\n _proto.isEnded = function isEnded() {\n return this.ended;\n };\n _proto.initEmitterTransform = function initEmitterTransform() {\n var position = this.item.transform.position.clone();\n var rotation = this.item.transform.rotation.clone();\n var transformPath = this.props.emitterTransform && this.props.emitterTransform.path;\n var path;\n if (transformPath) {\n if (transformPath[0] === ValueType.CONSTANT_VEC3) {\n position.add(transformPath[1]);\n } else {\n path = createValueGetter(transformPath);\n }\n }\n this.basicTransform = {\n position: position,\n rotation: rotation,\n path: path\n };\n var selfPos = position.clone();\n if (path) {\n selfPos.add(path.getValue(0));\n }\n this.transform.setPosition(selfPos.x, selfPos.y, selfPos.z);\n if (this.options.particleFollowParent) {\n var worldMatrix = this.transform.getWorldMatrix();\n this.renderer.updateWorldMatrix(worldMatrix);\n }\n };\n _proto.updateEmitterTransform = function updateEmitterTransform(time) {\n var _this_basicTransform = this.basicTransform, path = _this_basicTransform.path, position = _this_basicTransform.position;\n var selfPos = position.clone();\n if (path) {\n var duration = this.item.duration;\n selfPos.add(path.getValue(time / duration));\n }\n this.transform.setPosition(selfPos.x, selfPos.y, selfPos.z);\n if (this.options.particleFollowParent) {\n var worldMatrix = this.transform.getWorldMatrix();\n this.renderer.updateWorldMatrix(worldMatrix);\n }\n };\n _proto.addParticle = function addParticle(point, maxCount) {\n var link = this.particleLink;\n var linkContent = [\n point.delay + point.lifetime,\n 0,\n point.delay,\n point\n ];\n var pointIndex;\n if (link.length < maxCount) {\n pointIndex = linkContent[1] = link.length;\n } else {\n var first = link.first;\n link.removeNode(first);\n pointIndex = linkContent[1] = first.content[1];\n }\n link.pushNode(linkContent);\n this.renderer.setParticlePoint(pointIndex, point);\n this.clearPointTrail(pointIndex);\n if (this.transform.parentTransform) {\n this.renderer.setTrailStartPosition(pointIndex, this.transform.parentTransform.position.clone());\n }\n };\n _proto.setVisible = function setVisible(visible) {\n this.renderer.setVisible(visible);\n };\n _proto.setOpacity = function setOpacity(opacity) {\n var _material_getVector4;\n var material = this.renderer.particleMesh.mesh.material;\n var geometry = this.renderer.particleMesh.mesh.geometry;\n var originalColor = ((_material_getVector4 = material.getVector4(\"uOpacityOverLifetimeValue\")) == null ? void 0 : _material_getVector4.toArray()) || [\n 1,\n 1,\n 1,\n 1\n ];\n material.setVector4(\"uOpacityOverLifetimeValue\", new Vector4$1(originalColor[0], originalColor[1], originalColor[2], opacity));\n var data = geometry.getAttributeData(\"aColor\") || [];\n for(var i = 0; i < data.length; i += 32){\n data[i * 8 + 7] = opacity;\n }\n };\n /**\n * @internal\n */ _proto.setColor = function setColor(r, g, b, a) {\n var _material_getVector4;\n var material = this.renderer.particleMesh.mesh.material;\n var geometry = this.renderer.particleMesh.mesh.geometry;\n var originalColor = ((_material_getVector4 = material.getVector4(\"uOpacityOverLifetimeValue\")) == null ? void 0 : _material_getVector4.toArray()) || [\n 1,\n 1,\n 1,\n 1\n ];\n material.setVector4(\"uOpacityOverLifetimeValue\", new Vector4$1(originalColor[0], originalColor[1], originalColor[2], a));\n var data = geometry.getAttributeData(\"aColor\") || [];\n for(var i = 0; i < data.length; i += 32){\n data[i * 8 + 4] = r;\n data[i * 8 + 5] = g;\n data[i * 8 + 6] = b;\n data[i * 8 + 7] = a;\n }\n };\n _proto.setParentTransform = function setParentTransform(transform) {};\n _proto.getTextures = function getTextures() {\n return this.renderer.getTextures();\n };\n _proto.startEmit = function startEmit() {\n if (!this.started || this.ended) {\n this.reset();\n this.started = true;\n this.ended = false;\n }\n };\n _proto.stop = function stop() {\n this.ended = true;\n this.started = false;\n };\n _proto.reset = function reset() {\n this.renderer.reset();\n this.lastUpdate = 0;\n this.loopStartTime = 0;\n this.lastEmitTime = -1 / this.emission.rateOverTime.getValue(0);\n this.generatedCount = 0;\n this.particleLink = new Link(function(a, b) {\n return a[0] - b[0];\n });\n this.emission.bursts.forEach(function(b) {\n return b.reset();\n });\n this.frozen = false;\n this.ended = false;\n this.destroyed = false;\n };\n _proto.update = function update(delta) {\n var _this = this;\n if (this.started && !this.frozen) {\n var now = this.lastUpdate + delta / 1000;\n var options = this.options;\n var loopStartTime = this.loopStartTime;\n var emission = this.emission;\n this.lastUpdate = now;\n this.upDirectionWorld = null;\n this.renderer.updateTime(now, delta);\n var link = this.particleLink;\n var emitterLifetime = (now - loopStartTime) / this.item.duration;\n var timePassed = this.timePassed;\n var trailUpdated = false;\n var updateTrail = function() {\n if (_this.trails && !trailUpdated) {\n trailUpdated = true;\n link.forEach(function(param) {\n var time = param[0], pointIndex = param[1], delay = param[2], point = param[3];\n if (time < timePassed) {\n _this.clearPointTrail(pointIndex);\n } else if (timePassed > delay) {\n _this.updatePointTrail(pointIndex, emitterLifetime, point, delay);\n }\n });\n }\n };\n if (!this.ended) {\n var duration = this.item.duration;\n var lifetime = this.lifetime;\n if (timePassed < duration) {\n var interval = 1 / emission.rateOverTime.getValue(lifetime);\n var pointCount = Math.floor((timePassed - this.lastEmitTime) / interval);\n var maxEmissionCount = pointCount;\n var timeDelta = interval / pointCount;\n var meshTime = now;\n var maxCount = options.maxCount;\n this.updateEmitterTransform(timePassed);\n var shouldSkipGenerate = function() {\n var first = link.first;\n return _this.emissionStopped || link.length === maxCount && first && first.content[0] - loopStartTime > timePassed;\n };\n for(var i = 0; i < maxEmissionCount && i < maxCount; i++){\n if (shouldSkipGenerate()) {\n break;\n }\n var p = this.createPoint(lifetime);\n p.delay += meshTime + i * timeDelta;\n this.addParticle(p, maxCount);\n this.lastEmitTime = timePassed;\n }\n var bursts = emission.bursts;\n for(var j = (bursts == null ? void 0 : bursts.length) - 1, cursor = 0; j >= 0 && cursor < maxCount; j--){\n if (shouldSkipGenerate()) {\n break;\n }\n var burst = bursts[j];\n var opts = !burst.disabled && burst.getGeneratorOptions(timePassed, lifetime);\n if (opts) {\n var originVec = [\n 0,\n 0,\n 0\n ];\n var offsets = emission.burstOffsets[j];\n var burstOffset = offsets && offsets[opts.cycleIndex] || originVec;\n if (burst.once) {\n this.removeBurst(j);\n }\n for(var i1 = 0; i1 < opts.count && cursor < maxCount; i1++){\n var _p_transform;\n if (shouldSkipGenerate()) {\n break;\n }\n var p1 = this.initPoint(this.shape.generate({\n total: opts.total,\n index: opts.index,\n burstIndex: i1,\n burstCount: opts.count\n }));\n p1.delay += meshTime;\n cursor++;\n (_p_transform = p1.transform).translate.apply(_p_transform, [].concat(burstOffset));\n this.addParticle(p1, maxCount);\n }\n }\n }\n } else if (this.item.endBehavior === EndBehavior.restart) {\n updateTrail();\n this.loopStartTime = now - duration;\n this.lastEmitTime -= duration;\n this.lastUpdate -= duration;\n emission.bursts.forEach(function(b) {\n return b.reset();\n });\n this.particleLink.forEach(function(content) {\n content[0] -= duration;\n content[2] -= duration;\n content[3].delay -= duration;\n });\n this.renderer.minusTimeForLoop(duration);\n } else {\n this.ended = true;\n var endBehavior = this.item.endBehavior;\n if (endBehavior === EndBehavior.freeze) {\n this.frozen = true;\n }\n }\n } else if (this.item.endBehavior !== EndBehavior.restart) {\n if (EndBehavior.destroy === this.item.endBehavior) {\n var node = link.last;\n if (node && node.content[0] < this.lastUpdate) {\n this.destroyed = true;\n }\n }\n }\n updateTrail();\n }\n };\n _proto.onDestroy = function onDestroy() {\n if (this.item && this.item.composition) {\n this.meshes.forEach(function(mesh) {\n return mesh.dispose({\n material: {\n textures: exports.DestroyOptions.keep\n }\n });\n });\n }\n };\n _proto.getParticleBoxes = function getParticleBoxes() {\n var link = this.particleLink;\n var renderer = this.renderer;\n var res = [];\n var maxCount = this.particleCount;\n var counter = 0;\n if (!(link && renderer)) {\n return res;\n }\n var node = link.last;\n var finish = false;\n while(!finish){\n var currentTime = node.content[0];\n var point = node.content[3];\n if (currentTime > this.timePassed) {\n var pos = this.getPointPosition(point);\n res.push({\n center: pos,\n size: point.transform.scale\n });\n if (node.pre) {\n node = node.pre;\n } else {\n finish = true;\n }\n }\n counter++;\n if (counter > maxCount) {\n finish = true;\n }\n }\n return res;\n };\n _proto.raycast = function raycast(options) {\n var link = this.particleLink;\n var renderer = this.renderer;\n if (!(link && renderer)) {\n return;\n }\n var node = link.last;\n var hitPositions = [];\n var temp = new Vector3();\n var finish = false;\n if (node && node.content) {\n do {\n var _node_content = node.content, currentTime = _node_content[0], pointIndex = _node_content[1]; _node_content[2]; var point = _node_content[3];\n if (currentTime > this.timePassed) {\n var pos = this.getPointPosition(point);\n var ray = options.ray;\n var pass = false;\n if (ray) {\n pass = !!ray.intersectSphere({\n center: pos,\n radius: options.radius\n }, temp);\n }\n if (pass) {\n if (options.removeParticle) {\n renderer.removeParticlePoint(pointIndex);\n this.clearPointTrail(pointIndex);\n node.content = [\n 0\n ];\n }\n hitPositions.push(pos);\n if (!options.multiple) {\n finish = true;\n }\n }\n } else {\n break;\n }\n // @ts-expect-error\n }while ((node = node.pre) && !finish);\n }\n return hitPositions;\n };\n _proto.clearPointTrail = function clearPointTrail(pointIndex) {\n if (this.trails && this.trails.dieWithParticles) {\n this.renderer.clearTrail(pointIndex);\n }\n };\n _proto.updatePointTrail = function updatePointTrail(pointIndex, emitterLifetime, point, startTime) {\n var renderer = this.renderer;\n if (!renderer.hasTrail()) {\n return;\n }\n var trails = this.trails;\n var position = this.getPointPosition(point);\n var color = trails.inheritParticleColor ? renderer.getParticlePointColor(pointIndex) : [\n 1,\n 1,\n 1,\n 1\n ];\n var size = point.transform.getWorldScale().toArray();\n var width = 1;\n var lifetime = trails.lifetime.getValue(emitterLifetime);\n if (trails.sizeAffectsWidth) {\n width *= size[0];\n }\n if (trails.sizeAffectsLifetime) {\n lifetime *= size[0];\n }\n if (trails.parentAffectsPosition && this.transform.parentTransform) {\n position.add(this.transform.parentTransform.position);\n var pos = renderer.getTrailStartPosition(pointIndex);\n if (pos) {\n position.subtract(pos);\n }\n }\n renderer.addTrailPoint(pointIndex, position, {\n color: color,\n lifetime: lifetime,\n size: width,\n time: startTime\n });\n };\n /**\n * 通过索引获取指定index粒子当前时刻的位置\n * @params index - 粒子索引\n */ _proto.getPointPositionByIndex = function getPointPositionByIndex(index) {\n var point = this.particleLink.getNodeByIndex(index);\n if (!point) {\n console.error(\"Get point error.\");\n return null;\n } else {\n return this.getPointPosition(point.content[3]);\n }\n };\n /**\n * 通过粒子参数获取当前时刻粒子的位置\n */ _proto.getPointPosition = function getPointPosition(point) {\n var transform = point.transform, vel = point.vel, lifetime = point.lifetime, delay = point.delay, _point_gravity = point.gravity, gravity = _point_gravity === void 0 ? [] : _point_gravity;\n var forceTarget = this.options.forceTarget;\n var time = this.lastUpdate - delay;\n var tempPos = new Vector3();\n var acc = Vector3.fromArray(gravity);\n transform.assignWorldTRS(tempPos);\n var ret = calculateTranslation(new Vector3(), this.options, acc, time, lifetime, tempPos, vel);\n if (forceTarget) {\n var target = forceTarget.target || [\n 0,\n 0,\n 0\n ];\n var life = forceTarget.curve.getValue(time / lifetime);\n var dl = 1 - life;\n ret.x = ret.x * dl + target[0] * life;\n ret.y = ret.y * dl + target[1] * life;\n ret.z = ret.z * dl + target[2] * life;\n }\n return ret;\n };\n _proto.initPoint = function initPoint(data) {\n var options = this.options;\n var lifetime = this.lifetime;\n var shape = this.shape;\n var speed = options.startSpeed.getValue(lifetime);\n var matrix4 = options.particleFollowParent ? Matrix4$1.IDENTITY : this.transform.getWorldMatrix();\n var pointPosition = data.position;\n // 粒子的位置受发射器的位置影响,自身的旋转和缩放不受影响\n var position = matrix4.transformPoint(pointPosition, new Vector3());\n var transform = new Transform({\n position: position,\n valid: true\n });\n var direction = data.direction;\n direction = matrix4.transformNormal(direction, tempDir).normalize();\n if (options.startTurbulence && options.turbulence) {\n for(var i = 0; i < 3; i++){\n tempVec3.setElement(i, options.turbulence[i].getValue(lifetime));\n }\n tempEuler.setFromVector3(tempVec3.negate());\n var mat4 = tempMat4.setFromEuler(tempEuler);\n mat4.transformNormal(direction).normalize();\n }\n var dirX = tmpDirX;\n var dirY = tmpDirY;\n if (shape.alignSpeedDirection) {\n dirY.copyFrom(direction);\n if (!this.upDirectionWorld) {\n if (shape.upDirection) {\n this.upDirectionWorld = shape.upDirection.clone();\n } else {\n this.upDirectionWorld = Vector3.Z.clone();\n }\n matrix4.transformNormal(this.upDirectionWorld);\n }\n dirX.crossVectors(dirY, this.upDirectionWorld).normalize();\n // FIXME: 原先因为有精度问题,这里dirX不是0向量\n if (dirX.isZero()) {\n dirX.set(1, 0, 0);\n }\n } else {\n dirX.set(1, 0, 0);\n dirY.set(0, 1, 0);\n }\n var sprite;\n var tsa = this.textureSheetAnimation;\n if (tsa && tsa.animate) {\n sprite = tempSprite;\n sprite[0] = tsa.animationDelay.getValue(lifetime);\n sprite[1] = tsa.animationDuration.getValue(lifetime);\n sprite[2] = tsa.cycles.getValue(lifetime);\n }\n var rot = tempRot$1;\n if (options.start3DRotation) {\n // @ts-expect-error\n rot.set(options.startRotationX.getValue(lifetime), options.startRotationY.getValue(lifetime), options.startRotationZ.getValue(lifetime));\n } else if (options.startRotation) {\n rot.set(0, 0, options.startRotation.getValue(lifetime));\n } else {\n rot.set(0, 0, 0);\n }\n transform.setRotation(rot.x, rot.y, rot.z);\n var color = options.startColor.getValue(lifetime);\n if (color.length === 3) {\n color[3] = 1;\n }\n var size = tempSize$1;\n if (options.start3DSize) {\n size.x = options.startSizeX.getValue(lifetime);\n size.y = options.startSizeY.getValue(lifetime);\n } else {\n var n = options.startSize.getValue(lifetime);\n var aspect = options.sizeAspect.getValue(lifetime);\n size.x = n;\n // 兼容aspect为0的情况\n size.y = aspect === 0 ? 0 : n / aspect;\n // size[1] = n / aspect;\n }\n var vel = direction.clone();\n vel.multiply(speed);\n // 粒子的大小受发射器父节点的影响\n if (!options.particleFollowParent) {\n var tempScale = new Vector3();\n this.transform.assignWorldTRS(undefined, undefined, tempScale);\n size.x *= tempScale.x;\n size.y *= tempScale.y;\n }\n transform.setScale(size.x, size.y, 1);\n return {\n size: size,\n vel: vel,\n color: color,\n delay: options.startDelay.getValue(lifetime),\n lifetime: options.startLifetime.getValue(lifetime),\n uv: randomArrItem(this.uvs, true),\n gravity: options.gravity,\n sprite: sprite,\n dirY: dirY,\n dirX: dirX,\n transform: transform\n };\n };\n _proto.addBurst = function addBurst(burst, offsets) {\n var willAdd = false;\n if (!this.emission.bursts.includes(burst)) {\n this.emission.bursts.push(burst);\n willAdd = true;\n }\n if (willAdd && _instanceof1(offsets, Array)) {\n var index = this.emission.bursts.indexOf(burst);\n this.emission.burstOffsets[index] = offsets;\n return index;\n }\n return -1;\n };\n _proto.removeBurst = function removeBurst(index) {\n if (index < this.emission.bursts.length) {\n this.emission.burstOffsets[index] = null;\n this.emission.bursts.splice(index, 1);\n }\n };\n _proto.createPoint = function createPoint(lifetime) {\n var generator = {\n total: this.emission.rateOverTime.getValue(lifetime),\n index: this.generatedCount,\n burstIndex: 0,\n burstCount: 0\n };\n this.generatedCount++;\n return this.initPoint(this.shape.generate(generator));\n };\n _proto.stopParticleEmission = function stopParticleEmission() {\n this.emissionStopped = true;\n };\n _proto.resumeParticleEmission = function resumeParticleEmission() {\n this.emissionStopped = false;\n };\n _proto.getBoundingBox = function getBoundingBox() {\n var area = this.getParticleBoxes();\n return {\n type: exports.HitTestType.sphere,\n area: area\n };\n };\n _proto.fromData = function fromData(data) {\n Component.prototype.fromData.call(this, data);\n var props = data;\n this.props = props;\n this.destroyed = false;\n var cachePrefix = \"\";\n var options = props.options, _props_positionOverLifetime = props.positionOverLifetime, positionOverLifetime = _props_positionOverLifetime === void 0 ? {} : _props_positionOverLifetime, shape = props.shape;\n var gravityModifier = positionOverLifetime == null ? void 0 : positionOverLifetime.gravityOverLifetime;\n var gravity = ensureVec3(positionOverLifetime == null ? void 0 : positionOverLifetime.gravity);\n var _textureSheetAnimation = props.textureSheetAnimation;\n var textureSheetAnimation = _textureSheetAnimation ? {\n animationDelay: createValueGetter(_textureSheetAnimation.animationDelay || 0),\n animationDuration: createValueGetter(_textureSheetAnimation.animationDuration || 1),\n cycles: createValueGetter(_textureSheetAnimation.cycles || 1),\n animate: _textureSheetAnimation.animate,\n col: _textureSheetAnimation.col,\n row: _textureSheetAnimation.row,\n total: _textureSheetAnimation.total || _textureSheetAnimation.col * _textureSheetAnimation.row\n } : undefined;\n var startTurbulence = !!(shape && shape.turbulenceX || (shape == null ? void 0 : shape.turbulenceY) || (shape == null ? void 0 : shape.turbulenceZ));\n var turbulence;\n if (startTurbulence) {\n var _shape_turbulenceX, _shape_turbulenceY, _shape_turbulenceZ;\n turbulence = [\n createValueGetter((_shape_turbulenceX = shape.turbulenceX) != null ? _shape_turbulenceX : 0),\n createValueGetter((_shape_turbulenceY = shape.turbulenceY) != null ? _shape_turbulenceY : 0),\n createValueGetter((_shape_turbulenceZ = shape.turbulenceZ) != null ? _shape_turbulenceZ : 0)\n ];\n }\n this.name = \"ParticleSystem\";\n this.shape = createShape(shape);\n var _props_emission_burstOffsets;\n this.emission = {\n rateOverTime: createValueGetter(props.emission.rateOverTime),\n burstOffsets: getBurstOffsets((_props_emission_burstOffsets = props.emission.burstOffsets) != null ? _props_emission_burstOffsets : []),\n bursts: (props.emission.bursts || []).map(function(c) {\n return new Burst(c);\n })\n };\n this.textureSheetAnimation = textureSheetAnimation;\n var renderer = props.renderer || {};\n var rotationOverLifetime;\n var rotOverLt = props.rotationOverLifetime;\n if (rotOverLt) {\n rotationOverLifetime = {};\n rotationOverLifetime.asRotation = !!rotOverLt.asRotation;\n rotationOverLifetime.z = rotOverLt.z ? createValueGetter(rotOverLt.z) : createValueGetter(0);\n if (rotOverLt.separateAxes) {\n rotationOverLifetime.x = rotOverLt.x && createValueGetter(rotOverLt.x);\n rotationOverLifetime.y = rotOverLt.y && createValueGetter(rotOverLt.y);\n }\n }\n var forceTarget;\n if (positionOverLifetime == null ? void 0 : positionOverLifetime.forceTarget) {\n forceTarget = {\n target: positionOverLifetime.target || [\n 0,\n 0,\n 0\n ],\n curve: createValueGetter(positionOverLifetime.forceCurve || [\n ValueType.LINE,\n [\n [\n 0,\n 0\n ],\n [\n 1,\n 1\n ]\n ]\n ])\n };\n }\n var linearVelOverLifetime = {\n x: positionOverLifetime.linearX && createValueGetter(positionOverLifetime.linearX || 0),\n y: positionOverLifetime.linearY && createValueGetter(positionOverLifetime.linearY || 0),\n z: positionOverLifetime.linearZ && createValueGetter(positionOverLifetime.linearZ || 0),\n asMovement: positionOverLifetime.asMovement\n };\n var orbitalVelOverLifetime = {\n x: positionOverLifetime.orbitalX && createValueGetter(positionOverLifetime.orbitalX),\n y: positionOverLifetime.orbitalY && createValueGetter(positionOverLifetime.orbitalY),\n z: positionOverLifetime.orbitalZ && createValueGetter(positionOverLifetime.orbitalZ),\n center: positionOverLifetime.orbCenter,\n asRotation: positionOverLifetime.asRotation\n };\n var sizeOverLifetime = props.sizeOverLifetime || {};\n var colorOverLifetime = props.colorOverLifetime;\n var shaderCachePrefix = cachePrefix;\n var sizeOverLifetimeGetter = (sizeOverLifetime == null ? void 0 : sizeOverLifetime.separateAxes) ? {\n separateAxes: true,\n x: createValueGetter(sizeOverLifetime.x),\n y: createValueGetter(sizeOverLifetime.y)\n } : {\n separateAxes: false,\n x: createValueGetter((\"size\" in sizeOverLifetime ? sizeOverLifetime.size : sizeOverLifetime.x) || 1)\n };\n renderer.anchor = renderer.anchor || [\n 0,\n 0\n ];\n var anchor = Vector2.fromArray(renderer.anchor);\n var _options_maxCount;\n this.options = {\n particleFollowParent: !!options.particleFollowParent,\n startLifetime: createValueGetter(options.startLifetime),\n startDelay: createValueGetter(options.startDelay || 0),\n startSpeed: createValueGetter(positionOverLifetime.startSpeed || 0),\n startColor: createValueGetter(options.startColor),\n // duration:vfxItem.duration || 1,\n looping: false,\n maxCount: (_options_maxCount = options.maxCount) != null ? _options_maxCount : 0,\n gravityModifier: createValueGetter(gravityModifier || 0),\n gravity: gravity,\n start3DSize: !!options.start3DSize,\n startTurbulence: startTurbulence,\n turbulence: turbulence,\n speedOverLifetime: positionOverLifetime.speedOverLifetime && createValueGetter(positionOverLifetime.speedOverLifetime),\n linearVelOverLifetime: linearVelOverLifetime,\n orbitalVelOverLifetime: orbitalVelOverLifetime,\n forceTarget: forceTarget\n };\n if (options.startRotationZ) {\n this.options.startRotation = createValueGetter(options.startRotationZ || 0);\n }\n if (options.startRotationX || options.startRotationY) {\n this.options.start3DRotation = true;\n this.options.startRotationX = createValueGetter(options.startRotationX || 0);\n this.options.startRotationY = createValueGetter(options.startRotationY || 0);\n this.options.startRotationZ = createValueGetter(options.startRotationZ || 0);\n }\n if (options.start3DSize) {\n this.options.startSizeX = createValueGetter(options.startSizeX);\n this.options.startSizeY = createValueGetter(options.startSizeY);\n } else {\n this.options.startSize = createValueGetter(options.startSize);\n this.options.sizeAspect = createValueGetter(options.sizeAspect || 1);\n }\n var maskProps = this.getMaskOptions(props);\n var particleMeshProps = {\n // listIndex: vfxItem.listIndex,\n meshSlots: options.meshSlots,\n name: this.name,\n matrix: Matrix4$1.IDENTITY,\n shaderCachePrefix: shaderCachePrefix,\n renderMode: renderer.renderMode || RenderMode.BILLBOARD,\n side: renderer.side || SideMode.DOUBLE,\n gravity: gravity,\n // duration: vfxItem.duration,\n blending: renderer.blending || BlendingMode.ALPHA,\n rotationOverLifetime: rotationOverLifetime,\n gravityModifier: this.options.gravityModifier,\n linearVelOverLifetime: this.options.linearVelOverLifetime,\n orbitalVelOverLifetime: this.options.orbitalVelOverLifetime,\n speedOverLifetime: this.options.speedOverLifetime,\n sprite: textureSheetAnimation,\n occlusion: !!renderer.occlusion,\n transparentOcclusion: !!renderer.transparentOcclusion,\n maxCount: options.maxCount,\n mask: maskProps.maskRef,\n maskMode: maskProps.maskMode,\n forceTarget: forceTarget,\n diffuse: renderer.texture ? this.engine.findObject(renderer.texture) : undefined,\n sizeOverLifetime: sizeOverLifetimeGetter,\n anchor: anchor\n };\n if (colorOverLifetime) {\n var color = colorOverLifetime.color, opacity = colorOverLifetime.opacity;\n particleMeshProps.colorOverLifetime = {};\n if (opacity) {\n particleMeshProps.colorOverLifetime.opacity = createValueGetter(colorOverLifetime.opacity);\n }\n if (color) {\n if (color[0] === ValueType.GRADIENT_COLOR) {\n particleMeshProps.colorOverLifetime.color = colorOverLifetime.color[1];\n } else if (color[0] === ValueType.RGBA_COLOR) {\n particleMeshProps.colorOverLifetime.color = Texture.createWithData(this.engine, {\n data: new Uint8Array(color[1]),\n width: 1,\n height: 1\n });\n } else if (_instanceof1(color, Texture)) {\n particleMeshProps.colorOverLifetime.color = color;\n }\n }\n }\n var uvs = [];\n var textureMap = [\n 0,\n 0,\n 1,\n 1\n ];\n var flip;\n if (props.splits) {\n var s = props.splits[0];\n flip = s[4];\n textureMap = flip ? [\n s[0],\n s[1],\n s[3],\n s[2]\n ] : [\n s[0],\n s[1],\n s[2],\n s[3]\n ];\n }\n if (textureSheetAnimation && !textureSheetAnimation.animate) {\n var col = flip ? textureSheetAnimation.row : textureSheetAnimation.col;\n var row = flip ? textureSheetAnimation.col : textureSheetAnimation.row;\n var total = textureSheetAnimation.total || col * row;\n var index = 0;\n for(var x = 0; x < col; x++){\n for(var y = 0; y < row && index < total; y++, index++){\n uvs.push([\n x * textureMap[2] / col + textureMap[0],\n y * textureMap[3] / row + textureMap[1],\n textureMap[2] / col,\n textureMap[3] / row\n ]);\n }\n }\n } else {\n uvs.push(textureMap);\n }\n this.uvs = uvs;\n // @ts-expect-error\n particleMeshProps.textureFlip = flip;\n var trails = props.trails;\n var trailMeshProps;\n if (trails) {\n this.trails = {\n lifetime: createValueGetter(trails.lifetime),\n dieWithParticles: trails.dieWithParticles !== false,\n sizeAffectsWidth: !!trails.sizeAffectsWidth,\n sizeAffectsLifetime: !!trails.sizeAffectsLifetime,\n inheritParticleColor: !!trails.inheritParticleColor,\n parentAffectsPosition: !!trails.parentAffectsPosition\n };\n maskProps = this.getMaskOptions(trails);\n trailMeshProps = {\n name: \"Trail\",\n matrix: Matrix4$1.IDENTITY,\n minimumVertexDistance: trails.minimumVertexDistance || 0.02,\n maxTrailCount: options.maxCount,\n pointCountPerTrail: Math.round(trails.maxPointPerTrail) || 32,\n blending: trails.blending,\n texture: trails.texture ? this.engine.findObject(trails.texture) : undefined,\n opacityOverLifetime: createValueGetter(trails.opacityOverLifetime || 1),\n widthOverTrail: createValueGetter(trails.widthOverTrail || 1),\n // order: vfxItem.listIndex + (trails.orderOffset || 0),\n shaderCachePrefix: shaderCachePrefix,\n lifetime: this.trails.lifetime,\n occlusion: !!trails.occlusion,\n transparentOcclusion: !!trails.transparentOcclusion,\n textureMap: trails.textureMap,\n mask: maskProps.maskRef,\n maskMode: maskProps.maskMode\n };\n if (trails.colorOverLifetime && trails.colorOverLifetime[0] === ValueType.GRADIENT_COLOR) {\n trailMeshProps.colorOverLifetime = trails.colorOverLifetime[1];\n }\n if (trails.colorOverTrail && trails.colorOverTrail[0] === ValueType.GRADIENT_COLOR) {\n trailMeshProps.colorOverTrail = trails.colorOverTrail[1];\n }\n }\n this.renderer = new ParticleSystemRenderer(this.engine, particleMeshProps, trailMeshProps);\n this.renderer.item = this.item;\n this.renderer.maskManager = this.maskManager;\n this.meshes = this.renderer.meshes;\n var interaction = props.interaction;\n if (interaction) {\n var _interaction_radius;\n this.interaction = {\n multiple: interaction.multiple,\n radius: (_interaction_radius = interaction.radius) != null ? _interaction_radius : 0.4,\n behavior: interaction.behavior\n };\n }\n this.item.getHitTestParams = this.getHitTestParams;\n this.item._content = this;\n };\n _proto.getMaskOptions = function getMaskOptions(data) {\n var maskMode = exports.MaskMode.NONE;\n var maskRef = 0;\n if (data.mask) {\n var maskProps = data.mask;\n if (maskProps && maskProps.ref) {\n maskProps.ref = this.engine.findObject(maskProps.ref);\n }\n maskMode = this.maskManager.getMaskMode(data);\n maskRef = this.maskManager.getRefValue();\n }\n return {\n maskMode: maskMode,\n maskRef: maskRef\n };\n };\n _create_class(ParticleSystem, [\n {\n key: \"timePassed\",\n get: function get() {\n return this.lastUpdate - this.loopStartTime;\n }\n },\n {\n key: \"lifetime\",\n get: function get() {\n return this.timePassed / this.item.duration;\n }\n },\n {\n key: \"particleCount\",\n get: function get() {\n return this.particleLink.length;\n }\n },\n {\n key: \"maxParticles\",\n get: /**\n * 获取当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时,发射器会暂时停止发射粒子。\n * @since 2.3.0\n */ function get() {\n return this.options.maxCount;\n },\n set: /**\n * 设置当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时,发射器会暂时停止发射粒子。\n * 注意:暂时不支持增加拖尾数量\n * @since 2.3.0\n */ function set(count) {\n var _this_renderer;\n this.options.maxCount = count;\n if ((_this_renderer = this.renderer) == null ? void 0 : _this_renderer.particleMesh) {\n this.renderer.particleMesh.maxCount = count;\n }\n }\n }\n ]);\n return ParticleSystem;\n}(Component);\nexports.ParticleSystem = __decorate([\n effectsClass(DataType.ParticleSystem)\n], exports.ParticleSystem);\n// array performance better for small memory than Float32Array\nvar tempDir = new Vector3();\nvar tempSize$1 = new Vector2();\nvar tempRot$1 = new Euler();\nvar tmpDirX = new Vector3();\nvar tmpDirY = new Vector3();\nvar tempVec3 = new Vector3();\nvar tempEuler = new Euler();\nvar tempSprite = [\n 0,\n 0,\n 0\n];\nvar tempMat4 = new Matrix4$1();\nfunction getBurstOffsets(burstOffsets) {\n var ret = {};\n if (Array.isArray(burstOffsets)) {\n burstOffsets.forEach(function(arr) {\n var isArr = _instanceof1(arr, Array);\n var index = isArr ? arr[0] : arr.index;\n var offsets = ret[index];\n if (!offsets) {\n offsets = ret[index] = [];\n }\n if (isArr) {\n offsets.push(arr.slice(1, 4));\n } else {\n offsets.push([\n +arr.x,\n +arr.y,\n +arr.z\n ]);\n }\n });\n }\n return ret;\n}\nfunction randomArrItem(arr, keepArr) {\n var index = Math.floor(Math.random() * arr.length);\n var item = arr[index];\n if (!keepArr) {\n arr.splice(index, 1);\n }\n return item;\n}\n\nvar TrackMixerPlayable = /*#__PURE__*/ function(Playable1) {\n _inherits(TrackMixerPlayable, Playable1);\n function TrackMixerPlayable() {\n var _this;\n _this = Playable1.apply(this, arguments) || this;\n _this.clipPlayables = [];\n _this.clipWeights = [];\n return _this;\n }\n var _proto = TrackMixerPlayable.prototype;\n _proto.processFrame = function processFrame(context) {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.clipPlayables), _step; !(_step = _iterator()).done;){\n var clipPlayable = _step.value;\n clipPlayable.processFrame(context);\n }\n this.evaluate(context);\n };\n _proto.setClipWeight = function setClipWeight(playableOrIndex, weight) {\n if (_instanceof1(playableOrIndex, Playable)) {\n for(var i = 0; i < this.clipPlayables.length; i++){\n if (this.clipPlayables[i] === playableOrIndex) {\n this.clipWeights[i] = weight;\n return;\n }\n }\n } else {\n if (this.clipWeights.length < playableOrIndex + 1) {\n this.clipWeights.length = playableOrIndex + 1;\n }\n this.clipWeights[playableOrIndex] = weight;\n }\n };\n _proto.getClipWeight = function getClipWeight(inputIndex) {\n return this.clipWeights[inputIndex];\n };\n _proto.getClipPlayable = function getClipPlayable(index) {\n return this.clipPlayables[index];\n };\n _proto.evaluate = function evaluate(context) {\n // Override\n };\n return TrackMixerPlayable;\n}(Playable);\n\nvar ActivationMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) {\n _inherits(ActivationMixerPlayable, TrackMixerPlayable);\n function ActivationMixerPlayable() {\n return TrackMixerPlayable.apply(this, arguments);\n }\n var _proto = ActivationMixerPlayable.prototype;\n _proto.evaluate = function evaluate(context) {\n var boundObject = context.output.getUserData();\n if (!_instanceof1(boundObject, exports.VFXItem)) {\n return;\n }\n var boundItem = boundObject;\n var hasInput = false;\n for(var i = 0; i < this.clipPlayables.length; i++){\n if (this.getClipWeight(i) > 0) {\n hasInput = true;\n break;\n }\n }\n if (hasInput) {\n boundItem.transform.setValid(true);\n boundItem.setActive(true);\n } else {\n boundItem.transform.setValid(false);\n boundItem.setActive(false);\n }\n };\n return ActivationMixerPlayable;\n}(TrackMixerPlayable);\n\nvar PropertyClipPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(PropertyClipPlayable, Playable);\n function PropertyClipPlayable() {\n return Playable.apply(this, arguments);\n }\n var _proto = PropertyClipPlayable.prototype;\n _proto.processFrame = function processFrame(context) {\n this.value = this.curve.getValue(this.time / this.getDuration());\n };\n return PropertyClipPlayable;\n}(Playable);\n\nvar PropertyMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) {\n _inherits(PropertyMixerPlayable, TrackMixerPlayable);\n function PropertyMixerPlayable() {\n var _this;\n _this = TrackMixerPlayable.apply(this, arguments) || this;\n _this.propertyName = \"\";\n return _this;\n }\n var _proto = PropertyMixerPlayable.prototype;\n _proto.evaluate = function evaluate(context) {\n var boundObject = context.output.getUserData();\n if (!boundObject) {\n return;\n }\n var hasInput = false;\n this.propertyValue = boundObject[this.propertyName];\n if (this.propertyValue === undefined || this.propertyValue === null) {\n return;\n }\n this.resetPropertyValue();\n // evaluate the curve\n for(var i = 0; i < this.clipPlayables.length; i++){\n var weight = this.getClipWeight(i);\n if (weight > 0) {\n var propertyClipPlayable = this.getClipPlayable(i);\n if (!_instanceof1(propertyClipPlayable, PropertyClipPlayable)) {\n console.error(\"PropertyTrack added non-PropertyPlayableAsset\");\n continue;\n }\n var curveValue = propertyClipPlayable.value;\n this.addWeightedValue(curveValue, weight);\n hasInput = true;\n }\n }\n // set value\n if (hasInput) {\n boundObject[this.propertyName] = this.propertyValue;\n }\n };\n return PropertyMixerPlayable;\n}(TrackMixerPlayable);\n\nvar ColorPropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) {\n _inherits(ColorPropertyMixerPlayable, PropertyMixerPlayable);\n function ColorPropertyMixerPlayable() {\n return PropertyMixerPlayable.apply(this, arguments);\n }\n var _proto = ColorPropertyMixerPlayable.prototype;\n _proto.resetPropertyValue = function resetPropertyValue() {\n this.propertyValue.setZero();\n };\n _proto.addWeightedValue = function addWeightedValue(curveValue, weight) {\n var result = this.propertyValue;\n result.r += curveValue.r * weight;\n result.g += curveValue.g * weight;\n result.b += curveValue.b * weight;\n result.a += curveValue.a * weight;\n };\n return ColorPropertyMixerPlayable;\n}(PropertyMixerPlayable);\n\nvar FloatPropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) {\n _inherits(FloatPropertyMixerPlayable, PropertyMixerPlayable);\n function FloatPropertyMixerPlayable() {\n return PropertyMixerPlayable.apply(this, arguments);\n }\n var _proto = FloatPropertyMixerPlayable.prototype;\n _proto.resetPropertyValue = function resetPropertyValue() {\n this.propertyValue = 0;\n };\n _proto.addWeightedValue = function addWeightedValue(curveValue, weight) {\n this.propertyValue += curveValue * weight;\n };\n return FloatPropertyMixerPlayable;\n}(PropertyMixerPlayable);\n\nvar ParticleMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) {\n _inherits(ParticleMixerPlayable, TrackMixerPlayable);\n function ParticleMixerPlayable() {\n return TrackMixerPlayable.apply(this, arguments);\n }\n var _proto = ParticleMixerPlayable.prototype;\n _proto.evaluate = function evaluate(context) {};\n return ParticleMixerPlayable;\n}(TrackMixerPlayable);\n\nvar SpriteColorMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) {\n _inherits(SpriteColorMixerPlayable, TrackMixerPlayable);\n function SpriteColorMixerPlayable() {\n return TrackMixerPlayable.apply(this, arguments);\n }\n var _proto = SpriteColorMixerPlayable.prototype;\n _proto.evaluate = function evaluate(context) {};\n return SpriteColorMixerPlayable;\n}(TrackMixerPlayable);\n\nvar SubCompositionClipPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(SubCompositionClipPlayable, Playable);\n function SubCompositionClipPlayable() {\n return Playable.apply(this, arguments);\n }\n var _proto = SubCompositionClipPlayable.prototype;\n _proto.processFrame = function processFrame(context) {\n var boundObject = context.output.getUserData();\n if (_instanceof1(boundObject, exports.CompositionComponent)) {\n boundObject.time = this.getTime();\n }\n };\n return SubCompositionClipPlayable;\n}(Playable);\n\nvar SubCompositionMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) {\n _inherits(SubCompositionMixerPlayable, TrackMixerPlayable);\n function SubCompositionMixerPlayable() {\n return TrackMixerPlayable.apply(this, arguments);\n }\n var _proto = SubCompositionMixerPlayable.prototype;\n _proto.evaluate = function evaluate(context) {\n var boundObject = context.output.getUserData();\n if (!_instanceof1(boundObject, exports.CompositionComponent)) {\n return;\n }\n var compositionComponent = boundObject;\n var hasInput = false;\n for(var i = 0; i < this.clipPlayables.length; i++){\n if (this.getClipWeight(i) > 0) {\n hasInput = true;\n break;\n }\n }\n if (hasInput) {\n compositionComponent.item.setActive(true);\n } else {\n compositionComponent.item.setActive(false);\n }\n };\n return SubCompositionMixerPlayable;\n}(TrackMixerPlayable);\n\nvar TransformMixerPlayable = /*#__PURE__*/ function(TrackMixerPlayable) {\n _inherits(TransformMixerPlayable, TrackMixerPlayable);\n function TransformMixerPlayable() {\n return TrackMixerPlayable.apply(this, arguments);\n }\n var _proto = TransformMixerPlayable.prototype;\n _proto.evaluate = function evaluate(context) {};\n return TransformMixerPlayable;\n}(TrackMixerPlayable);\n\nvar Vector4PropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) {\n _inherits(Vector4PropertyMixerPlayable, PropertyMixerPlayable);\n function Vector4PropertyMixerPlayable() {\n return PropertyMixerPlayable.apply(this, arguments);\n }\n var _proto = Vector4PropertyMixerPlayable.prototype;\n _proto.resetPropertyValue = function resetPropertyValue() {\n this.propertyValue.x = 0;\n this.propertyValue.y = 0;\n this.propertyValue.z = 0;\n this.propertyValue.w = 0;\n };\n _proto.addWeightedValue = function addWeightedValue(curveValue, weight) {\n var result = this.propertyValue;\n result.x += curveValue.x * weight;\n result.y += curveValue.y * weight;\n result.z += curveValue.z * weight;\n result.w += curveValue.w * weight;\n };\n return Vector4PropertyMixerPlayable;\n}(PropertyMixerPlayable);\nvar Vector2PropertyMixerPlayable = /*#__PURE__*/ function(PropertyMixerPlayable) {\n _inherits(Vector2PropertyMixerPlayable, PropertyMixerPlayable);\n function Vector2PropertyMixerPlayable() {\n return PropertyMixerPlayable.apply(this, arguments);\n }\n var _proto = Vector2PropertyMixerPlayable.prototype;\n _proto.resetPropertyValue = function resetPropertyValue() {\n this.propertyValue.x = 0;\n this.propertyValue.y = 0;\n };\n _proto.addWeightedValue = function addWeightedValue(curveValue, weight) {\n var result = this.propertyValue;\n result.x += curveValue.x * weight;\n result.y += curveValue.y * weight;\n };\n return Vector2PropertyMixerPlayable;\n}(PropertyMixerPlayable);\n\n/**\n * @since 2.0.0\n */ var TimelineClip = /*#__PURE__*/ function() {\n function TimelineClip() {\n this.start = 0;\n this.duration = 0;\n }\n var _proto = TimelineClip.prototype;\n _proto.toLocalTime = function toLocalTime(time) {\n var localTime = time - this.start;\n var duration = this.duration;\n if (localTime - duration > 0) {\n if (this.endBehavior === EndBehavior.restart) {\n localTime = localTime % duration;\n } else if (this.endBehavior === EndBehavior.freeze) {\n localTime = Math.min(duration, localTime);\n }\n }\n return localTime;\n };\n return TimelineClip;\n}();\nexports.TrackAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(TrackAsset, PlayableAsset);\n function TrackAsset() {\n var _this;\n _this = PlayableAsset.apply(this, arguments) || this;\n _this.trackType = 0;\n _this.clipSeed = 0;\n _this.clips = [];\n _this.children = [];\n return _this;\n }\n var _proto = TrackAsset.prototype;\n /**\n * 重写该方法以获取自定义对象绑定\n */ _proto.updateAnimatedObject = function updateAnimatedObject() {\n if (this.parent) {\n this.boundObject = this.parent.boundObject;\n }\n };\n /**\n * 重写该方法以创建自定义混合器\n */ _proto.createTrackMixer = function createTrackMixer(graph) {\n return new TrackMixerPlayable(graph);\n };\n _proto.createOutput = function createOutput() {\n var output = new PlayableOutput();\n return output;\n };\n _proto.createPlayableGraph = function createPlayableGraph(graph, runtimeClips) {\n var mixerPlayable = this.createMixerPlayableGraph(graph, runtimeClips);\n return mixerPlayable;\n };\n _proto.createMixerPlayableGraph = function createMixerPlayableGraph(graph, runtimeClips) {\n var clips = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(this.clips), _step; !(_step = _iterator()).done;){\n var clip = _step.value;\n clips.push(clip);\n }\n var mixerPlayable = this.compileClips(graph, clips, runtimeClips);\n return mixerPlayable;\n };\n _proto.compileClips = function compileClips(graph, timelineClips, runtimeClips) {\n var mixer = this.createTrackMixer(graph);\n for(var _iterator = _create_for_of_iterator_helper_loose(timelineClips), _step; !(_step = _iterator()).done;){\n var timelineClip = _step.value;\n var clipPlayable = this.createClipPlayable(graph, timelineClip);\n clipPlayable.setDuration(timelineClip.duration);\n var clip = new RuntimeClip(timelineClip, clipPlayable, mixer, this);\n runtimeClips.push(clip);\n mixer.clipPlayables.push(clipPlayable);\n mixer.setClipWeight(clipPlayable, 0.0);\n }\n return mixer;\n };\n _proto.createPlayable = function createPlayable(graph) {\n return new Playable(graph);\n };\n _proto.getChildTracks = function getChildTracks() {\n return this.children;\n };\n _proto.addChild = function addChild(child) {\n this.children.push(child);\n child.parent = this;\n };\n _proto.createClip = function createClip(classConstructor, name) {\n var newClip = new TimelineClip();\n newClip.asset = new classConstructor(this.engine);\n newClip.name = name ? name : \"TimelineClip\" + newClip.id;\n this.addClip(newClip);\n return newClip;\n };\n _proto.getClips = function getClips() {\n return this.clips;\n };\n _proto.findClip = function findClip(name) {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.clips), _step; !(_step = _iterator()).done;){\n var clip = _step.value;\n if (clip.name === name) {\n return clip;\n }\n }\n };\n _proto.addClip = function addClip(clip) {\n clip.id = (this.clipSeed++).toString();\n this.clips.push(clip);\n };\n _proto.createClipPlayable = function createClipPlayable(graph, clip) {\n return clip.asset.createPlayable(graph);\n };\n _proto.fromData = function fromData(data) {\n PlayableAsset.prototype.fromData.call(this, data);\n for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){\n var child = _step.value;\n child.parent = this;\n }\n };\n return TrackAsset;\n}(PlayableAsset);\n__decorate([\n serialize(TimelineClip)\n], exports.TrackAsset.prototype, \"clips\", void 0);\n__decorate([\n serialize()\n], exports.TrackAsset.prototype, \"children\", void 0);\nexports.TrackAsset = __decorate([\n effectsClass(DataType.TrackAsset)\n], exports.TrackAsset);\nexports.TrackType = void 0;\n(function(TrackType) {\n TrackType[TrackType[\"MasterTrack\"] = 0] = \"MasterTrack\";\n TrackType[TrackType[\"ObjectTrack\"] = 1] = \"ObjectTrack\";\n})(exports.TrackType || (exports.TrackType = {}));\nvar RuntimeClip = /*#__PURE__*/ function() {\n function RuntimeClip(clip, clipPlayable, parentMixer, track) {\n this.clip = clip;\n this.playable = clipPlayable;\n this.parentMixer = parentMixer;\n this.track = track;\n if (_instanceof1(this.track.boundObject, exports.VFXItem)) {\n this.particleSystem = this.track.boundObject.getComponent(exports.ParticleSystem);\n }\n }\n var _proto = RuntimeClip.prototype;\n _proto.evaluateAt = function evaluateAt(localTime) {\n var clip = this.clip;\n var weight = 1.0;\n var ended = false;\n var started = false;\n var boundObject = this.track.boundObject;\n if (localTime >= clip.start + clip.duration && clip.endBehavior === EndBehavior.destroy) {\n if (_instanceof1(boundObject, exports.VFXItem) && exports.VFXItem.isParticle(boundObject) && this.particleSystem && !this.particleSystem.destroyed) {\n weight = 1.0;\n } else {\n weight = 0.0;\n ended = true;\n }\n } else if (localTime - this.clip.start >= 0) {\n weight = 1.0;\n started = true;\n } else if (localTime < clip.start) {\n weight = 0.0;\n }\n if (started && this.playable.getPlayState() !== PlayState.Playing) {\n this.playable.play();\n }\n this.parentMixer.setClipWeight(this.playable, weight);\n var clipTime = parseFloat(clip.toLocalTime(localTime).toFixed(3));\n this.playable.setTime(clipTime);\n // 判断动画是否结束\n if (ended) {\n if (this.playable.getPlayState() === PlayState.Playing) {\n this.playable.pause();\n }\n }\n };\n _create_class(RuntimeClip, [\n {\n key: \"enable\",\n set: function set(value) {\n if (value) {\n this.playable.play();\n } else {\n this.parentMixer.setClipWeight(this.playable, 0);\n this.playable.pause();\n }\n }\n }\n ]);\n return RuntimeClip;\n}();\n\nexports.ActivationTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(ActivationTrack, TrackAsset);\n function ActivationTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = ActivationTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n return new ActivationMixerPlayable(graph);\n };\n return ActivationTrack;\n}(exports.TrackAsset);\nexports.ActivationTrack = __decorate([\n effectsClass(DataType.ActivationTrack)\n], exports.ActivationTrack);\n\nvar PropertyTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(PropertyTrack, TrackAsset);\n function PropertyTrack() {\n var _this;\n _this = TrackAsset.apply(this, arguments) || this;\n _this.propertyNames = [];\n _this.path = \"\";\n return _this;\n }\n var _proto = PropertyTrack.prototype;\n _proto.updateAnimatedObject = function updateAnimatedObject() {\n var propertyNames = this.propertyNames;\n var target = this.parent.boundObject;\n for(var i = 0; i < propertyNames.length - 1; i++){\n var property = target[propertyNames[i]];\n if (property === undefined) {\n console.error(\"The \" + propertyNames[i] + \" property of \" + target + \" was not found\");\n }\n target = property;\n }\n this.boundObject = target;\n };\n _proto.fromData = function fromData(data) {\n TrackAsset.prototype.fromData.call(this, data);\n var propertyNames = this.path.split(\".\");\n this.propertyNames = propertyNames;\n };\n return PropertyTrack;\n}(exports.TrackAsset);\n__decorate([\n serialize()\n], PropertyTrack.prototype, \"path\", void 0);\n\nexports.FloatPropertyTrack = /*#__PURE__*/ function(PropertyTrack) {\n _inherits(FloatPropertyTrack, PropertyTrack);\n function FloatPropertyTrack() {\n return PropertyTrack.apply(this, arguments);\n }\n var _proto = FloatPropertyTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n var mixer = new FloatPropertyMixerPlayable(graph);\n var propertyNames = this.propertyNames;\n if (propertyNames.length > 0) {\n var propertyName = propertyNames[propertyNames.length - 1];\n mixer.propertyName = propertyName;\n }\n return mixer;\n };\n _proto.updateAnimatedObject = function updateAnimatedObject() {\n var propertyNames = this.propertyNames;\n var target = this.parent.boundObject;\n for(var i = 0; i < propertyNames.length - 1; i++){\n var property = target[propertyNames[i]];\n if (property === undefined) {\n console.error(\"The \" + propertyNames[i] + \" property of \" + target + \" was not found\");\n }\n target = property;\n }\n this.boundObject = target;\n };\n return FloatPropertyTrack;\n}(PropertyTrack);\nexports.FloatPropertyTrack = __decorate([\n effectsClass(DataType.FloatPropertyTrack)\n], exports.FloatPropertyTrack);\n\nexports.SpriteColorTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(SpriteColorTrack, TrackAsset);\n function SpriteColorTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = SpriteColorTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n return new SpriteColorMixerPlayable(graph);\n };\n return SpriteColorTrack;\n}(exports.TrackAsset);\nexports.SpriteColorTrack = __decorate([\n effectsClass(DataType.SpriteColorTrack)\n], exports.SpriteColorTrack);\n\nexports.SubCompositionTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(SubCompositionTrack, TrackAsset);\n function SubCompositionTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = SubCompositionTrack.prototype;\n _proto.updateAnimatedObject = function updateAnimatedObject() {\n if (!this.parent || !_instanceof1(this.parent.boundObject, exports.VFXItem)) {\n throw new Error(\"SubCompositionTrack needs to be set under the VFXItem track.\");\n }\n this.boundObject = this.parent.boundObject.getComponent(exports.CompositionComponent);\n };\n _proto.createTrackMixer = function createTrackMixer(graph) {\n return new SubCompositionMixerPlayable(graph);\n };\n return SubCompositionTrack;\n}(exports.TrackAsset);\nexports.SubCompositionTrack = __decorate([\n effectsClass(DataType.SubCompositionTrack)\n], exports.SubCompositionTrack);\n\nexports.TransformTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(TransformTrack, TrackAsset);\n function TransformTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = TransformTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n return new TransformMixerPlayable(graph);\n };\n return TransformTrack;\n}(exports.TrackAsset);\nexports.TransformTrack = __decorate([\n effectsClass(DataType.TransformTrack)\n], exports.TransformTrack);\n\nexports.MaterialTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(MaterialTrack, TrackAsset);\n function MaterialTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = MaterialTrack.prototype;\n _proto.updateAnimatedObject = function updateAnimatedObject() {\n if (!_instanceof1(this.parent.boundObject, RendererComponent)) {\n return;\n }\n this.parent.boundObject;\n this.boundObject = this.parent.boundObject.materials[this.index];\n };\n return MaterialTrack;\n}(exports.TrackAsset);\n__decorate([\n serialize()\n], exports.MaterialTrack.prototype, \"index\", void 0);\nexports.MaterialTrack = __decorate([\n effectsClass(\"MaterialTrack\")\n], exports.MaterialTrack);\n\nvar ParticleTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(ParticleTrack, TrackAsset);\n function ParticleTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = ParticleTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n return new ParticleMixerPlayable(graph);\n };\n return ParticleTrack;\n}(exports.TrackAsset);\n\nexports.Vector4PropertyTrack = /*#__PURE__*/ function(PropertyTrack) {\n _inherits(Vector4PropertyTrack, PropertyTrack);\n function Vector4PropertyTrack() {\n return PropertyTrack.apply(this, arguments);\n }\n var _proto = Vector4PropertyTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n var mixer = new Vector4PropertyMixerPlayable(graph);\n var propertyNames = this.propertyNames;\n if (propertyNames.length > 0) {\n var propertyName = propertyNames[propertyNames.length - 1];\n mixer.propertyName = propertyName;\n }\n return mixer;\n };\n return Vector4PropertyTrack;\n}(PropertyTrack);\nexports.Vector4PropertyTrack = __decorate([\n effectsClass(DataType.Vector4PropertyTrack)\n], exports.Vector4PropertyTrack);\nexports.Vector2PropertyTrack = /*#__PURE__*/ function(PropertyTrack) {\n _inherits(Vector2PropertyTrack, PropertyTrack);\n function Vector2PropertyTrack() {\n return PropertyTrack.apply(this, arguments);\n }\n var _proto = Vector2PropertyTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n var mixer = new Vector2PropertyMixerPlayable(graph);\n var propertyNames = this.propertyNames;\n if (propertyNames.length > 0) {\n var propertyName = propertyNames[propertyNames.length - 1];\n mixer.propertyName = propertyName;\n }\n return mixer;\n };\n return Vector2PropertyTrack;\n}(PropertyTrack);\nexports.Vector2PropertyTrack = __decorate([\n effectsClass(\"Vector2PropertyTrack\")\n], exports.Vector2PropertyTrack);\n\nexports.ColorPropertyTrack = /*#__PURE__*/ function(PropertyTrack) {\n _inherits(ColorPropertyTrack, PropertyTrack);\n function ColorPropertyTrack() {\n return PropertyTrack.apply(this, arguments);\n }\n var _proto = ColorPropertyTrack.prototype;\n _proto.createTrackMixer = function createTrackMixer(graph) {\n var mixer = new ColorPropertyMixerPlayable(graph);\n var propertyNames = this.propertyNames;\n if (propertyNames.length > 0) {\n var propertyName = propertyNames[propertyNames.length - 1];\n mixer.propertyName = propertyName;\n }\n return mixer;\n };\n return ColorPropertyTrack;\n}(PropertyTrack);\nexports.ColorPropertyTrack = __decorate([\n effectsClass(DataType.ColorPropertyTrack)\n], exports.ColorPropertyTrack);\n\nexports.ColorPropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(ColorPropertyPlayableAsset, PlayableAsset);\n function ColorPropertyPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = ColorPropertyPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var clipPlayable = new PropertyClipPlayable(graph);\n clipPlayable.curve = createValueGetter(this.curveData);\n clipPlayable.value = clipPlayable.curve.getValue(0);\n return clipPlayable;\n };\n return ColorPropertyPlayableAsset;\n}(PlayableAsset);\n__decorate([\n serialize()\n], exports.ColorPropertyPlayableAsset.prototype, \"curveData\", void 0);\nexports.ColorPropertyPlayableAsset = __decorate([\n effectsClass(DataType.ColorPropertyPlayableAsset)\n], exports.ColorPropertyPlayableAsset);\n\nexports.FloatPropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(FloatPropertyPlayableAsset, PlayableAsset);\n function FloatPropertyPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = FloatPropertyPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var clipPlayable = new PropertyClipPlayable(graph);\n clipPlayable.curve = createValueGetter(this.curveData);\n clipPlayable.value = clipPlayable.curve.getValue(0);\n return clipPlayable;\n };\n return FloatPropertyPlayableAsset;\n}(PlayableAsset);\n__decorate([\n serialize()\n], exports.FloatPropertyPlayableAsset.prototype, \"curveData\", void 0);\nexports.FloatPropertyPlayableAsset = __decorate([\n effectsClass(DataType.FloatPropertyPlayableAsset)\n], exports.FloatPropertyPlayableAsset);\n\nexports.SubCompositionPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(SubCompositionPlayableAsset, PlayableAsset);\n function SubCompositionPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = SubCompositionPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n return new SubCompositionClipPlayable(graph);\n };\n return SubCompositionPlayableAsset;\n}(PlayableAsset);\nexports.SubCompositionPlayableAsset = __decorate([\n effectsClass(DataType.SubCompositionPlayableAsset)\n], exports.SubCompositionPlayableAsset);\n\nexports.ObjectBindingTrack = /*#__PURE__*/ function(TrackAsset) {\n _inherits(ObjectBindingTrack, TrackAsset);\n function ObjectBindingTrack() {\n return TrackAsset.apply(this, arguments);\n }\n var _proto = ObjectBindingTrack.prototype;\n _proto.updateAnimatedObject = function updateAnimatedObject() {};\n _proto.create = function create(timelineAsset) {\n if (!_instanceof1(this.boundObject, exports.VFXItem)) {\n return;\n }\n var boundItem = this.boundObject;\n // 添加粒子动画 clip // TODO 待移除\n if (boundItem.getComponent(exports.ParticleSystem)) {\n var particleTrack = timelineAsset.createTrack(ParticleTrack, this, \"ParticleTrack\");\n particleTrack.boundObject = this.boundObject;\n var particleClip = particleTrack.createClip(ParticleBehaviourPlayableAsset);\n particleClip.start = boundItem.start;\n particleClip.duration = boundItem.duration;\n particleClip.endBehavior = boundItem.endBehavior;\n }\n };\n return ObjectBindingTrack;\n}(exports.TrackAsset);\nexports.ObjectBindingTrack = __decorate([\n effectsClass(DataType.ObjectBindingTrack)\n], exports.ObjectBindingTrack);\n\n/**\n * A class that stores track assets and the generated mixer playables and playable outputs.\n * It is used to query the corresponding playable object based on the track asset.\n */ var TrackInstance = /*#__PURE__*/ function() {\n function TrackInstance(trackAsset, mixer, output) {\n this.children = [];\n this.trackAsset = trackAsset;\n this.mixer = mixer;\n this.output = output;\n }\n var _proto = TrackInstance.prototype;\n _proto.addChild = function addChild(trackInstance) {\n this.children.push(trackInstance);\n };\n return TrackInstance;\n}();\n\nexports.TimelineAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(TimelineAsset, PlayableAsset);\n function TimelineAsset() {\n var _this;\n _this = PlayableAsset.apply(this, arguments) || this;\n _this.tracks = [];\n _this.cacheFlattenedTracks = null;\n return _this;\n }\n var _proto = TimelineAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var timelinePlayable = new TimelinePlayable(graph);\n for(var _iterator = _create_for_of_iterator_helper_loose(this.tracks), _step; !(_step = _iterator()).done;){\n var track = _step.value;\n if (_instanceof1(track, exports.ObjectBindingTrack)) {\n track.create(this);\n }\n }\n this.sortTracks(this.tracks);\n timelinePlayable.compileTracks(graph, this.flattenedTracks);\n return timelinePlayable;\n };\n _proto.createTrack = function createTrack(classConstructor, parent, name) {\n var newTrack = new classConstructor(this.engine);\n newTrack.name = name ? name : classConstructor.name;\n parent.addChild(newTrack);\n this.invalidate();\n return newTrack;\n };\n /**\n * Invalidates the asset, called when tracks data changed\n */ _proto.invalidate = function invalidate() {\n this.cacheFlattenedTracks = null;\n };\n _proto.addSubTracksRecursive = function addSubTracksRecursive(track, allTracks) {\n for(var _iterator = _create_for_of_iterator_helper_loose(track.getChildTracks()), _step; !(_step = _iterator()).done;){\n var subTrack = _step.value;\n allTracks.push(subTrack);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(track.getChildTracks()), _step1; !(_step1 = _iterator1()).done;){\n var subTrack1 = _step1.value;\n this.addSubTracksRecursive(subTrack1, allTracks);\n }\n };\n _proto.sortTracks = function sortTracks(tracks) {\n var sortedTracks = [];\n for(var i = 0; i < tracks.length; i++){\n sortedTracks.push(new TrackSortWrapper(tracks[i], i));\n }\n sortedTracks.sort(compareTracks);\n tracks.length = 0;\n for(var _iterator = _create_for_of_iterator_helper_loose(sortedTracks), _step; !(_step = _iterator()).done;){\n var trackWrapper = _step.value;\n tracks.push(trackWrapper.track);\n }\n };\n _proto.fromData = function fromData(data) {};\n _create_class(TimelineAsset, [\n {\n key: \"flattenedTracks\",\n get: function get() {\n if (!this.cacheFlattenedTracks) {\n this.cacheFlattenedTracks = [];\n // flatten track tree\n for(var _iterator = _create_for_of_iterator_helper_loose(this.tracks), _step; !(_step = _iterator()).done;){\n var masterTrack = _step.value;\n this.cacheFlattenedTracks.push(masterTrack);\n this.addSubTracksRecursive(masterTrack, this.cacheFlattenedTracks);\n }\n }\n return this.cacheFlattenedTracks;\n }\n }\n ]);\n return TimelineAsset;\n}(PlayableAsset);\n__decorate([\n serialize()\n], exports.TimelineAsset.prototype, \"tracks\", void 0);\nexports.TimelineAsset = __decorate([\n effectsClass(DataType.TimelineAsset)\n], exports.TimelineAsset);\nvar TimelinePlayable = /*#__PURE__*/ function(Playable) {\n _inherits(TimelinePlayable, Playable);\n function TimelinePlayable() {\n var _this;\n _this = Playable.apply(this, arguments) || this;\n _this.clips = [];\n _this.masterTrackInstances = [];\n return _this;\n }\n var _proto = TimelinePlayable.prototype;\n _proto.prepareFrame = function prepareFrame(context) {};\n _proto.evaluate = function evaluate() {\n var time = this.getTime();\n // TODO search active clips\n for(var _iterator = _create_for_of_iterator_helper_loose(this.clips), _step; !(_step = _iterator()).done;){\n var clip = _step.value;\n clip.evaluateAt(time);\n }\n };\n _proto.compileTracks = function compileTracks(graph, tracks) {\n var outputTrack = tracks;\n // map for searching track instance with track asset guid\n var trackInstanceMap = {};\n for(var _iterator = _create_for_of_iterator_helper_loose(outputTrack), _step; !(_step = _iterator()).done;){\n var track = _step.value;\n // create track mixer and track output\n var trackMixPlayable = track.createPlayableGraph(graph, this.clips);\n var trackOutput = track.createOutput();\n trackOutput.setUserData(track.boundObject);\n graph.addOutput(trackOutput);\n trackOutput.setSourcePlayable(trackMixPlayable);\n // create track instance\n var trackInstance = new TrackInstance(track, trackMixPlayable, trackOutput);\n trackInstanceMap[track.getInstanceId()] = trackInstance;\n if (!track.parent) {\n this.masterTrackInstances.push(trackInstance);\n }\n }\n // build trackInstance tree\n for(var _iterator1 = _create_for_of_iterator_helper_loose(outputTrack), _step1; !(_step1 = _iterator1()).done;){\n var track1 = _step1.value;\n var trackInstance1 = trackInstanceMap[track1.getInstanceId()];\n for(var _iterator2 = _create_for_of_iterator_helper_loose(track1.getChildTracks()), _step2; !(_step2 = _iterator2()).done;){\n var child = _step2.value;\n var childTrackInstance = trackInstanceMap[child.getInstanceId()];\n trackInstance1.addChild(childTrackInstance);\n }\n }\n };\n return TimelinePlayable;\n}(Playable);\nvar TrackSortWrapper = function TrackSortWrapper(track, originalIndex) {\n this.track = track;\n this.originalIndex = originalIndex;\n};\nfunction compareTracks(a, b) {\n var bindingA = a.track.boundObject;\n var bindingB = b.track.boundObject;\n if (!_instanceof1(bindingA, exports.VFXItem) || !_instanceof1(bindingB, exports.VFXItem)) {\n return a.originalIndex - b.originalIndex;\n }\n if (exports.VFXItem.isAncestor(bindingA, bindingB)) {\n return -1;\n } else if (exports.VFXItem.isAncestor(bindingB, bindingA)) {\n return 1;\n } else {\n return a.originalIndex - b.originalIndex; // 非父子关系的元素保持原始顺序\n }\n}\n\nexports.Vector4PropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(Vector4PropertyPlayableAsset, PlayableAsset);\n function Vector4PropertyPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = Vector4PropertyPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var clipPlayable = new PropertyClipPlayable(graph);\n clipPlayable.curve = createValueGetter(this.curveData);\n clipPlayable.value = clipPlayable.curve.getValue(0);\n return clipPlayable;\n };\n return Vector4PropertyPlayableAsset;\n}(PlayableAsset);\n__decorate([\n serialize()\n], exports.Vector4PropertyPlayableAsset.prototype, \"curveData\", void 0);\nexports.Vector4PropertyPlayableAsset = __decorate([\n effectsClass(DataType.Vector4PropertyPlayableAsset)\n], exports.Vector4PropertyPlayableAsset);\nexports.Vector2PropertyPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(Vector2PropertyPlayableAsset, PlayableAsset);\n function Vector2PropertyPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = Vector2PropertyPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var clipPlayable = new PropertyClipPlayable(graph);\n clipPlayable.curve = createValueGetter(this.curveData);\n clipPlayable.value = clipPlayable.curve.getValue(0);\n return clipPlayable;\n };\n return Vector2PropertyPlayableAsset;\n}(PlayableAsset);\n__decorate([\n serialize()\n], exports.Vector2PropertyPlayableAsset.prototype, \"curveData\", void 0);\nexports.Vector2PropertyPlayableAsset = __decorate([\n effectsClass(DataType.Vector2PropertyPlayableAsset)\n], exports.Vector2PropertyPlayableAsset);\n\nexports.CompositionComponent = /*#__PURE__*/ function(Component) {\n _inherits(CompositionComponent, Component);\n function CompositionComponent() {\n var _this;\n _this = Component.apply(this, arguments) || this;\n _this.time = 0;\n _this.startTime = 0;\n _this.items = [] // 场景的所有元素\n ;\n /**\n * @internal\n */ _this.state = PlayState.Playing;\n _this.reusable = false;\n _this.sceneBindings = [];\n _this.graph = new PlayableGraph();\n return _this;\n }\n var _proto = CompositionComponent.prototype;\n _proto.onStart = function onStart() {\n var _this_item_composition;\n if (!this.timelineAsset) {\n this.timelineAsset = new exports.TimelineAsset(this.engine);\n }\n this.resolveBindings();\n this.timelinePlayable = this.timelineAsset.createPlayable(this.graph);\n // 重播不销毁元素\n if (this.item.endBehavior !== EndBehavior.destroy) {\n this.setReusable(true);\n }\n (_this_item_composition = this.item.composition) == null ? void 0 : _this_item_composition.refContent.push(this.item);\n };\n _proto.setReusable = function setReusable(value) {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.timelineAsset.tracks), _step; !(_step = _iterator()).done;){\n var track = _step.value;\n var boundObject = track.boundObject;\n if (_instanceof1(boundObject, exports.VFXItem)) {\n var subCompositionComponent = boundObject.getComponent(CompositionComponent);\n if (subCompositionComponent) {\n subCompositionComponent.setReusable(value);\n }\n }\n }\n };\n _proto.getReusable = function getReusable() {\n return this.reusable;\n };\n _proto.pause = function pause() {\n this.state = PlayState.Paused;\n };\n _proto.resume = function resume() {\n this.state = PlayState.Playing;\n };\n _proto.onUpdate = function onUpdate(dt) {\n if (this.state === PlayState.Paused) {\n return;\n }\n var time = this.time;\n this.timelinePlayable.setTime(time);\n // The properties of the object may change dynamically,\n // so reset the track binding to avoid invalidation of the previously obtained binding object.\n this.resolveBindings();\n this.timelinePlayable.evaluate();\n this.graph.evaluate(dt);\n };\n _proto.onEnable = function onEnable() {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n item.setActive(true);\n }\n };\n _proto.onDisable = function onDisable() {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n item.setActive(false);\n }\n };\n _proto.onDestroy = function onDestroy() {\n if (this.item.composition) {\n if (this.items) {\n this.items.forEach(function(item) {\n return item.dispose();\n });\n this.items.length = 0;\n }\n }\n };\n _proto.hitTest = function hitTest(ray, x, y, regions, force, options) {\n var _this, _loop = function(i) {\n var item = _this.items[i];\n if (item.isActive && item.transform.getValid() && !exports.VFXItem.isComposition(item) && !skip(item)) {\n var hitParams = item.getHitTestParams(force);\n if (hitParams) {\n var success = false;\n var intersectPoint = new Vector3();\n if (hitParams.type === exports.HitTestType.triangle) {\n var triangles = hitParams.triangles, backfaceCulling = hitParams.backfaceCulling;\n for(var j = 0; j < triangles.length; j++){\n var triangle = triangles[j];\n if (ray.intersectTriangle(triangle, intersectPoint, backfaceCulling)) {\n success = true;\n hitPositions.push(intersectPoint);\n break;\n }\n }\n } else if (hitParams.type === exports.HitTestType.box) {\n var center = hitParams.center, size = hitParams.size;\n var boxMin = center.clone().addScaledVector(size, 0.5);\n var boxMax = center.clone().addScaledVector(size, -0.5);\n if (ray.intersectBox({\n min: boxMin,\n max: boxMax\n }, intersectPoint)) {\n success = true;\n hitPositions.push(intersectPoint);\n }\n } else if (hitParams.type === exports.HitTestType.sphere) {\n var center1 = hitParams.center, radius = hitParams.radius;\n if (ray.intersectSphere({\n center: center1,\n radius: radius\n }, intersectPoint)) {\n success = true;\n hitPositions.push(intersectPoint);\n }\n } else if (hitParams.type === exports.HitTestType.custom) {\n var tempPosition = hitParams.collect(ray, new Vector2(x, y));\n if (tempPosition && tempPosition.length > 0) {\n tempPosition.forEach(function(pos) {\n hitPositions.push(pos);\n });\n success = true;\n }\n }\n if (success) {\n var region = {\n compContent: _this.item,\n id: item.id,\n name: item.name,\n position: hitPositions[hitPositions.length - 1],\n parentId: item.parentId,\n hitPositions: hitPositions,\n behavior: hitParams.behavior\n };\n // 触发单个元素的点击事件\n item.emit(\"click\", region);\n regions.push(region);\n if (stop(region)) {\n return {\n v: regions\n };\n }\n }\n }\n }\n };\n var hitPositions = [];\n var stop = (options == null ? void 0 : options.stop) || noop;\n var skip = (options == null ? void 0 : options.skip) || noop;\n var maxCount = (options == null ? void 0 : options.maxCount) || this.items.length;\n for(var i = 0; i < this.items.length && regions.length < maxCount; i++){\n var _ret = (_this = this, _loop(i));\n if (_type_of(_ret) === \"object\") return _ret.v;\n }\n return regions;\n };\n /**\n * 设置当前合成子元素的渲染顺序\n * @internal\n */ _proto.setChildrenRenderOrder = function setChildrenRenderOrder(startOrder) {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n item.renderOrder = startOrder++;\n var subCompositionComponent = item.getComponent(CompositionComponent);\n if (subCompositionComponent) {\n startOrder = subCompositionComponent.setChildrenRenderOrder(startOrder);\n }\n }\n return startOrder;\n };\n _proto.fromData = function fromData(data) {\n Component.prototype.fromData.call(this, data);\n var compositionData = data;\n var _compositionData_startTime;\n this.startTime = (_compositionData_startTime = compositionData.startTime) != null ? _compositionData_startTime : 0;\n };\n _proto.resolveBindings = function resolveBindings() {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.sceneBindings), _step; !(_step = _iterator()).done;){\n var sceneBinding = _step.value;\n sceneBinding.key.boundObject = sceneBinding.value;\n }\n // 为了通过帧对比,需要保证和原有的 update 时机一致。\n // 因此这边更新一次对象绑定,后续 timeline playable 中 sort tracks 的排序才能和原先的版本对上。\n // 如果不需要严格保证和之前的 updata 时机一致,这边的更新和 timeline asset 中的 sortTracks 都能去掉。\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.timelineAsset.tracks), _step1; !(_step1 = _iterator1()).done;){\n var masterTrack = _step1.value;\n this.updateTrackAnimatedObject(masterTrack);\n }\n };\n _proto.updateTrackAnimatedObject = function updateTrackAnimatedObject(track) {\n for(var _iterator = _create_for_of_iterator_helper_loose(track.getChildTracks()), _step; !(_step = _iterator()).done;){\n var subTrack = _step.value;\n subTrack.updateAnimatedObject();\n this.updateTrackAnimatedObject(subTrack);\n }\n };\n return CompositionComponent;\n}(Component);\n__decorate([\n serialize()\n], exports.CompositionComponent.prototype, \"items\", void 0);\n__decorate([\n serialize()\n], exports.CompositionComponent.prototype, \"sceneBindings\", void 0);\n__decorate([\n serialize()\n], exports.CompositionComponent.prototype, \"timelineAsset\", void 0);\nexports.CompositionComponent = __decorate([\n effectsClass(\"CompositionComponent\")\n], exports.CompositionComponent);\n\n/**\n *\n */ /**\n * 事件监听器\n */ var EventEmitter = function EventEmitter() {\n var _this = this;\n var _this1 = this;\n this.listeners = {};\n /**\n * 移除事件监听器\n * @param eventName - 事件名称\n * @param listener - 事件监听器\n * @returns\n */ this.off = function(eventName, listener) {\n if (!_this.listeners[eventName]) {\n return;\n }\n _this.listeners[eventName] = _this.listeners[eventName].filter(function(param) {\n var l = param.listener;\n return l !== listener;\n });\n };\n /**\n * 监听事件\n * @param eventName - 事件名称\n * @param listener - 事件监听器\n * @param options - 事件监听器选项\n * @returns\n */ this.on = function(eventName, listener, options) {\n _this.listeners[eventName] = _this.listeners[eventName] || [];\n _this.listeners[eventName].push({\n listener: listener,\n options: options\n });\n return function() {\n return _this.off(eventName, listener);\n };\n };\n /**\n * 一次性监听事件\n * @param eventName - 事件名称\n * @param listener - 事件监听器\n */ this.once = function(eventName, listener) {\n _this.on(eventName, listener, {\n once: true\n });\n };\n /**\n * 触发事件\n * @param eventName - 事件名称\n * @param args - 事件参数\n */ this.emit = function(eventName) {\n for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n args[_key - 1] = arguments[_key];\n }\n var _this_listeners_eventName;\n (_this_listeners_eventName = _this1.listeners[eventName]) == null ? void 0 : _this_listeners_eventName.forEach(function(param) {\n var listener = param.listener, options = param.options;\n listener.apply(void 0, [].concat(args));\n if (options == null ? void 0 : options.once) {\n _this1.off(eventName, listener);\n }\n });\n };\n /**\n * 获取事件名称对应的所有监听器\n * @param eventName - 事件名称\n * @returns - 返回事件名称对应的所有监听器\n */ this.getListeners = function(eventName) {\n var _this_listeners_eventName;\n return ((_this_listeners_eventName = _this.listeners[eventName]) == null ? void 0 : _this_listeners_eventName.map(function(param) {\n var listener = param.listener;\n return listener;\n })) || [];\n };\n};\n\n/**\n *\n */ var SceneTicking = /*#__PURE__*/ function() {\n function SceneTicking() {\n this.update = new UpdateTickData();\n this.lateUpdate = new LateUpdateTickData();\n }\n var _proto = SceneTicking.prototype;\n /**\n *\n * @param obj\n */ _proto.addComponent = function addComponent(obj) {\n if (obj.onUpdate !== Component.prototype.onUpdate) {\n this.update.addComponent(obj);\n }\n if (obj.onLateUpdate !== Component.prototype.onLateUpdate) {\n this.lateUpdate.addComponent(obj);\n }\n };\n /**\n *\n * @param obj\n */ _proto.removeComponent = function removeComponent(obj) {\n if (obj.onUpdate !== Component.prototype.onUpdate) {\n this.update.removeComponent(obj);\n }\n if (obj.onLateUpdate !== Component.prototype.onLateUpdate) {\n this.lateUpdate.removeComponent(obj);\n }\n };\n /**\n *\n */ _proto.clear = function clear() {\n this.update.clear();\n this.lateUpdate.clear();\n };\n return SceneTicking;\n}();\nvar TickData = /*#__PURE__*/ function() {\n function TickData() {\n this.components = [];\n this.ticks = [];\n }\n var _proto = TickData.prototype;\n _proto.tick = function tick(dt) {\n this.tickComponents(this.components, dt);\n for(var i = 0; i < this.ticks.length; i++){\n this.ticks[i](dt);\n }\n };\n _proto.tickComponents = function tickComponents(components, dt) {\n // To be implemented in derived classes\n };\n _proto.addComponent = function addComponent(component) {\n if (!this.components.includes(component)) {\n this.components.push(component);\n }\n };\n _proto.removeComponent = function removeComponent(component) {\n var index = this.components.indexOf(component);\n if (index > -1) {\n this.components.splice(index, 1);\n }\n };\n _proto.addTick = function addTick(method, callee) {\n var tick = method.bind(callee);\n if (!this.ticks.includes(tick)) {\n this.ticks.push(tick);\n }\n };\n _proto.clear = function clear() {\n this.components = [];\n };\n return TickData;\n}();\nvar UpdateTickData = /*#__PURE__*/ function(TickData) {\n _inherits(UpdateTickData, TickData);\n function UpdateTickData() {\n return TickData.apply(this, arguments);\n }\n var _proto = UpdateTickData.prototype;\n _proto.tickComponents = function tickComponents(components, dt) {\n for(var _iterator = _create_for_of_iterator_helper_loose(components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n component.onUpdate(dt);\n }\n };\n return UpdateTickData;\n}(TickData);\nvar LateUpdateTickData = /*#__PURE__*/ function(TickData) {\n _inherits(LateUpdateTickData, TickData);\n function LateUpdateTickData() {\n return TickData.apply(this, arguments);\n }\n var _proto = LateUpdateTickData.prototype;\n _proto.tickComponents = function tickComponents(components, dt) {\n for(var _iterator = _create_for_of_iterator_helper_loose(components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n component.onLateUpdate(dt);\n }\n };\n return LateUpdateTickData;\n} // function compareComponents (a: Component, b: Component): number {\n // const itemA = a.item;\n // const itemB = b.item;\n // if (VFXItem.isAncestor(itemA, itemB)) {\n // return -1;\n // } else {\n // return 1;\n // }\n // }\n(TickData);\n\n/**\n * 合成抽象类:核心对象,通常一个场景只包含一个合成,可能会有多个合成。\n * 合成中包含了相关的 Item 元素,支持对 Item 元素的创建、更新和销毁。\n * 也负责 Item 相关的动画播放控制,和持有渲染帧数据。\n */ var Composition = /*#__PURE__*/ function(EventEmitter) {\n _inherits(Composition, EventEmitter);\n function Composition(props, scene) {\n var _this;\n var _scene_jsonScene_renderSettings;\n _this = EventEmitter.call(this) || this;\n /**\n *\n */ _this.sceneTicking = new SceneTicking();\n /**\n * 动画播放速度\n */ _this.speed = 1;\n /**\n * 合成是否结束\n */ _this.isEnded = false;\n /**\n * 用于保存与当前合成相关的插件数据\n */ _this.loaderData = {};\n /**\n * 预合成数组\n */ _this.refContent = [];\n /**\n * 是否开启后处理\n */ _this.postProcessingEnabled = false;\n // TODO: 待优化\n _this.assigned = false;\n /**\n * 销毁状态位\n */ _this.destroyed = false;\n _this.postLoaders = [];\n /**\n * 合成暂停/播放 标识\n */ _this.paused = false;\n _this.lastVideoUpdateTime = 0;\n _this.isEndCalled = false;\n _this._textures = [];\n var _props_reusable = props.reusable, reusable = _props_reusable === void 0 ? false : _props_reusable, _props_speed = props.speed, speed = _props_speed === void 0 ? 1 : _props_speed, _props_baseRenderOrder = props.baseRenderOrder, baseRenderOrder = _props_baseRenderOrder === void 0 ? 0 : _props_baseRenderOrder, renderer = props.renderer, event = props.event, width = props.width, height = props.height, handleItemMessage = props.handleItemMessage;\n _this.renderer = renderer;\n _this._textures = scene.textureOptions;\n var _scene_jsonScene_renderSettings_postProcessingEnabled;\n _this.postProcessingEnabled = (_scene_jsonScene_renderSettings_postProcessingEnabled = (_scene_jsonScene_renderSettings = scene.jsonScene.renderSettings) == null ? void 0 : _scene_jsonScene_renderSettings.postProcessingEnabled) != null ? _scene_jsonScene_renderSettings_postProcessingEnabled : false;\n _this.getEngine().renderLevel = scene.renderLevel;\n if (reusable) {\n _this.keepResource = true;\n scene.textures = undefined;\n scene.consumed = true;\n }\n var sourceContent = scene.jsonScene.compositions[0];\n for(var _iterator = _create_for_of_iterator_helper_loose(scene.jsonScene.compositions), _step; !(_step = _iterator()).done;){\n var composition = _step.value;\n if (composition.id === scene.jsonScene.compositionId) {\n sourceContent = composition;\n }\n }\n assertExist(sourceContent);\n // Instantiate composition rootItem\n _this.rootItem = new exports.VFXItem(_this.getEngine());\n _this.rootItem.name = \"rootItem\";\n _this.rootItem.duration = sourceContent.duration;\n _this.rootItem.endBehavior = sourceContent.endBehavior;\n _this.rootItem.composition = _assert_this_initialized(_this);\n // Create rootItem components\n //@ts-expect-error TODO update spec.\n var componentPaths = sourceContent.components;\n for(var _iterator1 = _create_for_of_iterator_helper_loose(componentPaths), _step1; !(_step1 = _iterator1()).done;){\n var componentPath = _step1.value;\n var component = _this.getEngine().findObject(componentPath);\n _this.rootItem.components.push(component);\n component.item = _this.rootItem;\n }\n _this.rootComposition = _this.rootItem.getComponent(exports.CompositionComponent);\n _this.width = width;\n _this.height = height;\n _this.renderOrder = baseRenderOrder;\n _this.id = sourceContent.id;\n _this.renderer = renderer;\n _this.event = event;\n var _scene_startTime, _scene_totalTime;\n _this.statistic = {\n loadStart: (_scene_startTime = scene.startTime) != null ? _scene_startTime : 0,\n loadTime: (_scene_totalTime = scene.totalTime) != null ? _scene_totalTime : 0,\n compileTime: 0,\n firstFrameTime: 0\n };\n _this.reusable = reusable;\n _this.speed = speed;\n _this.name = sourceContent.name;\n _this.pluginSystem = scene.pluginSystem;\n _this.pluginSystem.initializeComposition(_assert_this_initialized(_this), scene);\n _this.camera = new Camera(_this.name, _extends({}, sourceContent == null ? void 0 : sourceContent.camera, {\n aspect: width / height\n }));\n _this.url = scene.url;\n _this.assigned = true;\n _this.interactive = true;\n _this.handleItemMessage = handleItemMessage;\n _this.createRenderFrame();\n _this.rendererOptions = null;\n Composition.buildItemTree(_this.rootItem);\n _this.rootComposition.setChildrenRenderOrder(0);\n _this.pluginSystem.resetComposition(_assert_this_initialized(_this), _this.renderFrame);\n return _this;\n }\n var _proto = Composition.prototype;\n /**\n * 获取合成的时长\n */ _proto.getDuration = function getDuration() {\n return this.rootItem.duration;\n };\n /**\n * 重新开始合成\n */ _proto.restart = function restart() {\n this.reset();\n this.forwardTime(this.startTime);\n };\n /**\n * 设置当前合成的渲染顺序\n * @param index - 序号,大的后绘制\n */ _proto.setIndex = function setIndex(index) {\n this.renderOrder = index;\n };\n /**\n * 获取当前合成的渲染顺序\n * @returns\n */ _proto.getIndex = function getIndex() {\n return this.renderOrder;\n };\n /**\n * 设置合成的动画速度\n * @param speed - 速度\n */ _proto.setSpeed = function setSpeed(speed) {\n this.speed = speed;\n };\n /**\n * 设置合成的可见性\n * @since 2.0.0\n * @param visible - 是否可见\n */ _proto.setVisible = function setVisible(visible) {\n this.rootItem.setVisible(visible);\n };\n /**\n * 获取合成的动画速度\n * @returns\n */ _proto.getSpeed = function getSpeed() {\n return this.speed;\n };\n /**\n *\n */ _proto.play = function play() {\n if (this.isEnded && this.reusable) {\n this.restart();\n }\n if (this.rootComposition.isStartCalled) {\n this.gotoAndPlay(this.time - this.startTime);\n } else {\n this.gotoAndPlay(0);\n }\n };\n /**\n * 暂停合成的播放\n */ _proto.pause = function pause() {\n this.paused = true;\n };\n /**\n *\n * @returns\n */ _proto.getPaused = function getPaused() {\n return this.paused;\n };\n /**\n * 恢复合成的播放\n */ _proto.resume = function resume() {\n this.paused = false;\n };\n /**\n * 跳转合成到指定时间播放\n * @param time - 相对 startTime 的时间\n */ _proto.gotoAndPlay = function gotoAndPlay(time) {\n this.setTime(time);\n this.resume();\n };\n /**\n * 跳转合成到指定时间并暂停\n * @param time - 相对 startTime 的时间\n */ _proto.gotoAndStop = function gotoAndStop(time) {\n this.setTime(time);\n this.pause();\n };\n /**\n *\n */ _proto.createRenderFrame = function createRenderFrame() {\n this.renderFrame = new RenderFrame({\n camera: this.camera,\n renderer: this.renderer,\n keepColorBuffer: this.keepColorBuffer,\n globalVolume: this.globalVolume,\n postProcessingEnabled: this.postProcessingEnabled\n });\n // TODO 考虑放到构造函数\n this.renderFrame.cachedTextures = this.textures;\n };\n /**\n * 跳到指定时间点(不做任何播放行为)\n * @param time - 相对 startTime 的时间\n */ _proto.setTime = function setTime(time) {\n var speed = this.speed;\n var pause = this.getPaused();\n if (pause) {\n this.resume();\n }\n this.setSpeed(1);\n this.forwardTime(time + this.startTime);\n this.setSpeed(speed);\n if (pause) {\n this.pause();\n }\n this.emit(\"goto\", {\n time: time\n });\n };\n _proto.addItem = function addItem(item) {\n this.items.push(item);\n item.setParent(this.rootItem);\n };\n /**\n * 前进合成到指定时间\n * @param time - 相对0时刻的时间\n */ _proto.forwardTime = function forwardTime(time) {\n var deltaTime = time * 1000 - this.rootComposition.time * 1000;\n var reverse = deltaTime < 0;\n var step = 15;\n var t = Math.abs(deltaTime);\n var ss = reverse ? -step : step;\n for(t; t > step; t -= step){\n this.update(ss);\n }\n this.update(reverse ? -t : t);\n };\n /**\n * 重置状态函数\n */ _proto.reset = function reset() {\n this.rendererOptions = null;\n this.isEnded = false;\n this.isEndCalled = false;\n this.rootComposition.time = 0;\n this.pluginSystem.resetComposition(this, this.renderFrame);\n };\n _proto.prepareRender = function prepareRender() {\n var _this = this;\n var frame = this.renderFrame;\n this.postLoaders.length = 0;\n this.pluginSystem.plugins.forEach(function(loader) {\n if (loader.prepareRenderFrame(_this, frame)) {\n _this.postLoaders.push(loader);\n }\n });\n this.postLoaders.forEach(function(loader) {\n return loader.postProcessFrame(_this, frame);\n });\n };\n /**\n * 合成更新,针对所有 item 的更新\n * @param deltaTime - 更新的时间步长\n */ _proto.update = function update(deltaTime) {\n if (!this.assigned || this.getPaused()) {\n return;\n }\n // scene VFXItem components lifetime function.\n if (!this.rootItem.isDuringPlay) {\n this.callAwake(this.rootItem);\n this.rootItem.beginPlay();\n }\n var dt = parseFloat(this.getUpdateTime(deltaTime * this.speed).toFixed(0));\n this.updateRootComposition(dt / 1000);\n this.updateVideo();\n // 更新 model-tree-plugin\n this.updatePluginLoaders(deltaTime);\n this.sceneTicking.update.tick(dt);\n this.sceneTicking.lateUpdate.tick(dt);\n this.updateCamera();\n this.prepareRender();\n if (this.isEnded && !this.isEndCalled) {\n this.isEndCalled = true;\n this.emit(\"end\", {\n composition: this\n });\n }\n if (this.shouldDispose()) {\n this.dispose();\n }\n };\n _proto.shouldDispose = function shouldDispose() {\n return this.isEnded && this.rootItem.endBehavior === EndBehavior.destroy && !this.reusable;\n };\n _proto.getUpdateTime = function getUpdateTime(t) {\n var startTimeInMs = this.startTime * 1000;\n var now = this.rootComposition.time * 1000;\n if (t < 0 && now + t < startTimeInMs) {\n return startTimeInMs - now;\n }\n return t;\n };\n _proto.callAwake = function callAwake(item) {\n for(var _iterator = _create_for_of_iterator_helper_loose(item.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n if (!component.isAwakeCalled) {\n component.onAwake();\n component.isAwakeCalled = true;\n }\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(item.children), _step1; !(_step1 = _iterator1()).done;){\n var child = _step1.value;\n this.callAwake(child);\n }\n };\n /**\n * 更新视频数据到纹理\n * @override\n */ _proto.updateVideo = function updateVideo() {\n var now = performance.now();\n // 视频固定30帧更新\n if (now - this.lastVideoUpdateTime > 33) {\n var _this_textures;\n ((_this_textures = this.textures) != null ? _this_textures : []).forEach(function(tex) {\n return tex == null ? void 0 : tex.uploadCurrentVideoFrame();\n });\n this.lastVideoUpdateTime = now;\n }\n };\n /**\n * 更新相机\n * @override\n */ _proto.updateCamera = function updateCamera() {\n this.camera.updateMatrix();\n };\n /**\n * 插件更新,来自 CompVFXItem 的更新调用\n * @param deltaTime - 更新的时间步长\n */ _proto.updatePluginLoaders = function updatePluginLoaders(deltaTime) {\n var _this = this;\n this.pluginSystem.plugins.forEach(function(loader) {\n return loader.onCompositionUpdate(_this, deltaTime);\n });\n };\n /**\n * 更新主合成组件\n */ _proto.updateRootComposition = function updateRootComposition(deltaTime) {\n if (this.rootComposition.state === PlayState.Paused || !this.rootComposition.isActiveAndEnabled) {\n return;\n }\n var localTime = parseFloat((this.time + deltaTime - this.rootItem.start).toFixed(3));\n var isEnded = false;\n var duration = this.rootItem.duration;\n var endBehavior = this.rootItem.endBehavior;\n if (localTime - duration > 0.001) {\n isEnded = true;\n switch(endBehavior){\n case EndBehavior.restart:\n {\n localTime = localTime % duration;\n this.restart();\n break;\n }\n case EndBehavior.freeze:\n {\n localTime = Math.min(duration, localTime);\n break;\n }\n case EndBehavior.forward:\n {\n break;\n }\n case EndBehavior.destroy:\n {\n break;\n }\n }\n }\n this.rootComposition.time = localTime;\n // end state changed, handle onEnd flags\n if (this.isEnded !== isEnded) {\n if (isEnded) {\n this.isEnded = true;\n } else {\n this.isEnded = false;\n this.isEndCalled = false;\n }\n }\n };\n /**\n * 通过名称获取元素\n * @param name - 元素名称\n * @returns 元素对象\n */ _proto.getItemByName = function getItemByName(name) {\n return this.rootItem.find(name);\n };\n /**\n * 获取指定位置和相机连成的射线\n * @param x\n * @param y\n * @returns\n */ _proto.getHitTestRay = function getHitTestRay(x, y) {\n var _this_renderFrame_editorTransform = this.renderFrame.editorTransform, a = _this_renderFrame_editorTransform.x, b = _this_renderFrame_editorTransform.y, c = _this_renderFrame_editorTransform.z, d = _this_renderFrame_editorTransform.w;\n return setRayFromCamera((x - c) / a, (y - d) / b, this.camera);\n };\n /**\n * 获取 engine 对象\n * @returns\n */ _proto.getEngine = function getEngine() {\n var _this_renderer;\n return (_this_renderer = this.renderer) == null ? void 0 : _this_renderer.engine;\n };\n /**\n * Item 求交测试,返回求交结果列表,x 和 y 是归一化到[-1, 1]区间的值,原点在左上角\n * @param x - 鼠标或触点的 x,已经归一化到[-1, 1]\n * @param y - 鼠标或触点的 y,已经归一化到[-1, 1]\n * @param force - 是否强制求交,没有交互信息的 Item 也要进行求交测试\n * @param options - 最大求交数和求交时的回调\n */ _proto.hitTest = function hitTest(x, y, force, options) {\n if (this.isDestroyed || !this.interactive) {\n return [];\n }\n var regions = [];\n var ray = this.getHitTestRay(x, y);\n this.refContent.forEach(function(ref) {\n var _ref_getComponent;\n (_ref_getComponent = ref.getComponent(exports.CompositionComponent)) == null ? void 0 : _ref_getComponent.hitTest(ray, x, y, regions, force, options);\n });\n return regions;\n };\n /**\n * InteractItem 生命周期开始时的调用\n * @param item - 交互元素\n * @param type - 交互类型\n */ _proto.addInteractiveItem = function addInteractiveItem(item, type) {\n if (type === InteractType.MESSAGE) {\n this.handleItemMessage({\n name: item.name,\n phrase: MESSAGE_ITEM_PHRASE_BEGIN,\n id: item.id,\n compositionId: this.id\n });\n item.emit(\"message\", {\n name: item.name,\n phrase: MESSAGE_ITEM_PHRASE_BEGIN,\n id: item.id\n });\n return item.id;\n }\n };\n /**\n * InteractItem 生命周期结束时的调用\n * @param item - 交互元素\n * @param type - 交互类型\n */ _proto.removeInteractiveItem = function removeInteractiveItem(item, type) {\n // MESSAGE ITEM 的结束行为\n if (type === InteractType.MESSAGE) {\n this.handleItemMessage({\n name: item.name,\n phrase: MESSAGE_ITEM_PHRASE_END,\n id: item.id,\n compositionId: this.id\n });\n item.emit(\"message\", {\n name: item.name,\n phrase: MESSAGE_ITEM_PHRASE_END,\n id: item.id\n });\n }\n };\n /**\n * 销毁 Item\n * @internal\n * @param item - 需要销毁的 item\n */ _proto.destroyItem = function destroyItem(item) {\n var _this = this;\n // 预合成元素销毁时销毁其中的item\n if (item.type == ItemType.composition) {\n if (item.endBehavior !== EndBehavior.freeze) {\n var contentItems = item.getComponent(exports.CompositionComponent).items;\n contentItems.forEach(function(it) {\n return _this.pluginSystem.plugins.forEach(function(loader) {\n return loader.onCompositionItemRemoved(_this, it);\n });\n });\n }\n } else {\n // this.content.removeItem(item);\n // 预合成中的元素移除\n // this.refContent.forEach(content => content.removeItem(item));\n removeItem(this.items, item);\n this.pluginSystem.plugins.forEach(function(loader) {\n return loader.onCompositionItemRemoved(_this, item);\n });\n }\n };\n _proto.lost = function lost(e) {\n this.videoState = this.textures.map(function(tex) {\n if (\"video\" in tex.source) {\n tex.source.video.pause();\n return tex.source.video.currentTime;\n }\n });\n this.textures.map(function(tex) {\n return tex.dispose();\n });\n this.dispose();\n };\n /**\n * 合成对象销毁\n */ _proto.dispose = function dispose() {\n var _this = this;\n var _this_rendererOptions, _this_pluginSystem;\n if (this.destroyed) {\n return;\n }\n this.destroyed = true;\n var textureDisposes = {};\n var textures = this.textures;\n if (textures) {\n if (this.keepResource) {\n textures.forEach(function(tex) {\n if (tex == null ? void 0 : tex.dispose) {\n textureDisposes[tex.id] = tex.dispose;\n tex.dispose = noop;\n }\n });\n }\n }\n this.rootItem.dispose();\n // FIXME: 注意这里增加了renderFrame销毁\n this.renderFrame.dispose();\n (_this_rendererOptions = this.rendererOptions) == null ? void 0 : _this_rendererOptions.emptyTexture.dispose();\n (_this_pluginSystem = this.pluginSystem) == null ? void 0 : _this_pluginSystem.destroyComposition(this);\n this.update = function() {\n {\n logger.error(\"Update disposed composition: \" + _this.name + \".\");\n }\n };\n this.dispose = noop;\n if (textures && this.keepResource) {\n textures.forEach(function(tex) {\n tex.dispose = textureDisposes[tex.id];\n tex.dispose();\n });\n }\n if (this.renderer.env === PLAYER_OPTIONS_ENV_EDITOR) {\n return;\n }\n this.renderer.clear({\n stencilAction: exports.TextureLoadAction.clear,\n clearStencil: 0,\n depthAction: exports.TextureLoadAction.clear,\n clearDepth: 1,\n colorAction: exports.TextureLoadAction.clear,\n clearColor: [\n 0,\n 0,\n 0,\n 0\n ]\n });\n };\n /**\n * 编辑器使用的 transform 修改方法\n * @internal\n * @param scale - 缩放比例\n * @param dx - x偏移量\n * @param dy - y偏移量\n */ _proto.setEditorTransform = function setEditorTransform(scale, dx, dy) {\n this.renderFrame.editorTransform.set(scale, scale, dx, dy);\n };\n /**\n * 合成整体在水平方向移动 x 像素,垂直方向移动 y 像素\n */ _proto.translateByPixel = function translateByPixel(x, y) {\n if (!this.renderer) {\n console.warn(\"Renderer not assigned. Operation aborted.\");\n return;\n }\n this.rootItem.translateByPixel(x, y);\n };\n /**\n * 设置合成在画布上的像素位置\n * Tips:\n * - 坐标原点在 canvas 左上角,x 正方向水平向右, y 正方向垂直向下\n * - 设置后会覆盖原有的位置信息\n * @param x - x 坐标\n * @param y - y 坐标\n */ _proto.setPositionByPixel = function setPositionByPixel(x, y) {\n if (!this.renderer) {\n console.warn(\"Renderer not assigned. Operation aborted.\");\n return;\n }\n this.rootItem.setPositionByPixel(x, y);\n };\n /**\n * 设置合成在 3D 坐标轴上相对当前的位移\n */ _proto.translate = function translate(x, y, z) {\n this.rootItem.translate(x, y, z);\n };\n /**\n * 设置合成在 3D 坐标轴上相对原点的位移\n */ _proto.setPosition = function setPosition(x, y, z) {\n this.rootItem.setPosition(x, y, z);\n };\n /**\n * 设置合成在 3D 坐标轴上相对当前的旋转(角度)\n */ _proto.rotate = function rotate(x, y, z) {\n this.rootItem.rotate(x, y, z);\n };\n /**\n * 设置合成在 3D 坐标轴上的相对原点的旋转(角度)\n */ _proto.setRotation = function setRotation(x, y, z) {\n this.rootItem.setRotation(x, y, z);\n };\n /**\n * 设置合成在 3D 坐标轴上相对当前的缩放\n */ _proto.scale = function scale(x, y, z) {\n this.rootItem.scale(x, y, z);\n };\n /**\n * 设置合成在 3D 坐标轴上的缩放\n */ _proto.setScale = function setScale(x, y, z) {\n this.rootItem.setScale(x, y, z);\n };\n /**\n * 卸载贴图纹理方法,减少内存\n */ _proto.offloadTexture = function offloadTexture() {\n if (!this.textureOffloaded) {\n this.textures.forEach(function(tex) {\n return tex && tex.offloadData();\n });\n this.textureOffloaded = true;\n }\n };\n _proto.getRendererOptions = function getRendererOptions() {\n if (!this.rendererOptions) {\n this.rendererOptions = {\n emptyTexture: this.renderFrame.emptyTexture,\n cachePrefix: \"-\"\n };\n }\n return this.rendererOptions;\n };\n /**\n * 重新加载纹理\n */ _proto.reloadTexture = function reloadTexture() {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!_this.textureOffloaded) return [\n 3,\n 2\n ];\n return [\n 4,\n Promise.all(_this.textures.map(function(tex) {\n return tex == null ? void 0 : tex.reloadData();\n }))\n ];\n case 1:\n _state.sent();\n _this.textureOffloaded = false;\n _state.label = 2;\n case 2:\n return [\n 2\n ];\n }\n });\n })();\n };\n /**\n * @internal\n * 构建父子树,同时保存到 itemCacheMap 中便于查找\n */ Composition.buildItemTree = function buildItemTree(compVFXItem) {\n var itemMap = new Map();\n var contentItems = compVFXItem.getComponent(exports.CompositionComponent).items;\n for(var _iterator = _create_for_of_iterator_helper_loose(contentItems), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n itemMap.set(item.id, item);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(contentItems), _step1; !(_step1 = _iterator1()).done;){\n var item1 = _step1.value;\n if (item1.parentId === undefined) {\n item1.setParent(compVFXItem);\n } else {\n var parent = itemMap.get(item1.parentId);\n if (parent) {\n item1.setParent(parent);\n } else {\n throw new Error(\"The element references a non-existent element, please check the data.\");\n }\n }\n }\n };\n _create_class(Composition, [\n {\n key: \"transform\",\n get: /**\n * 所有合成 Item 的根变换\n */ function get() {\n return this.rootItem.transform;\n }\n },\n {\n key: \"textures\",\n get: /**\n * 获取场景中的纹理数组\n */ function get() {\n return this._textures;\n }\n },\n {\n key: \"items\",\n get: /**\n * 获取合成中所有元素\n */ function get() {\n return this.rootComposition.items;\n }\n },\n {\n key: \"startTime\",\n get: /**\n * 获取合成开始渲染的时间\n */ function get() {\n return this.rootComposition.startTime;\n }\n },\n {\n key: \"time\",\n get: /**\n * 获取合成当前时间\n */ function get() {\n return this.rootComposition.time;\n }\n },\n {\n key: \"isDestroyed\",\n get: /**\n * 获取销毁状态\n */ function get() {\n return this.destroyed;\n }\n },\n {\n key: \"viewportMatrix\",\n get: function get() {\n return this.camera.getViewportMatrix();\n },\n set: function set(matrix) {\n this.camera.setViewportMatrix(matrix);\n }\n }\n ]);\n return Composition;\n}(EventEmitter);\n\nexports.VFXItem = /*#__PURE__*/ function(EffectsObject) {\n _inherits(VFXItem, EffectsObject);\n function VFXItem(engine, props) {\n var _this;\n _this = EffectsObject.call(this, engine) || this;\n _this.children = [];\n /**\n * 元素的变换包含位置、旋转、缩放。\n */ _this.transform = new Transform();\n /**\n * 元素动画的当前时间\n */ _this.time = -1;\n /**\n * 元素动画的持续时间\n */ _this.duration = 0;\n /**\n * 元素动画的开始时间\n */ _this.start = 0;\n /**\n * 元素动画结束时行为(如何处理元素)\n */ _this.endBehavior = EndBehavior.forward;\n _this.type = ItemType.base;\n _this.components = [];\n _this.isDuringPlay = false;\n /**\n * 元素是否激活\n */ _this.active = true;\n /**\n * 元素组件是否显示,用于批量开关元素组件\n */ _this.visible = true;\n /**\n * 元素动画的速度\n */ _this.speed = 1;\n _this.listIndex = 0;\n _this.isEnabled = false;\n _this.eventProcessor = new EventEmitter();\n _this.name = \"VFXItem\";\n _this.transform.name = _this.name;\n _this.transform.engine = engine;\n if (props) {\n _this.fromData(props);\n }\n return _this;\n }\n var _proto = VFXItem.prototype;\n /**\n * 元素监听事件\n * @param eventName - 事件名称\n * @param listener - 事件监听器\n * @param options - 事件监听器选项\n * @returns\n */ _proto.on = function on(eventName, listener, options) {\n this.eventProcessor.on(eventName, listener, options);\n };\n /**\n * 移除事件监听器\n * @param eventName - 事件名称\n * @param listener - 事件监听器\n * @returns\n */ _proto.off = function off(eventName, listener) {\n this.eventProcessor.off(eventName, listener);\n };\n /**\n * 一次性监听事件\n * @param eventName - 事件名称\n * @param listener - 事件监听器\n */ _proto.once = function once(eventName, listener) {\n this.eventProcessor.once(eventName, listener);\n };\n /**\n * 触发事件\n * @param eventName - 事件名称\n * @param args - 事件参数\n */ _proto.emit = function emit(eventName) {\n for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){\n args[_key - 1] = arguments[_key];\n }\n var _this_eventProcessor;\n (_this_eventProcessor = this.eventProcessor).emit.apply(_this_eventProcessor, [].concat([\n eventName\n ], args));\n };\n /**\n * 获取事件名称对应的所有监听器\n * @param eventName - 事件名称\n * @returns - 返回事件名称对应的所有监听器\n */ _proto.getListeners = function getListeners(eventName) {\n return this.eventProcessor.getListeners(eventName);\n };\n /**\n * 设置元素的动画速度\n * @param speed - 速度\n */ _proto.setSpeed = function setSpeed(speed) {\n this.speed = speed;\n };\n /**\n * 获取元素的动画速度\n * @returns\n */ _proto.getSpeed = function getSpeed() {\n return this.speed;\n };\n /**\n * 添加组件\n * @param classConstructor - 要添加的组件\n */ _proto.addComponent = function addComponent(classConstructor) {\n var newComponent = new classConstructor(this.engine);\n this.components.push(newComponent);\n newComponent.setVFXItem(this);\n return newComponent;\n };\n /**\n * 获取某一类型的组件。如果当前元素绑定了多个同类型的组件只返回第一个\n * @param classConstructor - 要获取的组件类型\n * @returns 查询结果中符合类型的第一个组件\n */ _proto.getComponent = function getComponent(classConstructor) {\n var res;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var com = _step.value;\n if (_instanceof1(com, classConstructor)) {\n res = com;\n break;\n }\n }\n return res;\n };\n /**\n * 获取某一类型的所有组件\n * @param classConstructor - 要获取的组件\n * @returns 一个组件列表,包含所有符合类型的组件\n */ _proto.getComponents = function getComponents(classConstructor) {\n var res = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var com = _step.value;\n if (_instanceof1(com, classConstructor)) {\n res.push(com);\n }\n }\n return res;\n };\n _proto.setParent = function setParent(vfxItem) {\n if (vfxItem === this && !vfxItem) {\n return;\n }\n if (this.parent) {\n removeItem(this.parent.children, this);\n }\n this.parent = vfxItem;\n this.transform.parentTransform = vfxItem.transform;\n vfxItem.children.push(this);\n if (!this.composition && vfxItem.composition) {\n this.composition = vfxItem.composition;\n }\n if (!this.isDuringPlay && vfxItem.isDuringPlay) {\n this.beginPlay();\n }\n };\n /**\n * 通过指定 r、g、b、a 值设置元素的颜色\n * @param {number} r\n * @param {number} g\n * @param {number} b\n * @param {number} a\n * @internal\n */ _proto.setColor = function setColor(r, g, b, a) {};\n /**\n * 设置元素的透明度\n * @param opacity - 透明度值,范围 [0,1]\n */ _proto.setOpacity = function setOpacity(opacity) {};\n /**\n * 激活或停用 VFXItem\n */ _proto.setActive = function setActive(value) {\n if (this.active !== value) {\n this.active = !!value;\n this.onActiveChanged();\n }\n };\n /**\n * 设置元素的显隐,该设置会批量开关元素组件\n */ _proto.setVisible = function setVisible(visible) {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n component.enabled = visible;\n }\n this.visible = visible;\n };\n /**\n * 元素组件显隐状态\n * @deprecated use isVisible instead\n */ _proto.getVisible = function getVisible() {\n return this.visible;\n };\n /**\n * 获取元素变换包括位置、旋转、缩放\n * @param transform 将元素变换拷贝到该对象,并将其作为返回值\n * @returns 元素变换的拷贝\n */ _proto.getWorldTransform = function getWorldTransform(transform) {\n var tf = transform != null ? transform : new Transform({\n valid: true\n });\n tf.cloneFromMatrix(this.transform.getWorldMatrix());\n return tf;\n };\n /**\n * 设置元素在 3D 坐标轴上相对移动\n */ _proto.translate = function translate(x, y, z) {\n this.transform.translate(x, y, z);\n };\n /**\n * 设置元素在 3D 坐标轴上相对旋转(角度)\n */ _proto.rotate = function rotate(x, y, z) {\n var euler = new Euler(x, y, z);\n var q = Quaternion.fromEuler(euler);\n q.conjugate();\n this.transform.rotateByQuat(q);\n };\n /**\n * 设置元素在 3D 坐标轴上相对缩放\n */ _proto.scale = function scale(x, y, z) {\n this.transform.scaleBy(x, y, z);\n };\n /**\n * 设置元素在画布上的像素位置\n * Tips:\n * - 坐标原点在 canvas 左上角,x 正方向水平向右, y 正方向垂直向下\n * - 设置后会覆盖原有的位置信息\n * @param x - x 坐标\n * @param y - y 坐标\n */ _proto.setPositionByPixel = function setPositionByPixel(x, y) {\n if (this.composition) {\n var z = this.transform.getWorldPosition().z;\n var _this_composition_camera_getInverseVPRatio = this.composition.camera.getInverseVPRatio(z), rx = _this_composition_camera_getInverseVPRatio.x, ry = _this_composition_camera_getInverseVPRatio.y;\n var width = this.composition.renderer.getWidth() / 2;\n var height = this.composition.renderer.getHeight() / 2;\n this.transform.setPosition((2 * x / width - 1) * rx, (1 - 2 * y / height) * ry, z);\n }\n };\n /**\n * 设置元素在 3D 坐标轴的位置\n */ _proto.setPosition = function setPosition(x, y, z) {\n this.transform.setPosition(x, y, z);\n };\n /**\n * 设置元素在 3D 坐标轴的角度\n */ _proto.setRotation = function setRotation(x, y, z) {\n this.transform.setRotation(x, y, z);\n };\n /**\n * 设置元素在 3D 坐标轴的缩放\n */ _proto.setScale = function setScale(x, y, z) {\n this.transform.setScale(x, y, z);\n };\n /**\n * 获取元素包围盒\n * @override\n */ _proto.getBoundingBox = function getBoundingBox() {\n // OVERRIDE\n };\n /**\n * 获取元素用于计算光线投射的面片类型和参数\n * @override\n * @param force - 元素没有开启交互也返回参数\n */ _proto.getHitTestParams = function getHitTestParams(force) {\n // OVERRIDE\n };\n /**\n * 获取元素当前世界坐标\n */ _proto.getCurrentPosition = function getCurrentPosition() {\n var pos = new Vector3();\n this.transform.assignWorldTRS(pos);\n return pos;\n };\n _proto.find = function find(name) {\n var _queue;\n if (this.name === name) {\n return this;\n }\n var queue = [];\n (_queue = queue).push.apply(_queue, [].concat(this.children));\n var index = 0;\n while(index < queue.length){\n var _queue1;\n var item = queue[index];\n index++;\n if (item.name === name) {\n return item;\n }\n (_queue1 = queue).push.apply(_queue1, [].concat(item.children));\n }\n return undefined;\n };\n /**\n * 复制 VFXItem,返回一个新的 VFXItem\n * @since 2.4.0\n * @returns 复制的新 VFXItem\n */ _proto.duplicate = function duplicate() {\n var previousObjectIDMap = new Map();\n this.gatherPreviousObjectID(previousObjectIDMap);\n // 重新设置当前元素和组件的 ID 以及子元素和子元素组件的 ID,避免实例化新的对象时产生碰撞\n this.resetGUID();\n var newItem = this.engine.findObject({\n id: this.defination.id\n });\n newItem.resetGUID();\n this.resetGUID(previousObjectIDMap);\n if (this.composition) {\n newItem.setParent(this.composition.rootItem);\n }\n return newItem;\n };\n /**\n * @internal\n */ _proto.beginPlay = function beginPlay() {\n this.isDuringPlay = true;\n if (this.composition && this.active && !this.isEnabled) {\n this.onEnable();\n }\n for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){\n var child = _step.value;\n if (!child.isDuringPlay) {\n child.beginPlay();\n }\n }\n };\n /**\n * @internal\n */ _proto.onActiveChanged = function onActiveChanged() {\n if (!this.isEnabled) {\n this.onEnable();\n } else {\n this.onDisable();\n }\n };\n /**\n * @internal\n */ _proto.onEnable = function onEnable() {\n this.isEnabled = true;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n if (component.enabled && !component.isStartCalled) {\n component.onStart();\n component.isStartCalled = true;\n }\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.components), _step1; !(_step1 = _iterator1()).done;){\n var component1 = _step1.value;\n if (component1.enabled && !component1.isEnableCalled) {\n component1.enable();\n }\n }\n };\n /**\n * @internal\n */ _proto.onDisable = function onDisable() {\n this.isEnabled = false;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n if (component.enabled && component.isEnableCalled) {\n component.disable();\n }\n }\n };\n _proto.fromData = function fromData(data) {\n EffectsObject.prototype.fromData.call(this, data);\n var id = data.id, name = data.name, delay = data.delay, parentId = data.parentId, endBehavior = data.endBehavior, transform = data.transform, _data_duration = data.duration, duration = _data_duration === void 0 ? 0 : _data_duration;\n this.props = data;\n this.type = data.type;\n this.id = id.toString(); // TODO 老数据 id 是 number,需要转换\n this.name = name;\n this.start = delay ? delay : this.start;\n var transformProps = {};\n if (transform) {\n transformProps.position = new Vector3().copyFrom(transform.position);\n // FIXME: transform.rotation待删除\n //@ts-expect-error\n if (transform.quat) {\n //@ts-expect-error\n transformProps.quat = new Quaternion(transform.quat.x, transform.quat.y, transform.quat.z, transform.quat.w);\n } else {\n var _transform_eulerHint;\n //@ts-expect-error\n transformProps.rotation = new Euler().copyFrom((_transform_eulerHint = transform.eulerHint) != null ? _transform_eulerHint : transform.rotation);\n }\n transformProps.scale = new Vector3().copyFrom(transform.scale);\n if (transform.size) {\n transformProps.size = new Vector2().copyFrom(transform.size);\n }\n if (transform.anchor) {\n transformProps.anchor = new Vector2().copyFrom(transform.anchor);\n }\n this.transform.setTransform(transformProps);\n }\n this.transform.name = this.name;\n this.transform.engine = this.engine;\n this.parentId = parentId;\n this.duration = duration;\n this.endBehavior = endBehavior;\n if (!data.content) {\n data.content = {\n options: {}\n };\n }\n if (duration < 0) {\n throw new Error(\"Item duration can't be less than 0, see \" + HELP_LINK$1[\"Item duration can't be less than 0\"] + \".\");\n }\n if (data.components) {\n this.components.length = 0;\n for(var _iterator = _create_for_of_iterator_helper_loose(data.components), _step; !(_step = _iterator()).done;){\n var componentPath = _step.value;\n var component = this.engine.findObject(componentPath);\n this.components.push(component);\n // TODO ParticleSystemRenderer 现在是动态生成的,后面需要在 json 中单独表示为一个组件\n if (_instanceof1(component, exports.ParticleSystem)) {\n if (!this.components.includes(component.renderer)) {\n this.components.push(component.renderer);\n }\n }\n }\n }\n if (VFXItem.isComposition(this)) {\n this.instantiatePreComposition();\n }\n };\n _proto.toData = function toData() {\n var _this_parent;\n this.defination.id = this.guid;\n this.defination.transform = this.transform.toData();\n this.defination.dataType = DataType.VFXItemData;\n if (((_this_parent = this.parent) == null ? void 0 : _this_parent.name) !== \"rootItem\") {\n var _this_parent1;\n this.defination.parentId = (_this_parent1 = this.parent) == null ? void 0 : _this_parent1.guid;\n }\n // TODO 统一 sprite 等其他组件的序列化逻辑\n if (!this.defination.components) {\n this.defination.components = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n if (_instanceof1(component, exports.EffectComponent)) {\n this.defination.components.push(component);\n }\n }\n }\n this.defination.content = {};\n };\n _proto.translateByPixel = function translateByPixel(x, y) {\n if (this.composition) {\n // @ts-expect-error\n var _this_composition_renderer_canvas_getBoundingClientRect = this.composition.renderer.canvas.getBoundingClientRect(), width = _this_composition_renderer_canvas_getBoundingClientRect.width, height = _this_composition_renderer_canvas_getBoundingClientRect.height;\n var z = this.transform.getWorldPosition().z;\n var _this_composition_camera_getInverseVPRatio = this.composition.camera.getInverseVPRatio(z), rx = _this_composition_camera_getInverseVPRatio.x, ry = _this_composition_camera_getInverseVPRatio.y;\n this.transform.translate(2 * x * rx / width, -2 * y * ry / height, 0);\n }\n };\n /**\n * 销毁元素\n */ _proto.dispose = function dispose() {\n this.resetChildrenParent();\n if (this.composition) {\n this.composition.destroyItem(this);\n // component 调用 dispose() 会将自身从 this.components 数组删除,slice() 避免迭代错误\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components.slice()), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n component.dispose();\n }\n this.components = [];\n this._content = undefined;\n this._composition = null;\n this.transform.setValid(false);\n }\n };\n _proto.resetChildrenParent = function resetChildrenParent() {\n // GE 父元素销毁子元素继承逻辑\n // 如果有父对象,销毁时子对象继承父对象。\n for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){\n var child = _step.value;\n if (this.parent) {\n child.setParent(this.parent);\n }\n }\n if (this.parent) {\n var _this_parent;\n removeItem((_this_parent = this.parent) == null ? void 0 : _this_parent.children, this);\n }\n // const contentItems = compositonVFXItem.getComponent(CompositionComponent)!.items;\n // contentItems.splice(contentItems.indexOf(this), 1);\n // else {\n // // 普通元素正常销毁逻辑, 子元素不继承\n // if (this.parent) {\n // removeItem(this.parent?.children, this);\n // }\n // }\n };\n _proto.instantiatePreComposition = function instantiatePreComposition() {\n var compositionContent = this.props.content;\n var refId = compositionContent.options.refId;\n var props = this.engine.findEffectsObjectData(refId);\n if (!props) {\n throw new Error(\"Referenced precomposition with Id: \" + refId + \" does not exist.\");\n }\n //@ts-expect-error TODO update spec.\n var componentPaths = props.components;\n for(var _iterator = _create_for_of_iterator_helper_loose(componentPaths), _step; !(_step = _iterator()).done;){\n var componentPath = _step.value;\n var component = this.engine.findObject(componentPath);\n component.item = this;\n this.components.push(component);\n component.setInstanceId(generateGUID());\n if (_instanceof1(component, exports.CompositionComponent)) {\n for(var _iterator1 = _create_for_of_iterator_helper_loose(component.items), _step1; !(_step1 = _iterator1()).done;){\n var vfxItem = _step1.value;\n vfxItem.setInstanceId(generateGUID());\n for(var _iterator2 = _create_for_of_iterator_helper_loose(vfxItem.components), _step2; !(_step2 = _iterator2()).done;){\n var component1 = _step2.value;\n component1.setInstanceId(generateGUID());\n }\n }\n }\n }\n Composition.buildItemTree(this);\n };\n _proto.resetGUID = function resetGUID(previousObjectIDMap) {\n var _previousObjectIDMap_get;\n var itemGUID = (_previousObjectIDMap_get = previousObjectIDMap == null ? void 0 : previousObjectIDMap.get(this)) != null ? _previousObjectIDMap_get : generateGUID();\n this.setInstanceId(itemGUID);\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n var _previousObjectIDMap_get1;\n var componentGUID = (_previousObjectIDMap_get1 = previousObjectIDMap == null ? void 0 : previousObjectIDMap.get(component)) != null ? _previousObjectIDMap_get1 : generateGUID();\n component.setInstanceId(componentGUID);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.children), _step1; !(_step1 = _iterator1()).done;){\n var child = _step1.value;\n child.resetGUID(previousObjectIDMap);\n }\n };\n _proto.gatherPreviousObjectID = function gatherPreviousObjectID(previousObjectIDMap) {\n previousObjectIDMap.set(this, this.getInstanceId());\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n previousObjectIDMap.set(component, component.getInstanceId());\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.children), _step1; !(_step1 = _iterator1()).done;){\n var child = _step1.value;\n child.gatherPreviousObjectID(previousObjectIDMap);\n }\n };\n /**\n *\n * @param item\n * @returns\n */ VFXItem.isComposition = function isComposition(item) {\n return item.type === ItemType.composition;\n };\n /**\n *\n * @param item\n * @returns\n */ VFXItem.isSprite = function isSprite(item) {\n return item.type === ItemType.sprite;\n };\n /**\n *\n * @param item\n * @returns\n */ VFXItem.isParticle = function isParticle(item) {\n return item.type === ItemType.particle;\n };\n /**\n *\n * @param item\n * @returns\n */ VFXItem.isNull = function isNull(item) {\n return item.type === ItemType.null;\n };\n /**\n *\n * @param item\n * @returns\n */ VFXItem.isTree = function isTree(item) {\n return item.type === ItemType.tree;\n };\n /**\n *\n * @param item\n * @returns\n */ VFXItem.isCamera = function isCamera(item) {\n return item.type === ItemType.camera;\n };\n /**\n *\n * @param ancestorCandidate\n * @param descendantCandidate\n * @returns\n */ VFXItem.isAncestor = function isAncestor(ancestorCandidate, descendantCandidate) {\n var current = descendantCandidate.parent;\n while(current){\n if (current === ancestorCandidate) {\n return true;\n }\n current = current.parent;\n }\n return false;\n };\n _create_class(VFXItem, [\n {\n key: \"content\",\n get: /**\n * 返回元素创建的数据\n */ function get() {\n return this._content;\n }\n },\n {\n key: \"composition\",\n get: /**\n * 获取元素的合成\n */ function get() {\n return this._composition;\n },\n set: /**\n * 设置元素的合成\n */ function set(value) {\n this._composition = value;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.children), _step; !(_step = _iterator()).done;){\n var child = _step.value;\n if (!child.composition) {\n child.composition = value;\n }\n }\n }\n },\n {\n key: \"compositionReusable\",\n get: /**\n * 播放完成后是否需要再使用,是的话生命周期结束后不会 dispose\n */ function get() {\n var _this_composition;\n var _this_composition_reusable;\n return (_this_composition_reusable = (_this_composition = this.composition) == null ? void 0 : _this_composition.reusable) != null ? _this_composition_reusable : false;\n }\n },\n {\n key: \"renderOrder\",\n get: /**\n * 元素在合成中的索引\n */ function get() {\n return this.listIndex;\n },\n set: function set(value) {\n if (this.listIndex !== value) {\n this.listIndex = value;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n if (_instanceof1(component, RendererComponent)) {\n component.priority = value;\n }\n }\n }\n }\n },\n {\n key: \"isActive\",\n get: /**\n * 当前 VFXItem 是否激活\n */ function get() {\n return this.active;\n }\n },\n {\n key: \"isVisible\",\n get: /**\n * 元素组件显隐状态\n */ function get() {\n return this.visible;\n }\n }\n ]);\n return VFXItem;\n}(EffectsObject);\nexports.VFXItem = __decorate([\n effectsClass(DataType.VFXItemData)\n], exports.VFXItem);\nexports.Item = void 0;\n(function(Item) {\n function is(item, type) {\n return item.type === type;\n }\n Item.is = is;\n function isComposition(item) {\n return item.type === ItemType.composition;\n }\n Item.isComposition = isComposition;\n function isParticle(item) {\n return item.type === ItemType.particle;\n }\n Item.isParticle = isParticle;\n function isNull(item) {\n return item.type === ItemType.null;\n }\n Item.isNull = isNull;\n})(exports.Item || (exports.Item = {}));\n\nvar tempColor = [\n 1,\n 1,\n 1,\n 1\n];\nvar ColorPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(ColorPlayable, Playable);\n function ColorPlayable() {\n var _this;\n _this = Playable.apply(this, arguments) || this;\n _this.renderColor = [\n 1,\n 1,\n 1,\n 1\n ];\n return _this;\n }\n var _proto = ColorPlayable.prototype;\n _proto.processFrame = function processFrame(context) {\n var boundObject = context.output.getUserData();\n if (!_instanceof1(boundObject, exports.VFXItem)) {\n return;\n }\n if (!this.activeComponent) {\n this.activeComponent = this.getActiveComponent(boundObject);\n }\n if (!this.activeMaterial) {\n var _this_activeComponent, _this_activeMaterial;\n this.activeMaterial = (_this_activeComponent = this.activeComponent) == null ? void 0 : _this_activeComponent.material;\n var startColor = (_this_activeMaterial = this.activeMaterial) == null ? void 0 : _this_activeMaterial.getColor(\"_Color\");\n if (startColor) {\n this.startColor = startColor.toArray();\n }\n }\n var colorInc = vecFill(tempColor, 1);\n var colorChanged;\n var life = this.time / boundObject.duration;\n var opacityOverLifetime = this.opacityOverLifetime;\n var colorOverLifetime = this.colorOverLifetime;\n if (colorOverLifetime) {\n colorInc = getColorFromGradientStops(colorOverLifetime, life, true);\n colorChanged = true;\n }\n if (opacityOverLifetime) {\n colorInc[3] *= opacityOverLifetime.getValue(life);\n colorChanged = true;\n }\n if (colorChanged) {\n var _this_activeMaterial_getColor, _this_activeMaterial1;\n vecMulCombine(this.renderColor, colorInc, this.startColor);\n (_this_activeMaterial1 = this.activeMaterial) == null ? void 0 : (_this_activeMaterial_getColor = _this_activeMaterial1.getColor(\"_Color\")) == null ? void 0 : _this_activeMaterial_getColor.setFromArray(this.renderColor);\n }\n };\n _proto.create = function create(clipData) {\n this.clipData = clipData;\n var colorOverLifetime = clipData.colorOverLifetime;\n if (colorOverLifetime) {\n var _colorOverLifetime_opacity;\n this.opacityOverLifetime = createValueGetter((_colorOverLifetime_opacity = colorOverLifetime.opacity) != null ? _colorOverLifetime_opacity : 1);\n if (colorOverLifetime.color && colorOverLifetime.color[0] === ValueType.GRADIENT_COLOR) {\n this.colorOverLifetime = colorStopsFromGradient(colorOverLifetime.color[1]);\n }\n }\n return this;\n };\n _proto.getActiveComponent = function getActiveComponent(boundObject) {\n return boundObject.getComponent(BaseRenderComponent);\n };\n return ColorPlayable;\n}(Playable);\n\nvar singleSplits = [\n [\n 0,\n 0,\n 1,\n 1,\n undefined\n ]\n];\nvar seed$6 = 0;\nexports.SpriteColorPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(SpriteColorPlayableAsset, PlayableAsset);\n function SpriteColorPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = SpriteColorPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var spriteColorPlayable = new ColorPlayable(graph);\n spriteColorPlayable.create(this.data);\n return spriteColorPlayable;\n };\n _proto.fromData = function fromData(data) {\n this.data = data;\n };\n return SpriteColorPlayableAsset;\n}(PlayableAsset);\nexports.SpriteColorPlayableAsset = __decorate([\n effectsClass(DataType.SpriteColorPlayableAsset)\n], exports.SpriteColorPlayableAsset);\nexports.SpriteComponent = /*#__PURE__*/ function(BaseRenderComponent) {\n _inherits(SpriteComponent, BaseRenderComponent);\n function SpriteComponent(engine, props) {\n var _this;\n _this = BaseRenderComponent.call(this, engine) || this;\n _this.splits = singleSplits;\n _this.frameAnimationLoop = false;\n _this.name = \"MSprite\" + seed$6++;\n _this.geometry = _this.createGeometry();\n if (props) {\n _this.fromData(props);\n }\n return _this;\n }\n var _proto = SpriteComponent.prototype;\n _proto.onUpdate = function onUpdate(dt) {\n var _this = this;\n var time = this.item.time;\n var duration = this.item.duration;\n if (time > duration && this.frameAnimationLoop) {\n time = time % duration;\n }\n var life = Math.min(Math.max(time / duration, 0.0), 1.0);\n var ta = this.textureSheetAnimation;\n var video = this.renderer.texture.source.video;\n if (video) {\n if (time === 0) {\n video.pause();\n } else {\n video.play().catch(function(e) {\n _this.engine.renderErrors.add(e);\n });\n }\n }\n if (ta) {\n var _this_material_getVector4;\n var total = ta.total || ta.row * ta.col;\n var texRectX = 0;\n var texRectY = 0;\n var texRectW = 1;\n var texRectH = 1;\n var flip;\n if (this.splits) {\n var sp = this.splits[0];\n flip = sp[4];\n texRectX = sp[0];\n texRectY = sp[1];\n if (flip) {\n texRectW = sp[3];\n texRectH = sp[2];\n } else {\n texRectW = sp[2];\n texRectH = sp[3];\n }\n }\n var dx, dy;\n if (flip) {\n dx = 1 / ta.row * texRectW;\n dy = 1 / ta.col * texRectH;\n } else {\n dx = 1 / ta.col * texRectW;\n dy = 1 / ta.row * texRectH;\n }\n var texOffset;\n if (ta.animate) {\n var frameIndex = Math.round(life * (total - 1));\n var yIndex = Math.floor(frameIndex / ta.col);\n var xIndex = frameIndex - yIndex * ta.col;\n texOffset = flip ? [\n dx * yIndex,\n dy * (ta.col - xIndex)\n ] : [\n dx * xIndex,\n dy * (1 + yIndex)\n ];\n } else {\n texOffset = [\n 0,\n dy\n ];\n }\n (_this_material_getVector4 = this.material.getVector4(\"_TexOffset\")) == null ? void 0 : _this_material_getVector4.setFromArray([\n texRectX + texOffset[0],\n texRectH + texRectY - texOffset[1],\n dx,\n dy\n ]);\n }\n };\n _proto.onDestroy = function onDestroy() {\n var texture = this.renderer.texture;\n var source = texture.source;\n if (source.sourceType === exports.TextureSourceType.video && (source == null ? void 0 : source.video)) {\n source.video.pause();\n source.video.src = \"\";\n source.video.load();\n }\n };\n _proto.getItemGeometryData = function getItemGeometryData(geometry) {\n var _this = this, splits = _this.splits, textureSheetAnimation = _this.textureSheetAnimation;\n var sx = 1, sy = 1;\n var renderer = this.renderer;\n if (renderer.shape) {\n var _renderer_shape = renderer.shape, _renderer_shape_index = _renderer_shape.index, index = _renderer_shape_index === void 0 ? [] : _renderer_shape_index, _renderer_shape_aPoint = _renderer_shape.aPoint, aPoint = _renderer_shape_aPoint === void 0 ? [] : _renderer_shape_aPoint;\n var point = new Float32Array(aPoint);\n var position = [];\n var atlasOffset = [];\n for(var i = 0; i < point.length; i += 6){\n point[i] *= sx;\n point[i + 1] *= sy;\n atlasOffset.push(aPoint[i + 2], aPoint[i + 3]);\n position.push(point[i], point[i + 1], 0.0);\n }\n geometry.setAttributeData(\"aPos\", new Float32Array(position));\n return {\n index: index,\n atlasOffset: atlasOffset\n };\n }\n var originData = [\n -.5,\n .5,\n -.5,\n -.5,\n .5,\n .5,\n .5,\n -.5\n ];\n var atlasOffset1 = [];\n var index1 = [];\n var col = 2;\n var row = 2;\n if (splits.length === 1) {\n col = 1;\n row = 1;\n }\n var position1 = [];\n for(var x = 0; x < col; x++){\n for(var y = 0; y < row; y++){\n var base = (y * 2 + x) * 4;\n // @ts-expect-error\n var split = textureSheetAnimation ? [\n 0,\n 0,\n 1,\n 1,\n splits[0][4]\n ] : splits[y * 2 + x];\n var texOffset = split[4] ? [\n 0,\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1\n ] : [\n 0,\n 1,\n 0,\n 0,\n 1,\n 1,\n 1,\n 0\n ];\n var dw = ((x + x + 1) / col - 1) / 2;\n var dh = ((y + y + 1) / row - 1) / 2;\n var tox = split[0];\n var toy = split[1];\n var tsx = split[4] ? split[3] : split[2];\n var tsy = split[4] ? split[2] : split[3];\n var origin = [\n originData[0] / col + dw,\n originData[1] / row + dh,\n originData[2] / col + dw,\n originData[3] / row + dh,\n originData[4] / col + dw,\n originData[5] / row + dh,\n originData[6] / col + dw,\n originData[7] / row + dh\n ];\n atlasOffset1.push(texOffset[0] * tsx + tox, texOffset[1] * tsy + toy, texOffset[2] * tsx + tox, texOffset[3] * tsy + toy, texOffset[4] * tsx + tox, texOffset[5] * tsy + toy, texOffset[6] * tsx + tox, texOffset[7] * tsy + toy);\n position1.push(origin[0] * sx, origin[1] * sy, 0.0, origin[2] * sx, origin[3] * sy, 0.0, origin[4] * sx, origin[5] * sy, 0.0, origin[6] * sx, origin[7] * sy, 0.0);\n index1.push(base, 1 + base, 2 + base, 2 + base, 1 + base, 3 + base);\n }\n }\n geometry.setAttributeData(\"aPos\", new Float32Array(position1));\n return {\n index: index1,\n atlasOffset: atlasOffset1\n };\n };\n _proto.fromData = function fromData(data) {\n BaseRenderComponent.prototype.fromData.call(this, data);\n var interaction = data.interaction, options = data.options;\n this.interaction = interaction;\n this.splits = data.splits || singleSplits;\n this.textureSheetAnimation = data.textureSheetAnimation;\n var geometry = this.createGeometry();\n this.geometry = geometry;\n var startColor = options.startColor || [\n 1,\n 1,\n 1,\n 1\n ];\n this.material.setColor(\"_Color\", new Color().setFromArray(startColor));\n };\n return SpriteComponent;\n}(BaseRenderComponent);\nexports.SpriteComponent = __decorate([\n effectsClass(DataType.SpriteComponent)\n], exports.SpriteComponent);\n\nexports.maxSpriteMeshItemCount = 8;\nfunction setSpriteMeshMaxItemCountByGPU(gpuCapability) {\n if (gpuCapability.maxVertexUniforms >= 256) {\n return exports.maxSpriteMeshItemCount = 32;\n } else if (gpuCapability.maxVertexUniforms >= 128) {\n return exports.maxSpriteMeshItemCount = 16;\n }\n}\n// TODO: 只有单测用\nfunction setMaxSpriteMeshItemCount(count) {\n exports.maxSpriteMeshItemCount = count;\n}\n\nvar ParticleLoader = /*#__PURE__*/ function(AbstractPlugin) {\n _inherits(ParticleLoader, AbstractPlugin);\n function ParticleLoader() {\n return AbstractPlugin.apply(this, arguments);\n }\n return ParticleLoader;\n}(AbstractPlugin);\n\nvar CalculateLoader = /*#__PURE__*/ function(AbstractPlugin) {\n _inherits(CalculateLoader, AbstractPlugin);\n function CalculateLoader() {\n return AbstractPlugin.apply(this, arguments);\n }\n return CalculateLoader;\n}(AbstractPlugin);\n\nvar AnimationStream = /*#__PURE__*/ function() {\n function AnimationStream(playable) {\n this.curveValues = {};\n this.playable = playable;\n }\n var _proto = AnimationStream.prototype;\n _proto.setCurveValue = function setCurveValue(componentType, propertyName, value) {\n if (!this.findCurveValue(componentType, propertyName)) {\n this.curveValues[componentType + propertyName] = {\n componentType: componentType,\n propertyName: propertyName,\n value: value\n };\n } else {\n this.curveValues[componentType + propertyName].value = value;\n }\n return this.curveValues[componentType + propertyName];\n };\n _proto.findCurveValue = function findCurveValue(componentType, propertyName) {\n return this.curveValues[componentType + propertyName];\n };\n return AnimationStream;\n}();\n\nvar AnimationPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(AnimationPlayable, Playable);\n function AnimationPlayable(graph) {\n var _this;\n _this = Playable.call(this, graph) || this;\n _this.animationStream = new AnimationStream(_assert_this_initialized(_this));\n return _this;\n }\n return AnimationPlayable;\n}(Playable);\n\nvar tempRot = new Euler();\nvar tempSize = new Vector3(1, 1, 1);\nvar tempPos = new Vector3();\n/**\n * @since 2.0.0\n */ var TransformAnimationPlayable = /*#__PURE__*/ function(AnimationPlayable) {\n _inherits(TransformAnimationPlayable, AnimationPlayable);\n function TransformAnimationPlayable() {\n return AnimationPlayable.apply(this, arguments);\n }\n var _proto = TransformAnimationPlayable.prototype;\n _proto.start = function start() {\n var boundItem = this.boundObject;\n var scale = boundItem.transform.scale;\n this.originalTransform = {\n position: boundItem.transform.position.clone(),\n rotation: boundItem.transform.getRotation().clone(),\n // TODO 编辑器 scale 没有z轴控制\n scale: new Vector3(scale.x, scale.y, scale.x)\n };\n var positionOverLifetime = this.data.positionOverLifetime;\n var rotationOverLifetime = this.data.rotationOverLifetime;\n var sizeOverLifetime = this.data.sizeOverLifetime;\n // TODO: 没有 K 帧数据的不需要传 positionOverLifetime 空对象\n if (positionOverLifetime && Object.keys(positionOverLifetime).length !== 0) {\n this.positionOverLifetime = positionOverLifetime;\n if (positionOverLifetime.path) {\n this.originalTransform.path = createValueGetter(positionOverLifetime.path);\n }\n var linearVelEnable = positionOverLifetime.linearX || positionOverLifetime.linearY || positionOverLifetime.linearZ;\n if (linearVelEnable) {\n this.linearVelOverLifetime = {\n x: positionOverLifetime.linearX && createValueGetter(positionOverLifetime.linearX),\n y: positionOverLifetime.linearY && createValueGetter(positionOverLifetime.linearY),\n z: positionOverLifetime.linearZ && createValueGetter(positionOverLifetime.linearZ),\n asMovement: positionOverLifetime.asMovement,\n enabled: !!linearVelEnable\n };\n }\n var orbitalVelEnable = positionOverLifetime.orbitalX || positionOverLifetime.orbitalY || positionOverLifetime.orbitalZ;\n if (orbitalVelEnable) {\n this.orbitalVelOverLifetime = {\n x: positionOverLifetime.orbitalX && createValueGetter(positionOverLifetime.orbitalX),\n y: positionOverLifetime.orbitalY && createValueGetter(positionOverLifetime.orbitalY),\n z: positionOverLifetime.orbitalZ && createValueGetter(positionOverLifetime.orbitalZ),\n center: ensureVec3(positionOverLifetime.orbCenter),\n asRotation: positionOverLifetime.asRotation,\n enabled: !!orbitalVelEnable\n };\n }\n this.speedOverLifetime = positionOverLifetime.speedOverLifetime && createValueGetter(positionOverLifetime.speedOverLifetime);\n }\n if (sizeOverLifetime) {\n if (sizeOverLifetime.separateAxes) {\n this.sizeSeparateAxes = true;\n this.sizeXOverLifetime = createValueGetter(sizeOverLifetime.x || 1);\n this.sizeYOverLifetime = createValueGetter(sizeOverLifetime.y || 1);\n this.sizeZOverLifetime = createValueGetter(sizeOverLifetime.z || 1);\n } else {\n this.sizeXOverLifetime = createValueGetter(sizeOverLifetime.size || 1);\n }\n }\n if (rotationOverLifetime) {\n this.rotationOverLifetime = {\n asRotation: rotationOverLifetime.asRotation,\n separateAxes: rotationOverLifetime.separateAxes,\n z: createValueGetter(rotationOverLifetime.z || 0)\n };\n if (rotationOverLifetime.separateAxes) {\n var rotLt = this.rotationOverLifetime;\n rotLt.x = createValueGetter(rotationOverLifetime.x || 0);\n rotLt.y = createValueGetter(rotationOverLifetime.y || 0);\n }\n }\n this.gravity = Vector3.fromArray((positionOverLifetime == null ? void 0 : positionOverLifetime.gravity) || []);\n var _positionOverLifetime_gravityOverLifetime;\n this.gravityModifier = createValueGetter((_positionOverLifetime_gravityOverLifetime = positionOverLifetime == null ? void 0 : positionOverLifetime.gravityOverLifetime) != null ? _positionOverLifetime_gravityOverLifetime : 0);\n this.direction = (positionOverLifetime == null ? void 0 : positionOverLifetime.direction) ? Vector3.fromArray(positionOverLifetime.direction).normalize() : new Vector3();\n this.startSpeed = (positionOverLifetime == null ? void 0 : positionOverLifetime.startSpeed) || 0;\n this.velocity = this.direction.clone();\n this.velocity.multiply(this.startSpeed);\n };\n _proto.processFrame = function processFrame(context) {\n if (!this.boundObject) {\n var boundObject = context.output.getUserData();\n if (_instanceof1(boundObject, exports.VFXItem)) {\n this.boundObject = boundObject;\n this.start();\n }\n }\n if (this.boundObject && this.boundObject.composition) {\n this.sampleAnimation();\n }\n };\n /**\n * 应用时间轴K帧数据到对象\n */ _proto.sampleAnimation = function sampleAnimation() {\n var _this = this;\n var boundItem = this.boundObject;\n var duration = boundItem.duration;\n var life = this.time / duration;\n life = life < 0 ? 0 : life > 1 ? 1 : life;\n if (this.sizeXOverLifetime) {\n tempSize.x = this.sizeXOverLifetime.getValue(life);\n if (this.sizeSeparateAxes) {\n tempSize.y = this.sizeYOverLifetime.getValue(life);\n tempSize.z = this.sizeZOverLifetime.getValue(life);\n } else {\n tempSize.z = tempSize.y = tempSize.x;\n }\n var startSize = this.originalTransform.scale;\n boundItem.transform.setScale(tempSize.x * startSize.x, tempSize.y * startSize.y, tempSize.z * startSize.z);\n // this.animationStream.setCurveValue('transform', 'scale.x', tempSize.x * startSize.x);\n // this.animationStream.setCurveValue('transform', 'scale.y', tempSize.y * startSize.y);\n // this.animationStream.setCurveValue('transform', 'scale.z', tempSize.z * startSize.z);\n }\n if (this.rotationOverLifetime) {\n var func = function(v) {\n return _this.rotationOverLifetime.asRotation ? v.getValue(life) : v.getIntegrateValue(0, life, duration);\n };\n var incZ = func(this.rotationOverLifetime.z);\n var separateAxes = this.rotationOverLifetime.separateAxes;\n tempRot.x = separateAxes ? func(this.rotationOverLifetime.x) : 0;\n tempRot.y = separateAxes ? func(this.rotationOverLifetime.y) : 0;\n tempRot.z = incZ;\n var rot = tempRot.addEulers(this.originalTransform.rotation, tempRot);\n boundItem.transform.setRotation(rot.x, rot.y, rot.z);\n // this.animationStream.setCurveValue('transform', 'rotation.x', rot.x);\n // this.animationStream.setCurveValue('transform', 'rotation.y', rot.y);\n // this.animationStream.setCurveValue('transform', 'rotation.z', rot.z);\n }\n if (this.positionOverLifetime) {\n var pos = tempPos;\n calculateTranslation(pos, this, this.gravity, this.time, duration, this.originalTransform.position, this.velocity);\n if (this.originalTransform.path) {\n pos.add(this.originalTransform.path.getValue(life));\n }\n boundItem.transform.setPosition(pos.x, pos.y, pos.z);\n // this.animationStream.setCurveValue('transform', 'position.x', pos.x);\n // this.animationStream.setCurveValue('transform', 'position.y', pos.y);\n // this.animationStream.setCurveValue('transform', 'position.z', pos.z);\n }\n };\n return TransformAnimationPlayable;\n}(AnimationPlayable);\nexports.TransformPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(TransformPlayableAsset, PlayableAsset);\n function TransformPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = TransformPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n var transformAnimationPlayable = new TransformAnimationPlayable(graph);\n transformAnimationPlayable.data = this.transformAnimationData;\n return transformAnimationPlayable;\n };\n _proto.fromData = function fromData(data) {\n this.transformAnimationData = data;\n };\n return TransformPlayableAsset;\n}(PlayableAsset);\nexports.TransformPlayableAsset = __decorate([\n effectsClass(DataType.TransformPlayableAsset)\n], exports.TransformPlayableAsset);\n/**\n * @since 2.0.0\n */ var ActivationPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(ActivationPlayable, Playable);\n function ActivationPlayable() {\n return Playable.apply(this, arguments);\n }\n var _proto = ActivationPlayable.prototype;\n _proto.processFrame = function processFrame(context) {\n var vfxItem = context.output.getUserData();\n if (!_instanceof1(vfxItem, exports.VFXItem)) {\n return;\n }\n vfxItem.time = this.time;\n };\n return ActivationPlayable;\n}(Playable);\nexports.ActivationPlayableAsset = /*#__PURE__*/ function(PlayableAsset) {\n _inherits(ActivationPlayableAsset, PlayableAsset);\n function ActivationPlayableAsset() {\n return PlayableAsset.apply(this, arguments);\n }\n var _proto = ActivationPlayableAsset.prototype;\n _proto.createPlayable = function createPlayable(graph) {\n return new ActivationPlayable(graph);\n };\n return ActivationPlayableAsset;\n}(PlayableAsset);\nexports.ActivationPlayableAsset = __decorate([\n effectsClass(DataType.ActivationPlayableAsset)\n], exports.ActivationPlayableAsset);\nexports.AnimationClip = /*#__PURE__*/ function(EffectsObject) {\n _inherits(AnimationClip, EffectsObject);\n function AnimationClip() {\n var _this;\n _this = EffectsObject.apply(this, arguments) || this;\n _this.duration = 0;\n _this.positionCurves = [];\n _this.rotationCurves = [];\n _this.scaleCurves = [];\n _this.floatCurves = [];\n return _this;\n }\n var _proto = AnimationClip.prototype;\n _proto.sampleAnimation = function sampleAnimation(vfxItem, time) {\n var duration = vfxItem.duration;\n var life = time / duration;\n life = life < 0 ? 0 : life > 1 ? 1 : life;\n for(var _iterator = _create_for_of_iterator_helper_loose(this.positionCurves), _step; !(_step = _iterator()).done;){\n var curve = _step.value;\n var value = curve.keyFrames.getValue(life);\n // @ts-expect-error\n var target = this.findTarget(vfxItem, curve.path);\n target == null ? void 0 : target.transform.setPosition(value.x, value.y, value.z);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.rotationCurves), _step1; !(_step1 = _iterator1()).done;){\n var curve1 = _step1.value;\n var value1 = curve1.keyFrames.getValue(life);\n // @ts-expect-error\n var target1 = this.findTarget(vfxItem, curve1.path);\n target1 == null ? void 0 : target1.transform.setQuaternion(value1.x, value1.y, value1.z, value1.w);\n }\n for(var _iterator2 = _create_for_of_iterator_helper_loose(this.scaleCurves), _step2; !(_step2 = _iterator2()).done;){\n var curve2 = _step2.value;\n var value2 = curve2.keyFrames.getValue(life);\n // @ts-expect-error\n var target2 = this.findTarget(vfxItem, curve2.path);\n target2 == null ? void 0 : target2.transform.setScale(value2.x, value2.y, value2.z);\n }\n // TODO float curves 采样\n };\n _proto.fromData = function fromData(data) {\n this.positionCurves.length = 0;\n this.scaleCurves.length = 0;\n this.floatCurves.length = 0;\n for(var _iterator = _create_for_of_iterator_helper_loose(data.positionCurves), _step; !(_step = _iterator()).done;){\n var positionCurveData = _step.value;\n var curve = {\n path: positionCurveData.path,\n keyFrames: createValueGetter(positionCurveData.keyFrames)\n };\n this.duration = Math.max(this.duration, curve.keyFrames.getMaxTime());\n this.positionCurves.push(curve);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(data.rotationCurves), _step1; !(_step1 = _iterator1()).done;){\n var rotationCurveData = _step1.value;\n var curve1 = {\n path: rotationCurveData.path,\n keyFrames: createValueGetter(rotationCurveData.keyFrames)\n };\n this.duration = Math.max(this.duration, curve1.keyFrames.getMaxTime());\n this.rotationCurves.push(curve1);\n }\n for(var _iterator2 = _create_for_of_iterator_helper_loose(data.scaleCurves), _step2; !(_step2 = _iterator2()).done;){\n var scaleCurvesData = _step2.value;\n var curve2 = {\n path: scaleCurvesData.path,\n keyFrames: createValueGetter(scaleCurvesData.keyFrames)\n };\n this.duration = Math.max(this.duration, curve2.keyFrames.getMaxTime());\n this.scaleCurves.push(curve2);\n }\n for(var _iterator3 = _create_for_of_iterator_helper_loose(data.floatCurves), _step3; !(_step3 = _iterator3()).done;){\n var floatCurveData = _step3.value;\n var curve3 = {\n path: floatCurveData.path,\n keyFrames: createValueGetter(floatCurveData.keyFrames),\n property: floatCurveData.property,\n className: floatCurveData.className\n };\n this.duration = Math.max(this.duration, curve3.keyFrames.getMaxTime());\n this.floatCurves.push(curve3);\n }\n };\n _proto.findTarget = function findTarget(vfxItem, path) {\n var target = vfxItem;\n for(var _iterator = _create_for_of_iterator_helper_loose(path), _step; !(_step = _iterator()).done;){\n var name = _step.value;\n var findTag = false;\n for(var _iterator1 = _create_for_of_iterator_helper_loose(target.children), _step1; !(_step1 = _iterator1()).done;){\n var child = _step1.value;\n if (child.name === name) {\n target = child;\n findTag = true;\n break;\n }\n }\n if (!findTag) {\n return;\n }\n }\n return target;\n };\n return AnimationClip;\n}(EffectsObject);\nexports.AnimationClip = __decorate([\n effectsClass(DataType.AnimationClip)\n], exports.AnimationClip);\nvar AnimationClipPlayable = /*#__PURE__*/ function(Playable) {\n _inherits(AnimationClipPlayable, Playable);\n function AnimationClipPlayable() {\n return Playable.apply(this, arguments);\n }\n var _proto = AnimationClipPlayable.prototype;\n _proto.processFrame = function processFrame(context) {\n var boundObject = context.output.getUserData();\n if (!_instanceof1(boundObject, exports.VFXItem)) {\n return;\n }\n if (boundObject.composition) {\n this.clip.sampleAnimation(boundObject, this.time);\n }\n };\n return AnimationClipPlayable;\n}(Playable);\n\n// Based on:\n/**\n * The Point object represents a location in a two-dimensional coordinate system, where `x` represents\n * the position on the horizontal axis and `y` represents the position on the vertical axis.\n */ var Point = /*#__PURE__*/ function() {\n function Point(x, y) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n /**\n * Position of the point on the x axis\n */ this.x = 0;\n /**\n * Position of the point on the y axis\n */ this.y = 0;\n this.x = x;\n this.y = y;\n }\n var _proto = Point.prototype;\n /**\n * Creates a clone of this point\n * @returns A clone of this point\n */ _proto.clone = function clone() {\n return new Point(this.x, this.y);\n };\n /**\n * Copies `x` and `y` from the given point into this point\n * @param p - The point to copy from\n * @returns The point instance itself\n */ _proto.copyFrom = function copyFrom(p) {\n this.set(p.x, p.y);\n return this;\n };\n /**\n * Copies this point's x and y into the given point (`p`).\n * @param p - The point to copy to. Can be any of type that is or extends `PointData`\n * @returns The point (`p`) with values updated\n */ _proto.copyTo = function copyTo(p) {\n p.set(this.x, this.y);\n return p;\n };\n /**\n * Accepts another point (`p`) and returns `true` if the given point is equal to this point\n * @param p - The point to check\n * @returns Returns `true` if both `x` and `y` are equal\n */ _proto.equals = function equals(p) {\n return p.x === this.x && p.y === this.y;\n };\n /**\n * Sets the point to a new `x` and `y` position.\n * If `y` is omitted, both `x` and `y` will be set to `x`.\n * @param {number} [x=0] - position of the point on the `x` axis\n * @param {number} [y=x] - position of the point on the `y` axis\n * @returns The point instance itself\n */ _proto.set = function set(x, y) {\n if (x === void 0) x = 0;\n if (y === void 0) y = x;\n this.x = x;\n this.y = y;\n return this;\n };\n _create_class(Point, null, [\n {\n key: \"shared\",\n get: /**\n * A static Point object with `x` and `y` values of `0`. Can be used to avoid creating new objects multiple times.\n * @readonly\n */ function get() {\n tempPoint.x = 0;\n tempPoint.y = 0;\n return tempPoint;\n }\n }\n ]);\n return Point;\n}();\nvar tempPoint = new Point();\n\n// Based on:\nvar closePointEps = 1e-4;\nvar curveEps = 0.0001;\n/**\n * Buffers vertices to draw a square cap.\n *\n * @internal\n * @private\n * @param x - X-coord of end point\n * @param y - Y-coord of end point\n * @param nx - X-coord of line normal pointing inside\n * @param ny - Y-coord of line normal pointing inside\n * @param innerWeight - Weight of inner points\n * @param outerWeight - Weight of outer points\n * @param clockwise - Whether the cap is drawn clockwise\n * @param verts - vertex buffer\n * @returns - no. of vertices pushed\n */ function square(x, y, nx, ny, innerWeight, outerWeight, clockwise, /* rotation for square (true at left end, false at right end) */ verts) {\n var ix = x - nx * innerWeight;\n var iy = y - ny * innerWeight;\n var ox = x + nx * outerWeight;\n var oy = y + ny * outerWeight;\n /* Rotate nx,ny for extension vector */ var exx;\n var eyy;\n if (clockwise) {\n exx = ny;\n eyy = -nx;\n } else {\n exx = -ny;\n eyy = nx;\n }\n /* [i|0]x,y extended at cap */ var eix = ix + exx;\n var eiy = iy + eyy;\n var eox = ox + exx;\n var eoy = oy + eyy;\n /* Square itself must be inserted clockwise*/ verts.push(eix, eiy);\n verts.push(eox, eoy);\n return 2;\n}\n/**\n * Buffers vertices to draw an arc at the line joint or cap.\n *\n * @internal\n * @private\n * @param cx - X-coord of center\n * @param cy - Y-coord of center\n * @param sx - X-coord of arc start\n * @param sy - Y-coord of arc start\n * @param ex - X-coord of arc end\n * @param ey - Y-coord of arc end\n * @param verts - buffer of vertices\n * @param clockwise - orientation of vertices\n * @returns - no. of vertices pushed\n */ function round(cx, cy, sx, sy, ex, ey, verts, clockwise) {\n var cx2p0x = sx - cx;\n var cy2p0y = sy - cy;\n var angle0 = Math.atan2(cx2p0x, cy2p0y);\n var angle1 = Math.atan2(ex - cx, ey - cy);\n if (clockwise && angle0 < angle1) {\n angle0 += Math.PI * 2;\n } else if (!clockwise && angle0 > angle1) {\n angle1 += Math.PI * 2;\n }\n var startAngle = angle0;\n var angleDiff = angle1 - angle0;\n var absAngleDiff = Math.abs(angleDiff);\n var radius = Math.sqrt(cx2p0x * cx2p0x + cy2p0y * cy2p0y);\n var segCount = (15 * absAngleDiff * Math.sqrt(radius) / Math.PI >> 0) + 1;\n var angleInc = angleDiff / segCount;\n startAngle += angleInc;\n if (clockwise) {\n verts.push(cx, cy);\n verts.push(sx, sy);\n for(var i = 1, angle = startAngle; i < segCount; i++, angle += angleInc){\n verts.push(cx, cy);\n verts.push(cx + Math.sin(angle) * radius, cy + Math.cos(angle) * radius);\n }\n verts.push(cx, cy);\n verts.push(ex, ey);\n } else {\n verts.push(sx, sy);\n verts.push(cx, cy);\n for(var i1 = 1, angle2 = startAngle; i1 < segCount; i1++, angle2 += angleInc){\n verts.push(cx + Math.sin(angle2) * radius, cy + Math.cos(angle2) * radius);\n verts.push(cx, cy);\n }\n verts.push(ex, ey);\n verts.push(cx, cy);\n }\n return segCount * 2;\n}\nfunction getOrientationOfPoints(points) {\n var m = points.length;\n if (m < 6) {\n return 1;\n }\n var area = 0;\n for(var i = 0, x1 = points[m - 2], y1 = points[m - 1]; i < m; i += 2){\n var x2 = points[i];\n var y2 = points[i + 1];\n area += (x2 - x1) * (y2 + y1);\n x1 = x2;\n y1 = y2;\n }\n if (area < 0) {\n return -1;\n }\n return 1;\n}\n/**\n * Builds a line to draw using the polygon method.\n * @param points\n * @param lineStyle\n * @param flipAlignment\n * @param closed\n * @param vertices\n * @param _verticesStride\n * @param _verticesOffset\n * @param indices\n * @param _indicesOffset\n */ function buildLine(points, lineStyle, flipAlignment, closed, // alignment:number,\nvertices, _verticesStride, _verticesOffset, indices, _indicesOffset) {\n // const shape = graphicsData.shape as Polygon;\n // let points = graphicsData.points || shape.points.slice();\n var eps = closePointEps;\n if (points.length === 0) {\n return;\n }\n var style = lineStyle;\n var alignment = style.alignment;\n if (lineStyle.alignment !== 0.5) {\n // rotate the points!\n var orientation = getOrientationOfPoints(points);\n if (flipAlignment) {\n orientation *= -1;\n }\n alignment = (alignment - 0.5) * orientation + 0.5;\n }\n // get first and last point.. figure out the middle!\n var firstPoint = new Point(points[0], points[1]);\n var lastPoint = new Point(points[points.length - 2], points[points.length - 1]);\n var closedShape = closed;\n var closedPath = Math.abs(firstPoint.x - lastPoint.x) < eps && Math.abs(firstPoint.y - lastPoint.y) < eps;\n // if the first point is the last point - gonna have issues :)\n if (closedShape) {\n // need to clone as we are going to slightly modify the shape..\n points = points.slice();\n if (closedPath) {\n points.pop();\n points.pop();\n lastPoint.set(points[points.length - 2], points[points.length - 1]);\n }\n var midPointX = (firstPoint.x + lastPoint.x) * 0.5;\n var midPointY = (lastPoint.y + firstPoint.y) * 0.5;\n points.unshift(midPointX, midPointY);\n points.push(midPointX, midPointY);\n }\n var verts = vertices;\n var length = points.length / 2;\n var indexCount = points.length;\n var indexStart = verts.length / 2;\n // Max. inner and outer width\n var width = style.width / 2;\n var widthSquared = width * width;\n var miterLimitSquared = style.miterLimit * style.miterLimit;\n /* Line segments of interest where (x1,y1) forms the corner. */ var x0 = points[0];\n var y0 = points[1];\n var x1 = points[2];\n var y1 = points[3];\n var x2 = 0;\n var y2 = 0;\n /* perp[?](x|y) = the line normal with magnitude lineWidth. */ var perpX = -(y0 - y1);\n var perpY = x0 - x1;\n var perp1x = 0;\n var perp1y = 0;\n // 计算向量长度并添加极小值 NumberEpsilon 以避免除以零的情况。\n var dist = Math.sqrt(perpX * perpX + perpY * perpY) + NumberEpsilon;\n perpX /= dist;\n perpY /= dist;\n perpX *= width;\n perpY *= width;\n var ratio = alignment; // 0.5;\n var innerWeight = (1 - ratio) * 2;\n var outerWeight = ratio * 2;\n if (!closedShape) {\n if (style.cap === LineCap.Round) {\n indexCount += round(x0 - perpX * (innerWeight - outerWeight) * 0.5, y0 - perpY * (innerWeight - outerWeight) * 0.5, x0 - perpX * innerWeight, y0 - perpY * innerWeight, x0 + perpX * outerWeight, y0 + perpY * outerWeight, verts, true) + 2;\n } else if (style.cap === LineCap.Square) {\n indexCount += square(x0, y0, perpX, perpY, innerWeight, outerWeight, true, verts);\n }\n }\n // Push first point (below & above vertices)\n verts.push(x0 - perpX * innerWeight, y0 - perpY * innerWeight);\n verts.push(x0 + perpX * outerWeight, y0 + perpY * outerWeight);\n for(var i = 1; i < length - 1; ++i){\n x0 = points[(i - 1) * 2];\n y0 = points[(i - 1) * 2 + 1];\n x1 = points[i * 2];\n y1 = points[i * 2 + 1];\n x2 = points[(i + 1) * 2];\n y2 = points[(i + 1) * 2 + 1];\n perpX = -(y0 - y1);\n perpY = x0 - x1;\n dist = Math.sqrt(perpX * perpX + perpY * perpY) + NumberEpsilon;\n perpX /= dist;\n perpY /= dist;\n perpX *= width;\n perpY *= width;\n perp1x = -(y1 - y2);\n perp1y = x1 - x2;\n dist = Math.sqrt(perp1x * perp1x + perp1y * perp1y) + NumberEpsilon;\n perp1x /= dist;\n perp1y /= dist;\n perp1x *= width;\n perp1y *= width;\n /* d[x|y](0|1) = the component displacement between points p(0,1|1,2) */ var dx0 = x1 - x0;\n var dy0 = y0 - y1;\n var dx1 = x1 - x2;\n var dy1 = y2 - y1;\n /* +ve if internal angle < 90 degree, -ve if internal angle > 90 degree. */ var dot = dx0 * dx1 + dy0 * dy1;\n /* +ve if internal angle counterclockwise, -ve if internal angle clockwise. */ var cross = dy0 * dx1 - dy1 * dx0;\n var clockwise = cross < 0;\n /* Going nearly parallel? */ /* atan(0.001) ~= 0.001 rad ~= 0.057 degree */ if (Math.abs(cross) < 0.001 * Math.abs(dot)) {\n verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight);\n verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight);\n /* 180 degree corner? */ if (dot >= 0) {\n if (style.join === LineJoin.Round) {\n indexCount += round(x1, y1, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 4;\n } else {\n indexCount += 2;\n }\n verts.push(x1 - perp1x * outerWeight, y1 - perp1y * outerWeight);\n verts.push(x1 + perp1x * innerWeight, y1 + perp1y * innerWeight);\n }\n continue;\n }\n /* p[x|y] is the miter point. pDist is the distance between miter point and p1. */ var c1 = (-perpX + x0) * (-perpY + y1) - (-perpX + x1) * (-perpY + y0);\n var c2 = (-perp1x + x2) * (-perp1y + y1) - (-perp1x + x1) * (-perp1y + y2);\n var px = (dx0 * c2 - dx1 * c1) / cross;\n var py = (dy1 * c1 - dy0 * c2) / cross;\n var pDist = (px - x1) * (px - x1) + (py - y1) * (py - y1);\n /* Inner miter point */ var imx = x1 + (px - x1) * innerWeight;\n var imy = y1 + (py - y1) * innerWeight;\n /* Outer miter point */ var omx = x1 - (px - x1) * outerWeight;\n var omy = y1 - (py - y1) * outerWeight;\n /* Is the inside miter point too far away, creating a spike? */ var smallerInsideSegmentSq = Math.min(dx0 * dx0 + dy0 * dy0, dx1 * dx1 + dy1 * dy1);\n var insideWeight = clockwise ? innerWeight : outerWeight;\n var smallerInsideDiagonalSq = smallerInsideSegmentSq + insideWeight * insideWeight * widthSquared;\n var insideMiterOk = pDist <= smallerInsideDiagonalSq;\n if (insideMiterOk) {\n if (style.join === LineJoin.Bevel || pDist / widthSquared > miterLimitSquared) {\n if (clockwise) /* rotating at inner angle */ {\n verts.push(imx, imy); // inner miter point\n verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); // first segment's outer vertex\n verts.push(imx, imy); // inner miter point\n verts.push(x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); // second segment's outer vertex\n } else /* rotating at outer angle */ {\n verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); // first segment's inner vertex\n verts.push(omx, omy); // outer miter point\n verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight); // second segment's outer vertex\n verts.push(omx, omy); // outer miter point\n }\n indexCount += 2;\n } else if (style.join === LineJoin.Round) {\n if (clockwise) /* arc is outside */ {\n verts.push(imx, imy);\n verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight);\n indexCount += round(x1, y1, x1 + perpX * outerWeight, y1 + perpY * outerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight, verts, true) + 4;\n verts.push(imx, imy);\n verts.push(x1 + perp1x * outerWeight, y1 + perp1y * outerWeight);\n } else /* arc is inside */ {\n verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight);\n verts.push(omx, omy);\n indexCount += round(x1, y1, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 4;\n verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight);\n verts.push(omx, omy);\n }\n } else {\n verts.push(imx, imy);\n verts.push(omx, omy);\n }\n } else {\n verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight); // first segment's inner vertex\n verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight); // first segment's outer vertex\n if (style.join === LineJoin.Round) {\n if (clockwise) /* arc is outside */ {\n indexCount += round(x1, y1, x1 + perpX * outerWeight, y1 + perpY * outerWeight, x1 + perp1x * outerWeight, y1 + perp1y * outerWeight, verts, true) + 2;\n } else /* arc is inside */ {\n indexCount += round(x1, y1, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 - perp1x * innerWeight, y1 - perp1y * innerWeight, verts, false) + 2;\n }\n } else if (style.join === LineJoin.Miter && pDist / widthSquared <= miterLimitSquared) {\n if (clockwise) {\n verts.push(omx, omy); // inner miter point\n verts.push(omx, omy); // inner miter point\n } else {\n verts.push(imx, imy); // outer miter point\n verts.push(imx, imy); // outer miter point\n }\n indexCount += 2;\n }\n verts.push(x1 - perp1x * innerWeight, y1 - perp1y * innerWeight); // second segment's inner vertex\n verts.push(x1 + perp1x * outerWeight, y1 + perp1y * outerWeight); // second segment's outer vertex\n indexCount += 2;\n }\n }\n x0 = points[(length - 2) * 2];\n y0 = points[(length - 2) * 2 + 1];\n x1 = points[(length - 1) * 2];\n y1 = points[(length - 1) * 2 + 1];\n perpX = -(y0 - y1);\n perpY = x0 - x1;\n dist = Math.sqrt(perpX * perpX + perpY * perpY) + NumberEpsilon;\n perpX /= dist;\n perpY /= dist;\n perpX *= width;\n perpY *= width;\n verts.push(x1 - perpX * innerWeight, y1 - perpY * innerWeight);\n verts.push(x1 + perpX * outerWeight, y1 + perpY * outerWeight);\n if (!closedShape) {\n if (style.cap === LineCap.Round) {\n indexCount += round(x1 - perpX * (innerWeight - outerWeight) * 0.5, y1 - perpY * (innerWeight - outerWeight) * 0.5, x1 - perpX * innerWeight, y1 - perpY * innerWeight, x1 + perpX * outerWeight, y1 + perpY * outerWeight, verts, false) + 2;\n } else if (style.cap === LineCap.Square) {\n indexCount += square(x1, y1, perpX, perpY, innerWeight, outerWeight, false, verts);\n }\n }\n // const indices = graphicsGeometry.indices;\n var eps2 = curveEps * curveEps;\n // indices.push(indexStart);\n for(var i1 = indexStart; i1 < indexCount + indexStart - 2; ++i1){\n x0 = verts[i1 * 2];\n y0 = verts[i1 * 2 + 1];\n x1 = verts[(i1 + 1) * 2];\n y1 = verts[(i1 + 1) * 2 + 1];\n x2 = verts[(i1 + 2) * 2];\n y2 = verts[(i1 + 2) * 2 + 1];\n /* Skip zero area triangles */ if (Math.abs(x0 * (y1 - y2) + x1 * (y2 - y0) + x2 * (y0 - y1)) < eps2) {\n continue;\n }\n indices.push(i1, i1 + 1, i1 + 2);\n }\n}\n\n// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/maths/shapes/ShapePrimitive.ts\nvar ShapePrimitive = function ShapePrimitive() {\n};\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar libtess_min = {exports: {}};\n\n/*\n\n Copyright 2000, Silicon Graphics, Inc. All Rights Reserved.\n Copyright 2015, Google Inc. All Rights Reserved.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to\n deal in the Software without restriction, including without limitation the\n rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice including the dates of first publication and\n either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/\n shall be included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n Original Code. The Original Code is: OpenGL Sample Implementation,\n Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n Copyright in any portions created by third parties is as indicated\n elsewhere herein. All Rights Reserved.\n*/\n\n(function (module) {\nvar n;\nfunction t(a, b) {\n return a.b === b.b && a.a === b.a;\n}\nfunction u(a, b) {\n return a.b < b.b || a.b === b.b && a.a <= b.a;\n}\nfunction v(a, b, c) {\n var d = b.b - a.b, e = c.b - b.b;\n return 0 < d + e ? d < e ? b.a - a.a + d / (d + e) * (a.a - c.a) : b.a - c.a + e / (d + e) * (c.a - a.a) : 0;\n}\nfunction x(a, b, c) {\n var d = b.b - a.b, e = c.b - b.b;\n return 0 < d + e ? (b.a - c.a) * d + (b.a - a.a) * e : 0;\n}\nfunction z(a, b) {\n return a.a < b.a || a.a === b.a && a.b <= b.b;\n}\nfunction aa(a, b, c) {\n var d = b.a - a.a, e = c.a - b.a;\n return 0 < d + e ? d < e ? b.b - a.b + d / (d + e) * (a.b - c.b) : b.b - c.b + e / (d + e) * (c.b - a.b) : 0;\n}\nfunction ba(a, b, c) {\n var d = b.a - a.a, e = c.a - b.a;\n return 0 < d + e ? (b.b - c.b) * d + (b.b - a.b) * e : 0;\n}\nfunction ca(a) {\n return u(a.b.a, a.a);\n}\nfunction da(a) {\n return u(a.a, a.b.a);\n}\nfunction A(a, b, c, d) {\n a = 0 > a ? 0 : a;\n c = 0 > c ? 0 : c;\n return a <= c ? 0 === c ? (b + d) / 2 : b + a / (a + c) * (d - b) : d + c / (a + c) * (b - d);\n}\nfunction ea(a) {\n var b = B(a.b);\n C(b, a.c);\n C(b.b, a.c);\n D(b, a.a);\n return b;\n}\nfunction E(a, b) {\n var c = !1, d = !1;\n a !== b && (b.a !== a.a && (d = !0, F(b.a, a.a)), b.d !== a.d && (c = !0, G(b.d, a.d)), H(b, a), d || (C(b, a.a), a.a.c = a), c || (D(b, a.d), a.d.a = a));\n}\nfunction I(a) {\n var b = a.b, c = !1;\n a.d !== a.b.d && (c = !0, G(a.d, a.b.d));\n a.c === a ? F(a.a, null) : (a.b.d.a = J(a), a.a.c = a.c, H(a, J(a)), c || D(a, a.d));\n b.c === b ? (F(b.a, null), G(b.d, null)) : (a.d.a = J(b), b.a.c = b.c, H(b, J(b)));\n fa(a);\n}\nfunction K(a) {\n var b = B(a), c = b.b;\n H(b, a.e);\n b.a = a.b.a;\n C(c, b.a);\n b.d = c.d = a.d;\n b = b.b;\n H(a.b, J(a.b));\n H(a.b, b);\n a.b.a = b.a;\n b.b.a.c = b.b;\n b.b.d = a.b.d;\n b.f = a.f;\n b.b.f = a.b.f;\n return b;\n}\nfunction L(a, b) {\n var c = !1, d = B(a), e = d.b;\n b.d !== a.d && (c = !0, G(b.d, a.d));\n H(d, a.e);\n H(e, b);\n d.a = a.b.a;\n e.a = b.a;\n d.d = e.d = a.d;\n a.d.a = e;\n c || D(d, a.d);\n return d;\n}\nfunction B(a) {\n var b = new M, c = new M, d = a.b.h;\n c.h = d;\n d.b.h = b;\n b.h = a;\n a.b.h = c;\n b.b = c;\n b.c = b;\n b.e = c;\n c.b = b;\n c.c = c;\n return c.e = b;\n}\nfunction H(a, b) {\n var c = a.c, d = b.c;\n c.b.e = b;\n d.b.e = a;\n a.c = d;\n b.c = c;\n}\nfunction C(a, b) {\n var c = b.f, d = new N(b, c);\n c.e = d;\n b.f = d;\n c = d.c = a;\n do c.a = d, c = c.c;\n while (c !== a);\n}\nfunction D(a, b) {\n var c = b.d, d = new ga(b, c);\n c.b = d;\n b.d = d;\n d.a = a;\n d.c = b.c;\n c = a;\n do c.d = d, c = c.e;\n while (c !== a);\n}\nfunction fa(a) {\n var b = a.h;\n a = a.b.h;\n b.b.h = a;\n a.b.h = b;\n}\nfunction F(a, b) {\n var c = a.c, d = c;\n do d.a = b, d = d.c;\n while (d !== c);\n c = a.f;\n d = a.e;\n d.f = c;\n c.e = d;\n}\nfunction G(a, b) {\n var c = a.a, d = c;\n do d.d = b, d = d.e;\n while (d !== c);\n c = a.d;\n d = a.b;\n d.d = c;\n c.b = d;\n}\nfunction ha(a) {\n var b = 0;\n Math.abs(a[1]) > Math.abs(a[0]) && (b = 1);\n Math.abs(a[2]) > Math.abs(a[b]) && (b = 2);\n return b;\n}\nvar O = 4 * 1E150;\nfunction P(a, b) {\n a.f += b.f;\n a.b.f += b.b.f;\n}\nfunction ia(a, b, c) {\n a = a.a;\n b = b.a;\n c = c.a;\n if (b.b.a === a) return c.b.a === a ? u(b.a, c.a) ? 0 >= x(c.b.a, b.a, c.a) : 0 <= x(b.b.a, c.a, b.a) : 0 >= x(c.b.a, a, c.a);\n if (c.b.a === a) return 0 <= x(b.b.a, a, b.a);\n b = v(b.b.a, a, b.a);\n a = v(c.b.a, a, c.a);\n return b >= a;\n}\nfunction Q(a) {\n a.a.i = null;\n var b = a.e;\n b.a.c = b.c;\n b.c.a = b.a;\n a.e = null;\n}\nfunction ja(a, b) {\n I(a.a);\n a.c = !1;\n a.a = b;\n b.i = a;\n}\nfunction ka(a) {\n var b = a.a.a;\n do a = R(a);\n while (a.a.a === b);\n a.c && (b = L(S(a).a.b, a.a.e), ja(a, b), a = R(a));\n return a;\n}\nfunction la(a, b, c) {\n var d = new ma;\n d.a = c;\n d.e = na(a.f, b.e, d);\n return c.i = d;\n}\nfunction oa(a, b) {\n switch(a.s){\n case 100130:\n return 0 !== (b & 1);\n case 100131:\n return 0 !== b;\n case 100132:\n return 0 < b;\n case 100133:\n return 0 > b;\n case 100134:\n return 2 <= b || -2 >= b;\n }\n return !1;\n}\nfunction pa(a) {\n var b = a.a, c = b.d;\n c.c = a.d;\n c.a = b;\n Q(a);\n}\nfunction T(a, b, c) {\n a = b;\n for(b = b.a; a !== c;){\n a.c = !1;\n var d = S(a), e = d.a;\n if (e.a !== b.a) {\n if (!d.c) {\n pa(a);\n break;\n }\n e = L(b.c.b, e.b);\n ja(d, e);\n }\n b.c !== e && (E(J(e), e), E(b, e));\n pa(a);\n b = d.a;\n a = d;\n }\n return b;\n}\nfunction U(a, b, c, d, e, f) {\n var g = !0;\n do la(a, b, c.b), c = c.c;\n while (c !== d);\n for(null === e && (e = S(b).a.b.c);;){\n d = S(b);\n c = d.a.b;\n if (c.a !== e.a) break;\n c.c !== e && (E(J(c), c), E(J(e), c));\n d.f = b.f - c.f;\n d.d = oa(a, d.f);\n b.b = !0;\n !g && qa(a, b) && (P(c, e), Q(b), I(e));\n g = !1;\n b = d;\n e = c;\n }\n b.b = !0;\n f && ra(a, b);\n}\nfunction sa(a, b, c, d, e) {\n var f = [\n b.g[0],\n b.g[1],\n b.g[2]\n ];\n b.d = null;\n b.d = a.o ? a.o(f, c, d, a.c) || null : null;\n null === b.d && (e ? a.n || (V(a, 100156), a.n = !0) : b.d = c[0]);\n}\nfunction ta(a, b, c) {\n var d = [\n null,\n null,\n null,\n null\n ];\n d[0] = b.a.d;\n d[1] = c.a.d;\n sa(a, b.a, d, [\n .5,\n .5,\n 0,\n 0\n ], !1);\n E(b, c);\n}\nfunction ua(a, b, c, d, e) {\n var f = Math.abs(b.b - a.b) + Math.abs(b.a - a.a), g = Math.abs(c.b - a.b) + Math.abs(c.a - a.a), h = e + 1;\n d[e] = .5 * g / (f + g);\n d[h] = .5 * f / (f + g);\n a.g[0] += d[e] * b.g[0] + d[h] * c.g[0];\n a.g[1] += d[e] * b.g[1] + d[h] * c.g[1];\n a.g[2] += d[e] * b.g[2] + d[h] * c.g[2];\n}\nfunction qa(a, b) {\n var c = S(b), d = b.a, e = c.a;\n if (u(d.a, e.a)) {\n if (0 < x(e.b.a, d.a, e.a)) return !1;\n if (!t(d.a, e.a)) K(e.b), E(d, J(e)), b.b = c.b = !0;\n else if (d.a !== e.a) {\n var c = a.e, f = d.a.h;\n if (0 <= f) {\n var c = c.b, g = c.d, h = c.e, k = c.c, l = k[f];\n g[l] = g[c.a];\n k[g[l]] = l;\n l <= --c.a && (1 >= l ? W(c, l) : u(h[g[l >> 1]], h[g[l]]) ? W(c, l) : va(c, l));\n h[f] = null;\n k[f] = c.b;\n c.b = f;\n } else for(c.c[-(f + 1)] = null; 0 < c.a && null === c.c[c.d[c.a - 1]];)--c.a;\n ta(a, J(e), d);\n }\n } else {\n if (0 > x(d.b.a, e.a, d.a)) return !1;\n R(b).b = b.b = !0;\n K(d.b);\n E(J(e), d);\n }\n return !0;\n}\nfunction wa(a, b) {\n var c = S(b), d = b.a, e = c.a, f = d.a, g = e.a, h = d.b.a, k = e.b.a, l = new N;\n x(h, a.a, f);\n x(k, a.a, g);\n if (f === g || Math.min(f.a, h.a) > Math.max(g.a, k.a)) return !1;\n if (u(f, g)) {\n if (0 < x(k, f, g)) return !1;\n } else if (0 > x(h, g, f)) return !1;\n var r = h, p = f, q = k, y = g, m, w;\n u(r, p) || (m = r, r = p, p = m);\n u(q, y) || (m = q, q = y, y = m);\n u(r, q) || (m = r, r = q, q = m, m = p, p = y, y = m);\n u(q, p) ? u(p, y) ? (m = v(r, q, p), w = v(q, p, y), 0 > m + w && (m = -m, w = -w), l.b = A(m, q.b, w, p.b)) : (m = x(r, q, p), w = -x(r, y, p), 0 > m + w && (m = -m, w = -w), l.b = A(m, q.b, w, y.b)) : l.b = (q.b + p.b) / 2;\n z(r, p) || (m = r, r = p, p = m);\n z(q, y) || (m = q, q = y, y = m);\n z(r, q) || (m = r, r = q, q = m, m = p, p = y, y = m);\n z(q, p) ? z(p, y) ? (m = aa(r, q, p), w = aa(q, p, y), 0 > m + w && (m = -m, w = -w), l.a = A(m, q.a, w, p.a)) : (m = ba(r, q, p), w = -ba(r, y, p), 0 > m + w && (m = -m, w = -w), l.a = A(m, q.a, w, y.a)) : l.a = (q.a + p.a) / 2;\n u(l, a.a) && (l.b = a.a.b, l.a = a.a.a);\n r = u(f, g) ? f : g;\n u(r, l) && (l.b = r.b, l.a = r.a);\n if (t(l, f) || t(l, g)) return qa(a, b), !1;\n if (!t(h, a.a) && 0 <= x(h, a.a, l) || !t(k, a.a) && 0 >= x(k, a.a, l)) {\n if (k === a.a) return K(d.b), E(e.b, d), b = ka(b), d = S(b).a, T(a, S(b), c), U(a, b, J(d), d, d, !0), !0;\n if (h === a.a) {\n K(e.b);\n E(d.e, J(e));\n f = c = b;\n g = f.a.b.a;\n do f = R(f);\n while (f.a.b.a === g);\n b = f;\n f = S(b).a.b.c;\n c.a = J(e);\n e = T(a, c, null);\n U(a, b, e.c, d.b.c, f, !0);\n return !0;\n }\n 0 <= x(h, a.a, l) && (R(b).b = b.b = !0, K(d.b), d.a.b = a.a.b, d.a.a = a.a.a);\n 0 >= x(k, a.a, l) && (b.b = c.b = !0, K(e.b), e.a.b = a.a.b, e.a.a = a.a.a);\n return !1;\n }\n K(d.b);\n K(e.b);\n E(J(e), d);\n d.a.b = l.b;\n d.a.a = l.a;\n d.a.h = xa(a.e, d.a);\n d = d.a;\n e = [\n 0,\n 0,\n 0,\n 0\n ];\n l = [\n f.d,\n h.d,\n g.d,\n k.d\n ];\n d.g[0] = d.g[1] = d.g[2] = 0;\n ua(d, f, h, e, 0);\n ua(d, g, k, e, 2);\n sa(a, d, l, e, !0);\n R(b).b = b.b = c.b = !0;\n return !1;\n}\nfunction ra(a, b) {\n for(var c = S(b);;){\n for(; c.b;)b = c, c = S(c);\n if (!b.b && (c = b, b = R(b), null === b || !b.b)) break;\n b.b = !1;\n var d = b.a, e = c.a, f;\n if (f = d.b.a !== e.b.a) a: {\n f = b;\n var g = S(f), h = f.a, k = g.a, l = void 0;\n if (u(h.b.a, k.b.a)) {\n if (0 > x(h.b.a, k.b.a, h.a)) {\n f = !1;\n break a;\n }\n R(f).b = f.b = !0;\n l = K(h);\n E(k.b, l);\n l.d.c = f.d;\n } else {\n if (0 < x(k.b.a, h.b.a, k.a)) {\n f = !1;\n break a;\n }\n f.b = g.b = !0;\n l = K(k);\n E(h.e, k.b);\n l.b.d.c = f.d;\n }\n f = !0;\n }\n f && (c.c ? (Q(c), I(e), c = S(b), e = c.a) : b.c && (Q(b), I(d), b = R(c), d = b.a));\n if (d.a !== e.a) {\n if (d.b.a === e.b.a || b.c || c.c || d.b.a !== a.a && e.b.a !== a.a) qa(a, b);\n else if (wa(a, b)) break;\n }\n d.a === e.a && d.b.a === e.b.a && (P(e, d), Q(b), I(d), b = R(c));\n }\n}\nfunction ya(a, b) {\n a.a = b;\n for(var c = b.c; null === c.i;)if (c = c.c, c === b.c) {\n var c = a, d = b, e = new ma;\n e.a = d.c.b;\n var f = c.f, g = f.a;\n do g = g.a;\n while (null !== g.b && !f.c(f.b, e, g.b));\n var f = g.b, h = S(f), e = f.a, g = h.a;\n if (0 === x(e.b.a, d, e.a)) e = f.a, t(e.a, d) || t(e.b.a, d) || (K(e.b), f.c && (I(e.c), f.c = !1), E(d.c, e), ya(c, d));\n else {\n var k = u(g.b.a, e.b.a) ? f : h, h = void 0;\n f.d || k.c ? (k === f ? h = L(d.c.b, e.e) : h = L(g.b.c.b, d.c).b, k.c ? ja(k, h) : (e = c, f = la(c, f, h), f.f = R(f).f + f.a.f, f.d = oa(e, f.f)), ya(c, d)) : U(c, f, d.c, d.c, null, !0);\n }\n return;\n }\n c = ka(c.i);\n e = S(c);\n f = e.a;\n e = T(a, e, null);\n if (e.c === f) {\n var f = e, e = f.c, g = S(c), h = c.a, k = g.a, l = !1;\n h.b.a !== k.b.a && wa(a, c);\n t(h.a, a.a) && (E(J(e), h), c = ka(c), e = S(c).a, T(a, S(c), g), l = !0);\n t(k.a, a.a) && (E(f, J(k)), f = T(a, g, null), l = !0);\n l ? U(a, c, f.c, e, e, !0) : (u(k.a, h.a) ? d = J(k) : d = h, d = L(f.c.b, d), U(a, c, d, d.c, d.c, !1), d.b.i.c = !0, ra(a, c));\n } else U(a, c, e.c, f, f, !0);\n}\nfunction za(a, b) {\n var c = new ma, d = ea(a.b);\n d.a.b = O;\n d.a.a = b;\n d.b.a.b = -O;\n d.b.a.a = b;\n a.a = d.b.a;\n c.a = d;\n c.f = 0;\n c.d = !1;\n c.c = !1;\n c.h = !0;\n c.b = !1;\n d = a.f;\n d = na(d, d.a, c);\n c.e = d;\n}\nfunction Aa(a) {\n this.a = new Ba;\n this.b = a;\n this.c = ia;\n}\nfunction na(a, b, c) {\n do b = b.c;\n while (null !== b.b && !a.c(a.b, b.b, c));\n a = new Ba(c, b.a, b);\n b.a.c = a;\n return b.a = a;\n}\nfunction Ba(a, b, c) {\n this.b = a || null;\n this.a = b || this;\n this.c = c || this;\n}\nfunction X() {\n this.d = Y;\n this.p = this.b = this.q = null;\n this.j = [\n 0,\n 0,\n 0\n ];\n this.s = 100130;\n this.n = !1;\n this.o = this.a = this.e = this.f = null;\n this.m = !1;\n this.c = this.r = this.i = this.k = this.l = this.h = null;\n}\nvar Y = 0;\nn = X.prototype;\nn.x = function() {\n Z(this, Y);\n};\nn.B = function(a, b) {\n switch(a){\n case 100142:\n return;\n case 100140:\n switch(b){\n case 100130:\n case 100131:\n case 100132:\n case 100133:\n case 100134:\n this.s = b;\n return;\n }\n break;\n case 100141:\n this.m = !!b;\n return;\n default:\n V(this, 100900);\n return;\n }\n V(this, 100901);\n};\nn.y = function(a) {\n switch(a){\n case 100142:\n return 0;\n case 100140:\n return this.s;\n case 100141:\n return this.m;\n default:\n V(this, 100900);\n }\n return !1;\n};\nn.A = function(a, b, c) {\n this.j[0] = a;\n this.j[1] = b;\n this.j[2] = c;\n};\nn.z = function(a, b) {\n var c = b ? b : null;\n switch(a){\n case 100100:\n case 100106:\n this.h = c;\n break;\n case 100104:\n case 100110:\n this.l = c;\n break;\n case 100101:\n case 100107:\n this.k = c;\n break;\n case 100102:\n case 100108:\n this.i = c;\n break;\n case 100103:\n case 100109:\n this.p = c;\n break;\n case 100105:\n case 100111:\n this.o = c;\n break;\n case 100112:\n this.r = c;\n break;\n default:\n V(this, 100900);\n }\n};\nn.C = function(a, b) {\n var c = !1, d = [\n 0,\n 0,\n 0\n ];\n Z(this, 2);\n for(var e = 0; 3 > e; ++e){\n var f = a[e];\n -1E150 > f && (f = -1E150, c = !0);\n 1E150 < f && (f = 1E150, c = !0);\n d[e] = f;\n }\n c && V(this, 100155);\n c = this.q;\n null === c ? (c = ea(this.b), E(c, c.b)) : (K(c), c = c.e);\n c.a.d = b;\n c.a.g[0] = d[0];\n c.a.g[1] = d[1];\n c.a.g[2] = d[2];\n c.f = 1;\n c.b.f = -1;\n this.q = c;\n};\nn.u = function(a) {\n Z(this, Y);\n this.d = 1;\n this.b = new Ca;\n this.c = a;\n};\nn.t = function() {\n Z(this, 1);\n this.d = 2;\n this.q = null;\n};\nn.v = function() {\n Z(this, 2);\n this.d = 1;\n};\nn.w = function() {\n Z(this, 1);\n this.d = Y;\n var a = this.j[0], b = this.j[1], c = this.j[2], d = !1, e = [\n a,\n b,\n c\n ];\n if (0 === a && 0 === b && 0 === c) {\n for(var b = [\n -2 * 1E150,\n -2 * 1E150,\n -2 * 1E150\n ], f = [\n 2 * 1E150,\n 2 * 1E150,\n 2 * 1E150\n ], c = [], g = [], d = this.b.c, a = d.e; a !== d; a = a.e)for(var h = 0; 3 > h; ++h){\n var k = a.g[h];\n k < f[h] && (f[h] = k, g[h] = a);\n k > b[h] && (b[h] = k, c[h] = a);\n }\n a = 0;\n b[1] - f[1] > b[0] - f[0] && (a = 1);\n b[2] - f[2] > b[a] - f[a] && (a = 2);\n if (f[a] >= b[a]) e[0] = 0, e[1] = 0, e[2] = 1;\n else {\n b = 0;\n f = g[a];\n c = c[a];\n g = [\n 0,\n 0,\n 0\n ];\n f = [\n f.g[0] - c.g[0],\n f.g[1] - c.g[1],\n f.g[2] - c.g[2]\n ];\n h = [\n 0,\n 0,\n 0\n ];\n for(a = d.e; a !== d; a = a.e)h[0] = a.g[0] - c.g[0], h[1] = a.g[1] - c.g[1], h[2] = a.g[2] - c.g[2], g[0] = f[1] * h[2] - f[2] * h[1], g[1] = f[2] * h[0] - f[0] * h[2], g[2] = f[0] * h[1] - f[1] * h[0], k = g[0] * g[0] + g[1] * g[1] + g[2] * g[2], k > b && (b = k, e[0] = g[0], e[1] = g[1], e[2] = g[2]);\n 0 >= b && (e[0] = e[1] = e[2] = 0, e[ha(f)] = 1);\n }\n d = !0;\n }\n g = ha(e);\n a = this.b.c;\n b = (g + 1) % 3;\n c = (g + 2) % 3;\n g = 0 < e[g] ? 1 : -1;\n for(e = a.e; e !== a; e = e.e)e.b = e.g[b], e.a = g * e.g[c];\n if (d) {\n e = 0;\n d = this.b.a;\n for(a = d.b; a !== d; a = a.b)if (b = a.a, !(0 >= b.f)) {\n do e += (b.a.b - b.b.a.b) * (b.a.a + b.b.a.a), b = b.e;\n while (b !== a.a);\n }\n if (0 > e) for(e = this.b.c, d = e.e; d !== e; d = d.e)d.a = -d.a;\n }\n this.n = !1;\n e = this.b.b;\n for(a = e.h; a !== e; a = d)if (d = a.h, b = a.e, t(a.a, a.b.a) && a.e.e !== a && (ta(this, b, a), I(a), a = b, b = a.e), b.e === a) {\n if (b !== a) {\n if (b === d || b === d.b) d = d.h;\n I(b);\n }\n if (a === d || a === d.b) d = d.h;\n I(a);\n }\n this.e = e = new Da;\n d = this.b.c;\n for(a = d.e; a !== d; a = a.e)a.h = xa(e, a);\n Ea(e);\n this.f = new Aa(this);\n za(this, -O);\n for(za(this, O); null !== (e = Fa(this.e));){\n for(;;){\n a: if (a = this.e, 0 === a.a) d = Ga(a.b);\n else if (d = a.c[a.d[a.a - 1]], 0 !== a.b.a && (a = Ga(a.b), u(a, d))) {\n d = a;\n break a;\n }\n if (null === d || !t(d, e)) break;\n d = Fa(this.e);\n ta(this, e.c, d.c);\n }\n ya(this, e);\n }\n this.a = this.f.a.a.b.a.a;\n for(e = 0; null !== (d = this.f.a.a.b);)d.h || ++e, Q(d);\n this.f = null;\n e = this.e;\n e.b = null;\n e.d = null;\n this.e = e.c = null;\n e = this.b;\n for(a = e.a.b; a !== e.a; a = d)d = a.b, a = a.a, a.e.e === a && (P(a.c, a), I(a));\n if (!this.n) {\n e = this.b;\n if (this.m) for(a = e.b.h; a !== e.b; a = d)d = a.h, a.b.d.c !== a.d.c ? a.f = a.d.c ? 1 : -1 : I(a);\n else for(a = e.a.b; a !== e.a; a = d)if (d = a.b, a.c) {\n for(a = a.a; u(a.b.a, a.a); a = a.c.b);\n for(; u(a.a, a.b.a); a = a.e);\n b = a.c.b;\n for(c = void 0; a.e !== b;)if (u(a.b.a, b.a)) {\n for(; b.e !== a && (ca(b.e) || 0 >= x(b.a, b.b.a, b.e.b.a));)c = L(b.e, b), b = c.b;\n b = b.c.b;\n } else {\n for(; b.e !== a && (da(a.c.b) || 0 <= x(a.b.a, a.a, a.c.b.a));)c = L(a, a.c.b), a = c.b;\n a = a.e;\n }\n for(; b.e.e !== a;)c = L(b.e, b), b = c.b;\n }\n if (this.h || this.i || this.k || this.l) if (this.m) for(e = this.b, d = e.a.b; d !== e.a; d = d.b){\n if (d.c) {\n this.h && this.h(2, this.c);\n a = d.a;\n do this.k && this.k(a.a.d, this.c), a = a.e;\n while (a !== d.a);\n this.i && this.i(this.c);\n }\n }\n else {\n e = this.b;\n d = !!this.l;\n a = !1;\n b = -1;\n for(c = e.a.d; c !== e.a; c = c.d)if (c.c) {\n a || (this.h && this.h(4, this.c), a = !0);\n g = c.a;\n do d && (f = g.b.d.c ? 0 : 1, b !== f && (b = f, this.l && this.l(!!b, this.c))), this.k && this.k(g.a.d, this.c), g = g.e;\n while (g !== c.a);\n }\n a && this.i && this.i(this.c);\n }\n if (this.r) {\n e = this.b;\n for(a = e.a.b; a !== e.a; a = d)if (d = a.b, !a.c) {\n b = a.a;\n c = b.e;\n g = void 0;\n do g = c, c = g.e, g.d = null, null === g.b.d && (g.c === g ? F(g.a, null) : (g.a.c = g.c, H(g, J(g))), f = g.b, f.c === f ? F(f.a, null) : (f.a.c = f.c, H(f, J(f))), fa(g));\n while (g !== b);\n b = a.d;\n a = a.b;\n a.d = b;\n b.b = a;\n }\n this.r(this.b);\n this.c = this.b = null;\n return;\n }\n }\n this.b = this.c = null;\n};\nfunction Z(a, b) {\n if (a.d !== b) for(; a.d !== b;)if (a.d < b) switch(a.d){\n case Y:\n V(a, 100151);\n a.u(null);\n break;\n case 1:\n V(a, 100152), a.t();\n }\n else switch(a.d){\n case 2:\n V(a, 100154);\n a.v();\n break;\n case 1:\n V(a, 100153), a.w();\n }\n}\nfunction V(a, b) {\n a.p && a.p(b, a.c);\n}\nfunction ga(a, b) {\n this.b = a || this;\n this.d = b || this;\n this.a = null;\n this.c = !1;\n}\nfunction M() {\n this.h = this;\n this.i = this.d = this.a = this.e = this.c = this.b = null;\n this.f = 0;\n}\nfunction J(a) {\n return a.b.e;\n}\nfunction Ca() {\n this.c = new N;\n this.a = new ga;\n this.b = new M;\n this.d = new M;\n this.b.b = this.d;\n this.d.b = this.b;\n}\nfunction N(a, b) {\n this.e = a || this;\n this.f = b || this;\n this.d = this.c = null;\n this.g = [\n 0,\n 0,\n 0\n ];\n this.h = this.a = this.b = 0;\n}\nfunction Da() {\n this.c = [];\n this.d = null;\n this.a = 0;\n this.e = !1;\n this.b = new Ha;\n}\nfunction Ea(a) {\n a.d = [];\n for(var b = 0; b < a.a; b++)a.d[b] = b;\n a.d.sort(function(a) {\n return function(b, e) {\n return u(a[b], a[e]) ? 1 : -1;\n };\n }(a.c));\n a.e = !0;\n Ia(a.b);\n}\nfunction xa(a, b) {\n if (a.e) {\n var c = a.b, d = ++c.a;\n 2 * d > c.f && (c.f *= 2, c.c = Ja(c.c, c.f + 1));\n var e;\n 0 === c.b ? e = d : (e = c.b, c.b = c.c[c.b]);\n c.e[e] = b;\n c.c[e] = d;\n c.d[d] = e;\n c.h && va(c, d);\n return e;\n }\n c = a.a++;\n a.c[c] = b;\n return -(c + 1);\n}\nfunction Fa(a) {\n if (0 === a.a) return Ka(a.b);\n var b = a.c[a.d[a.a - 1]];\n if (0 !== a.b.a && u(Ga(a.b), b)) return Ka(a.b);\n do --a.a;\n while (0 < a.a && null === a.c[a.d[a.a - 1]]);\n return b;\n}\nfunction Ha() {\n this.d = Ja([\n 0\n ], 33);\n this.e = [\n null,\n null\n ];\n this.c = [\n 0,\n 0\n ];\n this.a = 0;\n this.f = 32;\n this.b = 0;\n this.h = !1;\n this.d[1] = 1;\n}\nfunction Ja(a, b) {\n for(var c = Array(b), d = 0; d < a.length; d++)c[d] = a[d];\n for(; d < b; d++)c[d] = 0;\n return c;\n}\nfunction Ia(a) {\n for(var b = a.a; 1 <= b; --b)W(a, b);\n a.h = !0;\n}\nfunction Ga(a) {\n return a.e[a.d[1]];\n}\nfunction Ka(a) {\n var b = a.d, c = a.e, d = a.c, e = b[1], f = c[e];\n 0 < a.a && (b[1] = b[a.a], d[b[1]] = 1, c[e] = null, d[e] = a.b, a.b = e, 0 < --a.a && W(a, 1));\n return f;\n}\nfunction W(a, b) {\n for(var c = a.d, d = a.e, e = a.c, f = b, g = c[f];;){\n var h = f << 1;\n h < a.a && u(d[c[h + 1]], d[c[h]]) && (h += 1);\n var k = c[h];\n if (h > a.a || u(d[g], d[k])) {\n c[f] = g;\n e[g] = f;\n break;\n }\n c[f] = k;\n e[k] = f;\n f = h;\n }\n}\nfunction va(a, b) {\n for(var c = a.d, d = a.e, e = a.c, f = b, g = c[f];;){\n var h = f >> 1, k = c[h];\n if (0 === h || u(d[k], d[g])) {\n c[f] = g;\n e[g] = f;\n break;\n }\n c[f] = k;\n e[k] = f;\n f = h;\n }\n}\nfunction ma() {\n this.e = this.a = null;\n this.f = 0;\n this.c = this.b = this.h = this.d = !1;\n}\nfunction S(a) {\n return a.e.c.b;\n}\nfunction R(a) {\n return a.e.a.b;\n}\ncommonjsGlobal.libtess = {\n GluTesselator: X,\n windingRule: {\n GLU_TESS_WINDING_ODD: 100130,\n GLU_TESS_WINDING_NONZERO: 100131,\n GLU_TESS_WINDING_POSITIVE: 100132,\n GLU_TESS_WINDING_NEGATIVE: 100133,\n GLU_TESS_WINDING_ABS_GEQ_TWO: 100134\n },\n primitiveType: {\n GL_LINE_LOOP: 2,\n GL_TRIANGLES: 4,\n GL_TRIANGLE_STRIP: 5,\n GL_TRIANGLE_FAN: 6\n },\n errorType: {\n GLU_TESS_MISSING_BEGIN_POLYGON: 100151,\n GLU_TESS_MISSING_END_POLYGON: 100153,\n GLU_TESS_MISSING_BEGIN_CONTOUR: 100152,\n GLU_TESS_MISSING_END_CONTOUR: 100154,\n GLU_TESS_COORD_TOO_LARGE: 100155,\n GLU_TESS_NEED_COMBINE_CALLBACK: 100156\n },\n gluEnum: {\n GLU_TESS_MESH: 100112,\n GLU_TESS_TOLERANCE: 100142,\n GLU_TESS_WINDING_RULE: 100140,\n GLU_TESS_BOUNDARY_ONLY: 100141,\n GLU_INVALID_ENUM: 100900,\n GLU_INVALID_VALUE: 100901,\n GLU_TESS_BEGIN: 100100,\n GLU_TESS_VERTEX: 100101,\n GLU_TESS_END: 100102,\n GLU_TESS_ERROR: 100103,\n GLU_TESS_EDGE_FLAG: 100104,\n GLU_TESS_COMBINE: 100105,\n GLU_TESS_BEGIN_DATA: 100106,\n GLU_TESS_VERTEX_DATA: 100107,\n GLU_TESS_END_DATA: 100108,\n GLU_TESS_ERROR_DATA: 100109,\n GLU_TESS_EDGE_FLAG_DATA: 100110,\n GLU_TESS_COMBINE_DATA: 100111\n }\n};\nX.prototype.gluDeleteTess = X.prototype.x;\nX.prototype.gluTessProperty = X.prototype.B;\nX.prototype.gluGetTessProperty = X.prototype.y;\nX.prototype.gluTessNormal = X.prototype.A;\nX.prototype.gluTessCallback = X.prototype.z;\nX.prototype.gluTessVertex = X.prototype.C;\nX.prototype.gluTessBeginPolygon = X.prototype.u;\nX.prototype.gluTessBeginContour = X.prototype.t;\nX.prototype.gluTessEndContour = X.prototype.v;\nX.prototype.gluTessEndPolygon = X.prototype.w;\n{\n module.exports = commonjsGlobal.libtess;\n}\n}(libtess_min));\n\nvar tessy = function initTesselator() {\n // function called for each vertex of tesselator output\n function vertexCallback(data, polyVertArray) {\n polyVertArray[polyVertArray.length] = data[0];\n polyVertArray[polyVertArray.length] = data[1];\n }\n function begincallback(type) {\n if (type !== libtess_min.exports.primitiveType.GL_TRIANGLES) {\n console.info(\"expected TRIANGLES but got type: \" + type);\n }\n }\n function errorcallback(errno) {\n console.error(\"error callback, error number: \" + errno);\n }\n // callback for when segments intersect and must be split\n function combinecallback(coords, data, weight) {\n // console.log('combine callback');\n return [\n coords[0],\n coords[1],\n coords[2]\n ];\n }\n function edgeCallback(flag) {\n // don't really care about the flag, but need no-strip/no-fan behavior\n // console.log('edge flag: ' + flag);\n }\n var tessy = new libtess_min.exports.GluTesselator();\n // tessy.gluTessProperty(libtess.gluEnum.GLU_TESS_WINDING_RULE, libtess.windingRule.GLU_TESS_WINDING_POSITIVE);\n tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_VERTEX_DATA, vertexCallback);\n tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_BEGIN, begincallback);\n tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_ERROR, errorcallback);\n tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_COMBINE, combinecallback);\n tessy.gluTessCallback(libtess_min.exports.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback);\n return tessy;\n}();\nfunction triangulate(contours) {\n // libtess will take 3d verts and flatten to a plane for tesselation\n // since only doing 2d tesselation here, provide z=1 normal to skip\n // iterating over verts only to get the same answer.\n // comment out to test normal-generation code\n tessy.gluTessNormal(0, 0, 1);\n var triangleVerts = [];\n tessy.gluTessBeginPolygon(triangleVerts);\n for(var i = 0; i < contours.length; i++){\n tessy.gluTessBeginContour();\n var contour = contours[i];\n for(var j = 0; j < contour.length; j += 2){\n var coords = [\n contour[j],\n contour[j + 1],\n 0\n ];\n tessy.gluTessVertex(coords, coords);\n }\n tessy.gluTessEndContour();\n }\n // finish polygon\n tessy.gluTessEndPolygon();\n return triangleVerts;\n}\n\n// Based on:\n/**\n * A class to define a shape via user defined coordinates.\n */ var Polygon = /*#__PURE__*/ function(ShapePrimitive) {\n _inherits(Polygon, ShapePrimitive);\n function Polygon() {\n for(var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++){\n points[_key] = arguments[_key];\n }\n var _this;\n _this = ShapePrimitive.call(this) || this;\n /**\n * An array of the points of this polygon.\n */ _this.points = [];\n /**\n * `false` after moveTo, `true` after `closePath`. In all other cases it is `true`.\n */ _this.closePath = false;\n var flat = Array.isArray(points[0]) ? points[0] : points;\n // if this is an array of points, convert it to a flat array of numbers\n if (typeof flat[0] !== \"number\") {\n var p = [];\n for(var i = 0, il = flat.length; i < il; i++){\n p.push(flat[i].x, flat[i].y);\n }\n flat = p;\n }\n _this.points = flat;\n _this.closePath = true;\n return _this;\n }\n var _proto = Polygon.prototype;\n /**\n * Creates a clone of this polygon.\n * @returns - A copy of the polygon.\n */ _proto.clone = function clone() {\n var points = this.points.slice();\n var polygon = new Polygon(points);\n polygon.closePath = this.closePath;\n return polygon;\n };\n /**\n * Checks whether the x and y coordinates passed to this function are contained within this polygon.\n * @param x - The X coordinate of the point to test.\n * @param y - The Y coordinate of the point to test.\n * @returns - Whether the x/y coordinates are within this polygon.\n */ _proto.contains = function contains(x, y) {\n var inside = false;\n // use some raycasting to test hits\n // https://github.com/substack/point-in-polygon/blob/master/index.js\n var length = this.points.length / 2;\n for(var i = 0, j = length - 1; i < length; j = i++){\n var xi = this.points[i * 2];\n var yi = this.points[i * 2 + 1];\n var xj = this.points[j * 2];\n var yj = this.points[j * 2 + 1];\n var intersect = yi > y !== yj > y && x < (xj - xi) * ((y - yi) / (yj - yi)) + xi;\n if (intersect) {\n inside = !inside;\n }\n }\n return inside;\n };\n /**\n * Copies another polygon to this one.\n * @param polygon - The polygon to copy from.\n * @returns Returns itself.\n */ _proto.copyFrom = function copyFrom(polygon) {\n this.points = polygon.points.slice();\n this.closePath = polygon.closePath;\n return this;\n };\n /**\n * Copies this polygon to another one.\n * @param polygon - The polygon to copy to.\n * @returns Returns given parameter.\n */ _proto.copyTo = function copyTo(polygon) {\n polygon.copyFrom(this);\n return polygon;\n };\n /**\n * Get the first X coordinate of the polygon\n * @readonly\n */ _proto.getX = function getX() {\n return this.points[this.points.length - 2];\n };\n /**\n * Get the first Y coordinate of the polygon\n * @readonly\n */ _proto.getY = function getY() {\n return this.points[this.points.length - 1];\n };\n _proto.build = function build(points) {\n for(var i = 0; i < this.points.length; i++){\n points[i] = this.points[i];\n }\n };\n _proto.triangulate = function triangulate1(points, vertices, verticesOffset, indices, indicesOffset) {\n var triangles = triangulate([\n points\n ]);\n var indexStart = vertices.length / 2;\n // 当所有 points 在一条直线时, gluTess 三角化 triangles 会返回空数组,这边做一下额外处理返回线段左右端点组成的三角形,确保拿到的包围盒是正确的。\n if (triangles.length === 0) {\n this.getLineEndPointsTriangle(points, triangles);\n }\n for(var i = 0; i < triangles.length; i++){\n vertices[verticesOffset * 2 + i] = triangles[i];\n }\n var vertexCount = triangles.length / 2;\n for(var i1 = 0; i1 < vertexCount; i1++){\n indices[indicesOffset + i1] = indexStart + i1;\n }\n };\n /**\n * 获取直线上最远的两个端点坐标组成的三角形\n */ _proto.getLineEndPointsTriangle = function getLineEndPointsTriangle(points, triangles) {\n // 参数检查\n if (!points || points.length < 2 || points.length % 2 !== 0) {\n throw new Error(\"Invalid points array\");\n }\n if (points.length === 2) {\n triangles.push(points[0], points[1], points[0], points[1], points[0], points[1]);\n return;\n }\n // 取第一个线段计算斜率\n var dx = points[2] - points[0];\n var dy = points[3] - points[1];\n // 存放结果坐标\n var startX = points[0];\n var startY = points[1];\n var endX = points[0];\n var endY = points[1];\n // 根据斜率决定比较x还是y\n if (Math.abs(dx) >= Math.abs(dy)) {\n // 水平方向为主,比较x坐标\n for(var i = 0; i < points.length; i += 2){\n var x = points[i];\n var y = points[i + 1];\n if (x < startX) {\n startX = x;\n startY = y;\n }\n if (x > endX) {\n endX = x;\n endY = y;\n }\n }\n } else {\n // 垂直方向为主,比较y坐标\n for(var i1 = 0; i1 < points.length; i1 += 2){\n var x1 = points[i1];\n var y1 = points[i1 + 1];\n if (y1 < startY) {\n startX = x1;\n startY = y1;\n }\n if (y1 > endY) {\n endX = x1;\n endY = y1;\n }\n }\n }\n triangles.push(startX, startY, endX, endY, endX, endY);\n };\n _create_class(Polygon, [\n {\n key: \"lastX\",\n get: /**\n * Get the last X coordinate of the polygon\n * @readonly\n */ function get() {\n return this.points[this.points.length - 2];\n }\n },\n {\n key: \"lastY\",\n get: /**\n * Get the last Y coordinate of the polygon\n * @readonly\n */ function get() {\n return this.points[this.points.length - 1];\n }\n }\n ]);\n return Polygon;\n}(ShapePrimitive);\n\n// thanks to https://github.com/mattdesl/adaptive-bezier-curve\n// for the original code!\nvar RECURSION_LIMIT = 8;\nvar FLT_EPSILON = 1.19209290e-7;\nvar PATH_DISTANCE_EPSILON = 1.0;\nvar defaultBezierSmoothness = 0.5;\nfunction buildAdaptiveBezier(points, sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, smoothness) {\n // TODO expose as a parameter\n var scale = 5;\n var smoothing = Math.min(0.99, Math.max(0, smoothness != null ? smoothness : defaultBezierSmoothness));\n var distanceTolerance = (PATH_DISTANCE_EPSILON - smoothing) / scale;\n distanceTolerance *= distanceTolerance;\n begin(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance);\n return points;\n}\n//// Based on:\n//// https://github.com/pelson/antigrain/blob/master/agg-2.4/src/agg_curves.cpp\nfunction begin(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance) {\n // dont need to actually ad this!\n // points.push(sX, sY);\n recursive(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance, 0);\n points.push(eX, eY);\n}\n// eslint-disable-next-line max-params\nfunction recursive(x1, y1, x2, y2, x3, y3, x4, y4, points, distanceTolerance, level) {\n if (level > RECURSION_LIMIT) {\n return;\n }\n // Calculate all the mid-points of the line segments\n // ----------------------\n var x12 = (x1 + x2) / 2;\n var y12 = (y1 + y2) / 2;\n var x23 = (x2 + x3) / 2;\n var y23 = (y2 + y3) / 2;\n var x34 = (x3 + x4) / 2;\n var y34 = (y3 + y4) / 2;\n var x123 = (x12 + x23) / 2;\n var y123 = (y12 + y23) / 2;\n var x234 = (x23 + x34) / 2;\n var y234 = (y23 + y34) / 2;\n var x1234 = (x123 + x234) / 2;\n var y1234 = (y123 + y234) / 2;\n if (level > 0) {\n // Try to approximate the full cubic curve by a single straight line\n // ------------------\n var dx = x4 - x1;\n var dy = y4 - y1;\n var d2 = Math.abs((x2 - x4) * dy - (y2 - y4) * dx);\n var d3 = Math.abs((x3 - x4) * dy - (y3 - y4) * dx);\n if (d2 > FLT_EPSILON && d3 > FLT_EPSILON) {\n // Regular care\n // -----------------\n if ((d2 + d3) * (d2 + d3) <= distanceTolerance * (dx * dx + dy * dy)) {\n // If the curvature doesn't exceed the distanceTolerance value\n // we tend to finish subdivisions.\n // ----------------------\n {\n points.push(x1234, y1234);\n return;\n }\n }\n } else if (d2 > FLT_EPSILON) {\n // p1,p3,p4 are collinear, p2 is considerable\n // ----------------------\n if (d2 * d2 <= distanceTolerance * (dx * dx + dy * dy)) {\n {\n points.push(x1234, y1234);\n return;\n }\n }\n } else if (d3 > FLT_EPSILON) {\n // p1,p2,p4 are collinear, p3 is considerable\n // ----------------------\n if (d3 * d3 <= distanceTolerance * (dx * dx + dy * dy)) {\n {\n points.push(x1234, y1234);\n return;\n }\n }\n } else {\n // Collinear case\n // -----------------\n dx = x1234 - (x1 + x4) / 2;\n dy = y1234 - (y1 + y4) / 2;\n if (dx * dx + dy * dy <= distanceTolerance) {\n points.push(x1234, y1234);\n return;\n }\n }\n }\n // Continue subdivision\n // ----------------------\n recursive(x1, y1, x12, y12, x123, y123, x1234, y1234, points, distanceTolerance, level + 1);\n recursive(x1234, y1234, x234, y234, x34, y34, x4, y4, points, distanceTolerance, level + 1);\n}\n\n// Based on:\n/**\n * The Ellipse object is used to help draw graphics and can also be used to specify a hit area for containers.\n */ var Ellipse = /*#__PURE__*/ function(ShapePrimitive) {\n _inherits(Ellipse, ShapePrimitive);\n function Ellipse(x, y, halfWidth, halfHeight) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (halfWidth === void 0) halfWidth = 0;\n if (halfHeight === void 0) halfHeight = 0;\n var _this;\n _this = ShapePrimitive.call(this) || this;\n /**\n * The type of the object, mainly used to avoid `instanceof` checks\n * @default 'ellipse'\n */ _this.type = \"ellipse\";\n _this.x = x;\n _this.y = y;\n _this.halfWidth = halfWidth;\n _this.halfHeight = halfHeight;\n return _this;\n }\n var _proto = Ellipse.prototype;\n /**\n * Creates a clone of this Ellipse instance\n * @returns {Ellipse} A copy of the ellipse\n */ _proto.clone = function clone() {\n return new Ellipse(this.x, this.y, this.halfWidth, this.halfHeight);\n };\n /**\n * Checks whether the x and y coordinates given are contained within this ellipse\n * @param x - The X coordinate of the point to test\n * @param y - The Y coordinate of the point to test\n * @returns Whether the x/y coords are within this ellipse\n */ _proto.contains = function contains(x, y) {\n if (this.halfWidth <= 0 || this.halfHeight <= 0) {\n return false;\n }\n // normalize the coords to an ellipse with center 0,0\n var normx = (x - this.x) / this.halfWidth;\n var normy = (y - this.y) / this.halfHeight;\n normx *= normx;\n normy *= normy;\n return normx + normy <= 1;\n };\n /**\n * Checks whether the x and y coordinates given are contained within this ellipse including stroke\n * @param x - The X coordinate of the point to test\n * @param y - The Y coordinate of the point to test\n * @param width\n * @returns Whether the x/y coords are within this ellipse\n */ _proto.strokeContains = function strokeContains(x, y, width) {\n var _this = this, halfWidth = _this.halfWidth, halfHeight = _this.halfHeight;\n if (halfWidth <= 0 || halfHeight <= 0) {\n return false;\n }\n var halfStrokeWidth = width / 2;\n var innerA = halfWidth - halfStrokeWidth;\n var innerB = halfHeight - halfStrokeWidth;\n var outerA = halfWidth + halfStrokeWidth;\n var outerB = halfHeight + halfStrokeWidth;\n var normalizedX = x - this.x;\n var normalizedY = y - this.y;\n var innerEllipse = normalizedX * normalizedX / (innerA * innerA) + normalizedY * normalizedY / (innerB * innerB);\n var outerEllipse = normalizedX * normalizedX / (outerA * outerA) + normalizedY * normalizedY / (outerB * outerB);\n return innerEllipse > 1 && outerEllipse <= 1;\n };\n /**\n * Returns the framing rectangle of the ellipse as a Rectangle object\n * @param out\n * @returns The framing rectangle\n */ // getBounds (out?: Rectangle): Rectangle {\n // out = out || new Rectangle();\n // out.x = this.x - this.halfWidth;\n // out.y = this.y - this.halfHeight;\n // out.width = this.halfWidth * 2;\n // out.height = this.halfHeight * 2;\n // return out;\n // }\n /**\n * Copies another ellipse to this one.\n * @param ellipse - The ellipse to copy from.\n * @returns Returns itself.\n */ _proto.copyFrom = function copyFrom(ellipse) {\n this.x = ellipse.x;\n this.y = ellipse.y;\n this.halfWidth = ellipse.halfWidth;\n this.halfHeight = ellipse.halfHeight;\n return this;\n };\n /**\n * Copies this ellipse to another one.\n * @param ellipse - The ellipse to copy to.\n * @returns Returns given parameter.\n */ _proto.copyTo = function copyTo(ellipse) {\n ellipse.copyFrom(this);\n return ellipse;\n };\n _proto.getX = function getX() {\n return this.x;\n };\n _proto.getY = function getY() {\n return this.y;\n };\n _proto.build = function build(points) {\n var x = this.x;\n var y = this.y;\n var rx = this.halfWidth;\n var ry = this.halfHeight;\n var dx = 0;\n var dy = 0;\n if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {\n return points;\n }\n // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029\n var sampleDensity = 5;\n var n = Math.ceil(sampleDensity * Math.sqrt(rx + ry));\n var m = n * 8 + (0) + (0);\n if (m === 0) {\n return points;\n }\n if (n === 0) {\n points[0] = points[6] = x + dx;\n points[1] = points[3] = y + dy;\n points[2] = points[4] = x - dx;\n points[5] = points[7] = y - dy;\n return points;\n }\n var j1 = 0;\n var j2 = n * 4 + (0) + 2;\n var j3 = j2;\n var j4 = m;\n var x0 = dx + rx;\n var y0 = dy;\n var x1 = x + x0;\n var x2 = x - x0;\n var y1 = y + y0;\n points[j1++] = x1;\n points[j1++] = y1;\n points[--j2] = y1;\n points[--j2] = x2;\n for(var i = 1; i < n; i++){\n var a = Math.PI / 2 * (i / n);\n var x01 = dx + Math.cos(a) * rx;\n var y01 = dy + Math.sin(a) * ry;\n var x11 = x + x01;\n var x21 = x - x01;\n var y11 = y + y01;\n var y21 = y - y01;\n points[j1++] = x11;\n points[j1++] = y11;\n points[--j2] = y11;\n points[--j2] = x21;\n points[j3++] = x21;\n points[j3++] = y21;\n points[--j4] = y21;\n points[--j4] = x11;\n }\n x0 = dx;\n y0 = dy + ry;\n x1 = x + x0;\n x2 = x - x0;\n y1 = y + y0;\n var y22 = y - y0;\n points[j1++] = x1;\n points[j1++] = y1;\n points[--j4] = y22;\n points[--j4] = x1;\n return points;\n };\n _proto.triangulate = function triangulate(points, vertices, verticesOffset, indices, indicesOffset) {\n if (points.length === 0) {\n return;\n }\n // Compute center (average of all points)\n var centerX = 0;\n var centerY = 0;\n for(var i = 0; i < points.length; i += 2){\n centerX += points[i];\n centerY += points[i + 1];\n }\n centerX /= points.length / 2;\n centerY /= points.length / 2;\n // Set center vertex\n var count = verticesOffset;\n vertices[count * 2] = centerX;\n vertices[count * 2 + 1] = centerY;\n var centerIndex = count++;\n // Set edge vertices and indices\n for(var i1 = 0; i1 < points.length; i1 += 2){\n vertices[count * 2] = points[i1];\n vertices[count * 2 + 1] = points[i1 + 1];\n if (i1 > 0) {\n indices[indicesOffset++] = count;\n indices[indicesOffset++] = centerIndex;\n indices[indicesOffset++] = count - 1;\n }\n count++;\n }\n // Connect last point to the first edge point\n indices[indicesOffset++] = centerIndex + 1;\n indices[indicesOffset++] = centerIndex;\n indices[indicesOffset++] = count - 1;\n };\n return Ellipse;\n}(ShapePrimitive);\n\n// Based on:\nexports.StarType = void 0;\n(function(StarType) {\n StarType[StarType[\"Star\"] = 0] = \"Star\";\n StarType[StarType[\"Polygon\"] = 1] = \"Polygon\";\n})(exports.StarType || (exports.StarType = {}));\nvar PolyStar = /*#__PURE__*/ function(ShapePrimitive) {\n _inherits(PolyStar, ShapePrimitive);\n function PolyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType) {\n if (pointCount === void 0) pointCount = 0;\n if (outerRadius === void 0) outerRadius = 0;\n if (innerRadius === void 0) innerRadius = 0;\n if (outerRoundness === void 0) outerRoundness = 0;\n if (innerRoundness === void 0) innerRoundness = 0;\n if (starType === void 0) starType = 0;\n var _this;\n _this = ShapePrimitive.call(this) || this;\n _this.pointCount = pointCount;\n _this.outerRadius = outerRadius;\n _this.innerRadius = innerRadius;\n _this.outerRoundness = outerRoundness;\n _this.innerRoundness = innerRoundness;\n _this.starType = starType;\n _this.v = [];\n _this.in = [];\n _this.out = [];\n return _this;\n }\n var _proto = PolyStar.prototype;\n _proto.clone = function clone() {\n var polyStar = new PolyStar(this.pointCount, this.outerRadius, this.innerRadius, this.outerRoundness, this.innerRoundness, this.starType);\n return polyStar;\n };\n _proto.copyFrom = function copyFrom(source) {\n this.pointCount = source.pointCount;\n this.outerRadius = source.outerRadius;\n this.innerRadius = source.innerRadius;\n this.outerRoundness = source.outerRoundness;\n this.innerRoundness = source.innerRoundness;\n this.starType = source.starType;\n };\n _proto.copyTo = function copyTo(destination) {\n destination.copyFrom(this);\n };\n _proto.build = function build(points) {\n switch(this.starType){\n case 0:\n {\n this.buildStarPath();\n break;\n }\n case 1:\n {\n this.buildPolygonPath();\n break;\n }\n }\n var smoothness = 1;\n for(var i = 0; i < this.v.length - 2; i += 2){\n buildAdaptiveBezier(points, this.v[i], this.v[i + 1], this.out[i], this.out[i + 1], this.in[i + 2], this.in[i + 3], this.v[i + 2], this.v[i + 3], smoothness);\n }\n // draw last curve\n var lastIndex = this.v.length - 1;\n buildAdaptiveBezier(points, this.v[lastIndex - 1], this.v[lastIndex], this.out[lastIndex - 1], this.out[lastIndex], this.in[0], this.in[1], this.v[0], this.v[1], smoothness);\n };\n _proto.triangulate = function triangulate1(points, vertices, verticesOffset, indices, indicesOffset) {\n var triangles = triangulate([\n points\n ]);\n var indexStart = vertices.length / 2;\n for(var i = 0; i < triangles.length; i++){\n vertices[verticesOffset * 2 + i] = triangles[i];\n }\n var vertexCount = triangles.length / 2;\n for(var i1 = 0; i1 < vertexCount; i1++){\n indices[indicesOffset + i1] = indexStart + i1;\n }\n };\n _proto.buildStarPath = function buildStarPath() {\n this.v = [];\n this.in = [];\n this.out = [];\n var numPts = Math.floor(this.pointCount) * 2;\n var angle = Math.PI * 2 / numPts;\n var longFlag = true;\n var longRad = this.outerRadius;\n var shortRad = this.innerRadius;\n var longRound = this.outerRoundness / 100;\n var shortRound = this.innerRoundness / 100;\n var longPerimSegment = 2 * Math.PI * longRad / (numPts * 2);\n var shortPerimSegment = 2 * Math.PI * shortRad / (numPts * 2);\n var i;\n var rad;\n var roundness;\n var perimSegment;\n var currentAng = -Math.PI / 2;\n var dir = 1;\n for(i = 0; i < numPts; i++){\n rad = longFlag ? longRad : shortRad;\n roundness = longFlag ? longRound : shortRound;\n perimSegment = longFlag ? longPerimSegment : shortPerimSegment;\n var x = rad * Math.cos(currentAng);\n var y = rad * Math.sin(currentAng);\n var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);\n var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y);\n var offset = i * 2;\n this.v[offset] = x;\n this.v[offset + 1] = y;\n this.in[offset] = x + ox * perimSegment * roundness * dir;\n this.in[offset + 1] = y + oy * perimSegment * roundness * dir;\n this.out[offset] = x - ox * perimSegment * roundness * dir;\n this.out[offset + 1] = y - oy * perimSegment * roundness * dir;\n longFlag = !longFlag;\n currentAng += angle * dir;\n }\n };\n _proto.buildPolygonPath = function buildPolygonPath() {\n this.v = [];\n this.in = [];\n this.out = [];\n var numPts = Math.floor(this.pointCount);\n var angle = Math.PI * 2 / numPts;\n var rad = this.outerRadius;\n var roundness = this.outerRoundness / 100;\n var perimSegment = 2 * Math.PI * rad / (numPts * 4);\n var i;\n var currentAng = -Math.PI * 0.5;\n var dir = 1;\n for(i = 0; i < numPts; i++){\n var x = rad * Math.cos(currentAng);\n var y = rad * Math.sin(currentAng);\n var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);\n var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y);\n var offset = i * 2;\n this.v[offset] = x;\n this.v[offset + 1] = y;\n this.in[offset] = x + ox * perimSegment * roundness * dir;\n this.in[offset + 1] = y + oy * perimSegment * roundness * dir;\n this.out[offset] = x - ox * perimSegment * roundness * dir;\n this.out[offset + 1] = y - oy * perimSegment * roundness * dir;\n currentAng += angle * dir;\n }\n };\n return PolyStar;\n}(ShapePrimitive);\n\n// Based on:\n/**\n * The `Rectangle` object is an area defined by its position, as indicated by its top-left corner\n * point (`x`, `y`) and by its `width` and its `height`, including a `roundness` property that\n * defines the roundness of the rounded corners.\n * @memberof maths\n */ var Rectangle = /*#__PURE__*/ function(ShapePrimitive) {\n _inherits(Rectangle, ShapePrimitive);\n function Rectangle(x, y, width, height, roundness) {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (width === void 0) width = 0;\n if (height === void 0) height = 0;\n if (roundness === void 0) roundness = 20;\n var _this;\n _this = ShapePrimitive.call(this) || this;\n _this.x = x;\n _this.y = y;\n _this.width = width;\n _this.height = height;\n _this.roundness = roundness;\n return _this;\n }\n var _proto = Rectangle.prototype;\n /**\n * Returns the framing rectangle of the rectangle as a Rectangle object\n * @param out - optional rectangle to store the result\n * @returns The framing rectangle\n */ _proto.getBounds = function getBounds(out) {\n out = out || new Rectangle();\n out.x = this.x;\n out.y = this.y;\n out.width = this.width;\n out.height = this.height;\n return out;\n };\n /**\n * Creates a clone of this rectangle.\n * @returns - A copy of the rectangle.\n */ _proto.clone = function clone() {\n return new Rectangle(this.x, this.y, this.width, this.height, this.roundness);\n };\n /**\n * Copies another rectangle to this one.\n * @param rectangle - The rectangle to copy from.\n * @returns Returns itself.\n */ _proto.copyFrom = function copyFrom(rectangle) {\n this.x = rectangle.x;\n this.y = rectangle.y;\n this.width = rectangle.width;\n this.height = rectangle.height;\n this.roundness = rectangle.roundness;\n return this;\n };\n /**\n * Copies this rectangle to another one.\n * @param rectangle - The rectangle to copy to.\n * @returns Returns given parameter.\n */ _proto.copyTo = function copyTo(rectangle) {\n rectangle.copyFrom(this);\n return rectangle;\n };\n _proto.build = function build(points) {\n var ry;\n var halfWidth = this.width / 2;\n var halfHeight = this.height / 2;\n var x = this.x + halfWidth;\n var y = this.y + halfHeight;\n var rx = ry = Math.max(0, Math.min(this.roundness / 100, 1) * Math.min(halfWidth, halfHeight));\n var dx = halfWidth - rx;\n var dy = halfHeight - ry;\n if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {\n return;\n }\n // 控制边缘的平滑程度\n var densityScale = 5;\n // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029\n var n = densityScale * Math.ceil(2.3 * Math.sqrt(rx + ry));\n var m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0);\n if (m === 0) {\n return;\n }\n if (n === 0) {\n points[0] = points[6] = x + dx;\n points[1] = points[3] = y + dy;\n points[2] = points[4] = x - dx;\n points[5] = points[7] = y - dy;\n return;\n }\n var j1 = 0;\n var j2 = n * 4 + (dx ? 2 : 0) + 2;\n var j3 = j2;\n var j4 = m;\n var x0 = dx + rx;\n var y0 = dy;\n var x1 = x + x0;\n var x2 = x - x0;\n var y1 = y + y0;\n points[j1++] = x1;\n points[j1++] = y1;\n points[--j2] = y1;\n points[--j2] = x2;\n if (dy) {\n var y2 = y - y0;\n points[j3++] = x2;\n points[j3++] = y2;\n points[--j4] = y2;\n points[--j4] = x1;\n }\n for(var i = 1; i < n; i++){\n var a = Math.PI / 2 * (i / n);\n var x01 = dx + Math.cos(a) * rx;\n var y01 = dy + Math.sin(a) * ry;\n var x11 = x + x01;\n var x21 = x - x01;\n var y11 = y + y01;\n var y21 = y - y01;\n points[j1++] = x11;\n points[j1++] = y11;\n points[--j2] = y11;\n points[--j2] = x21;\n points[j3++] = x21;\n points[j3++] = y21;\n points[--j4] = y21;\n points[--j4] = x11;\n }\n x0 = dx;\n y0 = dy + ry;\n x1 = x + x0;\n x2 = x - x0;\n y1 = y + y0;\n var y22 = y - y0;\n points[j1++] = x1;\n points[j1++] = y1;\n points[--j4] = y22;\n points[--j4] = x1;\n if (dx) {\n points[j1++] = x2;\n points[j1++] = y1;\n points[--j4] = y22;\n points[--j4] = x2;\n }\n };\n _proto.triangulate = function triangulate(points, vertices, verticesOffset, indices, indicesOffset) {\n if (points.length === 0) {\n return;\n }\n // Compute center (average of all points)\n var centerX = 0;\n var centerY = 0;\n for(var i = 0; i < points.length; i += 2){\n centerX += points[i];\n centerY += points[i + 1];\n }\n centerX /= points.length / 2;\n centerY /= points.length / 2;\n // Set center vertex\n var count = verticesOffset;\n vertices[count * 2] = centerX;\n vertices[count * 2 + 1] = centerY;\n var centerIndex = count++;\n // Set edge vertices and indices\n for(var i1 = 0; i1 < points.length; i1 += 2){\n vertices[count * 2] = points[i1];\n vertices[count * 2 + 1] = points[i1 + 1];\n if (i1 > 0) {\n indices[indicesOffset++] = count;\n indices[indicesOffset++] = centerIndex;\n indices[indicesOffset++] = count - 1;\n }\n count++;\n }\n // Connect last point to the first edge point\n indices[indicesOffset++] = centerIndex + 1;\n indices[indicesOffset++] = centerIndex;\n indices[indicesOffset++] = count - 1;\n };\n return Rectangle;\n}(ShapePrimitive);\n\n// Based on:\nvar ShapePath = /*#__PURE__*/ function() {\n function ShapePath(graphicsPath) {\n this.graphicsPath = graphicsPath;\n this.currentPoly = null;\n this.shapePrimitives = [];\n }\n var _proto = ShapePath.prototype;\n /** Builds the path. */ _proto.buildPath = function buildPath() {\n this.currentPoly = null;\n this.shapePrimitives.length = 0;\n var path = this.graphicsPath;\n for(var _iterator = _create_for_of_iterator_helper_loose(path.instructions), _step; !(_step = _iterator()).done;){\n var instruction = _step.value;\n var action = instruction.action;\n var data = instruction.data;\n switch(action){\n case \"bezierCurveTo\":\n {\n this.bezierCurveTo(data[0], data[1], data[2], data[3], data[4], data[5], data[6]);\n break;\n }\n case \"moveTo\":\n {\n this.moveTo(data[0], data[1]);\n break;\n }\n case \"ellipse\":\n {\n this.ellipse(data[0], data[1], data[2], data[3], data[4]);\n break;\n }\n case \"polyStar\":\n {\n this.polyStar(data[0], data[1], data[2], data[3], data[4], data[5], data[6]);\n break;\n }\n case \"rect\":\n {\n this.rect(data[0], data[1], data[2], data[3], data[4]);\n break;\n }\n case \"closePath\":\n {\n this.closePath();\n break;\n }\n }\n }\n this.endPoly();\n };\n /**\n * Adds a cubic Bezier curve to the path.\n * It requires three points: the first two are control points and the third one is the end point.\n * The starting point is the last point in the current path.\n * @param cp1x - The x-coordinate of the first control point.\n * @param cp1y - The y-coordinate of the first control point.\n * @param cp2x - The x-coordinate of the second control point.\n * @param cp2y - The y-coordinate of the second control point.\n * @param x - The x-coordinate of the end point.\n * @param y - The y-coordinate of the end point.\n * @param smoothness - Optional parameter to adjust the smoothness of the curve.\n * @returns The instance of the current object for chaining.\n */ _proto.bezierCurveTo = function bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, smoothness) {\n this.ensurePoly();\n var currentPoly = this.currentPoly;\n buildAdaptiveBezier(currentPoly.points, currentPoly.lastX, currentPoly.lastY, cp1x, cp1y, cp2x, cp2y, x, y, smoothness);\n return this;\n };\n _proto.moveTo = function moveTo(x, y) {\n this.startPoly(x, y);\n return this;\n };\n /**\n * Closes the current path by drawing a straight line back to the start.\n * If the shape is already closed or there are no points in the path, this method does nothing.\n * @returns The instance of the current object for chaining.\n */ _proto.closePath = function closePath() {\n this.endPoly(true);\n return this;\n };\n /**\n * Draws an ellipse at the specified location and with the given x and y radii.\n * An optional transformation can be applied, allowing for rotation, scaling, and translation.\n * @param x - The x-coordinate of the center of the ellipse.\n * @param y - The y-coordinate of the center of the ellipse.\n * @param radiusX - The horizontal radius of the ellipse.\n * @param radiusY - The vertical radius of the ellipse.\n * @param transform - An optional `Matrix` object to apply a transformation to the ellipse. This can include rotations.\n * @returns The instance of the current object for chaining.\n */ _proto.ellipse = function ellipse(x, y, radiusX, radiusY, transform) {\n // TODO apply rotation to transform...\n this.drawShape(new Ellipse(x, y, radiusX, radiusY), transform);\n return this;\n };\n _proto.polyStar = function polyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType, transform) {\n this.drawShape(new PolyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType), transform);\n return this;\n };\n /**\n * Draws a rectangle shape. This method adds a new rectangle path to the current drawing.\n * @param x - The x-coordinate of the upper-left corner of the rectangle.\n * @param y - The y-coordinate of the upper-left corner of the rectangle.\n * @param w - The width of the rectangle.\n * @param h - The height of the rectangle.\n * @param transform - An optional `Matrix` object to apply a transformation to the rectangle.\n * @returns The instance of the current object for chaining.\n */ _proto.rect = function rect(x, y, w, h, roundness, transform) {\n this.drawShape(new Rectangle(x, y, w, h, roundness), transform);\n return this;\n };\n /**\n * Draws a given shape on the canvas.\n * This is a generic method that can draw any type of shape specified by the `ShapePrimitive` parameter.\n * An optional transformation matrix can be applied to the shape, allowing for complex transformations.\n * @param shape - The shape to draw, defined as a `ShapePrimitive` object.\n * @param matrix - An optional `Matrix` for transforming the shape. This can include rotations,\n * scaling, and translations.\n * @returns The instance of the current object for chaining.\n */ _proto.drawShape = function drawShape(shape, matrix) {\n this.endPoly();\n this.shapePrimitives.push({\n shape: shape,\n transform: matrix\n });\n return this;\n };\n /**\n * Starts a new polygon path from the specified starting point.\n * This method initializes a new polygon or ends the current one if it exists.\n * @param x - The x-coordinate of the starting point of the new polygon.\n * @param y - The y-coordinate of the starting point of the new polygon.\n * @returns The instance of the current object for chaining.\n */ _proto.startPoly = function startPoly(x, y) {\n var currentPoly = this.currentPoly;\n if (currentPoly) {\n this.endPoly();\n }\n currentPoly = new Polygon();\n currentPoly.points.push(x, y);\n this.currentPoly = currentPoly;\n return this;\n };\n /**\n * Ends the current polygon path. If `closePath` is set to true,\n * the path is closed by connecting the last point to the first one.\n * This method finalizes the current polygon and prepares it for drawing or adding to the shape primitives.\n * @param closePath - A boolean indicating whether to close the polygon by connecting the last point\n * back to the starting point. False by default.\n * @returns The instance of the current object for chaining.\n */ _proto.endPoly = function endPoly(closePath) {\n if (closePath === void 0) closePath = false;\n var shape = this.currentPoly;\n if (shape && shape.points.length > 2) {\n shape.closePath = closePath;\n this.shapePrimitives.push({\n shape: shape\n });\n }\n this.currentPoly = null;\n return this;\n };\n _proto.ensurePoly = function ensurePoly(start) {\n if (this.currentPoly) {\n return;\n }\n this.currentPoly = new Polygon();\n this.currentPoly.points.push(0, 0);\n };\n return ShapePath;\n}();\n\n// Based on:\nvar GraphicsPath = /*#__PURE__*/ function() {\n function GraphicsPath() {\n this.instructions = [];\n this.dirty = false;\n }\n var _proto = GraphicsPath.prototype;\n /**\n * Adds a cubic Bezier curve to the path.\n * It requires three points: the first two are control points and the third one is the end point.\n * The starting point is the last point in the current path.\n * @param cp1x - The x-coordinate of the first control point.\n * @param cp1y - The y-coordinate of the first control point.\n * @param cp2x - The x-coordinate of the second control point.\n * @param cp2y - The y-coordinate of the second control point.\n * @param x - The x-coordinate of the end point.\n * @param y - The y-coordinate of the end point.\n * @param smoothness - Optional parameter to adjust the smoothness of the curve.\n * @returns The instance of the current object for chaining.\n */ _proto.bezierCurveTo = function bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, smoothness) {\n this.instructions.push({\n action: \"bezierCurveTo\",\n data: [\n cp1x,\n cp1y,\n cp2x,\n cp2y,\n x,\n y,\n smoothness\n ]\n });\n this.dirty = true;\n return this;\n };\n /**\n * Sets the starting point for a new sub-path. Any subsequent drawing commands are considered part of this path.\n * @param x - The x-coordinate for the starting point.\n * @param y - The y-coordinate for the starting point.\n * @returns The instance of the current object for chaining.\n */ _proto.moveTo = function moveTo(x, y) {\n this.instructions.push({\n action: \"moveTo\",\n data: [\n x,\n y\n ]\n });\n this.dirty = true;\n return this;\n };\n /**\n * Closes the current path by drawing a straight line back to the start.\n * If the shape is already closed or there are no points in the path, this method does nothing.\n * @returns The instance of the current object for chaining.\n */ _proto.closePath = function closePath() {\n this.instructions.push({\n action: \"closePath\",\n data: []\n });\n this.dirty = true;\n return this;\n };\n /**\n * Draws an ellipse at the specified location and with the given x and y radii.\n * An optional transformation can be applied, allowing for rotation, scaling, and translation.\n * @param x - The x-coordinate of the center of the ellipse.\n * @param y - The y-coordinate of the center of the ellipse.\n * @param radiusX - The horizontal radius of the ellipse.\n * @param radiusY - The vertical radius of the ellipse.\n * @param transform - An optional `Matrix` object to apply a transformation to the ellipse. This can include rotations.\n * @returns The instance of the current object for chaining.\n */ _proto.ellipse = function ellipse(x, y, radiusX, radiusY, transform) {\n this.instructions.push({\n action: \"ellipse\",\n data: [\n x,\n y,\n radiusX,\n radiusY,\n transform\n ]\n });\n this.dirty = true;\n return this;\n };\n /**\n * Draws a rectangle shape. This method adds a new rectangle path to the current drawing.\n * @param x - The x-coordinate of the upper-left corner of the rectangle.\n * @param y - The y-coordinate of the upper-left corner of the rectangle.\n * @param w - The width of the rectangle.\n * @param h - The height of the rectangle.\n * @param transform - An optional `Matrix` object to apply a transformation to the rectangle.\n * @returns The instance of the current object for chaining.\n */ _proto.rect = function rect(x, y, w, h, roundness, transform) {\n this.instructions.push({\n action: \"rect\",\n data: [\n x,\n y,\n w,\n h,\n roundness,\n transform\n ]\n });\n this.dirty = true;\n return this;\n };\n _proto.polyStar = function polyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType, transform) {\n this.instructions.push({\n action: \"polyStar\",\n data: [\n pointCount,\n outerRadius,\n innerRadius,\n outerRoundness,\n innerRoundness,\n starType,\n transform\n ]\n });\n this.dirty = true;\n return this;\n };\n _proto.clear = function clear() {\n this.instructions.length = 0;\n this.dirty = true;\n return this;\n };\n _create_class(GraphicsPath, [\n {\n key: \"shapePath\",\n get: /**\n * Provides access to the internal shape path, ensuring it is up-to-date with the current instructions.\n * @returns The `ShapePath` instance associated with this `GraphicsPath`.\n */ function get() {\n if (!this._shapePath) {\n this._shapePath = new ShapePath(this);\n }\n if (this.dirty) {\n this.dirty = false;\n this._shapePath.buildPath();\n }\n return this._shapePath;\n }\n }\n ]);\n return GraphicsPath;\n}();\n\nfunction _possible_constructor_return(self, call) {\n if (call && (_type_of(call) === \"object\" || typeof call === \"function\")) return call;\n return _assert_this_initialized(self);\n}\n\nvar CanvasPool = /*#__PURE__*/ function() {\n function CanvasPool() {\n this.elements = [];\n }\n var _proto = CanvasPool.prototype;\n _proto.dispose = function dispose() {\n this.elements.forEach(function(e) {\n return e.remove();\n });\n // clearing the array\n this.elements.length = 0;\n };\n _proto.getCanvas = function getCanvas() {\n if (this.elements.length !== 0) {\n var canvas = this.elements.shift();\n assertExist(canvas);\n return canvas;\n }\n if (getConfig(TEMPLATE_USE_OFFSCREEN_CANVAS)) {\n return window._createOffscreenCanvas(10, 10);\n } else {\n // in hongmeng system, create too many canvas will case render error\n var defCanvas = document.createElement(\"canvas\");\n defCanvas.getContext(\"2d\", {\n willReadFrequently: true\n });\n return defCanvas;\n }\n };\n _proto.saveCanvas = function saveCanvas(canvas) {\n canvas.width = 1;\n canvas.height = 1;\n if (this.elements.length < 3) {\n addItem(this.elements, canvas);\n } else {\n canvas.remove();\n }\n };\n return CanvasPool;\n}();\nvar canvasPool = new CanvasPool();\n\nvar TextLayout = /*#__PURE__*/ function() {\n function TextLayout(options) {\n this.width = 0;\n this.height = 0;\n var _options_textHeight = options.textHeight, textHeight = _options_textHeight === void 0 ? 100 : _options_textHeight, _options_textWidth = options.textWidth, textWidth = _options_textWidth === void 0 ? 100 : _options_textWidth, _options_textOverflow = options.textOverflow, textOverflow = _options_textOverflow === void 0 ? TextOverflow.clip : _options_textOverflow, _options_textBaseline = options.textBaseline, textBaseline = _options_textBaseline === void 0 ? TextBaseline.top : _options_textBaseline, _options_textAlign = options.textAlign, textAlign = _options_textAlign === void 0 ? TextAlignment.left : _options_textAlign, _options_text = options.text, text = _options_text === void 0 ? \" \" : _options_text, _options_letterSpace = options.letterSpace, letterSpace = _options_letterSpace === void 0 ? 0 : _options_letterSpace, _options_autoWidth = options.autoWidth, autoWidth = _options_autoWidth === void 0 ? false : _options_autoWidth, fontSize = options.fontSize, _options_lineHeight = options.lineHeight, lineHeight = _options_lineHeight === void 0 ? fontSize : _options_lineHeight;\n var tempWidth = fontSize + letterSpace;\n this.autoWidth = autoWidth;\n this.maxTextWidth = text.length * tempWidth;\n this.width = textWidth;\n this.height = textHeight;\n this.letterSpace = letterSpace;\n this.overflow = textOverflow;\n this.textBaseline = textBaseline;\n this.textAlign = textAlign;\n this.lineHeight = lineHeight;\n }\n var _proto = TextLayout.prototype;\n /**\n * 获取初始的行高偏移值\n * @param style - 字体基础数据\n * @param lineCount - 渲染行数\n * @param lineHeight - 渲染时的字体行高\n * @param fontSize - 渲染时的字体大小\n * @returns - 行高偏移值\n */ _proto.getOffsetY = function getOffsetY(style, lineCount, lineHeight, fontSize) {\n var outlineWidth = style.outlineWidth, fontScale = style.fontScale;\n // /3 计算Y轴偏移量,以匹配编辑器行为\n var offsetY = (lineHeight - fontSize) / 3;\n // 计算基础偏移量\n var baseOffset = fontSize + outlineWidth * fontScale;\n var commonCalculation = lineHeight * (lineCount - 1);\n var offsetResult = 0;\n switch(this.textBaseline){\n case TextBaseline.top:\n offsetResult = baseOffset + offsetY;\n break;\n case TextBaseline.middle:\n offsetResult = (this.height * fontScale - commonCalculation + baseOffset) / 2;\n break;\n case TextBaseline.bottom:\n offsetResult = this.height * fontScale - commonCalculation - offsetY;\n break;\n }\n return offsetResult;\n };\n _proto.getOffsetX = function getOffsetX(style, maxWidth) {\n var offsetX = 0;\n switch(this.textAlign){\n case TextAlignment.left:\n offsetX = style.outlineWidth * style.fontScale;\n break;\n case TextAlignment.middle:\n offsetX = (this.width * style.fontScale - maxWidth) / 2;\n break;\n case TextAlignment.right:\n offsetX = this.width * style.fontScale - maxWidth;\n break;\n }\n return offsetX;\n };\n /**\n * 设置文本框的宽度和高度\n * @param width 文本框宽度\n * @param height 文本框高度\n */ _proto.setSize = function setSize(width, height) {\n this.width = width;\n this.height = height;\n };\n return TextLayout;\n}();\n\nvar TextStyle = function TextStyle(options) {\n /**\n * 是否有下划线(暂时无效)\n */ this.isUnderline = false // ttf\n ;\n /**\n * 下划线高度(暂时无效)\n */ this.underlineHeight = 1 // ttf\n ;\n /**\n * 是否有外描边\n */ this.isOutlined = false // both // ttf & char\n ;\n /**\n * 外描边宽度\n */ this.outlineWidth = 0 // both // ttf & char\n ;\n /**\n * 是否有阴影\n */ this.hasShadow = false // ttf\n ;\n this.fontDesc = \"\" // both\n ;\n /**\n * 字体倍数\n */ this.fontScale = 2;\n this.fontOffset = 0;\n var _options_textColor = options.textColor, textColor = _options_textColor === void 0 ? [\n 1,\n 1,\n 1,\n 1\n ] : _options_textColor, _options_fontSize = options.fontSize, fontSize = _options_fontSize === void 0 ? 40 : _options_fontSize, outline = options.outline, shadow = options.shadow, _options_fontWeight = options.fontWeight, fontWeight = _options_fontWeight === void 0 ? \"normal\" : _options_fontWeight, _options_fontStyle = options.fontStyle, fontStyle = _options_fontStyle === void 0 ? \"normal\" : _options_fontStyle, _options_fontFamily = options.fontFamily, fontFamily = _options_fontFamily === void 0 ? \"sans-serif\" : _options_fontFamily;\n this.textColor = textColor;\n //@ts-expect-error\n this.textWeight = fontWeight;\n //@ts-expect-error\n this.fontStyle = fontStyle;\n this.fontFamily = fontFamily;\n this.fontSize = fontSize; // 暂时取消字号限制 Math.min(fontSize, this.maxFontSize);\n if (outline) {\n this.isOutlined = true;\n var _outline_outlineColor;\n this.outlineColor = (_outline_outlineColor = outline.outlineColor) != null ? _outline_outlineColor : [\n 1,\n 1,\n 1,\n 1\n ];\n var _outline_outlineWidth;\n this.outlineWidth = (_outline_outlineWidth = outline.outlineWidth) != null ? _outline_outlineWidth : 1;\n this.fontOffset += this.outlineWidth;\n }\n if (shadow) {\n this.hasShadow = true;\n var _shadow_shadowBlur;\n this.shadowBlur = (_shadow_shadowBlur = shadow.shadowBlur) != null ? _shadow_shadowBlur : 2;\n var _shadow_shadowColor;\n this.shadowColor = (_shadow_shadowColor = shadow.shadowColor) != null ? _shadow_shadowColor : [\n 0,\n 0,\n 0,\n 1\n ];\n var _shadow_shadowOffsetX;\n this.shadowOffsetX = (_shadow_shadowOffsetX = shadow.shadowOffsetX) != null ? _shadow_shadowOffsetX : 0;\n var _shadow_shadowOffsetY;\n this.shadowOffsetY = (_shadow_shadowOffsetY = shadow.shadowOffsetY) != null ? _shadow_shadowOffsetY : 0;\n }\n if (this.fontStyle !== FontStyle.normal) {\n // 0.0174532925 = 3.141592653 / 180\n this.fontOffset += this.fontSize * Math.tan(12 * 0.0174532925);\n }\n};\n\nvar DEFAULT_FONTS = [\n \"serif\",\n \"sans-serif\",\n \"monospace\",\n \"courier\"\n];\nvar seed$5 = 0;\nexports.TextComponent = /*#__PURE__*/ function(BaseRenderComponent) {\n _inherits(TextComponent, BaseRenderComponent);\n function TextComponent(engine, props) {\n var _this;\n _this = BaseRenderComponent.call(this, engine) || this;\n _this.isDirty = true;\n /**\n * 文本行数\n */ _this.lineCount = 0;\n /**\n * 每一行文本的最大宽度\n */ _this.maxLineWidth = 0;\n _this.SCALE_FACTOR = 0.1;\n _this.ALPHA_FIX_VALUE = 1 / 255;\n _this.name = \"MText\" + seed$5++;\n _this.geometry = _this.createGeometry();\n if (props) {\n _this.fromData(props);\n }\n _this.canvas = canvasPool.getCanvas();\n canvasPool.saveCanvas(_this.canvas);\n _this.context = _this.canvas.getContext(\"2d\", {\n willReadFrequently: true\n });\n if (!props) {\n return _possible_constructor_return(_this);\n }\n var options = props.options;\n _this.updateWithOptions(options);\n _this.updateTexture();\n return _this;\n }\n var _proto = TextComponent.prototype;\n _proto.onUpdate = function onUpdate(dt) {\n BaseRenderComponent.prototype.onUpdate.call(this, dt);\n this.updateTexture();\n };\n _proto.fromData = function fromData(data) {\n BaseRenderComponent.prototype.fromData.call(this, data);\n var interaction = data.interaction, options = data.options;\n this.interaction = interaction;\n // TextComponentBase\n this.updateWithOptions(options);\n this.renderText(options);\n // 恢复默认颜色\n this.material.setColor(\"_Color\", new Color(1, 1, 1, 1));\n };\n _proto.updateWithOptions = function updateWithOptions(options) {\n // OVERRIDE by mixins\n };\n _proto.updateTexture = function updateTexture(flipY) {\n // OVERRIDE by mixins\n };\n return TextComponent;\n}(BaseRenderComponent);\nexports.TextComponent = __decorate([\n effectsClass(DataType.TextComponent)\n], exports.TextComponent);\nvar TextComponentBase = /*#__PURE__*/ function() {\n function TextComponentBase() {}\n var _proto = TextComponentBase.prototype;\n _proto.renderText = function renderText(options) {\n this.updateTexture();\n };\n _proto.updateWithOptions = function updateWithOptions(options) {\n this.textStyle = new TextStyle(options);\n this.textLayout = new TextLayout(options);\n this.text = options.text.toString();\n this.lineCount = this.getLineCount(options.text, true);\n };\n _proto.getLineCount = function getLineCount(text, init) {\n var context = this.context;\n var _this_textLayout = this.textLayout, letterSpace = _this_textLayout.letterSpace, overflow = _this_textLayout.overflow;\n var fontScale = init ? this.textStyle.fontSize / 10 : 1 / this.textStyle.fontScale;\n var width = this.textLayout.width + this.textStyle.fontOffset;\n var lineCount = 1;\n var x = 0;\n for(var i = 0; i < text.length; i++){\n var _context_measureText;\n var str = text[i];\n var _context_measureText_width;\n var textMetrics = ((_context_measureText_width = context == null ? void 0 : (_context_measureText = context.measureText(str)) == null ? void 0 : _context_measureText.width) != null ? _context_measureText_width : 0) * fontScale;\n // 和浏览器行为保持一致\n x += letterSpace;\n // 处理文本结束行为\n if (overflow === TextOverflow.display) {\n if (str === \"\\n\") {\n lineCount++;\n x = 0;\n } else {\n x += textMetrics;\n this.maxLineWidth = Math.max(this.maxLineWidth, x);\n }\n } else {\n if (x + textMetrics > width && i > 0 || str === \"\\n\") {\n lineCount++;\n this.maxLineWidth = Math.max(this.maxLineWidth, x);\n x = 0;\n }\n if (str !== \"\\n\") {\n x += textMetrics;\n }\n }\n }\n return lineCount;\n };\n /**\n * 设置字号大小\n * @param value - 字号\n * @returns\n */ _proto.setFontSize = function setFontSize(value) {\n if (this.textStyle.fontSize === value) {\n return;\n }\n // 保证字号变化后位置正常\n var diff = this.textStyle.fontSize - value;\n this.textLayout.lineHeight += diff;\n this.textStyle.fontSize = value;\n this.isDirty = true;\n };\n /**\n * 设置字重\n * @param value - 字重类型\n * @returns\n */ _proto.setFontWeight = function setFontWeight(value) {\n if (this.textStyle.textWeight === value) {\n return;\n }\n this.textStyle.textWeight = value;\n this.isDirty = true;\n };\n /**\n * 设置字体类型\n * @param value 字体类型\n * @returns\n */ _proto.setFontStyle = function setFontStyle(value) {\n if (this.textStyle.fontStyle === value) {\n return;\n }\n this.textStyle.fontStyle = value;\n this.isDirty = true;\n };\n /**\n * 设置文本\n * @param value - 文本内容\n * @returns\n */ _proto.setText = function setText(value) {\n if (this.text === value) {\n return;\n }\n this.text = value.toString();\n this.lineCount = this.getLineCount(value, false);\n this.isDirty = true;\n };\n /**\n * 设置文本水平布局\n * @param value - 布局选项\n * @returns\n */ _proto.setTextAlign = function setTextAlign(value) {\n if (this.textLayout.textAlign === value) {\n return;\n }\n this.textLayout.textAlign = value;\n this.isDirty = true;\n };\n /**\n * 设置文本垂直布局\n * @param value - 布局选项\n * @returns\n */ _proto.setTextBaseline = function setTextBaseline(value) {\n if (this.textLayout.textBaseline === value) {\n return;\n }\n this.textLayout.textBaseline = value;\n this.isDirty = true;\n };\n /**\n * 设置文本颜色\n * @param value - 颜色内容\n * @returns\n */ _proto.setTextColor = function setTextColor(value) {\n if (this.textStyle.textColor === value) {\n return;\n }\n this.textStyle.textColor = value;\n this.isDirty = true;\n };\n /**\n * 设置文本字体\n * @param value - 文本字体\n * @returns\n */ _proto.setFontFamily = function setFontFamily(value) {\n if (this.textStyle.fontFamily === value && !isValidFontFamily(value)) {\n console.warn(\"The font is either the current font or an risky font family.\");\n return;\n }\n this.textStyle.fontFamily = value;\n this.isDirty = true;\n };\n /**\n * 设置外描边文本颜色\n * @param value - 颜色内容\n * @returns\n */ _proto.setOutlineColor = function setOutlineColor(value) {\n if (this.textStyle.outlineColor === value) {\n return;\n }\n this.textStyle.outlineColor = value;\n this.isDirty = true;\n };\n /**\n * 设置外描边文本宽度\n * @param value - 外描边宽度\n * @returns\n */ _proto.setOutlineWidth = function setOutlineWidth(value) {\n if (this.textStyle.outlineWidth === value) {\n return;\n }\n this.textStyle.outlineWidth = value;\n this.isDirty = true;\n };\n /**\n * 设置阴影模糊\n * @param value - 阴影模糊强度\n * @returns\n */ _proto.setShadowBlur = function setShadowBlur(value) {\n if (this.textStyle.shadowBlur === value) {\n return;\n }\n this.textStyle.shadowBlur = value;\n this.isDirty = true;\n };\n /**\n * 设置文本溢出模式\n *\n * - clip: 当文本内容超出边界框时,多余的会被截断。\n * - display: 该模式下会显示所有文本,会自动调整文本字号以保证显示完整。\n * > 当存在多行时,部分行内文本可能存在文本字号变小的情况,其他行为正常情况\n *\n * @param overflow - 文本溢出模式\n */ _proto.setOverflow = function setOverflow(overflow) {\n this.textLayout.overflow = overflow;\n this.isDirty = true;\n };\n /**\n * 设置阴影颜色\n * @param value - 阴影颜色\n * @returns\n */ _proto.setShadowColor = function setShadowColor(value) {\n if (this.textStyle.shadowColor === value) {\n return;\n }\n this.textStyle.shadowColor = value;\n this.isDirty = true;\n };\n /**\n * 设置阴影水平偏移距离\n * @param value - 水平偏移距离\n * @returns\n */ _proto.setShadowOffsetX = function setShadowOffsetX(value) {\n if (this.textStyle.shadowOffsetX === value) {\n return;\n }\n this.textStyle.shadowOffsetX = value;\n this.isDirty = true;\n };\n /**\n * 设置阴影水平偏移距离\n * @param value - 水平偏移距离\n * @returns\n */ _proto.setShadowOffsetY = function setShadowOffsetY(value) {\n if (this.textStyle.shadowOffsetY === value) {\n return;\n }\n this.textStyle.shadowOffsetY = value;\n this.isDirty = true;\n };\n /**\n * 设置字体清晰度\n * @param value - 字体清晰度\n * @returns\n */ _proto.setFontScale = function setFontScale(value) {\n if (this.textStyle.fontScale === value) {\n return;\n }\n this.textStyle.fontScale = value;\n this.isDirty = true;\n };\n /**\n * 设置自适应宽高开关\n * @param value - 是否自适应宽高开关\n * @returns\n */ _proto.setAutoWidth = function setAutoWidth(value) {\n if (this.textLayout.autoWidth === value) {\n return;\n }\n this.textLayout.autoWidth = value;\n this.isDirty = true;\n };\n /**\n * 更新文本\n * @returns\n */ _proto.updateTexture = function updateTexture(flipY) {\n if (flipY === void 0) flipY = true;\n if (!this.isDirty || !this.context || !this.canvas) {\n return;\n }\n var context = this.context;\n var style = this.textStyle;\n var layout = this.textLayout;\n var fontScale = style.fontScale;\n var width = (layout.width + style.fontOffset) * fontScale;\n var finalHeight = layout.lineHeight * this.lineCount;\n var fontSize = style.fontSize * fontScale;\n var lineHeight = layout.lineHeight * fontScale;\n style.fontDesc = this.getFontDesc(fontSize);\n this.char = (this.text || \"\").split(\"\");\n this.canvas.width = width;\n if (layout.autoWidth) {\n this.canvas.height = finalHeight * fontScale;\n this.item.transform.size.set(1, finalHeight / layout.height);\n } else {\n this.canvas.height = layout.height * fontScale;\n }\n var height = this.canvas.height;\n // fix bug 1/255\n context.fillStyle = \"rgba(255, 255, 255, 0.0039)\";\n if (!flipY) {\n context.translate(0, height);\n context.scale(1, -1);\n }\n // canvas size 变化后重新刷新 context\n if (this.maxLineWidth > width && layout.overflow === TextOverflow.display) {\n context.font = this.getFontDesc(fontSize * width / this.maxLineWidth);\n } else {\n context.font = style.fontDesc;\n }\n context.clearRect(0, 0, width, height);\n if (style.hasShadow) {\n this.setupShadow();\n }\n if (style.isOutlined) {\n this.setupOutline();\n }\n // 文本颜色\n context.fillStyle = \"rgba(\" + style.textColor[0] + \", \" + style.textColor[1] + \", \" + style.textColor[2] + \", \" + style.textColor[3] + \")\";\n var charsInfo = [];\n var x = 0;\n var y = layout.getOffsetY(style, this.lineCount, lineHeight, fontSize);\n var charsArray = [];\n var charOffsetX = [];\n for(var i = 0; i < this.char.length; i++){\n var str = this.char[i];\n var textMetrics = context.measureText(str);\n // 和浏览器行为保持一致\n x += layout.letterSpace * fontScale;\n if (x + textMetrics.width > width && i > 0 || str === \"\\n\") {\n charsInfo.push({\n y: y,\n width: x,\n chars: charsArray,\n charOffsetX: charOffsetX\n });\n x = 0;\n y += lineHeight;\n charsArray = [];\n charOffsetX = [];\n }\n if (str !== \"\\n\") {\n charsArray.push(str);\n charOffsetX.push(x);\n x += textMetrics.width;\n }\n }\n charsInfo.push({\n y: y,\n width: x,\n chars: charsArray,\n charOffsetX: charOffsetX\n });\n charsInfo.forEach(function(charInfo) {\n var x = layout.getOffsetX(style, charInfo.width);\n charInfo.chars.forEach(function(str, i) {\n if (style.isOutlined) {\n context.strokeText(str, x + charInfo.charOffsetX[i], charInfo.y);\n }\n context.fillText(str, x + charInfo.charOffsetX[i], charInfo.y);\n });\n });\n if (style.hasShadow) {\n context.shadowColor = \"transparent\";\n }\n //与 toDataURL() 两种方式都需要像素读取操作\n var imageData = context.getImageData(0, 0, this.canvas.width, this.canvas.height);\n var texture = Texture.createWithData(this.engine, {\n data: new Uint8Array(imageData.data),\n width: imageData.width,\n height: imageData.height\n }, {\n flipY: flipY,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE\n });\n this.renderer.texture = texture;\n this.material.setTexture(\"_MainTex\", texture);\n this.isDirty = false;\n };\n _proto.getFontDesc = function getFontDesc(size) {\n var _this_textStyle = this.textStyle, fontSize = _this_textStyle.fontSize, fontScale = _this_textStyle.fontScale, fontFamily = _this_textStyle.fontFamily, textWeight = _this_textStyle.textWeight, fontStyle = _this_textStyle.fontStyle;\n var fontDesc = \"\" + (size || fontSize * fontScale).toString() + \"px \";\n if (!DEFAULT_FONTS.includes(fontFamily)) {\n fontDesc += '\"' + fontFamily + '\"';\n } else {\n fontDesc += fontFamily;\n }\n if (textWeight !== TextWeight.normal) {\n fontDesc = textWeight + \" \" + fontDesc;\n }\n if (fontStyle !== FontStyle.normal) {\n fontDesc = fontStyle + \" \" + fontDesc;\n }\n return fontDesc;\n };\n _proto.setupOutline = function setupOutline() {\n var context = this.context;\n var _this_textStyle = this.textStyle, outlineColor = _this_textStyle.outlineColor, outlineWidth = _this_textStyle.outlineWidth;\n var r = outlineColor[0], g = outlineColor[1], b = outlineColor[2], a = outlineColor[3];\n if (context) {\n context.strokeStyle = \"rgba(\" + r * 255 + \", \" + g * 255 + \", \" + b * 255 + \", \" + a + \")\";\n context.lineWidth = outlineWidth * 2;\n }\n };\n _proto.setupShadow = function setupShadow() {\n var context = this.context;\n var _this_textStyle = this.textStyle, outlineColor = _this_textStyle.outlineColor, shadowBlur = _this_textStyle.shadowBlur, shadowOffsetX = _this_textStyle.shadowOffsetX, shadowOffsetY = _this_textStyle.shadowOffsetY;\n var r = outlineColor[0], g = outlineColor[1], b = outlineColor[2], a = outlineColor[3];\n if (context) {\n context.shadowColor = \"rgba(\" + r * 255 + \", \" + g * 255 + \", \" + b * 255 + \", \" + a + \")\";\n context.shadowBlur = shadowBlur;\n context.shadowOffsetX = shadowOffsetX;\n context.shadowOffsetY = -shadowOffsetY;\n }\n };\n return TextComponentBase;\n}();\napplyMixins(exports.TextComponent, [\n TextComponentBase\n]);\n\n// TODO: 注册必须用\nvar TextLoader = /*#__PURE__*/ function(AbstractPlugin) {\n _inherits(TextLoader, AbstractPlugin);\n function TextLoader() {\n return AbstractPlugin.apply(this, arguments);\n }\n return TextLoader;\n}(AbstractPlugin);\n\nvar Asset = /*#__PURE__*/ function(EffectsObject) {\n _inherits(Asset, EffectsObject);\n function Asset() {\n return EffectsObject.apply(this, arguments);\n }\n return Asset;\n}(EffectsObject);\n\nexports.BinaryAsset = /*#__PURE__*/ function(EffectsObject) {\n _inherits(BinaryAsset, EffectsObject);\n function BinaryAsset() {\n return EffectsObject.apply(this, arguments);\n }\n return BinaryAsset;\n}(EffectsObject);\n__decorate([\n serialize()\n], exports.BinaryAsset.prototype, \"buffer\", void 0);\nexports.BinaryAsset = __decorate([\n effectsClass(DataType.BinaryAsset)\n], exports.BinaryAsset);\n\nvar SerializationHelper = /*#__PURE__*/ function() {\n function SerializationHelper() {}\n SerializationHelper.serialize = function serialize(effectsObject, serializedData) {\n effectsObject.toData();\n if (!serializedData) {\n serializedData = {};\n }\n var serializedProperties = getMergedStore(effectsObject);\n if (serializedProperties) {\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(serializedProperties)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n var value = effectsObject[key];\n if (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\" || SerializationHelper.checkTypedArray(value)) {\n // TODO json 数据避免传 typedArray\n serializedData[key] = value;\n } else if (isArray(value)) {\n if (!serializedData[key]) {\n serializedData[key] = [];\n }\n SerializationHelper.serializeArrayProperty(value, serializedData[key], 0);\n } else if (EffectsObject.is(value)) {\n // TODO 处理 EffectsObject 递归序列化\n serializedData[key] = {\n id: value.getInstanceId()\n };\n } else if (isObject(value)) {\n if (!serializedData[key]) {\n serializedData[key] = {};\n }\n SerializationHelper.serializeObjectProperty(value, serializedData[key], 0);\n }\n }\n }\n // TODO 待移除 tagggedProperties 为没有装饰器的临时方案\n for(var _iterator1 = _create_for_of_iterator_helper_loose(Object.keys(effectsObject.defination)), _step1; !(_step1 = _iterator1()).done;){\n var key1 = _step1.value;\n var value1 = effectsObject.defination[key1];\n if (typeof value1 === \"number\" || typeof value1 === \"string\" || typeof value1 === \"boolean\" || SerializationHelper.checkTypedArray(value1)) {\n // TODO json 数据避免传 typedArray\n serializedData[key1] = value1;\n } else if (isArray(value1)) {\n if (!serializedData[key1]) {\n serializedData[key1] = [];\n }\n SerializationHelper.serializeArrayProperty(value1, serializedData[key1], 0);\n } else if (EffectsObject.is(value1)) {\n // TODO 处理 EffectsObject 递归序列化\n serializedData[key1] = {\n id: value1.getInstanceId()\n };\n } else if (isObject(value1)) {\n if (!serializedData[key1]) {\n serializedData[key1] = {};\n }\n SerializationHelper.serializeObjectProperty(value1, serializedData[key1], 0);\n }\n }\n return serializedData;\n };\n SerializationHelper.deserialize = function deserialize(serializedData, effectsObject) {\n effectsObject.defination = serializedData;\n var serializedProperties = getMergedStore(effectsObject);\n var engine = effectsObject.engine;\n if (serializedProperties) {\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(serializedProperties)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n var value = serializedData[key];\n if (value === undefined) {\n continue;\n }\n var propertyType = serializedProperties[key].type;\n // FIXME: taggedProperties 为 readonly,这里存在强制赋值\n effectsObject[key] = SerializationHelper.deserializeProperty(value, engine, 0, propertyType);\n }\n }\n effectsObject.fromData(effectsObject.defination);\n };\n SerializationHelper.checkTypedArray = function checkTypedArray(obj) {\n return _instanceof1(obj, Int8Array) || _instanceof1(obj, Uint8Array) || _instanceof1(obj, Uint8ClampedArray) || _instanceof1(obj, Int16Array) || _instanceof1(obj, Uint16Array) || _instanceof1(obj, Int32Array) || _instanceof1(obj, Uint32Array) || _instanceof1(obj, Float32Array) || _instanceof1(obj, Float64Array) || _instanceof1(obj, ArrayBuffer);\n };\n // check value is { id: 7e69662e964e4892ae8933f24562395b }\n SerializationHelper.checkDataPath = function checkDataPath(value) {\n return !!(isObject(value) && Object.keys(value).length === 1 && \"id\" in value && isString(value.id) && value.id.length === 32);\n };\n // TODO 测试函数,2.0 上线后移除\n SerializationHelper.checkGLTFNode = function checkGLTFNode(value) {\n return isObject(value) && value.nodeIndex !== undefined && value.isJoint !== undefined;\n };\n SerializationHelper.checkImageSource = function checkImageSource(value) {\n return isCanvas(value) || _instanceof1(value, HTMLImageElement);\n };\n SerializationHelper.deserializeProperty = function deserializeProperty(property, engine, level, type, overrideDataPath) {\n if (overrideDataPath === void 0) overrideDataPath = true;\n if (level > 14) {\n console.error(\"The nested object layers of the serialized data exceed the maximum limit.\");\n return;\n }\n // 加载并链接 DataPath 字段表示的 EffectsObject 引用。Class 对象 copy [key, value] 会丢失对象信息,因此只递归数组对象和普通 js Object 结构对象。\n if (isArray(property)) {\n var res = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(property), _step; !(_step = _iterator()).done;){\n var value = _step.value;\n res.push(SerializationHelper.deserializeProperty(value, engine, level + 1, type, overrideDataPath));\n }\n return res;\n // TODO json 数据避免传 typedArray\n } else if (SerializationHelper.checkDataPath(property)) {\n var referenceObject = engine.findObject(property);\n return overrideDataPath ? referenceObject : property;\n } else if (isObject(property) && property.constructor === Object) {\n var res1;\n if (type) {\n res1 = new type();\n } else {\n res1 = {};\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(Object.keys(property)), _step1; !(_step1 = _iterator1()).done;){\n var key = _step1.value;\n res1[key] = SerializationHelper.deserializeProperty(property[key], engine, level + 1, undefined, overrideDataPath);\n }\n return res1;\n } else {\n return property;\n }\n };\n SerializationHelper.serializeObjectProperty = function serializeObjectProperty(objectProperty, serializedData, level) {\n if (level > 14) {\n console.error(\"The nested object layers of the serialized data exceed the maximum limit.\");\n return;\n }\n if (!serializedData) {\n serializedData = {};\n }\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(objectProperty)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n var value = objectProperty[key];\n if (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\" || SerializationHelper.checkTypedArray(objectProperty)) {\n // TODO json 数据避免传 typedArray\n serializedData[key] = value;\n } else if (isArray(value)) {\n if (!serializedData[key]) {\n serializedData[key] = [];\n }\n SerializationHelper.serializeArrayProperty(value, serializedData[key], level + 1);\n } else if (EffectsObject.is(value)) {\n // TODO 处理 EffectsObject 递归序列化\n serializedData[key] = {\n id: value.getInstanceId()\n };\n } else if (isObject(value)) {\n if (!serializedData[key]) {\n serializedData[key] = {};\n }\n SerializationHelper.serializeObjectProperty(value, serializedData[key], level + 1);\n }\n }\n };\n SerializationHelper.serializeArrayProperty = function serializeArrayProperty(arrayProperty, serializedData, level) {\n if (level > 14) {\n console.error(\"The nested object layers of the serialized data exceed the maximum limit.\");\n return;\n }\n if (!serializedData) {\n serializedData = [];\n }\n for(var i = 0; i < arrayProperty.length; i++){\n var value = arrayProperty[i];\n if (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\" || SerializationHelper.checkTypedArray(arrayProperty)) {\n // TODO json 数据避免传 typedArray\n serializedData[i] = value;\n } else if (isArray(value)) {\n if (!serializedData[i]) {\n serializedData[i] = [];\n }\n SerializationHelper.serializeArrayProperty(value, serializedData[i], level + 1);\n } else if (EffectsObject.is(value)) {\n // TODO 处理 EffectsObject 递归序列化\n serializedData[i] = {\n id: value.getInstanceId()\n };\n } else if (isObject(value)) {\n if (!serializedData[i]) {\n serializedData[i] = {};\n }\n SerializationHelper.serializeObjectProperty(value, serializedData[i], level + 1);\n }\n }\n };\n return SerializationHelper;\n}();\n\n/**\n * @since 2.0.0\n */ var AssetLoader = /*#__PURE__*/ function() {\n function AssetLoader(engine) {\n this.engine = engine;\n }\n var _proto = AssetLoader.prototype;\n _proto.loadGUID = function loadGUID(dataPath) {\n var guid = dataPath.id;\n if (!dataPath) {\n return null;\n }\n var effectsObjectData = this.findData(guid);\n var effectsObject;\n if (!effectsObjectData) {\n console.error(\"Object data with uuid: \" + guid + \" not found.\");\n return undefined;\n }\n switch(effectsObjectData.dataType){\n case DataType.Material:\n effectsObject = Material.create(this.engine);\n break;\n case DataType.Geometry:\n effectsObject = Geometry.create(this.engine);\n break;\n case DataType.Texture:\n effectsObject = Texture.create(this.engine);\n break;\n default:\n {\n var classConstructor = AssetLoader.getClass(effectsObjectData.dataType);\n if (classConstructor) {\n effectsObject = new classConstructor(this.engine);\n }\n }\n }\n if (!effectsObject) {\n console.error(\"Constructor for DataType: \" + effectsObjectData.dataType + \" not found.\");\n return undefined;\n }\n effectsObject.setInstanceId(effectsObjectData.id);\n this.engine.addInstance(effectsObject);\n SerializationHelper.deserialize(effectsObjectData, effectsObject);\n return effectsObject;\n };\n _proto.findData = function findData(uuid) {\n return this.engine.jsonSceneData[uuid];\n };\n AssetLoader.getClass = function getClass(dataType) {\n return effectsClassStore[dataType];\n };\n return AssetLoader;\n}();\nvar Database = /*#__PURE__*/ function() {\n function Database() {}\n var _proto = Database.prototype;\n _proto.loadGUID = function loadGUID(guid) {\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n undefined\n ];\n });\n })();\n };\n return Database;\n}();\n\nfunction arrAdd(arr, item) {\n if (!arr.includes(item)) {\n arr.push(item);\n return true;\n }\n}\nfunction ensureFixedNumber(a) {\n if (Number.isFinite(a)) {\n return [\n ValueType.CONSTANT,\n a\n ];\n }\n if (a) {\n var valueType = a[0];\n var valueData = a[1];\n if (Array.isArray(valueType)) {\n // 没有数据类型的数据\n return;\n }\n if (valueType === \"static\" || valueType === ValueType.CONSTANT) {\n return [\n ValueType.CONSTANT,\n a[1]\n ];\n }\n if (valueType === \"lines\") {\n return [\n ValueType.LINE,\n a[1]\n ];\n }\n if (valueType === ValueType.LINE) {\n // @ts-expect-error\n var keyframes = valueData.map(function(data) {\n return [\n BezierKeyframeType.LINE,\n data\n ];\n });\n return [\n ValueType.BEZIER_CURVE,\n keyframes\n ];\n }\n if (valueType === \"curve\" || valueType === ValueType.CURVE) {\n return [\n ValueType.BEZIER_CURVE,\n getBezierCurveFromHermiteInGE(valueData)\n ];\n }\n return a;\n }\n}\nfunction ensureFixedNumberWithRandom(a, p) {\n if (Array.isArray(a) && a[0] === \"random\") {\n return [\n ValueType.CONSTANT,\n a[1][p]\n ];\n }\n return ensureFixedNumber(a);\n}\nfunction ensureRGBAValue(a) {\n if (a && a[0] === \"color\") {\n return colorToArr(a[1], true);\n }\n return [\n 1,\n 1,\n 1,\n 1\n ];\n}\nfunction ensureColorExpression(a, normalized) {\n if (a) {\n if (a[0] === \"colors\") {\n return [\n ValueType.COLORS,\n a[1].map(function(color) {\n return colorToArr(color, normalized);\n })\n ];\n } else if (a[0] === \"gradient\") {\n return ensureGradient(a[1], normalized);\n } else if (a[0] === \"color\") {\n return [\n ValueType.RGBA_COLOR,\n colorToArr(a[1], normalized)\n ];\n }\n return a;\n }\n}\nfunction ensureNumberExpression(a) {\n if (a && a[0] === \"random\") {\n return [\n ValueType.RANDOM,\n a[1]\n ];\n }\n return ensureFixedNumber(a);\n}\nfunction ensureGradient(a, normalized) {\n if (a) {\n var stops = [];\n Object.getOwnPropertyNames(a).forEach(function(p) {\n var stop = parsePercent(p);\n var color = colorToArr(a[p], normalized);\n stops.push([\n stop,\n color[0],\n color[1],\n color[2],\n color[3]\n ]);\n });\n stops = stops.sort(function(a, b) {\n return a[0] - b[0];\n });\n return [\n ValueType.GRADIENT_COLOR,\n stops\n ];\n }\n}\nfunction colorToArr(hex, normalized) {\n var ret;\n if (typeof hex === \"string\") {\n hex = hex.replace(/[\\s\\t\\r\\n]/g, \"\");\n var m = /rgba?\\(([.\\d]+),([.\\d]+),([.\\d]+),?([.\\d]+)?\\)/.exec(hex);\n if (m) {\n var a = +m[4];\n ret = [\n +m[1],\n +m[2],\n +m[3],\n isNaN(a) ? 255 : Math.round(a * 255)\n ];\n } else if (/^#[a-f\\d]{3}$/i.test(hex)) {\n ret = [\n parseInt(hex[1] + hex[1], 16),\n parseInt(hex[2] + hex[2], 16),\n parseInt(hex[3] + hex[3], 16),\n 255\n ];\n // eslint-disable-next-line no-cond-assign\n } else if (m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)) {\n ret = [\n parseInt(m[1], 16),\n parseInt(m[2], 16),\n parseInt(m[3], 16),\n 255\n ] || [\n 0,\n 0,\n 0,\n 255\n ];\n }\n } else if (_instanceof1(hex, Array)) {\n ret = [\n hex[0],\n hex[1],\n hex[2],\n isNaN(hex[3]) ? 255 : Math.round(hex[3] * 255)\n ];\n }\n if (normalized) {\n // @ts-expect-error\n ret = normalizeColor(ret);\n }\n // @ts-expect-error\n return ret;\n}\nfunction normalizeColor(a) {\n if (Array.isArray(a)) {\n return a.map(function(i) {\n return Number.isFinite(i / 255) ? Number((i / 255).toFixed(6)) : 0;\n });\n }\n}\nfunction parsePercent(c) {\n var match = /^(-)?([\\d+.]+)%$/.exec(c);\n if (match) {\n return +match[2] / 100 * (match[1] ? -1 : 1);\n }\n return +c;\n}\nfunction getGradientColor(color, normalized) {\n if (Array.isArray(color)) {\n if (color[0] === ValueType.GRADIENT_COLOR) {\n return color;\n }\n // @ts-expect-error\n return (color[0] === \"gradient\" || color[0] === \"color\") && ensureGradient(color[1], normalized);\n } else {\n return ensureGradient(color, normalized);\n }\n}\nfunction ensureFixedVec3(a) {\n if (a) {\n if (a.length === 3) {\n return [\n ValueType.CONSTANT_VEC3,\n a\n ];\n }\n var valueType = a[0];\n if (valueType === \"path\" || valueType === \"bezier\" || valueType === ValueType.BEZIER_PATH || valueType === ValueType.LINEAR_PATH) {\n var valueData = a[1];\n var easing = valueData[0];\n var points = valueData[1];\n var controlPoints = valueData[2];\n var bezierEasing = getBezierCurveFromHermiteInGE(easing);\n // linear path没有controlPoints\n if (!controlPoints) {\n controlPoints = [];\n for(var keyframeIndex = 0; keyframeIndex < points.length; keyframeIndex++){\n var point = points[keyframeIndex].slice();\n if (keyframeIndex === 0) {\n controlPoints.push(point);\n } else if (keyframeIndex < points.length - 1) {\n controlPoints.push(point);\n controlPoints.push(point);\n } else {\n controlPoints.push(point);\n }\n }\n }\n return [\n ValueType.BEZIER_CURVE_PATH,\n [\n bezierEasing,\n points,\n controlPoints\n ]\n ];\n }\n return a;\n }\n}\nfunction objectValueToNumber(o) {\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(o)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n o[key] = Number(o[key]);\n }\n return o;\n}\nfunction deleteEmptyValue(o) {\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(o)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n if (o[key] === undefined) {\n delete o[key];\n }\n }\n return o;\n}\nvar cos = Math.cos;\nvar sin = Math.sin;\nvar d2r = Math.PI / 180;\nvar r2d = 180 / Math.PI;\nfunction quatFromXYZRotation(out, x, y, z) {\n var c1 = cos(x * d2r / 2);\n var c2 = cos(y * d2r / 2);\n var c3 = cos(z * d2r / 2);\n var s1 = sin(x * d2r / 2);\n var s2 = sin(y * d2r / 2);\n var s3 = sin(z * d2r / 2);\n out[0] = s1 * c2 * c3 + c1 * s2 * s3;\n out[1] = c1 * s2 * c3 - s1 * c2 * s3;\n out[2] = c1 * c2 * s3 + s1 * s2 * c3;\n out[3] = c1 * c2 * c3 - s1 * s2 * s3;\n return out;\n}\nfunction clamp(v, min, max) {\n return v > max ? max : v < min ? min : v;\n}\nfunction rotationZYXFromQuat(out, quat) {\n var x = quat[0];\n var y = quat[1];\n var z = quat[2];\n var w = quat[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var m11 = 1 - yy - zz, m12 = yx - wz;\n var m21 = yx + wz, m22 = 1 - xx - zz;\n var m31 = zx - wy, m32 = zy + wx, m33 = 1 - xx - yy;\n out[1] = Math.asin(clamp(-m31, -1, 1)) * r2d;\n if (Math.abs(m31) < 0.9999999) {\n out[0] = Math.atan2(m32, m33) * r2d;\n out[2] = Math.atan2(m21, m11) * r2d;\n } else {\n out[0] = 0;\n out[2] = Math.atan2(-m12, m22) * r2d;\n }\n return out;\n}\n/**\n * 提取并转换 JSON 数据中的 anchor 值\n */ function convertAnchor(anchor, particleOrigin) {\n if (anchor) {\n return [\n anchor[0] - 0.5,\n 0.5 - anchor[1]\n ];\n } else if (particleOrigin) {\n return particleOriginTranslateMap[particleOrigin];\n } else {\n return [\n 0,\n 0\n ];\n }\n}\nvar _obj$5;\nvar particleOriginTranslateMap = (_obj$5 = {}, _obj$5[ParticleOrigin.PARTICLE_ORIGIN_CENTER] = [\n 0,\n 0\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_CENTER_BOTTOM] = [\n 0,\n -0.5\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_CENTER_TOP] = [\n 0,\n 0.5\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_LEFT_TOP] = [\n -0.5,\n 0.5\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_LEFT_CENTER] = [\n -0.5,\n 0\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_LEFT_BOTTOM] = [\n -0.5,\n -0.5\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_CENTER] = [\n 0.5,\n 0\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_BOTTOM] = [\n 0.5,\n -0.5\n], _obj$5[ParticleOrigin.PARTICLE_ORIGIN_RIGHT_TOP] = [\n 0.5,\n 0.5\n], _obj$5);\nfunction getBezierCurveFromHermite(m0, m1, p0, p3) {\n var xStart = p0[0];\n var yStart = p0[1];\n var xEnd = p3[0];\n var yEnd = p3[1];\n var dt = xEnd - xStart;\n m0 = m0 * dt;\n m1 = m1 * dt;\n var bezierControlPoints = [\n [\n xStart + (xEnd - xStart) / 3,\n yStart + m0 / 3\n ],\n [\n xEnd - (xEnd - xStart) / 3,\n yEnd - m1 / 3\n ]\n ];\n return bezierControlPoints;\n}\nfunction getBezierCurveFromHermiteInGE(geHermiteCurves) {\n var ymax = -1000000;\n var ymin = 1000000;\n for(var i = 0; i < geHermiteCurves.length; i++){\n ymax = Math.max(ymax, geHermiteCurves[i][1]);\n ymin = Math.min(ymin, geHermiteCurves[i][1]);\n }\n var geBezierCurves = [\n [\n geHermiteCurves[0][0],\n geHermiteCurves[0][1]\n ]\n ];\n for(var i1 = 0; i1 < geHermiteCurves.length - 1; i1++){\n var m0 = geHermiteCurves[i1][3] * (ymax - ymin);\n var m1 = geHermiteCurves[i1 + 1][2] * (ymax - ymin);\n var p0 = [\n geHermiteCurves[i1][0],\n geHermiteCurves[i1][1]\n ];\n var p3 = [\n geHermiteCurves[i1 + 1][0],\n geHermiteCurves[i1 + 1][1]\n ];\n if (p0[0] != p3[0]) {\n var bezierControlPoints = getBezierCurveFromHermite(m0, m1, p0, p3);\n var p1 = bezierControlPoints[0];\n var p2 = bezierControlPoints[1];\n geBezierCurves[geBezierCurves.length - 1].push(p1[0]);\n geBezierCurves[geBezierCurves.length - 1].push(p1[1]);\n geBezierCurves.push([\n p2[0],\n p2[1],\n p3[0],\n p3[1]\n ]);\n } else {\n geBezierCurves[geBezierCurves.length - 1].push(p3[0]);\n geBezierCurves[geBezierCurves.length - 1].push(p3[1]);\n }\n }\n // 添加关键帧类型\n return geBezierCurves.map(function(curve, index) {\n return index === 0 ? [\n BezierKeyframeType.EASE_OUT,\n curve\n ] : index === geBezierCurves.length - 1 ? [\n BezierKeyframeType.EASE_IN,\n curve\n ] : [\n BezierKeyframeType.EASE,\n curve\n ];\n });\n}\n\nfunction getStandardCameraContent(model) {\n var _model_transform;\n var opt = model.options;\n var ret = {\n options: {\n fov: opt.fov,\n far: opt.far,\n near: opt.near,\n clipMode: opt.clipMode\n }\n };\n var velocityOverLifetime = model.velocityOverLifetime;\n if (velocityOverLifetime || ((_model_transform = model.transform) == null ? void 0 : _model_transform.path)) {\n var _model_transform1;\n var positionOverLifetime = {\n path: ensureFixedVec3((_model_transform1 = model.transform) == null ? void 0 : _model_transform1.path),\n linearX: ensureFixedNumber(velocityOverLifetime == null ? void 0 : velocityOverLifetime.translateX),\n linearY: ensureFixedNumber(velocityOverLifetime == null ? void 0 : velocityOverLifetime.translateY),\n linearZ: ensureFixedNumber(velocityOverLifetime == null ? void 0 : velocityOverLifetime.translateZ)\n };\n deleteEmptyValue(positionOverLifetime);\n ret.positionOverLifetime = positionOverLifetime;\n }\n var rol = model.rotationOverLifetime;\n if (rol) {\n var rotationOverLifetime = {\n separateAxes: rol.separateAxes,\n x: ensureFixedNumber(rol == null ? void 0 : rol.rotateX),\n y: ensureFixedNumber(rol == null ? void 0 : rol.rotateY),\n z: rol.separateAxes ? ensureFixedNumber(rol == null ? void 0 : rol.rotateZ) : ensureFixedNumber(rol.rotation)\n };\n deleteEmptyValue(rotationOverLifetime);\n ret.rotationOverLifetime = rotationOverLifetime;\n }\n return ret;\n}\n\nfunction getStandardInteractContent(ui) {\n var options = ui.options;\n var option;\n switch(options.type){\n case \"click\":\n {\n option = {\n type: InteractType.CLICK,\n showPreview: options.showPreview,\n previewColor: options.previewColor && ensureRGBAValue(options.previewColor),\n behavior: options.behavior || InteractBehavior.NOTIFY\n };\n break;\n }\n case \"drag\":\n {\n option = {\n type: InteractType.DRAG,\n enableInEditor: !!options.enableInEditor,\n dxRange: options.dxRange,\n dyRange: options.dyRange,\n target: options.target\n };\n break;\n }\n case \"message\":\n {\n option = {\n type: InteractType.MESSAGE\n };\n break;\n }\n }\n var ret = {\n // @ts-expect-error\n options: option\n };\n return ret;\n}\n\n/**\n * 2.1 以下版本数据适配(mars-player@2.4.0 及以上版本支持 2.1 以下数据的适配)\n */ function version21Migration(json) {\n json.compositions.forEach(function(composition) {\n composition.items.forEach(function(item) {\n if (item.type === ItemType.null) {\n if (item.endBehavior === EndBehavior.destroy) {\n item.endBehavior = EndBehavior.freeze;\n }\n }\n });\n });\n json.version = JSONSceneVersion[\"2_1\"];\n return json;\n}\n/**\n * 2.2 以下版本数据适配(mars-player@2.5.0 及以上版本支持 2.2 以下数据的适配)\n */ function version22Migration(json) {\n var _json_version;\n var singleVersion = (_json_version = json.version) == null ? void 0 : _json_version.split(\".\");\n if (!singleVersion || Number(singleVersion[0]) > 2 || Number(singleVersion[0]) === 2 && Number(singleVersion[1]) >= 2) {\n return json;\n }\n json.compositions.forEach(function(composition) {\n composition.items.forEach(function(item) {\n if (item.type === ItemType.mesh || item.type === ItemType.light) {\n item.endBehavior = item.endBehavior === 1 ? EndBehavior.destroy : item.endBehavior;\n }\n });\n });\n return json;\n}\nvar currentMaskComponent;\nvar componentMap = new Map();\nvar itemMap = new Map();\nvar refCompositions = new Map();\n/**\n * 3.1 版本数据适配\n * - 富文本插件名称的适配\n */ function version31Migration(json) {\n // Custom shape fill 属性位置迁移\n for(var _iterator = _create_for_of_iterator_helper_loose(json.components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n if (component.dataType === DataType.ShapeComponent) {\n var shapeComponent = component;\n if (shapeComponent.type === ShapePrimitiveType.Custom) {\n var _customShapeComponent_shapes;\n var customShapeComponent = shapeComponent;\n //@ts-expect-error\n if (((_customShapeComponent_shapes = customShapeComponent.shapes) == null ? void 0 : _customShapeComponent_shapes.length) > 0 && customShapeComponent.shapes[0].fill) {\n // @ts-expect-error\n customShapeComponent.fill = customShapeComponent.shapes[0].fill;\n }\n // easingIn 和 easingOut 绝对坐标转相对坐标\n var easingInFlag = new Array(customShapeComponent.easingIns.length);\n var easingOutFlag = new Array(customShapeComponent.easingOuts.length).fill(false);\n for(var _iterator1 = _create_for_of_iterator_helper_loose(customShapeComponent.shapes), _step1; !(_step1 = _iterator1()).done;){\n var shape = _step1.value;\n for(var _iterator2 = _create_for_of_iterator_helper_loose(shape.indexes), _step2; !(_step2 = _iterator2()).done;){\n var index = _step2.value;\n var point = customShapeComponent.points[index.point];\n var easingIn = customShapeComponent.easingIns[index.easingIn];\n var easingOut = customShapeComponent.easingOuts[index.easingOut];\n if (!easingInFlag[index.easingIn]) {\n easingIn.x -= point.x;\n easingIn.y -= point.y;\n easingInFlag[index.easingIn] = true;\n }\n if (!easingOutFlag[index.easingOut]) {\n easingOut.x -= point.x;\n easingOut.y -= point.y;\n easingOutFlag[index.easingOut] = true;\n }\n }\n }\n }\n }\n }\n return json;\n}\nfunction version32Migration(json) {\n componentMap.clear();\n itemMap.clear();\n refCompositions.clear();\n var compositions = json.compositions, items = json.items, components = json.components;\n // 处理旧蒙版数据\n var mainComp = compositions[0];\n for(var _iterator = _create_for_of_iterator_helper_loose(components), _step; !(_step = _iterator()).done;){\n var component = _step.value;\n componentMap.set(component.id, component);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(compositions), _step1; !(_step1 = _iterator1()).done;){\n var comp = _step1.value;\n if (comp.id === json.compositionId) {\n mainComp = comp;\n } else {\n refCompositions.set(comp.id, comp);\n }\n }\n for(var _iterator2 = _create_for_of_iterator_helper_loose(items), _step2; !(_step2 = _iterator2()).done;){\n var item = _step2.value;\n itemMap.set(item.id, item);\n }\n processContent(mainComp);\n return json;\n}\nfunction version33Migration(json) {\n var // 修正老版本数据中,富文本插件名称的问题\n _json_plugins;\n (_json_plugins = json.plugins) == null ? void 0 : _json_plugins.forEach(function(plugin, index) {\n if (plugin === \"richtext\") {\n json.plugins[index] = \"rich-text\";\n }\n });\n // 老 shape 数据兼容\n for(var _iterator = _create_for_of_iterator_helper_loose(json.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n if (item.type === ItemType.sprite) {\n var spriteComponent = componentMap.get(item.components[0].id);\n if (spriteComponent) {\n var shape = spriteComponent.renderer.shape;\n var shapeData = void 0;\n if (Number.isInteger(shape)) {\n shapeData = json.shapes[shape];\n } else {\n shapeData = shape;\n }\n spriteComponent.renderer.shape = shapeData;\n }\n }\n }\n // Composition id 转 guid, Composition 分离 CompositionComponent\n var compositionId = json.compositionId;\n var compositionIdToGUIDMap = {};\n for(var _iterator1 = _create_for_of_iterator_helper_loose(json.compositions), _step1; !(_step1 = _iterator1()).done;){\n var composition = _step1.value;\n var guid = generateGUID();\n compositionIdToGUIDMap[composition.id] = guid;\n if (composition.id === compositionId) {\n json.compositionId = guid;\n }\n composition.id = guid;\n var compositionComponent = {\n id: generateGUID(),\n dataType: \"CompositionComponent\",\n items: composition.items,\n timelineAsset: composition.timelineAsset,\n sceneBindings: composition.sceneBindings,\n startTime: composition.startTime\n };\n //@ts-expect-error\n composition.timelineAsset = undefined;\n //@ts-expect-error\n composition.sceneBindings = undefined;\n composition.startTime = undefined;\n //@ts-expect-error\n composition.components = [\n {\n id: compositionComponent.id\n }\n ];\n json.components.push(compositionComponent);\n }\n // 预合成元素 refId 同步改为生成的合成 guid\n for(var _iterator2 = _create_for_of_iterator_helper_loose(json.items), _step2; !(_step2 = _iterator2()).done;){\n var item1 = _step2.value;\n if (item1.content) {\n var compositionOptions = item1.content.options;\n if (compositionOptions && compositionOptions.refId !== undefined) {\n compositionOptions.refId = compositionIdToGUIDMap[compositionOptions.refId];\n }\n }\n }\n return json;\n}\nfunction processContent(composition) {\n for(var _iterator = _create_for_of_iterator_helper_loose(composition.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n var itemProps = itemMap.get(item.id);\n if (!itemProps) {\n return;\n }\n if (itemProps.type === ItemType.sprite || itemProps.type === ItemType.particle || itemProps.type === ItemType.spine || itemProps.type === ItemType.text || itemProps.type === ItemType.richtext || itemProps.type === ItemType.video || itemProps.type === ItemType.shape) {\n var component = componentMap.get(itemProps.components[0].id);\n if (component) {\n processMask(component);\n }\n }\n // 处理预合成的渲染顺序\n if (itemProps.type === ItemType.composition) {\n var refId = itemProps.content.options.refId;\n var comp = refCompositions.get(refId);\n comp && processContent(comp);\n }\n }\n}\nfunction processMask(renderContent) {\n var renderer = renderContent.renderer;\n var maskMode = renderer == null ? void 0 : renderer.maskMode;\n if (!maskMode || maskMode === exports.MaskMode.NONE) {\n return;\n }\n if (maskMode === exports.MaskMode.MASK) {\n renderContent.mask = {\n mask: true\n };\n currentMaskComponent = renderContent.id;\n } else if (maskMode === ObscuredMode.OBSCURED || maskMode === ObscuredMode.REVERSE_OBSCURED) {\n renderContent.mask = {\n mode: maskMode,\n ref: {\n \"id\": currentMaskComponent\n }\n };\n }\n}\n/**\n * 3.0 以下版本数据适配(runtime 2.0及以上版本支持)\n */ function version30Migration(json) {\n var _loop = function() {\n var composition = _step1.value;\n // composition 的 endBehavior 兼容\n if (// @ts-expect-error\n // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n composition.endBehavior === END_BEHAVIOR_PAUSE_AND_DESTROY || // @ts-expect-error\n // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n composition.endBehavior === END_BEHAVIOR_PAUSE) {\n composition.endBehavior = EndBehavior.freeze;\n }\n // 过滤掉滤镜元素\n composition.items = composition.items.filter(function(item) {\n return item.type !== \"8\";\n });\n // 过滤掉粒子滤镜(扭曲)\n composition.items.forEach(function(item) {\n if (item.type === ItemType.particle) {\n // @ts-expect-error\n var filterData = item.content[\"filter\"];\n if (filterData) {\n // @ts-expect-error\n delete item.content[\"filter\"];\n }\n }\n });\n for(var _iterator = _create_for_of_iterator_helper_loose(composition.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n itemOldIdToGuidMap[item.id] = generateGUID();\n // TODO: 编辑器测试用,上线后删除\n //@ts-expect-error\n item.oldId = item.id;\n item.id = itemOldIdToGuidMap[item.id];\n guidToItemMap[item.id] = item;\n }\n composition.items.forEach(function(item, index) {\n if (item.parentId) {\n if (item.parentId.includes(\"^\")) {\n var parentId = item.parentId.split(\"^\")[0];\n var nodeId = item.parentId.split(\"^\")[1];\n item.parentId = itemOldIdToGuidMap[parentId] + \"^\" + nodeId;\n } else {\n item.parentId = itemOldIdToGuidMap[item.parentId];\n }\n }\n // @ts-expect-error fix item type\n result.items.push(item);\n // @ts-expect-error fix item type\n composition.items[index] = {\n id: item.id\n };\n });\n var compositionData = _extends({}, composition, {\n timelineAsset: {\n id: \"\"\n },\n sceneBindings: []\n });\n result.compositions.push(compositionData);\n // 生成时间轴数据\n convertTimelineAsset(compositionData, guidToItemMap, result);\n };\n var // 兼容老版本数据中不存在textures的情况\n _result;\n var result = _extends({}, json, {\n items: [],\n compositions: [],\n components: [],\n materials: [],\n shaders: [],\n geometries: [],\n animations: [],\n miscs: []\n });\n // image数据添加 guid\n for(var _iterator = _create_for_of_iterator_helper_loose(result.images), _step; !(_step = _iterator()).done;){\n var image = _step.value;\n image.id = generateGUID();\n }\n var _textures;\n (_textures = (_result = result).textures) != null ? _textures : _result.textures = [];\n result.textures.forEach(function(textureOptions) {\n var _result_images_textureOptions_source;\n textureOptions.id = generateGUID();\n textureOptions.dataType = DataType.Texture;\n // @ts-expect-error\n textureOptions.source = {\n id: (_result_images_textureOptions_source = result.images[textureOptions.source]) == null ? void 0 : _result_images_textureOptions_source.id\n };\n });\n if (result.textures.length < result.images.length) {\n for(var i = result.textures.length; i < result.images.length; i++){\n result.textures.push({\n id: generateGUID(),\n dataType: DataType.Texture,\n //@ts-expect-error\n source: {\n id: result.images[i].id\n },\n flipY: true\n });\n }\n }\n // 处理老版本数据中 bins 没有 id 的情况\n if (json.bins) {\n convertBinaryAsset(json.bins, result);\n }\n var itemOldIdToGuidMap = {};\n var guidToItemMap = {};\n // 更正Composition.endBehavior\n for(var _iterator1 = _create_for_of_iterator_helper_loose(json.compositions), _step1; !(_step1 = _iterator1()).done;)_loop();\n for(var _iterator2 = _create_for_of_iterator_helper_loose(result.items), _step2; !(_step2 = _iterator2()).done;){\n var item = _step2.value;\n // 原 texture 索引转为统一 guid 索引\n if (item.content) {\n if (item.content.renderer) {\n if (item.content.renderer.texture !== undefined) {\n var oldTextureId = item.content.renderer.texture;\n item.content.renderer.texture = {\n id: result.textures[oldTextureId].id\n };\n }\n }\n if (item.content.trails) {\n if (item.content.trails.texture !== undefined) {\n var oldTextureId1 = item.content.trails.texture;\n item.content.trails.texture = {\n id: result.textures[oldTextureId1].id\n };\n }\n }\n }\n // item 的 transform 属性由数组转为 {x:n, y:n, z:n}\n if (item.transform) {\n var _item_transform_position;\n //@ts-expect-error\n var position = [].concat((_item_transform_position = item.transform.position) != null ? _item_transform_position : [\n 0,\n 0,\n 0\n ]);\n var _item_transform_rotation;\n //@ts-expect-error\n var rotation = [].concat((_item_transform_rotation = item.transform.rotation) != null ? _item_transform_rotation : [\n 0,\n 0,\n 0\n ]);\n var _item_transform_scale;\n //@ts-expect-error\n var scale = [].concat((_item_transform_scale = item.transform.scale) != null ? _item_transform_scale : [\n 1,\n 1,\n 1\n ]);\n Object.assign(item, {\n transform: {\n position: {\n x: position[0],\n y: position[1],\n z: position[2]\n },\n eulerHint: {\n x: rotation[0],\n y: rotation[1],\n z: rotation[2]\n },\n scale: {\n x: scale[0],\n y: scale[1],\n z: scale[0]\n }\n }\n });\n // sprite 的 scale 转为 size\n if (item.type === ItemType.sprite) {\n item.transform.size = {\n x: scale[0],\n y: scale[1]\n };\n item.transform.scale = {\n x: 1,\n y: 1,\n z: 1\n };\n }\n // sprite 的 anchor 修正\n if (item.type === ItemType.sprite) {\n var content = item.content;\n if (!content.renderer) {\n content.renderer = {};\n }\n var renderer = content.renderer;\n var realAnchor = convertAnchor(renderer.anchor, renderer.particleOrigin);\n var startSize = item.transform.size;\n // 兼容旧JSON(anchor和particleOrigin可能同时存在)\n if (!renderer.anchor && renderer.particleOrigin !== undefined) {\n var _startSize_x;\n item.transform.position.x += -realAnchor[0] * ((_startSize_x = startSize == null ? void 0 : startSize.x) != null ? _startSize_x : 1);\n var _startSize_y;\n item.transform.position.y += -realAnchor[1] * ((_startSize_y = startSize == null ? void 0 : startSize.y) != null ? _startSize_y : 1);\n }\n var _startSize_x1, _startSize_y1;\n item.transform.anchor = {\n x: realAnchor[0] * ((_startSize_x1 = startSize == null ? void 0 : startSize.x) != null ? _startSize_x1 : 1),\n y: realAnchor[1] * ((_startSize_y1 = startSize == null ? void 0 : startSize.y) != null ? _startSize_y1 : 1)\n };\n }\n }\n if (item.type === ItemType.particle) {\n var content1 = item.content;\n if (!content1.renderer) {\n content1.renderer = {};\n }\n var renderer1 = content1.renderer;\n content1.renderer.anchor = convertAnchor(renderer1.anchor, renderer1.particleOrigin);\n }\n // 修复相机K帧缺失 asMovement 参数\n if (item.type === ItemType.camera && item.content.positionOverLifetime && Object.keys(item.content.positionOverLifetime).length !== 0) {\n item.content.positionOverLifetime.asMovement = true;\n }\n // 修正老 json 的 item.pluginName\n if (item.pn !== undefined) {\n var pn = item.pn;\n var _json_plugins = json.plugins, plugins = _json_plugins === void 0 ? [] : _json_plugins;\n if (pn !== undefined && Number.isInteger(pn)) {\n item.pluginName = plugins[pn];\n }\n }\n // 修正老 json 的 item.type\n if (item.pluginName === \"editor-gizmo\") {\n //@ts-expect-error\n item.type = \"editor-gizmo\";\n }\n if (item.pluginName === \"orientation-transformer\") {\n //@ts-expect-error\n item.type = \"orientation-transformer\";\n }\n // gizmo 的 target id 转换为新的 item guid\n if (item.content.options.target && item.pluginName === \"editor-gizmo\") {\n item.content.options.target = itemOldIdToGuidMap[item.content.options.target];\n }\n // Spine 元素转为 guid 索引\n if (item.type === ItemType.spine && json.spines && json.spines.length !== 0) {\n convertSpineData(json.spines[item.content.options.spine], item.content, result);\n }\n // item 的 content 转为 component data 加入 JSONScene.components\n if (item.type === ItemType.sprite || item.type === ItemType.particle || item.type === ItemType.mesh || item.type === ItemType.skybox || item.type === ItemType.light || item.type === \"camera\" || item.type === ItemType.tree || item.type === ItemType.interact || item.type === ItemType.camera || item.type === ItemType.text || item.type === ItemType.spine || item.type === \"editor-gizmo\" || item.type === \"orientation-transformer\") {\n item.components = [];\n result.components.push(item.content);\n item.content.id = generateGUID();\n item.content.item = {\n id: item.id\n };\n item.dataType = DataType.VFXItemData;\n item.components.push({\n id: item.content.id\n });\n }\n if (item.type === ItemType.null || item.type === ItemType.composition) {\n item.components = [];\n item.dataType = DataType.VFXItemData;\n }\n switch(item.type){\n case ItemType.sprite:\n item.content.dataType = DataType.SpriteComponent;\n break;\n case ItemType.particle:\n item.content.dataType = DataType.ParticleSystem;\n break;\n case ItemType.mesh:\n item.content.dataType = DataType.MeshComponent;\n break;\n case ItemType.skybox:\n item.content.dataType = DataType.SkyboxComponent;\n break;\n case ItemType.light:\n item.content.dataType = DataType.LightComponent;\n break;\n case \"camera\":\n item.content.dataType = DataType.CameraComponent;\n break;\n case \"editor-gizmo\":\n item.content.dataType = \"GizmoComponent\";\n break;\n case \"orientation-transformer\":\n item.content.dataType = \"OrientationComponent\";\n break;\n case ItemType.tree:\n item.content.dataType = DataType.TreeComponent;\n break;\n case ItemType.interact:\n item.content.dataType = DataType.InteractComponent;\n break;\n case ItemType.camera:\n item.content.dataType = DataType.CameraController;\n break;\n case ItemType.text:\n item.content.dataType = DataType.TextComponent;\n break;\n case ItemType.spine:\n item.content.dataType = DataType.SpineComponent;\n break;\n }\n }\n result.version = JSONSceneVersion[\"3_0\"];\n return result;\n}\n/**\n * 2.5 以下版本 赫尔米特数据转换成贝塞尔数据\n */ function version24Migration(json) {\n // 曲线转换成贝塞尔\n json.compositions.map(function(comp) {\n for(var _iterator = _create_for_of_iterator_helper_loose(comp.items), _step; !(_step = _iterator()).done;){\n var item = _step.value;\n convertParam(item.content);\n }\n });\n return json;\n}\nfunction convertParam(content) {\n if (!content) {\n return;\n }\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(content)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n var value = content[key];\n var isArray = Array.isArray(value);\n if (isArray && value.length === 2 && Array.isArray(value[1])) {\n if (key === \"path\") {\n content[key] = ensureFixedVec3(value);\n } else {\n content[key] = ensureFixedNumber(value);\n }\n } else if (!isArray && typeof value === \"object\") {\n convertParam(value);\n }\n }\n}\nfunction convertTimelineAsset(composition, guidToItemMap, jsonScene) {\n var sceneBindings = [];\n var trackDatas = [];\n var playableAssetDatas = [];\n var timelineAssetData = {\n tracks: [],\n id: generateGUID(),\n //@ts-expect-error\n dataType: \"TimelineAsset\"\n };\n for(var _iterator = _create_for_of_iterator_helper_loose(composition.items), _step; !(_step = _iterator()).done;){\n var itemDataPath = _step.value;\n var item = guidToItemMap[itemDataPath.id];\n var subTrackDatas = [];\n var newActivationPlayableAsset = {\n id: generateGUID(),\n dataType: \"ActivationPlayableAsset\"\n };\n playableAssetDatas.push(newActivationPlayableAsset);\n var newActivationTrackData = {\n id: generateGUID(),\n dataType: \"ActivationTrack\",\n children: [],\n clips: [\n {\n start: item.delay,\n duration: item.duration,\n endBehavior: item.endBehavior,\n asset: {\n id: newActivationPlayableAsset.id\n }\n }\n ]\n };\n subTrackDatas.push({\n id: newActivationTrackData.id\n });\n trackDatas.push(newActivationTrackData);\n if (item.type !== ItemType.particle) {\n var newTransformPlayableAssetData = {\n id: generateGUID(),\n dataType: \"TransformPlayableAsset\",\n //@ts-expect-error\n sizeOverLifetime: item.content.sizeOverLifetime,\n //@ts-expect-error\n rotationOverLifetime: item.content.rotationOverLifetime,\n //@ts-expect-error\n positionOverLifetime: item.content.positionOverLifetime\n };\n playableAssetDatas.push(newTransformPlayableAssetData);\n var newTrackData = {\n id: generateGUID(),\n dataType: \"TransformTrack\",\n children: [],\n clips: [\n {\n start: item.delay,\n duration: item.duration,\n endBehavior: item.endBehavior,\n asset: {\n id: newTransformPlayableAssetData.id\n }\n }\n ]\n };\n subTrackDatas.push({\n id: newTrackData.id\n });\n trackDatas.push(newTrackData);\n }\n if (item.type === ItemType.sprite || item.type === ItemType.text) {\n var newSpriteColorPlayableAssetData = {\n id: generateGUID(),\n dataType: \"SpriteColorPlayableAsset\",\n colorOverLifetime: item.content.colorOverLifetime\n };\n playableAssetDatas.push(newSpriteColorPlayableAssetData);\n var newTrackData1 = {\n id: generateGUID(),\n dataType: \"SpriteColorTrack\",\n children: [],\n clips: [\n {\n start: item.delay,\n duration: item.duration,\n endBehavior: item.endBehavior,\n asset: {\n id: newSpriteColorPlayableAssetData.id\n }\n }\n ]\n };\n subTrackDatas.push({\n id: newTrackData1.id\n });\n trackDatas.push(newTrackData1);\n }\n if (item.type === ItemType.composition) {\n var newSubCompositionPlayableAssetData = {\n id: generateGUID(),\n dataType: \"SubCompositionPlayableAsset\"\n };\n playableAssetDatas.push(newSubCompositionPlayableAssetData);\n var newTrackData2 = {\n id: generateGUID(),\n dataType: \"SubCompositionTrack\",\n children: [],\n clips: [\n {\n start: item.delay,\n duration: item.duration,\n endBehavior: item.endBehavior,\n asset: {\n id: newSubCompositionPlayableAssetData.id\n }\n }\n ]\n };\n subTrackDatas.push({\n id: newTrackData2.id\n });\n trackDatas.push(newTrackData2);\n }\n var bindingTrackData = {\n id: generateGUID(),\n dataType: \"ObjectBindingTrack\",\n children: subTrackDatas,\n clips: []\n };\n trackDatas.push(bindingTrackData);\n timelineAssetData.tracks.push({\n id: bindingTrackData.id\n });\n sceneBindings.push({\n key: {\n id: bindingTrackData.id\n },\n value: {\n id: item.id\n }\n });\n }\n var trackIds = [];\n for(var _iterator1 = _create_for_of_iterator_helper_loose(trackDatas), _step1; !(_step1 = _iterator1()).done;){\n var trackData = _step1.value;\n trackIds.push({\n id: trackData.id\n });\n }\n composition.timelineAsset = {\n id: timelineAssetData.id\n };\n composition.sceneBindings = sceneBindings;\n jsonScene.miscs.push(timelineAssetData);\n for(var _iterator2 = _create_for_of_iterator_helper_loose(trackDatas), _step2; !(_step2 = _iterator2()).done;){\n var trackData1 = _step2.value;\n //@ts-expect-error\n jsonScene.miscs.push(trackData1);\n }\n for(var _iterator3 = _create_for_of_iterator_helper_loose(playableAssetDatas), _step3; !(_step3 = _iterator3()).done;){\n var playableAsset = _step3.value;\n //@ts-expect-error\n jsonScene.miscs.push(playableAsset);\n }\n}\nfunction convertBinaryAsset(bins, jsonScene) {\n //@ts-expect-error\n jsonScene.bins = bins.map(function(bin) {\n return {\n url: bin.url,\n \"dataType\": \"BinaryAsset\",\n id: generateGUID()\n };\n });\n}\nfunction convertSpineData(resource, content, jsonScene) {\n //@ts-expect-error\n content.resource = {\n \"atlas\": {\n \"bins\": {\n //@ts-expect-error\n \"id\": jsonScene.bins[resource.atlas[1][0]].id\n },\n \"source\": resource.atlas[1].slice(1)\n },\n \"skeleton\": {\n \"bins\": {\n //@ts-expect-error\n \"id\": jsonScene.bins[resource.skeleton[1][0]].id\n },\n \"source\": resource.skeleton[1].slice(1)\n },\n \"skeletonType\": resource.skeletonType,\n \"images\": resource.images.map(function(i) {\n return {\n //@ts-expect-error\n id: jsonScene.textures[i].id\n };\n })\n };\n}\n\nfunction getStandardParticleContent(particle) {\n var options = particle.options;\n var transform = particle.transform;\n var shape = {\n type: ParticleEmitterShapeType.NONE\n };\n if (particle.shape) {\n var _particle_shape_shape;\n var shapeType = (_particle_shape_shape = particle.shape.shape) == null ? void 0 : _particle_shape_shape.replace(/([A-Z])/g, \"_$1\").toUpperCase().replace(/^_/, \"\");\n shape = _extends({}, particle.shape, {\n type: ParticleEmitterShapeType[shapeType]\n });\n if (particle.shape.upDirection) {\n var _particle_shape_upDirection = particle.shape.upDirection, x = _particle_shape_upDirection[0], y = _particle_shape_upDirection[1], z = _particle_shape_upDirection[2];\n if (x === 0 && y === 0 && z === 0) {\n delete shape.upDirection;\n }\n }\n }\n if (options.startTurbulence) {\n shape.turbulenceX = ensureNumberExpression(options.turbulenceX);\n shape.turbulenceY = ensureNumberExpression(options.turbulenceY);\n shape.turbulenceZ = ensureNumberExpression(options.turbulenceZ);\n }\n var emission = particle.emission;\n if (emission.bursts && emission.bursts.length > 0) {\n emission.bursts = emission.bursts.map(function(b) {\n return objectValueToNumber(b);\n });\n }\n if (emission.burstOffsets && emission.burstOffsets.length > 0) {\n emission.burstOffsets = emission.burstOffsets.map(function(b) {\n return objectValueToNumber(b);\n });\n }\n if (emission.rateOverTime) {\n emission.rateOverTime = ensureNumberExpression(emission.rateOverTime);\n }\n var ret = {\n renderer: particle.renderer,\n shape: shape,\n splits: particle.splits,\n emission: emission,\n options: {\n startLifetime: ensureNumberExpression(options.startLifetime),\n start3DSize: !!options.start3DSize,\n startSize: ensureNumberExpression(options.startSize),\n startSizeX: ensureNumberExpression(options.startSizeX),\n startSizeY: ensureNumberExpression(options.startSizeY),\n sizeAspect: ensureNumberExpression(options.sizeAspect),\n maxCount: options.maxCount,\n startDelay: ensureNumberExpression(options.startDelay),\n startColor: ensureColorExpression(options.startColor, true),\n startRotationZ: ensureNumberExpression(options.startRotation || options.startRotationZ),\n particleFollowParent: options.particleFollowParent\n }\n };\n if (options.start3DRotation) {\n ret.options.startRotationX = ensureNumberExpression(options.startRotationX);\n ret.options.startRotationY = ensureNumberExpression(options.startRotationY);\n }\n if (transform && transform.path) {\n ret.emitterTransform = {\n path: ensureFixedVec3(transform.path)\n };\n }\n var sizeOverLifetime = particle.sizeOverLifetime;\n if (sizeOverLifetime) {\n if (sizeOverLifetime.separateAxes) {\n ret.sizeOverLifetime = {\n separateAxes: true,\n x: ensureNumberExpression(sizeOverLifetime.x),\n y: ensureNumberExpression(sizeOverLifetime.y)\n };\n } else {\n ret.sizeOverLifetime = {\n size: ensureNumberExpression(sizeOverLifetime.size)\n };\n }\n }\n var velocityOverLifetime = particle.velocityOverLifetime || {};\n var sol = velocityOverLifetime.speedOverLifetime;\n if (sol) {\n sol = ensureFixedNumber(sol);\n } else {\n sol = undefined;\n }\n ret.positionOverLifetime = {\n gravity: options.gravity,\n gravityOverLifetime: ensureFixedNumber(options.gravityModifier),\n startSpeed: ensureNumberExpression(options.startSpeed),\n speedOverLifetime: sol,\n asMovement: velocityOverLifetime.asMovement,\n linearX: ensureNumberExpression(velocityOverLifetime.linearX),\n linearY: ensureNumberExpression(velocityOverLifetime.linearY),\n linearZ: ensureNumberExpression(velocityOverLifetime.linearZ),\n asRotation: velocityOverLifetime.asRotation,\n orbCenter: velocityOverLifetime.orbCenter,\n orbitalX: ensureNumberExpression(velocityOverLifetime.orbitalX),\n orbitalY: ensureNumberExpression(velocityOverLifetime.orbitalY),\n orbitalZ: ensureNumberExpression(velocityOverLifetime.orbitalZ),\n forceTarget: velocityOverLifetime.forceTarget,\n target: velocityOverLifetime.target,\n forceCurve: ensureFixedNumber(velocityOverLifetime.forceCurve)\n };\n deleteEmptyValue(ret.positionOverLifetime);\n var rotationOverLifetime = particle.rotationOverLifetime;\n if (rotationOverLifetime) {\n ret.rotationOverLifetime = {\n separateAxes: rotationOverLifetime.separateAxes,\n asRotation: rotationOverLifetime.asRotation,\n z: ensureNumberExpression(rotationOverLifetime.separateAxes ? rotationOverLifetime.z : rotationOverLifetime.angularVelocity)\n };\n if (rotationOverLifetime.separateAxes) {\n ret.rotationOverLifetime.y = ensureFixedNumber(rotationOverLifetime.y);\n ret.rotationOverLifetime.x = ensureFixedNumber(rotationOverLifetime.x);\n }\n }\n var colorOverLifetime = particle.colorOverLifetime;\n if (colorOverLifetime) {\n var col = ret.colorOverLifetime = {\n opacity: ensureFixedNumber(colorOverLifetime.opacity)\n };\n if (colorOverLifetime.color) {\n col.color = getGradientColor(colorOverLifetime.color);\n }\n }\n var textureSheetAnimation = particle.textureSheetAnimation;\n if (textureSheetAnimation) {\n ret.textureSheetAnimation = {\n row: textureSheetAnimation.row,\n col: textureSheetAnimation.col,\n total: textureSheetAnimation.total,\n animate: textureSheetAnimation.animate,\n cycles: ensureFixedNumber(textureSheetAnimation.cycles),\n animationDelay: ensureFixedNumberWithRandom(textureSheetAnimation.animationDelay, 0),\n animationDuration: ensureFixedNumberWithRandom(textureSheetAnimation.animationDuration, 0)\n };\n }\n var trials = particle.trails;\n if (trials) {\n ret.trails = {\n lifetime: ensureNumberExpression(trials.lifetime),\n dieWithParticles: trials.dieWithParticles,\n maxPointPerTrail: trials.maxPointPerTrail,\n minimumVertexDistance: trials.minimumVertexDistance,\n widthOverTrail: ensureFixedNumber(trials.widthOverTrail),\n colorOverTrail: trials.colorOverTrail && getGradientColor(trials.colorOverTrail, false),\n blending: trials.blending,\n colorOverLifetime: trials.colorOverLifetime && getGradientColor(trials.colorOverLifetime, false),\n inheritParticleColor: trials.inheritParticleColor,\n occlusion: trials.occlusion,\n transparentOcclusion: trials.transparentOcclusion,\n orderOffset: trials.orderOffset,\n sizeAffectsLifetime: trials.sizeAffectsLifetime,\n sizeAffectsWidth: trials.sizeAffectsWidth,\n texture: trials.texture,\n parentAffectsPosition: trials.parentAffectsPosition,\n opacityOverLifetime: ensureNumberExpression(trials.opacityOverLifetime)\n };\n }\n ret.trails && deleteEmptyValue(ret.trails);\n var interaction = particle.interaction;\n if (interaction) {\n ret.interaction = {\n behavior: interaction.behavior,\n radius: interaction.radius,\n multiple: interaction.multiple\n };\n }\n return ret;\n}\n\nfunction getStandardNullContent(sprite, transform) {\n var _sprite_transform;\n var opt = sprite.options;\n var velocityOverLifetime = sprite.velocityOverLifetime || {};\n var positionOverLifetime = {\n path: ensureFixedVec3((_sprite_transform = sprite.transform) == null ? void 0 : _sprite_transform.path),\n gravity: opt.gravity,\n gravityOverLifetime: ensureFixedNumber(opt.gravityModifier),\n direction: opt.direction,\n startSpeed: opt.startSpeed,\n asMovement: velocityOverLifetime.asMovement,\n linearX: ensureFixedNumber(velocityOverLifetime.linearX),\n linearY: ensureFixedNumber(velocityOverLifetime.linearY),\n linearZ: ensureFixedNumber(velocityOverLifetime.linearZ),\n asRotation: velocityOverLifetime.asRotation,\n orbCenter: velocityOverLifetime.orbCenter,\n orbitalX: ensureFixedNumber(velocityOverLifetime.orbitalX),\n orbitalY: ensureFixedNumber(velocityOverLifetime.orbitalY),\n orbitalZ: ensureFixedNumber(velocityOverLifetime.orbitalZ),\n speedOverLifetime: ensureFixedNumber(velocityOverLifetime.speedOverLifetime)\n };\n deleteEmptyValue(positionOverLifetime);\n var ret = {\n options: {\n startColor: ensureRGBAValue(opt.startColor)\n },\n positionOverLifetime: positionOverLifetime\n };\n if (opt.startSize) {\n transform.scale = [\n opt.startSize,\n opt.startSize / (opt.sizeAspect || 1),\n 1\n ];\n }\n if (opt.startRotation) {\n if (!transform.rotation) {\n transform.rotation = [\n 0,\n 0,\n opt.startRotation\n ];\n } else {\n transform.rotation[2] += opt.startRotation;\n }\n }\n var rotationOverLifetime = sprite.rotationOverLifetime;\n if (rotationOverLifetime) {\n var rot = ret.rotationOverLifetime = {\n separateAxes: rotationOverLifetime.separateAxes,\n asRotation: rotationOverLifetime.asRotation\n };\n if (rot.separateAxes) {\n rot.x = ensureFixedNumber(rotationOverLifetime.x);\n rot.y = ensureFixedNumber(rotationOverLifetime.y);\n rot.z = ensureFixedNumber(rotationOverLifetime.z);\n } else {\n rot.z = ensureFixedNumber(rotationOverLifetime.angularVelocity);\n }\n }\n var colorOverLifetime = sprite.colorOverLifetime;\n if (colorOverLifetime) {\n var col = ret.colorOverLifetime = {\n opacity: ensureFixedNumber(colorOverLifetime.opacity)\n };\n if (colorOverLifetime.color) {\n col.color = getGradientColor(colorOverLifetime.color);\n }\n }\n var sizeOverLifetime = sprite.sizeOverLifetime;\n if (sizeOverLifetime) {\n ret.sizeOverLifetime = {\n separateAxes: sizeOverLifetime.separateAxes,\n size: ensureFixedNumber(sizeOverLifetime.size),\n x: ensureFixedNumber(sizeOverLifetime.x),\n y: ensureFixedNumber(sizeOverLifetime.y),\n z: ensureFixedNumber(sizeOverLifetime.z)\n };\n }\n return ret;\n}\nfunction getStandardSpriteContent(sprite, transform) {\n var ret = getStandardNullContent(sprite, transform);\n var texAni = sprite.textureSheetAnimation;\n if (texAni) {\n ret.textureSheetAnimation = {\n row: texAni.row,\n col: texAni.col,\n total: texAni.total || undefined,\n animate: texAni.animate\n };\n }\n ret.renderer = sprite.renderer;\n if (sprite.splits) {\n ret.splits = sprite.splits;\n }\n if (sprite.interaction) {\n ret.interaction = sprite.interaction;\n }\n return ret;\n}\n\nvar v0 = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(\\w+)\\.\\d+)?$/;\nvar standardVersion = /^(\\d+)\\.(\\d+)$/;\nvar reverseParticle = false;\nfunction getStandardJSON(json) {\n if (!json || typeof json !== \"object\") {\n throw new Error(\"Invalid input: Expected a JSON object.\");\n }\n // 修正老版本数据中,meshItem 以及 lightItem 结束行为错误问题\n version22Migration(json);\n if (v0.test(json.version)) {\n var _exec;\n reverseParticle = ((_exec = /^(\\d+)/.exec(json.version)) == null ? void 0 : _exec[0]) === \"0\";\n return version33Migration(version32Migration(version31Migration(version30Migration(version21Migration(getStandardJSONFromV0(json))))));\n }\n reverseParticle = false;\n var vs = standardVersion.exec(json.version) || [];\n var mainVersion = Number(vs[1]);\n var minorVersion = Number(vs[2]);\n if (mainVersion) {\n if (mainVersion < 2 || mainVersion === 2 && minorVersion < 4) {\n json = version24Migration(json);\n }\n if (mainVersion < 3) {\n json = version30Migration(version21Migration(json));\n }\n // 版本号重新计算\n vs = standardVersion.exec(json.version) || [];\n mainVersion = Number(vs[1]);\n minorVersion = Number(vs[2]);\n // 3.x 版本格式转换\n if (mainVersion < 4) {\n if (minorVersion < 2) {\n json = version31Migration(json);\n }\n if (minorVersion < 3) {\n json = version32Migration(json);\n }\n if (minorVersion < 4) {\n json = version33Migration(json);\n }\n }\n return json;\n }\n throw new Error(\"Invalid JSON version: \" + json.version + \".\");\n}\nvar currentVersion = JSONSceneVersion[\"1_0\"];\nfunction getStandardJSONFromV0(json) {\n var _json_bins;\n currentVersion = JSONSceneVersion[\"1_0\"];\n var plugins = json.plugins || [];\n if ((_json_bins = json.bins) == null ? void 0 : _json_bins.length) {\n currentVersion = JSONSceneVersion[\"1_3\"];\n }\n var requires = (json.requires || []).slice();\n var images = json.images.map(function(img, index) {\n return getStandardImage(img, index, json.imageTags || []);\n });\n var textures = json.textures || images.map(function(img, i) {\n return {\n source: i,\n flipY: true\n };\n });\n var _json_playerVersion;\n var ret = {\n plugins: plugins,\n shapes: json.shapes || [],\n type: \"ge\",\n version: currentVersion,\n playerVersion: (_json_playerVersion = json.playerVersion) != null ? _json_playerVersion : {\n web: \"\",\n native: \"\"\n },\n compositionId: json.compositionId + \"\",\n compositions: json.compositions.map(function(comp) {\n return getStandardComposition(comp, {\n plugins: plugins,\n requires: requires\n });\n }),\n images: images,\n imgUsage: json._imgs,\n binUsage: json.binUsage,\n spines: json.spines,\n requires: json.requires,\n textures: textures,\n bins: (json.bins || []).slice()\n };\n if (json._textures) {\n ret._textures = json._textures;\n }\n return ret;\n}\nfunction getStandardImage(image, index, imageTags) {\n var renderLevel = imageTags[index];\n if (typeof image === \"string\") {\n return {\n id: generateGUID(),\n renderLevel: renderLevel,\n url: image\n };\n } else if (image.template) {\n return {\n id: generateGUID(),\n url: image.url,\n template: image.template,\n webp: image.webp,\n renderLevel: renderLevel\n };\n } else if (image.compressed) {\n return {\n id: generateGUID(),\n url: image.url,\n compressed: {\n astc: image.compressed.android,\n pvrtc: image.compressed.iOS\n },\n webp: image.webp,\n renderLevel: renderLevel\n };\n } else if (image.url) {\n return {\n id: generateGUID(),\n url: image.url,\n webp: image.webp,\n renderLevel: renderLevel\n };\n } else if (image && image.sourceType) {\n return image;\n }\n throw new Error(\"Invalid image type.\");\n}\nfunction getStandardComposition(composition, opt) {\n if (opt === void 0) opt = {};\n var _composition_meta;\n var ret = {\n id: composition.id + \"\",\n camera: _extends({\n clipMode: CAMERA_CLIP_MODE_NORMAL\n }, composition.camera),\n duration: composition.duration,\n endBehavior: composition.endBehavior,\n items: composition.items.map(function(item) {\n return getStandardItem(item, opt);\n }),\n name: composition.name\n };\n var startTime = composition.startTime || composition.st;\n if (startTime) {\n ret.startTime = startTime;\n }\n var previewSize = (_composition_meta = composition.meta) == null ? void 0 : _composition_meta.previewSize;\n if (previewSize && previewSize[0] === previewSize[1] && previewSize[0] === 0) {\n previewSize = undefined;\n }\n if (previewSize) {\n ret.previewSize = previewSize;\n }\n return ret;\n}\nvar tempQuat = [\n 0,\n 0,\n 0,\n 1\n];\nvar stdAnchor = 0.5;\nfunction getStandardItem(item, opt) {\n if (opt === void 0) opt = {};\n var _content_renderer;\n var type = ItemType.base;\n var transform;\n var originContent;\n var content;\n var endBehavior = item.endBehavior;\n var renderLevel;\n var pluginName;\n var duration = NaN;\n var pn;\n if (item.content) {\n type = item.type || ItemType.plugin;\n pn = item.pn;\n pluginName = item.pluginName;\n content = item.content;\n originContent = item.content;\n if (isNaN(pn) && !pluginName) {\n pluginName = content.options.type;\n }\n if (item.duration) {\n duration = item.duration;\n }\n transform = item.transform || getTransform(originContent.transform);\n } else if (item.particle) {\n type = ItemType.particle;\n originContent = item.particle;\n transform = getTransform(originContent.transform, reverseParticle, true);\n content = getStandardParticleContent(originContent);\n } else if (item.sprite) {\n type = ItemType.sprite;\n originContent = item.sprite;\n transform = getTransform(originContent.transform, false, true);\n content = getStandardSpriteContent(originContent, transform);\n } else if (item.cal) {\n type = ItemType.null;\n originContent = item.cal;\n transform = getTransform(originContent.transform, false, true);\n content = getStandardNullContent(originContent, transform);\n } else if (item.ui) {\n type = ItemType.interact;\n originContent = item.ui;\n transform = getTransform(originContent.transform);\n content = getStandardInteractContent(originContent);\n transform.scale = [\n originContent.options.width || 1,\n originContent.options.height || 1,\n 1\n ];\n } else if (item.model) {\n originContent = item.model;\n if (item.model.options.type === 1) {\n type = ItemType.camera;\n transform = getTransform(originContent.transform);\n content = getStandardCameraContent(originContent);\n }\n }\n if ((_content_renderer = content.renderer) == null ? void 0 : _content_renderer.anchor) {\n var anchor = new Float32Array(content.renderer.anchor);\n if (anchor[0] == stdAnchor && anchor[1] == stdAnchor) {\n delete content.renderer.anchor;\n } else if (opt.requires) {\n arrAdd(opt.requires, \"anchor\");\n }\n }\n if (originContent) {\n var _originContent_options;\n var looping = (_originContent_options = originContent.options) == null ? void 0 : _originContent_options.looping;\n if (looping) {\n if (Array.isArray(looping)) {\n endBehavior = looping[1] ? EndBehavior.restart : EndBehavior.destroy;\n } else {\n endBehavior = EndBehavior.restart;\n }\n } else {\n var _originContent_options1;\n endBehavior = endBehavior || (originContent == null ? void 0 : (_originContent_options1 = originContent.options) == null ? void 0 : _originContent_options1.endBehavior) || EndBehavior.destroy;\n }\n if (originContent.options.renderLevel) {\n renderLevel = originContent.options.renderLevel;\n }\n if (isNaN(duration)) {\n duration = originContent.options.duration;\n }\n }\n var ret = {\n type: type,\n name: item.name,\n delay: item.delay,\n duration: duration,\n id: item.id + \"\",\n // @ts-expect-error\n transform: transform,\n endBehavior: endBehavior,\n // @ts-expect-error\n renderLevel: renderLevel,\n content: content\n };\n // @ts-expect-error\n if (pluginName) {\n if (opt.plugins) {\n arrAdd(opt.plugins, pluginName);\n ret.pn = opt.plugins.indexOf(pluginName);\n } else {\n ret.pluginName = pluginName;\n }\n // @ts-expect-error\n } else if (Number.isInteger(pn)) {\n // @ts-expect-error\n ret.pn = pn;\n }\n if (item.parentId) {\n ret.parentId = item.parentId + \"\";\n }\n return ret;\n function getTransform(originTransform, inverseRotation, changeOrder) {\n if (originTransform) {\n var transform = {};\n var rotation = originTransform.rotation;\n if (rotation) {\n if (inverseRotation) {\n transform.rotation = [\n -rotation[0],\n -rotation[1],\n -rotation[2]\n ];\n } else {\n transform.rotation = [\n rotation[0],\n rotation[1],\n rotation[2]\n ];\n }\n if (changeOrder) {\n var q = quatFromXYZRotation(tempQuat, transform.rotation[0], transform.rotation[1], transform.rotation[2]);\n transform.rotation = rotationZYXFromQuat([], q);\n }\n }\n var position = originTransform.position;\n if (position) {\n transform.position = originTransform.position;\n }\n if (Array.isArray(originTransform.scale)) {\n transform.scale = [\n originTransform.scale[0] || 1,\n originTransform.scale[1] || 1,\n originTransform.scale[2] || 1\n ];\n }\n return transform;\n }\n return {};\n }\n}\n\nvar _obj$4;\n/**\n * 机型和渲染等级对应表\n *\n * 机型:B-低端机、A-中端机、S-高端机\n * 渲染等级:B-低、A-中、S-高、A+-中高、B+-全部\n *\n * - S(高端机):高、全部、中高\n * - A(中端机):中、全部、中高\n * - B(低端机):低、全部\n * - undefined(全部机型)\n */ var renderLevelPassSet = (_obj$4 = {}, _obj$4[RenderLevel.S] = [\n RenderLevel.S,\n RenderLevel.BPlus,\n RenderLevel.APlus\n], _obj$4[RenderLevel.A] = [\n RenderLevel.A,\n RenderLevel.BPlus,\n RenderLevel.APlus\n], _obj$4[RenderLevel.B] = [\n RenderLevel.B,\n RenderLevel.BPlus\n], _obj$4);\nfunction passRenderLevel(l, renderLevel) {\n if (!l || !renderLevel) {\n return true;\n }\n var arr = renderLevelPassSet[renderLevel];\n if (arr) {\n return arr.includes(l);\n }\n return false;\n}\n\nexports.Scene = void 0;\n(function(Scene) {\n function isJSONObject(scene) {\n return isObject(scene) && \"jsonScene\" in scene;\n }\n // JSON 对象\n Scene.isJSONObject = isJSONObject;\n function isURL(scene) {\n return isObject(scene) && \"url\" in scene;\n }\n Scene.isURL = isURL;\n function isWithOptions(scene) {\n return isObject(scene) && \"options\" in scene;\n }\n Scene.isWithOptions = isWithOptions;\n})(exports.Scene || (exports.Scene = {}));\n\nfunction getBackgroundImage(template, variables) {\n var templateBackground;\n var _template_background;\n var _ref = (_template_background = template == null ? void 0 : template.background) != null ? _template_background : {}, name = _ref.name, url = _ref.url;\n if (name) {\n if (variables && variables[name]) {\n templateBackground = variables[name];\n } else if (url) {\n templateBackground = url;\n }\n }\n return templateBackground;\n}\n/**\n * @param url\n * @param template\n * @param variables\n * @param options\n * @returns\n */ function combineImageTemplate(url, template, variables) {\n return _combineImageTemplate.apply(this, arguments);\n}\nfunction _combineImageTemplate() {\n _combineImageTemplate = _async_to_generator(function(url, template, variables) {\n var image, templateBackground;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!(typeof url === \"string\")) return [\n 3,\n 2\n ];\n return [\n 4,\n loadImage(url)\n ];\n case 1:\n image = _state.sent();\n return [\n 3,\n 3\n ];\n case 2:\n image = url;\n _state.label = 3;\n case 3:\n if (!image) {\n throw new Error(\"Image not provided.\");\n }\n if (!template) {\n return [\n 2,\n image\n ];\n }\n // 获取动态换图的图片对象或 url 地址\n templateBackground = getBackgroundImage(template, variables);\n if (templateBackground) {\n if (isString(templateBackground) && templateBackground !== image.src) {\n return [\n 2,\n loadImage(templateBackground)\n ];\n }\n if (_instanceof1(templateBackground, HTMLImageElement)) {\n return [\n 2,\n templateBackground\n ];\n }\n }\n return [\n 2,\n image\n ];\n }\n });\n });\n return _combineImageTemplate.apply(this, arguments);\n}\n\nvar seed$4 = 1;\n/**\n * 资源管理器\n * 用于加载和动效中所有的资源文件,包括图片、插件、图层粒子数据等\n */ var AssetManager = /*#__PURE__*/ function() {\n function AssetManager(options, downloader) {\n if (options === void 0) options = {};\n if (downloader === void 0) downloader = new Downloader();\n this.options = options;\n this.downloader = downloader;\n this.assets = {};\n this.sourceFrom = {};\n this.id = seed$4++;\n this.timers = [];\n this.updateOptions(options);\n }\n var _proto = AssetManager.prototype;\n _proto.updateOptions = function updateOptions(options) {\n if (options === void 0) options = {};\n this.options = options;\n if (!options.pluginData) {\n options.pluginData = {};\n }\n var _options_timeout = options.timeout, timeout = _options_timeout === void 0 ? 10 : _options_timeout;\n this.timeout = timeout;\n };\n /**\n * 场景创建,通过 json 创建出场景对象,并进行提前编译等工作\n * @param url - json 的 URL 链接或者 json 对象\n * @param renderer - renderer 对象,用于获取管理、编译 shader 及 GPU 上下文的参数\n * @param options - 扩展参数\n * @returns\n */ _proto.loadScene = function loadScene(url, renderer, options) {\n var _this = this;\n return _async_to_generator(function() {\n var rawJSON, assetUrl, startTime, timeInfoMessages, gpuInstance, _gpuInstance_detail_compressedTexture, compressedTexture, timeInfos, loadTimer, cancelLoading, waitPromise, hookTimeInfo, loadResourcePromise;\n return __generator(this, function(_state) {\n assetUrl = isString(url) ? url : _this.id;\n startTime = performance.now();\n timeInfoMessages = [];\n gpuInstance = renderer == null ? void 0 : renderer.engine.gpuCapability;\n compressedTexture = (_gpuInstance_detail_compressedTexture = gpuInstance == null ? void 0 : gpuInstance.detail.compressedTexture) != null ? _gpuInstance_detail_compressedTexture : exports.COMPRESSED_TEXTURE.NONE;\n timeInfos = {};\n cancelLoading = false;\n waitPromise = new Promise(function(resolve, reject) {\n loadTimer = window.setTimeout(function() {\n cancelLoading = true;\n _this.removeTimer(loadTimer);\n var totalTime = performance.now() - startTime;\n reject(new Error(\"Load time out: totalTime: \" + totalTime.toFixed(4) + \"ms \" + timeInfoMessages.join(\" \") + \", url: \" + assetUrl + \".\"));\n }, _this.timeout * 1000);\n _this.timers.push(loadTimer);\n });\n hookTimeInfo = /*#__PURE__*/ _async_to_generator(function(label, func) {\n var st, result, time, e;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!!cancelLoading) return [\n 3,\n 4\n ];\n st = performance.now();\n _state.label = 1;\n case 1:\n _state.trys.push([\n 1,\n 3,\n ,\n 4\n ]);\n return [\n 4,\n func()\n ];\n case 2:\n result = _state.sent();\n time = performance.now() - st;\n timeInfoMessages.push(\"[\" + label + \": \" + time.toFixed(2) + \"]\");\n timeInfos[label] = time;\n return [\n 2,\n result\n ];\n case 3:\n e = _state.sent();\n throw new Error(\"Load error in \" + label + \", \" + e + \".\");\n case 4:\n throw new Error(\"Load canceled.\");\n }\n });\n });\n loadResourcePromise = /*#__PURE__*/ _async_to_generator(function() {\n var scene, link, jsonScene, pluginSystem, loadedImages, images, _ref, jsonScene1, pluginSystem1, _jsonScene_bins, bins, images1, fonts, _ref1, loadedBins, loadedImages1, loadedTextures, totalTime;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!isString(url)) return [\n 3,\n 2\n ];\n // 兼容相对路径\n link = new URL(url, location.href).href;\n _this.baseUrl = link;\n return [\n 4,\n hookTimeInfo(\"loadJSON\", function() {\n return _this.loadJSON(link);\n })\n ];\n case 1:\n rawJSON = _state.sent();\n return [\n 3,\n 3\n ];\n case 2:\n // url 为 spec.JSONScene 或 Scene 对象\n rawJSON = url;\n _this.baseUrl = location.href;\n _state.label = 3;\n case 3:\n if (!exports.Scene.isJSONObject(rawJSON)) return [\n 3,\n 5\n ];\n // 已经加载过的 可能需要更新数据模板\n scene = _extends({}, rawJSON);\n jsonScene = scene.jsonScene, pluginSystem = scene.pluginSystem, loadedImages = scene.images;\n images = jsonScene.images;\n _this.assignImagesToAssets(images, loadedImages);\n return [\n 4,\n Promise.all([\n hookTimeInfo(\"plugin:processAssets\", function() {\n return _this.processPluginAssets(jsonScene, pluginSystem, options);\n })\n ])\n ];\n case 4:\n _state.sent();\n return [\n 3,\n 10\n ];\n case 5:\n return [\n 4,\n hookTimeInfo(\"processJSON\", function() {\n return _this.processJSON(rawJSON);\n })\n ];\n case 6:\n _ref = _state.sent(), jsonScene1 = _ref.jsonScene, pluginSystem1 = _ref.pluginSystem;\n _jsonScene_bins = jsonScene1.bins, bins = _jsonScene_bins === void 0 ? [] : _jsonScene_bins, images1 = jsonScene1.images, fonts = jsonScene1.fonts;\n return [\n 4,\n Promise.all([\n hookTimeInfo(\"processBins\", function() {\n return _this.processBins(bins);\n }),\n hookTimeInfo(\"processImages\", function() {\n return _this.processImages(images1, compressedTexture);\n }),\n hookTimeInfo(\"plugin:processAssets\", function() {\n return _this.processPluginAssets(jsonScene1, pluginSystem1, options);\n }),\n hookTimeInfo(\"processFontURL\", function() {\n return _this.processFontURL(fonts);\n })\n ])\n ];\n case 7:\n _ref1 = _state.sent(), loadedBins = _ref1[0], loadedImages1 = _ref1[1];\n return [\n 4,\n hookTimeInfo(\"processTextures\", function() {\n return _this.processTextures(loadedImages1, loadedBins, jsonScene1);\n })\n ];\n case 8:\n loadedTextures = _state.sent();\n scene = {\n timeInfos: timeInfos,\n url: url,\n renderLevel: _this.options.renderLevel,\n storage: {},\n pluginSystem: pluginSystem1,\n jsonScene: jsonScene1,\n bins: loadedBins,\n images: loadedImages1,\n textureOptions: loadedTextures\n };\n // 触发插件系统 pluginSystem 的回调 prepareResource\n return [\n 4,\n hookTimeInfo(\"plugin:prepareResource\", function() {\n return pluginSystem1.loadResources(scene, _this.options);\n })\n ];\n case 9:\n _state.sent();\n _state.label = 10;\n case 10:\n totalTime = performance.now() - startTime;\n logger.info(\"Load asset: totalTime: \" + totalTime.toFixed(4) + \"ms \" + timeInfoMessages.join(\" \") + \", url: \" + assetUrl + \".\");\n window.clearTimeout(loadTimer);\n _this.removeTimer(loadTimer);\n scene.totalTime = totalTime;\n scene.startTime = startTime;\n // 各部分分段时长\n scene.timeInfos = timeInfos;\n return [\n 2,\n scene\n ];\n }\n });\n });\n return [\n 2,\n Promise.race([\n waitPromise,\n loadResourcePromise()\n ])\n ];\n });\n })();\n };\n _proto.getAssets = function getAssets() {\n return this.assets;\n };\n _proto.processJSON = function processJSON(json) {\n var _this = this;\n return _async_to_generator(function() {\n var jsonScene, _jsonScene_plugins, plugins, pluginSystem;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n jsonScene = getStandardJSON(json);\n _jsonScene_plugins = jsonScene.plugins, plugins = _jsonScene_plugins === void 0 ? [] : _jsonScene_plugins;\n pluginSystem = new PluginSystem(plugins);\n return [\n 4,\n pluginSystem.processRawJSON(jsonScene, _this.options)\n ];\n case 1:\n _state.sent();\n return [\n 2,\n {\n jsonScene: jsonScene,\n pluginSystem: pluginSystem\n }\n ];\n }\n });\n })();\n };\n _proto.processBins = function processBins(bins) {\n var _this = this;\n return _async_to_generator(function() {\n var renderLevel, baseUrl, jobs;\n return __generator(this, function(_state) {\n renderLevel = _this.options.renderLevel;\n baseUrl = _this.baseUrl;\n jobs = bins.map(function(bin) {\n if (_instanceof1(bin, ArrayBuffer)) {\n return bin;\n }\n if (passRenderLevel(bin.renderLevel, renderLevel)) {\n return _this.loadBins(new URL(bin.url, baseUrl).href);\n }\n throw new Error(\"Invalid bins source: \" + JSON.stringify(bins) + \".\");\n });\n return [\n 2,\n Promise.all(jobs)\n ];\n });\n })();\n };\n _proto.processFontURL = function processFontURL(fonts) {\n var _this = this;\n return _async_to_generator(function() {\n var jobs;\n return __generator(this, function(_state) {\n // 对老数据的兼容\n if (!fonts) {\n return [\n 2\n ];\n }\n jobs = fonts.map(/*#__PURE__*/ _async_to_generator(function(font) {\n var url, _font_fontFamily, fontFace;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!(font.fontURL && !AssetManager.fontCache.has(font.fontFamily))) return [\n 3,\n 4\n ];\n if (!isValidFontFamily(font.fontFamily)) {\n // 在所有设备上提醒开发者\n console.warn(\"Risky font family: \" + font.fontFamily + \".\");\n }\n _state.label = 1;\n case 1:\n _state.trys.push([\n 1,\n 3,\n ,\n 4\n ]);\n url = new URL(font.fontURL, _this.baseUrl).href;\n fontFace = new FontFace((_font_fontFamily = font.fontFamily) != null ? _font_fontFamily : \"\", \"url(\" + url + \")\");\n return [\n 4,\n fontFace.load()\n ];\n case 2:\n _state.sent();\n document.fonts.add(fontFace);\n AssetManager.fontCache.add(font.fontFamily);\n return [\n 3,\n 4\n ];\n case 3:\n _state.sent();\n logger.warn(\"Invalid font family or font source: \" + JSON.stringify(font.fontURL) + \".\");\n return [\n 3,\n 4\n ];\n case 4:\n return [\n 2\n ];\n }\n });\n }));\n return [\n 2,\n Promise.all(jobs)\n ];\n });\n })();\n };\n _proto.processImages = function processImages(images, compressedTexture) {\n if (compressedTexture === void 0) compressedTexture = 0;\n var _this = this;\n return _async_to_generator(function() {\n var _this_options, useCompressedTexture, variables, disableWebP, disableAVIF, baseUrl, jobs, loadedImages;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n _this_options = _this.options, useCompressedTexture = _this_options.useCompressedTexture, variables = _this_options.variables, disableWebP = _this_options.disableWebP, disableAVIF = _this_options.disableAVIF;\n baseUrl = _this.baseUrl;\n jobs = images.map(/*#__PURE__*/ _async_to_generator(function(img, idx) {\n var png, webp, avif, imageURL, webpURL, avifURL, id, template, background, url, isVideo, loadFn, resultImage, e, compressed, src, bufferURL, _ref, url1, image, _tmp;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n png = img.url, webp = img.webp, avif = img.avif;\n // eslint-disable-next-line compat/compat\n imageURL = new URL(png, baseUrl).href;\n // eslint-disable-next-line compat/compat\n webpURL = !disableWebP && webp ? new URL(webp, baseUrl).href : undefined;\n // eslint-disable-next-line compat/compat\n avifURL = !disableAVIF && avif ? new URL(avif, baseUrl).href : undefined;\n id = img.id;\n if (!(\"template\" in img)) return [\n 3,\n 8\n ];\n // 1. 数据模板\n template = img.template;\n // 获取数据模板 background 参数\n background = template.background;\n if (!background) return [\n 3,\n 7\n ];\n url = getBackgroundImage(template, variables);\n isVideo = background.type === BackgroundType.video;\n // 根据背景类型确定加载函数\n loadFn = background && isVideo ? loadVideo : loadImage;\n _state.label = 1;\n case 1:\n _state.trys.push([\n 1,\n 6,\n ,\n 7\n ]);\n return [\n 4,\n loadMedia(url, loadFn)\n ];\n case 2:\n resultImage = _state.sent();\n if (!_instanceof1(resultImage, HTMLVideoElement)) return [\n 3,\n 3\n ];\n _this.sourceFrom[id] = {\n url: resultImage.src,\n type: exports.TextureSourceType.video\n };\n return [\n 2,\n resultImage\n ];\n case 3:\n // 如果是加载图片且是数组,设置变量,视频情况下不需要\n if (background && Array.isArray(url) && variables) {\n variables[background.name] = resultImage.src;\n }\n _this.sourceFrom[id] = {\n url: resultImage.src,\n type: exports.TextureSourceType.image\n };\n return [\n 4,\n combineImageTemplate(resultImage, template, variables)\n ];\n case 4:\n return [\n 2,\n _state.sent()\n ];\n case 5:\n return [\n 3,\n 7\n ];\n case 6:\n e = _state.sent();\n throw new Error(\"Failed to load. Check the template or if the URL is \" + (isVideo ? \"video\" : \"image\") + \" type, URL: \" + url + \", Error: \" + (e.message || e) + \".\");\n case 7:\n return [\n 3,\n 9\n ];\n case 8:\n if (\"compressed\" in img && useCompressedTexture && compressedTexture) {\n // 2. 压缩纹理\n compressed = img.compressed;\n if (compressedTexture === exports.COMPRESSED_TEXTURE.ASTC) {\n src = compressed.astc;\n } else if (compressedTexture === exports.COMPRESSED_TEXTURE.PVRTC) {\n src = compressed.pvrtc;\n }\n if (src) {\n bufferURL = new URL(src, baseUrl).href;\n _this.sourceFrom[id] = {\n url: bufferURL,\n type: exports.TextureSourceType.compressed\n };\n return [\n 2,\n _this.loadBins(bufferURL)\n ];\n }\n } else if (_instanceof1(img, HTMLImageElement) || _instanceof1(img, HTMLCanvasElement) || _instanceof1(img, HTMLVideoElement) || _instanceof1(img, Texture)) {\n return [\n 2,\n img\n ];\n }\n _state.label = 9;\n case 9:\n if (!avifURL) return [\n 3,\n 11\n ];\n return [\n 4,\n loadAVIFOptional(imageURL, avifURL)\n ];\n case 10:\n _tmp = _state.sent();\n return [\n 3,\n 13\n ];\n case 11:\n return [\n 4,\n loadWebPOptional(imageURL, webpURL)\n ];\n case 12:\n _tmp = _state.sent();\n _state.label = 13;\n case 13:\n _ref = _tmp, url1 = _ref.url, image = _ref.image;\n _this.sourceFrom[id] = {\n url: url1,\n type: exports.TextureSourceType.image\n };\n return [\n 2,\n image\n ];\n }\n });\n }));\n return [\n 4,\n Promise.all(jobs)\n ];\n case 1:\n loadedImages = _state.sent();\n _this.assignImagesToAssets(images, loadedImages);\n return [\n 2,\n loadedImages\n ];\n }\n });\n })();\n };\n _proto.processPluginAssets = function processPluginAssets(jsonScene, pluginSystem, options) {\n var _this = this;\n return _async_to_generator(function() {\n var pluginResult, _pluginResult_reduce, assets, loadedAssets, i;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n return [\n 4,\n pluginSystem.processAssets(jsonScene, options)\n ];\n case 1:\n pluginResult = _state.sent();\n _pluginResult_reduce = pluginResult.reduce(function(acc, cur) {\n acc.assets = acc.assets.concat(cur.assets);\n acc.loadedAssets = acc.loadedAssets.concat(cur.loadedAssets);\n return acc;\n }, {\n assets: [],\n loadedAssets: []\n }), assets = _pluginResult_reduce.assets, loadedAssets = _pluginResult_reduce.loadedAssets;\n for(i = 0; i < assets.length; i++){\n _this.assets[assets[i].id] = loadedAssets[i];\n }\n return [\n 2\n ];\n }\n });\n })();\n };\n _proto.processTextures = function processTextures(images, bins, jsonScene) {\n var _this = this;\n return _async_to_generator(function() {\n var _jsonScene_textures, textures, jobs;\n return __generator(this, function(_state) {\n textures = (_jsonScene_textures = jsonScene.textures) != null ? _jsonScene_textures : images.map(function(img, source) {\n return {\n source: source\n };\n });\n jobs = textures.map(/*#__PURE__*/ _async_to_generator(function(textureOptions, idx) {\n var e, source, id, image, imageId, texture;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (_instanceof1(textureOptions, Texture)) {\n return [\n 2,\n textureOptions\n ];\n }\n if (!(\"mipmaps\" in textureOptions)) return [\n 3,\n 4\n ];\n _state.label = 1;\n case 1:\n _state.trys.push([\n 1,\n 3,\n ,\n 4\n ]);\n return [\n 4,\n deserializeMipmapTexture(textureOptions, bins, _this.assets, jsonScene.bins)\n ];\n case 2:\n return [\n 2,\n _state.sent()\n ];\n case 3:\n e = _state.sent();\n throw new Error(\"Load texture \" + idx + \" fails, error message: \" + e + \".\");\n case 4:\n source = textureOptions.source, id = textureOptions.id;\n imageId = \"\";\n if (!isObject(source)) return [\n 3,\n 5\n ];\n image = _this.assets[source.id];\n imageId = source.id;\n return [\n 3,\n 7\n ];\n case 5:\n if (!(typeof source === \"string\")) return [\n 3,\n 7\n ];\n return [\n 4,\n loadImage(base64ToFile(source))\n ];\n case 6:\n image = _state.sent();\n _state.label = 7;\n case 7:\n if (image) {\n texture = createTextureOptionsBySource(image, _this.sourceFrom[imageId], id);\n return [\n 2,\n texture.sourceType === exports.TextureSourceType.compressed ? texture : _extends({}, texture, textureOptions)\n ];\n }\n throw new Error(\"Invalid texture source: \" + source + \".\");\n }\n });\n }));\n return [\n 2,\n Promise.all(jobs)\n ];\n });\n })();\n };\n _proto.loadJSON = function loadJSON(url) {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n new Promise(function(resolve, reject) {\n _this.downloader.downloadJSON(url, resolve, function(status, responseText) {\n reject(\"Couldn't load JSON \" + JSON.stringify(url) + \": status \" + status + \", \" + responseText);\n });\n })\n ];\n });\n })();\n };\n _proto.loadBins = function loadBins(url) {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n return [\n 2,\n new Promise(function(resolve, reject) {\n _this.downloader.downloadBinary(url, resolve, function(status, responseText) {\n reject(\"Couldn't load bins \" + JSON.stringify(url) + \": status \" + status + \", \" + responseText);\n });\n })\n ];\n });\n })();\n };\n _proto.assignImagesToAssets = function assignImagesToAssets(images, loadedImages) {\n for(var i = 0; i < images.length; i++){\n this.assets[images[i].id] = loadedImages[i];\n }\n };\n _proto.removeTimer = function removeTimer(id) {\n var index = this.timers.indexOf(id);\n if (index !== -1) {\n this.timers.splice(index, 1);\n }\n };\n /**\n * 销毁方法\n */ _proto.dispose = function dispose() {\n if (this.timers.length) {\n this.timers.map(function(id) {\n return window.clearTimeout(id);\n });\n }\n this.assets = {};\n this.sourceFrom = {};\n this.timers = [];\n };\n return AssetManager;\n}();\n/**\n * 自定义文本缓存,随页面销毁而销毁\n */ AssetManager.fontCache = new Set();\nfunction createTextureOptionsBySource(image, sourceFrom, id) {\n var options = {\n id: id,\n dataType: DataType.Texture\n };\n if (_instanceof1(image, Texture)) {\n return _extends({}, image.source, options);\n } else if (_instanceof1(image, HTMLImageElement) || isCanvas(image)) {\n return _extends({\n image: image,\n sourceType: exports.TextureSourceType.image,\n sourceFrom: sourceFrom,\n keepImageSource: true,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR\n }, options);\n } else if (_instanceof1(image, HTMLVideoElement)) {\n // 视频\n return _extends({\n sourceType: exports.TextureSourceType.video,\n video: image,\n minFilter: glContext.LINEAR,\n magFilter: glContext.LINEAR\n }, options);\n } else if (_instanceof1(image, ArrayBuffer)) {\n // 压缩纹理\n return _extends({}, getKTXTextureOptions(image), {\n sourceFrom: sourceFrom\n }, options);\n } else if (\"width\" in image && \"height\" in image && \"data\" in image) {\n return _extends({\n sourceType: exports.TextureSourceType.data,\n data: image,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n minFilter: glContext.NEAREST,\n magFilter: glContext.NEAREST\n }, options);\n }\n throw new Error(\"Invalid texture options.\");\n}\n\n/**\n *\n */ var AssetService = /*#__PURE__*/ function() {\n function AssetService(engine) {\n this.engine = engine;\n this.builtinObjects = [];\n this.builtinObjects.push(generateWhiteTexture(engine));\n }\n var _proto = AssetService.prototype;\n /**\n * @param url\n * @param options\n * @returns\n */ _proto.assembleSceneLoadOptions = function assembleSceneLoadOptions(url, options) {\n if (options === void 0) options = {};\n var source = url;\n // 加载多个合成链接并各自设置可选参数\n if (exports.Scene.isURL(url)) {\n if (!exports.Scene.isJSONObject(url)) {\n source = url.url;\n }\n if (exports.Scene.isWithOptions(url)) {\n options = _extends({}, options, url.options);\n }\n }\n return {\n source: source,\n options: options\n };\n };\n /**\n * 根据用户参数修改文本元素的原始数据\n * @param scene\n * @param options\n */ _proto.updateTextVariables = function updateTextVariables(scene, variables) {\n var _this = this;\n if (variables === void 0) variables = {};\n scene.jsonScene.items.forEach(function(item) {\n if (item.type === ItemType.text || item.type === ItemType.richtext) {\n var textVariable = variables[item.name];\n if (!textVariable) {\n return;\n }\n item.components.forEach(function(param) {\n var id = param.id;\n var componentData = _this.engine.findEffectsObjectData(id);\n if ((componentData == null ? void 0 : componentData.dataType) === DataType.TextComponent || (componentData == null ? void 0 : componentData.dataType) === DataType.RichTextComponent) {\n componentData.options.text = textVariable;\n }\n });\n }\n });\n };\n _proto.initializeTexture = function initializeTexture(scene) {\n for(var i = 0; i < scene.textureOptions.length; i++){\n var textureOptions = scene.textureOptions[i];\n if (_instanceof1(textureOptions, Texture)) {\n this.engine.addInstance(textureOptions);\n } else {\n textureOptions = this.engine.findObject({\n id: scene.textureOptions[i].id\n });\n scene.textureOptions[i] = textureOptions;\n }\n textureOptions.initialize();\n }\n };\n _proto.prepareAssets = function prepareAssets(scene, assets) {\n this.engine.clearResources();\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(assets)), _step; !(_step = _iterator()).done;){\n var assetId = _step.value;\n var asset = assets[assetId];\n var engineAsset = new Asset(this.engine);\n engineAsset.data = asset;\n engineAsset.setInstanceId(assetId);\n }\n // 加入 json 资产数据\n this.engine.addPackageDatas(scene);\n // 加入内置引擎对象\n for(var _iterator1 = _create_for_of_iterator_helper_loose(this.builtinObjects), _step1; !(_step1 = _iterator1()).done;){\n var effectsObject = _step1.value;\n this.engine.addInstance(effectsObject);\n }\n };\n // TODO Material 单独存表, 加速查询\n _proto.createShaderVariant = function createShaderVariant() {\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(this.engine.objectInstance)), _step; !(_step = _iterator()).done;){\n var guid = _step.value;\n var effectsObject = this.engine.objectInstance[guid];\n if (_instanceof1(effectsObject, Material)) {\n effectsObject.createShaderVariant();\n }\n }\n };\n _proto.destroyBuiltinObjects = function destroyBuiltinObjects() {\n for(var _iterator = _create_for_of_iterator_helper_loose(this.builtinObjects), _step; !(_step = _iterator()).done;){\n var effectsObject = _step.value;\n effectsObject.dispose();\n }\n this.builtinObjects.length = 0;\n };\n /**\n *\n */ _proto.dispose = function dispose() {\n this.destroyBuiltinObjects();\n // Optionally remove references from engine if any\n };\n return AssetService;\n}();\n\nvar SIZEOF_SHORT = 2;\nvar SIZEOF_INT = 4;\nvar FILE_IDENTIFIER_LENGTH = 4;\nvar SIZE_PREFIX_LENGTH = 4;\n\nvar int32 = new Int32Array(2);\nvar float32 = new Float32Array(int32.buffer);\nvar float64 = new Float64Array(int32.buffer);\nvar isLittleEndian = new Uint16Array(new Uint8Array([\n 1,\n 0\n]).buffer)[0] === 1;\n\nvar Encoding;\n(function(Encoding) {\n Encoding[Encoding[\"UTF8_BYTES\"] = 1] = \"UTF8_BYTES\";\n Encoding[Encoding[\"UTF16_STRING\"] = 2] = \"UTF16_STRING\";\n})(Encoding || (Encoding = {}));\n\nvar ByteBuffer = /*#__PURE__*/ function() {\n function ByteBuffer(bytes_) {\n this.bytes_ = bytes_;\n this.position_ = 0;\n this.text_decoder_ = new TextDecoder();\n }\n var _proto = ByteBuffer.prototype;\n _proto.clear = function clear() {\n this.position_ = 0;\n };\n /**\n * Get the underlying `Uint8Array`.\n */ _proto.bytes = function bytes() {\n return this.bytes_;\n };\n /**\n * Get the buffer's position.\n */ _proto.position = function position() {\n return this.position_;\n };\n /**\n * Set the buffer's position.\n */ _proto.setPosition = function setPosition(position) {\n this.position_ = position;\n };\n /**\n * Get the buffer's capacity.\n */ _proto.capacity = function capacity() {\n return this.bytes_.length;\n };\n _proto.readInt8 = function readInt8(offset) {\n return this.readUint8(offset) << 24 >> 24;\n };\n _proto.readUint8 = function readUint8(offset) {\n return this.bytes_[offset];\n };\n _proto.readInt16 = function readInt16(offset) {\n return this.readUint16(offset) << 16 >> 16;\n };\n _proto.readUint16 = function readUint16(offset) {\n return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n };\n _proto.readInt32 = function readInt32(offset) {\n return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n };\n _proto.readUint32 = function readUint32(offset) {\n return this.readInt32(offset) >>> 0;\n };\n _proto.readInt64 = function readInt64(offset) {\n return BigInt.asIntN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32)));\n };\n _proto.readUint64 = function readUint64(offset) {\n return BigInt.asUintN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32)));\n };\n _proto.readFloat32 = function readFloat32(offset) {\n int32[0] = this.readInt32(offset);\n return float32[0];\n };\n _proto.readFloat64 = function readFloat64(offset) {\n int32[isLittleEndian ? 0 : 1] = this.readInt32(offset);\n int32[isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n return float64[0];\n };\n _proto.writeInt8 = function writeInt8(offset, value) {\n this.bytes_[offset] = value;\n };\n _proto.writeUint8 = function writeUint8(offset, value) {\n this.bytes_[offset] = value;\n };\n _proto.writeInt16 = function writeInt16(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n };\n _proto.writeUint16 = function writeUint16(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n };\n _proto.writeInt32 = function writeInt32(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n this.bytes_[offset + 2] = value >> 16;\n this.bytes_[offset + 3] = value >> 24;\n };\n _proto.writeUint32 = function writeUint32(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n this.bytes_[offset + 2] = value >> 16;\n this.bytes_[offset + 3] = value >> 24;\n };\n _proto.writeInt64 = function writeInt64(offset, value) {\n this.writeInt32(offset, Number(BigInt.asIntN(32, value)));\n this.writeInt32(offset + 4, Number(BigInt.asIntN(32, value >> BigInt(32))));\n };\n _proto.writeUint64 = function writeUint64(offset, value) {\n this.writeUint32(offset, Number(BigInt.asUintN(32, value)));\n this.writeUint32(offset + 4, Number(BigInt.asUintN(32, value >> BigInt(32))));\n };\n _proto.writeFloat32 = function writeFloat32(offset, value) {\n float32[0] = value;\n this.writeInt32(offset, int32[0]);\n };\n _proto.writeFloat64 = function writeFloat64(offset, value) {\n float64[0] = value;\n this.writeInt32(offset, int32[isLittleEndian ? 0 : 1]);\n this.writeInt32(offset + 4, int32[isLittleEndian ? 1 : 0]);\n };\n /**\n * Return the file identifier. Behavior is undefined for FlatBuffers whose\n * schema does not include a file_identifier (likely points at padding or the\n * start of a the root vtable).\n */ _proto.getBufferIdentifier = function getBufferIdentifier() {\n if (this.bytes_.length < this.position_ + SIZEOF_INT + FILE_IDENTIFIER_LENGTH) {\n throw new Error(\"FlatBuffers: ByteBuffer is too short to contain an identifier.\");\n }\n var result = \"\";\n for(var i = 0; i < FILE_IDENTIFIER_LENGTH; i++){\n result += String.fromCharCode(this.readInt8(this.position_ + SIZEOF_INT + i));\n }\n return result;\n };\n /**\n * Look up a field in the vtable, return an offset into the object, or 0 if the\n * field is not present.\n */ _proto.__offset = function __offset(bb_pos, vtable_offset) {\n var vtable = bb_pos - this.readInt32(bb_pos);\n return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n };\n /**\n * Initialize any Table-derived type to point to the union at the given offset.\n */ _proto.__union = function __union(t, offset) {\n t.bb_pos = offset + this.readInt32(offset);\n t.bb = this;\n return t;\n };\n /**\n * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n * This allocates a new string and converts to wide chars upon each access.\n *\n * To avoid the conversion to string, pass Encoding.UTF8_BYTES as the\n * \"optionalEncoding\" argument. This is useful for avoiding conversion when\n * the data will just be packaged back up in another FlatBuffer later on.\n *\n * @param offset\n * @param opt_encoding Defaults to UTF16_STRING\n */ _proto.__string = function __string(offset, opt_encoding) {\n offset += this.readInt32(offset);\n var length = this.readInt32(offset);\n offset += SIZEOF_INT;\n var utf8bytes = this.bytes_.subarray(offset, offset + length);\n if (opt_encoding === Encoding.UTF8_BYTES) return utf8bytes;\n else return this.text_decoder_.decode(utf8bytes);\n };\n /**\n * Handle unions that can contain string as its member, if a Table-derived type then initialize it,\n * if a string then return a new one\n *\n * WARNING: strings are immutable in JS so we can't change the string that the user gave us, this\n * makes the behaviour of __union_with_string different compared to __union\n */ _proto.__union_with_string = function __union_with_string(o, offset) {\n if (typeof o === \"string\") {\n return this.__string(offset);\n }\n return this.__union(o, offset);\n };\n /**\n * Retrieve the relative offset stored at \"offset\"\n */ _proto.__indirect = function __indirect(offset) {\n return offset + this.readInt32(offset);\n };\n /**\n * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n */ _proto.__vector = function __vector(offset) {\n return offset + this.readInt32(offset) + SIZEOF_INT; // data starts after the length\n };\n /**\n * Get the length of a vector whose offset is stored at \"offset\" in this object.\n */ _proto.__vector_len = function __vector_len(offset) {\n return this.readInt32(offset + this.readInt32(offset));\n };\n _proto.__has_identifier = function __has_identifier(ident) {\n if (ident.length != FILE_IDENTIFIER_LENGTH) {\n throw new Error(\"FlatBuffers: file identifier must be length \" + FILE_IDENTIFIER_LENGTH);\n }\n for(var i = 0; i < FILE_IDENTIFIER_LENGTH; i++){\n if (ident.charCodeAt(i) != this.readInt8(this.position() + SIZEOF_INT + i)) {\n return false;\n }\n }\n return true;\n };\n /**\n * A helper function for generating list for obj api\n */ _proto.createScalarList = function createScalarList(listAccessor, listLength) {\n var ret = [];\n for(var i = 0; i < listLength; ++i){\n var val = listAccessor(i);\n if (val !== null) {\n ret.push(val);\n }\n }\n return ret;\n };\n /**\n * A helper function for generating list for obj api\n * @param listAccessor function that accepts an index and return data at that index\n * @param listLength listLength\n * @param res result list\n */ _proto.createObjList = function createObjList(listAccessor, listLength) {\n var ret = [];\n for(var i = 0; i < listLength; ++i){\n var val = listAccessor(i);\n if (val !== null) {\n ret.push(val.unpack());\n }\n }\n return ret;\n };\n /**\n * Create and allocate a new ByteBuffer with a given size.\n */ ByteBuffer.allocate = function allocate(byte_size) {\n return new ByteBuffer(new Uint8Array(byte_size));\n };\n return ByteBuffer;\n}();\n\nvar Builder = /*#__PURE__*/ function() {\n function Builder(opt_initial_size) {\n /** Minimum alignment encountered so far. */ this.minalign = 1;\n /** The vtable for the current table. */ this.vtable = null;\n /** The amount of fields we're actually using. */ this.vtable_in_use = 0;\n /** Whether we are currently serializing a table. */ this.isNested = false;\n /** Starting offset of the current struct/table. */ this.object_start = 0;\n /** List of offsets of all vtables. */ this.vtables = [];\n /** For the current vector being built. */ this.vector_num_elems = 0;\n /** False omits default values from the serialized data */ this.force_defaults = false;\n this.string_maps = null;\n this.text_encoder = new TextEncoder();\n var initial_size;\n if (!opt_initial_size) {\n initial_size = 1024;\n } else {\n initial_size = opt_initial_size;\n }\n /**\n * @type {ByteBuffer}\n * @private\n */ this.bb = ByteBuffer.allocate(initial_size);\n this.space = initial_size;\n }\n var _proto = Builder.prototype;\n _proto.clear = function clear() {\n this.bb.clear();\n this.space = this.bb.capacity();\n this.minalign = 1;\n this.vtable = null;\n this.vtable_in_use = 0;\n this.isNested = false;\n this.object_start = 0;\n this.vtables = [];\n this.vector_num_elems = 0;\n this.force_defaults = false;\n this.string_maps = null;\n };\n /**\n * In order to save space, fields that are set to their default value\n * don't get serialized into the buffer. Forcing defaults provides a\n * way to manually disable this optimization.\n *\n * @param forceDefaults true always serializes default values\n */ _proto.forceDefaults = function forceDefaults(forceDefaults) {\n this.force_defaults = forceDefaults;\n };\n /**\n * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n * called finish(). The actual data starts at the ByteBuffer's current position,\n * not necessarily at 0.\n */ _proto.dataBuffer = function dataBuffer() {\n return this.bb;\n };\n /**\n * Get the bytes representing the FlatBuffer. Only call this after you've\n * called finish().\n */ _proto.asUint8Array = function asUint8Array() {\n return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n };\n /**\n * Prepare to write an element of `size` after `additional_bytes` have been\n * written, e.g. if you write a string, you need to align such the int length\n * field is aligned to 4 bytes, and the string data follows it directly. If all\n * you need to do is alignment, `additional_bytes` will be 0.\n *\n * @param size This is the of the new element to write\n * @param additional_bytes The padding size\n */ _proto.prep = function prep(size, additional_bytes) {\n // Track the biggest thing we've ever aligned to.\n if (size > this.minalign) {\n this.minalign = size;\n }\n // Find the amount of alignment needed such that `size` is properly\n // aligned after `additional_bytes`\n var align_size = ~(this.bb.capacity() - this.space + additional_bytes) + 1 & size - 1;\n // Reallocate the buffer if needed.\n while(this.space < align_size + size + additional_bytes){\n var old_buf_size = this.bb.capacity();\n this.bb = Builder.growByteBuffer(this.bb);\n this.space += this.bb.capacity() - old_buf_size;\n }\n this.pad(align_size);\n };\n _proto.pad = function pad(byte_size) {\n for(var i = 0; i < byte_size; i++){\n this.bb.writeInt8(--this.space, 0);\n }\n };\n _proto.writeInt8 = function writeInt8(value) {\n this.bb.writeInt8(this.space -= 1, value);\n };\n _proto.writeInt16 = function writeInt16(value) {\n this.bb.writeInt16(this.space -= 2, value);\n };\n _proto.writeInt32 = function writeInt32(value) {\n this.bb.writeInt32(this.space -= 4, value);\n };\n _proto.writeInt64 = function writeInt64(value) {\n this.bb.writeInt64(this.space -= 8, value);\n };\n _proto.writeFloat32 = function writeFloat32(value) {\n this.bb.writeFloat32(this.space -= 4, value);\n };\n _proto.writeFloat64 = function writeFloat64(value) {\n this.bb.writeFloat64(this.space -= 8, value);\n };\n /**\n * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param value The `int8` to add the buffer.\n */ _proto.addInt8 = function addInt8(value) {\n this.prep(1, 0);\n this.writeInt8(value);\n };\n /**\n * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param value The `int16` to add the buffer.\n */ _proto.addInt16 = function addInt16(value) {\n this.prep(2, 0);\n this.writeInt16(value);\n };\n /**\n * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param value The `int32` to add the buffer.\n */ _proto.addInt32 = function addInt32(value) {\n this.prep(4, 0);\n this.writeInt32(value);\n };\n /**\n * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param value The `int64` to add the buffer.\n */ _proto.addInt64 = function addInt64(value) {\n this.prep(8, 0);\n this.writeInt64(value);\n };\n /**\n * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param value The `float32` to add the buffer.\n */ _proto.addFloat32 = function addFloat32(value) {\n this.prep(4, 0);\n this.writeFloat32(value);\n };\n /**\n * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param value The `float64` to add the buffer.\n */ _proto.addFloat64 = function addFloat64(value) {\n this.prep(8, 0);\n this.writeFloat64(value);\n };\n _proto.addFieldInt8 = function addFieldInt8(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt8(value);\n this.slot(voffset);\n }\n };\n _proto.addFieldInt16 = function addFieldInt16(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt16(value);\n this.slot(voffset);\n }\n };\n _proto.addFieldInt32 = function addFieldInt32(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt32(value);\n this.slot(voffset);\n }\n };\n _proto.addFieldInt64 = function addFieldInt64(voffset, value, defaultValue) {\n if (this.force_defaults || value !== defaultValue) {\n this.addInt64(value);\n this.slot(voffset);\n }\n };\n _proto.addFieldFloat32 = function addFieldFloat32(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addFloat32(value);\n this.slot(voffset);\n }\n };\n _proto.addFieldFloat64 = function addFieldFloat64(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addFloat64(value);\n this.slot(voffset);\n }\n };\n _proto.addFieldOffset = function addFieldOffset(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addOffset(value);\n this.slot(voffset);\n }\n };\n /**\n * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n */ _proto.addFieldStruct = function addFieldStruct(voffset, value, defaultValue) {\n if (value != defaultValue) {\n this.nested(value);\n this.slot(voffset);\n }\n };\n /**\n * Structures are always stored inline, they need to be created right\n * where they're used. You'll get this assertion failure if you\n * created it elsewhere.\n */ _proto.nested = function nested(obj) {\n if (obj != this.offset()) {\n throw new TypeError(\"FlatBuffers: struct must be serialized inline.\");\n }\n };\n /**\n * Should not be creating any other object, string or vector\n * while an object is being constructed\n */ _proto.notNested = function notNested() {\n if (this.isNested) {\n throw new TypeError(\"FlatBuffers: object serialization must not be nested.\");\n }\n };\n /**\n * Set the current vtable at `voffset` to the current location in the buffer.\n */ _proto.slot = function slot(voffset) {\n if (this.vtable !== null) this.vtable[voffset] = this.offset();\n };\n /**\n * @returns Offset relative to the end of the buffer.\n */ _proto.offset = function offset() {\n return this.bb.capacity() - this.space;\n };\n /**\n * Adds on offset, relative to where it will be written.\n *\n * @param offset The offset to add.\n */ _proto.addOffset = function addOffset(offset) {\n this.prep(SIZEOF_INT, 0); // Ensure alignment is already done.\n this.writeInt32(this.offset() - offset + SIZEOF_INT);\n };\n /**\n * Start encoding a new object in the buffer. Users will not usually need to\n * call this directly. The FlatBuffers compiler will generate helper methods\n * that call this method internally.\n */ _proto.startObject = function startObject(numfields) {\n this.notNested();\n if (this.vtable == null) {\n this.vtable = [];\n }\n this.vtable_in_use = numfields;\n for(var i = 0; i < numfields; i++){\n this.vtable[i] = 0; // This will push additional elements as needed\n }\n this.isNested = true;\n this.object_start = this.offset();\n };\n /**\n * Finish off writing the object that is under construction.\n *\n * @returns The offset to the object inside `dataBuffer`\n */ _proto.endObject = function endObject() {\n if (this.vtable == null || !this.isNested) {\n throw new Error(\"FlatBuffers: endObject called without startObject\");\n }\n this.addInt32(0);\n var vtableloc = this.offset();\n // Trim trailing zeroes.\n var i = this.vtable_in_use - 1;\n // eslint-disable-next-line no-empty\n for(; i >= 0 && this.vtable[i] == 0; i--){}\n var trimmed_size = i + 1;\n // Write out the current vtable.\n for(; i >= 0; i--){\n // Offset relative to the start of the table.\n this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n }\n var standard_fields = 2; // The fields below:\n this.addInt16(vtableloc - this.object_start);\n var len = (trimmed_size + standard_fields) * SIZEOF_SHORT;\n this.addInt16(len);\n // Search for an existing vtable that matches the current one.\n var existing_vtable = 0;\n var vt1 = this.space;\n outer_loop: for(i = 0; i < this.vtables.length; i++){\n var vt2 = this.bb.capacity() - this.vtables[i];\n if (len == this.bb.readInt16(vt2)) {\n for(var j = SIZEOF_SHORT; j < len; j += SIZEOF_SHORT){\n if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n continue outer_loop;\n }\n }\n existing_vtable = this.vtables[i];\n break;\n }\n }\n if (existing_vtable) {\n // Found a match:\n // Remove the current vtable.\n this.space = this.bb.capacity() - vtableloc;\n // Point table to existing vtable.\n this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n } else {\n // No match:\n // Add the location of the current vtable to the list of vtables.\n this.vtables.push(this.offset());\n // Point table to current vtable.\n this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n }\n this.isNested = false;\n return vtableloc;\n };\n /**\n * Finalize a buffer, poiting to the given `root_table`.\n */ _proto.finish = function finish(root_table, opt_file_identifier, opt_size_prefix) {\n var size_prefix = opt_size_prefix ? SIZE_PREFIX_LENGTH : 0;\n if (opt_file_identifier) {\n var file_identifier = opt_file_identifier;\n this.prep(this.minalign, SIZEOF_INT + FILE_IDENTIFIER_LENGTH + size_prefix);\n if (file_identifier.length != FILE_IDENTIFIER_LENGTH) {\n throw new TypeError(\"FlatBuffers: file identifier must be length \" + FILE_IDENTIFIER_LENGTH);\n }\n for(var i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--){\n this.writeInt8(file_identifier.charCodeAt(i));\n }\n }\n this.prep(this.minalign, SIZEOF_INT + size_prefix);\n this.addOffset(root_table);\n if (size_prefix) {\n this.addInt32(this.bb.capacity() - this.space);\n }\n this.bb.setPosition(this.space);\n };\n /**\n * Finalize a size prefixed buffer, pointing to the given `root_table`.\n */ _proto.finishSizePrefixed = function finishSizePrefixed(root_table, opt_file_identifier) {\n this.finish(root_table, opt_file_identifier, true);\n };\n /**\n * This checks a required field has been set in a given table that has\n * just been constructed.\n */ _proto.requiredField = function requiredField(table, field) {\n var table_start = this.bb.capacity() - table;\n var vtable_start = table_start - this.bb.readInt32(table_start);\n var ok = field < this.bb.readInt16(vtable_start) && this.bb.readInt16(vtable_start + field) != 0;\n // If this fails, the caller will show what field needs to be set.\n if (!ok) {\n throw new TypeError(\"FlatBuffers: field \" + field + \" must be set\");\n }\n };\n /**\n * Start a new array/vector of objects. Users usually will not call\n * this directly. The FlatBuffers compiler will create a start/end\n * method for vector types in generated code.\n *\n * @param elem_size The size of each element in the array\n * @param num_elems The number of elements in the array\n * @param alignment The alignment of the array\n */ _proto.startVector = function startVector(elem_size, num_elems, alignment) {\n this.notNested();\n this.vector_num_elems = num_elems;\n this.prep(SIZEOF_INT, elem_size * num_elems);\n this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n };\n /**\n * Finish off the creation of an array and all its elements. The array must be\n * created with `startVector`.\n *\n * @returns The offset at which the newly created array\n * starts.\n */ _proto.endVector = function endVector() {\n this.writeInt32(this.vector_num_elems);\n return this.offset();\n };\n /**\n * Encode the string `s` in the buffer using UTF-8. If the string passed has\n * already been seen, we return the offset of the already written string\n *\n * @param s The string to encode\n * @return The offset in the buffer where the encoded string starts\n */ _proto.createSharedString = function createSharedString(s) {\n if (!s) {\n return 0;\n }\n if (!this.string_maps) {\n this.string_maps = new Map();\n }\n if (this.string_maps.has(s)) {\n return this.string_maps.get(s);\n }\n var offset = this.createString(s);\n this.string_maps.set(s, offset);\n return offset;\n };\n /**\n * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n *\n * @param s The string to encode\n * @return The offset in the buffer where the encoded string starts\n */ _proto.createString = function createString(s) {\n if (s === null || s === undefined) {\n return 0;\n }\n var utf8;\n if (_instanceof1(s, Uint8Array)) {\n utf8 = s;\n } else {\n utf8 = this.text_encoder.encode(s);\n }\n this.addInt8(0);\n this.startVector(1, utf8.length, 1);\n this.bb.setPosition(this.space -= utf8.length);\n this.bb.bytes().set(utf8, this.space);\n return this.endVector();\n };\n /**\n * Create a byte vector.\n *\n * @param v The bytes to add\n * @returns The offset in the buffer where the byte vector starts\n */ _proto.createByteVector = function createByteVector(v) {\n if (v === null || v === undefined) {\n return 0;\n }\n this.startVector(1, v.length, 1);\n this.bb.setPosition(this.space -= v.length);\n this.bb.bytes().set(v, this.space);\n return this.endVector();\n };\n /**\n * A helper function to pack an object\n *\n * @returns offset of obj\n */ _proto.createObjectOffset = function createObjectOffset(obj) {\n if (obj === null) {\n return 0;\n }\n if (typeof obj === \"string\") {\n return this.createString(obj);\n } else {\n return obj.pack(this);\n }\n };\n /**\n * A helper function to pack a list of object\n *\n * @returns list of offsets of each non null object\n */ _proto.createObjectOffsetList = function createObjectOffsetList(list) {\n var ret = [];\n for(var i = 0; i < list.length; ++i){\n var val = list[i];\n if (val !== null) {\n ret.push(this.createObjectOffset(val));\n } else {\n throw new TypeError(\"FlatBuffers: Argument for createObjectOffsetList cannot contain null.\");\n }\n }\n return ret;\n };\n _proto.createStructOffsetList = function createStructOffsetList(list, startFunc) {\n startFunc(this, list.length);\n this.createObjectOffsetList(list.slice().reverse());\n return this.endVector();\n };\n /**\n * Doubles the size of the backing ByteBuffer and copies the old data towards\n * the end of the new buffer (since we build the buffer backwards).\n *\n * @param bb The current buffer with the existing data\n * @returns A new byte buffer with the old data copied\n * to it. The data is located at the end of the buffer.\n *\n * uint8Array.set() formally takes {Array|ArrayBufferView}, so to pass\n * it a uint8Array we need to suppress the type check:\n * @suppress {checkTypes}\n */ Builder.growByteBuffer = function growByteBuffer(bb) {\n var old_buf_size = bb.capacity();\n // Ensure we don't grow beyond what fits in an int.\n if (old_buf_size & 0xC0000000) {\n throw new Error(\"FlatBuffers: cannot grow buffer beyond 2 gigabytes.\");\n }\n var new_buf_size = old_buf_size << 1;\n var nbb = ByteBuffer.allocate(new_buf_size);\n nbb.setPosition(new_buf_size - old_buf_size);\n nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n return nbb;\n };\n return Builder;\n}();\n\n// automatically generated by the FlatBuffers compiler, do not modify\nvar FBEffectsObjectData = /*#__PURE__*/ function() {\n function FBEffectsObjectData() {\n this.bb = null;\n this.bb_pos = 0;\n }\n var _proto = FBEffectsObjectData.prototype;\n _proto.__init = function __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n };\n _proto.dataType = function dataType(optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n };\n _proto.data = function data(index) {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n };\n _proto.dataLength = function dataLength() {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.dataArray = function dataArray() {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n };\n _proto.unpack = function unpack() {\n return new FBEffectsObjectDataT(this.dataType(), this.bb.createScalarList(this.data.bind(this), this.dataLength()));\n };\n _proto.unpackTo = function unpackTo(_o) {\n _o.dataType = this.dataType();\n _o.data = this.bb.createScalarList(this.data.bind(this), this.dataLength());\n };\n FBEffectsObjectData.getRootAsFBEffectsObjectData = function getRootAsFBEffectsObjectData(bb, obj) {\n return (obj || new FBEffectsObjectData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBEffectsObjectData.getSizePrefixedRootAsFBEffectsObjectData = function getSizePrefixedRootAsFBEffectsObjectData(bb, obj) {\n bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH);\n return (obj || new FBEffectsObjectData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBEffectsObjectData.startFBEffectsObjectData = function startFBEffectsObjectData(builder) {\n builder.startObject(2);\n };\n FBEffectsObjectData.addDataType = function addDataType(builder, dataTypeOffset) {\n builder.addFieldOffset(0, dataTypeOffset, 0);\n };\n FBEffectsObjectData.addData = function addData(builder, dataOffset) {\n builder.addFieldOffset(1, dataOffset, 0);\n };\n FBEffectsObjectData.createDataVector = function createDataVector(builder, data) {\n builder.startVector(1, data.length, 1);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addInt8(data[i]);\n }\n return builder.endVector();\n };\n FBEffectsObjectData.startDataVector = function startDataVector(builder, numElems) {\n builder.startVector(1, numElems, 1);\n };\n FBEffectsObjectData.endFBEffectsObjectData = function endFBEffectsObjectData(builder) {\n var offset = builder.endObject();\n return offset;\n };\n FBEffectsObjectData.createFBEffectsObjectData = function createFBEffectsObjectData(builder, dataTypeOffset, dataOffset) {\n FBEffectsObjectData.startFBEffectsObjectData(builder);\n FBEffectsObjectData.addDataType(builder, dataTypeOffset);\n FBEffectsObjectData.addData(builder, dataOffset);\n return FBEffectsObjectData.endFBEffectsObjectData(builder);\n };\n return FBEffectsObjectData;\n}();\nvar FBEffectsObjectDataT = /*#__PURE__*/ function() {\n function FBEffectsObjectDataT(dataType, data) {\n if (dataType === void 0) dataType = null;\n if (data === void 0) data = [];\n this.dataType = dataType;\n this.data = data;\n }\n var _proto = FBEffectsObjectDataT.prototype;\n _proto.pack = function pack(builder) {\n var dataType = this.dataType !== null ? builder.createString(this.dataType) : 0;\n var data = FBEffectsObjectData.createDataVector(builder, this.data);\n return FBEffectsObjectData.createFBEffectsObjectData(builder, dataType, data);\n };\n return FBEffectsObjectDataT;\n}();\n\n// automatically generated by the FlatBuffers compiler, do not modify\nvar FBEffectsPackageData = /*#__PURE__*/ function() {\n function FBEffectsPackageData() {\n this.bb = null;\n this.bb_pos = 0;\n }\n var _proto = FBEffectsPackageData.prototype;\n _proto.__init = function __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n };\n _proto.exportObjects = function exportObjects(index, obj) {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? (obj || new FBEffectsObjectData()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n };\n _proto.exportObjectsLength = function exportObjectsLength() {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.unpack = function unpack() {\n return new FBEffectsPackageDataT(this.bb.createObjList(this.exportObjects.bind(this), this.exportObjectsLength()));\n };\n _proto.unpackTo = function unpackTo(_o) {\n _o.exportObjects = this.bb.createObjList(this.exportObjects.bind(this), this.exportObjectsLength());\n };\n FBEffectsPackageData.getRootAsFBEffectsPackageData = function getRootAsFBEffectsPackageData(bb, obj) {\n return (obj || new FBEffectsPackageData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBEffectsPackageData.getSizePrefixedRootAsFBEffectsPackageData = function getSizePrefixedRootAsFBEffectsPackageData(bb, obj) {\n bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH);\n return (obj || new FBEffectsPackageData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBEffectsPackageData.startFBEffectsPackageData = function startFBEffectsPackageData(builder) {\n builder.startObject(1);\n };\n FBEffectsPackageData.addExportObjects = function addExportObjects(builder, exportObjectsOffset) {\n builder.addFieldOffset(0, exportObjectsOffset, 0);\n };\n FBEffectsPackageData.createExportObjectsVector = function createExportObjectsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n };\n FBEffectsPackageData.startExportObjectsVector = function startExportObjectsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n };\n FBEffectsPackageData.endFBEffectsPackageData = function endFBEffectsPackageData(builder) {\n var offset = builder.endObject();\n return offset;\n };\n FBEffectsPackageData.finishFBEffectsPackageDataBuffer = function finishFBEffectsPackageDataBuffer(builder, offset) {\n builder.finish(offset);\n };\n FBEffectsPackageData.finishSizePrefixedFBEffectsPackageDataBuffer = function finishSizePrefixedFBEffectsPackageDataBuffer(builder, offset) {\n builder.finish(offset, undefined, true);\n };\n FBEffectsPackageData.createFBEffectsPackageData = function createFBEffectsPackageData(builder, exportObjectsOffset) {\n FBEffectsPackageData.startFBEffectsPackageData(builder);\n FBEffectsPackageData.addExportObjects(builder, exportObjectsOffset);\n return FBEffectsPackageData.endFBEffectsPackageData(builder);\n };\n return FBEffectsPackageData;\n}();\nvar FBEffectsPackageDataT = /*#__PURE__*/ function() {\n function FBEffectsPackageDataT(exportObjects) {\n if (exportObjects === void 0) exportObjects = [];\n this.exportObjects = exportObjects;\n }\n var _proto = FBEffectsPackageDataT.prototype;\n _proto.pack = function pack(builder) {\n var exportObjects = FBEffectsPackageData.createExportObjectsVector(builder, builder.createObjectOffsetList(this.exportObjects));\n return FBEffectsPackageData.createFBEffectsPackageData(builder, exportObjects);\n };\n return FBEffectsPackageDataT;\n}();\n\n// automatically generated by the FlatBuffers compiler, do not modify\nvar FBSubMesh = /*#__PURE__*/ function() {\n function FBSubMesh() {\n this.bb = null;\n this.bb_pos = 0;\n }\n var _proto = FBSubMesh.prototype;\n _proto.__init = function __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n };\n _proto.offset = function offset() {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.indexCount = function indexCount() {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.vertexCount = function vertexCount() {\n var offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.unpack = function unpack() {\n return new FBSubMeshT(this.offset(), this.indexCount(), this.vertexCount());\n };\n _proto.unpackTo = function unpackTo(_o) {\n _o.offset = this.offset();\n _o.indexCount = this.indexCount();\n _o.vertexCount = this.vertexCount();\n };\n FBSubMesh.getRootAsFBSubMesh = function getRootAsFBSubMesh(bb, obj) {\n return (obj || new FBSubMesh()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBSubMesh.getSizePrefixedRootAsFBSubMesh = function getSizePrefixedRootAsFBSubMesh(bb, obj) {\n bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH);\n return (obj || new FBSubMesh()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBSubMesh.startFBSubMesh = function startFBSubMesh(builder) {\n builder.startObject(3);\n };\n FBSubMesh.addOffset = function addOffset(builder, offset) {\n builder.addFieldInt32(0, offset, 0);\n };\n FBSubMesh.addIndexCount = function addIndexCount(builder, indexCount) {\n builder.addFieldInt32(1, indexCount, 0);\n };\n FBSubMesh.addVertexCount = function addVertexCount(builder, vertexCount) {\n builder.addFieldInt32(2, vertexCount, 0);\n };\n FBSubMesh.endFBSubMesh = function endFBSubMesh(builder) {\n var offset = builder.endObject();\n return offset;\n };\n FBSubMesh.createFBSubMesh = function createFBSubMesh(builder, offset, indexCount, vertexCount) {\n FBSubMesh.startFBSubMesh(builder);\n FBSubMesh.addOffset(builder, offset);\n FBSubMesh.addIndexCount(builder, indexCount);\n FBSubMesh.addVertexCount(builder, vertexCount);\n return FBSubMesh.endFBSubMesh(builder);\n };\n return FBSubMesh;\n}();\nvar FBSubMeshT = /*#__PURE__*/ function() {\n function FBSubMeshT(offset, indexCount, vertexCount) {\n if (offset === void 0) offset = 0;\n if (indexCount === void 0) indexCount = 0;\n if (vertexCount === void 0) vertexCount = 0;\n this.offset = offset;\n this.indexCount = indexCount;\n this.vertexCount = vertexCount;\n }\n var _proto = FBSubMeshT.prototype;\n _proto.pack = function pack(builder) {\n return FBSubMesh.createFBSubMesh(builder, this.offset, this.indexCount, this.vertexCount);\n };\n return FBSubMeshT;\n}();\n\n// automatically generated by the FlatBuffers compiler, do not modify\nvar FBVertexChannel = /*#__PURE__*/ function() {\n function FBVertexChannel() {\n this.bb = null;\n this.bb_pos = 0;\n }\n var _proto = FBVertexChannel.prototype;\n _proto.__init = function __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n };\n _proto.semantic = function semantic(optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n };\n _proto.offset = function offset() {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.format = function format() {\n var offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.dimension = function dimension() {\n var offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.normalize = function normalize() {\n var offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;\n };\n _proto.unpack = function unpack() {\n return new FBVertexChannelT(this.semantic(), this.offset(), this.format(), this.dimension(), this.normalize());\n };\n _proto.unpackTo = function unpackTo(_o) {\n _o.semantic = this.semantic();\n _o.offset = this.offset();\n _o.format = this.format();\n _o.dimension = this.dimension();\n _o.normalize = this.normalize();\n };\n FBVertexChannel.getRootAsFBVertexChannel = function getRootAsFBVertexChannel(bb, obj) {\n return (obj || new FBVertexChannel()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBVertexChannel.getSizePrefixedRootAsFBVertexChannel = function getSizePrefixedRootAsFBVertexChannel(bb, obj) {\n bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH);\n return (obj || new FBVertexChannel()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBVertexChannel.startFBVertexChannel = function startFBVertexChannel(builder) {\n builder.startObject(5);\n };\n FBVertexChannel.addSemantic = function addSemantic(builder, semanticOffset) {\n builder.addFieldOffset(0, semanticOffset, 0);\n };\n FBVertexChannel.addOffset = function addOffset(builder, offset) {\n builder.addFieldInt32(1, offset, 0);\n };\n FBVertexChannel.addFormat = function addFormat(builder, format) {\n builder.addFieldInt32(2, format, 0);\n };\n FBVertexChannel.addDimension = function addDimension(builder, dimension) {\n builder.addFieldInt32(3, dimension, 0);\n };\n FBVertexChannel.addNormalize = function addNormalize(builder, normalize) {\n builder.addFieldInt8(4, +normalize, +false);\n };\n FBVertexChannel.endFBVertexChannel = function endFBVertexChannel(builder) {\n var offset = builder.endObject();\n return offset;\n };\n FBVertexChannel.createFBVertexChannel = function createFBVertexChannel(builder, semanticOffset, offset, format, dimension, normalize) {\n FBVertexChannel.startFBVertexChannel(builder);\n FBVertexChannel.addSemantic(builder, semanticOffset);\n FBVertexChannel.addOffset(builder, offset);\n FBVertexChannel.addFormat(builder, format);\n FBVertexChannel.addDimension(builder, dimension);\n FBVertexChannel.addNormalize(builder, normalize);\n return FBVertexChannel.endFBVertexChannel(builder);\n };\n return FBVertexChannel;\n}();\nvar FBVertexChannelT = /*#__PURE__*/ function() {\n function FBVertexChannelT(semantic, offset, format, dimension, normalize) {\n if (semantic === void 0) semantic = null;\n if (offset === void 0) offset = 0;\n if (format === void 0) format = 0;\n if (dimension === void 0) dimension = 0;\n if (normalize === void 0) normalize = false;\n this.semantic = semantic;\n this.offset = offset;\n this.format = format;\n this.dimension = dimension;\n this.normalize = normalize;\n }\n var _proto = FBVertexChannelT.prototype;\n _proto.pack = function pack(builder) {\n var semantic = this.semantic !== null ? builder.createString(this.semantic) : 0;\n return FBVertexChannel.createFBVertexChannel(builder, semantic, this.offset, this.format, this.dimension, this.normalize);\n };\n return FBVertexChannelT;\n}();\n\n// automatically generated by the FlatBuffers compiler, do not modify\nvar FBVertexData = /*#__PURE__*/ function() {\n function FBVertexData() {\n this.bb = null;\n this.bb_pos = 0;\n }\n var _proto = FBVertexData.prototype;\n _proto.__init = function __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n };\n _proto.vertexCount = function vertexCount() {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.channels = function channels(index, obj) {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? (obj || new FBVertexChannel()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n };\n _proto.channelsLength = function channelsLength() {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.unpack = function unpack() {\n return new FBVertexDataT(this.vertexCount(), this.bb.createObjList(this.channels.bind(this), this.channelsLength()));\n };\n _proto.unpackTo = function unpackTo(_o) {\n _o.vertexCount = this.vertexCount();\n _o.channels = this.bb.createObjList(this.channels.bind(this), this.channelsLength());\n };\n FBVertexData.getRootAsFBVertexData = function getRootAsFBVertexData(bb, obj) {\n return (obj || new FBVertexData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBVertexData.getSizePrefixedRootAsFBVertexData = function getSizePrefixedRootAsFBVertexData(bb, obj) {\n bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH);\n return (obj || new FBVertexData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBVertexData.startFBVertexData = function startFBVertexData(builder) {\n builder.startObject(2);\n };\n FBVertexData.addVertexCount = function addVertexCount(builder, vertexCount) {\n builder.addFieldInt32(0, vertexCount, 0);\n };\n FBVertexData.addChannels = function addChannels(builder, channelsOffset) {\n builder.addFieldOffset(1, channelsOffset, 0);\n };\n FBVertexData.createChannelsVector = function createChannelsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n };\n FBVertexData.startChannelsVector = function startChannelsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n };\n FBVertexData.endFBVertexData = function endFBVertexData(builder) {\n var offset = builder.endObject();\n return offset;\n };\n FBVertexData.createFBVertexData = function createFBVertexData(builder, vertexCount, channelsOffset) {\n FBVertexData.startFBVertexData(builder);\n FBVertexData.addVertexCount(builder, vertexCount);\n FBVertexData.addChannels(builder, channelsOffset);\n return FBVertexData.endFBVertexData(builder);\n };\n return FBVertexData;\n}();\nvar FBVertexDataT = /*#__PURE__*/ function() {\n function FBVertexDataT(vertexCount, channels) {\n if (vertexCount === void 0) vertexCount = 0;\n if (channels === void 0) channels = [];\n this.vertexCount = vertexCount;\n this.channels = channels;\n }\n var _proto = FBVertexDataT.prototype;\n _proto.pack = function pack(builder) {\n var channels = FBVertexData.createChannelsVector(builder, builder.createObjectOffsetList(this.channels));\n return FBVertexData.createFBVertexData(builder, this.vertexCount, channels);\n };\n return FBVertexDataT;\n}();\n\n// automatically generated by the FlatBuffers compiler, do not modify\nvar FBGeometryData = /*#__PURE__*/ function() {\n function FBGeometryData() {\n this.bb = null;\n this.bb_pos = 0;\n }\n var _proto = FBGeometryData.prototype;\n _proto.__init = function __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n };\n _proto.id = function id(optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n };\n _proto.name = function name(optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n };\n _proto.vertexData = function vertexData(obj) {\n var offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? (obj || new FBVertexData()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;\n };\n _proto.indexFormat = function indexFormat() {\n var offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.indexOffset = function indexOffset() {\n var offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.subMeshes = function subMeshes(index, obj) {\n var offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? (obj || new FBSubMesh()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;\n };\n _proto.subMeshesLength = function subMeshesLength() {\n var offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.mode = function mode() {\n var offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n };\n _proto.buffer = function buffer(optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n };\n _proto.binaryData = function binaryData(index) {\n var offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n };\n _proto.binaryDataLength = function binaryDataLength() {\n var offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.binaryDataArray = function binaryDataArray() {\n var offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n };\n _proto.boneNames = function boneNames(index, optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 22);\n return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n };\n _proto.boneNamesLength = function boneNamesLength() {\n var offset = this.bb.__offset(this.bb_pos, 22);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.rootBoneName = function rootBoneName(optionalEncoding) {\n var offset = this.bb.__offset(this.bb_pos, 24);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n };\n _proto.inverseBindMatrices = function inverseBindMatrices(index) {\n var offset = this.bb.__offset(this.bb_pos, 26);\n return offset ? this.bb.readFloat32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0;\n };\n _proto.inverseBindMatricesLength = function inverseBindMatricesLength() {\n var offset = this.bb.__offset(this.bb_pos, 26);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n };\n _proto.inverseBindMatricesArray = function inverseBindMatricesArray() {\n var offset = this.bb.__offset(this.bb_pos, 26);\n return offset ? new Float32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;\n };\n _proto.unpack = function unpack() {\n return new FBGeometryDataT(this.id(), this.name(), this.vertexData() !== null ? this.vertexData().unpack() : null, this.indexFormat(), this.indexOffset(), this.bb.createObjList(this.subMeshes.bind(this), this.subMeshesLength()), this.mode(), this.buffer(), this.bb.createScalarList(this.binaryData.bind(this), this.binaryDataLength()), this.bb.createScalarList(this.boneNames.bind(this), this.boneNamesLength()), this.rootBoneName(), this.bb.createScalarList(this.inverseBindMatrices.bind(this), this.inverseBindMatricesLength()));\n };\n _proto.unpackTo = function unpackTo(_o) {\n _o.id = this.id();\n _o.name = this.name();\n _o.vertexData = this.vertexData() !== null ? this.vertexData().unpack() : null;\n _o.indexFormat = this.indexFormat();\n _o.indexOffset = this.indexOffset();\n _o.subMeshes = this.bb.createObjList(this.subMeshes.bind(this), this.subMeshesLength());\n _o.mode = this.mode();\n _o.buffer = this.buffer();\n _o.binaryData = this.bb.createScalarList(this.binaryData.bind(this), this.binaryDataLength());\n _o.boneNames = this.bb.createScalarList(this.boneNames.bind(this), this.boneNamesLength());\n _o.rootBoneName = this.rootBoneName();\n _o.inverseBindMatrices = this.bb.createScalarList(this.inverseBindMatrices.bind(this), this.inverseBindMatricesLength());\n };\n FBGeometryData.getRootAsFBGeometryData = function getRootAsFBGeometryData(bb, obj) {\n return (obj || new FBGeometryData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBGeometryData.getSizePrefixedRootAsFBGeometryData = function getSizePrefixedRootAsFBGeometryData(bb, obj) {\n bb.setPosition(bb.position() + SIZE_PREFIX_LENGTH);\n return (obj || new FBGeometryData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n };\n FBGeometryData.startFBGeometryData = function startFBGeometryData(builder) {\n builder.startObject(12);\n };\n FBGeometryData.addId = function addId(builder, idOffset) {\n builder.addFieldOffset(0, idOffset, 0);\n };\n FBGeometryData.addName = function addName(builder, nameOffset) {\n builder.addFieldOffset(1, nameOffset, 0);\n };\n FBGeometryData.addVertexData = function addVertexData(builder, vertexDataOffset) {\n builder.addFieldOffset(2, vertexDataOffset, 0);\n };\n FBGeometryData.addIndexFormat = function addIndexFormat(builder, indexFormat) {\n builder.addFieldInt32(3, indexFormat, 0);\n };\n FBGeometryData.addIndexOffset = function addIndexOffset(builder, indexOffset) {\n builder.addFieldInt32(4, indexOffset, 0);\n };\n FBGeometryData.addSubMeshes = function addSubMeshes(builder, subMeshesOffset) {\n builder.addFieldOffset(5, subMeshesOffset, 0);\n };\n FBGeometryData.createSubMeshesVector = function createSubMeshesVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n };\n FBGeometryData.startSubMeshesVector = function startSubMeshesVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n };\n FBGeometryData.addMode = function addMode(builder, mode) {\n builder.addFieldInt32(6, mode, 0);\n };\n FBGeometryData.addBuffer = function addBuffer(builder, bufferOffset) {\n builder.addFieldOffset(7, bufferOffset, 0);\n };\n FBGeometryData.addBinaryData = function addBinaryData(builder, binaryDataOffset) {\n builder.addFieldOffset(8, binaryDataOffset, 0);\n };\n FBGeometryData.createBinaryDataVector = function createBinaryDataVector(builder, data) {\n builder.startVector(1, data.length, 1);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addInt8(data[i]);\n }\n return builder.endVector();\n };\n FBGeometryData.startBinaryDataVector = function startBinaryDataVector(builder, numElems) {\n builder.startVector(1, numElems, 1);\n };\n FBGeometryData.addBoneNames = function addBoneNames(builder, boneNamesOffset) {\n builder.addFieldOffset(9, boneNamesOffset, 0);\n };\n FBGeometryData.createBoneNamesVector = function createBoneNamesVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n };\n FBGeometryData.startBoneNamesVector = function startBoneNamesVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n };\n FBGeometryData.addRootBoneName = function addRootBoneName(builder, rootBoneNameOffset) {\n builder.addFieldOffset(10, rootBoneNameOffset, 0);\n };\n FBGeometryData.addInverseBindMatrices = function addInverseBindMatrices(builder, inverseBindMatricesOffset) {\n builder.addFieldOffset(11, inverseBindMatricesOffset, 0);\n };\n FBGeometryData.createInverseBindMatricesVector = function createInverseBindMatricesVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for(var i = data.length - 1; i >= 0; i--){\n builder.addFloat32(data[i]);\n }\n return builder.endVector();\n };\n FBGeometryData.startInverseBindMatricesVector = function startInverseBindMatricesVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n };\n FBGeometryData.endFBGeometryData = function endFBGeometryData(builder) {\n var offset = builder.endObject();\n return offset;\n };\n return FBGeometryData;\n}();\nvar FBGeometryDataT = /*#__PURE__*/ function() {\n function FBGeometryDataT(id, name, vertexData, indexFormat, indexOffset, subMeshes, mode, buffer, binaryData, boneNames, rootBoneName, inverseBindMatrices) {\n if (id === void 0) id = null;\n if (name === void 0) name = null;\n if (vertexData === void 0) vertexData = null;\n if (indexFormat === void 0) indexFormat = 0;\n if (indexOffset === void 0) indexOffset = 0;\n if (subMeshes === void 0) subMeshes = [];\n if (mode === void 0) mode = 0;\n if (buffer === void 0) buffer = null;\n if (binaryData === void 0) binaryData = [];\n if (boneNames === void 0) boneNames = [];\n if (rootBoneName === void 0) rootBoneName = null;\n if (inverseBindMatrices === void 0) inverseBindMatrices = [];\n this.id = id;\n this.name = name;\n this.vertexData = vertexData;\n this.indexFormat = indexFormat;\n this.indexOffset = indexOffset;\n this.subMeshes = subMeshes;\n this.mode = mode;\n this.buffer = buffer;\n this.binaryData = binaryData;\n this.boneNames = boneNames;\n this.rootBoneName = rootBoneName;\n this.inverseBindMatrices = inverseBindMatrices;\n }\n var _proto = FBGeometryDataT.prototype;\n _proto.pack = function pack(builder) {\n var id = this.id !== null ? builder.createString(this.id) : 0;\n var name = this.name !== null ? builder.createString(this.name) : 0;\n var vertexData = this.vertexData !== null ? this.vertexData.pack(builder) : 0;\n var subMeshes = FBGeometryData.createSubMeshesVector(builder, builder.createObjectOffsetList(this.subMeshes));\n var buffer = this.buffer !== null ? builder.createString(this.buffer) : 0;\n var binaryData = FBGeometryData.createBinaryDataVector(builder, this.binaryData);\n var boneNames = FBGeometryData.createBoneNamesVector(builder, builder.createObjectOffsetList(this.boneNames));\n var rootBoneName = this.rootBoneName !== null ? builder.createString(this.rootBoneName) : 0;\n var inverseBindMatrices = FBGeometryData.createInverseBindMatricesVector(builder, this.inverseBindMatrices);\n FBGeometryData.startFBGeometryData(builder);\n FBGeometryData.addId(builder, id);\n FBGeometryData.addName(builder, name);\n FBGeometryData.addVertexData(builder, vertexData);\n FBGeometryData.addIndexFormat(builder, this.indexFormat);\n FBGeometryData.addIndexOffset(builder, this.indexOffset);\n FBGeometryData.addSubMeshes(builder, subMeshes);\n FBGeometryData.addMode(builder, this.mode);\n FBGeometryData.addBuffer(builder, buffer);\n FBGeometryData.addBinaryData(builder, binaryData);\n FBGeometryData.addBoneNames(builder, boneNames);\n FBGeometryData.addRootBoneName(builder, rootBoneName);\n FBGeometryData.addInverseBindMatrices(builder, inverseBindMatrices);\n return FBGeometryData.endFBGeometryData(builder);\n };\n return FBGeometryDataT;\n}();\n\n/**\n * @since 2.0.0\n */ var EffectsPackage = /*#__PURE__*/ function() {\n function EffectsPackage() {\n this.exportObjectDatas = [];\n }\n var _proto = EffectsPackage.prototype;\n _proto.addData = function addData(effectsObjectData) {\n this.exportObjectDatas.push(effectsObjectData);\n };\n _proto.serializeToBinary = function serializeToBinary() {\n var fbb = new Builder(1);\n var effectsPackage = new FBEffectsPackageDataT();\n var exportObjects = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(this.exportObjectDatas), _step; !(_step = _iterator()).done;){\n var effectsObjectData = _step.value;\n var fbEffectsObjectData = void 0;\n if (effectsObjectData.dataType === DataType.Geometry) {\n fbEffectsObjectData = new FBEffectsObjectDataT(\"Geometry\", this.geometryDataToBinary(effectsObjectData));\n }\n if (!fbEffectsObjectData) {\n continue;\n }\n exportObjects.push(fbEffectsObjectData);\n }\n effectsPackage.exportObjects = exportObjects;\n FBEffectsPackageData.finishFBEffectsPackageDataBuffer(fbb, effectsPackage.pack(fbb));\n return fbb.asUint8Array(); // Of type `Uint8Array`.\n };\n _proto.deserializeFromBinary = function deserializeFromBinary(buffer) {\n var buf = new ByteBuffer(buffer);\n var fbEffectsPackage = FBEffectsPackageData.getRootAsFBEffectsPackageData(buf);\n for(var i = 0; i < fbEffectsPackage.exportObjectsLength(); i++){\n var fbEffectsObjectData = fbEffectsPackage.exportObjects(i);\n if (!fbEffectsObjectData) {\n continue;\n }\n var dataBuffer = fbEffectsObjectData.dataArray();\n var dataType = fbEffectsObjectData.dataType();\n if (!dataBuffer) {\n continue;\n }\n var effectsObjectData = void 0;\n if (dataType === DataType.Geometry) {\n effectsObjectData = this.binaryToGeometryData(dataBuffer);\n }\n if (!effectsObjectData) {\n continue;\n }\n this.exportObjectDatas.push(effectsObjectData);\n }\n };\n _proto.geometryDataToBinary = function geometryDataToBinary(geometryData) {\n var fbb = new Builder(1);\n var fbGeometryData = new FBGeometryDataT();\n var indexFormat = geometryData.indexFormat, indexOffset = geometryData.indexOffset, mode = geometryData.mode, id = geometryData.id, vertexData = geometryData.vertexData, _geometryData_boneNames = geometryData.boneNames, boneNames = _geometryData_boneNames === void 0 ? [] : _geometryData_boneNames, _geometryData_rootBoneName = geometryData.rootBoneName, rootBoneName = _geometryData_rootBoneName === void 0 ? \"\" : _geometryData_rootBoneName, _geometryData_inverseBindMatrices = geometryData.inverseBindMatrices, inverseBindMatrices = _geometryData_inverseBindMatrices === void 0 ? [] : _geometryData_inverseBindMatrices, _geometryData_binaryData = geometryData.binaryData, binaryData = _geometryData_binaryData === void 0 ? [] : _geometryData_binaryData;\n fbGeometryData.indexFormat = indexFormat;\n fbGeometryData.indexOffset = indexOffset;\n fbGeometryData.mode = mode;\n fbGeometryData.id = id;\n fbGeometryData.boneNames = boneNames;\n fbGeometryData.rootBoneName = rootBoneName;\n fbGeometryData.inverseBindMatrices = inverseBindMatrices;\n fbGeometryData.binaryData = binaryData;\n var fbVertexdata = new FBVertexDataT();\n fbVertexdata.vertexCount = vertexData.vertexCount;\n fbVertexdata.channels = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(vertexData.channels), _step; !(_step = _iterator()).done;){\n var channel = _step.value;\n var semantic = channel.semantic, offset = channel.offset, format = channel.format, dimension = channel.dimension, normalize = channel.normalize;\n var fbChannel = new FBVertexChannelT(semantic, offset, format, dimension, normalize);\n fbVertexdata.channels.push(fbChannel);\n }\n fbGeometryData.vertexData = fbVertexdata;\n var fbSubMeshes = [];\n for(var _iterator1 = _create_for_of_iterator_helper_loose(geometryData.subMeshes), _step1; !(_step1 = _iterator1()).done;){\n var subMesh = _step1.value;\n var offset1 = subMesh.offset, indexCount = subMesh.indexCount, vertexCount = subMesh.vertexCount;\n var fbSubMesh = new FBSubMeshT(offset1, indexCount, vertexCount);\n fbSubMeshes.push(fbSubMesh);\n }\n fbGeometryData.subMeshes = fbSubMeshes;\n FBEffectsPackageData.finishFBEffectsPackageDataBuffer(fbb, fbGeometryData.pack(fbb));\n return fbb.asUint8Array(); // Of type `Uint8Array`.\n };\n _proto.binaryToGeometryData = function binaryToGeometryData(buffer) {\n var buf = new ByteBuffer(buffer);\n var fbGeometryData = FBGeometryData.getRootAsFBGeometryData(buf);\n var vertexData = {\n vertexCount: 0,\n channels: []\n };\n var fbVertexData = fbGeometryData.vertexData();\n if (fbVertexData) {\n vertexData.vertexCount = fbVertexData.vertexCount();\n for(var i = 0; i < fbVertexData.channelsLength(); i++){\n var channel = fbVertexData.channels(i);\n if (!channel) {\n continue;\n }\n var _channel_semantic;\n var vertexChannel = {\n semantic: (_channel_semantic = channel.semantic()) != null ? _channel_semantic : \"\",\n offset: channel.offset(),\n format: channel.format(),\n dimension: channel.dimension(),\n normalize: channel.normalize()\n };\n vertexData.channels.push(vertexChannel);\n }\n }\n var subMeshes = [];\n for(var i1 = 0; i1 < fbGeometryData.subMeshesLength(); i1++){\n var fbSubMesh = fbGeometryData.subMeshes(i1);\n if (!fbSubMesh) {\n continue;\n }\n var subMesh = {\n offset: fbSubMesh.offset(),\n vertexCount: fbSubMesh.vertexCount(),\n indexCount: fbSubMesh.indexCount()\n };\n subMeshes.push(subMesh);\n }\n var boneNames = [];\n for(var i2 = 0; i2 < fbGeometryData.boneNamesLength(); i2++){\n var boneName = fbGeometryData.boneNames(i2);\n boneNames.push(boneName);\n }\n var inverseBindMatricesArray = fbGeometryData.inverseBindMatricesArray();\n var _fbGeometryData_buffer, _fbGeometryData_rootBoneName, _fbGeometryData_binaryDataArray, _fbGeometryData_id;\n var geometryData = {\n vertexData: vertexData,\n indexFormat: fbGeometryData.indexFormat(),\n indexOffset: fbGeometryData.indexOffset(),\n subMeshes: subMeshes,\n mode: fbGeometryData.mode(),\n buffer: (_fbGeometryData_buffer = fbGeometryData.buffer()) != null ? _fbGeometryData_buffer : \"\",\n boneNames: boneNames,\n rootBoneName: (_fbGeometryData_rootBoneName = fbGeometryData.rootBoneName()) != null ? _fbGeometryData_rootBoneName : \"\",\n inverseBindMatrices: inverseBindMatricesArray ? Array.from(inverseBindMatricesArray) : undefined,\n binaryData: (_fbGeometryData_binaryDataArray = fbGeometryData.binaryDataArray()) != null ? _fbGeometryData_binaryDataArray : undefined,\n id: (_fbGeometryData_id = fbGeometryData.id()) != null ? _fbGeometryData_id : \"\",\n dataType: DataType.Geometry\n };\n return geometryData;\n };\n return EffectsPackage;\n}();\n\n/**\n * Engine 基类,负责维护所有 GPU 资源的管理及销毁\n */ var Engine = /*#__PURE__*/ function() {\n function Engine() {\n /**\n * 渲染过程中错误队列\n */ this.renderErrors = new Set();\n this.destroyed = false;\n this.textures = [];\n this.materials = [];\n this.geometries = [];\n this.meshes = [];\n this.renderPasses = [];\n this.jsonSceneData = {};\n this.objectInstance = {};\n this.assetLoader = new AssetLoader(this);\n this.emptyTexture = generateWhiteTexture(this);\n this.transparentTexture = generateTransparentTexture(this);\n }\n var _proto = Engine.prototype;\n _proto.clearResources = function clearResources() {\n this.jsonSceneData = {};\n this.objectInstance = {};\n };\n _proto.addEffectsObjectData = function addEffectsObjectData(data) {\n this.jsonSceneData[data.id] = data;\n };\n _proto.findEffectsObjectData = function findEffectsObjectData(uuid) {\n return this.jsonSceneData[uuid];\n };\n _proto.addInstance = function addInstance(effectsObject) {\n this.objectInstance[effectsObject.getInstanceId()] = effectsObject;\n };\n /**\n * @ignore\n */ _proto.findObject = function findObject(guid) {\n // 编辑器可能传 Class 对象,这边判断处理一下直接返回原对象。\n if (!(isObject(guid) && guid.constructor === Object)) {\n return guid;\n }\n if (this.objectInstance[guid.id]) {\n return this.objectInstance[guid.id];\n }\n var result = this.assetLoader.loadGUID(guid);\n return result;\n };\n _proto.removeInstance = function removeInstance(id) {\n delete this.objectInstance[id];\n };\n _proto.addPackageDatas = function addPackageDatas(scene) {\n var jsonScene = scene.jsonScene, _scene_textureOptions = scene.textureOptions, textureOptions = _scene_textureOptions === void 0 ? [] : _scene_textureOptions;\n var _jsonScene_items = jsonScene.items, items = _jsonScene_items === void 0 ? [] : _jsonScene_items, _jsonScene_materials = jsonScene.materials, materials = _jsonScene_materials === void 0 ? [] : _jsonScene_materials, _jsonScene_shaders = jsonScene.shaders, shaders = _jsonScene_shaders === void 0 ? [] : _jsonScene_shaders, _jsonScene_geometries = jsonScene.geometries, geometries = _jsonScene_geometries === void 0 ? [] : _jsonScene_geometries, _jsonScene_components = jsonScene.components, components = _jsonScene_components === void 0 ? [] : _jsonScene_components, _jsonScene_animations = jsonScene.animations, animations = _jsonScene_animations === void 0 ? [] : _jsonScene_animations, _jsonScene_bins = jsonScene.bins, bins = _jsonScene_bins === void 0 ? [] : _jsonScene_bins, _jsonScene_miscs = jsonScene.miscs, miscs = _jsonScene_miscs === void 0 ? [] : _jsonScene_miscs, compositions = jsonScene.compositions;\n for(var _iterator = _create_for_of_iterator_helper_loose(compositions), _step; !(_step = _iterator()).done;){\n var compositionData = _step.value;\n this.addEffectsObjectData(compositionData);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(items), _step1; !(_step1 = _iterator1()).done;){\n var vfxItemData = _step1.value;\n if (!passRenderLevel(vfxItemData.renderLevel, scene.renderLevel)) {\n vfxItemData.components = [];\n vfxItemData.type = ItemType.null;\n }\n this.addEffectsObjectData(vfxItemData);\n }\n for(var _iterator2 = _create_for_of_iterator_helper_loose(materials), _step2; !(_step2 = _iterator2()).done;){\n var materialData = _step2.value;\n this.addEffectsObjectData(materialData);\n }\n for(var _iterator3 = _create_for_of_iterator_helper_loose(shaders), _step3; !(_step3 = _iterator3()).done;){\n var shaderData = _step3.value;\n this.addEffectsObjectData(shaderData);\n }\n for(var _iterator4 = _create_for_of_iterator_helper_loose(geometries), _step4; !(_step4 = _iterator4()).done;){\n var geometryData = _step4.value;\n this.addEffectsObjectData(geometryData);\n }\n for(var _iterator5 = _create_for_of_iterator_helper_loose(components), _step5; !(_step5 = _iterator5()).done;){\n var componentData = _step5.value;\n this.addEffectsObjectData(componentData);\n }\n for(var _iterator6 = _create_for_of_iterator_helper_loose(animations), _step6; !(_step6 = _iterator6()).done;){\n var animationData = _step6.value;\n this.addEffectsObjectData(animationData);\n }\n for(var _iterator7 = _create_for_of_iterator_helper_loose(miscs), _step7; !(_step7 = _iterator7()).done;){\n var miscData = _step7.value;\n this.addEffectsObjectData(miscData);\n }\n for(var i = 0; i < bins.length; i++){\n var binaryData = bins[i];\n var binaryBuffer = scene.bins[i];\n if (binaryData.dataType === DataType.BinaryAsset) {\n //@ts-expect-error\n binaryData.buffer = binaryBuffer;\n if (binaryData.id) {\n this.addEffectsObjectData(binaryData);\n }\n } else {\n var effectsPackage = new EffectsPackage();\n effectsPackage.deserializeFromBinary(new Uint8Array(binaryBuffer));\n for(var _iterator8 = _create_for_of_iterator_helper_loose(effectsPackage.exportObjectDatas), _step8; !(_step8 = _iterator8()).done;){\n var effectsObjectData = _step8.value;\n this.addEffectsObjectData(effectsObjectData);\n }\n }\n }\n for(var _iterator9 = _create_for_of_iterator_helper_loose(textureOptions), _step9; !(_step9 = _iterator9()).done;){\n var textureData = _step9.value;\n this.addEffectsObjectData(textureData);\n }\n };\n _proto.createVFXItems = function createVFXItems(scene) {\n var _this = this;\n return _async_to_generator(function() {\n var jsonScene, _iterator, _step, itemData, itemType;\n return __generator(this, function(_state) {\n jsonScene = scene.jsonScene;\n for(_iterator = _create_for_of_iterator_helper_loose(jsonScene.items); !(_step = _iterator()).done;){\n itemData = _step.value;\n itemType = itemData.type;\n if (!(itemType === \"ECS\" || itemType === \"camera\" || itemType === ItemType.sprite || itemType === ItemType.particle || itemType === ItemType.mesh || itemType === ItemType.skybox || itemType === ItemType.light || itemType === ItemType.tree || itemType === ItemType.interact || itemType === ItemType.camera)) {\n continue;\n }\n if (_this.database) {\n _this.assetLoader.loadGUID(itemData);\n }\n }\n return [\n 2\n ];\n });\n })();\n };\n _proto.addTexture = function addTexture(tex) {\n if (this.destroyed) {\n return;\n }\n addItem(this.textures, tex);\n };\n _proto.removeTexture = function removeTexture(tex) {\n if (this.destroyed) {\n return;\n }\n removeItem(this.textures, tex);\n };\n _proto.addMaterial = function addMaterial(mat) {\n if (this.destroyed) {\n return;\n }\n addItem(this.materials, mat);\n };\n _proto.removeMaterial = function removeMaterial(mat) {\n if (this.destroyed) {\n return;\n }\n removeItem(this.materials, mat);\n };\n _proto.addGeometry = function addGeometry(geo) {\n if (this.destroyed) {\n return;\n }\n addItem(this.geometries, geo);\n };\n _proto.removeGeometry = function removeGeometry(geo) {\n if (this.destroyed) {\n return;\n }\n removeItem(this.geometries, geo);\n };\n _proto.addMesh = function addMesh(mesh) {\n if (this.destroyed) {\n return;\n }\n addItem(this.meshes, mesh);\n };\n _proto.removeMesh = function removeMesh(mesh) {\n if (this.destroyed) {\n return;\n }\n removeItem(this.meshes, mesh);\n };\n _proto.addRenderPass = function addRenderPass(pass) {\n if (this.destroyed) {\n return;\n }\n addItem(this.renderPasses, pass);\n };\n _proto.removeRenderPass = function removeRenderPass(pass) {\n if (this.destroyed) {\n return;\n }\n removeItem(this.renderPasses, pass);\n };\n _proto.getShaderLibrary = function getShaderLibrary() {\n return this.renderer.getShaderLibrary();\n };\n /**\n * 销毁所有缓存的资源\n */ _proto.dispose = function dispose() {\n if (this.destroyed) {\n return;\n }\n this.destroyed = true;\n var info = [];\n if (this.renderPasses.length > 0) {\n info.push(\"Pass \" + this.renderPasses.length);\n }\n if (this.meshes.length > 0) {\n info.push(\"Mesh \" + this.meshes.length);\n }\n if (this.geometries.length > 0) {\n info.push(\"Geom \" + this.geometries.length);\n }\n if (this.textures.length > 0) {\n info.push(\"Tex \" + this.textures.length);\n }\n if (info.length > 0) {\n logger.warn(\"Release GPU memory: \" + info.join(\", \") + \".\");\n }\n this.renderPasses.forEach(function(pass) {\n return pass.dispose();\n });\n this.meshes.forEach(function(mesh) {\n return mesh.dispose();\n });\n this.geometries.forEach(function(geo) {\n return geo.dispose();\n });\n this.materials.forEach(function(mat) {\n return mat.dispose();\n });\n this.textures.forEach(function(tex) {\n return tex.dispose();\n });\n this.textures = [];\n this.materials = [];\n this.geometries = [];\n this.meshes = [];\n this.renderPasses = [];\n // @ts-expect-error\n this.renderer = null;\n };\n _create_class(Engine, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return Engine;\n}();\n\nvar DEFAULT_FPS = 60;\n/**\n * 定时器类\n */ var Ticker = /*#__PURE__*/ function() {\n function Ticker(fps) {\n if (fps === void 0) fps = DEFAULT_FPS;\n this.paused = true;\n this.lastTime = 0;\n // deltaTime\n this.dt = 0;\n this.setFPS(fps);\n this.tickers = [];\n }\n var _proto = Ticker.prototype;\n /**\n * FPS 帧率设置\n */ _proto.getFPS = function getFPS() {\n return this.targetFPS;\n };\n _proto.setFPS = function setFPS(fps) {\n this.targetFPS = clamp$1(fps, 1, 120);\n // 注意:-2 的原因是保证帧率稳定\n // interval 在 fps 为 60 的时候设成 15 累计误差会很大,设成 14 较稳定\n // requestanimationFrame 在不同的刷新率下时间间隔不一样,120hz 的误差在 8 以内,60hz 的误差在 16 以内\n this.interval = Math.floor(1000 / fps) - 2;\n };\n /**\n * 获取定时器暂停标志位\n * @returns\n */ _proto.getPaused = function getPaused() {\n return this.paused;\n };\n /**\n * 定时器开始方法\n */ _proto.start = function start() {\n var _this = this;\n this.paused = false;\n this.dt = 0;\n if (!this.intervalId) {\n this.lastTime = performance.now();\n var raf = requestAnimationFrame || function(func) {\n return window.setTimeout(func, 16.7);\n };\n var runLoop = function() {\n _this.intervalId = raf(runLoop);\n if (!_this.paused) {\n _this.tick();\n }\n };\n runLoop();\n }\n };\n /**\n * 定时器停止方法\n */ _proto.stop = function stop() {\n (cancelAnimationFrame || window.clearTimeout)(this.intervalId);\n this.intervalId = 0;\n this.lastTime = 0;\n this.paused = true;\n this.dt = 0;\n this.tickers = [];\n };\n /**\n * 定时器暂停方法\n */ _proto.pause = function pause() {\n this.paused = true;\n this.dt = 0;\n };\n /**\n * 定时器恢复方法\n */ _proto.resume = function resume() {\n this.paused = false;\n this.dt = 0;\n };\n /**\n * 定时器 tick 方法\n */ _proto.tick = function tick() {\n if (this.paused) {\n return;\n }\n var startTime = performance.now();\n this.dt = startTime - this.lastTime;\n if (this.dt >= this.interval) {\n this.lastTime = startTime;\n if (this.resetTickers) {\n this.tickers = this.tickers.filter(function(tick) {\n return tick;\n });\n this.resetTickers = false;\n }\n for(var i = 0, len = this.tickers.length; i < len; i++){\n var tick = this.tickers[i];\n tick(this.dt);\n }\n }\n };\n /**\n * 定时器添加计时方法\n * @param ticker - 定时器类\n */ _proto.add = function add(ticker) {\n if (typeof ticker !== \"function\") {\n throw new Error(\"The tick object must implement the tick method.\");\n }\n this.tickers.push(ticker);\n };\n _create_class(Ticker, [\n {\n key: \"deltaTime\",\n get: /**\n * 获取定时器当前帧更新的时间\n */ function get() {\n return this.dt;\n }\n }\n ]);\n return Ticker;\n}();\n\nregisterPlugin(\"camera\", CameraVFXItemLoader, exports.VFXItem);\nregisterPlugin(\"text\", TextLoader, exports.VFXItem);\nregisterPlugin(\"sprite\", SpriteLoader, exports.VFXItem);\nregisterPlugin(\"particle\", ParticleLoader, exports.VFXItem);\nregisterPlugin(\"cal\", CalculateLoader, exports.VFXItem);\nregisterPlugin(\"interact\", InteractLoader, exports.VFXItem);\nvar version$1 = \"2.4.3\";\nlogger.info(\"Core version: \" + version$1 + \".\");\n\nvar _obj$3;\nvar FORMAT_HALF_FLOAT = (_obj$3 = {}, _obj$3[glContext.RGBA] = 34842, _obj$3[glContext.RGB] = 34843, _obj$3[glContext.ALPHA] = 33325, _obj$3[glContext.RED] = 33325, _obj$3[glContext.LUMINANCE_ALPHA] = 33327, _obj$3[glContext.LUMINANCE] = 33325, _obj$3);\nvar _obj1$1;\nvar FORMAT_FLOAT = (_obj1$1 = {}, _obj1$1[glContext.RGBA] = 34836, _obj1$1[glContext.RGB] = 34837, _obj1$1[glContext.ALPHA] = 33326, _obj1$1[glContext.RED] = 33326, _obj1$1[glContext.LUMINANCE_ALPHA] = 33328, _obj1$1[glContext.LUMINANCE] = 33326, _obj1$1);\nvar GLTexture = /*#__PURE__*/ function(Texture) {\n _inherits(GLTexture, Texture);\n function GLTexture(engine, source) {\n var _this;\n _this = Texture.call(this, engine) || this;\n _this.initialized = false;\n if (source) {\n _this.fromData(source);\n }\n return _this;\n }\n var _proto = GLTexture.prototype;\n /**\n * 绑定当前 Texture 对象\n */ _proto.bind = function bind(force) {\n this.pipelineContext.bindTexture(this.target, this.textureBuffer, force);\n };\n /**\n * 初始化 Texture 的 GPU 资源\n */ _proto.initialize = function initialize() {\n if (this.initialized) {\n return;\n }\n var glEngine = this.engine;\n glEngine.addTexture(this);\n this.pipelineContext = glEngine.getGLPipelineContext();\n var gl = this.pipelineContext.gl;\n var _this_source = this.source, _this_source_target = _this_source.target, target = _this_source_target === void 0 ? gl.TEXTURE_2D : _this_source_target, name = _this_source.name;\n this.textureBuffer = gl.createTexture();\n assignInspectorName(this.textureBuffer, name);\n this.target = target;\n this.update(this.source);\n this.release();\n this.initialized = true;\n };\n _proto.clone = function clone() {\n var clonedTexture = new GLTexture(this.engine, this.source);\n clonedTexture.sourceFrom = this.sourceFrom;\n clonedTexture.sourceType = this.sourceType;\n clonedTexture.width = this.width;\n clonedTexture.height = this.height;\n return clonedTexture;\n };\n _proto.release = function release() {\n var sourceType = this.source.sourceType;\n switch(sourceType){\n case exports.TextureSourceType.image:\n // @ts-expect-error\n delete this.source.image;\n // @ts-expect-error\n delete this.source.cube;\n break;\n case exports.TextureSourceType.data:\n // @ts-expect-error\n delete this.source.data;\n break;\n case exports.TextureSourceType.compressed:\n // @ts-expect-error\n delete this.source.mipmaps;\n break;\n case exports.TextureSourceType.mipmaps:\n // @ts-expect-error\n delete this.source.mipmaps;\n break;\n }\n };\n _proto.update = function update(sourceOptions) {\n var _this = this;\n if (!this.pipelineContext || !this.textureBuffer) {\n this.width = 0;\n this.height = 0;\n return;\n }\n var target = this.target;\n var source = this.source;\n var gl = this.pipelineContext.gl;\n var detail = this.engine.gpuCapability.detail;\n var sourceType = source.sourceType;\n var data = source.data;\n var cube = source.cube;\n var image = source.image;\n var video = source.video;\n var mipmaps = source.mipmaps;\n var cubeMipmaps = source.mipmaps;\n var optionsData = sourceOptions.data;\n var optionsCube = sourceOptions.cube;\n var generateMipmap = sourceOptions.generateMipmap;\n var optionsMipmaps = sourceOptions.mipmaps;\n var format = source.format, type = source.type, internalFormat = source.internalFormat;\n var width = 0;\n var height = 0;\n // TODO 原GLState的textureUnitDict参数未处理。\n this.bind(sourceType === exports.TextureSourceType.video);\n // 选择 type 和 format\n if (type === glContext.HALF_FLOAT) {\n type = detail.halfFloatTexture;\n if (!type) {\n logger.error(\"Half float texture is not support.\");\n }\n if (isWebGL2(gl) && internalFormat === format) {\n if (format === glContext.LUMINANCE) {\n format = glContext.RED;\n }\n internalFormat = FORMAT_HALF_FLOAT[format];\n }\n if (!detail.halfFloatLinear) {\n source.minFilter = source.magFilter = gl.NEAREST;\n logger.warn(\"Half float linear not support, change to NEAREST.\");\n }\n } else if (type === gl.FLOAT) {\n type = detail.floatTexture;\n if (!type) {\n logger.error(\"Float texture is not support.\");\n }\n if (isWebGL2(gl) && internalFormat === format) {\n if (format === glContext.LUMINANCE) {\n format = glContext.RED;\n }\n internalFormat = FORMAT_FLOAT[format];\n }\n if (!detail.floatLinear) {\n source.minFilter = gl.NEAREST;\n source.magFilter = gl.NEAREST;\n logger.warn(\"Float linear not support, change to NEAREST.\");\n }\n }\n // 处理是否RGB透明度相乘和Y轴反转, 默认值都为false。\n if (source.premultiplyAlpha === undefined) {\n source.premultiplyAlpha = false;\n }\n // gl的状态可能在外面被改变了,这里必须重新设置\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, source.premultiplyAlpha);\n if (source.flipY === undefined) {\n source.flipY = false;\n }\n // gl的状态可能在外面被改变了,这里必须重新设置\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, source.flipY);\n // 根据不同的 TextureSourceType 传输对应贴图数据到 GPU\n if (sourceType === exports.TextureSourceType.framebuffer) {\n if (optionsData) {\n var _optionsData_width;\n width = (_optionsData_width = optionsData.width) != null ? _optionsData_width : 0;\n var _optionsData_height;\n height = (_optionsData_height = optionsData.height) != null ? _optionsData_height : 0;\n if (width && height && (this.width !== width || this.height !== height)) {\n gl.texImage2D(target, 0, internalFormat, width, height, 0, format, type, null);\n }\n }\n } else if (sourceType === exports.TextureSourceType.data) {\n if (target === gl.TEXTURE_CUBE_MAP) {\n optionsCube.forEach(function(data, key) {\n var _this_texImage2DData = _this.texImage2DData(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, 0, internalFormat, format, type, data), x = _this_texImage2DData[0], y = _this_texImage2DData[1];\n width = Math.max(x, width);\n height = Math.max(y, height);\n });\n } else {\n var ref;\n ref = this.texImage2DData(gl, target, 0, internalFormat, format, type, data), width = ref[0], height = ref[1];\n }\n } else if (sourceType === exports.TextureSourceType.image || sourceType === exports.TextureSourceType.video) {\n if (target === gl.TEXTURE_CUBE_MAP) {\n cube.forEach(function(image, key) {\n var _this_texImage2D = _this.texImage2D(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, 0, internalFormat, format, type, image), x = _this_texImage2D[0], y = _this_texImage2D[1];\n width = Math.max(x, width);\n height = Math.max(y, height);\n });\n } else if (target === gl.TEXTURE_2D) {\n var imageData = image != null ? image : video;\n var ref1;\n ref1 = this.texImage2D(gl, target, 0, internalFormat, format, type, imageData), width = ref1[0], height = ref1[1];\n }\n if (generateMipmap) {\n if (isPowerOfTwo(width) && isPowerOfTwo(height) || isWebGL2(gl)) {\n gl.generateMipmap(target);\n }\n }\n } else if (sourceType === exports.TextureSourceType.mipmaps) {\n var ret;\n if (target === gl.TEXTURE_2D) {\n mipmaps.forEach(function(mipmap, level) {\n if (\"data\" in mipmap) {\n ret = _this.texImage2DData(gl, target, level, internalFormat, format, type, mipmap);\n } else {\n ret = _this.texImage2D(gl, target, level, internalFormat, format, type, mipmap);\n }\n if (level === 0) {\n var ref;\n ref = ret, width = ref[0], height = ref[1];\n }\n });\n } else if (target === gl.TEXTURE_CUBE_MAP) {\n cubeMipmaps.forEach(function(mipmap, level) {\n mipmap.forEach(function(face, key) {\n if (\"data\" in face) {\n ret = _this.texImage2DData(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, level, internalFormat, format, type, face);\n } else {\n ret = _this.texImage2D(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, level, internalFormat, format, type, face);\n }\n if (level === 0) {\n var ref;\n ref = ret, width = ref[0], height = ref[1];\n }\n });\n });\n }\n } else if (sourceType === exports.TextureSourceType.compressed) {\n if (optionsMipmaps && optionsMipmaps.length !== 0) {\n width = optionsMipmaps[0].width;\n height = optionsMipmaps[0].height;\n optionsMipmaps.forEach(function(mipmap, idx) {\n gl.compressedTexImage2D(target, idx, internalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n });\n }\n }\n this.width = width;\n this.height = height;\n this.setTextureFilters(gl, target, source);\n };\n _proto.setTextureFilters = function setTextureFilters(gl, target, options) {\n var _options_anisotropic = options.anisotropic, anisotropic = _options_anisotropic === void 0 ? 4 : _options_anisotropic, _options_wrapS = options.wrapS, wrapS = _options_wrapS === void 0 ? gl.CLAMP_TO_EDGE : _options_wrapS, _options_wrapT = options.wrapT, wrapT = _options_wrapT === void 0 ? gl.CLAMP_TO_EDGE : _options_wrapT;\n var gpuCapability = this.engine.gpuCapability;\n if (this.target === gl.TEXTURE_2D) {\n gpuCapability.setTextureAnisotropic(gl, this.target, anisotropic);\n }\n var isPot = isWebGL2(gl) || isPowerOfTwo(this.width) && isPowerOfTwo(this.height);\n var magFilter = options.magFilter ? options.magFilter : gl.NEAREST;\n var minFilter = options.minFilter ? options.minFilter : gl.NEAREST;\n if (!isPot) {\n if (minFilter === gl.LINEAR_MIPMAP_LINEAR || minFilter === gl.LINEAR_MIPMAP_NEAREST || minFilter === gl.NEAREST_MIPMAP_LINEAR || minFilter === gl.NEAREST_MIPMAP_NEAREST) {\n minFilter = gl.LINEAR;\n }\n }\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter);\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, isPot ? wrapS : gl.CLAMP_TO_EDGE);\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, isPot ? wrapT : gl.CLAMP_TO_EDGE);\n };\n _proto.fromData = function fromData(data) {\n Texture.prototype.fromData.call(this, data);\n var source = data;\n var options = this.assembleOptions(source);\n var sourceType = options.sourceType, sourceFrom = options.sourceFrom, _options_name = options.name, name = _options_name === void 0 ? \"\" : _options_name;\n this.source = options;\n this.sourceType = sourceType;\n this.sourceFrom = sourceFrom;\n this.name = name;\n this.guid = data.id;\n };\n _proto.texImage2D = function texImage2D(gl, target, level, internalformat, format, type, image) {\n var _this = this;\n var _this_source = this.source, sourceType = _this_source.sourceType, minFilter = _this_source.minFilter, magFilter = _this_source.magFilter, wrapS = _this_source.wrapS, wrapT = _this_source.wrapT;\n var _this_engine_gpuCapability_detail_maxTextureSize;\n var maxSize = (_this_engine_gpuCapability_detail_maxTextureSize = this.engine.gpuCapability.detail.maxTextureSize) != null ? _this_engine_gpuCapability_detail_maxTextureSize : 2048;\n var img = image;\n if (sourceType !== exports.TextureSourceType.video) {\n var shouldResize = minFilter !== gl.NEAREST || magFilter !== gl.NEAREST || wrapS !== gl.CLAMP_TO_EDGE || wrapT !== gl.CLAMP_TO_EDGE;\n shouldResize = shouldResize || image.width > maxSize || image.height > maxSize;\n if (shouldResize) {\n // fix android webgl1 img lost error\n setTimeout(function() {\n img = _this.resizeImage(image);\n });\n }\n }\n gl.texImage2D(target, level, internalformat, format, type, img);\n var size = [\n img.width,\n img.height\n ];\n if (sourceType === exports.TextureSourceType.video) {\n var videoWidth = image.videoWidth, videoHeight = image.videoHeight;\n return [\n videoWidth,\n videoHeight\n ];\n }\n return size;\n };\n _proto.texImage2DData = function texImage2DData(gl, target, level, internalformat, format, type, data) {\n var bufferView = data.data, width = data.width, height = data.height;\n // Uint8ClampedArray is incompatible in android\n var neoBuffer = format === gl.UNSIGNED_BYTE ? new Uint8Array(bufferView.buffer, bufferView.byteOffset, bufferView.byteLength / bufferView.BYTES_PER_ELEMENT) : bufferView;\n gl.texImage2D(target, level, internalformat, width, height, 0, format, type, neoBuffer);\n return [\n width,\n height\n ];\n };\n _proto.resizeImage = function resizeImage(image, targetWidth, targetHeight) {\n var detail = this.engine.gpuCapability.detail;\n var _detail_maxTextureSize;\n var maxSize = (_detail_maxTextureSize = detail.maxTextureSize) != null ? _detail_maxTextureSize : 2048;\n var gl = this.pipelineContext.gl;\n if (isWebGL2(gl) && image.width < maxSize && image.height < maxSize) {\n return image;\n }\n var canvas = resizeImageByCanvas(image, maxSize, targetWidth, targetHeight);\n if (canvas) {\n return canvas;\n }\n return image;\n };\n _proto.reloadData = function reloadData() {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (!_this.offloaded) return [\n 3,\n 2\n ];\n return [\n 4,\n getDefaultTextureFactory().reload(_this)\n ];\n case 1:\n _state.sent();\n _state.label = 2;\n case 2:\n return [\n 2\n ];\n }\n });\n })();\n };\n _proto.offloadData = function offloadData() {\n if (!(this.initialized && getDefaultTextureFactory().canOffloadTexture(this.source.sourceFrom))) {\n return;\n }\n var target = this.target;\n var gl = this.pipelineContext.gl;\n if (gl && this.textureBuffer) {\n var data = new Uint8Array([\n 255\n ]);\n this.bind();\n if (target === gl.TEXTURE_2D) {\n gl.texImage2D(target, 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n } else if (target === gl.TEXTURE_CUBE_MAP) {\n var faces = [\n gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,\n gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Z\n ];\n for(var i = 0; i < faces.length; i++){\n gl.texImage2D(faces[i], 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n }\n }\n // rewrite mipmap\n gl.generateMipmap(target);\n this.width = 1;\n this.height = 1;\n }\n this.offloaded = true;\n };\n _proto.uploadCurrentVideoFrame = function uploadCurrentVideoFrame() {\n var _this = this;\n return _async_to_generator(function() {\n return __generator(this, function(_state) {\n if (_this.source.sourceType === exports.TextureSourceType.video && _this.source.video && _this.initialized) {\n _this.update({\n video: _this.source.video\n });\n return [\n 2,\n true\n ];\n }\n return [\n 2,\n false\n ];\n });\n })();\n };\n _proto.updateSource = function updateSource(opts) {\n // @ts-expect-error\n this.source = this.assembleOptions(_extends({}, this.source, opts));\n this.sourceType = this.source.sourceType;\n this.sourceFrom = this.source.sourceFrom;\n this.update(this.source);\n };\n _proto.restore = function restore() {\n // TODO\n };\n _proto.dispose = function dispose() {\n /**\n * 原先Player是允许多次调用dispose,并且不会报错\n * dispose之后assignRenderer会报错\n */ if (this.pipelineContext && this.textureBuffer) {\n this.pipelineContext.gl.deleteTexture(this.textureBuffer);\n }\n this.width = 0;\n this.height = 0;\n this.textureBuffer = null;\n this.destroyed = true;\n this.update = function() {\n logger.error(\"This texture has been destroyed.\");\n };\n this.initialize = throwDestroyedError;\n if (this.engine !== undefined) {\n this.engine.removeTexture(this);\n }\n };\n return GLTexture;\n}(Texture);\nfunction resizeImageByCanvas(image, maxSize, targetWidth, targetHeight) {\n var width = image.width, height = image.height;\n var nw = Math.min(maxSize, targetWidth || nearestPowerOfTwo(width));\n var nh = Math.min(maxSize, targetHeight || nearestPowerOfTwo(height));\n if (nh !== height || nw !== width) {\n var canvas = canvasPool.getCanvas();\n var ctx = canvas.getContext(\"2d\");\n canvas.width = nw;\n canvas.height = nh;\n ctx == null ? void 0 : ctx.drawImage(image, 0, 0, width, height, 0, 0, nw, nh);\n logger.warn(\"Image resize from \" + width + \"x\" + height + \" to \" + nw + \"x\" + nh + \".\");\n return canvas;\n }\n}\nfunction isPowerOfTwo(value) {\n return (value & value - 1) === 0 && value !== 0;\n}\n\nvar GLVertexArrayObject = /*#__PURE__*/ function() {\n function GLVertexArrayObject(engine, name) {\n this.ready = false;\n this.disposed = false;\n this.gl = engine.getGLPipelineContext().gl;\n this.vaoExt = engine.gpuCapability.vaoExt;\n this.vao = this.createVertexArray(name);\n }\n var _proto = GLVertexArrayObject.prototype;\n _proto.bind = function bind() {\n this.bindVertexArray(this.vao);\n };\n _proto.unbind = function unbind() {\n this.bindVertexArray(null);\n };\n _proto.createVertexArray = function createVertexArray(name) {\n var vao = null;\n if (isWebGL2(this.gl)) {\n vao = this.gl.createVertexArray();\n }\n if (!vao && this.vaoExt) {\n vao = this.vaoExt.createVertexArrayOES();\n }\n assignInspectorName(vao, name);\n return vao;\n };\n /**\n * 根据 gpu level 选择对应的绑定函数\n * @param vao\n */ _proto.bindVertexArray = function bindVertexArray(vao) {\n if (isWebGL2(this.gl)) {\n this.gl.bindVertexArray(vao);\n } else {\n var _this_vaoExt;\n (_this_vaoExt = this.vaoExt) == null ? void 0 : _this_vaoExt.bindVertexArrayOES(vao);\n }\n };\n _proto.dispose = function dispose() {\n if (isWebGL2(this.gl)) {\n this.gl.deleteVertexArray(this.vao);\n } else {\n var _this_vaoExt;\n (_this_vaoExt = this.vaoExt) == null ? void 0 : _this_vaoExt.deleteVertexArrayOES(this.vao);\n }\n };\n return GLVertexArrayObject;\n}();\n\nvar seed$3 = 1;\nvar GLRendererInternal = /*#__PURE__*/ function() {\n function GLRendererInternal(engine) {\n this.engine = engine;\n this.textures = [];\n this.renderbuffers = [];\n this.framebuffers = [];\n this.destroyed = false;\n var d = {\n width: 1,\n height: 1,\n data: new Uint8Array([\n 255\n ])\n };\n var pipelineContext = engine.getGLPipelineContext();\n var gl = pipelineContext.gl;\n this.gl = gl;\n this.pipelineContext = pipelineContext;\n this.emptyTexture2D = new GLTexture(engine, {\n data: d,\n sourceType: exports.TextureSourceType.data,\n format: gl.LUMINANCE,\n internalFormat: gl.LUMINANCE,\n type: gl.UNSIGNED_BYTE\n });\n this.emptyTexture2D.initialize();\n this.emptyTextureCube = new GLTexture(engine, {\n target: gl.TEXTURE_CUBE_MAP,\n cube: [\n d,\n d,\n d,\n d,\n d,\n d\n ],\n sourceType: exports.TextureSourceType.data,\n format: gl.LUMINANCE,\n internalFormat: gl.LUMINANCE,\n type: gl.UNSIGNED_BYTE\n });\n this.emptyTextureCube.initialize();\n this.name = \"GLGPURenderer\" + seed$3;\n seed$3++;\n }\n var _proto = GLRendererInternal.prototype;\n _proto.copy2 = function copy2(source, target) {\n var gl = this.gl;\n if (!gl) {\n return;\n }\n if (!this.sourceFbo) {\n this.sourceFbo = gl.createFramebuffer();\n }\n if (!this.targetFbo) {\n this.targetFbo = gl.createFramebuffer();\n }\n var state = this.pipelineContext;\n state.bindFramebuffer(gl.FRAMEBUFFER, this.sourceFbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, source.textureBuffer, 0);\n state.bindFramebuffer(gl.FRAMEBUFFER, this.targetFbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target.textureBuffer, 0);\n state.bindFramebuffer(gl.READ_FRAMEBUFFER, this.sourceFbo);\n state.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.targetFbo);\n var filter = source.getWidth() === source.getHeight() && target.getWidth() == target.getHeight() ? gl.NEAREST : gl.LINEAR;\n gl.blitFramebuffer(0, 0, source.getWidth(), source.getHeight(), 0, 0, target.getWidth(), target.getHeight(), gl.COLOR_BUFFER_BIT, filter);\n state.bindFramebuffer(gl.FRAMEBUFFER, null);\n state.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n state.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n };\n _proto.resetColorAttachments = function resetColorAttachments(rp, colors) {\n rp.bind();\n rp.resetColorTextures(colors);\n };\n _proto.createGLRenderbuffer = function createGLRenderbuffer(renderbuffer) {\n var rb = this.gl.createRenderbuffer();\n if (rb) {\n addItem(this.renderbuffers, renderbuffer);\n }\n return rb;\n };\n _proto.resize = function resize(width, height) {\n var gl = this.gl;\n if (gl && gl.drawingBufferWidth !== width || gl.drawingBufferHeight !== height) {\n gl.canvas.width = width;\n gl.canvas.height = height;\n gl.viewport(0, 0, width, height);\n this.framebuffers.forEach(function(framebuffer) {\n var viewport = framebuffer.viewport;\n if (!framebuffer.isCustomViewport) {\n framebuffer.resize(viewport[0], viewport[1], width * framebuffer.viewportScale, height * framebuffer.viewportScale);\n }\n });\n }\n };\n _proto.drawGeometry = function drawGeometry(geometry, material, subMeshIndex) {\n if (!this.gl) {\n console.warn(\"GLGPURenderer has not bound a gl object, unable to render geometry.\");\n return;\n }\n var glGeometry = geometry;\n var glMaterial = material;\n var program = glMaterial.shaderVariant.program;\n if (!program) {\n return;\n }\n var vao = program.setupAttributes(glGeometry);\n var gl = this.gl;\n var indicesBuffer = glGeometry.indicesBuffer;\n var offset = glGeometry.drawStart;\n var count = glGeometry.drawCount;\n var mode = glGeometry.mode;\n var subMeshes = glGeometry.subMeshes;\n if (subMeshes && subMeshes.length) {\n var subMesh = subMeshes[subMeshIndex];\n // FIXME: 临时处理3D线框状态下隐藏模型\n if (count < 0) {\n return;\n }\n offset = subMesh.offset;\n if (indicesBuffer) {\n var _subMesh_indexCount;\n count = (_subMesh_indexCount = subMesh.indexCount) != null ? _subMesh_indexCount : 0;\n } else {\n count = subMesh.vertexCount;\n }\n }\n if (indicesBuffer) {\n gl.drawElements(mode, count, indicesBuffer.type, offset != null ? offset : 0);\n } else {\n gl.drawArrays(mode, offset, count);\n }\n vao == null ? void 0 : vao.unbind();\n };\n _proto.createGLFramebuffer = function createGLFramebuffer(framebuffer, name) {\n var fbo = this.gl.createFramebuffer();\n if (fbo) {\n addItem(this.framebuffers, framebuffer);\n assignInspectorName(fbo, name, name);\n } else {\n throw new Error(\"Failed to create WebGL framebuffer. gl isContextLost=\" + this.gl.isContextLost());\n }\n return fbo;\n };\n /**创建包裹VAO对象。 */ _proto.createVAO = function createVAO(name) {\n var ret = new GLVertexArrayObject(this.engine, name);\n return ret;\n };\n _proto.deleteGLTexture = function deleteGLTexture(texture) {\n if (texture.textureBuffer && !this.destroyed) {\n this.gl.deleteTexture(texture.textureBuffer);\n removeItem(this.textures, texture);\n // @ts-expect-error\n delete texture.textureBuffer;\n }\n };\n _proto.deleteGPUBuffer = function deleteGPUBuffer(buffer) {\n if (buffer && !this.destroyed) {\n this.gl.deleteBuffer(buffer.glBuffer);\n // @ts-expect-error\n delete buffer.glBuffer;\n }\n };\n _proto.deleteGLFramebuffer = function deleteGLFramebuffer(framebuffer) {\n if (framebuffer && !this.destroyed) {\n this.gl.deleteFramebuffer(framebuffer.fbo);\n removeItem(this.framebuffers, framebuffer);\n delete framebuffer.fbo;\n }\n };\n _proto.deleteGLRenderbuffer = function deleteGLRenderbuffer(renderbuffer) {\n if (renderbuffer && !this.destroyed) {\n this.gl.deleteRenderbuffer(renderbuffer.buffer);\n removeItem(this.renderbuffers, renderbuffer);\n // @ts-expect-error\n delete renderbuffer.buffer;\n }\n };\n _proto.deleteResource = function deleteResource() {\n var _this = this;\n var gl = this.gl;\n if (gl) {\n gl.deleteFramebuffer(this.sourceFbo);\n gl.deleteFramebuffer(this.targetFbo);\n this.emptyTexture2D.dispose();\n this.emptyTextureCube.dispose();\n this.framebuffers.forEach(function(fb) {\n return _this.deleteGLFramebuffer(fb);\n });\n this.framebuffers.length = 0;\n this.renderbuffers.forEach(function(rb) {\n return _this.deleteGLRenderbuffer(rb);\n });\n this.renderbuffers.length = 0;\n this.textures.forEach(function(tex) {\n return _this.deleteGLTexture(tex);\n });\n this.textures.length = 0;\n }\n };\n _proto.lost = function lost(e) {\n logger.error(\"WebGL context lost, destroying glRenderer by default to prevent memory leaks. Event target: \" + e.target + \".\");\n this.deleteResource();\n };\n _proto.dispose = function dispose() {\n this.deleteResource();\n // @ts-expect-error safe to assign\n this.emptyTexture2D = this.emptyTextureCube = this.pipelineContext = this.gpu = this.gl = null;\n this.destroyed = true;\n };\n _create_class(GLRendererInternal, [\n {\n key: \"height\",\n get: function get() {\n var _this_gl;\n return (_this_gl = this.gl) == null ? void 0 : _this_gl.drawingBufferHeight;\n }\n },\n {\n key: \"width\",\n get: function get() {\n var _this_gl;\n return (_this_gl = this.gl) == null ? void 0 : _this_gl.drawingBufferWidth;\n }\n },\n {\n key: \"canvas\",\n get: function get() {\n return this.gl.canvas;\n }\n },\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return GLRendererInternal;\n}();\nfunction assignInspectorName(obj, name, id) {\n if (name === undefined || obj === null) {\n return;\n }\n obj.__SPECTOR_Metadata = {\n name: name\n };\n if (obj.__SPECTOR_Object_TAG) {\n obj.__SPECTOR_Object_TAG.displayText = name;\n if (id) {\n obj.__SPECTOR_Object_TAG.id = id;\n }\n } else {\n obj.__SPECTOR_Object_TAG = {\n displayText: name,\n id: \"\"\n };\n }\n}\n\nvar GLGPUBuffer = /*#__PURE__*/ function() {\n function GLGPUBuffer(pipelineContext, props) {\n this.pipelineContext = pipelineContext;\n this.byteLength = 0;\n this.destroyed = false;\n var name = props.name, data = props.data, elementCount = props.elementCount, _props_target = props.target, target = _props_target === void 0 ? glContext.ARRAY_BUFFER : _props_target, _props_type = props.type, type = _props_type === void 0 ? glContext.FLOAT : _props_type, _props_usage = props.usage, usage = _props_usage === void 0 ? glContext.STATIC_DRAW : _props_usage;\n var bytesPerElement = getBytesPerElementByGLType(type);\n this.target = target;\n this.type = type;\n this.usage = usage;\n this.glBuffer = this.createGLBuffer(name);\n this.bytesPerElement = bytesPerElement;\n if (data) {\n this.bufferData(data);\n } else if (elementCount) {\n this.bufferData(bytesPerElement * elementCount);\n }\n }\n var _proto = GLGPUBuffer.prototype;\n _proto.createGLBuffer = function createGLBuffer(name) {\n var buffer = this.pipelineContext.gl.createBuffer();\n assignInspectorName(buffer, name);\n return buffer;\n };\n _proto.bind = function bind() {\n this.pipelineContext.gl.bindBuffer(this.target, this.glBuffer);\n };\n _proto.bufferData = function bufferData(data) {\n var byteLength = typeof data === \"number\" ? data : data.byteLength;\n if (this.pipelineContext) {\n this.byteLength = byteLength;\n var gl = this.pipelineContext.gl;\n var target = this.target;\n gl.bindBuffer(target, this.glBuffer);\n if (byteLength === 0) {\n // ios 12 13 cause error when byteLength == 0\n gl.bufferData(target, 1, this.usage);\n } else {\n gl.bufferData(target, byteLength, this.usage);\n if (typeof data !== \"number\") {\n gl.bufferSubData(target, 0, data);\n }\n }\n } else {\n this.byteLength = 0;\n }\n };\n _proto.bufferSubData = function bufferSubData(elementOffset, data) {\n if (this.pipelineContext) {\n var gl = this.pipelineContext.gl;\n var target = this.target;\n var byteOffset = elementOffset * this.bytesPerElement;\n var byteLength = byteOffset + data.byteLength;\n gl.bindBuffer(target, this.glBuffer);\n if (byteLength > this.byteLength) {\n this.byteLength = byteLength;\n gl.bufferData(target, byteLength, this.usage);\n }\n gl.bufferSubData(target, byteOffset, data);\n } else {\n this.byteLength = 0;\n }\n };\n _proto.dispose = function dispose() {\n this.pipelineContext.gl.deleteBuffer(this.glBuffer);\n // @ts-expect-error safe to assign\n this.glBuffer = null;\n this.destroyed = true;\n };\n // for test\n _proto.readSubData = function readSubData(elementOffset, dstBuffer) {\n if (isWebGL2(this.pipelineContext.gl)) {\n this.pipelineContext.gl.getBufferSubData(this.target, elementOffset * this.bytesPerElement, dstBuffer);\n return true;\n }\n return false;\n };\n _create_class(GLGPUBuffer, [\n {\n key: \"elementCount\",\n get: function get() {\n return this.byteLength / this.bytesPerElement;\n }\n },\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return GLGPUBuffer;\n}();\nvar _obj$2;\nvar map = (_obj$2 = {}, _obj$2[glContext.INT] = Int32Array, _obj$2[glContext.FLOAT] = Float32Array, _obj$2[glContext.SHORT] = Int16Array, _obj$2[glContext.BYTE] = Int8Array, _obj$2[glContext.UNSIGNED_BYTE] = Uint8Array, _obj$2[glContext.UNSIGNED_INT] = Uint32Array, _obj$2[glContext.UNSIGNED_SHORT] = Uint16Array, _obj$2);\nfunction getBytesPerElementByGLType(type) {\n var _map_type;\n var _map_type_BYTES_PER_ELEMENT;\n return (_map_type_BYTES_PER_ELEMENT = (_map_type = map[type]) == null ? void 0 : _map_type.BYTES_PER_ELEMENT) != null ? _map_type_BYTES_PER_ELEMENT : 0;\n}\n\nvar _obj$1;\nvar INDEX_TYPE_MAP = (_obj$1 = {}, _obj$1[Uint8Array.BYTES_PER_ELEMENT] = glContext.UNSIGNED_BYTE, _obj$1[Uint16Array.BYTES_PER_ELEMENT] = glContext.UNSIGNED_SHORT, _obj$1[Uint32Array.BYTES_PER_ELEMENT] = glContext.UNSIGNED_INT, _obj$1);\nvar seed$2 = 1;\n/**\n * 应用层 Geometry 对象,本身不直接保存 GPU 资源而是通过 geometryInternal 成员保存 GPU 资源\n */ var GLGeometry = /*#__PURE__*/ function(Geometry) {\n _inherits(GLGeometry, Geometry);\n function GLGeometry(engine, props) {\n var _this;\n _this = Geometry.call(this, engine) || this;\n _this.drawCount = 0;\n /**\n * 记录了顶点属性与 GPUBuffer 对应关系\n */ _this.buffers = {};\n _this.vaos = {};\n _this.skin = {};\n _this.initialized = false;\n _this.indicesReleasable = false;\n _this.attributesName = [];\n _this.destroyed = false;\n if (props) {\n _this.processProps(props);\n }\n return _this;\n }\n var _proto = GLGeometry.prototype;\n _proto.getOptions = function getOptions() {\n return _extends({}, this.options);\n };\n /**\n * Geometry 的 GPU 资源初始化方法,在绘制前调用\n */ _proto.initialize = function initialize() {\n var _this = this;\n if (this.initialized) {\n return;\n }\n var engine = this.engine;\n assertExist(engine);\n engine.addGeometry(this);\n var pipelineContext = this.engine.getGLPipelineContext();\n // 创建vbo\n Object.keys(this.bufferProps).forEach(function(name) {\n _this.buffers[name] = new GLGPUBuffer(pipelineContext, _this.bufferProps[name]);\n });\n // 创建ibo\n if (this.indices) {\n this.indicesBuffer = this.createIndicesBuffer(pipelineContext, this.indices);\n }\n this.initialized = true;\n // 向 GPU 传输顶点数据\n this.flush();\n this.options = undefined;\n };\n _proto.getAttributeBuffer = function getAttributeBuffer(name) {\n if (!this.initialized) {\n return undefined;\n }\n var key = this.attributes[name].dataSource;\n return this.buffers[key];\n };\n _proto.setAttributeData = function setAttributeData(name, data) {\n if (this.bufferProps == undefined) {\n return;\n }\n var bufferOption = this.getAttributeBufferOption(name);\n var key = this.attributes[name].dataSource;\n if (bufferOption) {\n var usage = bufferOption.usage, target = bufferOption.target;\n this.bufferProps[key] = {\n data: data,\n usage: usage,\n target: target,\n elementCount: data.length\n };\n this.dirtyFlags[key].discard = true;\n this.dirtyFlags[key].dirty = true;\n }\n };\n _proto.getAttributeData = function getAttributeData(name) {\n if (this.bufferProps == undefined) {\n return;\n }\n var bufferOption = this.getAttributeBufferOption(name);\n return bufferOption ? bufferOption.data : undefined;\n };\n _proto.setAttributeSubData = function setAttributeSubData(name, offset, data) {\n if (this.bufferProps == undefined) {\n return;\n }\n var attribute = this.getAttributeBufferOption(name);\n if (attribute && attribute.data != undefined) {\n var start = offset;\n var length = offset + data.length;\n if (attribute.data.length < length) {\n // @ts-expect-error safe to use\n var newData = new data.constructor(length);\n newData.set(attribute.data);\n attribute.data = newData;\n this.dirtyFlags[name].discard = true;\n } else if (!this.dirtyFlags[name].discard) {\n var dirtyFlag = this.dirtyFlags[name];\n if (dirtyFlag.start !== undefined) {\n dirtyFlag.start = Math.min(dirtyFlag.start, start);\n }\n if (dirtyFlag.end !== undefined) {\n dirtyFlag.end = Math.max(dirtyFlag.end, length - 1);\n }\n }\n attribute.data.set(data, start);\n this.dirtyFlags[name].dirty = true;\n }\n };\n _proto.getIndexData = function getIndexData() {\n return this.indices;\n };\n _proto.setIndexData = function setIndexData(data) {\n if (_instanceof1(data, Uint8Array) || _instanceof1(data, Uint16Array) || _instanceof1(data, Uint32Array)) {\n this.indices = data;\n this.dirtyFlags[\"index\"].discard = true;\n this.dirtyFlags[\"index\"].dirty = true;\n }\n };\n _proto.setIndexSubData = function setIndexSubData(offset, data) {\n if (this.indices) {\n var _this_indices;\n var start = offset;\n var length = offset + data.length;\n if (this.indices.length < length) {\n // @ts-expect-error safe to use\n var newData = new data.constructor(length);\n newData.set(this.indices);\n this.indices = newData;\n this.dirtyFlags[\"index\"].discard = true;\n } else if (!this.dirtyFlags[\"index\"].discard) {\n var dirtyFlag = this.dirtyFlags[\"index\"];\n if (dirtyFlag.start !== undefined) {\n dirtyFlag.start = Math.min(dirtyFlag.start, start);\n }\n if (dirtyFlag.end !== undefined) {\n dirtyFlag.end = Math.max(dirtyFlag.end, length - 1);\n }\n }\n (_this_indices = this.indices) == null ? void 0 : _this_indices.set(data, start);\n this.dirtyFlags[\"index\"].dirty = true;\n }\n };\n _proto.getAttributeStride = function getAttributeStride(name) {\n var attr = this.attributes[name];\n var stride = attr.stride, size = attr.size, type = attr.type;\n return stride ? stride : size * BYTES_TYPE_MAP[type];\n };\n _proto.getAttributeNames = function getAttributeNames() {\n return this.attributesName;\n };\n _proto.setDrawStart = function setDrawStart(count) {\n this.drawStart = count;\n };\n _proto.getDrawStart = function getDrawStart() {\n return this.drawStart;\n };\n _proto.setDrawCount = function setDrawCount(count) {\n this.drawCount = count;\n };\n _proto.getDrawCount = function getDrawCount() {\n return this.drawCount;\n };\n _proto.getSkinProps = function getSkinProps() {\n return this.skin;\n };\n // 根据 attribute 的 datasource 获取 js 端 buffer\n _proto.getAttributeBufferOption = function getAttributeBufferOption(name) {\n var attribute = this.attributes[name];\n return attribute ? this.bufferProps[attribute.dataSource] : undefined;\n };\n _proto.createIndicesBuffer = function createIndicesBuffer(pipelineContext, data) {\n var type = INDEX_TYPE_MAP[data.BYTES_PER_ELEMENT];\n var indexProps = {\n data: data,\n target: glContext.ELEMENT_ARRAY_BUFFER,\n type: type,\n name: \"\" + this.name + \"##index\"\n };\n return new GLGPUBuffer(pipelineContext, indexProps);\n };\n _proto.flush = function flush() {\n var _this = this;\n if (!this.initialized) {\n return;\n }\n var attributes = this.attributes;\n var bufferProps = this.bufferProps;\n var indices = this.indices;\n Object.keys(this.dirtyFlags).forEach(function(name) {\n var flag = _this.dirtyFlags[name];\n var buffer;\n var data;\n if (name == \"index\") {\n buffer = _this.indicesBuffer;\n data = indices;\n } else {\n var bufferName = attributes[name].dataSource;\n buffer = _this.buffers[bufferName];\n data = bufferProps[bufferName].data;\n }\n if ((flag.dirty || flag.discard) && buffer && data) {\n if (flag.discard) {\n buffer.bufferData(data);\n } else {\n if (flag.start !== undefined && flag.end !== undefined) {\n var offset = flag.start * data.BYTES_PER_ELEMENT + data.byteOffset;\n var length = flag.end - flag.start + 1;\n // @ts-expect-error safe to use\n var subData = new data.constructor(data.buffer, offset, length);\n buffer.bufferSubData(flag.start, subData);\n }\n }\n flag.start = Number.POSITIVE_INFINITY;\n flag.end = 0;\n flag.dirty = flag.discard = false;\n }\n });\n // 需要释放的 attributes 数据\n Object.keys(this.attributesReleasable).forEach(function(name) {\n var releasable = _this.attributesReleasable[name];\n var bufferName = attributes[name].dataSource;\n if (bufferProps[bufferName] && releasable) {\n bufferProps[bufferName].data = undefined;\n }\n });\n // 释放 indices buffer\n if (this.indicesReleasable) ;\n };\n _proto.processProps = function processProps(data) {\n var props = data;\n var _props_drawStart = props.drawStart, drawStart = _props_drawStart === void 0 ? 0 : _props_drawStart, drawCount = props.drawCount, mode = props.mode, indices = props.indices, _props_name = props.name, name = _props_name === void 0 ? \"effectsGeometry:\" + seed$2++ : _props_name, _props_bufferUsage = props.bufferUsage, bufferUsage = _props_bufferUsage === void 0 ? glContext.STATIC_DRAW : _props_bufferUsage;\n this.name = name;\n // 记录顶点属性,需要与 Shader 中 attribute 进行关联\n var bufferProps = {};\n var attributesName = [];\n var attributes = {};\n // key为buffer的名字\n var dirtyFlags = {};\n var attributesReleasable = {};\n var usage = bufferUsage;\n this.drawStart = drawStart;\n if (drawCount !== undefined) {\n this.drawCount = drawCount;\n }\n this.mode = isNaN(mode) ? glContext.TRIANGLES : mode;\n Object.keys(props.attributes).forEach(function(name) {\n var attr = props.attributes[name];\n var size = attr.size, stride = attr.stride, offset = attr.offset, normalize = attr.normalize;\n var _attr_type = attr.type, type = _attr_type === void 0 ? glContext.FLOAT : _attr_type, releasable = attr.releasable;\n var _$data = attr.data;\n if (type && !(\"dataSource\" in attr) && !_$data) {\n _$data = generateEmptyTypedArray(type);\n }\n if (_$data) {\n var glType = _instanceof1(_$data, Float32Array) ? glContext.FLOAT : glContext.INT;\n // 使用 AttributeWithData 构造的 attribute\n bufferProps[name] = {\n data: _$data,\n usage: usage,\n target: glContext.ARRAY_BUFFER,\n name: name\n };\n attributes[name] = {\n size: size,\n stride: stride,\n offset: offset,\n type: type != null ? type : glType,\n normalize: !!normalize,\n dataSource: name\n };\n attributesReleasable[name] = releasable != null ? releasable : false;\n dirtyFlags[name] = {\n dirty: true,\n discard: true,\n start: Number.POSITIVE_INFINITY,\n end: 0\n };\n } else {\n // 使用 AttributeWithType 构造的 attribute\n var dataSource = attr.dataSource;\n if (dataSource) {\n // 属性共享 buffer\n attributes[name] = {\n size: size,\n stride: stride,\n offset: offset,\n type: type,\n dataSource: dataSource,\n normalize: !!normalize\n };\n }\n }\n attributesName.push(name);\n });\n dirtyFlags.index = {\n dirty: true,\n discard: true,\n start: Number.POSITIVE_INFINITY,\n end: 0\n };\n // 顶点索引\n this.indices = indices == null ? void 0 : indices.data;\n this.indicesReleasable = (indices == null ? void 0 : indices.releasable) === true;\n this.bufferProps = bufferProps;\n this.attributes = attributes;\n this.attributesName = attributesName;\n this.attributesReleasable = attributesReleasable;\n this.dirtyFlags = dirtyFlags;\n this.options = props;\n this.initialized = false;\n };\n _proto.fromData = function fromData(data) {\n var _this = this;\n Geometry.prototype.fromData.call(this, data);\n this.subMeshes = data.subMeshes;\n var buffer;\n if (data.buffer) {\n buffer = new Uint8Array(decodeBase64ToArrays(data.buffer));\n } else if (data.binaryData) {\n buffer = data.binaryData;\n }\n if (!buffer) {\n return;\n }\n var vertexCount = data.vertexData.vertexCount;\n if (this.hasSemantic(data)) {\n var geometryProps = {\n mode: glContext.TRIANGLES,\n attributes: {}\n };\n data.vertexData.channels.forEach(function(channel) {\n var _vertexBufferSemanticMap_channel_semantic;\n var attribName = (_vertexBufferSemanticMap_channel_semantic = vertexBufferSemanticMap[channel.semantic]) != null ? _vertexBufferSemanticMap_channel_semantic : channel.semantic;\n var attribBuffer = _this.createVertexTypedArray(channel, buffer, vertexCount);\n geometryProps.attributes[attribName] = {\n type: vertexFormatType2GLType(channel.format),\n size: channel.dimension,\n data: attribBuffer,\n normalize: channel.normalize\n };\n });\n if (data.indexFormat !== IndexFormatType.None) {\n var indexBuffer = this.createIndexTypedArray(data.indexFormat, buffer, data.indexOffset);\n geometryProps.indices = {\n data: indexBuffer\n };\n geometryProps.drawCount = indexBuffer.length;\n } else {\n geometryProps.drawCount = vertexCount;\n }\n this.processProps(geometryProps);\n } else {\n var positionChannel = data.vertexData.channels[0];\n var uvChannel = data.vertexData.channels[1];\n var normalChannel = data.vertexData.channels[2];\n // 根据提供的长度信息创建 Float32Array\n var positionBuffer = this.createVertexTypedArray(positionChannel, buffer, vertexCount);\n var uvBuffer = this.createVertexTypedArray(uvChannel, buffer, vertexCount);\n var normalBuffer = this.createVertexTypedArray(normalChannel, buffer, vertexCount);\n // 根据提供的长度信息创建 Uint16Array,它紧随 Float32Array 数据之后\n var indexBuffer1 = this.createIndexTypedArray(data.indexFormat, buffer, data.indexOffset);\n var geometryProps1 = {\n mode: glContext.TRIANGLES,\n attributes: {\n aPos: {\n type: vertexFormatType2GLType(positionChannel.format),\n size: 3,\n data: positionBuffer,\n normalize: positionChannel.normalize\n },\n aUV: {\n type: vertexFormatType2GLType(uvChannel.format),\n size: 2,\n data: uvBuffer,\n normalize: uvChannel.normalize\n },\n aNormal: {\n type: vertexFormatType2GLType(normalChannel.format),\n size: 3,\n data: normalBuffer,\n normalize: normalChannel.normalize\n }\n }\n };\n geometryProps1.indices = {\n data: indexBuffer1\n };\n geometryProps1.drawCount = indexBuffer1.length;\n this.processProps(geometryProps1);\n }\n this.skin = {\n boneNames: data.boneNames,\n rootBoneName: data.rootBoneName,\n inverseBindMatrices: data.inverseBindMatrices\n };\n };\n _proto.dispose = function dispose() {\n var _this = this;\n this.drawStart = 0;\n this.drawCount = NaN;\n this.bufferProps = {};\n this.indices = undefined;\n this.attributes = {};\n this.attributesName = [];\n this.options = undefined;\n if (this.initialized) {\n var _this_indicesBuffer;\n Object.keys(this.buffers).forEach(function(name) {\n _this.buffers[name].dispose();\n });\n this.buffers = {};\n (_this_indicesBuffer = this.indicesBuffer) == null ? void 0 : _this_indicesBuffer.dispose();\n Object.keys(this.vaos).forEach(function(name) {\n var _this_vaos_name;\n (_this_vaos_name = _this.vaos[name]) == null ? void 0 : _this_vaos_name.dispose();\n _this.vaos[name] = undefined;\n });\n this.indicesBuffer = undefined;\n if (this.engine !== undefined) {\n this.engine.removeGeometry(this);\n // @ts-expect-error\n this.engine = undefined;\n }\n }\n this.destroyed = true;\n };\n _proto.createVertexTypedArray = function createVertexTypedArray(channel, baseBuffer, vertexCount) {\n var arrayBuffer = baseBuffer.buffer;\n switch(channel.format){\n case VertexFormatType.Float32:\n return new Float32Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n case VertexFormatType.Int16:\n return new Int16Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n case VertexFormatType.Int8:\n return new Int8Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n case VertexFormatType.UInt16:\n return new Uint16Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n case VertexFormatType.UInt8:\n return new Uint8Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n default:\n console.error(\"Invalid vertex format type: \" + channel.format + \".\");\n return new Float32Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n }\n };\n _proto.createIndexTypedArray = function createIndexTypedArray(type, baseBuffer, offset) {\n var arrayBuffer = baseBuffer.buffer;\n switch(type){\n case IndexFormatType.UInt16:\n return new Uint16Array(arrayBuffer, baseBuffer.byteOffset + offset);\n case IndexFormatType.UInt32:\n return new Uint32Array(arrayBuffer, baseBuffer.byteOffset + offset);\n default:\n console.error(\"Invalid index format type: \" + type + \".\");\n return new Uint32Array(arrayBuffer, baseBuffer.byteOffset + offset);\n }\n };\n _proto.hasSemantic = function hasSemantic(data) {\n var hasSemantic = false;\n var vertexData = data.vertexData;\n vertexData.channels.forEach(function(channel) {\n if (channel.semantic && channel.semantic.length > 0) {\n hasSemantic = true;\n }\n });\n return hasSemantic;\n };\n _create_class(GLGeometry, [\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n },\n {\n key: \"isInitialized\",\n get: function get() {\n return this.initialized;\n }\n }\n ]);\n return GLGeometry;\n}(Geometry);\nvar vertexBufferSemanticMap = {\n POSITION: \"aPos\",\n TEXCOORD0: \"aUV\",\n TEXCOORD_0: \"aUV\",\n TEXCOORD1: \"aUV2\",\n NORMAL: \"aNormal\",\n TANGENT: \"aTangent\",\n COLOR: \"aColor\",\n JOINTS: \"aJoints\",\n JOINTS_0: \"aJoints\",\n WEIGHTS: \"aWeights\",\n WEIGHTS_0: \"aWeights\",\n //\n POSITION_BS0: \"aTargetPosition0\",\n POSITION_BS1: \"aTargetPosition1\",\n POSITION_BS2: \"aTargetPosition2\",\n POSITION_BS3: \"aTargetPosition3\",\n POSITION_BS4: \"aTargetPosition4\",\n POSITION_BS5: \"aTargetPosition5\",\n POSITION_BS6: \"aTargetPosition6\",\n POSITION_BS7: \"aTargetPosition7\",\n NORMAL_BS0: \"aTargetNormal0\",\n NORMAL_BS1: \"aTargetNormal1\",\n NORMAL_BS2: \"aTargetNormal2\",\n NORMAL_BS3: \"aTargetNormal3\",\n TANGENT_BS0: \"aTargetTangent0\",\n TANGENT_BS1: \"aTargetTangent1\",\n TANGENT_BS2: \"aTargetTangent2\",\n TANGENT_BS3: \"aTargetTangent3\"\n};\nfunction decodeBase64ToArrays(base64String) {\n // 将 Base64 编码的字符串转换为二进制字符串\n var binaryString = atob(base64String);\n // 将二进制字符串转换为字节数组\n var bytes = new Uint8Array(binaryString.length);\n for(var i = 0; i < binaryString.length; i++){\n bytes[i] = binaryString.charCodeAt(i);\n }\n // 创建 ArrayBuffer 并为其创建视图\n var buffer = bytes.buffer;\n // 返回解码后的数组\n return buffer;\n}\n\nvar GLMaterialState = /*#__PURE__*/ function() {\n function GLMaterialState() {\n this.reset();\n }\n var _proto = GLMaterialState.prototype;\n _proto.setBlendColor = function setBlendColor(color) {\n var r = color[0], g = color[1], b = color[2], a = color[3];\n if (this.blendColor[0] === r && this.blendColor[1] === g && this.blendColor[2] === b && this.blendColor[3] === a) {\n return;\n }\n this.blendColor[0] = r;\n this.blendColor[1] = g;\n this.blendColor[2] = b;\n this.blendColor[3] = a;\n };\n _proto.setBlending = function setBlending(value) {\n if (this.blending !== value) {\n this.blending = value;\n }\n };\n _proto.setBlendFunctionParameters = function setBlendFunctionParameters(value) {\n var blendSrc = value[0], blendDst = value[1], blendSrcAlpha = value[2], blendDstAlpha = value[3];\n if (this.blendFunctionParameters[0] === blendSrc && this.blendFunctionParameters[1] === blendDst && this.blendFunctionParameters[2] === blendSrcAlpha && this.blendFunctionParameters[3] === blendDstAlpha) {\n return;\n }\n this.blendFunctionParameters[0] = blendSrc;\n this.blendFunctionParameters[1] = blendDst;\n this.blendFunctionParameters[2] = blendSrcAlpha;\n this.blendFunctionParameters[3] = blendDstAlpha;\n };\n _proto.setBlendEquationParameters = function setBlendEquationParameters(value) {\n var rgb = value[0], alpha = value[1];\n if (this.blendEquationParameters[0] === rgb && this.blendEquationParameters[1] === alpha) {\n return;\n }\n this.blendEquationParameters[0] = rgb;\n this.blendEquationParameters[1] = alpha;\n };\n _proto.setDepthTest = function setDepthTest(value) {\n if (this.depthTest === value) {\n return;\n }\n this.depthTest = value;\n };\n _proto.setDepthMask = function setDepthMask(value) {\n if (this.depthMask === value) {\n return;\n }\n this.depthMask = value;\n };\n _proto.setDepthRange = function setDepthRange(value) {\n if (this.depthRange[0] === value[0] && this.depthRange[1] === value[1]) {\n return;\n }\n this.depthRange[0] = value[0];\n this.depthRange[1] = value[1];\n };\n _proto.setDepthFunc = function setDepthFunc(value) {\n if (this.depthFunc === value) {\n return;\n }\n this.depthFunc = value;\n };\n _proto.setPolygonOffsetFill = function setPolygonOffsetFill(value) {\n if (this.polygonOffsetFill === value) {\n return;\n }\n this.polygonOffsetFill = value;\n };\n _proto.setPolygonOffset = function setPolygonOffset(value) {\n if (this.polygonOffset[0] === value[0] && this.polygonOffset[1] === value[1]) {\n return;\n }\n this.polygonOffset[0] = value[0];\n this.polygonOffset[1] = value[1];\n };\n _proto.setSampleAlphaToCoverage = function setSampleAlphaToCoverage(value) {\n if (this.sampleAlphaToCoverage === value) {\n return;\n }\n this.sampleAlphaToCoverage = value;\n };\n _proto.setColorMask = function setColorMask(colorMask) {\n this.colorMask[0] = colorMask;\n this.colorMask[1] = colorMask;\n this.colorMask[2] = colorMask;\n this.colorMask[3] = colorMask;\n };\n _proto.setStencilTest = function setStencilTest(value) {\n if (this.stencilTest === value) {\n return;\n }\n this.stencilTest = value;\n };\n _proto.setStencilMask = function setStencilMask(value) {\n if (this.stencilMask[0] === value[0] && this.stencilMask[1] === value[1]) {\n return;\n }\n this.stencilMask[0] = value[0];\n this.stencilMask[1] = value[1];\n };\n _proto.setStencilRef = function setStencilRef(value) {\n if (this.stencilRef[0] === value[0] && this.stencilRef[1] === value[1]) {\n return;\n }\n this.stencilRef[0] = value[0];\n this.stencilRef[1] = value[1];\n };\n _proto.setStencilFunc = function setStencilFunc(value) {\n if (this.stencilFunc[0] === value[0] && this.stencilFunc[1] === value[1]) {\n return;\n }\n this.stencilFunc[0] = value[0];\n this.stencilFunc[1] = value[1];\n };\n _proto.setStencilOpFail = function setStencilOpFail(value) {\n if (this.stencilOpFail[0] === value[0] && this.stencilOpFail[1] === value[1]) {\n return;\n }\n this.stencilOpFail[0] = value[0];\n this.stencilOpFail[1] = value[1];\n };\n _proto.setStencilOpZFail = function setStencilOpZFail(value) {\n if (this.stencilOpZFail[0] === value[0] && this.stencilOpZFail[1] === value[1]) {\n return;\n }\n this.stencilOpZFail[0] = value[0];\n this.stencilOpZFail[1] = value[1];\n };\n _proto.setStencilOpZPass = function setStencilOpZPass(value) {\n if (this.stencilOpZPass[0] === value[0] && this.stencilOpZPass[1] === value[1]) {\n return;\n }\n this.stencilOpZPass[0] = value[0];\n this.stencilOpZPass[1] = value[1];\n };\n _proto.setCulling = function setCulling(value) {\n if (this.culling === value) {\n return;\n }\n this.culling = value;\n };\n _proto.setFrontFace = function setFrontFace(value) {\n if (this.frontFace === value) {\n return;\n }\n this.frontFace = value;\n };\n _proto.setCullFace = function setCullFace(value) {\n if (this.cullFace === value) {\n return;\n }\n this.cullFace = value;\n };\n _proto.reset = function reset() {\n this.blending = false;\n this.blendColor = [\n 0,\n 0,\n 0,\n 0\n ];\n this.blendFunctionParameters = [\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA,\n glContext.ONE,\n glContext.ONE_MINUS_SRC_ALPHA\n ];\n this.blendEquationParameters = [\n glContext.FUNC_ADD,\n glContext.FUNC_ADD\n ];\n this.depthTest = true;\n this.depthMask = true;\n this.depthRange = [\n 0,\n 1\n ];\n this.depthFunc = glContext.LESS;\n this.polygonOffset = [\n 0,\n 0\n ];\n this.polygonOffsetFill = false;\n this.sampleAlphaToCoverage = false;\n this.colorMask = [\n true,\n true,\n true,\n true\n ];\n this.stencilTest = false;\n this.stencilMask = [\n 0xFF,\n 0xFF\n ];\n this.stencilRef = [\n 0,\n 0\n ];\n this.stencilFunc = [\n glContext.ALWAYS,\n glContext.ALWAYS\n ];\n this.stencilOpFail = [\n glContext.KEEP,\n glContext.KEEP\n ];\n this.stencilOpZFail = [\n glContext.KEEP,\n glContext.KEEP\n ];\n this.stencilOpZPass = [\n glContext.KEEP,\n glContext.KEEP\n ];\n this.culling = false;\n this.frontFace = glContext.CCW;\n this.cullFace = glContext.FRONT;\n };\n _proto.apply = function apply(pipelineContext) {\n pipelineContext.toggle(glContext.SAMPLE_ALPHA_TO_COVERAGE, this.sampleAlphaToCoverage);\n pipelineContext.toggle(glContext.BLEND, this.blending);\n pipelineContext.toggle(glContext.DEPTH_TEST, this.depthTest);\n pipelineContext.toggle(glContext.STENCIL_TEST, this.stencilTest);\n pipelineContext.toggle(glContext.CULL_FACE, this.culling);\n pipelineContext.toggle(glContext.POLYGON_OFFSET_FILL, this.polygonOffsetFill);\n if (this.stencilTest) {\n //stencil\n pipelineContext.stencilMaskSeparate(glContext.BACK, this.stencilMask[1]);\n pipelineContext.stencilMaskSeparate(glContext.FRONT, this.stencilMask[0]);\n pipelineContext.stencilFuncSeparate(glContext.BACK, this.stencilFunc[0], this.stencilRef[0], this.stencilMask[0]);\n pipelineContext.stencilFuncSeparate(glContext.FRONT, this.stencilFunc[1], this.stencilRef[1], this.stencilMask[1]);\n pipelineContext.stencilOpSeparate(glContext.BACK, this.stencilOpFail[0], this.stencilOpZFail[0], this.stencilOpZPass[0]);\n pipelineContext.stencilOpSeparate(glContext.FRONT, this.stencilOpFail[1], this.stencilOpZFail[1], this.stencilOpZPass[1]);\n }\n if (this.blending) {\n var _this = this, blendColor = _this.blendColor, blendEquationParameters = _this.blendEquationParameters, blendFunctionParameters = _this.blendFunctionParameters;\n pipelineContext.blendColor(blendColor[0], blendColor[1], blendColor[2], blendColor[3]);\n pipelineContext.blendEquationSeparate(blendEquationParameters[0], blendEquationParameters[1]);\n pipelineContext.blendFuncSeparate(blendFunctionParameters[0], blendFunctionParameters[1], blendFunctionParameters[2], blendFunctionParameters[3]);\n }\n //color depth\n pipelineContext.colorMask(this.colorMask[0], this.colorMask[1], this.colorMask[2], this.colorMask[3]);\n if (this.depthTest) {\n pipelineContext.depthMask(this.depthMask);\n pipelineContext.depthFunc(this.depthFunc);\n pipelineContext.depthRange(this.depthRange[0], this.depthRange[1]);\n }\n if (this.culling) {\n //face\n pipelineContext.cullFace(this.cullFace);\n pipelineContext.frontFace(this.frontFace);\n }\n if (this.polygonOffsetFill) {\n pipelineContext.polygonOffset(this.polygonOffset[0], this.polygonOffset[1]);\n }\n };\n return GLMaterialState;\n}();\n\nvar Vector4 = Vector4$1, Matrix4 = Matrix4$1;\nvar GLMaterial = /*#__PURE__*/ function(Material) {\n _inherits(GLMaterial, Material);\n function GLMaterial(engine, props) {\n var _this;\n _this = Material.call(this, engine, props) || this;\n // material存放的uniform数据。\n _this.floats = {};\n _this.ints = {};\n _this.vector2s = {};\n _this.vector3s = {};\n _this.vector4s = {};\n _this.colors = {};\n _this.quaternions = {};\n _this.matrices = {};\n _this.matrice3s = {};\n _this.textures = {};\n _this.floatArrays = {};\n _this.vector4Arrays = {};\n _this.matrixArrays = {};\n _this.samplers = [] // material存放的sampler名称。\n ;\n _this.uniforms = [] // material存放的uniform名称(不包括sampler)。\n ;\n _this.uniformDirty = true;\n _this.macrosDirty = true;\n _this.glMaterialState = new GLMaterialState();\n if (props) {\n _this.shader = new exports.Shader(engine);\n _this.shader.shaderData = _extends({}, props.shader, {\n id: generateGUID(),\n dataType: DataType.Shader\n });\n }\n return _this;\n }\n var _proto = GLMaterial.prototype;\n _proto.enableMacro = function enableMacro(keyword, value) {\n if (!this.isMacroEnabled(keyword) || this.enabledMacros[keyword] !== value) {\n this.enabledMacros[keyword] = value != null ? value : true;\n this.macrosDirty = true;\n }\n };\n _proto.disableMacro = function disableMacro(keyword) {\n if (this.isMacroEnabled(keyword)) {\n delete this.enabledMacros[keyword];\n this.macrosDirty = true;\n }\n };\n _proto.isMacroEnabled = function isMacroEnabled(keyword) {\n return this.enabledMacros[keyword] !== undefined;\n };\n /**shader和texture的GPU资源初始化。 */ _proto.initialize = function initialize() {\n var _this = this;\n var engine = this.engine;\n this.createShaderVariant();\n this.shaderVariant.initialize();\n if (this.initialized) {\n return;\n }\n engine.addMaterial(this);\n Object.keys(this.textures).forEach(function(key) {\n var texture = _this.textures[key];\n if (!isFunction(texture.initialize)) {\n logger.error(\"Failed to initialize texture: \" + JSON.stringify(texture) + \". Ensure the texture conforms to the expected format.\");\n return;\n }\n texture.initialize();\n });\n this.initialized = true;\n };\n _proto.createShaderVariant = function createShaderVariant() {\n if (this.shaderDirty || this.macrosDirty) {\n this.shaderVariant = this.shader.createVariant(this.enabledMacros);\n this.macrosDirty = false;\n this.shaderDirty = false;\n this.uniformDirty = true;\n }\n };\n _proto.setupStates = function setupStates(pipelineContext) {\n this.glMaterialState.apply(pipelineContext);\n };\n _proto.use = function use(renderer, globalUniforms) {\n var engine = renderer.engine;\n var pipelineContext = engine.getGLPipelineContext();\n var shaderVariant = this.shaderVariant;\n if (!shaderVariant.program) {\n var _this_engine;\n (_this_engine = this.engine) == null ? void 0 : _this_engine.renderErrors.add(new Error(\"Shader program is not initialized.\"));\n return;\n }\n shaderVariant.program.bind();\n this.setupStates(pipelineContext);\n var name;\n if (globalUniforms) {\n // 加入全局 uniform 名称\n for(var _iterator = _create_for_of_iterator_helper_loose(globalUniforms.uniforms), _step; !(_step = _iterator()).done;){\n name = _step.value;\n this.checkUniform(name);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(globalUniforms.samplers), _step1; !(_step1 = _iterator1()).done;){\n name = _step1.value;\n if (!this.samplers.includes(name)) {\n this.samplers.push(name);\n this.uniformDirty = true;\n }\n }\n }\n // 更新 cached uniform location\n if (this.uniformDirty) {\n shaderVariant.fillShaderInformation(this.uniforms, this.samplers);\n this.uniformDirty = false;\n }\n if (globalUniforms) {\n // 设置全局 uniform\n for(name in globalUniforms.floats){\n shaderVariant.setFloat(name, globalUniforms.floats[name]);\n }\n for(name in globalUniforms.ints){\n shaderVariant.setInt(name, globalUniforms.ints[name]);\n }\n for(name in globalUniforms.vector4s){\n shaderVariant.setVector4(name, globalUniforms.vector4s[name]);\n }\n for(name in globalUniforms.vector3s){\n shaderVariant.setVector3(name, globalUniforms.vector3s[name]);\n }\n for(name in globalUniforms.matrices){\n shaderVariant.setMatrix(name, globalUniforms.matrices[name]);\n }\n }\n // 检查贴图数据是否初始化。\n for(name in this.textures){\n if (!this.textures[name].textureBuffer) {\n this.textures[name].initialize();\n }\n }\n for(name in this.floats){\n shaderVariant.setFloat(name, this.floats[name]);\n }\n for(name in this.ints){\n shaderVariant.setInt(name, this.ints[name]);\n }\n for(name in this.floatArrays){\n shaderVariant.setFloats(name, this.floatArrays[name]);\n }\n for(name in this.textures){\n shaderVariant.setTexture(name, this.textures[name]);\n }\n for(name in this.vector2s){\n shaderVariant.setVector2(name, this.vector2s[name]);\n }\n for(name in this.vector3s){\n shaderVariant.setVector3(name, this.vector3s[name]);\n }\n for(name in this.vector4s){\n shaderVariant.setVector4(name, this.vector4s[name]);\n }\n for(name in this.colors){\n shaderVariant.setColor(name, this.colors[name]);\n }\n for(name in this.quaternions){\n shaderVariant.setQuaternion(name, this.quaternions[name]);\n }\n for(name in this.matrices){\n shaderVariant.setMatrix(name, this.matrices[name]);\n }\n for(name in this.matrice3s){\n shaderVariant.setMatrix3(name, this.matrice3s[name]);\n }\n for(name in this.vector4Arrays){\n shaderVariant.setVector4Array(name, this.vector4Arrays[name]);\n }\n for(name in this.matrixArrays){\n shaderVariant.setMatrixArray(name, this.matrixArrays[name]);\n }\n };\n _proto.getFloat = function getFloat(name) {\n return this.floats[name];\n };\n _proto.setFloat = function setFloat(name, value) {\n this.checkUniform(name);\n this.floats[name] = value;\n };\n _proto.getInt = function getInt(name) {\n return this.ints[name];\n };\n _proto.setInt = function setInt(name, value) {\n this.checkUniform(name);\n this.ints[name] = value;\n };\n _proto.getFloats = function getFloats(name) {\n return this.floatArrays[name];\n };\n _proto.setFloats = function setFloats(name, value) {\n this.checkUniform(name);\n this.floatArrays[name] = value;\n };\n _proto.getVector2 = function getVector2(name) {\n return this.vector2s[name];\n };\n _proto.setVector2 = function setVector2(name, value) {\n this.checkUniform(name);\n this.vector2s[name] = value;\n };\n _proto.getVector3 = function getVector3(name) {\n return this.vector3s[name];\n };\n _proto.setVector3 = function setVector3(name, value) {\n this.checkUniform(name);\n this.vector3s[name] = value;\n };\n _proto.getVector4 = function getVector4(name) {\n return this.vector4s[name];\n };\n _proto.setVector4 = function setVector4(name, value) {\n this.checkUniform(name);\n this.vector4s[name] = value;\n };\n _proto.getColor = function getColor(name) {\n return this.colors[name];\n };\n _proto.setColor = function setColor(name, value) {\n this.checkUniform(name);\n this.colors[name] = value;\n };\n _proto.getQuaternion = function getQuaternion(name) {\n return this.quaternions[name];\n };\n _proto.setQuaternion = function setQuaternion(name, value) {\n this.checkUniform(name);\n this.quaternions[name] = value;\n };\n _proto.getMatrix = function getMatrix(name) {\n return this.matrices[name];\n };\n _proto.setMatrix = function setMatrix(name, value) {\n this.checkUniform(name);\n this.matrices[name] = value;\n };\n _proto.setMatrix3 = function setMatrix3(name, value) {\n this.checkUniform(name);\n this.matrice3s[name] = value;\n };\n _proto.getVector4Array = function getVector4Array(name) {\n return this.vector4Arrays[name];\n };\n _proto.setVector4Array = function setVector4Array(name, array) {\n this.checkUniform(name);\n this.vector4Arrays[name] = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(array), _step; !(_step = _iterator()).done;){\n var v = _step.value;\n this.vector4Arrays[name].push(v.x, v.y, v.z, v.w);\n }\n };\n _proto.getMatrixArray = function getMatrixArray(name) {\n return this.matrixArrays[name];\n };\n _proto.setMatrixArray = function setMatrixArray(name, array) {\n this.checkUniform(name);\n this.matrixArrays[name] = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(array), _step; !(_step = _iterator()).done;){\n var m = _step.value;\n for(var i = 0; i < 16; i++){\n this.matrixArrays[name].push(m.elements[i]);\n }\n }\n };\n _proto.setMatrixNumberArray = function setMatrixNumberArray(name, array) {\n this.checkUniform(name);\n this.matrixArrays[name] = array;\n };\n _proto.getTexture = function getTexture(name) {\n return this.textures[name];\n };\n _proto.setTexture = function setTexture(name, texture) {\n if (!this.samplers.includes(name)) {\n this.samplers.push(name);\n this.uniformDirty = true;\n }\n this.textures[name] = texture;\n };\n _proto.hasUniform = function hasUniform(name) {\n return this.uniforms.includes(name) || this.samplers.includes(name);\n };\n _proto.clone = function clone(props) {\n var newProps = props ? props : this.props;\n var engine = this.engine;\n assertExist(engine);\n var clonedMaterial = new GLMaterial(engine, newProps);\n // TODO: 更换 Object.assign,低端设备兼容问题\n clonedMaterial.glMaterialState = Object.assign(new GLMaterialState(), clonedMaterial.glMaterialState);\n clonedMaterial.floats = this.floats;\n clonedMaterial.ints = this.ints;\n clonedMaterial.vector2s = this.vector2s;\n clonedMaterial.vector3s = this.vector3s;\n clonedMaterial.vector4s = this.vector4s;\n clonedMaterial.colors = this.colors;\n clonedMaterial.quaternions = this.quaternions;\n clonedMaterial.matrices = this.matrices;\n clonedMaterial.textures = this.textures;\n clonedMaterial.floatArrays = this.floatArrays;\n clonedMaterial.vector4Arrays = this.vector4Arrays;\n clonedMaterial.matrixArrays = this.matrixArrays;\n clonedMaterial.samplers = this.samplers;\n clonedMaterial.uniforms = this.uniforms;\n clonedMaterial.uniformDirty = true;\n return clonedMaterial;\n };\n _proto.fromData = function fromData(data) {\n Material.prototype.fromData.call(this, data);\n this.uniforms = [];\n this.samplers = [];\n this.textures = {};\n this.floats = {};\n this.ints = {};\n this.floatArrays = {};\n this.vector4s = {};\n var propertiesData = _extends({}, data);\n if (data.stringTags[\"RenderType\"] !== undefined) {\n this.blending = data.stringTags[\"RenderType\"] === RenderType.Transparent;\n }\n if (data.floats[\"ZTest\"] !== undefined) {\n this.depthTest = data.floats[\"ZTest\"] !== 0;\n }\n if (data.floats[\"ZWrite\"] !== undefined) {\n this.depthMask = data.floats[\"ZWrite\"] !== 0;\n }\n var renderFace = data.stringTags[\"RenderFace\"];\n if (renderFace === RenderFace.Front) {\n this.culling = true;\n this.cullFace = glContext.BACK;\n } else if (renderFace === RenderFace.Back) {\n this.culling = true;\n this.cullFace = glContext.FRONT;\n } else {\n this.culling = false;\n }\n var name;\n for(name in propertiesData.floats){\n this.setFloat(name, propertiesData.floats[name]);\n }\n for(name in propertiesData.ints){\n this.setInt(name, propertiesData.ints[name]);\n }\n for(name in propertiesData.vector4s){\n var vector4Value = propertiesData.vector4s[name];\n this.setVector4(name, new Vector4$1(vector4Value.x, vector4Value.y, vector4Value.z, vector4Value.w));\n }\n for(name in propertiesData.colors){\n var colorValue = propertiesData.colors[name];\n this.setColor(name, new Color(colorValue.r, colorValue.g, colorValue.b, colorValue.a));\n }\n for(name in propertiesData.textures){\n var textureProperties = propertiesData.textures[name];\n var texture = this.engine.findObject(textureProperties.texture);\n // TODO 纹理通过 id 加入场景数据\n this.setTexture(name, texture);\n var offset = textureProperties.offset;\n var scale = textureProperties.scale;\n if (offset && scale) {\n this.setVector4(name + \"_ST\", new Vector4(scale.x, scale.y, offset.x, offset.y));\n }\n }\n if (data.shader) {\n var shader = this.engine.findObject(data.shader);\n if (shader) {\n this.shader = shader;\n this.shaderSource = shader.shaderData;\n }\n }\n var _data_stringTags;\n this.stringTags = (_data_stringTags = data.stringTags) != null ? _data_stringTags : {};\n this.initialized = false;\n };\n /**\n * @since 2.0.0\n * @param sceneData\n * @returns\n */ _proto.toData = function toData() {\n // @ts-expect-error\n var materialData = this.defination;\n if (this.shader) {\n // @ts-expect-error\n materialData.shader = this.shader;\n }\n materialData.floats = {};\n materialData.ints = {};\n materialData.vector4s = {};\n materialData.colors = {};\n materialData.textures = {};\n materialData.dataType = DataType.Material;\n materialData.stringTags = this.stringTags;\n for(var name in this.floats){\n materialData.floats[name] = this.floats[name];\n }\n for(var name1 in this.ints){\n materialData.ints[name1] = this.ints[name1];\n }\n for(var name2 in this.vector4s){\n materialData.vector4s[name2] = this.vector4s[name2];\n }\n for(var name3 in this.colors){\n materialData.colors[name3] = this.colors[name3];\n }\n for(var name4 in this.textures){\n if (!materialData.textures[name4]) {\n materialData.textures[name4] = {\n texture: this.textures[name4]\n };\n }\n var textureProperties = materialData.textures[name4];\n var scaleOffset = this.getVector4(name4 + \"_ST\");\n if (scaleOffset) {\n textureProperties.scale = {\n x: scaleOffset.x,\n y: scaleOffset.y\n };\n textureProperties.offset = {\n x: scaleOffset.z,\n y: scaleOffset.w\n };\n delete materialData.vector4s[name4 + \"_ST\"];\n }\n }\n return materialData;\n };\n _proto.cloneUniforms = function cloneUniforms(sourceMaterial) {\n var material = sourceMaterial;\n var name;\n for(name in material.floats){\n this.setFloat(name, material.floats[name]);\n }\n for(name in material.ints){\n this.setInt(name, material.ints[name]);\n }\n for(name in material.floatArrays){\n this.setFloats(name, material.floatArrays[name]);\n }\n for(name in material.textures){\n this.setTexture(name, material.textures[name]);\n }\n for(name in material.vector2s){\n this.setVector2(name, material.vector2s[name]);\n }\n for(name in material.vector3s){\n this.setVector3(name, material.vector3s[name]);\n }\n for(name in material.vector4s){\n this.setVector4(name, material.vector4s[name]);\n }\n for(name in material.colors){\n this.setColor(name, material.colors[name]);\n }\n for(name in material.quaternions){\n this.setQuaternion(name, material.quaternions[name]);\n }\n for(name in material.matrices){\n this.setMatrix(name, material.matrices[name]);\n }\n for(name in material.vector4Arrays){\n var vec4Array = [];\n for(var i = 0; i < material.vector4Arrays[name].length; i += 4){\n vec4Array.push(new Vector4(material.vector4Arrays[name][i], material.vector4Arrays[name][i + 1], material.vector4Arrays[name][i + 2], material.vector4Arrays[name][i + 3]));\n }\n this.setVector4Array(name, vec4Array);\n }\n for(name in material.matrixArrays){\n var mat4Array = [];\n for(var i1 = 0; i1 < material.matrixArrays[name].length; i1 += 16){\n var matrix = Matrix4.fromIdentity();\n for(var j = 0; j < 16; j++){\n matrix.elements[j] = material.matrixArrays[name][i1 + j];\n }\n mat4Array.push(matrix);\n }\n this.setMatrixArray(name, mat4Array);\n }\n };\n _proto.checkUniform = function checkUniform(uniformName) {\n if (!this.uniforms.includes(uniformName)) {\n this.uniforms.push(uniformName);\n this.uniformDirty = true;\n }\n };\n _proto.dispose = function dispose(options) {\n var _this = this;\n var _this_shaderVariant;\n if (this.destroyed) {\n return;\n }\n (_this_shaderVariant = this.shaderVariant) == null ? void 0 : _this_shaderVariant.dispose();\n if ((options == null ? void 0 : options.textures) !== exports.DestroyOptions.keep) {\n Object.keys(this.textures).forEach(function(key) {\n var texture = _this.textures[key];\n // TODO 纹理释放需要引用计数\n if (texture !== _this.engine.emptyTexture) {\n texture.dispose();\n }\n });\n }\n // @ts-expect-error\n this.shaderSource = null;\n // @ts-expect-error\n this.uniformSemantics = {};\n this.floats = {};\n this.ints = {};\n this.vector2s = {};\n this.vector3s = {};\n this.vector4s = {};\n this.quaternions = {};\n this.matrices = {};\n this.matrice3s = {};\n this.textures = {};\n this.floatArrays = {};\n this.vector4Arrays = {};\n this.matrixArrays = {};\n this.samplers = [];\n this.uniforms = [];\n this.initialize = throwDestroyedError;\n this.destroyed = true;\n if (this.engine !== undefined) {\n this.engine.removeMaterial(this);\n }\n };\n _create_class(GLMaterial, [\n {\n key: \"blending\",\n get: function get() {\n return this.glMaterialState.blending;\n },\n set: function set(blending) {\n blending !== undefined && this.glMaterialState.setBlending(blending);\n }\n },\n {\n key: \"blendColor\",\n get: function get() {\n return this.glMaterialState.blendColor;\n },\n set: function set(color) {\n color && this.glMaterialState.setBlendColor(color);\n }\n },\n {\n key: \"blendFunction\",\n get: function get() {\n return this.glMaterialState.blendFunctionParameters;\n },\n set: function set(func) {\n func && this.glMaterialState.setBlendFunctionParameters(func);\n }\n },\n {\n key: \"blendEquation\",\n get: function get() {\n return this.glMaterialState.blendEquationParameters;\n },\n set: function set(equation) {\n equation && this.glMaterialState.setBlendEquationParameters(equation);\n }\n },\n {\n key: \"depthTest\",\n get: function get() {\n return this.glMaterialState.depthTest;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setDepthTest(value);\n }\n },\n {\n key: \"depthMask\",\n get: function get() {\n return this.glMaterialState.depthMask;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setDepthMask(value);\n }\n },\n {\n key: \"depthRange\",\n get: function get() {\n return this.glMaterialState.depthRange;\n },\n set: function set(value) {\n value && this.glMaterialState.setDepthRange(value);\n }\n },\n {\n key: \"depthFunc\",\n get: function get() {\n return this.glMaterialState.depthFunc;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setDepthFunc(value);\n }\n },\n {\n key: \"polygonOffsetFill\",\n get: function get() {\n return this.glMaterialState.polygonOffsetFill;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setPolygonOffsetFill(value);\n }\n },\n {\n key: \"polygonOffset\",\n get: function get() {\n return this.glMaterialState.polygonOffset;\n },\n set: function set(value) {\n value && this.glMaterialState.setPolygonOffset(value);\n }\n },\n {\n key: \"sampleAlphaToCoverage\",\n get: function get() {\n return this.glMaterialState.sampleAlphaToCoverage;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setSampleAlphaToCoverage(value);\n }\n },\n {\n key: \"colorMask\",\n get: function get() {\n return this.glMaterialState.colorMask[0];\n },\n set: function set(value) {\n this.glMaterialState.setColorMask(value);\n }\n },\n {\n key: \"stencilTest\",\n get: function get() {\n return this.glMaterialState.stencilTest;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setStencilTest(value);\n }\n },\n {\n key: \"stencilMask\",\n get: function get() {\n return this.glMaterialState.stencilMask;\n },\n set: function set(value) {\n value && this.glMaterialState.setStencilMask(value);\n }\n },\n {\n key: \"stencilRef\",\n get: function get() {\n return this.glMaterialState.stencilRef;\n },\n set: function set(value) {\n value && this.glMaterialState.setStencilRef(value);\n }\n },\n {\n key: \"stencilFunc\",\n get: function get() {\n return this.glMaterialState.stencilFunc;\n },\n set: function set(value) {\n value && this.glMaterialState.setStencilFunc(value);\n }\n },\n {\n key: \"stencilOpFail\",\n get: function get() {\n return this.glMaterialState.stencilOpFail;\n },\n set: function set(value) {\n value && this.glMaterialState.setStencilOpFail(value);\n }\n },\n {\n key: \"stencilOpZFail\",\n get: function get() {\n return this.glMaterialState.stencilOpZFail;\n },\n set: function set(value) {\n value && this.glMaterialState.setStencilOpZFail(value);\n }\n },\n {\n key: \"stencilOpZPass\",\n get: function get() {\n return this.glMaterialState.stencilOpZPass;\n },\n set: function set(value) {\n value && this.glMaterialState.setStencilOpZPass(value);\n }\n },\n {\n key: \"culling\",\n get: function get() {\n return this.glMaterialState.culling;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setCulling(value);\n }\n },\n {\n key: \"frontFace\",\n get: function get() {\n return this.glMaterialState.frontFace;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setFrontFace(value);\n }\n },\n {\n key: \"cullFace\",\n get: function get() {\n return this.glMaterialState.cullFace;\n },\n set: function set(value) {\n value !== undefined && this.glMaterialState.setCullFace(value);\n }\n },\n {\n key: \"isDestroyed\",\n get: function get() {\n return this.destroyed;\n }\n }\n ]);\n return GLMaterial;\n}(Material);\n\nvar copyShaderId = \"$mri-internal-copy\";\nvar ExtWrap = /*#__PURE__*/ function() {\n function ExtWrap(renderer) {\n this.renderer = renderer;\n if (renderer.engine.gpuCapability.level === 1) {\n this.copyRenderPass = this.createCopyRenderPass().initialize(renderer);\n var shaderSource = this.copyRenderPass.meshes[0].material.shaderSource;\n renderer.pipelineContext.shaderLibrary.addShader(shaderSource);\n }\n }\n var _proto = ExtWrap.prototype;\n _proto.resetColorAttachments = function resetColorAttachments(rp, colorTextures) {\n if (this.renderer) {\n rp.resetColorAttachments(colorTextures);\n }\n };\n _proto.copyTexture = function copyTexture(source, tex) {\n if (!this.renderer) {\n return;\n }\n source.initialize();\n tex.initialize();\n tex.updateSource({\n sourceType: exports.TextureSourceType.framebuffer,\n data: {\n width: tex.getWidth() || source.getWidth(),\n height: tex.getHeight() || source.getHeight()\n }\n });\n if (this.renderer.engine.gpuCapability.level === 2) {\n this.copy2(source, tex);\n } else {\n this.copy1(source, tex);\n }\n };\n _proto.copy2 = function copy2(source, target) {\n // 保存当前的 fbo\n var framebuffer = this.renderer.getFramebuffer();\n this.renderer.glRenderer.copy2(source, target);\n // 还原 fbo\n this.renderer.setFramebuffer(framebuffer);\n };\n _proto.copy1 = function copy1(source, target) {\n var rp = this.copyRenderPass;\n if (rp) {\n var renderer = this.renderer;\n if (renderer) {\n var fb = rp.framebuffer;\n fb.viewport[2] = target.getWidth() || source.getWidth();\n fb.viewport[3] = target.getHeight() || source.getHeight();\n renderer.glRenderer.resetColorAttachments(fb, [\n target\n ]);\n var mesh = rp.meshes[0];\n mesh.material.setTexture(\"uTex\", source);\n renderer.renderRenderPass(rp);\n }\n }\n };\n _proto.createCopyRenderPass = function createCopyRenderPass() {\n var name = \"mri-copy-mesh\";\n var attachment = {\n texture: {\n format: glContext.RGBA\n }\n };\n var engine = this.renderer.engine;\n var geometry = new GLGeometry(engine, {\n name: name,\n mode: glContext.TRIANGLE_STRIP,\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 2,\n data: new Float32Array([\n -1,\n 1,\n -1,\n -1,\n 1,\n 1,\n 1,\n -1\n ])\n }\n },\n drawCount: 4\n });\n var vertexShader = \"\\nprecision highp float;\\nattribute vec2 aPos;\\nvarying vec2 vTex;\\nvoid main(){\\n gl_Position = vec4(aPos,0.,1.0);\\n vTex = (aPos + vec2(1.))/2.;\\n}\";\n var fragmentShader = \"\\nprecision highp float;\\nvarying vec2 vTex;\\nuniform sampler2D uTex;\\nvoid main(){\\n gl_FragColor = texture2D(uTex,vTex);\\n}\";\n var level = engine.gpuCapability.level;\n var material = new GLMaterial(engine, {\n name: name,\n shader: {\n cacheId: copyShaderId,\n name: name,\n vertex: vertexShader,\n fragment: fragmentShader,\n glslVersion: level === 2 ? exports.GLSLVersion.GLSL3 : exports.GLSLVersion.GLSL1\n }\n });\n material.blending = false;\n material.depthTest = false;\n material.culling = false;\n var mesh = new Mesh(engine, {\n name: name,\n geometry: geometry,\n material: material,\n priority: 0\n });\n return new CopyTexturePass(this.renderer, {\n name: \"mri-copy-rp\",\n clearAction: {\n colorAction: exports.TextureLoadAction.whatever\n },\n attachments: [\n attachment\n ],\n meshes: [\n mesh\n ]\n });\n };\n _proto.dispose = function dispose() {\n if (this.renderer) {\n var _this_copyRenderPass;\n (_this_copyRenderPass = this.copyRenderPass) == null ? void 0 : _this_copyRenderPass.dispose();\n // @ts-expect-error\n this.renderer = undefined;\n }\n };\n return ExtWrap;\n}();\nvar CopyTexturePass = /*#__PURE__*/ function(RenderPass) {\n _inherits(CopyTexturePass, RenderPass);\n function CopyTexturePass() {\n return RenderPass.apply(this, arguments);\n }\n var _proto = CopyTexturePass.prototype;\n _proto.configure = function configure(renderer) {\n this.currentFramebuffer = renderer.getFramebuffer();\n renderer.setFramebuffer(this.framebuffer);\n };\n _proto.execute = function execute(renderer) {\n if (this.clearAction) {\n renderer.clear(this.clearAction);\n }\n renderer.renderMeshes(this.meshes);\n if (this.storeAction) {\n renderer.clear(this.storeAction);\n }\n renderer.setFramebuffer(this.currentFramebuffer);\n };\n return CopyTexturePass;\n}(RenderPass);\n\nvar GLContextManager = /*#__PURE__*/ function() {\n function GLContextManager(canvas, glType, options) {\n var _this = this;\n if (glType === void 0) glType = \"webgl\";\n if (options === void 0) options = {};\n this.canvas = canvas;\n this.glType = glType;\n this.restoreHandlers = [];\n this.lostHandlers = [];\n assertExist(canvas);\n this.gl = createGLContext(canvas, glType, options);\n this.contextLostListener = function(e) {\n var _this_canvas;\n for(var _iterator = _create_for_of_iterator_helper_loose(_this.lostHandlers), _step; !(_step = _iterator()).done;){\n var lostHandler = _step.value;\n lostHandler.lost(e);\n }\n (_this_canvas = _this.canvas) == null ? void 0 : _this_canvas.removeEventListener(\"webglcontextlost\", _this.contextLostListener);\n };\n this.contextRestoredListener = function(e) {\n var _this_canvas;\n for(var _iterator = _create_for_of_iterator_helper_loose(_this.restoreHandlers), _step; !(_step = _iterator()).done;){\n var restorable = _step.value;\n restorable.restore();\n }\n (_this_canvas = _this.canvas) == null ? void 0 : _this_canvas.addEventListener(\"webglcontextlost\", _this.contextLostListener);\n };\n canvas.addEventListener(\"webglcontextlost\", this.contextLostListener);\n canvas.addEventListener(\"webglcontextrestored\", this.contextRestoredListener);\n }\n var _proto = GLContextManager.prototype;\n _proto.dispose = function dispose() {\n if (this.canvas) {\n this.canvas.removeEventListener(\"webglcontextlost\", this.contextLostListener);\n this.canvas.removeEventListener(\"webglcontextrestored\", this.contextRestoredListener);\n }\n this.gl = null;\n this.canvas = null;\n };\n _proto.addLostHandler = function addLostHandler(lostHandler) {\n this.lostHandlers.push(lostHandler);\n };\n _proto.removeLostHandler = function removeLostHandler(lostHandler) {\n var index = this.lostHandlers.indexOf(lostHandler);\n if (index > -1) {\n this.lostHandlers.splice(index, 1);\n }\n };\n _proto.addRestoreHandler = function addRestoreHandler(restoreHandler) {\n this.restoreHandlers.push(restoreHandler);\n };\n _proto.removeRestoreHandler = function removeRestoreHandler(restorable) {\n var index = this.restoreHandlers.indexOf(restorable);\n if (index > -1) {\n this.restoreHandlers.splice(index, 1);\n }\n };\n return GLContextManager;\n}();\n\nvar GLEngine = /*#__PURE__*/ function(Engine) {\n _inherits(GLEngine, Engine);\n function GLEngine(gl) {\n var _this;\n _this = Engine.call(this) || this;\n _this.gpuCapability = new GPUCapability(gl);\n return _this;\n }\n var _proto = GLEngine.prototype;\n _proto.dispose = function dispose() {\n if (this.isDestroyed) {\n return;\n }\n Engine.prototype.dispose.call(this);\n };\n _proto.getGLRenderer = function getGLRenderer() {\n return this.renderer;\n };\n _proto.getGLRendererInternal = function getGLRendererInternal() {\n return this.getGLRenderer().glRenderer;\n };\n _proto.getGLPipelineContext = function getGLPipelineContext() {\n return this.getGLRenderer().pipelineContext;\n };\n return GLEngine;\n}(Engine);\n\nvar GLRenderbuffer = /*#__PURE__*/ function(Renderbuffer) {\n _inherits(GLRenderbuffer, Renderbuffer);\n function GLRenderbuffer(props, renderer) {\n var _this;\n _this = Renderbuffer.call(this, props) || this;\n _this.initialized = false;\n if (renderer !== undefined) {\n _this.initialize(renderer);\n }\n return _this;\n }\n var _proto = GLRenderbuffer.prototype;\n _proto.initialize = function initialize(renderer) {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n this.renderer = renderer;\n this.buffer = renderer.createGLRenderbuffer(this);\n };\n _proto.setSize = function setSize(width, height) {\n if (!this.initialized) {\n logger.error(\"Can't set size for uninitialized render buffer.\");\n return;\n }\n if (!this.renderer) {\n return;\n }\n if (width !== this.size[0] || height !== this.size[1]) {\n var _this_renderer = this.renderer, gl = _this_renderer.gl, state = _this_renderer.pipelineContext;\n state.bindRenderbuffer(gl.RENDERBUFFER, this.buffer);\n if (width && height) {\n gl.renderbufferStorage(gl.RENDERBUFFER, this.format, this.size[0] = width, this.size[1] = height);\n } else {\n logger.error(\"Invalid render buffer size: \" + width + \"x\" + height + \".\");\n }\n }\n };\n _proto.dispose = function dispose() {\n if (this.renderer) {\n this.renderer.deleteGLRenderbuffer(this);\n this.renderer = null;\n this.buffer = null;\n }\n this.destroyed = true;\n this.initialize = throwDestroyedError;\n };\n return GLRenderbuffer;\n}(Renderbuffer);\n\nvar seed$1 = 1;\nvar GLFramebuffer = /*#__PURE__*/ function(Framebuffer) {\n _inherits(GLFramebuffer, Framebuffer);\n function GLFramebuffer(props, renderer) {\n var _this;\n _this = Framebuffer.call(this) || this;\n _this.attachmentTextures = [];\n var depthStencilAttachment = props.depthStencilAttachment, viewport = props.viewport, isCustomViewport = props.isCustomViewport, storeAction = props.storeAction, _props_viewportScale = props.viewportScale, viewportScale = _props_viewportScale === void 0 ? 1 : _props_viewportScale, _props_name = props.name, name = _props_name === void 0 ? \"GLFramebuffer\" + seed$1++ : _props_name;\n _this.renderer = renderer;\n _this.engine = renderer.engine;\n var _depthStencilAttachment_storageType;\n _this.depthStencilStorageType = (_depthStencilAttachment_storageType = depthStencilAttachment == null ? void 0 : depthStencilAttachment.storageType) != null ? _depthStencilAttachment_storageType : exports.RenderPassAttachmentStorageType.none;\n _this.viewport = viewport;\n _this.isCustomViewport = !!isCustomViewport;\n _this.viewportScale = viewportScale;\n _this.name = name;\n _this.storeAction = storeAction;\n _this.updateProps(props);\n return _this;\n }\n var _proto = GLFramebuffer.prototype;\n _proto.getDepthTexture = function getDepthTexture() {\n return this.depthTexture;\n };\n _proto.getStencilTexture = function getStencilTexture() {\n return this.stencilTexture;\n };\n _proto.getColorTextures = function getColorTextures() {\n return this.colorTextures;\n };\n _proto.updateAttachmentTextures = function updateAttachmentTextures() {\n var _this = this;\n this.attachmentTextures.length = 0;\n this.colorTextures.forEach(function(tex) {\n tex.initialize();\n addItem(_this.attachmentTextures, tex.textureBuffer);\n });\n if (this.stencilTexture) {\n addItem(this.attachmentTextures, this.stencilTexture.textureBuffer);\n }\n if (this.depthTexture) {\n addItem(this.attachmentTextures, this.depthTexture.textureBuffer);\n }\n };\n _proto.updateProps = function updateProps(props) {\n var _props_depthStencilAttachment;\n var renderer = this.renderer;\n var gpuCapability = this.engine.gpuCapability;\n var _props_depthStencilAttachment1;\n var depthStencilAttachment = (_props_depthStencilAttachment1 = props.depthStencilAttachment) != null ? _props_depthStencilAttachment1 : {\n storageType: exports.RenderPassAttachmentStorageType.none\n };\n var willUseFbo = props.attachments.length > 0;\n var separateDepthStencil = true;\n this.externalStorage = false;\n if (props.attachments.length > 1 && !gpuCapability.detail.drawBuffers) {\n throw new Error(\"Multiple color attachments not support.\");\n }\n var optDepthStencilTex = (_props_depthStencilAttachment = props.depthStencilAttachment) == null ? void 0 : _props_depthStencilAttachment.texture;\n var readableDepthStencilTextures = gpuCapability.detail.readableDepthStencilTextures;\n var storageType = depthStencilAttachment.storageType, storage = depthStencilAttachment.storage;\n this.colorTextures = props.attachments.slice();\n if (!willUseFbo && storageType !== exports.RenderPassAttachmentStorageType.none) {\n throw new Error(\"Use depth stencil attachment without color attachments.\");\n }\n if (willUseFbo) {\n this.fbo = renderer.glRenderer.createGLFramebuffer(this, this.name);\n }\n switch(storageType){\n case exports.RenderPassAttachmentStorageType.depth_stencil_opaque:\n if (storage) {\n if (_instanceof1(storage, GLRenderbuffer)) {\n this.depthStencilRenderbuffer = storage;\n this.externalStorage = true;\n } else {\n throw new Error(\"Invalid depth stencil attachment storage.\");\n }\n } else {\n this.depthStencilRenderbuffer = new GLRenderbuffer({\n format: glContext.DEPTH_STENCIL,\n attachment: glContext.DEPTH_STENCIL_ATTACHMENT,\n storageType: storageType\n }, renderer.glRenderer);\n }\n separateDepthStencil = false;\n break;\n case exports.RenderPassAttachmentStorageType.depth_16_opaque:\n if (storage) {\n if (_instanceof1(storage, GLRenderbuffer)) {\n this.depthStencilRenderbuffer = storage;\n this.externalStorage = true;\n } else {\n throw new Error(\"Invalid depth attachment storage.\");\n }\n } else {\n this.depthStencilRenderbuffer = new GLRenderbuffer({\n attachment: glContext.DEPTH_ATTACHMENT,\n format: glContext.DEPTH_COMPONENT16,\n storageType: storageType\n }, renderer.glRenderer);\n }\n break;\n case exports.RenderPassAttachmentStorageType.stencil_8_opaque:\n if (storage) {\n if (_instanceof1(storage, GLRenderbuffer)) {\n this.depthStencilRenderbuffer = storage;\n this.externalStorage = true;\n } else {\n throw new Error(\"Invalid stencil attachment storage.\");\n }\n } else {\n this.depthStencilRenderbuffer = new GLRenderbuffer({\n attachment: glContext.STENCIL_ATTACHMENT,\n format: glContext.STENCIL_INDEX8,\n storageType: storageType\n }, renderer.glRenderer);\n }\n break;\n case exports.RenderPassAttachmentStorageType.depth_16_texture:\n if (!readableDepthStencilTextures) {\n throw new Error(\"Depth texture is not support in framebuffer.\");\n }\n this.depthTexture = optDepthStencilTex != null ? optDepthStencilTex : new GLTexture(this.engine, {\n sourceType: exports.TextureSourceType.framebuffer,\n format: glContext.DEPTH_COMPONENT,\n internalFormat: gpuCapability.internalFormatDepth16,\n type: glContext.UNSIGNED_SHORT,\n name: \"\" + this.name + \"##depthTex\"\n });\n this.depthTexture.initialize();\n break;\n case exports.RenderPassAttachmentStorageType.depth_24_stencil_8_texture:\n if (!readableDepthStencilTextures) {\n throw new Error(\"Depth stencil texture is not support in framebuffer.\");\n }\n this.depthTexture = this.stencilTexture = optDepthStencilTex != null ? optDepthStencilTex : new GLTexture(this.engine, {\n sourceType: exports.TextureSourceType.framebuffer,\n format: glContext.DEPTH_STENCIL,\n internalFormat: gpuCapability.internalFormatDepth24_stencil8,\n type: gpuCapability.UNSIGNED_INT_24_8,\n name: \"\" + this.name + \"##dpthStclTex\"\n });\n this.depthTexture.initialize();\n separateDepthStencil = true;\n break;\n }\n this.storeInvalidAttachments = this.getStoreAttachments(this.storeAction, separateDepthStencil);\n this.updateAttachmentTextures();\n };\n _proto.getStoreAttachments = function getStoreAttachments(storeAction, separateDepthStencil) {\n var gl = this.renderer.glRenderer.gl;\n var colorLen = this.colorTextures.length;\n if (storeAction && isWebGL2(gl) && colorLen > 0) {\n var attachments = [];\n if (storeAction.depthAction === exports.TextureStoreAction.clear && this.depthStorage) {\n addItem(attachments, separateDepthStencil ? gl.DEPTH_ATTACHMENT : gl.DEPTH_STENCIL_ATTACHMENT);\n }\n if (storeAction.stencilAction === exports.TextureStoreAction.clear && this.stencilStorage) {\n addItem(attachments, separateDepthStencil ? gl.STENCIL_ATTACHMENT : gl.DEPTH_STENCIL_ATTACHMENT);\n }\n if (storeAction.colorAction === exports.TextureStoreAction.clear) {\n for(var i = 0; i < colorLen; i++){\n addItem(attachments, gl[\"COLOR_ATTACHMENT\" + i]);\n }\n }\n return attachments;\n }\n };\n _proto.unbind = function unbind() {\n var attachments = this.storeInvalidAttachments;\n if (attachments == null ? void 0 : attachments.length) {\n var gl = this.renderer.glRenderer.gl;\n if (isWebGL2(gl)) {\n gl.invalidateFramebuffer(gl.FRAMEBUFFER, attachments);\n }\n }\n this.renderer.pipelineContext.bindSystemFramebuffer();\n };\n _proto.bind = function bind() {\n var _this = this;\n if (!this.fbo) {\n return;\n }\n var gl = this.renderer.glRenderer.gl;\n var state = this.renderer.pipelineContext;\n var _this_viewport = this.viewport, x = _this_viewport[0], y = _this_viewport[1], width = _this_viewport[2], height = _this_viewport[3];\n state.bindFramebuffer(gl.FRAMEBUFFER, this.fbo);\n // TODO 不在bind中设置viewport\n state.viewport(x, y, width, height);\n var emptyTexture = this.renderer.glRenderer.emptyTexture2D.textureBuffer;\n // in case frame texture loop\n Object.keys(state.textureUnitDict).forEach(function(unit) {\n var texture = state.textureUnitDict[unit];\n if (texture && texture !== emptyTexture && _this.attachmentTextures.includes(texture)) {\n state.activeTexture(+unit);\n _this.renderer.glRenderer.emptyTexture2D.bind();\n }\n });\n // FIXME: 没有pipeline对象的临时方案\n for(var i = 0; i < 4; i++){\n state.activeTexture(gl.TEXTURE0 + i);\n this.renderer.glRenderer.emptyTexture2D.bind();\n }\n if (this.ready) {\n return;\n }\n var _this1 = this, depthStencilRenderbuffer = _this1.depthStencilRenderbuffer, depthTexture = _this1.depthTexture, stencilTexture = _this1.stencilTexture;\n state.activeTexture(gl.TEXTURE0);\n if (depthStencilRenderbuffer) {\n depthStencilRenderbuffer.setSize(width, height);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, depthStencilRenderbuffer.attachment, gl.RENDERBUFFER, depthStencilRenderbuffer.buffer);\n } else if (depthTexture) {\n // 解决RenderPass在Clone深度贴图时width和height丢失的问题\n depthTexture.source.data = {\n width: width,\n height: height\n };\n depthTexture.update({\n data: {\n width: width,\n height: height,\n data: new Uint16Array(0)\n }\n });\n var attachment = depthTexture && stencilTexture ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthTexture.textureBuffer, 0);\n }\n this.resetColorTextures(this.colorTextures);\n var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error(\"Framebuffer failed. gl status=\" + status + \", gl error=\" + gl.getError() + \", gl isContextLost=\" + gl.isContextLost() + \".\");\n }\n this.ready = true;\n };\n _proto.resetColorTextures = function resetColorTextures(colorTextures) {\n var colors = colorTextures;\n var gl = this.renderer.glRenderer.gl;\n var gpuCapability = this.engine.gpuCapability;\n var viewport = this.viewport;\n var buffers = [];\n if (colors) {\n for(var _iterator = _create_for_of_iterator_helper_loose(colors), _step; !(_step = _iterator()).done;){\n var texture = _step.value;\n texture.initialize();\n }\n this.colorTextures = colors.slice();\n }\n this.renderer.pipelineContext.activeTexture(gl.TEXTURE0);\n this.colorTextures.forEach(function(tex, index) {\n var width = viewport[2];\n var height = viewport[3];\n var data = {\n width: width,\n height: height,\n data: new Uint8Array(0)\n };\n tex.update({\n data: data\n });\n gpuCapability.framebufferTexture2D(gl, gl.FRAMEBUFFER, index, gl.TEXTURE_2D, tex.textureBuffer);\n buffers.push(true);\n });\n gpuCapability.drawBuffers(gl, buffers);\n this.updateAttachmentTextures();\n };\n _proto.resize = function resize(x, y, width, height) {\n var _this_viewport = this.viewport, preX = _this_viewport[0], preY = _this_viewport[1], preWidth = _this_viewport[2], preHeight = _this_viewport[3];\n if (preX !== x || preY !== y || preWidth !== width || preHeight !== height) {\n this.viewport = [\n x,\n y,\n width,\n height\n ];\n this.ready = false;\n this.bind();\n }\n };\n _proto.dispose = function dispose(options) {\n if (this.renderer) {\n this.renderer.glRenderer.deleteGLFramebuffer(this);\n delete this.fbo;\n var clearAttachment = (options == null ? void 0 : options.depthStencilAttachment) ? options.depthStencilAttachment : exports.RenderPassDestroyAttachmentType.force;\n if (clearAttachment === exports.RenderPassDestroyAttachmentType.force || clearAttachment === exports.RenderPassDestroyAttachmentType.keepExternal && !this.externalStorage) {\n var _this_depthStencilRenderbuffer, _this_depthTexture;\n (_this_depthStencilRenderbuffer = this.depthStencilRenderbuffer) == null ? void 0 : _this_depthStencilRenderbuffer.dispose();\n (_this_depthTexture = this.depthTexture) == null ? void 0 : _this_depthTexture.dispose();\n }\n // @ts-expect-error safe to assign\n this.renderer = this.stencilRenderbuffer = this.depthStencilRenderbuffer = null;\n }\n };\n _create_class(GLFramebuffer, [\n {\n key: \"stencilStorage\",\n get: function get() {\n var storageType = this.depthStencilStorageType;\n if (storageType !== exports.RenderPassAttachmentStorageType.depth_16_opaque) {\n return this.depthStencilRenderbuffer;\n }\n }\n },\n {\n key: \"depthStorage\",\n get: function get() {\n if (this.depthStencilStorageType !== exports.RenderPassAttachmentStorageType.stencil_8_opaque) {\n return this.depthStencilRenderbuffer;\n }\n }\n }\n ]);\n return GLFramebuffer;\n}(Framebuffer);\n\nvar BlockUniformInfoOffset = 1;\nvar BlockUniformInfoByteLength = 8;\nvar BlockUniformInfoType = 0;\nvar BlockUniformInfoArrayStride = 4;\nvar BlockUniformInfoArraySize = 2;\nvar BlockUniformInfoRowStride = 5;\nvar _obj;\nvar ItemPerValueMap = (_obj = {}, _obj[glContext.FLOAT] = 1, _obj[glContext.INT] = 1, _obj[glContext.UNSIGNED_INT] = 1, _obj[glContext.SHORT] = 1, _obj[glContext.BOOL] = 1, _obj[glContext.UNSIGNED_SHORT] = 1, _obj[glContext.FLOAT_VEC2] = 2, _obj[glContext.FLOAT_VEC3] = 3, _obj[glContext.FLOAT_VEC4] = 4, _obj[glContext.FLOAT_MAT2] = 4, _obj[glContext.FLOAT_MAT3] = 9, _obj[glContext.FLOAT_MAT4] = 16, _obj[glContext.FLOAT_MAT2x3] = 6, _obj[glContext.FLOAT_MAT2x4] = 8, _obj[glContext.FLOAT_MAT4x3] = 12, _obj[glContext.FLOAT_MAT4x2] = 8, _obj[glContext.FLOAT_MAT3x4] = 12, _obj[glContext.FLOAT_MAT3x2] = 6, _obj[glContext.INT_VEC2] = 2, _obj[glContext.INT_VEC3] = 3, _obj[glContext.INT_VEC4] = 4, _obj[glContext.UNSIGNED_INT_VEC2] = 2, _obj[glContext.UNSIGNED_INT_VEC3] = 3, _obj[glContext.UNSIGNED_INT_VEC4] = 4, _obj[glContext.BOOL_VEC2] = 2, _obj[glContext.BOOL_VEC3] = 3, _obj[glContext.BOOL_VEC4] = 4, _obj);\nvar setFloat32Array = arraySetter(Float32Array);\nvar setInt32Array = arraySetter(Int32Array);\nvar setUInt8Array = arraySetter(Uint8Array);\nvar _obj1;\n(_obj1 = {}, _obj1[glContext.FLOAT] = numberSetter(Float32Array), _obj1[glContext.INT] = numberSetter(Int32Array), _obj1[glContext.UNSIGNED_INT] = numberSetter(Uint32Array), _obj1[glContext.SHORT] = numberSetter(Int16Array), _obj1[glContext.BOOL] = numberSetter(Uint8Array), _obj1[glContext.UNSIGNED_SHORT] = numberSetter(Uint16Array), _obj1[glContext.FLOAT_VEC2] = setFloat32Array, _obj1[glContext.FLOAT_VEC3] = setFloat32Array, _obj1[glContext.FLOAT_VEC4] = setFloat32Array, _obj1[glContext.FLOAT_MAT2] = setFloat32Array, _obj1[glContext.FLOAT_MAT3] = setFloat32Array, _obj1[glContext.FLOAT_MAT4] = setFloat32Array, _obj1[glContext.FLOAT_MAT2x3] = setFloat32Array, _obj1[glContext.FLOAT_MAT2x4] = setFloat32Array, _obj1[glContext.FLOAT_MAT4x3] = setFloat32Array, _obj1[glContext.FLOAT_MAT4x2] = setFloat32Array, _obj1[glContext.FLOAT_MAT3x4] = setFloat32Array, _obj1[glContext.FLOAT_MAT3x2] = setFloat32Array, _obj1[glContext.INT_VEC2] = setInt32Array, _obj1[glContext.INT_VEC3] = setInt32Array, _obj1[glContext.INT_VEC4] = setInt32Array, _obj1[glContext.UNSIGNED_INT_VEC2] = setInt32Array, _obj1[glContext.UNSIGNED_INT_VEC3] = setInt32Array, _obj1[glContext.UNSIGNED_INT_VEC4] = setInt32Array, _obj1[glContext.BOOL_VEC2] = setUInt8Array, _obj1[glContext.BOOL_VEC3] = setUInt8Array, _obj1[glContext.BOOL_VEC4] = setUInt8Array, _obj1);\nfunction numberSetter(typedArray) {\n return function(value, info, name, range) {\n var flag = {\n start: info[BlockUniformInfoOffset],\n dirty: true\n };\n var arrSize = info[BlockUniformInfoArraySize];\n if (arrSize > 1) {\n var values = value;\n if (values.length) {\n var eleCount = range[1] || values.length;\n var vecLen = info[BlockUniformInfoArrayStride] / typedArray.BYTES_PER_ELEMENT;\n var buffer = flag.buffer = new typedArray(eleCount * vecLen);\n var start = range[0] || 0;\n for(var i = 0; i < eleCount; i++){\n buffer[i * vecLen] = values[i + start];\n }\n flag.start += start * vecLen;\n }\n } else {\n flag.buffer = new typedArray([\n value\n ]);\n }\n return flag;\n };\n}\nfunction arraySetter(type) {\n return function(value, info, name, range) {\n var blockByteLen = info[BlockUniformInfoByteLength];\n var arrSize = info[BlockUniformInfoArraySize];\n var rowStride = info[BlockUniformInfoRowStride];\n var entryStride = arrSize === 1 ? blockByteLen : info[BlockUniformInfoArrayStride];\n var entryRowCount = rowStride ? entryStride / rowStride : 1;\n var rowNumPadding = entryStride / type.BYTES_PER_ELEMENT / entryRowCount;\n var maxRowCount = blockByteLen / type.BYTES_PER_ELEMENT / rowNumPadding;\n //set array\n var numPerEntry = ItemPerValueMap[info[BlockUniformInfoType]];\n var numPerRow = numPerEntry / entryRowCount;\n var valueStartIndex = (range[0] || 0) * numPerEntry;\n var totalRow = range[1] ? entryRowCount * range[1] : maxRowCount;\n var buffer = new type(rowNumPadding * totalRow);\n var flag = {\n start: info[BlockUniformInfoOffset] + entryStride * (range[0] || 0),\n dirty: true,\n buffer: buffer\n };\n for(var i = 0, bufferTarget = 0, sourceIndex = valueStartIndex; i < totalRow; i++){\n for(var j = 0; j < numPerRow; j++){\n buffer[bufferTarget + j] = value[sourceIndex + j];\n }\n bufferTarget += rowNumPadding;\n sourceIndex += numPerRow;\n }\n return flag;\n };\n}\n// TODO: 函数名重定义\nfunction createUniformBlockDataFromProgram(gl, program) {\n var _loop = function(idx) {\n var name = gl.getActiveUniformBlockName(program, idx);\n assertExist(name);\n var blockSpec = {\n index: gl.getUniformBlockIndex(program, name),\n usedByVertexShader: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER),\n usedByFragmentShader: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER),\n size: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_DATA_SIZE),\n uniformIndices: gl.getActiveUniformBlockParameter(program, idx, gl.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES),\n used: false,\n uniforms: {},\n name: name,\n id: \"\"\n };\n blockSpec.used = blockSpec.usedByVertexShader || blockSpec.usedByFragmentShader;\n blockSpecs[idx] = blockSpec;\n var indices = blockSpec.uniformIndices;\n var uniformNames = [];\n for(var i = 0; i < indices.length; i++){\n var name1 = gl.getActiveUniform(program, indices[i]).name.replace(\"[0]\", \"\");\n blockSpec.uniforms[name1] = [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n i,\n 0\n ];\n uniformNames[i] = name1;\n blockUniformNames.push(name1);\n }\n [\n gl.UNIFORM_TYPE,\n gl.UNIFORM_OFFSET,\n gl.UNIFORM_SIZE,\n gl.UNIFORM_BLOCK_INDEX,\n gl.UNIFORM_ARRAY_STRIDE,\n gl.UNIFORM_MATRIX_STRIDE,\n gl.UNIFORM_IS_ROW_MAJOR\n ].forEach(function(param, pi) {\n gl.getActiveUniforms(program, indices, param).forEach(function(value, idx) {\n var name = uniformNames[idx];\n blockSpec.uniforms[name][pi] = +value;\n });\n });\n for(var i1 = 0; i1 < uniformNames.length; i1++){\n var uniform = blockSpec.uniforms[uniformNames[i1]];\n var nextUniform = blockSpec.uniforms[uniformNames[i1 + 1]];\n var size = nextUniform ? nextUniform[1] : blockSpec.size;\n uniform[8] = size - uniform[1];\n }\n blockSpec.id = getUboHash(blockSpec) + \"\";\n };\n var blockSpecs = [];\n var blockUniformNames = [];\n var uniformBlocks = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS);\n for(var idx = 0; idx < uniformBlocks; ++idx)_loop(idx);\n return {\n blockSpecs: blockSpecs,\n blockUniformNames: blockUniformNames\n };\n}\nfunction stringHash() {\n for(var _len = arguments.length, strings = new Array(_len), _key = 0; _key < _len; _key++){\n strings[_key] = arguments[_key];\n }\n var h = 0;\n for(var j = 0; j < arguments.length; j++){\n var s = strings[j];\n for(var i = 0; i < s.length; i++){\n h = Math.imul(31, h) + s.charCodeAt(i) | 0;\n }\n }\n return h;\n}\nfunction getUboHash(spec) {\n var name = spec.name, size = spec.size, uniforms = spec.uniforms, uniformIndices = spec.uniformIndices;\n var ret = Object.keys(uniforms).map(function(name) {\n return name + \"[\" + uniforms[name].join(\":\") + \"]\";\n }).join(\"+\");\n return stringHash(\"\" + name + \"+\", \"\" + size + \"+\", \"\" + uniformIndices.length + \"+\", ret);\n}\n\nvar GLProgram = /*#__PURE__*/ function() {\n function GLProgram(engine, program, id) {\n var _this = this;\n this.engine = engine;\n this.program = program;\n this.id = id;\n this.uniformBlockMap = {};\n this.pipelineContext = engine.getGLPipelineContext();\n var gl = this.pipelineContext.gl;\n this.pipelineContext.useProgram(program);\n this.attribInfoMap = this.createAttribMap();\n if (isWebGL2(gl)) {\n var blockSpecs = createUniformBlockDataFromProgram(gl, program).blockSpecs;\n // blockUniformNames = buns;\n blockSpecs.forEach(function(b) {\n return _this.uniformBlockMap[b.name] = b;\n });\n }\n this.pipelineContext.useProgram(null);\n }\n var _proto = GLProgram.prototype;\n _proto.bind = function bind() {\n this.pipelineContext.useProgram(this.program);\n };\n /**\n * 绑定 vao 对象并设置顶点属性\n * 如果当前环境不支持 vao,则使用 gl 函数依次设置属性。\n * @param geometry\n * @returns\n */ _proto.setupAttributes = function setupAttributes(geometry) {\n var _this = this;\n var _geometry_indicesBuffer;\n var programId = this.id;\n var gl = this.pipelineContext.gl;\n var vao;\n if (geometry.vaos[programId]) {\n vao = geometry.vaos[programId];\n } else {\n vao = new GLVertexArrayObject(this.engine, geometry.name + \"-\" + programId);\n if (!vao) {\n console.error(\"Failed to create VAO object.\");\n }\n geometry.vaos[programId] = vao;\n }\n // 兼容小程序下不支持vao\n if (vao && vao.vao) {\n vao.bind();\n if (vao.ready) {\n return vao;\n }\n }\n Object.keys(this.attribInfoMap).forEach(function(name) {\n var attrInfo = _this.attribInfoMap[name];\n var attribute = geometry.attributes[name];\n if (attribute) {\n var buffer = geometry.buffers[attribute.dataSource];\n if (!buffer) {\n throw new Error(\"Failed to find a buffer named '\" + (attribute.dataSource || name) + \"'. Please ensure the buffer is correctly initialized and bound.\");\n }\n buffer.bind();\n gl.enableVertexAttribArray(attrInfo.loc);\n gl.vertexAttribPointer(attrInfo.loc, attribute.size, attribute.type, attribute.normalize, attribute.stride || 0, attribute.offset || 0);\n }\n });\n (_geometry_indicesBuffer = geometry.indicesBuffer) == null ? void 0 : _geometry_indicesBuffer.bind();\n if (vao) {\n vao.ready = true;\n }\n return vao;\n };\n _proto.createAttribMap = function createAttribMap() {\n var gl = this.pipelineContext.gl;\n var program = this.program;\n var attribMap = {};\n var num = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n for(var i = 0; i < num; i++){\n var info = gl.getActiveAttrib(program, i);\n if (info) {\n var name = info.name, type = info.type, size = info.size;\n var loc = gl.getAttribLocation(program, name);\n attribMap[name] = {\n type: type,\n name: name,\n size: size,\n loc: loc\n };\n }\n }\n return attribMap;\n };\n _proto.dispose = function dispose() {\n if (this.pipelineContext) {\n this.pipelineContext.gl.deleteProgram(this.program);\n // @ts-expect-error safe to assign\n this.pipelineContext = null;\n }\n };\n return GLProgram;\n}();\n\nvar GLShaderVariant = /*#__PURE__*/ function(ShaderVariant) {\n _inherits(GLShaderVariant, ShaderVariant);\n function GLShaderVariant(engine, source) {\n var _this;\n _this = ShaderVariant.call(this, engine, source) || this;\n _this.initialized = false;\n _this.uniformLocations = {};\n _this.samplerChannels = {};\n return _this;\n }\n var _proto = GLShaderVariant.prototype;\n // shader 的 GPU 资源初始化方法,在绘制前调用\n _proto.initialize = function initialize() {\n if (this.initialized) {\n return;\n }\n // 核心初始化都在 compileShader\n // 否则会出现编译了却没有初始化的情况\n var pipelineContext = this.engine.getGLPipelineContext();\n pipelineContext.shaderLibrary.compileShader(this);\n };\n _proto.setFloat = function setFloat(name, value) {\n this.pipelineContext.setFloat(this.uniformLocations[name], value);\n };\n _proto.setInt = function setInt(name, value) {\n this.pipelineContext.setInt(this.uniformLocations[name], value);\n };\n _proto.setFloats = function setFloats(name, value) {\n this.pipelineContext.setFloats(this.uniformLocations[name], value);\n };\n _proto.setTexture = function setTexture(name, texture) {\n this.pipelineContext.setTexture(this.uniformLocations[name], this.samplerChannels[name], texture);\n };\n _proto.setVector2 = function setVector2(name, value) {\n this.pipelineContext.setVector2(this.uniformLocations[name], value);\n };\n _proto.setVector3 = function setVector3(name, value) {\n this.pipelineContext.setVector3(this.uniformLocations[name], value);\n };\n _proto.setVector4 = function setVector4(name, value) {\n this.pipelineContext.setVector4(this.uniformLocations[name], value);\n };\n _proto.setColor = function setColor(name, value) {\n this.pipelineContext.setColor(this.uniformLocations[name], value);\n };\n _proto.setQuaternion = function setQuaternion(name, value) {\n this.pipelineContext.setQuaternion(this.uniformLocations[name], value);\n };\n _proto.setMatrix = function setMatrix(name, value) {\n this.pipelineContext.setMatrix(this.uniformLocations[name], value);\n };\n _proto.setMatrix3 = function setMatrix3(name, value) {\n this.pipelineContext.setMatrix3(this.uniformLocations[name], value);\n };\n _proto.setVector4Array = function setVector4Array(name, array) {\n this.pipelineContext.setVector4Array(this.uniformLocations[name], array);\n };\n _proto.setMatrixArray = function setMatrixArray(name, array) {\n this.pipelineContext.setMatrixArray(this.uniformLocations[name], array);\n };\n _proto.fillShaderInformation = function fillShaderInformation(uniformNames, samplers) {\n // 避免修改原数组。\n var samplerList = samplers.slice();\n uniformNames = uniformNames.concat(samplerList);\n var avaliableUniforms = this.pipelineContext.getUniforms(this.program.program, uniformNames);\n for(var i = 0; i < uniformNames.length; i++){\n this.uniformLocations[uniformNames[i]] = avaliableUniforms[i];\n }\n var index;\n for(index = 0; index < samplerList.length; index++){\n var sampler = this.uniformLocations[samplerList[index]];\n if (sampler == null) {\n samplerList.splice(index, 1);\n index--;\n }\n }\n for(index = 0; index < samplerList.length; index++){\n var samplerName = samplerList[index];\n this.samplerChannels[samplerName] = index;\n }\n };\n _proto.toData = function toData() {\n var shaderData = this.defination;\n shaderData.dataType = DataType.Shader;\n shaderData.id = this.guid;\n shaderData.vertex = this.source.vertex;\n shaderData.fragment = this.source.fragment;\n };\n _proto.dispose = function dispose() {\n var _this_program;\n if (this.compileResult && this.compileResult.shared) {\n return;\n }\n (_this_program = this.program) == null ? void 0 : _this_program.dispose();\n };\n return GLShaderVariant;\n}(ShaderVariant);\n\nvar shaderSeed = 0;\nvar GLShaderLibrary = /*#__PURE__*/ function() {\n function GLShaderLibrary(engine, pipelineContext) {\n this.engine = engine;\n this.pipelineContext = pipelineContext;\n this.shaderResults = {};\n this.programMap = {};\n this.glVertShaderMap = new Map();\n this.glFragShaderMap = new Map();\n this.shaderAllDone = false;\n this.cachedShaders = {};\n this.glAsyncCompileExt = engine.gpuCapability.glAsyncCompileExt;\n }\n var _proto = GLShaderLibrary.prototype;\n _proto.compileAllShaders = function compileAllShaders(asyncCallback) {\n var _this = this;\n if (!this.shaderAllDone) {\n var pendings = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(Object.keys(this.cachedShaders)), _step; !(_step = _iterator()).done;){\n var key = _step.value;\n if (!this.cachedShaders[key].initialized) {\n pendings.push(key);\n }\n }\n if (asyncCallback) {\n if (pendings.length) {\n Promise.all(pendings.map(function(key) {\n return new Promise(function(resolve) {\n return _this.compileShader(_this.cachedShaders[key], resolve);\n });\n })).then(asyncCallback).catch(function() {\n return 0;\n });\n } else {\n asyncCallback([]);\n }\n } else {\n pendings.map(function(key) {\n return _this.compileShader(_this.cachedShaders[key]);\n });\n }\n this.shaderAllDone = true;\n } else if (asyncCallback) {\n asyncCallback([]);\n }\n };\n // TODO 创建shader的ShaderWithSource和shader的source类型一样,待优化。\n _proto.addShader = function addShader(shaderSource, macros) {\n var mergedMacros = [];\n if (shaderSource.macros) {\n var _mergedMacros;\n (_mergedMacros = mergedMacros).push.apply(_mergedMacros, [].concat(shaderSource.macros));\n }\n if (macros) {\n var // TODO 合并 shaderSource.macros 中已经存在的 macro\n _mergedMacros1;\n (_mergedMacros1 = mergedMacros).push.apply(_mergedMacros1, [].concat(macros));\n }\n var shaderWithMacros = _extends({}, shaderSource, {\n vertex: ShaderFactory.genFinalShaderCode({\n level: this.engine.gpuCapability.level,\n shaderType: exports.ShaderType.vertex,\n shader: shaderSource.vertex,\n macros: mergedMacros\n }),\n fragment: ShaderFactory.genFinalShaderCode({\n level: this.engine.gpuCapability.level,\n shaderType: exports.ShaderType.fragment,\n shader: shaderSource.fragment,\n macros: mergedMacros\n })\n });\n var shaderCacheId = this.computeShaderCacheId(shaderWithMacros);\n if (this.cachedShaders[shaderCacheId]) {\n return shaderCacheId;\n }\n this.shaderAllDone = false;\n var shared = false;\n if (shaderWithMacros.shared || shaderWithMacros.cacheId) {\n shared = true;\n }\n this.cachedShaders[shaderCacheId] = new GLShaderVariant(this.engine, _extends({}, shaderWithMacros, {\n vertex: shaderWithMacros.vertex,\n fragment: shaderWithMacros.fragment,\n name: shaderWithMacros.name || shaderCacheId,\n shared: shared\n }));\n this.cachedShaders[shaderCacheId].id = shaderCacheId;\n return shaderCacheId;\n };\n _proto.createShader = function createShader(shaderSource, macros) {\n var shaderCacheId = this.addShader(shaderSource, macros);\n return this.cachedShaders[shaderCacheId];\n };\n _proto.compileShader = function compileShader(shader, asyncCallback) {\n var _this = this;\n var _shader_source = shader.source, sourceShared = _shader_source.shared, vertex = _shader_source.vertex, fragment = _shader_source.fragment, name = _shader_source.name;\n var cacheId = shader.source.cacheId;\n var shared = false;\n if (sourceShared || cacheId) {\n shared = true;\n }\n var gl = this.pipelineContext.gl;\n var result = {\n shared: shared,\n status: exports.ShaderCompileResultStatus.compiling\n };\n var linkProgram = this.createProgram(gl, vertex, fragment, result);\n var ext = this.glAsyncCompileExt;\n var startTime = performance.now();\n var setupProgram = function(glProgram) {\n result.status = exports.ShaderCompileResultStatus.success;\n result.compileTime = performance.now() - startTime;\n shader.program = glProgram;\n shader.initialized = true;\n shader.pipelineContext = _this.pipelineContext;\n if (_this.programMap[shader.id] !== undefined) {\n console.warn(\"Find duplicated shader id: \" + shader.id + \".\");\n }\n _this.programMap[shader.id] = glProgram;\n // console.log('compileShader ' + result.cacheId + ' ' + result.compileTime + ' ', shader.source);\n };\n var checkComplete = function() {\n if (_this.engine.isDestroyed) {\n console.warn(\"The player is destroyed during the loadScene process. Please check the timing of calling loadScene and dispose. A common situation is that when calling loadScene, await is not added. This will cause dispose to be called before loadScene is completed.\");\n return asyncCallback == null ? void 0 : asyncCallback(result);\n }\n if (shader.initialized) {\n return asyncCallback == null ? void 0 : asyncCallback(result);\n }\n var shouldLink = !asyncCallback || !ext || ext && gl.getProgramParameter(result.program, ext.COMPLETION_STATUS_KHR) == true;\n var program = shouldLink && linkProgram();\n if (program) {\n if (result.status !== exports.ShaderCompileResultStatus.fail) {\n assignInspectorName(program, name);\n var glProgram = new GLProgram(_this.engine, program, shader.id);\n // FIXME: 这个检测不能在这里调用,安卓上会有兼容性问题。要么开发版使用,要么移到Shader首次使用时\n gl.validateProgram(program);\n var valid = gl.getProgramParameter(program, gl.VALIDATE_STATUS);\n if (!valid) {\n var error = gl.getProgramInfoLog(program);\n var err0 = \"the same texture\";\n if (error == null ? void 0 : error.includes(err0)) {\n // 忽略这类错误\n setupProgram(glProgram);\n } else {\n result.status = exports.ShaderCompileResultStatus.fail;\n result.error = error;\n console.error(\"compileProgramError: \" + error, \"\\nvertex:\\n\", vertex, \"\\nfragment:\\n\", fragment);\n gl.deleteProgram(program);\n }\n } else {\n setupProgram(glProgram);\n }\n }\n asyncCallback == null ? void 0 : asyncCallback(result);\n } else if (asyncCallback) {\n requestAnimationFrame(checkComplete);\n }\n };\n shader.compileResult = result;\n checkComplete();\n };\n _proto.computeShaderCacheId = function computeShaderCacheId(shader) {\n var _shader_vertex = shader.vertex, vertex = _shader_vertex === void 0 ? \"\" : _shader_vertex, _shader_fragment = shader.fragment, fragment = _shader_fragment === void 0 ? \"\" : _shader_fragment, shared = shader.shared;\n var cacheId = shader.cacheId;\n var shaderCacheId;\n if (shared || cacheId) {\n shaderCacheId = cacheId || \"shared_\" + stringHash(vertex, fragment);\n } else {\n shaderCacheId = \"instanced_\" + shaderSeed++;\n }\n return shaderCacheId;\n };\n _proto.createProgram = function createProgram(gl, vs, fs, result) {\n var program = gl.createProgram();\n var vertexShader = this.createGLShader(gl, gl.VERTEX_SHADER, vs);\n var fragShader = this.createGLShader(gl, gl.FRAGMENT_SHADER, fs);\n if (program && vertexShader && fragShader) {\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n result.program = program;\n result.status = exports.ShaderCompileResultStatus.compiling;\n return function() {\n result.program = undefined;\n var linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!linked) {\n // 链接失败,获取并打印错误信息\n var info = gl.getProgramInfoLog(program);\n console.error(\"Failed to link program: \" + info + \".\");\n var vsCheckResult = checkShader(gl, vertexShader, \"vertex\", vs);\n var fsCheckResult = checkShader(gl, fragShader, \"fragment\", fs);\n result.status = exports.ShaderCompileResultStatus.fail;\n if (vsCheckResult) {\n result.error = vsCheckResult.error;\n result.status = vsCheckResult.status;\n }\n if (fsCheckResult) {\n result.error = fsCheckResult.error;\n result.status = fsCheckResult.status;\n }\n return program;\n }\n return program;\n };\n }\n result.status = exports.ShaderCompileResultStatus.fail;\n return function() {\n return null;\n };\n };\n _proto.createGLShader = function createGLShader(gl, shaderType, code) {\n var map = shaderType === gl.VERTEX_SHADER ? this.glVertShaderMap : this.glFragShaderMap;\n var strHash = stringHash(code != null ? code : \"\");\n var ret = map.get(strHash);\n if (ret) {\n return ret;\n }\n var shader = gl.createShader(shaderType);\n if (shader) {\n gl.shaderSource(shader, code);\n gl.compileShader(shader);\n map.set(strHash, shader);\n }\n return shader;\n };\n _proto.deleteShader = function deleteShader(cacheId) {\n var program = this.programMap[cacheId];\n if (program !== undefined) {\n program.dispose();\n delete this.programMap[cacheId];\n }\n var result = this.shaderResults[cacheId];\n if (result !== undefined) {\n delete this.shaderResults[cacheId];\n }\n };\n _proto.restore = function restore() {\n // TODO\n };\n _proto.dispose = function dispose() {\n var _this = this;\n Object.keys(this.programMap).forEach(function(key) {\n var program = _this.programMap[key];\n program.dispose();\n });\n this.programMap = {};\n if (this.pipelineContext) {\n var gl = this.pipelineContext.gl;\n this.glFragShaderMap.forEach(function(shader) {\n gl.deleteShader(shader);\n });\n this.glVertShaderMap.forEach(function(shader) {\n gl.deleteShader(shader);\n });\n this.glVertShaderMap = new Map();\n this.glFragShaderMap = new Map();\n }\n };\n return GLShaderLibrary;\n}();\nfunction checkShader(gl, shader, type, code) {\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n var error = gl.getShaderInfoLog(shader);\n console.error(\"compile \" + type + \" error: \" + error, (code != null ? code : \"\").split(\"\\n\").map(function(line, index) {\n return index + 1 + \" \" + line;\n }).join(\"\\n\"));\n return {\n error: error,\n status: exports.ShaderCompileResultStatus.fail\n };\n }\n}\n\nvar GLPipelineContext = /*#__PURE__*/ function() {\n function GLPipelineContext(engine, gl) {\n this.engine = engine;\n this.gl = gl;\n this.gl = gl;\n this.shaderLibrary = new GLShaderLibrary(engine, this);\n this.maxTextureCount = this.gl.TEXTURE0 + this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS) - 1;\n this.reset();\n }\n var _proto = GLPipelineContext.prototype;\n _proto.dispose = function dispose() {\n this.shaderLibrary.dispose();\n this.reset();\n };\n _proto.reset = function reset() {\n this.glCapabilityCache = {};\n this.activeTextureIndex = glContext.TEXTURE0;\n this.textureUnitDict = {};\n this.currentFramebuffer = {};\n this.pixelStorei = {};\n this.currentRenderbuffer = {};\n };\n _proto.toggle = function toggle(capability, enable) {\n if (enable) {\n this.enable(capability);\n } else {\n this.disable(capability);\n }\n };\n /**\n * 对于该上下文开启某种特性\n * @param capability\n * example:\n * gl.enable(gl.DITHER);\n */ _proto.enable = function enable(capability) {\n var value = this.glCapabilityCache[capability];\n if (value !== true) {\n this.glCapabilityCache[capability] = true;\n this.gl.enable(capability);\n }\n };\n /**\n * 基于某种上下文关闭特性\n * @param capability\n * example:\n * gl.disable(gl.DITHER);\n */ _proto.disable = function disable(capability) {\n var value = this.glCapabilityCache[capability];\n if (value !== false) {\n this.glCapabilityCache[capability] = false;\n this.gl.disable(capability);\n }\n };\n /**\n * 绑定framebuffer webgl2新增: gl.DRAW_FRAMEBUFFER 和 gl.READ_FRAMEBUFFER\n * @param target\n * @param framebuffer\n * example:\n * const framebuffer = gl.createFramebuffer();\n * gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n */ _proto.bindFramebuffer = function bindFramebuffer(target, framebuffer) {\n if (this.currentFramebuffer[target] !== framebuffer) {\n this.currentFramebuffer[target] = framebuffer;\n this.gl.bindFramebuffer(target, framebuffer);\n }\n };\n _proto.bindRenderbuffer = function bindRenderbuffer(target, renderbuffer) {\n if (this.currentRenderbuffer[target] !== renderbuffer) {\n this.currentRenderbuffer[target] = renderbuffer;\n this.gl.bindRenderbuffer(target, renderbuffer);\n }\n };\n /**\n * 绑定系统 framebuffer\n */ _proto.bindSystemFramebuffer = function bindSystemFramebuffer() {\n this.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n };\n /**\n * 将定义好的 WebGLProgram 对象添加到当前的渲染状态中。\n * @param program\n * example:\n * gl.useProgram(program);\n * gl.useProgram(null);\n */ _proto.useProgram = function useProgram(program) {\n this.set1(\"useProgram\", program);\n };\n /**\n * 使用预设值来清空缓冲\n * @param mask\n * example:\n * gl.clear(gl.DEPTH_BUFFER_BIT);\n * gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n */ _proto.clear = function clear(mask) {\n this.gl.clear(mask);\n };\n /*** depth start ***/ /**\n * 设置深度缓冲区的深度清除值\n * @param depth\n * example:\n * gl.clearDepth(0.5);\n */ _proto.clearDepth = function clearDepth(depth) {\n this.set1(\"clearDepth\", depth);\n };\n /**\n * 指定将输入像素深度与当前深度缓冲区值进行比较的函数。\n * @param func\n * example:\n * gl.enable(gl.DEPTH_TEST);\n * gl.depthFunc(gl.NEVER);\n */ _proto.depthFunc = function depthFunc(func) {\n this.set1(\"depthFunc\", func);\n };\n /**\n * 设置是否启用写入深度缓冲。\n * @param flag\n * example:\n * gl.depthMask(false);\n */ _proto.depthMask = function depthMask(flag) {\n this.set1(\"depthMask\", flag);\n };\n _proto.polygonOffset = function polygonOffset(factor, unit) {\n this.set2(\"polygonOffset\", factor, unit);\n };\n /**\n * 将 z 值从规范化设备坐标映射到窗口坐标\n * @param zNear\n * @param zFar\n * example:\n * gl.depthRange(0.2, 0.6);\n */ _proto.depthRange = function depthRange(zNear, zFar) {\n this.set2(\"depthRange\", zNear, zFar);\n };\n /*** depth end ***/ /*** stencil start ***/ /**\n * 模版测试设置函数和引用值。\n * @param func\n * @param ref\n * @param mask\n * example:\n * gl.enable(gl.STENCIL_TEST);\n * gl.stencilFunc(gl.LESS, 0, 0b1110011);\n */ _proto.clearStencil = function clearStencil(s) {\n this.set1(\"clearStencil\", s);\n };\n /**\n * 控制启用和禁用模板平面中单个位的正面和背面写入\n * @param mask\n * example:\n * gl.stencilMask(0xff);\n */ _proto.stencilMask = function stencilMask(mask) {\n this.stencilMaskSeparate(this.gl.FRONT, mask);\n this.stencilMaskSeparate(this.gl.BACK, mask);\n };\n /**\n * 模版测试设置函数和引用值。\n * @param func\n * @param ref\n * @param mask\n * example:\n * gl.enable(gl.STENCIL_TEST);\n * gl.stencilFunc(gl.LESS, 0, 0b1110011);\n */ _proto.stencilFunc = function stencilFunc(func, ref, mask) {\n this.stencilFuncSeparate(this.gl.FRONT, func, ref, mask);\n this.stencilFuncSeparate(this.gl.BACK, func, ref, mask);\n };\n /**\n * 单面模版测试\n * @param face\n * @param func\n * @param ref\n * @param mask\n * example:\n * gl.enable(gl.STENCIL_TEST);\n * gl.stencilFuncSeparate(gl.FRONT, gl.LESS, 0.2, 1110011);\n */ _proto.stencilFuncSeparate = function stencilFuncSeparate(face, func, ref, mask) {\n this.set4(\"stencilFuncSeparate\", face, func, ref, mask);\n };\n /**\n * 单面的mask写入\n * @param face\n * @param mask\n * example:\n * gl.stencilMaskSeparate(gl.FRONT, 110101);\n */ _proto.stencilMaskSeparate = function stencilMaskSeparate(face, mask) {\n this.set2(\"stencilMaskSeparate\", face, mask);\n };\n /**\n * 设置正面和背面模板测试操作\n * @param fail\n * @param zfail\n * @param zpass\n * example:\n * gl.enable(gl.STENCIL_TEST);\n * gl.stencilOp(gl.INCR, gl.DECR, gl.INVERT);\n */ _proto.stencilOp = function stencilOp(fail, zfail, zpass) {\n this.stencilOpSeparate(this.gl.FRONT, fail, zfail, zpass);\n this.stencilOpSeparate(this.gl.BACK, fail, zfail, zpass);\n };\n /**\n * 设置正面和/或背面模板测试操作\n * @param face\n * @param fail\n * @param zfail\n * @param zpass\n * example:\n * gl.enable(gl.STENCIL_TEST);\n * gl.stencilOpSeparate(gl.FRONT, gl.INCR, gl.DECR, gl.INVERT);\n */ _proto.stencilOpSeparate = function stencilOpSeparate(face, fail, zfail, zpass) {\n this.set4(\"stencilOpSeparate\", face, fail, zfail, zpass);\n };\n /*** stencil end ***/ /*** face start ***/ /**\n * 剔除方式\n * @param mode\n * example:\n * gl.enable(gl.CULL_FACE);\n * gl.cullFace(gl.FRONT_AND_BACK);\n */ _proto.cullFace = function cullFace(mode) {\n this.set1(\"cullFace\", mode);\n };\n /**\n * 设置卷绕方向\n * @param mode\n * example:\n * gl.frontFace(gl.CW);\n */ _proto.frontFace = function frontFace(mode) {\n this.set1(\"frontFace\", mode);\n };\n /*** face end ***/ /*** color start ***/ /**\n * 设置颜色写入\n * @param red\n * @param green\n * @param blue\n * @param alpha\n * example:\n * gl.colorMask(true, true, true, false);\n */ _proto.clearColor = function clearColor(red, green, blue, alpha) {\n this.set4(\"clearColor\", red, green, blue, alpha);\n };\n /**\n * 设置颜色写入\n * @param red\n * @param green\n * @param blue\n * @param alpha\n * example:\n * gl.colorMask(true, true, true, false);\n */ _proto.colorMask = function colorMask(red, green, blue, alpha) {\n this.set4(\"colorMask\", red, green, blue, alpha);\n };\n /**\n * 设置源和目标混合因子\n * @param red\n * @param green\n * @param blue\n * @param alpha\n * example:\n * gl.blendColor(0, 0.5, 1, 1);\n */ _proto.blendColor = function blendColor(red, green, blue, alpha) {\n this.set4(\"blendColor\", red, green, blue, alpha);\n };\n /**\n * 用于混合像素算法\n * @param sfactor\n * @param dfactor\n * example:\n * gl.enable(gl.BLEND);\n * gl.blendFunc(gl.SRC_COLOR, gl.DST_COLOR);\n */ _proto.blendFunc = function blendFunc(sfactor, dfactor) {\n this.blendFuncSeparate(sfactor, dfactor, sfactor, dfactor);\n };\n /**\n * 分别设置应用在 RGB 和 Alpha 上的 factor\n * @param srcRGB\n * @param dstRGB\n * @param srcAlpha\n * @param dstAlpha\n * example:\n * gl.enable(gl.BLEND);\n * gl.blendFuncSeparate(gl.SRC_COLOR, gl.DST_COLOR, gl.ONE, gl.ZERO);\n */ _proto.blendFuncSeparate = function blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha) {\n this.set4(\"blendFuncSeparate\", srcRGB, dstRGB, srcAlpha, dstAlpha);\n };\n /**\n * 设置混合模式\n * @param mode\n * example:\n * gl.blendEquation(gl.FUNC_ADD);\n * gl.blendEquation(gl.FUNC_SUBTRACT);\n * gl.blendEquation(gl.FUNC_REVERSE_SUBTRACT);\n */ _proto.blendEquation = function blendEquation(mode) {\n this.set1(\"blendEquation\", mode);\n };\n /**\n * 可以分别对 RGB 和 Alpha 做不同的操作处理\n * @param modeRGB\n * @param modeAlpha\n * example:\n * gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_SUBTRACT);\n */ _proto.blendEquationSeparate = function blendEquationSeparate(modeRGB, modeAlpha) {\n this.set2(\"blendEquationSeparate\", modeRGB, modeAlpha);\n };\n /*** color end ***/ /**\n * 图像预处理\n * @param pname\n * @param param\n * example:\n * var tex = gl.createTexture();\n * gl.bindTexture(gl.TEXTURE_2D, tex);\n * gl.pixelStorei(gl.PACK_ALIGNMENT, 4);\n */ _proto.setPixelStorei = function setPixelStorei(pname, param) {\n var currentParam = this.pixelStorei[pname];\n if (currentParam !== param) {\n this.pixelStorei[pname] = param;\n this.gl.pixelStorei(pname, param);\n }\n };\n /**\n * 用来设置视口,即指定从标准设备到窗口坐标的x、y仿射变换。\n * @param x\n * @param y\n * @param width\n * @param height\n * example:\n * gl.viewport(0, 0, width, height);\n */ _proto.viewport = function viewport(x, y, width, height) {\n this.set4(\"viewport\", x, y, width, height);\n };\n /**\n * 激活指定的纹理单元\n * @param texture\n * example:\n * gl.activeTexture(gl.TEXTURE1);\n */ _proto.activeTexture = function activeTexture(texture) {\n texture = Math.min(texture, this.maxTextureCount);\n if (this.activeTextureIndex !== texture) {\n this.activeTextureIndex = texture;\n this.gl.activeTexture(texture);\n }\n };\n /**\n * 绑定WebGLTexture\n * @param target\n * @param texture\n * @param force\n * example:\n * const texture = gl.createTexture();\n * gl.bindTexture(gl.TEXTURE_2D, texture)\n */ // TODO: texture.bind 替换时对于这段逻辑的处理\n _proto.bindTexture = function bindTexture(target, texture, force) {\n if (this.currentTextureBinding !== texture || force) {\n this.gl.bindTexture(target, texture);\n this.currentTextureBinding = texture;\n }\n this.textureUnitDict[this.activeTextureIndex] = texture;\n };\n _proto.set1 = function set1(name, param) {\n var value = this.glCapabilityCache[name];\n if (value !== param) {\n this.glCapabilityCache[name] = param;\n // @ts-expect-error save to assign\n this.gl[name](param);\n }\n };\n _proto.set2 = function set2(name, param0, param1) {\n var value = this.glCapabilityCache[name];\n if (!value) {\n value = this.glCapabilityCache[name] = {\n x: NaN,\n y: NaN\n };\n }\n if (value.x !== param0 || value.y !== param1) {\n // @ts-expect-error save to assign\n this.gl[name](value.x = param0, value.y = param1);\n }\n };\n _proto.set3 = function set3(name, param0, param1, param2) {\n var value = this.glCapabilityCache[name];\n if (!value) {\n value = this.glCapabilityCache[name] = {\n x: NaN,\n y: NaN,\n z: NaN\n };\n }\n if (value.x !== param0 || value.y !== param1 || value.z !== param2) {\n // @ts-expect-error safe to assign\n this.gl[name](value.x = param0, value.y = param1, value.z = param2);\n }\n };\n _proto.set4 = function set4(name, param0, param1, param2, param3) {\n var value = this.glCapabilityCache[name];\n if (!value) {\n value = this.glCapabilityCache[name] = {\n x: NaN,\n y: NaN,\n z: NaN,\n w: NaN\n };\n }\n if (value.x !== param0 || value.y !== param1 || value.z !== param2 || value.w !== param3) {\n // @ts-expect-error safe to assign\n this.gl[name](value.x = param0, value.y = param1, value.z = param2, value.w = param3);\n }\n };\n // TODO 命名\n _proto.get = function get(name) {\n return this.glCapabilityCache[name];\n };\n _proto.setFloat = function setFloat(uniform, value) {\n if (!uniform) {\n return;\n }\n this.gl.uniform1f(uniform, value);\n };\n _proto.setInt = function setInt(uniform, value) {\n if (!uniform) {\n return;\n }\n this.gl.uniform1i(uniform, value);\n };\n _proto.setFloats = function setFloats(uniform, value) {\n if (!uniform) {\n return;\n }\n this.gl.uniform1fv(uniform, value);\n };\n _proto.setVector2 = function setVector2(uniform, value) {\n this.setFloat2(uniform, value.x, value.y);\n };\n _proto.setVector3 = function setVector3(uniform, value) {\n this.setFloat3(uniform, value.x, value.y, value.z);\n };\n _proto.setVector4 = function setVector4(uniform, value) {\n this.setFloat4(uniform, value.x, value.y, value.z, value.w);\n };\n _proto.setColor = function setColor(uniform, value) {\n this.setFloat4(uniform, value.r, value.g, value.b, value.a);\n };\n _proto.setQuaternion = function setQuaternion(uniform, value) {\n this.setFloat4(uniform, value.x, value.y, value.z, value.w);\n };\n _proto.setVector4Array = function setVector4Array(uniform, array) {\n if (!uniform || array.length % 4 !== 0) {\n return;\n }\n this.gl.uniform4fv(uniform, array);\n };\n _proto.setMatrix = function setMatrix(uniform, value) {\n if (!uniform) {\n return;\n }\n this.gl.uniformMatrix4fv(uniform, false, value.elements);\n };\n _proto.setMatrix3 = function setMatrix3(uniform, value) {\n if (!uniform) {\n return;\n }\n this.gl.uniformMatrix3fv(uniform, false, value.elements);\n };\n _proto.setMatrixArray = function setMatrixArray(uniform, array) {\n if (!uniform || array.length % 16 !== 0) {\n return;\n }\n this.gl.uniformMatrix4fv(uniform, false, array);\n };\n _proto.setTexture = function setTexture(uniform, channel, texture) {\n if (!uniform) {\n return;\n }\n this.gl.activeTexture(this.gl.TEXTURE0 + channel);\n var target = texture.target;\n this.gl.bindTexture(target, texture.textureBuffer);\n this.gl.uniform1i(uniform, channel);\n };\n /**\n * 查询所有uniform的location。\n * @param program 查询的shader program\n * @param uniformsNames 查询的uniform名称列表\n * @returns\n */ _proto.getUniforms = function getUniforms(program, uniformsNames) {\n var results = [];\n for(var index = 0; index < uniformsNames.length; index++){\n results.push(this.gl.getUniformLocation(program, uniformsNames[index]));\n }\n return results;\n };\n _proto.setFloat4 = function setFloat4(uniform, x, y, z, w) {\n if (!uniform) {\n return;\n }\n this.gl.uniform4f(uniform, x, y, z, w);\n };\n _proto.setFloat3 = function setFloat3(uniform, x, y, z) {\n if (!uniform) {\n return;\n }\n this.gl.uniform3f(uniform, x, y, z);\n };\n _proto.setFloat2 = function setFloat2(uniform, x, y) {\n if (!uniform) {\n return;\n }\n this.gl.uniform2f(uniform, x, y);\n };\n return GLPipelineContext;\n}();\n\nvar GLRenderer = /*#__PURE__*/ function(Renderer) {\n _inherits(GLRenderer, Renderer);\n function GLRenderer(canvas, framework, renderOptions) {\n var _this;\n _this = Renderer.call(this) || this;\n _this.canvas = canvas;\n _this.temporaryRTs = {};\n var options = _extends({\n preserveDrawingBuffer: undefined,\n alpha: true,\n stencil: true,\n antialias: true,\n depth: true,\n premultipliedAlpha: true\n }, renderOptions);\n _this.context = new GLContextManager(canvas, framework, options);\n var gl = _this.context.gl;\n assertExist(gl);\n // engine 先创建\n _this.engine = new GLEngine(gl);\n _this.engine.renderer = _assert_this_initialized(_this);\n _this.pipelineContext = new GLPipelineContext(_this.engine, gl);\n _this.glRenderer = new GLRendererInternal(_this.engine);\n _this.extension = new ExtWrap(_assert_this_initialized(_this));\n _this.renderingData = {\n // @ts-expect-error\n currentFrame: {}\n };\n _this.framebuffer = new GLFramebuffer({\n storeAction: {},\n viewport: [\n 0,\n 0,\n _this.width,\n _this.height\n ],\n attachments: [\n new GLTexture(_this.engine, {\n sourceType: exports.TextureSourceType.framebuffer,\n data: {\n width: _this.width,\n height: _this.height\n }\n })\n ],\n depthStencilAttachment: {\n storageType: exports.RenderPassAttachmentStorageType.none\n }\n }, _assert_this_initialized(_this));\n return _this;\n }\n var _proto = GLRenderer.prototype;\n _proto.renderRenderFrame = function renderRenderFrame(renderFrame) {\n var _frame_renderer_getShaderLibrary;\n var frame = renderFrame;\n // TODO 需要一个贴图统一初始化的管理类,避免在渲染逻辑代码中初始化。\n // 初始化renderframe的贴图资源\n // if (frame.cachedTextures) {\n // for (const texture of frame.cachedTextures) {\n // (texture as GLTexture).initialize(this.pipelineContext);\n // }\n // }\n if (frame.resource) {\n frame.resource.color_b.initialize();\n }\n frame.emptyTexture.initialize();\n frame.transparentTexture.initialize();\n var passes = frame._renderPasses;\n if (this.isDestroyed) {\n console.error(\"Renderer is destroyed, target: GLRenderer.\");\n return;\n }\n (_frame_renderer_getShaderLibrary = frame.renderer.getShaderLibrary()) == null ? void 0 : _frame_renderer_getShaderLibrary.compileAllShaders();\n this.setFramebuffer(null);\n this.clear(frame.clearAction);\n var currentCamera = frame.camera;\n this.renderingData.currentFrame = frame;\n this.renderingData.currentCamera = currentCamera;\n this.setGlobalMatrix(\"effects_MatrixInvV\", currentCamera.getInverseViewMatrix());\n this.setGlobalMatrix(\"effects_MatrixV\", currentCamera.getViewMatrix());\n this.setGlobalMatrix(\"effects_MatrixVP\", currentCamera.getViewProjectionMatrix());\n this.setGlobalMatrix(\"_MatrixP\", currentCamera.getProjectionMatrix());\n this.setGlobalVector3(\"effects_WorldSpaceCameraPos\", currentCamera.position);\n // 根据 priority 排序 pass\n sortByOrder(passes);\n for(var _iterator = _create_for_of_iterator_helper_loose(passes), _step; !(_step = _iterator()).done;){\n var pass = _step.value;\n var delegate = pass.delegate;\n delegate.willBeginRenderPass == null ? void 0 : delegate.willBeginRenderPass.call(delegate, pass, this.renderingData);\n this.renderRenderPass(pass);\n delegate.didEndRenderPass == null ? void 0 : delegate.didEndRenderPass.call(delegate, pass, this.renderingData);\n }\n for(var _iterator1 = _create_for_of_iterator_helper_loose(passes), _step1; !(_step1 = _iterator1()).done;){\n var pass1 = _step1.value;\n pass1.frameCleanup(this);\n }\n };\n _proto.renderRenderPass = function renderRenderPass(pass) {\n this.renderingData.currentPass = pass;\n // 初始化 pass attachment GPU资源\n pass.initialize(this);\n // 配置当前 renderer 的 RT\n pass.configure(this);\n // 执行当前 pass\n pass.execute(this);\n };\n _proto.renderMeshes = function renderMeshes(meshes) {\n var delegate = this.renderingData.currentPass.delegate;\n for(var _iterator = _create_for_of_iterator_helper_loose(meshes), _step; !(_step = _iterator()).done;){\n var mesh = _step.value;\n delegate.willRenderMesh == null ? void 0 : delegate.willRenderMesh.call(delegate, mesh, this.renderingData);\n mesh.render(this);\n delegate.didRenderMesh == null ? void 0 : delegate.didRenderMesh.call(delegate, mesh, this.renderingData);\n }\n };\n _proto.setGlobalFloat = function setGlobalFloat(name, value) {\n this.checkGlobalUniform(name);\n this.renderingData.currentFrame.globalUniforms.floats[name] = value;\n };\n _proto.setGlobalVector4 = function setGlobalVector4(name, value) {\n this.checkGlobalUniform(name);\n this.renderingData.currentFrame.globalUniforms.vector4s[name] = value;\n };\n _proto.getGlobalVector4 = function getGlobalVector4(name) {\n return this.renderingData.currentFrame.globalUniforms.vector4s[name];\n };\n _proto.setGlobalInt = function setGlobalInt(name, value) {\n this.checkGlobalUniform(name);\n this.renderingData.currentFrame.globalUniforms.ints[name] = value;\n };\n _proto.setGlobalMatrix = function setGlobalMatrix(name, value) {\n this.checkGlobalUniform(name);\n this.renderingData.currentFrame.globalUniforms.matrices[name] = value;\n };\n _proto.setGlobalVector3 = function setGlobalVector3(name, value) {\n this.checkGlobalUniform(name);\n this.renderingData.currentFrame.globalUniforms.vector3s[name] = value;\n };\n _proto.drawGeometry = function drawGeometry(geometry, material, subMeshIndex) {\n if (subMeshIndex === void 0) subMeshIndex = 0;\n if (!geometry || !material) {\n return;\n }\n material.initialize();\n geometry.initialize();\n geometry.flush();\n var renderingData = this.renderingData;\n if (renderingData.currentFrame.editorTransform) {\n material.setVector4(\"uEditorTransform\", renderingData.currentFrame.editorTransform);\n }\n try {\n material.use(this, renderingData.currentFrame.globalUniforms);\n } catch (e) {\n console.error(e);\n return;\n }\n this.glRenderer.drawGeometry(geometry, material, subMeshIndex);\n };\n _proto.setFramebuffer = function setFramebuffer(framebuffer) {\n if (framebuffer) {\n this.framebuffer = framebuffer;\n this.framebuffer.bind();\n this.setViewport(framebuffer.viewport[0], framebuffer.viewport[1], framebuffer.viewport[2], framebuffer.viewport[3]);\n } else {\n this.pipelineContext.bindSystemFramebuffer();\n this.setViewport(0, 0, this.getWidth(), this.getHeight());\n }\n };\n _proto.getFramebuffer = function getFramebuffer() {\n return this.framebuffer;\n };\n _proto.getTemporaryRT = function getTemporaryRT(name, width, height, depthBuffer, filter, format) {\n if (this.temporaryRTs[name]) {\n return this.temporaryRTs[name];\n }\n var textureFilter;\n var textureType;\n var depthType = exports.RenderPassAttachmentStorageType.none;\n // TODO 建立Map映射\n if (filter === exports.FilterMode.Linear) {\n textureFilter = glContext.LINEAR;\n } else if (filter === exports.FilterMode.Nearest) {\n textureFilter = glContext.NEAREST;\n }\n if (format === exports.RenderTextureFormat.RGBA32) {\n textureType = glContext.UNSIGNED_BYTE;\n } else if (format === exports.RenderTextureFormat.RGBAHalf) {\n textureType = glContext.HALF_FLOAT;\n }\n if (depthBuffer === 0) {\n depthType = exports.RenderPassAttachmentStorageType.none;\n } else if (depthBuffer === 16) {\n depthType = exports.RenderPassAttachmentStorageType.depth_16_opaque;\n } else if (depthBuffer === 24) {\n depthType = exports.RenderPassAttachmentStorageType.depth_24_stencil_8_texture;\n }\n var colorAttachment = new GLTexture(this.engine, {\n sourceType: exports.TextureSourceType.framebuffer,\n minFilter: textureFilter,\n magFilter: textureFilter,\n internalFormat: glContext.RGBA,\n format: glContext.RGBA,\n type: textureType\n });\n var newFramebuffer = new GLFramebuffer({\n name: name,\n storeAction: {},\n viewport: [\n 0,\n 0,\n width,\n height\n ],\n viewportScale: 1,\n isCustomViewport: true,\n attachments: [\n colorAttachment\n ],\n depthStencilAttachment: {\n storageType: depthType\n }\n }, this);\n this.temporaryRTs[name] = newFramebuffer;\n return newFramebuffer;\n };\n _proto.setViewport = function setViewport(x, y, width, height) {\n this.pipelineContext.viewport(x, y, width, height);\n };\n _proto.clear = function clear(action) {\n var state = this.pipelineContext;\n var bit = 0;\n if (action.colorAction === exports.TextureLoadAction.clear) {\n var clearColor = action.clearColor;\n if (clearColor) {\n state.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);\n }\n state.colorMask(true, true, true, true);\n bit = glContext.COLOR_BUFFER_BIT;\n }\n if (action.stencilAction === exports.TextureLoadAction.clear) {\n state.stencilMask(0xff);\n state.clearStencil(action.clearStencil || 0);\n bit = bit | glContext.STENCIL_BUFFER_BIT;\n }\n if (action.depthAction === exports.TextureLoadAction.clear) {\n var depth = action.clearDepth;\n state.depthMask(true);\n state.clearDepth(Number.isFinite(depth) ? depth : 1);\n bit = bit | glContext.DEPTH_BUFFER_BIT;\n }\n if (bit) {\n state.clear(bit);\n }\n };\n _proto.addLostHandler = function addLostHandler(lostHandler) {\n this.context.addLostHandler(lostHandler);\n };\n _proto.addRestoreHandler = function addRestoreHandler(restoreHandler) {\n this.context.addRestoreHandler(restoreHandler);\n };\n _proto.getShaderLibrary = function getShaderLibrary() {\n return this.pipelineContext.shaderLibrary;\n };\n _proto.getWidth = function getWidth() {\n return this.width;\n };\n _proto.getHeight = function getHeight() {\n return this.height;\n };\n _proto.dispose = function dispose() {\n var _this_glRenderer;\n this.context.dispose();\n this.extension.dispose();\n this.pipelineContext.dispose();\n (_this_glRenderer = this.glRenderer) == null ? void 0 : _this_glRenderer.dispose();\n // @ts-expect-error\n this.canvas = null;\n this.engine.dispose();\n };\n _proto.lost = function lost(e) {\n e.preventDefault();\n this.pipelineContext.dispose();\n this.extension.dispose();\n this.glRenderer.lost(e);\n };\n _proto.restore = function restore() {\n // FIXME: 需要测试下lost和restore流程\n var gl = this.context.gl;\n if (!gl) {\n throw new Error(\"Can not restore automatically because losing gl context.\");\n }\n this.engine.gpuCapability = new GPUCapability(gl);\n this.engine.renderer = this;\n this.pipelineContext = new GLPipelineContext(this.engine, gl);\n this.glRenderer = new GLRendererInternal(this.engine);\n this.extension = new ExtWrap(this);\n };\n _proto.resize = function resize(width, height) {\n var internal = this.glRenderer;\n if (internal) {\n if (this.width !== width || this.height !== height) {\n internal.resize(width, height);\n }\n }\n };\n _proto.checkGlobalUniform = function checkGlobalUniform(name) {\n var globalUniforms = this.renderingData.currentFrame.globalUniforms;\n if (!globalUniforms.uniforms.includes(name)) {\n globalUniforms.uniforms.push(name);\n }\n };\n _create_class(GLRenderer, [\n {\n key: \"isDestroyed\",\n get: function get() {\n var internal = this.glRenderer;\n return internal ? internal.isDestroyed : true;\n }\n },\n {\n key: \"height\",\n get: function get() {\n var _this_glRenderer;\n var _this_glRenderer_height;\n return (_this_glRenderer_height = (_this_glRenderer = this.glRenderer) == null ? void 0 : _this_glRenderer.height) != null ? _this_glRenderer_height : 0;\n }\n },\n {\n key: \"width\",\n get: function get() {\n var _this_glRenderer;\n var _this_glRenderer_width;\n return (_this_glRenderer_width = (_this_glRenderer = this.glRenderer) == null ? void 0 : _this_glRenderer.width) != null ? _this_glRenderer_width : 0;\n }\n }\n ]);\n return GLRenderer;\n}(Renderer);\n\nvar HELP_LINK = {\n \"Container size overflowed\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#MvjnY\",\n \"DPI overflowed\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#ulfNT\",\n \"Invalid container size\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#lLlSW\",\n \"Container is not an HTMLElement\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#WZaWg\",\n \"Never use destroyed player again\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#YSWQr\",\n \"Current running player count\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#IzodZ\",\n \"Create player with different WebGL version\": \"https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#X0ulg\"\n};\n\nfunction isDowngradeIOS() {\n var iOSVersionRegex = /iPhone OS (\\d+)_(\\d+)/;\n var match = iOSVersionRegex.exec(navigator.userAgent);\n if (match) {\n return match[1] === \"13\" || match[1] === \"16\" && match[2] === \"5\";\n }\n return false;\n}\nfunction throwError(destroyedErrorMessage) {\n throw new Error(destroyedErrorMessage);\n}\nfunction throwErrorPromise(destroyedErrorMessage) {\n return Promise.reject(destroyedErrorMessage);\n}\nfunction handleThrowError(target, propertyKey, descriptor) {\n // 保存原始方法\n var originalMethod = descriptor.value;\n // 替换原始方法\n descriptor.value = /*#__PURE__*/ _async_to_generator(function() {\n var _len, args, _key, result, e;\n var _arguments = arguments;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n for(_len = _arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = _arguments[_key];\n }\n _state.label = 1;\n case 1:\n _state.trys.push([\n 1,\n 3,\n ,\n 4\n ]);\n return [\n 4,\n originalMethod.apply(this, args)\n ];\n case 2:\n result = _state.sent();\n return [\n 2,\n result\n ];\n case 3:\n e = _state.sent();\n // @ts-expect-error\n target.handleThrowError.call(this, e);\n return [\n 3,\n 4\n ];\n case 4:\n return [\n 2\n ];\n }\n });\n });\n // 返回修改后的描述符\n return descriptor;\n}\n\nvar playerMap = new Map();\n/**\n * 判断指定的 canvas 是否有播放器正在使用\n * @param canvas - 指定的 canvas\n * @returns\n */ function isCanvasUsedByPlayer(canvas) {\n return playerMap.has(canvas);\n}\n/**\n * 获取 canvas 对应的播放器\n * @param canvas - 指定的 canvas\n * @returns\n */ function getPlayerByCanvas(canvas) {\n return playerMap.get(canvas);\n}\n/**\n * 获取使用中的播放器\n * @returns\n */ function getActivePlayers() {\n return Array.from(playerMap.values());\n}\n/**\n * 同时允许的播放器数量超过 1 时打印错误\n */ function assertNoConcurrentPlayers() {\n var runningPlayers = [];\n for(var _iterator = _create_for_of_iterator_helper_loose(playerMap.values()), _step; !(_step = _iterator()).done;){\n var player = _step.value;\n if (!player.paused) {\n runningPlayers.push(player);\n }\n }\n if (runningPlayers.length > 1) {\n logger.error(\"Current running player count: \" + runningPlayers.length + \", see \" + HELP_LINK[\"Current running player count\"] + \".\", runningPlayers);\n }\n}\n\nvar enableDebugType = false;\nvar seed = 1;\n/**\n * Galacean Effects 播放器\n */ var Player = /*#__PURE__*/ function(EventEmitter) {\n _inherits(Player, EventEmitter);\n function Player(config) {\n var _this;\n _this = EventEmitter.call(this) || this;\n /**\n * 当前播放的合成对象数组,请不要修改内容\n */ _this.compositions = [];\n _this.displayScale = 1;\n _this.resumePending = false;\n _this.disposed = false;\n _this.assetManagers = [];\n _this.speed = 1;\n _this.baseCompositionIndex = 0;\n /**\n * 播放器在 `webglcontextlost` 时执行的操作\n * @param e - Event\n */ _this.lost = function(e) {\n var _this_ticker;\n (_this_ticker = _this.ticker) == null ? void 0 : _this_ticker.pause();\n _this.compositions.forEach(function(comp) {\n return comp.lost(e);\n });\n _this.renderer.lost(e);\n _this.handleEmitEvent(\"webglcontextlost\", e);\n broadcastPlayerEvent(_assert_this_initialized(_this), false);\n };\n var _this1 = _assert_this_initialized(_this);\n /**\n * 播放器在 `webglcontextrestored` 时执行的操作\n * @returns\n */ _this.restore = /*#__PURE__*/ _async_to_generator(function() {\n var _this_ticker;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n _this1.renderer.restore();\n return [\n 4,\n Promise.all(_this1.compositions.map(/*#__PURE__*/ _async_to_generator(function(composition) {\n var currentTime, url, speed, keepResource, reusable, renderOrder, transform, videoState, newComposition, i, video, _videoState_i;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n currentTime = composition.time, url = composition.url, speed = composition.speed, keepResource = composition.keepResource, reusable = composition.reusable, renderOrder = composition.renderOrder, transform = composition.transform, videoState = composition.videoState;\n return [\n 4,\n _this1.loadScene(url)\n ];\n case 1:\n newComposition = _state.sent();\n newComposition.speed = speed;\n newComposition.reusable = reusable;\n newComposition.keepResource = keepResource;\n newComposition.renderOrder = renderOrder;\n newComposition.transform.setPosition(transform.position.x, transform.position.y, transform.position.z);\n newComposition.transform.setRotation(transform.rotation.x, transform.rotation.y, transform.rotation.z);\n newComposition.transform.setScale(transform.scale.x, transform.scale.y, transform.scale.z);\n i = 0;\n _state.label = 2;\n case 2:\n if (!(i < videoState.length)) return [\n 3,\n 5\n ];\n if (!videoState[i]) return [\n 3,\n 4\n ];\n video = newComposition.textures[i].source.video;\n video.currentTime = (_videoState_i = videoState[i]) != null ? _videoState_i : 0;\n return [\n 4,\n video.play()\n ];\n case 3:\n _state.sent();\n _state.label = 4;\n case 4:\n i++;\n return [\n 3,\n 2\n ];\n case 5:\n newComposition.isEnded = false;\n newComposition.gotoAndPlay(currentTime);\n return [\n 2,\n newComposition\n ];\n }\n });\n })))\n ];\n case 1:\n _this1.compositions = _state.sent();\n _this1.emit(\"webglcontextrestored\");\n (_this_ticker = _this1.ticker) == null ? void 0 : _this_ticker.resume();\n if (isIOS() && _this1.canvas) {\n _this1.canvas.style.display = \"none\";\n window.setTimeout(function() {\n _this1.canvas.style.display = \"\";\n }, 0);\n }\n return [\n 2\n ];\n }\n });\n });\n _this.handleResume = function() {\n _this.emit(\"update\", {\n player: _assert_this_initialized(_this),\n playing: true\n });\n };\n _this.handleClick = function(e) {\n var x = e.x, y = e.y;\n var hitInfos = [];\n // 收集所有的点击测试结果,click 回调执行可能会对 composition 点击结果有影响,放在点击测试执行完后再统一触发。\n _this.compositions.forEach(function(composition) {\n var regions = composition.hitTest(x, y);\n for(var _iterator = _create_for_of_iterator_helper_loose(regions), _step; !(_step = _iterator()).done;){\n var region = _step.value;\n hitInfos.push(_extends({}, region, {\n player: _assert_this_initialized(_this),\n composition: composition\n }));\n }\n });\n for(var i = 0; i < hitInfos.length; i++){\n var hitInfo = hitInfos[i];\n var behavior = hitInfo.behavior || InteractBehavior.NOTIFY;\n if (behavior === InteractBehavior.NOTIFY) {\n _this.emit(\"click\", _extends({}, hitInfo, {\n compositionId: hitInfo.composition.id,\n compositionName: hitInfo.composition.name\n }));\n hitInfo.composition.emit(\"click\", _extends({}, hitInfo, {\n compositionId: hitInfo.composition.id,\n compositionName: hitInfo.composition.name\n }));\n } else if (behavior === InteractBehavior.RESUME_PLAYER) {\n void _this.resume();\n }\n }\n };\n var container = config.container, canvas = config.canvas, fps = config.fps, name = config.name, pixelRatio = config.pixelRatio, manualRender = config.manualRender, reportGPUTime = config.reportGPUTime, glType = config.renderFramework, notifyTouch = config.notifyTouch, onError = config.onError, _config_interactive = config.interactive, interactive = _config_interactive === void 0 ? false : _config_interactive, _config_renderOptions = config.renderOptions, renderOptions = _config_renderOptions === void 0 ? {} : _config_renderOptions, _config_env = config.env, env = _config_env === void 0 ? \"\" : _config_env;\n var preserveDrawingBuffer = renderOptions.willCaptureImage, premultipliedAlpha = renderOptions.premultipliedAlpha;\n _this.onError = onError;\n // 原 debug-disable 直接返回\n if (enableDebugType || glType === \"debug-disable\") {\n return _possible_constructor_return(_this);\n }\n // 注意: iOS 13/iOS 16.5 在 WebGL2 下有渲染或卡顿问题,故默认使用 WebGL1\n var framework = isDowngradeIOS() ? \"webgl\" : \"webgl2\";\n // 用户可以通过传入 renderFramework,手动强制使用 WebGL 1/2 来渲染\n if (glType) {\n framework = glType === \"webgl\" ? \"webgl\" : \"webgl2\";\n }\n _this.reportGPUTime = reportGPUTime;\n _this.pixelRatio = Number.isFinite(pixelRatio) ? pixelRatio : getPixelRatio();\n _this.offscreenMode = true;\n _this.env = env;\n _this.name = name || \"\" + seed++;\n try {\n if (initErrors.length) {\n throw new Error(\"Errors before player create: \" + initErrors.map(function(message, index) {\n return \"\\n \" + (index + 1) + \": \" + message;\n }) + \".\", {\n cause: \"webgliniterror\"\n });\n }\n if (canvas) {\n _this.canvas = canvas;\n } else {\n assertContainer(container);\n _this.canvas = document.createElement(\"canvas\");\n container.appendChild(_this.canvas);\n }\n _this.container = _this.canvas.parentElement;\n _this.renderer = Renderer.create(_this.canvas, framework, {\n preserveDrawingBuffer: preserveDrawingBuffer,\n premultipliedAlpha: premultipliedAlpha\n });\n _this.renderer.env = env;\n _this.renderer.addLostHandler({\n lost: _this.lost\n });\n _this.renderer.addRestoreHandler({\n restore: _this.restore\n });\n _this.gpuCapability = _this.renderer.engine.gpuCapability;\n _this.assetService = new AssetService(_this.renderer.engine);\n if (!manualRender) {\n _this.ticker = new Ticker(fps);\n _this.ticker.add(_this.tick.bind(_assert_this_initialized(_this)));\n }\n _this.event = new EventSystem(_this.canvas, !!notifyTouch);\n _this.event.bindListeners();\n _this.event.addEventListener(EVENT_TYPE_CLICK, _this.handleClick);\n _this.interactive = interactive;\n _this.resize();\n setSpriteMeshMaxItemCountByGPU(_this.gpuCapability.detail);\n } catch (e) {\n _this.handleThrowError(e);\n }\n // 如果存在 WebGL 和 WebGL2 的 Player,需要给出警告\n playerMap.forEach(function(player) {\n if (player.gpuCapability.type !== _this.gpuCapability.type) {\n logger.warn(\"Create player with different WebGL version: old=\" + player.gpuCapability.type + \", new=\" + _this.gpuCapability.type + \".\\nsee \" + HELP_LINK[\"Create player with different WebGL version\"] + \".\");\n }\n });\n playerMap.set(_this.canvas, _assert_this_initialized(_this));\n assertNoConcurrentPlayers();\n broadcastPlayerEvent(_assert_this_initialized(_this), true);\n return _this;\n }\n var _proto = Player.prototype;\n /**\n * 设置当前 Player 的播放速度\n * @param speed - 播放速度\n */ _proto.setSpeed = function setSpeed(speed) {\n if (!isNaN(speed)) {\n this.speed = speed;\n }\n };\n /**\n * 获取当前 Player 的播放速度\n * @returns\n */ _proto.getSpeed = function getSpeed() {\n return this.speed;\n };\n /**\n * 根据名称查找对应的合成(可能找不到,如果有同名的合成,默认返回第一个)\n * @example\n * ``` ts\n * const composition = player.getCompositionByName('新建合成1');\n * ```\n * @param name - 目标合成名称\n */ _proto.getCompositionByName = function getCompositionByName(name) {\n return this.compositions.find(function(comp) {\n return comp.name === name;\n });\n };\n /**\n * 获取当前播放的所有合成(请不要修改返回的数组内容)\n */ _proto.getCompositions = function getCompositions() {\n return this.compositions.sort(function(a, b) {\n return a.getIndex() - b.getIndex();\n });\n };\n /**\n * Gets the array of asset managers.\n * @returns\n */ _proto.getAssetManager = function getAssetManager() {\n return this.assetManagers;\n };\n _proto.loadScene = function loadScene(scene, options) {\n var _this = this;\n return _async_to_generator(function() {\n var _this_renderer_engine_gpuCapability_detail, _this_renderer_engine_gpuCapability, _this_ticker, last, scenes, compositions, _options_autoplay, autoplay, asyncShaderCompile, baseOrder, _scenes, autoplayFlags, compileStart, compileTime, i, compositionNames, firstFrameTime, _iterator, _step, composition;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n assertExist(_this.renderer, \"Renderer is not exist, maybe the Player has been disabled or in gl 'debug-disable' mode.\");\n last = performance.now();\n scenes = [];\n compositions = [];\n autoplay = (_options_autoplay = options == null ? void 0 : options.autoplay) != null ? _options_autoplay : true;\n asyncShaderCompile = (_this_renderer_engine_gpuCapability = _this.renderer.engine.gpuCapability) == null ? void 0 : (_this_renderer_engine_gpuCapability_detail = _this_renderer_engine_gpuCapability.detail) == null ? void 0 : _this_renderer_engine_gpuCapability_detail.asyncShaderCompile;\n baseOrder = _this.baseCompositionIndex;\n if (isArray(scene)) {\n (_scenes = scenes).push.apply(_scenes, [].concat(scene));\n } else {\n scenes.push(scene);\n }\n _this.baseCompositionIndex += scenes.length;\n if (autoplay) {\n _this.autoPlaying = true;\n }\n autoplayFlags = [];\n return [\n 4,\n Promise.all(scenes.map(/*#__PURE__*/ _async_to_generator(function(url, index) {\n var _this_assetService_assembleSceneLoadOptions, source, opts, _opts_autoplay, compositionAutoplay, assetManager, _$scene, composition;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n _this_assetService_assembleSceneLoadOptions = _this.assetService.assembleSceneLoadOptions(url, _extends({\n autoplay: autoplay\n }, options)), source = _this_assetService_assembleSceneLoadOptions.source, opts = _this_assetService_assembleSceneLoadOptions.options;\n compositionAutoplay = (_opts_autoplay = opts == null ? void 0 : opts.autoplay) != null ? _opts_autoplay : autoplay;\n assetManager = new AssetManager(opts);\n // TODO 多 json 之间目前不共用资源,如果后续需要多 json 共用,这边缓存机制需要额外处理\n _this.assetManagers.push(assetManager);\n return [\n 4,\n assetManager.loadScene(source, _this.renderer, {\n env: _this.env\n })\n ];\n case 1:\n _$scene = _state.sent();\n _this.assetService.prepareAssets(_$scene, assetManager.getAssets());\n _this.assetService.updateTextVariables(_$scene, assetManager.options.variables);\n _this.assetService.initializeTexture(_$scene);\n _$scene.pluginSystem.precompile(_$scene.jsonScene.compositions, _this.renderer);\n composition = _this.createComposition(_$scene, opts);\n composition.setIndex(baseOrder + index);\n compositions[index] = composition;\n autoplayFlags[index] = compositionAutoplay;\n return [\n 2\n ];\n }\n });\n })))\n ];\n case 1:\n _state.sent();\n compileStart = performance.now();\n return [\n 4,\n new Promise(function(resolve) {\n var _this_renderer_getShaderLibrary;\n (_this_renderer_getShaderLibrary = _this.renderer.getShaderLibrary()) == null ? void 0 : _this_renderer_getShaderLibrary.compileAllShaders(function() {\n return resolve(null);\n });\n })\n ];\n case 2:\n _state.sent();\n compileTime = performance.now() - compileStart;\n for(i = 0; i < compositions.length; i++){\n if (autoplayFlags[i]) {\n compositions[i].play();\n } else {\n compositions[i].pause();\n }\n }\n (_this_ticker = _this.ticker) == null ? void 0 : _this_ticker.start();\n compositionNames = compositions.map(function(composition) {\n return composition.name;\n });\n firstFrameTime = performance.now() - last;\n for(_iterator = _create_for_of_iterator_helper_loose(compositions); !(_step = _iterator()).done;){\n composition = _step.value;\n composition.statistic.compileTime = compileTime;\n composition.statistic.firstFrameTime = firstFrameTime;\n }\n logger.info(\"First frame [\" + compositionNames + \"]: \" + firstFrameTime.toFixed(4) + \"ms.\");\n logger.info(\"Shader \" + (asyncShaderCompile ? \"async\" : \"sync\") + \" compile [\" + compositionNames + \"]: \" + compileTime.toFixed(4) + \"ms.\");\n return [\n 2,\n isArray(scene) ? compositions : compositions[0]\n ];\n }\n });\n })();\n };\n _proto.createComposition = function createComposition(scene, options) {\n var _this = this;\n if (options === void 0) options = {};\n var renderer = this.renderer;\n // 加载期间 player 销毁\n if (this.disposed) {\n throw new Error(\"Disposed player can not used to create Composition.\");\n }\n var composition = new Composition(_extends({}, options, {\n renderer: renderer,\n width: renderer.getWidth(),\n height: renderer.getHeight(),\n event: this.event,\n handleItemMessage: function(message) {\n _this.emit(\"message\", message);\n }\n }), scene);\n // 中低端设备降帧到 30fps·\n if (this.ticker && options.renderLevel === RenderLevel.B) {\n this.ticker.setFPS(Math.min(this.ticker.getFPS(), 30));\n }\n // TODO 目前编辑器会每帧调用 loadScene, 在这编译会导致闪帧,待编辑器渲染逻辑优化后移除。\n if (this.env !== PLAYER_OPTIONS_ENV_EDITOR) {\n this.assetService.createShaderVariant();\n }\n this.compositions.push(composition);\n return composition;\n };\n /**\n * 播放通过 player 加载好的全部合成\n */ _proto.play = function play() {\n var _this_ticker;\n if (this.offscreenMode) {\n this.resize();\n this.offscreenMode = false;\n }\n this.autoPlaying = true;\n this.compositions.map(function(composition) {\n composition.play();\n });\n (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.start();\n };\n /**\n * 跳转全部合成到指定时间后播放\n * @param time - 指定时间, 单位秒\n */ _proto.gotoAndPlay = function gotoAndPlay(time) {\n if (this.offscreenMode) {\n this.resize();\n this.offscreenMode = false;\n }\n this.autoPlaying = true;\n this.compositions.map(function(composition) {\n composition.gotoAndPlay(time);\n });\n if (this.ticker) {\n this.ticker.start();\n } else {\n this.doTick(0, true);\n }\n };\n /**\n * 跳转全部合成到指定时间并停留\n * @param time - 指定时间, 单位秒\n */ _proto.gotoAndStop = function gotoAndStop(time) {\n var _this_ticker;\n if (this.offscreenMode) {\n this.resize();\n this.offscreenMode = false;\n }\n this.autoPlaying = false;\n this.compositions.map(function(composition) {\n composition.gotoAndStop(time);\n });\n if (!this.ticker || ((_this_ticker = this.ticker) == null ? void 0 : _this_ticker.getPaused())) {\n this.doTick(0, true);\n }\n this.emit(\"update\", {\n player: this,\n playing: false\n });\n };\n /**\n * 顺序播放一组还未开始播放的合成\n * @param compositions - 要播放的合成数组\n */ _proto.playSequence = function playSequence(compositions) {\n var _loop = function(i) {\n compositions[i].on(\"end\", function() {\n compositions[i + 1].play();\n });\n };\n var _this_ticker;\n for(var i = 0; i < compositions.length - 1; i++)_loop(i);\n compositions[0].play();\n (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.start();\n };\n /**\n * 暂停播放器\n * @param options\n * @param options.offloadTexture - 是否卸载贴图纹理,减少内存\n * @returns\n */ _proto.pause = function pause(options) {\n var _this_ticker;\n if (this.paused) {\n return;\n }\n (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.pause();\n this.emit(\"pause\");\n this.emit(\"update\", {\n player: this,\n playing: false\n });\n if (options && options.offloadTexture) {\n this.offloadTexture();\n }\n };\n /**\n * 恢复播放器\n * > 如果暂停时卸载了纹理贴图,此函数将自动请求网络重新加载纹理\n * @returns\n */ _proto.resume = function resume() {\n var _this = this;\n return _async_to_generator(function() {\n var _this_ticker;\n return __generator(this, function(_state) {\n switch(_state.label){\n case 0:\n if (_this.resumePending) {\n return [\n 2\n ];\n }\n if (!_this.paused) return [\n 3,\n 2\n ];\n _this.resumePending = true;\n return [\n 4,\n Promise.all(_this.compositions.map(function(c) {\n return c.reloadTexture();\n }))\n ];\n case 1:\n _state.sent();\n _this.resumePending = false;\n _this.handleResume();\n _state.label = 2;\n case 2:\n (_this_ticker = _this.ticker) == null ? void 0 : _this_ticker.resume();\n return [\n 2\n ];\n }\n });\n })();\n };\n /**\n * player 在定时器每帧的回调\n * @param dt - 时间差,毫秒\n */ _proto.tick = function tick(dt) {\n this.doTick(dt, this.forceRenderNextFrame);\n this.forceRenderNextFrame = false;\n };\n _proto.doTick = function doTick(dt, forceRender) {\n var _this = this;\n var renderErrors = this.renderer.engine.renderErrors;\n if (renderErrors.size > 0) {\n var // 有渲染错误时暂停播放\n _this_ticker;\n this.handleEmitEvent(\"rendererror\", renderErrors.values().next().value);\n (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.pause();\n }\n dt = Math.min(dt, 33) * this.speed;\n var comps = this.compositions;\n var skipRender = false;\n comps.sort(function(a, b) {\n return a.getIndex() - b.getIndex();\n });\n var currentCompositions = [];\n for(var i = 0; i < comps.length; i++){\n var composition = comps[i];\n if (composition.textureOffloaded) {\n skipRender = true;\n logger.error(\"Composition \" + composition.name + \" texture offloaded, skip render.\");\n currentCompositions.push(composition);\n continue;\n }\n if (!composition.isDestroyed && composition.renderer) {\n composition.update(dt);\n }\n if (!composition.isDestroyed) {\n currentCompositions.push(composition);\n }\n }\n this.compositions = currentCompositions;\n this.baseCompositionIndex = this.compositions.length;\n if (skipRender) {\n var _this_ticker1;\n this.handleEmitEvent(\"rendererror\", new Error(\"Play when texture offloaded.\"));\n return (_this_ticker1 = this.ticker) == null ? void 0 : _this_ticker1.pause();\n }\n if (!this.paused || forceRender) {\n var level = this.gpuCapability.level;\n var gl = this.renderer.context.gl;\n var time = level === 2 && this.reportGPUTime ? gpuTimer(gl) : undefined;\n time == null ? void 0 : time.begin();\n if (this.compositions.length || this.compositions.length < comps.length || forceRender) {\n this.renderer.setFramebuffer(null);\n this.renderer.clear({\n stencilAction: exports.TextureLoadAction.clear,\n clearStencil: 0,\n depthAction: exports.TextureLoadAction.clear,\n clearDepth: 1,\n colorAction: exports.TextureLoadAction.clear,\n clearColor: [\n 0,\n 0,\n 0,\n 0\n ]\n });\n for(var i1 = 0; i1 < comps.length; i1++){\n !comps[i1].renderFrame.isDestroyed && this.renderer.renderRenderFrame(comps[i1].renderFrame);\n }\n }\n time == null ? void 0 : time.end();\n time == null ? void 0 : time.getTime().then(function(t) {\n return _this.reportGPUTime == null ? void 0 : _this.reportGPUTime.call(_this, t != null ? t : 0);\n }).catch;\n if (this.autoPlaying) {\n this.emit(\"update\", {\n player: this,\n playing: true\n });\n }\n }\n };\n /**\n * 调整画布的宽高比\n * @param aspect\n * @param scale\n */ _proto.resizeToAspect = function resizeToAspect(aspect, scale) {\n if (scale === void 0) scale = 1;\n if (aspect !== this.displayAspect) {\n this.displayAspect = aspect;\n }\n if (scale !== this.displayScale) {\n this.displayScale = scale;\n }\n this.resize();\n };\n /**\n * 将播放器重新和父容器大小对齐\n */ _proto.resize = function resize() {\n var parentElement = this.canvas.parentElement;\n var containerWidth;\n var containerHeight;\n var canvasWidth;\n var canvasHeight;\n if (parentElement) {\n var size = this.getTargetSize(parentElement);\n containerWidth = size[0];\n containerHeight = size[1];\n canvasWidth = size[2];\n canvasHeight = size[3];\n } else {\n containerWidth = canvasWidth = this.canvas.width;\n containerHeight = canvasHeight = this.canvas.height;\n }\n var aspect = containerWidth / containerHeight;\n if (containerWidth && containerHeight) {\n var _this_compositions;\n var documentWidth = document.documentElement.clientWidth;\n if (canvasWidth > documentWidth * 2) {\n logger.error(\"DPI overflowed, width \" + canvasWidth + \" is more than 2x document width \" + documentWidth + \", see \" + HELP_LINK[\"DPI overflowed\"] + \".\");\n }\n var maxSize = this.env ? this.gpuCapability.detail.maxTextureSize : 2048;\n if (canvasWidth > maxSize || canvasHeight > maxSize) {\n logger.error(\"Container size overflowed \" + canvasWidth + \"x\" + canvasHeight + \", see \" + HELP_LINK[\"Container size overflowed\"] + \".\");\n if (aspect > 1) {\n canvasWidth = Math.round(maxSize);\n canvasHeight = Math.round(maxSize / aspect);\n } else {\n canvasHeight = Math.round(maxSize);\n canvasWidth = Math.round(maxSize * aspect);\n }\n }\n // ios 14.1 -ios 14.3 resize canvas will cause memory leak\n this.renderer.resize(canvasWidth, canvasHeight);\n this.canvas.style.width = containerWidth + \"px\";\n this.canvas.style.height = containerHeight + \"px\";\n logger.info(\"Resize player \" + this.name + \" [\" + canvasWidth + \",\" + canvasHeight + \",\" + containerWidth + \",\" + containerHeight + \"].\");\n (_this_compositions = this.compositions) == null ? void 0 : _this_compositions.forEach(function(comp) {\n comp.camera.aspect = aspect;\n });\n }\n };\n /**\n * 清空 canvas 的画面\n * @param immediate - 如果立即清理,当前画面将会消失,如果 player 还有合成在渲染,可能出现闪烁\n */ _proto.clearCanvas = function clearCanvas(immediate) {\n if (immediate) {\n this.renderer.clear({\n stencilAction: exports.TextureLoadAction.clear,\n clearStencil: 0,\n depthAction: exports.TextureLoadAction.clear,\n clearDepth: 1,\n colorAction: exports.TextureLoadAction.clear,\n clearColor: [\n 0,\n 0,\n 0,\n 0\n ]\n });\n } else {\n this.forceRenderNextFrame = true;\n }\n };\n /**\n * 销毁当前播放的所有 Composition\n */ _proto.destroyCurrentCompositions = function destroyCurrentCompositions() {\n this.compositions.forEach(function(comp) {\n return comp.dispose();\n });\n this.compositions.length = 0;\n this.baseCompositionIndex = 0;\n };\n /**\n * 销毁播放器\n * @param keepCanvas - 是否保留 canvas 画面,默认不保留,canvas 不能再被使用\n */ _proto.dispose = function dispose(keepCanvas) {\n var _this_ticker;\n logger.info(\"Call player destroyed: \" + this.name + \".\");\n if (this.disposed) {\n return;\n }\n playerMap.delete(this.canvas);\n this.pause();\n (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.stop();\n this.assetManagers.forEach(function(assetManager) {\n return assetManager.dispose();\n });\n this.compositions.forEach(function(comp) {\n return comp.dispose();\n });\n this.compositions.length = 0;\n if (this.renderer) {\n this.renderer.context.removeLostHandler({\n lost: this.lost\n });\n this.renderer.context.removeRestoreHandler({\n restore: this.restore\n });\n this.renderer.dispose(!keepCanvas);\n }\n if (this.event) {\n this.event.dispose();\n }\n this.assetService.dispose();\n broadcastPlayerEvent(this, false);\n if (_instanceof1(this.canvas, HTMLCanvasElement) && !keepCanvas && this.renderer.context) {\n // TODO: 数据模版下掉可以由文本模块单独管理\n canvasPool.dispose();\n // canvas will become a cry emoji in Android if still in dom\n if (this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.canvas.remove();\n }\n // 在报错函数中传入 player.name\n var errorMsg = getDestroyedErrorMessage(this.name);\n var throwErrorFunc = function() {\n return throwError(errorMsg);\n };\n var throwErrorPromiseFunc = function() {\n return throwErrorPromise(errorMsg);\n };\n this.tick = throwErrorFunc;\n this.resize = throwErrorFunc;\n this.loadScene = throwErrorPromiseFunc;\n this.play = throwErrorPromiseFunc;\n this.gotoAndPlay = throwErrorPromiseFunc;\n this.gotoAndStop = throwErrorPromiseFunc;\n this.playSequence = throwErrorFunc;\n this.destroyCurrentCompositions = throwErrorFunc;\n this.resume = throwErrorPromiseFunc;\n this.disposed = true;\n };\n _proto.offloadTexture = function offloadTexture() {\n this.compositions.forEach(function(comp) {\n return comp.offloadTexture();\n });\n };\n _proto.getTargetSize = function getTargetSize(parentEle) {\n assertContainer(parentEle);\n var displayAspect = this.displayAspect;\n // 小程序环境没有 getComputedStyle\n var computedStyle = window.getComputedStyle == null ? void 0 : window.getComputedStyle.call(window, parentEle);\n var targetWidth;\n var targetHeight;\n var finalWidth = 0;\n var finalHeight = 0;\n if (computedStyle) {\n finalWidth = parseInt(computedStyle.width, 10);\n finalHeight = parseInt(computedStyle.height, 10);\n } else {\n finalWidth = parentEle.clientWidth;\n finalHeight = parentEle.clientHeight;\n }\n if (displayAspect) {\n var parentAspect = finalWidth / finalHeight;\n if (parentAspect > displayAspect) {\n targetHeight = finalHeight * this.displayScale;\n targetWidth = targetHeight * displayAspect;\n } else {\n targetWidth = finalWidth * this.displayScale;\n targetHeight = targetWidth / displayAspect;\n }\n } else {\n targetWidth = finalWidth;\n targetHeight = finalHeight;\n }\n var ratio = this.pixelRatio;\n var containerWidth = targetWidth;\n var containerHeight = targetHeight;\n targetWidth = Math.round(targetWidth * ratio);\n targetHeight = Math.round(targetHeight * ratio);\n if (targetHeight < 1 || targetHeight < 1) {\n if (this.offscreenMode) {\n targetWidth = targetHeight = containerWidth = containerHeight = 1;\n } else {\n throw new Error(\"Invalid container size \" + targetWidth + \"x\" + targetHeight + \", see \" + HELP_LINK[\"Invalid container size\"] + \".\");\n }\n }\n return [\n containerWidth,\n containerHeight,\n targetWidth,\n targetHeight\n ];\n };\n _proto.handleThrowError = function handleThrowError(e) {\n if (this.onError) {\n this.onError(e);\n } else {\n throw e;\n }\n };\n _proto.handleEmitEvent = function handleEmitEvent(name, e) {\n if (this.onError) {\n if (_instanceof1(e, Event)) {\n this.onError(new Error(e.type, {\n cause: name\n }), e);\n } else if (_instanceof1(e, Error)) {\n this.onError(new Error(e.message, {\n cause: name\n }), e);\n } else {\n this.onError(new Error(\"Unknown error.\", {\n cause: name\n }), e);\n }\n } else {\n console.warn(\"[\" + name + \"] event is deprecated, please use 'onError' instead.\");\n this.emit(name, e);\n }\n };\n _create_class(Player, [\n {\n key: \"compositionCount\",\n get: /**\n * 获取当前播放的合成数量\n */ function get() {\n return this.compositions.length;\n }\n },\n {\n key: \"hasPlayable\",\n get: /**\n * 是否有合成在播放\n */ function get() {\n return this.compositions.length > 0;\n }\n },\n {\n key: \"paused\",\n get: /**\n * 播放器是否已暂停\n */ function get() {\n var _this_ticker;\n return (_this_ticker = this.ticker) == null ? void 0 : _this_ticker.getPaused();\n }\n },\n {\n key: \"interactive\",\n get: /**\n * 获取播放器是否可交互\n */ function get() {\n return this.event.enabled;\n },\n set: /**\n * 设置播放器是否可交互\n */ function set(enable) {\n this.event.enabled = enable;\n }\n }\n ]);\n return Player;\n}(EventEmitter);\n__decorate([\n handleThrowError\n], Player.prototype, \"loadScene\", null);\n/**\n * 禁止/允许创建新的播放器,已创建的不受影响\n * @param disable - 是否禁止\n */ function disableAllPlayer(disable) {\n enableDebugType = !!disable;\n}\n/**\n * 播放器在实例化、销毁(`dispose`)时分别触发插件的 `onPlayerCreated`、`onPlayerDestroy` 回调\n * @param player - 播放器\n * @param isCreate - 是否处于实例化时\n */ function broadcastPlayerEvent(player, isCreate) {\n Object.keys(pluginLoaderMap).forEach(function(key) {\n var ctrl = pluginLoaderMap[key];\n var func = isCreate ? ctrl.onPlayerCreated : ctrl.onPlayerDestroy;\n func == null ? void 0 : func(player);\n });\n}\n/**\n * 创建播放器传入的容器不是 `HTMLElement` 时抛出错误\n * @param container\n */ function assertContainer(container) {\n if (container === undefined || container === null) {\n throw new Error(\"Container is not an HTMLElement, see \" + HELP_LINK[\"Container is not an HTMLElement\"] + \".\");\n }\n}\nfunction getDestroyedErrorMessage(name) {\n return \"Never use destroyed player: \" + name + \" again, see \" + HELP_LINK[\"Never use destroyed player again\"] + \".\";\n}\n\nTexture.create = function(engine, props) {\n return new GLTexture(engine, props);\n};\nTexture.createWithData = function(engine, data, options) {\n if (data === void 0) data = imageDataFromColor(\"#fff\");\n if (options === void 0) options = {};\n var _options_type = options.type, type = _options_type === void 0 ? glContext.UNSIGNED_BYTE : _options_type, _options_format = options.format, format = _options_format === void 0 ? glContext.RGBA : _options_format, internalFormat = options.internalFormat, _options_wrapS = options.wrapS, wrapS = _options_wrapS === void 0 ? glContext.MIRRORED_REPEAT : _options_wrapS, _options_wrapT = options.wrapT, wrapT = _options_wrapT === void 0 ? glContext.MIRRORED_REPEAT : _options_wrapT, _options_minFilter = options.minFilter, minFilter = _options_minFilter === void 0 ? glContext.NEAREST : _options_minFilter, _options_magFilter = options.magFilter, magFilter = _options_magFilter === void 0 ? glContext.NEAREST : _options_magFilter, _options_flipY = options.flipY, flipY = _options_flipY === void 0 ? false : _options_flipY;\n var tex = new GLTexture(engine, {\n data: data,\n type: type,\n sourceType: exports.TextureSourceType.data,\n format: format,\n internalFormat: internalFormat || format,\n wrapS: wrapS,\n wrapT: wrapT,\n minFilter: minFilter,\n magFilter: magFilter,\n flipY: flipY\n });\n return tex;\n};\nMaterial.create = function(engine, props) {\n return new GLMaterial(engine, props);\n};\nGeometry.create = function(engine, props) {\n return new GLGeometry(engine, props);\n};\nMesh.create = function(engine, props) {\n return new Mesh(engine, props);\n};\nRenderbuffer.create = function(props) {\n return new GLRenderbuffer(props);\n};\nFramebuffer.create = function(props, renderer) {\n return new GLFramebuffer(props, renderer);\n};\nRenderer.create = function(canvas, framework, renderOptions) {\n return new GLRenderer(canvas, framework, renderOptions);\n};\nEngine.create = function(gl) {\n return new GLEngine(gl);\n};\n/**\n * Player 版本号\n */ var version = \"2.4.3\";\nlogger.info(\"Player version: \" + version + \".\");\n\nexports.AbstractPlugin = AbstractPlugin;\nexports.ActivationPlayable = ActivationPlayable;\nexports.AnimationClipPlayable = AnimationClipPlayable;\nexports.Asset = Asset;\nexports.AssetLoader = AssetLoader;\nexports.AssetManager = AssetManager;\nexports.AssetService = AssetService;\nexports.BYTES_TYPE_MAP = BYTES_TYPE_MAP;\nexports.BaseRenderComponent = BaseRenderComponent;\nexports.Behaviour = Behaviour;\nexports.BezierCurve = BezierCurve;\nexports.BezierCurvePath = BezierCurvePath;\nexports.BezierCurveQuat = BezierCurveQuat;\nexports.COPY_FRAGMENT_SHADER = COPY_FRAGMENT_SHADER;\nexports.COPY_MESH_SHADER_ID = COPY_MESH_SHADER_ID;\nexports.COPY_VERTEX_SHADER = COPY_VERTEX_SHADER;\nexports.CalculateLoader = CalculateLoader;\nexports.Camera = Camera;\nexports.CameraVFXItemLoader = CameraVFXItemLoader;\nexports.ColorCurve = ColorCurve;\nexports.Component = Component;\nexports.Composition = Composition;\nexports.DEFAULT_FONTS = DEFAULT_FONTS;\nexports.DEFAULT_FPS = DEFAULT_FPS;\nexports.Database = Database;\nexports.Downloader = Downloader;\nexports.EFFECTS_COPY_MESH_NAME = EFFECTS_COPY_MESH_NAME;\nexports.EVENT_TYPE_CLICK = EVENT_TYPE_CLICK;\nexports.EVENT_TYPE_TOUCH_END = EVENT_TYPE_TOUCH_END;\nexports.EVENT_TYPE_TOUCH_MOVE = EVENT_TYPE_TOUCH_MOVE;\nexports.EVENT_TYPE_TOUCH_START = EVENT_TYPE_TOUCH_START;\nexports.EffectsObject = EffectsObject;\nexports.EffectsPackage = EffectsPackage;\nexports.Ellipse = Ellipse;\nexports.Engine = Engine;\nexports.EventEmitter = EventEmitter;\nexports.EventSystem = EventSystem;\nexports.Float16ArrayWrapper = Float16ArrayWrapper;\nexports.Framebuffer = Framebuffer;\nexports.GLEngine = GLEngine;\nexports.GLGeometry = GLGeometry;\nexports.GLRenderer = GLRenderer;\nexports.GPUCapability = GPUCapability;\nexports.Geometry = Geometry;\nexports.GlobalUniforms = GlobalUniforms;\nexports.GradientValue = GradientValue;\nexports.GraphicsPath = GraphicsPath;\nexports.HELP_LINK = HELP_LINK$1;\nexports.InteractLoader = InteractLoader;\nexports.InteractMesh = InteractMesh;\nexports.KTXTexture = KTXTexture;\nexports.LineSegments = LineSegments;\nexports.LinearValue = LinearValue;\nexports.MaskProcessor = MaskProcessor;\nexports.Material = Material;\nexports.MaterialDataBlock = MaterialDataBlock;\nexports.Mesh = Mesh;\nexports.MeshCollider = MeshCollider;\nexports.PLAYER_OPTIONS_ENV_EDITOR = PLAYER_OPTIONS_ENV_EDITOR;\nexports.POST_PROCESS_SETTINGS = POST_PROCESS_SETTINGS;\nexports.ParticleBehaviourPlayable = ParticleBehaviourPlayable;\nexports.ParticleBehaviourPlayableAsset = ParticleBehaviourPlayableAsset;\nexports.ParticleLoader = ParticleLoader;\nexports.ParticleMesh = ParticleMesh;\nexports.ParticleSystemRenderer = ParticleSystemRenderer;\nexports.ParticleTrack = ParticleTrack;\nexports.PassTextureCache = PassTextureCache;\nexports.PathSegments = PathSegments;\nexports.Player = Player;\nexports.PluginSystem = PluginSystem;\nexports.PolyStar = PolyStar;\nexports.Polygon = Polygon;\nexports.PropertyTrack = PropertyTrack;\nexports.RENDER_PASS_NAME_PREFIX = RENDER_PASS_NAME_PREFIX;\nexports.RENDER_PREFER_LOOKUP_TEXTURE = RENDER_PREFER_LOOKUP_TEXTURE;\nexports.RUNTIME_ENV = RUNTIME_ENV;\nexports.RandomSetValue = RandomSetValue;\nexports.RandomValue = RandomValue;\nexports.RandomVectorValue = RandomVectorValue;\nexports.RenderFrame = RenderFrame;\nexports.RenderPass = RenderPass;\nexports.RenderPassPriorityNormal = RenderPassPriorityNormal;\nexports.RenderPassPriorityPostprocess = RenderPassPriorityPostprocess;\nexports.RenderPassPriorityPrepare = RenderPassPriorityPrepare;\nexports.RenderTargetHandle = RenderTargetHandle;\nexports.Renderbuffer = Renderbuffer;\nexports.Renderer = Renderer;\nexports.RendererComponent = RendererComponent;\nexports.RuntimeClip = RuntimeClip;\nexports.SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0 = SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0;\nexports.SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0 = SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0;\nexports.SEMANTIC_PRE_COLOR_ATTACHMENT_0 = SEMANTIC_PRE_COLOR_ATTACHMENT_0;\nexports.SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0 = SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0;\nexports.SPRITE_VERTEX_STRIDE = SPRITE_VERTEX_STRIDE;\nexports.SemanticMap = SemanticMap;\nexports.SerializationHelper = SerializationHelper;\nexports.ShaderFactory = ShaderFactory;\nexports.ShaderVariant = ShaderVariant;\nexports.ShapePath = ShapePath;\nexports.SpriteLoader = SpriteLoader;\nexports.StaticValue = StaticValue;\nexports.TEMPLATE_USE_OFFSCREEN_CANVAS = TEMPLATE_USE_OFFSCREEN_CANVAS;\nexports.TextComponentBase = TextComponentBase;\nexports.TextLayout = TextLayout;\nexports.TextLoader = TextLoader;\nexports.TextStyle = TextStyle;\nexports.Texture = Texture;\nexports.TextureFactory = TextureFactory;\nexports.Ticker = Ticker;\nexports.TimelineClip = TimelineClip;\nexports.TimelinePlayable = TimelinePlayable;\nexports.TrackSortWrapper = TrackSortWrapper;\nexports.Transform = Transform;\nexports.TransformAnimationPlayable = TransformAnimationPlayable;\nexports.ValueGetter = ValueGetter;\nexports.Vector2Curve = Vector2Curve;\nexports.Vector4Curve = Vector4Curve;\nexports.addByOrder = addByOrder;\nexports.addItem = addItem;\nexports.addItemWithOrder = addItemWithOrder;\nexports.applyMixins = applyMixins;\nexports.assertExist = assertExist;\nexports.asserts = asserts;\nexports.base64ToFile = base64ToFile;\nexports.blend = blend;\nexports.buildLine = buildLine;\nexports.calculateTranslation = calculateTranslation;\nexports.canvasPool = canvasPool;\nexports.closePointEps = closePointEps;\nexports.colorGradingFrag = colorGradingFrag;\nexports.colorStopsFromGradient = colorStopsFromGradient;\nexports.colorToArr = colorToArr$1;\nexports.combineImageTemplate = combineImageTemplate;\nexports.createCopyShader = createCopyShader;\nexports.createGLContext = createGLContext;\nexports.createKeyFrameMeta = createKeyFrameMeta;\nexports.createShape = createShape;\nexports.createValueGetter = createValueGetter;\nexports.curveEps = curveEps;\nexports.decimalEqual = decimalEqual;\nexports.defaultPlugins = defaultPlugins;\nexports.deserializeMipmapTexture = deserializeMipmapTexture;\nexports.disableAllPlayer = disableAllPlayer;\nexports.earcut = earcut;\nexports.effectsClass = effectsClass;\nexports.effectsClassStore = effectsClassStore;\nexports.enlargeBuffer = enlargeBuffer;\nexports.ensureFixedNumber = ensureFixedNumber;\nexports.ensureVec3 = ensureVec3;\nexports.findPreviousRenderPass = findPreviousRenderPass;\nexports.gaussianDownFrag = gaussianDown_frag;\nexports.gaussianDownHFrag = gaussianDownHFrag;\nexports.gaussianDownVFrag = gaussianDownVFrag;\nexports.gaussianUpFrag = gaussianUpFrag;\nexports.generateEmptyTypedArray = generateEmptyTypedArray;\nexports.generateGUID = generateGUID;\nexports.generateHalfFloatTexture = generateHalfFloatTexture;\nexports.generateTransparentTexture = generateTransparentTexture;\nexports.generateWhiteTexture = generateWhiteTexture;\nexports.getActivePlayers = getActivePlayers;\nexports.getBackgroundImage = getBackgroundImage;\nexports.getColorFromGradientStops = getColorFromGradientStops;\nexports.getConfig = getConfig;\nexports.getDefaultTextureFactory = getDefaultTextureFactory;\nexports.getGeometryByShape = getGeometryByShape;\nexports.getGeometryTriangles = getGeometryTriangles;\nexports.getKTXTextureOptions = getKTXTextureOptions;\nexports.getKeyFrameMetaByRawValue = getKeyFrameMetaByRawValue;\nexports.getMergedStore = getMergedStore;\nexports.getParticleMeshShader = getParticleMeshShader;\nexports.getPixelRatio = getPixelRatio;\nexports.getPlayerByCanvas = getPlayerByCanvas;\nexports.getPreMultiAlpha = getPreMultiAlpha;\nexports.getStandardComposition = getStandardComposition;\nexports.getStandardImage = getStandardImage;\nexports.getStandardItem = getStandardItem;\nexports.getStandardJSON = getStandardJSON;\nexports.getTextureSize = getTextureSize;\nexports.glContext = glContext;\nexports.glType2VertexFormatType = glType2VertexFormatType;\nexports.gpuTimer = gpuTimer;\nexports.imageDataFromColor = imageDataFromColor;\nexports.imageDataFromGradient = imageDataFromGradient;\nexports.initErrors = initErrors;\nexports.initGLContext = initGLContext;\nexports.integrate = integrate;\nexports.interpolateColor = interpolateColor;\nexports.isAlipayMiniApp = isAlipayMiniApp;\nexports.isAndroid = isAndroid;\nexports.isArray = isArray;\nexports.isCanvas = isCanvas;\nexports.isCanvasUsedByPlayer = isCanvasUsedByPlayer;\nexports.isFunction = isFunction;\nexports.isIOS = isIOS;\nexports.isIOSByUA = isIOSByUA;\nexports.isMiniProgram = isMiniProgram;\nexports.isObject = isObject;\nexports.isOpenHarmony = isOpenHarmony;\nexports.isSimulatorCellPhone = isSimulatorCellPhone;\nexports.isString = isString;\nexports.isUniformStruct = isUniformStruct;\nexports.isUniformStructArray = isUniformStructArray;\nexports.isValidFontFamily = isValidFontFamily;\nexports.isWebGL2 = isWebGL2;\nexports.isWechatMiniApp = isWechatMiniApp;\nexports.itemFrag = itemFrag;\nexports.itemFrameFrag = itemFrame_frag;\nexports.itemVert = itemVert;\nexports.loadAVIFOptional = loadAVIFOptional;\nexports.loadBinary = loadBinary;\nexports.loadBlob = loadBlob;\nexports.loadImage = loadImage;\nexports.loadMedia = loadMedia;\nexports.loadVideo = loadVideo;\nexports.loadWebPOptional = loadWebPOptional;\nexports.logger = logger;\nexports.math = index;\nexports.modifyMaxKeyframeShader = modifyMaxKeyframeShader;\nexports.nearestPowerOfTwo = nearestPowerOfTwo;\nexports.noop = noop;\nexports.normalizeColor = normalizeColor;\nexports.numberToFix = numberToFix;\nexports.parsePercent = parsePercent$1;\nexports.particleFrag = particleFrag;\nexports.particleOriginTranslateMap = particleOriginTranslateMap$1;\nexports.particleUniformTypeMap = particleUniformTypeMap;\nexports.particleVert = particleVert;\nexports.passRenderLevel = passRenderLevel;\nexports.pluginLoaderMap = pluginLoaderMap;\nexports.randomInRange = randomInRange;\nexports.registerPlugin = registerPlugin;\nexports.removeItem = removeItem;\nexports.rotateVec2 = rotateVec2;\nexports.screenMeshVert = screenMeshVert;\nexports.serialize = serialize;\nexports.setBlendMode = setBlendMode;\nexports.setConfig = setConfig;\nexports.setDefaultTextureFactory = setDefaultTextureFactory;\nexports.setMaskMode = setMaskMode;\nexports.setMaxSpriteMeshItemCount = setMaxSpriteMeshItemCount;\nexports.setRayFromCamera = setRayFromCamera;\nexports.setSideMode = setSideMode;\nexports.setSpriteMeshMaxItemCountByGPU = setSpriteMeshMaxItemCountByGPU;\nexports.sortByOrder = sortByOrder;\nexports.spec = index$1;\nexports.thresholdFrag = thresholdFrag;\nexports.throwDestroyedError = throwDestroyedError;\nexports.trailVert = trailVert;\nexports.translatePoint = translatePoint;\nexports.trianglesFromRect = trianglesFromRect;\nexports.unregisterPlugin = unregisterPlugin;\nexports.valIfUndefined = valIfUndefined;\nexports.value = value;\nexports.valueDefine = valueDefine;\nexports.vecFill = vecFill;\nexports.vecMulCombine = vecMulCombine;\nexports.version = version;\nexports.vertexFormatType2GLType = vertexFormatType2GLType;\n//# sourceMappingURL=index.js.map\n"]} \ No newline at end of file diff --git a/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.js b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.js new file mode 100644 index 0000000..b1bec89 --- /dev/null +++ b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.js @@ -0,0 +1,254 @@ +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Component({ + options: { + addGlobalClass: true, + pureDataPattern: /^_/ + }, + properties: { + duration: { + type: Number, + value: 500 + }, + easingFunction: { + type: String, + value: 'default' + }, + loop: { + type: Boolean, + value: true + }, + videoList: { + type: Array, + value: [], + observer: function observer() { + var newVal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + + this._videoListChanged(newVal); + } + } + }, + data: { + nextQueue: [], + prevQueue: [], + curQueue: [], + circular: false, + _last: 1, + _change: -1, + _invalidUp: 0, + _invalidDown: 0, + _videoContexts: [] + }, + lifetimes: { + attached: function attached() { + this.data._videoContexts = [wx.createVideoContext('video_0', this), wx.createVideoContext('video_1', this), wx.createVideoContext('video_2', this)]; + } + }, + methods: { + _videoListChanged: function _videoListChanged(newVal) { + var _this = this; + + var data = this.data; + newVal.forEach(function (item) { + data.nextQueue.push(item); + }); + if (data.curQueue.length === 0) { + this.setData({ + curQueue: data.nextQueue.splice(0, 3) + }, function () { + _this.playCurrent(1); + }); + } + }, + animationfinish: function animationfinish(e) { + var _data = this.data, + _last = _data._last, + _change = _data._change, + curQueue = _data.curQueue, + prevQueue = _data.prevQueue, + nextQueue = _data.nextQueue; + + var current = e.detail.current; + var diff = current - _last; + if (diff === 0) return; + this.data._last = current; + this.playCurrent(current); + this.triggerEvent('change', { activeId: curQueue[current].id }); + var direction = diff === 1 || diff === -2 ? 'up' : 'down'; + if (direction === 'up') { + if (this.data._invalidDown === 0) { + var change = (_change + 1) % 3; + var add = nextQueue.shift(); + var remove = curQueue[change]; + if (add) { + prevQueue.push(remove); + curQueue[change] = add; + this.data._change = change; + } else { + this.data._invalidUp += 1; + } + } else { + this.data._invalidDown -= 1; + } + } + if (direction === 'down') { + if (this.data._invalidUp === 0) { + var _change2 = _change; + var _remove = curQueue[_change2]; + var _add = prevQueue.pop(); + if (_add) { + curQueue[_change2] = _add; + nextQueue.unshift(_remove); + this.data._change = (_change2 - 1 + 3) % 3; + } else { + this.data._invalidDown += 1; + } + } else { + this.data._invalidUp -= 1; + } + } + var circular = true; + if (nextQueue.length === 0 && current !== 0) { + circular = false; + } + if (prevQueue.length === 0 && current !== 2) { + circular = false; + } + this.setData({ + curQueue: curQueue, + circular: circular + }); + }, + playCurrent: function playCurrent(current) { + this.data._videoContexts.forEach(function (ctx, index) { + index !== current ? ctx.pause() : ctx.play(); + }); + }, + onPlay: function onPlay(e) { + this.trigger(e, 'play'); + }, + onPause: function onPause(e) { + this.trigger(e, 'pause'); + }, + onEnded: function onEnded(e) { + this.trigger(e, 'ended'); + }, + onError: function onError(e) { + this.trigger(e, 'error'); + }, + onTimeUpdate: function onTimeUpdate(e) { + this.trigger(e, 'timeupdate'); + }, + onWaiting: function onWaiting(e) { + this.trigger(e, 'wait'); + }, + onProgress: function onProgress(e) { + this.trigger(e, 'progress'); + }, + onLoadedMetaData: function onLoadedMetaData(e) { + this.trigger(e, 'loadedmetadata'); + }, + trigger: function trigger(e, type) { + var ext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + var detail = e.detail; + var activeId = e.target.dataset.id; + this.triggerEvent(type, Object.assign(Object.assign(Object.assign({}, detail), { activeId: activeId }), ext)); + } + } +}); + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.json b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.json new file mode 100644 index 0000000..7e37c03 --- /dev/null +++ b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxml b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxml new file mode 100644 index 0000000..06c821d --- /dev/null +++ b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxss b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxss new file mode 100644 index 0000000..ea7f6f2 --- /dev/null +++ b/src/miniprogram_npm/@miniprogram-component-plus/video-swiper/index.wxss @@ -0,0 +1 @@ +.container{width:100%;height:100%}.video-swiper{width:100%;height:100%}.video_item{height:100%;width:100%} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/action-sheet/index.d.ts b/src/miniprogram_npm/@vant/weapp/action-sheet/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/action-sheet/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/action-sheet/index.js b/src/miniprogram_npm/@vant/weapp/action-sheet/index.js new file mode 100644 index 0000000..8403b68 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/action-sheet/index.js @@ -0,0 +1,78 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var button_1 = require("../mixins/button"); +(0, component_1.VantComponent)({ + classes: ['list-class'], + mixins: [button_1.button], + props: { + show: Boolean, + title: String, + cancelText: String, + description: String, + round: { + type: Boolean, + value: true, + }, + zIndex: { + type: Number, + value: 100, + }, + actions: { + type: Array, + value: [], + }, + overlay: { + type: Boolean, + value: true, + }, + closeOnClickOverlay: { + type: Boolean, + value: true, + }, + closeOnClickAction: { + type: Boolean, + value: true, + }, + safeAreaInsetBottom: { + type: Boolean, + value: true, + }, + rootPortal: { + type: Boolean, + value: false, + }, + }, + methods: { + onSelect: function (event) { + var _this = this; + var index = event.currentTarget.dataset.index; + var _a = this.data, actions = _a.actions, closeOnClickAction = _a.closeOnClickAction, canIUseGetUserProfile = _a.canIUseGetUserProfile; + var item = actions[index]; + if (item) { + this.$emit('select', item); + if (closeOnClickAction) { + this.onClose(); + } + if (item.openType === 'getUserInfo' && canIUseGetUserProfile) { + wx.getUserProfile({ + desc: item.getUserProfileDesc || ' ', + complete: function (userProfile) { + _this.$emit('getuserinfo', userProfile); + }, + }); + } + } + }, + onCancel: function () { + this.$emit('cancel'); + }, + onClose: function () { + this.$emit('close'); + }, + onClickOverlay: function () { + this.$emit('click-overlay'); + this.onClose(); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/action-sheet/index.json b/src/miniprogram_npm/@vant/weapp/action-sheet/index.json new file mode 100644 index 0000000..19bf989 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/action-sheet/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "van-icon": "../icon/index", + "van-popup": "../popup/index", + "van-loading": "../loading/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/action-sheet/index.wxml b/src/miniprogram_npm/@vant/weapp/action-sheet/index.wxml new file mode 100644 index 0000000..6311e33 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/action-sheet/index.wxml @@ -0,0 +1,70 @@ + + + + + {{ title }} + + + + {{ description }} + + + + + + + + + + {{ cancelText }} + + + diff --git a/src/miniprogram_npm/@vant/weapp/action-sheet/index.wxss b/src/miniprogram_npm/@vant/weapp/action-sheet/index.wxss new file mode 100644 index 0000000..eedd361 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/action-sheet/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-action-sheet{color:var(--action-sheet-item-text-color,#323233);max-height:var(--action-sheet-max-height,90%)!important}.van-action-sheet__cancel,.van-action-sheet__item{background-color:var(--action-sheet-item-background,#fff);font-size:var(--action-sheet-item-font-size,16px);line-height:var(--action-sheet-item-line-height,22px);padding:14px 16px;text-align:center}.van-action-sheet__cancel--hover,.van-action-sheet__item--hover{background-color:#f2f3f5}.van-action-sheet__cancel:after,.van-action-sheet__item:after{border-width:0}.van-action-sheet__cancel{color:var(--action-sheet-cancel-text-color,#646566)}.van-action-sheet__gap{background-color:var(--action-sheet-cancel-padding-color,#f7f8fa);display:block;height:var(--action-sheet-cancel-padding-top,8px)}.van-action-sheet__item--disabled{color:var(--action-sheet-item-disabled-text-color,#c8c9cc)}.van-action-sheet__item--disabled.van-action-sheet__item--hover{background-color:var(--action-sheet-item-background,#fff)}.van-action-sheet__subname{color:var(--action-sheet-subname-color,#969799);font-size:var(--action-sheet-subname-font-size,12px);line-height:var(--action-sheet-subname-line-height,20px);margin-top:var(--padding-xs,8px)}.van-action-sheet__header{font-size:var(--action-sheet-header-font-size,16px);font-weight:var(--font-weight-bold,500);line-height:var(--action-sheet-header-height,48px);text-align:center}.van-action-sheet__description{color:var(--action-sheet-description-color,#969799);font-size:var(--action-sheet-description-font-size,14px);line-height:var(--action-sheet-description-line-height,20px);padding:20px var(--padding-md,16px);text-align:center}.van-action-sheet__close{color:var(--action-sheet-close-icon-color,#c8c9cc);font-size:var(--action-sheet-close-icon-size,22px)!important;line-height:inherit!important;padding:var(--action-sheet-close-icon-padding,0 16px);position:absolute!important;right:0;top:0}.van-action-sheet__loading{display:flex!important} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/area/index.d.ts b/src/miniprogram_npm/@vant/weapp/area/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/area/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/area/index.js b/src/miniprogram_npm/@vant/weapp/area/index.js new file mode 100644 index 0000000..73de66d --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/area/index.js @@ -0,0 +1,235 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var shared_1 = require("../picker/shared"); +var utils_1 = require("../common/utils"); +var EMPTY_CODE = '000000'; +(0, component_1.VantComponent)({ + classes: ['active-class', 'toolbar-class', 'column-class'], + props: __assign(__assign({}, shared_1.pickerProps), { showToolbar: { + type: Boolean, + value: true, + }, value: { + type: String, + observer: function (value) { + this.code = value; + this.setValues(); + }, + }, areaList: { + type: Object, + value: {}, + observer: 'setValues', + }, columnsNum: { + type: null, + value: 3, + }, columnsPlaceholder: { + type: Array, + observer: function (val) { + this.setData({ + typeToColumnsPlaceholder: { + province: val[0] || '', + city: val[1] || '', + county: val[2] || '', + }, + }); + }, + } }), + data: { + columns: [{ values: [] }, { values: [] }, { values: [] }], + typeToColumnsPlaceholder: {}, + }, + mounted: function () { + var _this = this; + (0, utils_1.requestAnimationFrame)(function () { + _this.setValues(); + }); + }, + methods: { + getPicker: function () { + if (this.picker == null) { + this.picker = this.selectComponent('.van-area__picker'); + } + return this.picker; + }, + onCancel: function (event) { + this.emit('cancel', event.detail); + }, + onConfirm: function (event) { + var index = event.detail.index; + var value = event.detail.value; + value = this.parseValues(value); + this.emit('confirm', { value: value, index: index }); + }, + emit: function (type, detail) { + detail.values = detail.value; + delete detail.value; + this.$emit(type, detail); + }, + parseValues: function (values) { + var columnsPlaceholder = this.data.columnsPlaceholder; + return values.map(function (value, index) { + if (value && + (!value.code || value.name === columnsPlaceholder[index])) { + return __assign(__assign({}, value), { code: '', name: '' }); + } + return value; + }); + }, + onChange: function (event) { + var _this = this; + var _a; + var _b = event.detail, index = _b.index, picker = _b.picker, value = _b.value; + this.code = value[index].code; + (_a = this.setValues()) === null || _a === void 0 ? void 0 : _a.then(function () { + _this.$emit('change', { + picker: picker, + values: _this.parseValues(picker.getValues()), + index: index, + }); + }); + }, + getConfig: function (type) { + var areaList = this.data.areaList; + return (areaList && areaList["".concat(type, "_list")]) || {}; + }, + getList: function (type, code) { + if (type !== 'province' && !code) { + return []; + } + var typeToColumnsPlaceholder = this.data.typeToColumnsPlaceholder; + var list = this.getConfig(type); + var result = Object.keys(list).map(function (code) { return ({ + code: code, + name: list[code], + }); }); + if (code != null) { + // oversea code + if (code[0] === '9' && type === 'city') { + code = '9'; + } + result = result.filter(function (item) { return item.code.indexOf(code) === 0; }); + } + if (typeToColumnsPlaceholder[type] && result.length) { + // set columns placeholder + var codeFill = type === 'province' + ? '' + : type === 'city' + ? EMPTY_CODE.slice(2, 4) + : EMPTY_CODE.slice(4, 6); + result.unshift({ + code: "".concat(code).concat(codeFill), + name: typeToColumnsPlaceholder[type], + }); + } + return result; + }, + getIndex: function (type, code) { + var compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6; + var list = this.getList(type, code.slice(0, compareNum - 2)); + // oversea code + if (code[0] === '9' && type === 'province') { + compareNum = 1; + } + code = code.slice(0, compareNum); + for (var i = 0; i < list.length; i++) { + if (list[i].code.slice(0, compareNum) === code) { + return i; + } + } + return 0; + }, + setValues: function () { + var picker = this.getPicker(); + if (!picker) { + return; + } + var code = this.code || this.getDefaultCode(); + var provinceList = this.getList('province'); + var cityList = this.getList('city', code.slice(0, 2)); + var stack = []; + var indexes = []; + var columnsNum = this.data.columnsNum; + if (columnsNum >= 1) { + stack.push(picker.setColumnValues(0, provinceList, false)); + indexes.push(this.getIndex('province', code)); + } + if (columnsNum >= 2) { + stack.push(picker.setColumnValues(1, cityList, false)); + indexes.push(this.getIndex('city', code)); + if (cityList.length && code.slice(2, 4) === '00') { + code = cityList[0].code; + } + } + if (columnsNum === 3) { + stack.push(picker.setColumnValues(2, this.getList('county', code.slice(0, 4)), false)); + indexes.push(this.getIndex('county', code)); + } + return Promise.all(stack) + .catch(function () { }) + .then(function () { return picker.setIndexes(indexes); }) + .catch(function () { }); + }, + getDefaultCode: function () { + var columnsPlaceholder = this.data.columnsPlaceholder; + if (columnsPlaceholder.length) { + return EMPTY_CODE; + } + var countyCodes = Object.keys(this.getConfig('county')); + if (countyCodes[0]) { + return countyCodes[0]; + } + var cityCodes = Object.keys(this.getConfig('city')); + if (cityCodes[0]) { + return cityCodes[0]; + } + return ''; + }, + getValues: function () { + var picker = this.getPicker(); + if (!picker) { + return []; + } + return this.parseValues(picker.getValues().filter(function (value) { return !!value; })); + }, + getDetail: function () { + var values = this.getValues(); + var area = { + code: '', + country: '', + province: '', + city: '', + county: '', + }; + if (!values.length) { + return area; + } + var names = values.map(function (item) { return item.name; }); + area.code = values[values.length - 1].code; + if (area.code[0] === '9') { + area.country = names[1] || ''; + area.province = names[2] || ''; + } + else { + area.province = names[0] || ''; + area.city = names[1] || ''; + area.county = names[2] || ''; + } + return area; + }, + reset: function (code) { + this.code = code || ''; + return this.setValues(); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/area/index.json b/src/miniprogram_npm/@vant/weapp/area/index.json new file mode 100644 index 0000000..a778e91 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/area/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-picker": "../picker/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/area/index.wxml b/src/miniprogram_npm/@vant/weapp/area/index.wxml new file mode 100644 index 0000000..3a437b7 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/area/index.wxml @@ -0,0 +1,20 @@ + + + diff --git a/src/miniprogram_npm/@vant/weapp/area/index.wxs b/src/miniprogram_npm/@vant/weapp/area/index.wxs new file mode 100644 index 0000000..07723c1 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/area/index.wxs @@ -0,0 +1,8 @@ +/* eslint-disable */ +function displayColumns(columns, columnsNum) { + return columns.slice(0, +columnsNum); +} + +module.exports = { + displayColumns: displayColumns, +}; diff --git a/src/miniprogram_npm/@vant/weapp/area/index.wxss b/src/miniprogram_npm/@vant/weapp/area/index.wxss new file mode 100644 index 0000000..99694d6 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/area/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss'; \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/button/index.d.ts b/src/miniprogram_npm/@vant/weapp/button/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/button/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/button/index.js b/src/miniprogram_npm/@vant/weapp/button/index.js new file mode 100644 index 0000000..984135c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/button/index.js @@ -0,0 +1,67 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var button_1 = require("../mixins/button"); +var version_1 = require("../common/version"); +var mixins = [button_1.button]; +if ((0, version_1.canIUseFormFieldButton)()) { + mixins.push('wx://form-field-button'); +} +(0, component_1.VantComponent)({ + mixins: mixins, + classes: ['hover-class', 'loading-class'], + data: { + baseStyle: '', + }, + props: { + formType: String, + icon: String, + classPrefix: { + type: String, + value: 'van-icon', + }, + plain: Boolean, + block: Boolean, + round: Boolean, + square: Boolean, + loading: Boolean, + hairline: Boolean, + disabled: Boolean, + loadingText: String, + customStyle: String, + loadingType: { + type: String, + value: 'circular', + }, + type: { + type: String, + value: 'default', + }, + dataset: null, + size: { + type: String, + value: 'normal', + }, + loadingSize: { + type: String, + value: '20px', + }, + color: String, + }, + methods: { + onClick: function (event) { + var _this = this; + this.$emit('click', event); + var _a = this.data, canIUseGetUserProfile = _a.canIUseGetUserProfile, openType = _a.openType, getUserProfileDesc = _a.getUserProfileDesc, lang = _a.lang; + if (openType === 'getUserInfo' && canIUseGetUserProfile) { + wx.getUserProfile({ + desc: getUserProfileDesc || ' ', + lang: lang || 'en', + complete: function (userProfile) { + _this.$emit('getuserinfo', userProfile); + }, + }); + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/button/index.json b/src/miniprogram_npm/@vant/weapp/button/index.json new file mode 100644 index 0000000..e00a588 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/button/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "van-icon": "../icon/index", + "van-loading": "../loading/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/button/index.wxml b/src/miniprogram_npm/@vant/weapp/button/index.wxml new file mode 100644 index 0000000..e7f60f1 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/button/index.wxml @@ -0,0 +1,56 @@ + + + + diff --git a/src/miniprogram_npm/@vant/weapp/button/index.wxs b/src/miniprogram_npm/@vant/weapp/button/index.wxs new file mode 100644 index 0000000..8b649fe --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/button/index.wxs @@ -0,0 +1,39 @@ +/* eslint-disable */ +var style = require('../wxs/style.wxs'); + +function rootStyle(data) { + if (!data.color) { + return data.customStyle; + } + + var properties = { + color: data.plain ? data.color : '#fff', + background: data.plain ? null : data.color, + }; + + // hide border when color is linear-gradient + if (data.color.indexOf('gradient') !== -1) { + properties.border = 0; + } else { + properties['border-color'] = data.color; + } + + return style([properties, data.customStyle]); +} + +function loadingColor(data) { + if (data.plain) { + return data.color ? data.color : '#c9c9c9'; + } + + if (data.type === 'default') { + return '#c9c9c9'; + } + + return '#fff'; +} + +module.exports = { + rootStyle: rootStyle, + loadingColor: loadingColor, +}; diff --git a/src/miniprogram_npm/@vant/weapp/button/index.wxss b/src/miniprogram_npm/@vant/weapp/button/index.wxss new file mode 100644 index 0000000..bd8bb5a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/button/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-button{-webkit-text-size-adjust:100%;align-items:center;-webkit-appearance:none;border-radius:var(--button-border-radius,2px);box-sizing:border-box;display:inline-flex;font-size:var(--button-default-font-size,16px);height:var(--button-default-height,44px);justify-content:center;line-height:var(--button-line-height,20px);padding:0;position:relative;text-align:center;transition:opacity .2s;vertical-align:middle}.van-button:before{background-color:#000;border:inherit;border-color:#000;border-radius:inherit;content:" ";height:100%;left:50%;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{background:var(--button-default-background-color,#fff);border:var(--button-border-width,1px) solid var(--button-default-border-color,#ebedf0);color:var(--button-default-color,#323233)}.van-button--primary{background:var(--button-primary-background-color,#07c160);border:var(--button-border-width,1px) solid var(--button-primary-border-color,#07c160);color:var(--button-primary-color,#fff)}.van-button--info{background:var(--button-info-background-color,#1989fa);border:var(--button-border-width,1px) solid var(--button-info-border-color,#1989fa);color:var(--button-info-color,#fff)}.van-button--danger{background:var(--button-danger-background-color,#ee0a24);border:var(--button-border-width,1px) solid var(--button-danger-border-color,#ee0a24);color:var(--button-danger-color,#fff)}.van-button--warning{background:var(--button-warning-background-color,#ff976a);border:var(--button-border-width,1px) solid var(--button-warning-border-color,#ff976a);color:var(--button-warning-color,#fff)}.van-button--plain{background:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:var(--button-warning-background-color,#ff976a)}.van-button--large{height:var(--button-large-height,50px);width:100%}.van-button--normal{font-size:var(--button-normal-font-size,14px);padding:0 15px}.van-button--small{font-size:var(--button-small-font-size,12px);height:var(--button-small-height,30px);min-width:var(--button-small-min-width,60px);padding:0 var(--padding-xs,8px)}.van-button--mini{display:inline-block;font-size:var(--button-mini-font-size,10px);height:var(--button-mini-height,22px);min-width:var(--button-mini-min-width,50px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:flex;width:100%}.van-button--round{border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{line-height:inherit!important;min-width:1em;vertical-align:top}.van-button--hairline{border-width:0;padding-top:1px}.van-button--hairline:after{border-color:inherit;border-radius:calc(var(--button-border-radius, 2px)*2);border-width:1px}.van-button--hairline.van-button--round:after{border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/calendar/calendar.wxml b/src/miniprogram_npm/@vant/weapp/calendar/calendar.wxml new file mode 100644 index 0000000..2ddb048 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/calendar.wxml @@ -0,0 +1,70 @@ + + + +
+ +
+ + + + + + + + + + + + {{ + computed.getButtonDisabled(type, currentDate, minRange) + ? confirmDisabledText + : confirmText + }} + + +
diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.d.ts b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.js b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.js new file mode 100644 index 0000000..544b3a4 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.js @@ -0,0 +1,45 @@ +"use strict"; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../../../common/component"); +(0, component_1.VantComponent)({ + props: { + title: { + type: String, + value: '日期选择', + }, + subtitle: String, + showTitle: Boolean, + showSubtitle: Boolean, + firstDayOfWeek: { + type: Number, + observer: 'initWeekDay', + }, + }, + data: { + weekdays: [], + }, + created: function () { + this.initWeekDay(); + }, + methods: { + initWeekDay: function () { + var defaultWeeks = ['日', '一', '二', '三', '四', '五', '六']; + var firstDayOfWeek = this.data.firstDayOfWeek || 0; + this.setData({ + weekdays: __spreadArray(__spreadArray([], defaultWeeks.slice(firstDayOfWeek, 7), true), defaultWeeks.slice(0, firstDayOfWeek), true), + }); + }, + onClickSubtitle: function (event) { + this.$emit('click-subtitle', event); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.json b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxml b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxml new file mode 100644 index 0000000..7e56c83 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxml @@ -0,0 +1,16 @@ + + + + {{ title }} + + + + {{ subtitle }} + + + + + {{ item }} + + + diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxss b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxss new file mode 100644 index 0000000..272537e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/header/index.wxss @@ -0,0 +1 @@ +@import '../../../common/index.wxss';.van-calendar__header{box-shadow:var(--calendar-header-box-shadow,0 2px 10px hsla(220,1%,50%,.16));flex-shrink:0}.van-calendar__header-subtitle,.van-calendar__header-title{font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:flex}.van-calendar__weekday{flex:1;font-size:var(--calendar-weekdays-font-size,12px);line-height:var(--calendar-weekdays-height,30px);text-align:center} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.d.ts b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.d.ts new file mode 100644 index 0000000..3ccf85a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.d.ts @@ -0,0 +1,6 @@ +export interface Day { + date: Date; + type: string; + text: number; + bottomInfo?: string; +} diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.js b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.js new file mode 100644 index 0000000..4d137f5 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.js @@ -0,0 +1,158 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../../../common/component"); +var utils_1 = require("../../utils"); +(0, component_1.VantComponent)({ + props: { + date: { + type: null, + observer: 'setDays', + }, + type: { + type: String, + observer: 'setDays', + }, + color: String, + minDate: { + type: null, + observer: 'setDays', + }, + maxDate: { + type: null, + observer: 'setDays', + }, + showMark: Boolean, + rowHeight: null, + formatter: { + type: null, + observer: 'setDays', + }, + currentDate: { + type: null, + observer: 'setDays', + }, + firstDayOfWeek: { + type: Number, + observer: 'setDays', + }, + allowSameDay: Boolean, + showSubtitle: Boolean, + showMonthTitle: Boolean, + }, + data: { + visible: true, + days: [], + }, + methods: { + onClick: function (event) { + var index = event.currentTarget.dataset.index; + var item = this.data.days[index]; + if (item.type !== 'disabled') { + this.$emit('click', item); + } + }, + setDays: function () { + var days = []; + var startDate = new Date(this.data.date); + var year = startDate.getFullYear(); + var month = startDate.getMonth(); + var totalDay = (0, utils_1.getMonthEndDay)(startDate.getFullYear(), startDate.getMonth() + 1); + for (var day = 1; day <= totalDay; day++) { + var date = new Date(year, month, day); + var type = this.getDayType(date); + var config = { + date: date, + type: type, + text: day, + bottomInfo: this.getBottomInfo(type), + }; + if (this.data.formatter) { + config = this.data.formatter(config); + } + days.push(config); + } + this.setData({ days: days }); + }, + getMultipleDayType: function (day) { + var currentDate = this.data.currentDate; + if (!Array.isArray(currentDate)) { + return ''; + } + var isSelected = function (date) { + return currentDate.some(function (item) { return (0, utils_1.compareDay)(item, date) === 0; }); + }; + if (isSelected(day)) { + var prevDay = (0, utils_1.getPrevDay)(day); + var nextDay = (0, utils_1.getNextDay)(day); + var prevSelected = isSelected(prevDay); + var nextSelected = isSelected(nextDay); + if (prevSelected && nextSelected) { + return 'multiple-middle'; + } + if (prevSelected) { + return 'end'; + } + return nextSelected ? 'start' : 'multiple-selected'; + } + return ''; + }, + getRangeDayType: function (day) { + var _a = this.data, currentDate = _a.currentDate, allowSameDay = _a.allowSameDay; + if (!Array.isArray(currentDate)) { + return ''; + } + var startDay = currentDate[0], endDay = currentDate[1]; + if (!startDay) { + return ''; + } + var compareToStart = (0, utils_1.compareDay)(day, startDay); + if (!endDay) { + return compareToStart === 0 ? 'start' : ''; + } + var compareToEnd = (0, utils_1.compareDay)(day, endDay); + if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) { + return 'start-end'; + } + if (compareToStart === 0) { + return 'start'; + } + if (compareToEnd === 0) { + return 'end'; + } + if (compareToStart > 0 && compareToEnd < 0) { + return 'middle'; + } + return ''; + }, + getDayType: function (day) { + var _a = this.data, type = _a.type, minDate = _a.minDate, maxDate = _a.maxDate, currentDate = _a.currentDate; + if ((0, utils_1.compareDay)(day, minDate) < 0 || (0, utils_1.compareDay)(day, maxDate) > 0) { + return 'disabled'; + } + if (type === 'single') { + return (0, utils_1.compareDay)(day, currentDate) === 0 ? 'selected' : ''; + } + if (type === 'multiple') { + return this.getMultipleDayType(day); + } + /* istanbul ignore else */ + if (type === 'range') { + return this.getRangeDayType(day); + } + return ''; + }, + getBottomInfo: function (type) { + if (this.data.type === 'range') { + if (type === 'start') { + return '开始'; + } + if (type === 'end') { + return '结束'; + } + if (type === 'start-end') { + return '开始/结束'; + } + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.json b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxml b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxml new file mode 100644 index 0000000..0c73b2f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxml @@ -0,0 +1,39 @@ + + + + + + {{ computed.formatMonthTitle(date) }} + + + + + {{ computed.getMark(date) }} + + + + + {{ item.topInfo }} + {{ item.text }} + + {{ item.bottomInfo }} + + + + + {{ item.topInfo }} + {{ item.text }} + + {{ item.bottomInfo }} + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxs b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxs new file mode 100644 index 0000000..55e45a5 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxs @@ -0,0 +1,71 @@ +/* eslint-disable */ +var utils = require('../../utils.wxs'); + +function getMark(date) { + return getDate(date).getMonth() + 1; +} + +var ROW_HEIGHT = 64; + +function getDayStyle(type, index, date, rowHeight, color, firstDayOfWeek) { + var style = []; + var current = getDate(date).getDay() || 7; + var offset = current < firstDayOfWeek ? (7 - firstDayOfWeek + current) : + current === 7 && firstDayOfWeek === 0 ? 0 : + (current - firstDayOfWeek); + + if (index === 0) { + style.push(['margin-left', (100 * offset) / 7 + '%']); + } + + if (rowHeight !== ROW_HEIGHT) { + style.push(['height', rowHeight + 'px']); + } + + if (color) { + if ( + type === 'start' || + type === 'end' || + type === 'start-end' || + type === 'multiple-selected' || + type === 'multiple-middle' + ) { + style.push(['background', color]); + } else if (type === 'middle') { + style.push(['color', color]); + } + } + + return style + .map(function(item) { + return item.join(':'); + }) + .join(';'); +} + +function formatMonthTitle(date) { + date = getDate(date); + return date.getFullYear() + '年' + (date.getMonth() + 1) + '月'; +} + +function getMonthStyle(visible, date, rowHeight) { + if (!visible) { + date = getDate(date); + + var totalDay = utils.getMonthEndDay( + date.getFullYear(), + date.getMonth() + 1 + ); + var offset = getDate(date).getDay(); + var padding = Math.ceil((totalDay + offset) / 7) * rowHeight; + + return 'padding-bottom:' + padding + 'px'; + } +} + +module.exports = { + getMark: getMark, + getDayStyle: getDayStyle, + formatMonthTitle: formatMonthTitle, + getMonthStyle: getMonthStyle +}; diff --git a/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxss b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxss new file mode 100644 index 0000000..9aee73d --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/components/month/index.wxss @@ -0,0 +1 @@ +@import '../../../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:100%}.van-calendar__month-title{font-size:var(--calendar-month-title-font-size,14px);font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__days{display:flex;flex-wrap:wrap;position:relative;-webkit-user-select:none;user-select:none}.van-calendar__month-mark{color:var(--calendar-month-mark-color,rgba(242,243,245,.8));font-size:var(--calendar-month-mark-font-size,160px);left:50%;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:0}.van-calendar__day,.van-calendar__selected-day{align-items:center;display:flex;justify-content:center;text-align:center}.van-calendar__day{font-size:var(--calendar-day-font-size,16px);height:var(--calendar-day-height,64px);position:relative;width:14.285%}.van-calendar__day--end,.van-calendar__day--multiple-middle,.van-calendar__day--multiple-selected,.van-calendar__day--start,.van-calendar__day--start-end{background-color:var(--calendar-range-edge-background-color,#ee0a24);color:var(--calendar-range-edge-color,#fff)}.van-calendar__day--start{border-radius:4px 0 0 4px}.van-calendar__day--end{border-radius:0 4px 4px 0}.van-calendar__day--multiple-selected,.van-calendar__day--start-end{border-radius:4px}.van-calendar__day--middle{color:var(--calendar-range-middle-color,#ee0a24)}.van-calendar__day--middle:after{background-color:currentColor;bottom:0;content:"";left:0;opacity:var(--calendar-range-middle-background-opacity,.1);position:absolute;right:0;top:0}.van-calendar__day--disabled{color:var(--calendar-day-disabled-color,#c8c9cc);cursor:default}.van-calendar__bottom-info,.van-calendar__top-info{font-size:var(--calendar-info-font-size,10px);left:0;line-height:var(--calendar-info-line-height,14px);position:absolute;right:0}@media (max-width:350px){.van-calendar__bottom-info,.van-calendar__top-info{font-size:9px}}.van-calendar__top-info{top:6px}.van-calendar__bottom-info{bottom:6px}.van-calendar__selected-day{background-color:var(--calendar-selected-day-background-color,#ee0a24);border-radius:4px;color:var(--calendar-selected-day-color,#fff);height:var(--calendar-selected-day-size,54px);width:var(--calendar-selected-day-size,54px)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/calendar/index.d.ts b/src/miniprogram_npm/@vant/weapp/calendar/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/calendar/index.js b/src/miniprogram_npm/@vant/weapp/calendar/index.js new file mode 100644 index 0000000..7a7324d --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/index.js @@ -0,0 +1,383 @@ +"use strict"; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var utils_1 = require("./utils"); +var toast_1 = __importDefault(require("../toast/toast")); +var utils_2 = require("../common/utils"); +var initialMinDate = (0, utils_1.getToday)().getTime(); +var initialMaxDate = (function () { + var now = (0, utils_1.getToday)(); + return new Date(now.getFullYear(), now.getMonth() + 6, now.getDate()).getTime(); +})(); +var getTime = function (date) { + return date instanceof Date ? date.getTime() : date; +}; +(0, component_1.VantComponent)({ + props: { + title: { + type: String, + value: '日期选择', + }, + color: String, + show: { + type: Boolean, + observer: function (val) { + if (val) { + this.initRect(); + this.scrollIntoView(); + } + }, + }, + formatter: null, + confirmText: { + type: String, + value: '确定', + }, + confirmDisabledText: { + type: String, + value: '确定', + }, + rangePrompt: String, + showRangePrompt: { + type: Boolean, + value: true, + }, + defaultDate: { + type: null, + value: (0, utils_1.getToday)().getTime(), + observer: function (val) { + this.setData({ currentDate: val }); + this.scrollIntoView(); + }, + }, + allowSameDay: Boolean, + type: { + type: String, + value: 'single', + observer: 'reset', + }, + minDate: { + type: Number, + value: initialMinDate, + }, + maxDate: { + type: Number, + value: initialMaxDate, + }, + position: { + type: String, + value: 'bottom', + }, + rowHeight: { + type: null, + value: utils_1.ROW_HEIGHT, + }, + round: { + type: Boolean, + value: true, + }, + poppable: { + type: Boolean, + value: true, + }, + showMark: { + type: Boolean, + value: true, + }, + showTitle: { + type: Boolean, + value: true, + }, + showConfirm: { + type: Boolean, + value: true, + }, + showSubtitle: { + type: Boolean, + value: true, + }, + safeAreaInsetBottom: { + type: Boolean, + value: true, + }, + closeOnClickOverlay: { + type: Boolean, + value: true, + }, + maxRange: { + type: null, + value: null, + }, + minRange: { + type: Number, + value: 1, + }, + firstDayOfWeek: { + type: Number, + value: 0, + }, + readonly: Boolean, + rootPortal: { + type: Boolean, + value: false, + }, + }, + data: { + subtitle: '', + currentDate: null, + scrollIntoView: '', + }, + watch: { + minDate: function () { + this.initRect(); + }, + maxDate: function () { + this.initRect(); + }, + }, + created: function () { + this.setData({ + currentDate: this.getInitialDate(this.data.defaultDate), + }); + }, + mounted: function () { + if (this.data.show || !this.data.poppable) { + this.initRect(); + this.scrollIntoView(); + } + }, + methods: { + reset: function () { + this.setData({ currentDate: this.getInitialDate(this.data.defaultDate) }); + this.scrollIntoView(); + }, + initRect: function () { + var _this = this; + if (this.contentObserver != null) { + this.contentObserver.disconnect(); + } + var contentObserver = this.createIntersectionObserver({ + thresholds: [0, 0.1, 0.9, 1], + observeAll: true, + }); + this.contentObserver = contentObserver; + contentObserver.relativeTo('.van-calendar__body'); + contentObserver.observe('.month', function (res) { + if (res.boundingClientRect.top <= res.relativeRect.top) { + // @ts-ignore + _this.setData({ subtitle: (0, utils_1.formatMonthTitle)(res.dataset.date) }); + } + }); + }, + limitDateRange: function (date, minDate, maxDate) { + if (minDate === void 0) { minDate = null; } + if (maxDate === void 0) { maxDate = null; } + minDate = minDate || this.data.minDate; + maxDate = maxDate || this.data.maxDate; + if ((0, utils_1.compareDay)(date, minDate) === -1) { + return minDate; + } + if ((0, utils_1.compareDay)(date, maxDate) === 1) { + return maxDate; + } + return date; + }, + getInitialDate: function (defaultDate) { + var _this = this; + if (defaultDate === void 0) { defaultDate = null; } + var _a = this.data, type = _a.type, minDate = _a.minDate, maxDate = _a.maxDate, allowSameDay = _a.allowSameDay; + if (!defaultDate) + return []; + var now = (0, utils_1.getToday)().getTime(); + if (type === 'range') { + if (!Array.isArray(defaultDate)) { + defaultDate = []; + } + var _b = defaultDate || [], startDay = _b[0], endDay = _b[1]; + var startDate = getTime(startDay || now); + var start = this.limitDateRange(startDate, minDate, allowSameDay ? startDate : (0, utils_1.getPrevDay)(new Date(maxDate)).getTime()); + var date = getTime(endDay || now); + var end = this.limitDateRange(date, allowSameDay ? date : (0, utils_1.getNextDay)(new Date(minDate)).getTime()); + return [start, end]; + } + if (type === 'multiple') { + if (Array.isArray(defaultDate)) { + return defaultDate.map(function (date) { return _this.limitDateRange(date); }); + } + return [this.limitDateRange(now)]; + } + if (!defaultDate || Array.isArray(defaultDate)) { + defaultDate = now; + } + return this.limitDateRange(defaultDate); + }, + scrollIntoView: function () { + var _this = this; + (0, utils_2.requestAnimationFrame)(function () { + var _a = _this.data, currentDate = _a.currentDate, type = _a.type, show = _a.show, poppable = _a.poppable, minDate = _a.minDate, maxDate = _a.maxDate; + if (!currentDate) + return; + // @ts-ignore + var targetDate = type === 'single' ? currentDate : currentDate[0]; + var displayed = show || !poppable; + if (!targetDate || !displayed) { + return; + } + var months = (0, utils_1.getMonths)(minDate, maxDate); + months.some(function (month, index) { + if ((0, utils_1.compareMonth)(month, targetDate) === 0) { + _this.setData({ scrollIntoView: "month".concat(index) }); + return true; + } + return false; + }); + }); + }, + onOpen: function () { + this.$emit('open'); + }, + onOpened: function () { + this.$emit('opened'); + }, + onClose: function () { + this.$emit('close'); + }, + onClosed: function () { + this.$emit('closed'); + }, + onClickDay: function (event) { + if (this.data.readonly) { + return; + } + var date = event.detail.date; + var _a = this.data, type = _a.type, currentDate = _a.currentDate, allowSameDay = _a.allowSameDay; + if (type === 'range') { + // @ts-ignore + var startDay_1 = currentDate[0], endDay = currentDate[1]; + if (startDay_1 && !endDay) { + var compareToStart = (0, utils_1.compareDay)(date, startDay_1); + if (compareToStart === 1) { + var days_1 = this.selectComponent('.month').data.days; + days_1.some(function (day, index) { + var isDisabled = day.type === 'disabled' && + getTime(startDay_1) < getTime(day.date) && + getTime(day.date) < getTime(date); + if (isDisabled) { + (date = days_1[index - 1].date); + } + return isDisabled; + }); + this.select([startDay_1, date], true); + } + else if (compareToStart === -1) { + this.select([date, null]); + } + else if (allowSameDay) { + this.select([date, date], true); + } + } + else { + this.select([date, null]); + } + } + else if (type === 'multiple') { + var selectedIndex_1; + // @ts-ignore + var selected = currentDate.some(function (dateItem, index) { + var equal = (0, utils_1.compareDay)(dateItem, date) === 0; + if (equal) { + selectedIndex_1 = index; + } + return equal; + }); + if (selected) { + // @ts-ignore + var cancelDate = currentDate.splice(selectedIndex_1, 1); + this.setData({ currentDate: currentDate }); + this.unselect(cancelDate); + } + else { + // @ts-ignore + this.select(__spreadArray(__spreadArray([], currentDate, true), [date], false)); + } + } + else { + this.select(date, true); + } + }, + unselect: function (dateArray) { + var date = dateArray[0]; + if (date) { + this.$emit('unselect', (0, utils_1.copyDates)(date)); + } + }, + select: function (date, complete) { + if (complete && this.data.type === 'range') { + var valid = this.checkRange(date); + if (!valid) { + // auto selected to max range if showConfirm + if (this.data.showConfirm) { + this.emit([ + date[0], + (0, utils_1.getDayByOffset)(date[0], this.data.maxRange - 1), + ]); + } + else { + this.emit(date); + } + return; + } + } + this.emit(date); + if (complete && !this.data.showConfirm) { + this.onConfirm(); + } + }, + emit: function (date) { + this.setData({ + currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date), + }); + this.$emit('select', (0, utils_1.copyDates)(date)); + }, + checkRange: function (date) { + var _a = this.data, maxRange = _a.maxRange, rangePrompt = _a.rangePrompt, showRangePrompt = _a.showRangePrompt; + if (maxRange && (0, utils_1.calcDateNum)(date) > maxRange) { + if (showRangePrompt) { + (0, toast_1.default)({ + context: this, + message: rangePrompt || "\u9009\u62E9\u5929\u6570\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxRange, " \u5929"), + }); + } + this.$emit('over-range'); + return false; + } + return true; + }, + onConfirm: function () { + var _this = this; + if (this.data.type === 'range' && + !this.checkRange(this.data.currentDate)) { + return; + } + wx.nextTick(function () { + // @ts-ignore + _this.$emit('confirm', (0, utils_1.copyDates)(_this.data.currentDate)); + }); + }, + onClickSubtitle: function (event) { + this.$emit('click-subtitle', event); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/calendar/index.json b/src/miniprogram_npm/@vant/weapp/calendar/index.json new file mode 100644 index 0000000..397d5ae --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/index.json @@ -0,0 +1,10 @@ +{ + "component": true, + "usingComponents": { + "header": "./components/header/index", + "month": "./components/month/index", + "van-button": "../button/index", + "van-popup": "../popup/index", + "van-toast": "../toast/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/calendar/index.wxml b/src/miniprogram_npm/@vant/weapp/calendar/index.wxml new file mode 100644 index 0000000..9d0fc6b --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/index.wxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/calendar/index.wxs b/src/miniprogram_npm/@vant/weapp/calendar/index.wxs new file mode 100644 index 0000000..0a56646 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/index.wxs @@ -0,0 +1,37 @@ +/* eslint-disable */ +var utils = require('./utils.wxs'); + +function getMonths(minDate, maxDate) { + var months = []; + var cursor = getDate(minDate); + + cursor.setDate(1); + + do { + months.push(cursor.getTime()); + cursor.setMonth(cursor.getMonth() + 1); + } while (utils.compareMonth(cursor, getDate(maxDate)) !== 1); + + return months; +} + +function getButtonDisabled(type, currentDate, minRange) { + if (currentDate == null) { + return true; + } + + if (type === 'range') { + return !currentDate[0] || !currentDate[1]; + } + + if (type === 'multiple') { + return currentDate.length < minRange; + } + + return !currentDate; +} + +module.exports = { + getMonths: getMonths, + getButtonDisabled: getButtonDisabled +}; diff --git a/src/miniprogram_npm/@vant/weapp/calendar/index.wxss b/src/miniprogram_npm/@vant/weapp/calendar/index.wxss new file mode 100644 index 0000000..a1f1cf0 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:var(--calendar-height,100%)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:var(--calendar-popup-height,90%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-overflow-scrolling:touch;flex:1;overflow:auto}.van-calendar__footer{flex-shrink:0;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:var(--calendar-confirm-button-height,36px)!important;line-height:var(--calendar-confirm-button-line-height,34px)!important;margin:var(--calendar-confirm-button-margin,7px 0)!important} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/calendar/utils.d.ts b/src/miniprogram_npm/@vant/weapp/calendar/utils.d.ts new file mode 100644 index 0000000..889e6e7 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/utils.d.ts @@ -0,0 +1,12 @@ +export declare const ROW_HEIGHT = 64; +export declare function formatMonthTitle(date: Date): string; +export declare function compareMonth(date1: Date | number, date2: Date | number): 0 | 1 | -1; +export declare function compareDay(day1: Date | number, day2: Date | number): 0 | 1 | -1; +export declare function getDayByOffset(date: Date, offset: number): Date; +export declare function getPrevDay(date: Date): Date; +export declare function getNextDay(date: Date): Date; +export declare function getToday(): Date; +export declare function calcDateNum(date: [Date, Date]): number; +export declare function copyDates(dates: Date | Date[]): Date | Date[]; +export declare function getMonthEndDay(year: number, month: number): number; +export declare function getMonths(minDate: number, maxDate: number): number[]; diff --git a/src/miniprogram_npm/@vant/weapp/calendar/utils.js b/src/miniprogram_npm/@vant/weapp/calendar/utils.js new file mode 100644 index 0000000..c9e5df7 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/utils.js @@ -0,0 +1,97 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getMonths = exports.getMonthEndDay = exports.copyDates = exports.calcDateNum = exports.getToday = exports.getNextDay = exports.getPrevDay = exports.getDayByOffset = exports.compareDay = exports.compareMonth = exports.formatMonthTitle = exports.ROW_HEIGHT = void 0; +exports.ROW_HEIGHT = 64; +function formatMonthTitle(date) { + if (!(date instanceof Date)) { + date = new Date(date); + } + return "".concat(date.getFullYear(), "\u5E74").concat(date.getMonth() + 1, "\u6708"); +} +exports.formatMonthTitle = formatMonthTitle; +function compareMonth(date1, date2) { + if (!(date1 instanceof Date)) { + date1 = new Date(date1); + } + if (!(date2 instanceof Date)) { + date2 = new Date(date2); + } + var year1 = date1.getFullYear(); + var year2 = date2.getFullYear(); + var month1 = date1.getMonth(); + var month2 = date2.getMonth(); + if (year1 === year2) { + return month1 === month2 ? 0 : month1 > month2 ? 1 : -1; + } + return year1 > year2 ? 1 : -1; +} +exports.compareMonth = compareMonth; +function compareDay(day1, day2) { + if (!(day1 instanceof Date)) { + day1 = new Date(day1); + } + if (!(day2 instanceof Date)) { + day2 = new Date(day2); + } + var compareMonthResult = compareMonth(day1, day2); + if (compareMonthResult === 0) { + var date1 = day1.getDate(); + var date2 = day2.getDate(); + return date1 === date2 ? 0 : date1 > date2 ? 1 : -1; + } + return compareMonthResult; +} +exports.compareDay = compareDay; +function getDayByOffset(date, offset) { + date = new Date(date); + date.setDate(date.getDate() + offset); + return date; +} +exports.getDayByOffset = getDayByOffset; +function getPrevDay(date) { + return getDayByOffset(date, -1); +} +exports.getPrevDay = getPrevDay; +function getNextDay(date) { + return getDayByOffset(date, 1); +} +exports.getNextDay = getNextDay; +function getToday() { + var today = new Date(); + today.setHours(0, 0, 0, 0); + return today; +} +exports.getToday = getToday; +function calcDateNum(date) { + var day1 = new Date(date[0]).getTime(); + var day2 = new Date(date[1]).getTime(); + return (day2 - day1) / (1000 * 60 * 60 * 24) + 1; +} +exports.calcDateNum = calcDateNum; +function copyDates(dates) { + if (Array.isArray(dates)) { + return dates.map(function (date) { + if (date === null) { + return date; + } + return new Date(date); + }); + } + return new Date(dates); +} +exports.copyDates = copyDates; +function getMonthEndDay(year, month) { + return 32 - new Date(year, month - 1, 32).getDate(); +} +exports.getMonthEndDay = getMonthEndDay; +function getMonths(minDate, maxDate) { + var months = []; + var cursor = new Date(minDate); + cursor.setDate(1); + do { + months.push(cursor.getTime()); + cursor.setMonth(cursor.getMonth() + 1); + } while (compareMonth(cursor, maxDate) !== 1); + return months; +} +exports.getMonths = getMonths; diff --git a/src/miniprogram_npm/@vant/weapp/calendar/utils.wxs b/src/miniprogram_npm/@vant/weapp/calendar/utils.wxs new file mode 100644 index 0000000..e57f6b3 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/calendar/utils.wxs @@ -0,0 +1,25 @@ +/* eslint-disable */ +function getMonthEndDay(year, month) { + return 32 - getDate(year, month - 1, 32).getDate(); +} + +function compareMonth(date1, date2) { + date1 = getDate(date1); + date2 = getDate(date2); + + var year1 = date1.getFullYear(); + var year2 = date2.getFullYear(); + var month1 = date1.getMonth(); + var month2 = date2.getMonth(); + + if (year1 === year2) { + return month1 === month2 ? 0 : month1 > month2 ? 1 : -1; + } + + return year1 > year2 ? 1 : -1; +} + +module.exports = { + getMonthEndDay: getMonthEndDay, + compareMonth: compareMonth +}; diff --git a/src/miniprogram_npm/@vant/weapp/card/index.d.ts b/src/miniprogram_npm/@vant/weapp/card/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/card/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/card/index.js b/src/miniprogram_npm/@vant/weapp/card/index.js new file mode 100644 index 0000000..2815655 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/card/index.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var link_1 = require("../mixins/link"); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + classes: [ + 'num-class', + 'desc-class', + 'thumb-class', + 'title-class', + 'price-class', + 'origin-price-class', + ], + mixins: [link_1.link], + props: { + tag: String, + num: String, + desc: String, + thumb: String, + title: String, + price: { + type: String, + observer: 'updatePrice', + }, + centered: Boolean, + lazyLoad: Boolean, + thumbLink: String, + originPrice: String, + thumbMode: { + type: String, + value: 'aspectFit', + }, + currency: { + type: String, + value: '¥', + }, + }, + methods: { + updatePrice: function () { + var price = this.data.price; + var priceArr = price.toString().split('.'); + this.setData({ + integerStr: priceArr[0], + decimalStr: priceArr[1] ? ".".concat(priceArr[1]) : '', + }); + }, + onClickThumb: function () { + this.jumpLink('thumbLink'); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/card/index.json b/src/miniprogram_npm/@vant/weapp/card/index.json new file mode 100644 index 0000000..e917407 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/card/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-tag": "../tag/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/card/index.wxml b/src/miniprogram_npm/@vant/weapp/card/index.wxml new file mode 100644 index 0000000..62173e4 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/card/index.wxml @@ -0,0 +1,56 @@ + + + + + + + + + {{ tag }} + + + + + + + {{ title }} + + + {{ desc }} + + + + + + + + + {{ currency }} + {{ integerStr }} + {{ decimalStr }} + + + {{ currency }} {{ originPrice }} + + x {{ num }} + + + + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/card/index.wxss b/src/miniprogram_npm/@vant/weapp/card/index.wxss new file mode 100644 index 0000000..0f4d7c5 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/card/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-card{background-color:var(--card-background-color,#fafafa);box-sizing:border-box;color:var(--card-text-color,#323233);font-size:var(--card-font-size,12px);padding:var(--card-padding,8px 16px);position:relative}.van-card__header{display:flex}.van-card__header--center{align-items:center;justify-content:center}.van-card__thumb{flex:none;height:var(--card-thumb-size,88px);margin-right:var(--padding-xs,8px);position:relative;width:var(--card-thumb-size,88px)}.van-card__thumb:empty{display:none}.van-card__img{border-radius:8px;height:100%;width:100%}.van-card__content{display:flex;flex:1;flex-direction:column;justify-content:space-between;min-height:var(--card-thumb-size,88px);min-width:0;position:relative}.van-card__content--center{justify-content:center}.van-card__desc,.van-card__title{word-wrap:break-word}.van-card__title{font-weight:700;line-height:var(--card-title-line-height,16px)}.van-card__desc{color:var(--card-desc-color,#646566);line-height:var(--card-desc-line-height,20px)}.van-card__bottom{line-height:20px}.van-card__price{color:var(--card-price-color,#ee0a24);display:inline-block;font-size:var(--card-price-font-size,12px);font-weight:700}.van-card__price-integer{font-size:var(--card-price-integer-font-size,16px)}.van-card__price-decimal,.van-card__price-integer{font-family:var(--card-price-font-family,Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif)}.van-card__origin-price{color:var(--card-origin-price-color,#646566);display:inline-block;font-size:var(--card-origin-price-font-size,10px);margin-left:5px;text-decoration:line-through}.van-card__num{float:right}.van-card__tag{left:0;position:absolute!important;top:2px}.van-card__footer{flex:none;text-align:right;width:100%} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/cascader/index.d.ts b/src/miniprogram_npm/@vant/weapp/cascader/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cascader/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/cascader/index.js b/src/miniprogram_npm/@vant/weapp/cascader/index.js new file mode 100644 index 0000000..2a50556 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cascader/index.js @@ -0,0 +1,228 @@ +"use strict"; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var FieldName; +(function (FieldName) { + FieldName["TEXT"] = "text"; + FieldName["VALUE"] = "value"; + FieldName["CHILDREN"] = "children"; +})(FieldName || (FieldName = {})); +var defaultFieldNames = { + text: FieldName.TEXT, + value: FieldName.VALUE, + children: FieldName.CHILDREN, +}; +(0, component_1.VantComponent)({ + props: { + title: String, + value: { + type: String, + }, + placeholder: { + type: String, + value: '请选择', + }, + activeColor: { + type: String, + value: '#1989fa', + }, + options: { + type: Array, + value: [], + }, + swipeable: { + type: Boolean, + value: false, + }, + closeable: { + type: Boolean, + value: true, + }, + ellipsis: { + type: Boolean, + value: true, + }, + showHeader: { + type: Boolean, + value: true, + }, + closeIcon: { + type: String, + value: 'cross', + }, + fieldNames: { + type: Object, + value: defaultFieldNames, + observer: 'updateFieldNames', + }, + useTitleSlot: Boolean, + }, + data: { + tabs: [], + activeTab: 0, + textKey: FieldName.TEXT, + valueKey: FieldName.VALUE, + childrenKey: FieldName.CHILDREN, + innerValue: '', + }, + watch: { + options: function () { + this.updateTabs(); + }, + value: function (newVal) { + this.updateValue(newVal); + }, + }, + created: function () { + this.updateTabs(); + }, + methods: { + updateValue: function (val) { + var _this = this; + if (val !== undefined) { + var values = this.data.tabs.map(function (tab) { return tab.selected && tab.selected[_this.data.valueKey]; }); + if (values.indexOf(val) > -1) { + return; + } + } + this.innerValue = val; + this.updateTabs(); + }, + updateFieldNames: function () { + var _a = this.data.fieldNames || defaultFieldNames, _b = _a.text, text = _b === void 0 ? 'text' : _b, _c = _a.value, value = _c === void 0 ? 'value' : _c, _d = _a.children, children = _d === void 0 ? 'children' : _d; + this.setData({ + textKey: text, + valueKey: value, + childrenKey: children, + }); + }, + getSelectedOptionsByValue: function (options, value) { + for (var i = 0; i < options.length; i++) { + var option = options[i]; + if (option[this.data.valueKey] === value) { + return [option]; + } + if (option[this.data.childrenKey]) { + var selectedOptions = this.getSelectedOptionsByValue(option[this.data.childrenKey], value); + if (selectedOptions) { + return __spreadArray([option], selectedOptions, true); + } + } + } + }, + updateTabs: function () { + var _this = this; + var options = this.data.options; + var innerValue = this.innerValue; + if (!options.length) { + return; + } + if (innerValue !== undefined) { + var selectedOptions = this.getSelectedOptionsByValue(options, innerValue); + if (selectedOptions) { + var optionsCursor_1 = options; + var tabs_1 = selectedOptions.map(function (option) { + var tab = { + options: optionsCursor_1, + selected: option, + }; + var next = optionsCursor_1.find(function (item) { return item[_this.data.valueKey] === option[_this.data.valueKey]; }); + if (next) { + optionsCursor_1 = next[_this.data.childrenKey]; + } + return tab; + }); + if (optionsCursor_1) { + tabs_1.push({ + options: optionsCursor_1, + selected: null, + }); + } + this.setData({ + tabs: tabs_1, + }); + wx.nextTick(function () { + _this.setData({ + activeTab: tabs_1.length - 1, + }); + }); + return; + } + } + this.setData({ + tabs: [ + { + options: options, + selected: null, + }, + ], + activeTab: 0, + }); + }, + onClose: function () { + this.$emit('close'); + }, + onClickTab: function (e) { + var _a = e.detail, tabIndex = _a.index, title = _a.title; + this.$emit('click-tab', { title: title, tabIndex: tabIndex }); + this.setData({ + activeTab: tabIndex, + }); + }, + // 选中 + onSelect: function (e) { + var _this = this; + var _a = e.currentTarget.dataset, option = _a.option, tabIndex = _a.tabIndex; + if (option && option.disabled) { + return; + } + var _b = this.data, valueKey = _b.valueKey, childrenKey = _b.childrenKey; + var tabs = this.data.tabs; + tabs[tabIndex].selected = option; + if (tabs.length > tabIndex + 1) { + tabs = tabs.slice(0, tabIndex + 1); + } + if (option[childrenKey]) { + var nextTab = { + options: option[childrenKey], + selected: null, + }; + if (tabs[tabIndex + 1]) { + tabs[tabIndex + 1] = nextTab; + } + else { + tabs.push(nextTab); + } + wx.nextTick(function () { + _this.setData({ + activeTab: tabIndex + 1, + }); + }); + } + this.setData({ + tabs: tabs, + }); + var selectedOptions = tabs.map(function (tab) { return tab.selected; }).filter(Boolean); + var value = option[valueKey]; + var params = { + value: value, + tabIndex: tabIndex, + selectedOptions: selectedOptions, + }; + this.innerValue = value; + this.$emit('change', params); + if (!option[childrenKey]) { + this.$emit('finish', params); + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/cascader/index.json b/src/miniprogram_npm/@vant/weapp/cascader/index.json new file mode 100644 index 0000000..d0f75eb --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cascader/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "van-icon": "../icon/index", + "van-tab": "../tab/index", + "van-tabs": "../tabs/index" + } +} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/cascader/index.wxml b/src/miniprogram_npm/@vant/weapp/cascader/index.wxml new file mode 100644 index 0000000..8a5ab25 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cascader/index.wxml @@ -0,0 +1,55 @@ + + + + + {{ title }} + + + + + + + + + + + {{ option[textKey] }} + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/cascader/index.wxs b/src/miniprogram_npm/@vant/weapp/cascader/index.wxs new file mode 100644 index 0000000..b1aab58 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cascader/index.wxs @@ -0,0 +1,24 @@ +var utils = require('../wxs/utils.wxs'); +var style = require('../wxs/style.wxs'); + +function isSelected(tab, valueKey, option) { + return tab.selected && tab.selected[valueKey] === option[valueKey] +} + +function optionClass(tab, valueKey, option) { + return utils.bem('cascader__option', { selected: isSelected(tab, valueKey, option), disabled: option.disabled }) +} + +function optionStyle(data) { + var color = data.option.color || (isSelected(data.tab, data.valueKey, data.option) ? data.activeColor : undefined); + return style({ + color + }); +} + + +module.exports = { + isSelected: isSelected, + optionClass: optionClass, + optionStyle: optionStyle, +}; \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/cascader/index.wxss b/src/miniprogram_npm/@vant/weapp/cascader/index.wxss new file mode 100644 index 0000000..7062486 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cascader/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-cascader__header{align-items:center;display:flex;height:48px;justify-content:space-between;padding:0 16px}.van-cascader__title{font-size:16px;font-weight:600;line-height:20px}.van-cascader__close-icon{color:#c8c9cc;font-size:22px;height:22px}.van-cascader__tabs-wrap{height:48px!important;padding:0 8px}.van-cascader__tab{color:#323233!important;flex:none!important;font-weight:600!important;padding:0 8px!important}.van-cascader__tab--unselected{color:#969799!important;font-weight:400!important}.van-cascader__option{align-items:center;cursor:pointer;display:flex;font-size:14px;justify-content:space-between;line-height:20px;padding:10px 16px}.van-cascader__option:active{background-color:#f2f3f5}.van-cascader__option--selected{color:#1989fa;font-weight:600}.van-cascader__option--disabled{color:#c8c9cc;cursor:not-allowed}.van-cascader__option--disabled:active{background-color:initial}.van-cascader__options{-webkit-overflow-scrolling:touch;box-sizing:border-box;height:384px;overflow-y:auto;padding-top:6px} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/cell-group/index.d.ts b/src/miniprogram_npm/@vant/weapp/cell-group/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell-group/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/cell-group/index.js b/src/miniprogram_npm/@vant/weapp/cell-group/index.js new file mode 100644 index 0000000..34a93a6 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell-group/index.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + props: { + title: String, + border: { + type: Boolean, + value: true, + }, + inset: Boolean, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/cell-group/index.json b/src/miniprogram_npm/@vant/weapp/cell-group/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell-group/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/cell-group/index.wxml b/src/miniprogram_npm/@vant/weapp/cell-group/index.wxml new file mode 100644 index 0000000..311e064 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell-group/index.wxml @@ -0,0 +1,11 @@ + + + + {{ title }} + + + + diff --git a/src/miniprogram_npm/@vant/weapp/cell-group/index.wxss b/src/miniprogram_npm/@vant/weapp/cell-group/index.wxss new file mode 100644 index 0000000..08b252f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell-group/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-cell-group--inset{border-radius:var(--cell-group-inset-border-radius,8px);margin:var(--cell-group-inset-padding,0 16px);overflow:hidden}.van-cell-group__title{color:var(--cell-group-title-color,#969799);font-size:var(--cell-group-title-font-size,14px);line-height:var(--cell-group-title-line-height,16px);padding:var(--cell-group-title-padding,16px 16px 8px)}.van-cell-group__title--inset{padding:var(--cell-group-inset-title-padding,16px 16px 8px 32px)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/cell/index.d.ts b/src/miniprogram_npm/@vant/weapp/cell/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/cell/index.js b/src/miniprogram_npm/@vant/weapp/cell/index.js new file mode 100644 index 0000000..80f3039 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell/index.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var link_1 = require("../mixins/link"); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + classes: [ + 'title-class', + 'label-class', + 'value-class', + 'right-icon-class', + 'hover-class', + ], + mixins: [link_1.link], + props: { + title: null, + value: null, + icon: String, + size: String, + label: String, + center: Boolean, + isLink: Boolean, + required: Boolean, + clickable: Boolean, + titleWidth: String, + customStyle: String, + arrowDirection: String, + useLabelSlot: Boolean, + border: { + type: Boolean, + value: true, + }, + titleStyle: String, + }, + methods: { + onClick: function (event) { + this.$emit('click', event.detail); + this.jumpLink(); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/cell/index.json b/src/miniprogram_npm/@vant/weapp/cell/index.json new file mode 100644 index 0000000..0a336c0 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-icon": "../icon/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/cell/index.wxml b/src/miniprogram_npm/@vant/weapp/cell/index.wxml new file mode 100644 index 0000000..8387c3c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell/index.wxml @@ -0,0 +1,47 @@ + + + + + + + + + + {{ title }} + + + + + {{ label }} + + + + + {{ value }} + + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/cell/index.wxs b/src/miniprogram_npm/@vant/weapp/cell/index.wxs new file mode 100644 index 0000000..e3500c4 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell/index.wxs @@ -0,0 +1,17 @@ +/* eslint-disable */ +var style = require('../wxs/style.wxs'); +var addUnit = require('../wxs/add-unit.wxs'); + +function titleStyle(data) { + return style([ + { + 'max-width': addUnit(data.titleWidth), + 'min-width': addUnit(data.titleWidth), + }, + data.titleStyle, + ]); +} + +module.exports = { + titleStyle: titleStyle, +}; diff --git a/src/miniprogram_npm/@vant/weapp/cell/index.wxss b/src/miniprogram_npm/@vant/weapp/cell/index.wxss new file mode 100644 index 0000000..1802f8e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/cell/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-cell{background-color:var(--cell-background-color,#fff);box-sizing:border-box;color:var(--cell-text-color,#323233);display:flex;font-size:var(--cell-font-size,14px);line-height:var(--cell-line-height,24px);padding:var(--cell-vertical-padding,10px) var(--cell-horizontal-padding,16px);position:relative;width:100%}.van-cell:after{border-bottom:1px solid #ebedf0;bottom:0;box-sizing:border-box;content:" ";left:16px;pointer-events:none;position:absolute;right:16px;transform:scaleY(.5);transform-origin:center}.van-cell--borderless:after{display:none}.van-cell-group{background-color:var(--cell-background-color,#fff)}.van-cell__label{color:var(--cell-label-color,#969799);font-size:var(--cell-label-font-size,12px);line-height:var(--cell-label-line-height,18px);margin-top:var(--cell-label-margin-top,3px)}.van-cell__value{color:var(--cell-value-color,#969799);overflow:hidden;text-align:right;vertical-align:middle}.van-cell__title,.van-cell__value{flex:1}.van-cell__title:empty,.van-cell__value:empty{display:none}.van-cell__left-icon-wrap,.van-cell__right-icon-wrap{align-items:center;display:flex;font-size:var(--cell-icon-size,16px);height:var(--cell-line-height,24px)}.van-cell__left-icon-wrap{margin-right:var(--padding-base,4px)}.van-cell__right-icon-wrap{color:var(--cell-right-icon-color,#969799);margin-left:var(--padding-base,4px)}.van-cell__left-icon{vertical-align:middle}.van-cell__left-icon,.van-cell__right-icon{line-height:var(--cell-line-height,24px)}.van-cell--clickable.van-cell--hover{background-color:var(--cell-active-color,#f2f3f5)}.van-cell--required{overflow:visible}.van-cell--required:before{color:var(--cell-required-color,#ee0a24);content:"*";font-size:var(--cell-font-size,14px);left:var(--padding-xs,8px);position:absolute}.van-cell--center{align-items:center}.van-cell--large{padding-bottom:var(--cell-large-vertical-padding,12px);padding-top:var(--cell-large-vertical-padding,12px)}.van-cell--large .van-cell__title{font-size:var(--cell-large-title-font-size,16px)}.van-cell--large .van-cell__value{font-size:var(--cell-large-value-font-size,16px)}.van-cell--large .van-cell__label{font-size:var(--cell-large-label-font-size,14px)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/checkbox-group/index.d.ts b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/checkbox-group/index.js b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.js new file mode 100644 index 0000000..80c93a1 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var relation_1 = require("../common/relation"); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + field: true, + relation: (0, relation_1.useChildren)('checkbox', function (target) { + this.updateChild(target); + }), + props: { + max: Number, + value: { + type: Array, + observer: 'updateChildren', + }, + disabled: { + type: Boolean, + observer: 'updateChildren', + }, + direction: { + type: String, + value: 'vertical', + }, + }, + methods: { + updateChildren: function () { + var _this = this; + this.children.forEach(function (child) { return _this.updateChild(child); }); + }, + updateChild: function (child) { + var _a = this.data, value = _a.value, disabled = _a.disabled, direction = _a.direction; + child.setData({ + value: value.indexOf(child.data.name) !== -1, + parentDisabled: disabled, + direction: direction, + }); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/checkbox-group/index.json b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxml b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxml new file mode 100644 index 0000000..638bf9d --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxss b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxss new file mode 100644 index 0000000..c5666d7 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox-group/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-checkbox-group--horizontal{display:flex;flex-wrap:wrap} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/checkbox/index.d.ts b/src/miniprogram_npm/@vant/weapp/checkbox/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/checkbox/index.js b/src/miniprogram_npm/@vant/weapp/checkbox/index.js new file mode 100644 index 0000000..6247365 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox/index.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var relation_1 = require("../common/relation"); +var component_1 = require("../common/component"); +function emit(target, value) { + target.$emit('input', value); + target.$emit('change', value); +} +(0, component_1.VantComponent)({ + field: true, + relation: (0, relation_1.useParent)('checkbox-group'), + classes: ['icon-class', 'label-class'], + props: { + value: Boolean, + disabled: Boolean, + useIconSlot: Boolean, + checkedColor: String, + labelPosition: { + type: String, + value: 'right', + }, + labelDisabled: Boolean, + shape: { + type: String, + value: 'round', + }, + iconSize: { + type: null, + value: 20, + }, + }, + data: { + parentDisabled: false, + direction: 'vertical', + }, + methods: { + emitChange: function (value) { + if (this.parent) { + this.setParentValue(this.parent, value); + } + else { + emit(this, value); + } + }, + toggle: function () { + var _a = this.data, parentDisabled = _a.parentDisabled, disabled = _a.disabled, value = _a.value; + if (!disabled && !parentDisabled) { + this.emitChange(!value); + } + }, + onClickLabel: function () { + var _a = this.data, labelDisabled = _a.labelDisabled, parentDisabled = _a.parentDisabled, disabled = _a.disabled, value = _a.value; + if (!disabled && !labelDisabled && !parentDisabled) { + this.emitChange(!value); + } + }, + setParentValue: function (parent, value) { + var parentValue = parent.data.value.slice(); + var name = this.data.name; + var max = parent.data.max; + if (value) { + if (max && parentValue.length >= max) { + return; + } + if (parentValue.indexOf(name) === -1) { + parentValue.push(name); + emit(parent, parentValue); + } + } + else { + var index = parentValue.indexOf(name); + if (index !== -1) { + parentValue.splice(index, 1); + emit(parent, parentValue); + } + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/checkbox/index.json b/src/miniprogram_npm/@vant/weapp/checkbox/index.json new file mode 100644 index 0000000..0a336c0 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-icon": "../icon/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/checkbox/index.wxml b/src/miniprogram_npm/@vant/weapp/checkbox/index.wxml new file mode 100644 index 0000000..39a7bb0 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox/index.wxml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/checkbox/index.wxs b/src/miniprogram_npm/@vant/weapp/checkbox/index.wxs new file mode 100644 index 0000000..eb9c772 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox/index.wxs @@ -0,0 +1,20 @@ +/* eslint-disable */ +var style = require('../wxs/style.wxs'); +var addUnit = require('../wxs/add-unit.wxs'); + +function iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) { + var styles = { + 'font-size': addUnit(iconSize), + }; + + if (checkedColor && value && !disabled && !parentDisabled) { + styles['border-color'] = checkedColor; + styles['background-color'] = checkedColor; + } + + return style(styles); +} + +module.exports = { + iconStyle: iconStyle, +}; diff --git a/src/miniprogram_npm/@vant/weapp/checkbox/index.wxss b/src/miniprogram_npm/@vant/weapp/checkbox/index.wxss new file mode 100644 index 0000000..da2272a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/checkbox/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-checkbox{align-items:center;display:flex;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox--horizontal{margin-right:12px}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{flex:none}.van-checkbox__icon{align-items:center;border:1px solid var(--checkbox-border-color,#c8c9cc);box-sizing:border-box;color:transparent;display:flex;font-size:var(--checkbox-size,20px);height:1em;justify-content:center;text-align:center;transition-duration:var(--checkbox-transition-duration,.2s);transition-property:color,border-color,background-color;width:1em}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:var(--checkbox-checked-icon-color,#1989fa);color:#fff}.van-checkbox__icon--disabled{background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;color:var(--checkbox-label-color,#323233);padding-left:var(--checkbox-label-margin,10px)}.van-checkbox__label--left{float:left;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/circle/canvas.d.ts b/src/miniprogram_npm/@vant/weapp/circle/canvas.d.ts new file mode 100644 index 0000000..8a0b71e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/canvas.d.ts @@ -0,0 +1,4 @@ +/// +type CanvasContext = WechatMiniprogram.CanvasContext; +export declare function adaptor(ctx: CanvasContext & Record): CanvasContext; +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/circle/canvas.js b/src/miniprogram_npm/@vant/weapp/circle/canvas.js new file mode 100644 index 0000000..d81df74 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/canvas.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.adaptor = void 0; +function adaptor(ctx) { + // @ts-ignore + return Object.assign(ctx, { + setStrokeStyle: function (val) { + ctx.strokeStyle = val; + }, + setLineWidth: function (val) { + ctx.lineWidth = val; + }, + setLineCap: function (val) { + ctx.lineCap = val; + }, + setFillStyle: function (val) { + ctx.fillStyle = val; + }, + setFontSize: function (val) { + ctx.font = String(val); + }, + setGlobalAlpha: function (val) { + ctx.globalAlpha = val; + }, + setLineJoin: function (val) { + ctx.lineJoin = val; + }, + setTextAlign: function (val) { + ctx.textAlign = val; + }, + setMiterLimit: function (val) { + ctx.miterLimit = val; + }, + setShadow: function (offsetX, offsetY, blur, color) { + ctx.shadowOffsetX = offsetX; + ctx.shadowOffsetY = offsetY; + ctx.shadowBlur = blur; + ctx.shadowColor = color; + }, + setTextBaseline: function (val) { + ctx.textBaseline = val; + }, + createCircularGradient: function () { }, + draw: function () { }, + }); +} +exports.adaptor = adaptor; diff --git a/src/miniprogram_npm/@vant/weapp/circle/index.d.ts b/src/miniprogram_npm/@vant/weapp/circle/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/circle/index.js b/src/miniprogram_npm/@vant/weapp/circle/index.js new file mode 100644 index 0000000..e131e4b --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/index.js @@ -0,0 +1,207 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var color_1 = require("../common/color"); +var component_1 = require("../common/component"); +var utils_1 = require("../common/utils"); +var validator_1 = require("../common/validator"); +var version_1 = require("../common/version"); +var canvas_1 = require("./canvas"); +function format(rate) { + return Math.min(Math.max(rate, 0), 100); +} +var PERIMETER = 2 * Math.PI; +var BEGIN_ANGLE = -Math.PI / 2; +var STEP = 1; +(0, component_1.VantComponent)({ + props: { + text: String, + lineCap: { + type: String, + value: 'round', + }, + value: { + type: Number, + value: 0, + observer: 'reRender', + }, + speed: { + type: Number, + value: 50, + }, + size: { + type: Number, + value: 100, + observer: function () { + this.drawCircle(this.currentValue); + }, + }, + fill: String, + layerColor: { + type: String, + value: color_1.WHITE, + }, + color: { + type: null, + value: color_1.BLUE, + observer: function () { + var _this = this; + this.setHoverColor().then(function () { + _this.drawCircle(_this.currentValue); + }); + }, + }, + type: { + type: String, + value: '', + }, + strokeWidth: { + type: Number, + value: 4, + }, + clockwise: { + type: Boolean, + value: true, + }, + }, + data: { + hoverColor: color_1.BLUE, + }, + methods: { + getContext: function () { + var _this = this; + var _a = this.data, type = _a.type, size = _a.size; + if (type === '' || !(0, version_1.canIUseCanvas2d)()) { + var ctx = wx.createCanvasContext('van-circle', this); + return Promise.resolve(ctx); + } + var dpr = (0, utils_1.getSystemInfoSync)().pixelRatio; + return new Promise(function (resolve) { + wx.createSelectorQuery() + .in(_this) + .select('#van-circle') + .node() + .exec(function (res) { + var canvas = res[0].node; + var ctx = canvas.getContext(type); + if (!_this.inited) { + _this.inited = true; + canvas.width = size * dpr; + canvas.height = size * dpr; + ctx.scale(dpr, dpr); + } + resolve((0, canvas_1.adaptor)(ctx)); + }); + }); + }, + setHoverColor: function () { + var _this = this; + var _a = this.data, color = _a.color, size = _a.size; + if ((0, validator_1.isObj)(color)) { + return this.getContext().then(function (context) { + if (!context) + return; + var LinearColor = context.createLinearGradient(size, 0, 0, 0); + Object.keys(color) + .sort(function (a, b) { return parseFloat(a) - parseFloat(b); }) + .map(function (key) { + return LinearColor.addColorStop(parseFloat(key) / 100, color[key]); + }); + _this.hoverColor = LinearColor; + }); + } + this.hoverColor = color; + return Promise.resolve(); + }, + presetCanvas: function (context, strokeStyle, beginAngle, endAngle, fill) { + var _a = this.data, strokeWidth = _a.strokeWidth, lineCap = _a.lineCap, clockwise = _a.clockwise, size = _a.size; + var position = size / 2; + var radius = position - strokeWidth / 2; + context.setStrokeStyle(strokeStyle); + context.setLineWidth(strokeWidth); + context.setLineCap(lineCap); + context.beginPath(); + context.arc(position, position, radius, beginAngle, endAngle, !clockwise); + context.stroke(); + if (fill) { + context.setFillStyle(fill); + context.fill(); + } + }, + renderLayerCircle: function (context) { + var _a = this.data, layerColor = _a.layerColor, fill = _a.fill; + this.presetCanvas(context, layerColor, 0, PERIMETER, fill); + }, + renderHoverCircle: function (context, formatValue) { + var clockwise = this.data.clockwise; + // 结束角度 + var progress = PERIMETER * (formatValue / 100); + var endAngle = clockwise + ? BEGIN_ANGLE + progress + : 3 * Math.PI - (BEGIN_ANGLE + progress); + this.presetCanvas(context, this.hoverColor, BEGIN_ANGLE, endAngle); + }, + drawCircle: function (currentValue) { + var _this = this; + var size = this.data.size; + this.getContext().then(function (context) { + if (!context) + return; + context.clearRect(0, 0, size, size); + _this.renderLayerCircle(context); + var formatValue = format(currentValue); + if (formatValue !== 0) { + _this.renderHoverCircle(context, formatValue); + } + context.draw(); + }); + }, + reRender: function () { + var _this = this; + // tofector 动画暂时没有想到好的解决方案 + var _a = this.data, value = _a.value, speed = _a.speed; + if (speed <= 0 || speed > 1000) { + this.drawCircle(value); + return; + } + this.clearMockInterval(); + this.currentValue = this.currentValue || 0; + var run = function () { + _this.interval = setTimeout(function () { + if (_this.currentValue !== value) { + if (Math.abs(_this.currentValue - value) < STEP) { + _this.currentValue = value; + } + else if (_this.currentValue < value) { + _this.currentValue += STEP; + } + else { + _this.currentValue -= STEP; + } + _this.drawCircle(_this.currentValue); + run(); + } + else { + _this.clearMockInterval(); + } + }, 1000 / speed); + }; + run(); + }, + clearMockInterval: function () { + if (this.interval) { + clearTimeout(this.interval); + this.interval = null; + } + }, + }, + mounted: function () { + var _this = this; + this.currentValue = this.data.value; + this.setHoverColor().then(function () { + _this.drawCircle(_this.currentValue); + }); + }, + destroyed: function () { + this.clearMockInterval(); + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/circle/index.json b/src/miniprogram_npm/@vant/weapp/circle/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/circle/index.wxml b/src/miniprogram_npm/@vant/weapp/circle/index.wxml new file mode 100644 index 0000000..52bc59f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/index.wxml @@ -0,0 +1,9 @@ + + + + + + + + {{ text }} + diff --git a/src/miniprogram_npm/@vant/weapp/circle/index.wxss b/src/miniprogram_npm/@vant/weapp/circle/index.wxss new file mode 100644 index 0000000..2200751 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/circle/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-circle{display:inline-block;position:relative;text-align:center}.van-circle__text{color:var(--circle-text-color,#323233);left:0;position:absolute;top:50%;transform:translateY(-50%);width:100%} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/col/index.d.ts b/src/miniprogram_npm/@vant/weapp/col/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/col/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/col/index.js b/src/miniprogram_npm/@vant/weapp/col/index.js new file mode 100644 index 0000000..63c56eb --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/col/index.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var relation_1 = require("../common/relation"); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + relation: (0, relation_1.useParent)('row'), + props: { + span: Number, + offset: Number, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/col/index.json b/src/miniprogram_npm/@vant/weapp/col/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/col/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/col/index.wxml b/src/miniprogram_npm/@vant/weapp/col/index.wxml new file mode 100644 index 0000000..975348b --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/col/index.wxml @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/col/index.wxs b/src/miniprogram_npm/@vant/weapp/col/index.wxs new file mode 100644 index 0000000..507c1cb --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/col/index.wxs @@ -0,0 +1,18 @@ +/* eslint-disable */ +var style = require('../wxs/style.wxs'); +var addUnit = require('../wxs/add-unit.wxs'); + +function rootStyle(data) { + if (!data.gutter) { + return ''; + } + + return style({ + 'padding-right': addUnit(data.gutter / 2), + 'padding-left': addUnit(data.gutter / 2), + }); +} + +module.exports = { + rootStyle: rootStyle, +}; diff --git a/src/miniprogram_npm/@vant/weapp/col/index.wxss b/src/miniprogram_npm/@vant/weapp/col/index.wxss new file mode 100644 index 0000000..2fa265e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/col/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-col{box-sizing:border-box;float:left}.van-col--1{width:4.16666667%}.van-col--offset-1{margin-left:4.16666667%}.van-col--2{width:8.33333333%}.van-col--offset-2{margin-left:8.33333333%}.van-col--3{width:12.5%}.van-col--offset-3{margin-left:12.5%}.van-col--4{width:16.66666667%}.van-col--offset-4{margin-left:16.66666667%}.van-col--5{width:20.83333333%}.van-col--offset-5{margin-left:20.83333333%}.van-col--6{width:25%}.van-col--offset-6{margin-left:25%}.van-col--7{width:29.16666667%}.van-col--offset-7{margin-left:29.16666667%}.van-col--8{width:33.33333333%}.van-col--offset-8{margin-left:33.33333333%}.van-col--9{width:37.5%}.van-col--offset-9{margin-left:37.5%}.van-col--10{width:41.66666667%}.van-col--offset-10{margin-left:41.66666667%}.van-col--11{width:45.83333333%}.van-col--offset-11{margin-left:45.83333333%}.van-col--12{width:50%}.van-col--offset-12{margin-left:50%}.van-col--13{width:54.16666667%}.van-col--offset-13{margin-left:54.16666667%}.van-col--14{width:58.33333333%}.van-col--offset-14{margin-left:58.33333333%}.van-col--15{width:62.5%}.van-col--offset-15{margin-left:62.5%}.van-col--16{width:66.66666667%}.van-col--offset-16{margin-left:66.66666667%}.van-col--17{width:70.83333333%}.van-col--offset-17{margin-left:70.83333333%}.van-col--18{width:75%}.van-col--offset-18{margin-left:75%}.van-col--19{width:79.16666667%}.van-col--offset-19{margin-left:79.16666667%}.van-col--20{width:83.33333333%}.van-col--offset-20{margin-left:83.33333333%}.van-col--21{width:87.5%}.van-col--offset-21{margin-left:87.5%}.van-col--22{width:91.66666667%}.van-col--offset-22{margin-left:91.66666667%}.van-col--23{width:95.83333333%}.van-col--offset-23{margin-left:95.83333333%}.van-col--24{width:100%}.van-col--offset-24{margin-left:100%} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/animate.d.ts b/src/miniprogram_npm/@vant/weapp/collapse-item/animate.d.ts new file mode 100644 index 0000000..32157b6 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/animate.d.ts @@ -0,0 +1,2 @@ +/// +export declare function setContentAnimate(context: WechatMiniprogram.Component.TrivialInstance, expanded: boolean, mounted: boolean): void; diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/animate.js b/src/miniprogram_npm/@vant/weapp/collapse-item/animate.js new file mode 100644 index 0000000..5734087 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/animate.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.setContentAnimate = void 0; +var utils_1 = require("../common/utils"); +function useAnimation(context, expanded, mounted, height) { + var animation = wx.createAnimation({ + duration: 0, + timingFunction: 'ease-in-out', + }); + if (expanded) { + if (height === 0) { + animation.height('auto').top(1).step(); + } + else { + animation + .height(height) + .top(1) + .step({ + duration: mounted ? 300 : 1, + }) + .height('auto') + .step(); + } + context.setData({ + animation: animation.export(), + }); + return; + } + animation.height(height).top(0).step({ duration: 1 }).height(0).step({ + duration: 300, + }); + context.setData({ + animation: animation.export(), + }); +} +function setContentAnimate(context, expanded, mounted) { + (0, utils_1.getRect)(context, '.van-collapse-item__content') + .then(function (rect) { return rect.height; }) + .then(function (height) { + useAnimation(context, expanded, mounted, height); + }); +} +exports.setContentAnimate = setContentAnimate; diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/index.d.ts b/src/miniprogram_npm/@vant/weapp/collapse-item/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/index.js b/src/miniprogram_npm/@vant/weapp/collapse-item/index.js new file mode 100644 index 0000000..a8035e7 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/index.js @@ -0,0 +1,63 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var relation_1 = require("../common/relation"); +var animate_1 = require("./animate"); +(0, component_1.VantComponent)({ + classes: ['title-class', 'content-class'], + relation: (0, relation_1.useParent)('collapse'), + props: { + size: String, + name: null, + title: null, + value: null, + icon: String, + label: String, + disabled: Boolean, + clickable: Boolean, + border: { + type: Boolean, + value: true, + }, + isLink: { + type: Boolean, + value: true, + }, + }, + data: { + expanded: false, + parentBorder: true, + }, + mounted: function () { + this.updateExpanded(); + this.mounted = true; + }, + methods: { + updateExpanded: function () { + if (!this.parent) { + return; + } + var _a = this.parent.data, value = _a.value, accordion = _a.accordion, border = _a.border; + var _b = this.parent.children, children = _b === void 0 ? [] : _b; + var name = this.data.name; + var index = children.indexOf(this); + var currentName = name == null ? index : name; + var expanded = accordion + ? value === currentName + : (value || []).some(function (name) { return name === currentName; }); + if (expanded !== this.data.expanded) { + (0, animate_1.setContentAnimate)(this, expanded, this.mounted); + } + this.setData({ index: index, expanded: expanded, parentBorder: border }); + }, + onClick: function () { + if (this.data.disabled) { + return; + } + var _a = this.data, name = _a.name, expanded = _a.expanded; + var index = this.parent.children.indexOf(this); + var currentName = name == null ? index : name; + this.parent.switch(currentName, !expanded); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/index.json b/src/miniprogram_npm/@vant/weapp/collapse-item/index.json new file mode 100644 index 0000000..0e5425c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-cell": "../cell/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/index.wxml b/src/miniprogram_npm/@vant/weapp/collapse-item/index.wxml new file mode 100644 index 0000000..23a27e4 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/index.wxml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/collapse-item/index.wxss b/src/miniprogram_npm/@vant/weapp/collapse-item/index.wxss new file mode 100644 index 0000000..4a65b5a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse-item/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-collapse-item__title .van-cell__right-icon{transform:rotate(90deg);transition:transform var(--collapse-item-transition-duration,.3s)}.van-collapse-item__title--expanded .van-cell__right-icon{transform:rotate(-90deg)}.van-collapse-item__title--disabled .van-cell,.van-collapse-item__title--disabled .van-cell__right-icon{color:var(--collapse-item-title-disabled-color,#c8c9cc)!important}.van-collapse-item__title--disabled .van-cell--hover{background-color:#fff!important}.van-collapse-item__wrapper{overflow:hidden}.van-collapse-item__content{background-color:var(--collapse-item-content-background-color,#fff);color:var(--collapse-item-content-text-color,#969799);font-size:var(--collapse-item-content-font-size,13px);line-height:var(--collapse-item-content-line-height,1.5);padding:var(--collapse-item-content-padding,15px)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/collapse/index.d.ts b/src/miniprogram_npm/@vant/weapp/collapse/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/collapse/index.js b/src/miniprogram_npm/@vant/weapp/collapse/index.js new file mode 100644 index 0000000..943d542 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse/index.js @@ -0,0 +1,48 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var relation_1 = require("../common/relation"); +(0, component_1.VantComponent)({ + relation: (0, relation_1.useChildren)('collapse-item'), + props: { + value: { + type: null, + observer: 'updateExpanded', + }, + accordion: { + type: Boolean, + observer: 'updateExpanded', + }, + border: { + type: Boolean, + value: true, + }, + }, + methods: { + updateExpanded: function () { + this.children.forEach(function (child) { + child.updateExpanded(); + }); + }, + switch: function (name, expanded) { + var _a = this.data, accordion = _a.accordion, value = _a.value; + var changeItem = name; + if (!accordion) { + name = expanded + ? (value || []).concat(name) + : (value || []).filter(function (activeName) { return activeName !== name; }); + } + else { + name = expanded ? name : ''; + } + if (expanded) { + this.$emit('open', changeItem); + } + else { + this.$emit('close', changeItem); + } + this.$emit('change', name); + this.$emit('input', name); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/collapse/index.json b/src/miniprogram_npm/@vant/weapp/collapse/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/collapse/index.wxml b/src/miniprogram_npm/@vant/weapp/collapse/index.wxml new file mode 100644 index 0000000..fd4e171 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/src/miniprogram_npm/@vant/weapp/collapse/index.wxss b/src/miniprogram_npm/@vant/weapp/collapse/index.wxss new file mode 100644 index 0000000..99694d6 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/collapse/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss'; \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/common/color.d.ts b/src/miniprogram_npm/@vant/weapp/common/color.d.ts new file mode 100644 index 0000000..386f307 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/color.d.ts @@ -0,0 +1,7 @@ +export declare const RED = "#ee0a24"; +export declare const BLUE = "#1989fa"; +export declare const WHITE = "#fff"; +export declare const GREEN = "#07c160"; +export declare const ORANGE = "#ff976a"; +export declare const GRAY = "#323233"; +export declare const GRAY_DARK = "#969799"; diff --git a/src/miniprogram_npm/@vant/weapp/common/color.js b/src/miniprogram_npm/@vant/weapp/common/color.js new file mode 100644 index 0000000..008a45a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/color.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GRAY_DARK = exports.GRAY = exports.ORANGE = exports.GREEN = exports.WHITE = exports.BLUE = exports.RED = void 0; +exports.RED = '#ee0a24'; +exports.BLUE = '#1989fa'; +exports.WHITE = '#fff'; +exports.GREEN = '#07c160'; +exports.ORANGE = '#ff976a'; +exports.GRAY = '#323233'; +exports.GRAY_DARK = '#969799'; diff --git a/src/miniprogram_npm/@vant/weapp/common/component.d.ts b/src/miniprogram_npm/@vant/weapp/common/component.d.ts new file mode 100644 index 0000000..1d0fd27 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/component.d.ts @@ -0,0 +1,4 @@ +/// +import { VantComponentOptions } from 'definitions/index'; +declare function VantComponent(vantOptions: VantComponentOptions): void; +export { VantComponent }; diff --git a/src/miniprogram_npm/@vant/weapp/common/component.js b/src/miniprogram_npm/@vant/weapp/common/component.js new file mode 100644 index 0000000..66da00e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/component.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VantComponent = void 0; +var basic_1 = require("../mixins/basic"); +function mapKeys(source, target, map) { + Object.keys(map).forEach(function (key) { + if (source[key]) { + target[map[key]] = source[key]; + } + }); +} +function VantComponent(vantOptions) { + var options = {}; + mapKeys(vantOptions, options, { + data: 'data', + props: 'properties', + watch: 'observers', + mixins: 'behaviors', + methods: 'methods', + beforeCreate: 'created', + created: 'attached', + mounted: 'ready', + destroyed: 'detached', + classes: 'externalClasses', + }); + // add default externalClasses + options.externalClasses = options.externalClasses || []; + options.externalClasses.push('custom-class'); + // add default behaviors + options.behaviors = options.behaviors || []; + options.behaviors.push(basic_1.basic); + // add relations + var relation = vantOptions.relation; + if (relation) { + options.relations = relation.relations; + options.behaviors.push(relation.mixin); + } + // map field to form-field behavior + if (vantOptions.field) { + options.behaviors.push('wx://form-field'); + } + // add default options + options.options = { + multipleSlots: true, + addGlobalClass: true, + }; + Component(options); +} +exports.VantComponent = VantComponent; diff --git a/src/miniprogram_npm/@vant/weapp/common/index.wxss b/src/miniprogram_npm/@vant/weapp/common/index.wxss new file mode 100644 index 0000000..a73bb7a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/index.wxss @@ -0,0 +1 @@ +.van-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{clear:both;content:"";display:table}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{border:0 solid #ebedf0;bottom:-50%;box-sizing:border-box;content:" ";left:-50%;pointer-events:none;position:absolute;right:-50%;top:-50%;transform:scale(.5);transform-origin:center}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/common/relation.d.ts b/src/miniprogram_npm/@vant/weapp/common/relation.d.ts new file mode 100644 index 0000000..10193fa --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/relation.d.ts @@ -0,0 +1,15 @@ +/// +type TrivialInstance = WechatMiniprogram.Component.TrivialInstance; +export declare function useParent(name: string, onEffect?: (this: TrivialInstance) => void): { + relations: { + [x: string]: WechatMiniprogram.Component.RelationOption; + }; + mixin: string; +}; +export declare function useChildren(name: string, onEffect?: (this: TrivialInstance, target: TrivialInstance) => void): { + relations: { + [x: string]: WechatMiniprogram.Component.RelationOption; + }; + mixin: string; +}; +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/common/relation.js b/src/miniprogram_npm/@vant/weapp/common/relation.js new file mode 100644 index 0000000..008256c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/relation.js @@ -0,0 +1,65 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.useChildren = exports.useParent = void 0; +function useParent(name, onEffect) { + var _a; + var path = "../".concat(name, "/index"); + return { + relations: (_a = {}, + _a[path] = { + type: 'ancestor', + linked: function () { + onEffect && onEffect.call(this); + }, + linkChanged: function () { + onEffect && onEffect.call(this); + }, + unlinked: function () { + onEffect && onEffect.call(this); + }, + }, + _a), + mixin: Behavior({ + created: function () { + var _this = this; + Object.defineProperty(this, 'parent', { + get: function () { return _this.getRelationNodes(path)[0]; }, + }); + Object.defineProperty(this, 'index', { + // @ts-ignore + get: function () { var _a, _b; return (_b = (_a = _this.parent) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.indexOf(_this); }, + }); + }, + }), + }; +} +exports.useParent = useParent; +function useChildren(name, onEffect) { + var _a; + var path = "../".concat(name, "/index"); + return { + relations: (_a = {}, + _a[path] = { + type: 'descendant', + linked: function (target) { + onEffect && onEffect.call(this, target); + }, + linkChanged: function (target) { + onEffect && onEffect.call(this, target); + }, + unlinked: function (target) { + onEffect && onEffect.call(this, target); + }, + }, + _a), + mixin: Behavior({ + created: function () { + var _this = this; + Object.defineProperty(this, 'children', { + get: function () { return _this.getRelationNodes(path) || []; }, + }); + }, + }), + }; +} +exports.useChildren = useChildren; diff --git a/src/miniprogram_npm/@vant/weapp/common/style/clearfix.wxss b/src/miniprogram_npm/@vant/weapp/common/style/clearfix.wxss new file mode 100644 index 0000000..442246f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/style/clearfix.wxss @@ -0,0 +1 @@ +.van-clearfix:after{clear:both;content:"";display:table} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/common/style/ellipsis.wxss b/src/miniprogram_npm/@vant/weapp/common/style/ellipsis.wxss new file mode 100644 index 0000000..ee701df --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/style/ellipsis.wxss @@ -0,0 +1 @@ +.van-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}.van-multi-ellipsis--l3{-webkit-line-clamp:3} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/common/style/hairline.wxss b/src/miniprogram_npm/@vant/weapp/common/style/hairline.wxss new file mode 100644 index 0000000..f7c6260 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/style/hairline.wxss @@ -0,0 +1 @@ +.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{border:0 solid #ebedf0;bottom:-50%;box-sizing:border-box;content:" ";left:-50%;pointer-events:none;position:absolute;right:-50%;top:-50%;transform:scale(.5);transform-origin:center}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/common/style/mixins/clearfix.wxss b/src/miniprogram_npm/@vant/weapp/common/style/mixins/clearfix.wxss new file mode 100644 index 0000000..e69de29 diff --git a/src/miniprogram_npm/@vant/weapp/common/style/mixins/ellipsis.wxss b/src/miniprogram_npm/@vant/weapp/common/style/mixins/ellipsis.wxss new file mode 100644 index 0000000..e69de29 diff --git a/src/miniprogram_npm/@vant/weapp/common/style/mixins/hairline.wxss b/src/miniprogram_npm/@vant/weapp/common/style/mixins/hairline.wxss new file mode 100644 index 0000000..e69de29 diff --git a/src/miniprogram_npm/@vant/weapp/common/style/var.wxss b/src/miniprogram_npm/@vant/weapp/common/style/var.wxss new file mode 100644 index 0000000..e69de29 diff --git a/src/miniprogram_npm/@vant/weapp/common/utils.d.ts b/src/miniprogram_npm/@vant/weapp/common/utils.d.ts new file mode 100644 index 0000000..a77d8c6 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/utils.d.ts @@ -0,0 +1,21 @@ +/// +/// +/// +/// +/// +export { isDef } from './validator'; +export { getSystemInfoSync } from './version'; +export declare function range(num: number, min: number, max: number): number; +export declare function nextTick(cb: (...args: any[]) => void): void; +export declare function addUnit(value?: string | number): string | undefined; +export declare function requestAnimationFrame(cb: () => void): NodeJS.Timeout; +export declare function pickExclude(obj: unknown, keys: string[]): {}; +export declare function getRect(context: WechatMiniprogram.Component.TrivialInstance, selector: string): Promise; +export declare function getAllRect(context: WechatMiniprogram.Component.TrivialInstance, selector: string): Promise; +export declare function groupSetData(context: WechatMiniprogram.Component.TrivialInstance, cb: () => void): void; +export declare function toPromise(promiseLike: Promise | unknown): Promise; +export declare function addNumber(num1: any, num2: any): number; +export declare const clamp: (num: any, min: any, max: any) => number; +export declare function getCurrentPage(): T & WechatMiniprogram.OptionalInterface & WechatMiniprogram.Page.InstanceProperties & WechatMiniprogram.Page.InstanceMethods & WechatMiniprogram.Page.Data & WechatMiniprogram.IAnyObject; +export declare const isPC: boolean; +export declare const isWxWork: boolean; diff --git a/src/miniprogram_npm/@vant/weapp/common/utils.js b/src/miniprogram_npm/@vant/weapp/common/utils.js new file mode 100644 index 0000000..1727628 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/utils.js @@ -0,0 +1,109 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isWxWork = exports.isPC = exports.getCurrentPage = exports.clamp = exports.addNumber = exports.toPromise = exports.groupSetData = exports.getAllRect = exports.getRect = exports.pickExclude = exports.requestAnimationFrame = exports.addUnit = exports.nextTick = exports.range = exports.getSystemInfoSync = exports.isDef = void 0; +var validator_1 = require("./validator"); +var version_1 = require("./version"); +var validator_2 = require("./validator"); +Object.defineProperty(exports, "isDef", { enumerable: true, get: function () { return validator_2.isDef; } }); +var version_2 = require("./version"); +Object.defineProperty(exports, "getSystemInfoSync", { enumerable: true, get: function () { return version_2.getSystemInfoSync; } }); +function range(num, min, max) { + return Math.min(Math.max(num, min), max); +} +exports.range = range; +function nextTick(cb) { + if ((0, version_1.canIUseNextTick)()) { + wx.nextTick(cb); + } + else { + setTimeout(function () { + cb(); + }, 1000 / 30); + } +} +exports.nextTick = nextTick; +function addUnit(value) { + if (!(0, validator_1.isDef)(value)) { + return undefined; + } + value = String(value); + return (0, validator_1.isNumber)(value) ? "".concat(value, "px") : value; +} +exports.addUnit = addUnit; +function requestAnimationFrame(cb) { + return setTimeout(function () { + cb(); + }, 1000 / 30); +} +exports.requestAnimationFrame = requestAnimationFrame; +function pickExclude(obj, keys) { + if (!(0, validator_1.isPlainObject)(obj)) { + return {}; + } + return Object.keys(obj).reduce(function (prev, key) { + if (!keys.includes(key)) { + prev[key] = obj[key]; + } + return prev; + }, {}); +} +exports.pickExclude = pickExclude; +function getRect(context, selector) { + return new Promise(function (resolve) { + wx.createSelectorQuery() + .in(context) + .select(selector) + .boundingClientRect() + .exec(function (rect) { + if (rect === void 0) { rect = []; } + return resolve(rect[0]); + }); + }); +} +exports.getRect = getRect; +function getAllRect(context, selector) { + return new Promise(function (resolve) { + wx.createSelectorQuery() + .in(context) + .selectAll(selector) + .boundingClientRect() + .exec(function (rect) { + if (rect === void 0) { rect = []; } + return resolve(rect[0]); + }); + }); +} +exports.getAllRect = getAllRect; +function groupSetData(context, cb) { + if ((0, version_1.canIUseGroupSetData)()) { + context.groupSetData(cb); + } + else { + cb(); + } +} +exports.groupSetData = groupSetData; +function toPromise(promiseLike) { + if ((0, validator_1.isPromise)(promiseLike)) { + return promiseLike; + } + return Promise.resolve(promiseLike); +} +exports.toPromise = toPromise; +// 浮点数精度处理 +function addNumber(num1, num2) { + var cardinal = Math.pow(10, 10); + return Math.round((num1 + num2) * cardinal) / cardinal; +} +exports.addNumber = addNumber; +// 限制value在[min, max]之间 +var clamp = function (num, min, max) { return Math.min(Math.max(num, min), max); }; +exports.clamp = clamp; +function getCurrentPage() { + var pages = getCurrentPages(); + return pages[pages.length - 1]; +} +exports.getCurrentPage = getCurrentPage; +exports.isPC = ['mac', 'windows'].includes((0, version_1.getSystemInfoSync)().platform); +// 是否企业微信 +exports.isWxWork = (0, version_1.getSystemInfoSync)().environment === 'wxwork'; diff --git a/src/miniprogram_npm/@vant/weapp/common/validator.d.ts b/src/miniprogram_npm/@vant/weapp/common/validator.d.ts new file mode 100644 index 0000000..152894a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/validator.d.ts @@ -0,0 +1,9 @@ +export declare function isFunction(val: unknown): val is Function; +export declare function isPlainObject(val: unknown): val is Record; +export declare function isPromise(val: unknown): val is Promise; +export declare function isDef(value: unknown): boolean; +export declare function isObj(x: unknown): x is Record; +export declare function isNumber(value: string): boolean; +export declare function isBoolean(value: unknown): value is boolean; +export declare function isImageUrl(url: string): boolean; +export declare function isVideoUrl(url: string): boolean; diff --git a/src/miniprogram_npm/@vant/weapp/common/validator.js b/src/miniprogram_npm/@vant/weapp/common/validator.js new file mode 100644 index 0000000..169e796 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/validator.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isVideoUrl = exports.isImageUrl = exports.isBoolean = exports.isNumber = exports.isObj = exports.isDef = exports.isPromise = exports.isPlainObject = exports.isFunction = void 0; +// eslint-disable-next-line @typescript-eslint/ban-types +function isFunction(val) { + return typeof val === 'function'; +} +exports.isFunction = isFunction; +function isPlainObject(val) { + return val !== null && typeof val === 'object' && !Array.isArray(val); +} +exports.isPlainObject = isPlainObject; +function isPromise(val) { + return isPlainObject(val) && isFunction(val.then) && isFunction(val.catch); +} +exports.isPromise = isPromise; +function isDef(value) { + return value !== undefined && value !== null; +} +exports.isDef = isDef; +function isObj(x) { + var type = typeof x; + return x !== null && (type === 'object' || type === 'function'); +} +exports.isObj = isObj; +function isNumber(value) { + return /^\d+(\.\d+)?$/.test(value); +} +exports.isNumber = isNumber; +function isBoolean(value) { + return typeof value === 'boolean'; +} +exports.isBoolean = isBoolean; +var IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i; +var VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv)/i; +function isImageUrl(url) { + return IMAGE_REGEXP.test(url); +} +exports.isImageUrl = isImageUrl; +function isVideoUrl(url) { + return VIDEO_REGEXP.test(url); +} +exports.isVideoUrl = isVideoUrl; diff --git a/src/miniprogram_npm/@vant/weapp/common/version.d.ts b/src/miniprogram_npm/@vant/weapp/common/version.d.ts new file mode 100644 index 0000000..3393221 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/version.d.ts @@ -0,0 +1,15 @@ +/// +interface WxWorkSystemInfo extends WechatMiniprogram.SystemInfo { + environment?: 'wxwork'; +} +interface SystemInfo extends WxWorkSystemInfo, WechatMiniprogram.SystemInfo { +} +export declare function getSystemInfoSync(): SystemInfo; +export declare function canIUseModel(): boolean; +export declare function canIUseFormFieldButton(): boolean; +export declare function canIUseAnimate(): boolean; +export declare function canIUseGroupSetData(): boolean; +export declare function canIUseNextTick(): boolean; +export declare function canIUseCanvas2d(): boolean; +export declare function canIUseGetUserProfile(): boolean; +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/common/version.js b/src/miniprogram_npm/@vant/weapp/common/version.js new file mode 100644 index 0000000..5937008 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/common/version.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.canIUseGetUserProfile = exports.canIUseCanvas2d = exports.canIUseNextTick = exports.canIUseGroupSetData = exports.canIUseAnimate = exports.canIUseFormFieldButton = exports.canIUseModel = exports.getSystemInfoSync = void 0; +var systemInfo; +function getSystemInfoSync() { + if (systemInfo == null) { + systemInfo = wx.getSystemInfoSync(); + } + return systemInfo; +} +exports.getSystemInfoSync = getSystemInfoSync; +function compareVersion(v1, v2) { + v1 = v1.split('.'); + v2 = v2.split('.'); + var len = Math.max(v1.length, v2.length); + while (v1.length < len) { + v1.push('0'); + } + while (v2.length < len) { + v2.push('0'); + } + for (var i = 0; i < len; i++) { + var num1 = parseInt(v1[i], 10); + var num2 = parseInt(v2[i], 10); + if (num1 > num2) { + return 1; + } + if (num1 < num2) { + return -1; + } + } + return 0; +} +function gte(version) { + var system = getSystemInfoSync(); + return compareVersion(system.SDKVersion, version) >= 0; +} +function canIUseModel() { + return gte('2.9.3'); +} +exports.canIUseModel = canIUseModel; +function canIUseFormFieldButton() { + return gte('2.10.3'); +} +exports.canIUseFormFieldButton = canIUseFormFieldButton; +function canIUseAnimate() { + return gte('2.9.0'); +} +exports.canIUseAnimate = canIUseAnimate; +function canIUseGroupSetData() { + return gte('2.4.0'); +} +exports.canIUseGroupSetData = canIUseGroupSetData; +function canIUseNextTick() { + try { + return wx.canIUse('nextTick'); + } + catch (e) { + return gte('2.7.1'); + } +} +exports.canIUseNextTick = canIUseNextTick; +function canIUseCanvas2d() { + return gte('2.9.0'); +} +exports.canIUseCanvas2d = canIUseCanvas2d; +function canIUseGetUserProfile() { + return !!wx.getUserProfile; +} +exports.canIUseGetUserProfile = canIUseGetUserProfile; diff --git a/src/miniprogram_npm/@vant/weapp/config-provider/index.d.ts b/src/miniprogram_npm/@vant/weapp/config-provider/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/config-provider/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/config-provider/index.js b/src/miniprogram_npm/@vant/weapp/config-provider/index.js new file mode 100644 index 0000000..21fb1c4 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/config-provider/index.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + props: { + themeVars: { + type: Object, + value: {}, + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/config-provider/index.json b/src/miniprogram_npm/@vant/weapp/config-provider/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/config-provider/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/config-provider/index.wxml b/src/miniprogram_npm/@vant/weapp/config-provider/index.wxml new file mode 100644 index 0000000..3cfb461 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/config-provider/index.wxml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/config-provider/index.wxs b/src/miniprogram_npm/@vant/weapp/config-provider/index.wxs new file mode 100644 index 0000000..7ca0203 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/config-provider/index.wxs @@ -0,0 +1,29 @@ +/* eslint-disable */ +var object = require('../wxs/object.wxs'); +var style = require('../wxs/style.wxs'); + +function kebabCase(word) { + var newWord = word + .replace(getRegExp("[A-Z]", 'g'), function (i) { + return '-' + i; + }) + .toLowerCase() + .replace(getRegExp("^-"), ''); + + return newWord; +} + +function mapThemeVarsToCSSVars(themeVars) { + var cssVars = {}; + object.keys(themeVars).forEach(function (key) { + var cssVarsKey = '--' + kebabCase(key); + cssVars[cssVarsKey] = themeVars[key]; + }); + + return style(cssVars); +} + +module.exports = { + kebabCase: kebabCase, + mapThemeVarsToCSSVars: mapThemeVarsToCSSVars, +}; diff --git a/src/miniprogram_npm/@vant/weapp/count-down/index.d.ts b/src/miniprogram_npm/@vant/weapp/count-down/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/count-down/index.js b/src/miniprogram_npm/@vant/weapp/count-down/index.js new file mode 100644 index 0000000..afc780b --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/index.js @@ -0,0 +1,104 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var utils_1 = require("./utils"); +function simpleTick(fn) { + return setTimeout(fn, 30); +} +(0, component_1.VantComponent)({ + props: { + useSlot: Boolean, + millisecond: Boolean, + time: { + type: Number, + observer: 'reset', + }, + format: { + type: String, + value: 'HH:mm:ss', + }, + autoStart: { + type: Boolean, + value: true, + }, + }, + data: { + timeData: (0, utils_1.parseTimeData)(0), + formattedTime: '0', + }, + destroyed: function () { + clearTimeout(this.tid); + this.tid = null; + }, + methods: { + // 开始 + start: function () { + if (this.counting) { + return; + } + this.counting = true; + this.endTime = Date.now() + this.remain; + this.tick(); + }, + // 暂停 + pause: function () { + this.counting = false; + clearTimeout(this.tid); + }, + // 重置 + reset: function () { + this.pause(); + this.remain = this.data.time; + this.setRemain(this.remain); + if (this.data.autoStart) { + this.start(); + } + }, + tick: function () { + if (this.data.millisecond) { + this.microTick(); + } + else { + this.macroTick(); + } + }, + microTick: function () { + var _this = this; + this.tid = simpleTick(function () { + _this.setRemain(_this.getRemain()); + if (_this.remain !== 0) { + _this.microTick(); + } + }); + }, + macroTick: function () { + var _this = this; + this.tid = simpleTick(function () { + var remain = _this.getRemain(); + if (!(0, utils_1.isSameSecond)(remain, _this.remain) || remain === 0) { + _this.setRemain(remain); + } + if (_this.remain !== 0) { + _this.macroTick(); + } + }); + }, + getRemain: function () { + return Math.max(this.endTime - Date.now(), 0); + }, + setRemain: function (remain) { + this.remain = remain; + var timeData = (0, utils_1.parseTimeData)(remain); + if (this.data.useSlot) { + this.$emit('change', timeData); + } + this.setData({ + formattedTime: (0, utils_1.parseFormat)(this.data.format, timeData), + }); + if (remain === 0) { + this.pause(); + this.$emit('finish'); + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/count-down/index.json b/src/miniprogram_npm/@vant/weapp/count-down/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/count-down/index.wxml b/src/miniprogram_npm/@vant/weapp/count-down/index.wxml new file mode 100644 index 0000000..e206e16 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/index.wxml @@ -0,0 +1,4 @@ + + + {{ formattedTime }} + diff --git a/src/miniprogram_npm/@vant/weapp/count-down/index.wxss b/src/miniprogram_npm/@vant/weapp/count-down/index.wxss new file mode 100644 index 0000000..8b957f7 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-count-down{color:var(--count-down-text-color,#323233);font-size:var(--count-down-font-size,14px);line-height:var(--count-down-line-height,20px)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/count-down/utils.d.ts b/src/miniprogram_npm/@vant/weapp/count-down/utils.d.ts new file mode 100644 index 0000000..876a6c1 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/utils.d.ts @@ -0,0 +1,10 @@ +export type TimeData = { + days: number; + hours: number; + minutes: number; + seconds: number; + milliseconds: number; +}; +export declare function parseTimeData(time: number): TimeData; +export declare function parseFormat(format: string, timeData: TimeData): string; +export declare function isSameSecond(time1: number, time2: number): boolean; diff --git a/src/miniprogram_npm/@vant/weapp/count-down/utils.js b/src/miniprogram_npm/@vant/weapp/count-down/utils.js new file mode 100644 index 0000000..a7cfa5f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/count-down/utils.js @@ -0,0 +1,64 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isSameSecond = exports.parseFormat = exports.parseTimeData = void 0; +function padZero(num, targetLength) { + if (targetLength === void 0) { targetLength = 2; } + var str = num + ''; + while (str.length < targetLength) { + str = '0' + str; + } + return str; +} +var SECOND = 1000; +var MINUTE = 60 * SECOND; +var HOUR = 60 * MINUTE; +var DAY = 24 * HOUR; +function parseTimeData(time) { + var days = Math.floor(time / DAY); + var hours = Math.floor((time % DAY) / HOUR); + var minutes = Math.floor((time % HOUR) / MINUTE); + var seconds = Math.floor((time % MINUTE) / SECOND); + var milliseconds = Math.floor(time % SECOND); + return { + days: days, + hours: hours, + minutes: minutes, + seconds: seconds, + milliseconds: milliseconds, + }; +} +exports.parseTimeData = parseTimeData; +function parseFormat(format, timeData) { + var days = timeData.days; + var hours = timeData.hours, minutes = timeData.minutes, seconds = timeData.seconds, milliseconds = timeData.milliseconds; + if (format.indexOf('DD') === -1) { + hours += days * 24; + } + else { + format = format.replace('DD', padZero(days)); + } + if (format.indexOf('HH') === -1) { + minutes += hours * 60; + } + else { + format = format.replace('HH', padZero(hours)); + } + if (format.indexOf('mm') === -1) { + seconds += minutes * 60; + } + else { + format = format.replace('mm', padZero(minutes)); + } + if (format.indexOf('ss') === -1) { + milliseconds += seconds * 1000; + } + else { + format = format.replace('ss', padZero(seconds)); + } + return format.replace('SSS', padZero(milliseconds, 3)); +} +exports.parseFormat = parseFormat; +function isSameSecond(time1, time2) { + return Math.floor(time1 / 1000) === Math.floor(time2 / 1000); +} +exports.isSameSecond = isSameSecond; diff --git a/src/miniprogram_npm/@vant/weapp/datetime-picker/index.d.ts b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/datetime-picker/index.js b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.js new file mode 100644 index 0000000..e30afef --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.js @@ -0,0 +1,329 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var validator_1 = require("../common/validator"); +var shared_1 = require("../picker/shared"); +var currentYear = new Date().getFullYear(); +function isValidDate(date) { + return (0, validator_1.isDef)(date) && !isNaN(new Date(date).getTime()); +} +function range(num, min, max) { + return Math.min(Math.max(num, min), max); +} +function padZero(val) { + return "00".concat(val).slice(-2); +} +function times(n, iteratee) { + var index = -1; + var result = Array(n < 0 ? 0 : n); + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} +function getTrueValue(formattedValue) { + if (formattedValue === undefined) { + formattedValue = '1'; + } + while (isNaN(parseInt(formattedValue, 10))) { + formattedValue = formattedValue.slice(1); + } + return parseInt(formattedValue, 10); +} +function getMonthEndDay(year, month) { + return 32 - new Date(year, month - 1, 32).getDate(); +} +var defaultFormatter = function (type, value) { return value; }; +(0, component_1.VantComponent)({ + classes: ['active-class', 'toolbar-class', 'column-class'], + props: __assign(__assign({}, shared_1.pickerProps), { value: { + type: null, + observer: 'updateValue', + }, filter: null, type: { + type: String, + value: 'datetime', + observer: 'updateValue', + }, showToolbar: { + type: Boolean, + value: true, + }, formatter: { + type: null, + value: defaultFormatter, + }, minDate: { + type: Number, + value: new Date(currentYear - 10, 0, 1).getTime(), + observer: 'updateValue', + }, maxDate: { + type: Number, + value: new Date(currentYear + 10, 11, 31).getTime(), + observer: 'updateValue', + }, minHour: { + type: Number, + value: 0, + observer: 'updateValue', + }, maxHour: { + type: Number, + value: 23, + observer: 'updateValue', + }, minMinute: { + type: Number, + value: 0, + observer: 'updateValue', + }, maxMinute: { + type: Number, + value: 59, + observer: 'updateValue', + } }), + data: { + innerValue: Date.now(), + columns: [], + }, + methods: { + updateValue: function () { + var _this = this; + var data = this.data; + var val = this.correctValue(data.value); + var isEqual = val === data.innerValue; + this.updateColumnValue(val).then(function () { + if (!isEqual) { + _this.$emit('input', val); + } + }); + }, + getPicker: function () { + if (this.picker == null) { + this.picker = this.selectComponent('.van-datetime-picker'); + var picker_1 = this.picker; + var setColumnValues_1 = picker_1.setColumnValues; + picker_1.setColumnValues = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return setColumnValues_1.apply(picker_1, __spreadArray(__spreadArray([], args, true), [false], false)); + }; + } + return this.picker; + }, + updateColumns: function () { + var _a = this.data.formatter, formatter = _a === void 0 ? defaultFormatter : _a; + var results = this.getOriginColumns().map(function (column) { return ({ + values: column.values.map(function (value) { return formatter(column.type, value); }), + }); }); + return this.set({ columns: results }); + }, + getOriginColumns: function () { + var filter = this.data.filter; + var results = this.getRanges().map(function (_a) { + var type = _a.type, range = _a.range; + var values = times(range[1] - range[0] + 1, function (index) { + var value = range[0] + index; + return type === 'year' ? "".concat(value) : padZero(value); + }); + if (filter) { + values = filter(type, values); + } + return { type: type, values: values }; + }); + return results; + }, + getRanges: function () { + var data = this.data; + if (data.type === 'time') { + return [ + { + type: 'hour', + range: [data.minHour, data.maxHour], + }, + { + type: 'minute', + range: [data.minMinute, data.maxMinute], + }, + ]; + } + var _a = this.getBoundary('max', data.innerValue), maxYear = _a.maxYear, maxDate = _a.maxDate, maxMonth = _a.maxMonth, maxHour = _a.maxHour, maxMinute = _a.maxMinute; + var _b = this.getBoundary('min', data.innerValue), minYear = _b.minYear, minDate = _b.minDate, minMonth = _b.minMonth, minHour = _b.minHour, minMinute = _b.minMinute; + var result = [ + { + type: 'year', + range: [minYear, maxYear], + }, + { + type: 'month', + range: [minMonth, maxMonth], + }, + { + type: 'day', + range: [minDate, maxDate], + }, + { + type: 'hour', + range: [minHour, maxHour], + }, + { + type: 'minute', + range: [minMinute, maxMinute], + }, + ]; + if (data.type === 'date') + result.splice(3, 2); + if (data.type === 'year-month') + result.splice(2, 3); + return result; + }, + correctValue: function (value) { + var data = this.data; + // validate value + var isDateType = data.type !== 'time'; + if (isDateType && !isValidDate(value)) { + value = data.minDate; + } + else if (!isDateType && !value) { + var minHour = data.minHour; + value = "".concat(padZero(minHour), ":00"); + } + // time type + if (!isDateType) { + var _a = value.split(':'), hour = _a[0], minute = _a[1]; + hour = padZero(range(hour, data.minHour, data.maxHour)); + minute = padZero(range(minute, data.minMinute, data.maxMinute)); + return "".concat(hour, ":").concat(minute); + } + // date type + value = Math.max(value, data.minDate); + value = Math.min(value, data.maxDate); + return value; + }, + getBoundary: function (type, innerValue) { + var _a; + var value = new Date(innerValue); + var boundary = new Date(this.data["".concat(type, "Date")]); + var year = boundary.getFullYear(); + var month = 1; + var date = 1; + var hour = 0; + var minute = 0; + if (type === 'max') { + month = 12; + date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1); + hour = 23; + minute = 59; + } + if (value.getFullYear() === year) { + month = boundary.getMonth() + 1; + if (value.getMonth() + 1 === month) { + date = boundary.getDate(); + if (value.getDate() === date) { + hour = boundary.getHours(); + if (value.getHours() === hour) { + minute = boundary.getMinutes(); + } + } + } + } + return _a = {}, + _a["".concat(type, "Year")] = year, + _a["".concat(type, "Month")] = month, + _a["".concat(type, "Date")] = date, + _a["".concat(type, "Hour")] = hour, + _a["".concat(type, "Minute")] = minute, + _a; + }, + onCancel: function () { + this.$emit('cancel'); + }, + onConfirm: function () { + this.$emit('confirm', this.data.innerValue); + }, + onChange: function () { + var _this = this; + var data = this.data; + var value; + var picker = this.getPicker(); + var originColumns = this.getOriginColumns(); + if (data.type === 'time') { + var indexes = picker.getIndexes(); + value = "".concat(+originColumns[0].values[indexes[0]], ":").concat(+originColumns[1] + .values[indexes[1]]); + } + else { + var indexes = picker.getIndexes(); + var values = indexes.map(function (value, index) { return originColumns[index].values[value]; }); + var year = getTrueValue(values[0]); + var month = getTrueValue(values[1]); + var maxDate = getMonthEndDay(year, month); + var date = getTrueValue(values[2]); + if (data.type === 'year-month') { + date = 1; + } + date = date > maxDate ? maxDate : date; + var hour = 0; + var minute = 0; + if (data.type === 'datetime') { + hour = getTrueValue(values[3]); + minute = getTrueValue(values[4]); + } + value = new Date(year, month - 1, date, hour, minute); + } + value = this.correctValue(value); + this.updateColumnValue(value).then(function () { + _this.$emit('input', value); + _this.$emit('change', picker); + }); + }, + updateColumnValue: function (value) { + var _this = this; + var values = []; + var type = this.data.type; + var formatter = this.data.formatter || defaultFormatter; + var picker = this.getPicker(); + if (type === 'time') { + var pair = value.split(':'); + values = [formatter('hour', pair[0]), formatter('minute', pair[1])]; + } + else { + var date = new Date(value); + values = [ + formatter('year', "".concat(date.getFullYear())), + formatter('month', padZero(date.getMonth() + 1)), + ]; + if (type === 'date') { + values.push(formatter('day', padZero(date.getDate()))); + } + if (type === 'datetime') { + values.push(formatter('day', padZero(date.getDate())), formatter('hour', padZero(date.getHours())), formatter('minute', padZero(date.getMinutes()))); + } + } + return this.set({ innerValue: value }) + .then(function () { return _this.updateColumns(); }) + .then(function () { return picker.setValues(values); }); + }, + }, + created: function () { + var _this = this; + var innerValue = this.correctValue(this.data.value); + this.updateColumnValue(innerValue).then(function () { + _this.$emit('input', innerValue); + }); + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/datetime-picker/index.json b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.json new file mode 100644 index 0000000..a778e91 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-picker": "../picker/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxml b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxml new file mode 100644 index 0000000..ade2202 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxml @@ -0,0 +1,16 @@ + diff --git a/src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxss b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxss new file mode 100644 index 0000000..99694d6 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/datetime-picker/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss'; \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/definitions/index.d.ts b/src/miniprogram_npm/@vant/weapp/definitions/index.d.ts new file mode 100644 index 0000000..c90321f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/definitions/index.d.ts @@ -0,0 +1,29 @@ +/// +interface VantComponentInstance { + parent: WechatMiniprogram.Component.TrivialInstance; + children: WechatMiniprogram.Component.TrivialInstance[]; + index: number; + $emit: (name: string, detail?: unknown, options?: WechatMiniprogram.Component.TriggerEventOption) => void; + setView: (value: Record, callback?: () => void) => void; +} +export type VantComponentOptions = { + data?: Data; + field?: boolean; + classes?: string[]; + mixins?: string[]; + props?: Props; + relation?: { + relations: Record; + mixin: string; + }; + watch?: Record any>; + methods?: Methods; + beforeCreate?: () => void; + created?: () => void; + mounted?: () => void; + destroyed?: () => void; +} & ThisType, Props, Methods> & Record>; +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/definitions/index.js b/src/miniprogram_npm/@vant/weapp/definitions/index.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/definitions/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/src/miniprogram_npm/@vant/weapp/dialog/dialog.d.ts b/src/miniprogram_npm/@vant/weapp/dialog/dialog.d.ts new file mode 100644 index 0000000..db2da5f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/dialog.d.ts @@ -0,0 +1,55 @@ +/// +/// +export type Action = 'confirm' | 'cancel' | 'overlay'; +type DialogContext = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance; +interface DialogOptions { + lang?: string; + show?: boolean; + title?: string; + width?: string | number | null; + zIndex?: number; + theme?: string; + context?: (() => DialogContext) | DialogContext; + message?: string; + overlay?: boolean; + selector?: string; + ariaLabel?: string; + /** + * @deprecated use custom-class instead + */ + className?: string; + customStyle?: string; + transition?: string; + /** + * @deprecated use beforeClose instead + */ + asyncClose?: boolean; + beforeClose?: null | ((action: Action) => Promise | void); + businessId?: number; + sessionFrom?: string; + overlayStyle?: string; + appParameter?: string; + messageAlign?: string; + sendMessageImg?: string; + showMessageCard?: boolean; + sendMessagePath?: string; + sendMessageTitle?: string; + confirmButtonText?: string; + cancelButtonText?: string; + showConfirmButton?: boolean; + showCancelButton?: boolean; + closeOnClickOverlay?: boolean; + confirmButtonOpenType?: string; +} +declare const Dialog: { + (options: DialogOptions): Promise; + alert(options: DialogOptions): Promise; + confirm(options: DialogOptions): Promise; + close(): void; + stopLoading(): void; + currentOptions: DialogOptions; + defaultOptions: DialogOptions; + setDefaultOptions(options: DialogOptions): void; + resetDefaultOptions(): void; +}; +export default Dialog; diff --git a/src/miniprogram_npm/@vant/weapp/dialog/dialog.js b/src/miniprogram_npm/@vant/weapp/dialog/dialog.js new file mode 100644 index 0000000..400f4f1 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/dialog.js @@ -0,0 +1,92 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var queue = []; +var defaultOptions = { + show: false, + title: '', + width: null, + theme: 'default', + message: '', + zIndex: 100, + overlay: true, + selector: '#van-dialog', + className: '', + asyncClose: false, + beforeClose: null, + transition: 'scale', + customStyle: '', + messageAlign: '', + overlayStyle: '', + confirmButtonText: '确认', + cancelButtonText: '取消', + showConfirmButton: true, + showCancelButton: false, + closeOnClickOverlay: false, + confirmButtonOpenType: '', +}; +var currentOptions = __assign({}, defaultOptions); +function getContext() { + var pages = getCurrentPages(); + return pages[pages.length - 1]; +} +var Dialog = function (options) { + options = __assign(__assign({}, currentOptions), options); + return new Promise(function (resolve, reject) { + var context = (typeof options.context === 'function' + ? options.context() + : options.context) || getContext(); + var dialog = context.selectComponent(options.selector); + delete options.context; + delete options.selector; + if (dialog) { + dialog.setData(__assign({ callback: function (action, instance) { + action === 'confirm' ? resolve(instance) : reject(instance); + } }, options)); + wx.nextTick(function () { + dialog.setData({ show: true }); + }); + queue.push(dialog); + } + else { + console.warn('未找到 van-dialog 节点,请确认 selector 及 context 是否正确'); + } + }); +}; +Dialog.alert = function (options) { return Dialog(options); }; +Dialog.confirm = function (options) { + return Dialog(__assign({ showCancelButton: true }, options)); +}; +Dialog.close = function () { + queue.forEach(function (dialog) { + dialog.close(); + }); + queue = []; +}; +Dialog.stopLoading = function () { + queue.forEach(function (dialog) { + dialog.stopLoading(); + }); +}; +Dialog.currentOptions = currentOptions; +Dialog.defaultOptions = defaultOptions; +Dialog.setDefaultOptions = function (options) { + currentOptions = __assign(__assign({}, currentOptions), options); + Dialog.currentOptions = currentOptions; +}; +Dialog.resetDefaultOptions = function () { + currentOptions = __assign({}, defaultOptions); + Dialog.currentOptions = currentOptions; +}; +Dialog.resetDefaultOptions(); +exports.default = Dialog; diff --git a/src/miniprogram_npm/@vant/weapp/dialog/index.d.ts b/src/miniprogram_npm/@vant/weapp/dialog/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/dialog/index.js b/src/miniprogram_npm/@vant/weapp/dialog/index.js new file mode 100644 index 0000000..9bf4601 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/index.js @@ -0,0 +1,136 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var button_1 = require("../mixins/button"); +var color_1 = require("../common/color"); +var utils_1 = require("../common/utils"); +(0, component_1.VantComponent)({ + mixins: [button_1.button], + classes: ['cancle-button-class', 'confirm-button-class'], + props: { + show: { + type: Boolean, + observer: function (show) { + !show && this.stopLoading(); + }, + }, + title: String, + message: String, + theme: { + type: String, + value: 'default', + }, + confirmButtonId: String, + className: String, + customStyle: String, + asyncClose: Boolean, + messageAlign: String, + beforeClose: null, + overlayStyle: String, + useSlot: Boolean, + useTitleSlot: Boolean, + useConfirmButtonSlot: Boolean, + useCancelButtonSlot: Boolean, + showCancelButton: Boolean, + closeOnClickOverlay: Boolean, + confirmButtonOpenType: String, + width: null, + zIndex: { + type: Number, + value: 2000, + }, + confirmButtonText: { + type: String, + value: '确认', + }, + cancelButtonText: { + type: String, + value: '取消', + }, + confirmButtonColor: { + type: String, + value: color_1.RED, + }, + cancelButtonColor: { + type: String, + value: color_1.GRAY, + }, + showConfirmButton: { + type: Boolean, + value: true, + }, + overlay: { + type: Boolean, + value: true, + }, + transition: { + type: String, + value: 'scale', + }, + rootPortal: { + type: Boolean, + value: false, + }, + }, + data: { + loading: { + confirm: false, + cancel: false, + }, + callback: (function () { }), + }, + methods: { + onConfirm: function () { + this.handleAction('confirm'); + }, + onCancel: function () { + this.handleAction('cancel'); + }, + onClickOverlay: function () { + this.close('overlay'); + }, + close: function (action) { + this.setData({ show: false }); + this.closeAction = action; + }, + onAfterLeave: function () { + var action = this.closeAction; + this.$emit('close', action); + var callback = this.data.callback; + if (callback) { + callback(action, this); + } + }, + stopLoading: function () { + this.setData({ + loading: { + confirm: false, + cancel: false, + }, + }); + }, + handleAction: function (action) { + var _a; + var _this = this; + this.$emit(action, { dialog: this }); + var _b = this.data, asyncClose = _b.asyncClose, beforeClose = _b.beforeClose; + if (!asyncClose && !beforeClose) { + this.close(action); + return; + } + this.setData((_a = {}, + _a["loading.".concat(action)] = true, + _a)); + if (beforeClose) { + (0, utils_1.toPromise)(beforeClose(action)).then(function (value) { + if (value) { + _this.close(action); + } + else { + _this.stopLoading(); + } + }); + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/dialog/index.json b/src/miniprogram_npm/@vant/weapp/dialog/index.json new file mode 100644 index 0000000..43417fc --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "../popup/index", + "van-button": "../button/index", + "van-goods-action": "../goods-action/index", + "van-goods-action-button": "../goods-action-button/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/dialog/index.wxml b/src/miniprogram_npm/@vant/weapp/dialog/index.wxml new file mode 100644 index 0000000..99a6264 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/index.wxml @@ -0,0 +1,126 @@ + + + + + + {{ title }} + + + + + {{ message }} + + + + + {{ cancelButtonText }} + + + {{ confirmButtonText }} + + + + + + + + + {{ cancelButtonText }} + + + + + + + + {{ confirmButtonText }} + + + + diff --git a/src/miniprogram_npm/@vant/weapp/dialog/index.wxss b/src/miniprogram_npm/@vant/weapp/dialog/index.wxss new file mode 100644 index 0000000..507a789 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dialog/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-dialog{background-color:var(--dialog-background-color,#fff);border-radius:var(--dialog-border-radius,16px);font-size:var(--dialog-font-size,16px);overflow:hidden;top:45%!important;width:var(--dialog-width,320px)}@media (max-width:321px){.van-dialog{width:var(--dialog-small-screen-width,90%)}}.van-dialog__header{font-weight:var(--dialog-header-font-weight,500);line-height:var(--dialog-header-line-height,24px);padding-top:var(--dialog-header-padding-top,24px);text-align:center}.van-dialog__header--isolated{padding:var(--dialog-header-isolated-padding,24px 0)}.van-dialog__message{-webkit-overflow-scrolling:touch;font-size:var(--dialog-message-font-size,14px);line-height:var(--dialog-message-line-height,20px);max-height:var(--dialog-message-max-height,60vh);overflow-y:auto;padding:var(--dialog-message-padding,24px);text-align:center}.van-dialog__message-text{word-wrap:break-word}.van-dialog__message--hasTitle{color:var(--dialog-has-title-message-text-color,#646566);padding-top:var(--dialog-has-title-message-padding-top,8px)}.van-dialog__message--round-button{color:#323233;padding-bottom:16px}.van-dialog__message--left{text-align:left}.van-dialog__message--right{text-align:right}.van-dialog__message--justify{text-align:justify}.van-dialog__footer{display:flex}.van-dialog__footer--round-button{padding:8px 24px 16px!important;position:relative!important}.van-dialog__button{flex:1}.van-dialog__cancel,.van-dialog__confirm{border:0!important}.van-dialog-bounce-enter{opacity:0;transform:translate3d(-50%,-50%,0) scale(.7)}.van-dialog-bounce-leave-active{opacity:0;transform:translate3d(-50%,-50%,0) scale(.9)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/divider/index.d.ts b/src/miniprogram_npm/@vant/weapp/divider/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/divider/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/divider/index.js b/src/miniprogram_npm/@vant/weapp/divider/index.js new file mode 100644 index 0000000..5c63844 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/divider/index.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + props: { + dashed: Boolean, + hairline: Boolean, + contentPosition: String, + fontSize: String, + borderColor: String, + textColor: String, + customStyle: String, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/divider/index.json b/src/miniprogram_npm/@vant/weapp/divider/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/divider/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/src/miniprogram_npm/@vant/weapp/divider/index.wxml b/src/miniprogram_npm/@vant/weapp/divider/index.wxml new file mode 100644 index 0000000..f6a5a45 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/divider/index.wxml @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/divider/index.wxs b/src/miniprogram_npm/@vant/weapp/divider/index.wxs new file mode 100644 index 0000000..215b14f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/divider/index.wxs @@ -0,0 +1,18 @@ +/* eslint-disable */ +var style = require('../wxs/style.wxs'); +var addUnit = require('../wxs/add-unit.wxs'); + +function rootStyle(data) { + return style([ + { + 'border-color': data.borderColor, + color: data.textColor, + 'font-size': addUnit(data.fontSize), + }, + data.customStyle, + ]); +} + +module.exports = { + rootStyle: rootStyle, +}; diff --git a/src/miniprogram_npm/@vant/weapp/divider/index.wxss b/src/miniprogram_npm/@vant/weapp/divider/index.wxss new file mode 100644 index 0000000..e91dc44 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/divider/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-divider{align-items:center;border:0 solid var(--divider-border-color,#ebedf0);color:var(--divider-text-color,#969799);display:flex;font-size:var(--divider-font-size,14px);line-height:var(--divider-line-height,24px);margin:var(--divider-margin,16px 0)}.van-divider:after,.van-divider:before{border-color:inherit;border-style:inherit;border-width:1px 0 0;box-sizing:border-box;display:block;flex:1;height:1px}.van-divider:before{content:""}.van-divider--hairline:after,.van-divider--hairline:before{transform:scaleY(.5)}.van-divider--dashed{border-style:dashed}.van-divider--center:before,.van-divider--left:before,.van-divider--right:before{margin-right:var(--divider-content-padding,16px)}.van-divider--center:after,.van-divider--left:after,.van-divider--right:after{content:"";margin-left:var(--divider-content-padding,16px)}.van-divider--left:before{max-width:var(--divider-content-left-width,10%)}.van-divider--right:after{max-width:var(--divider-content-right-width,10%)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/index.d.ts b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/index.js b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.js new file mode 100644 index 0000000..826c26a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.js @@ -0,0 +1,136 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var relation_1 = require("../common/relation"); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + classes: ['item-title-class'], + field: true, + relation: (0, relation_1.useParent)('dropdown-menu', function () { + this.updateDataFromParent(); + }), + props: { + value: { + type: null, + observer: 'rerender', + }, + title: { + type: String, + observer: 'rerender', + }, + disabled: Boolean, + titleClass: { + type: String, + observer: 'rerender', + }, + options: { + type: Array, + value: [], + observer: 'rerender', + }, + popupStyle: String, + useBeforeToggle: { + type: Boolean, + value: false, + }, + rootPortal: { + type: Boolean, + value: false, + }, + }, + data: { + transition: true, + showPopup: false, + showWrapper: false, + displayTitle: '', + safeAreaTabBar: false, + }, + methods: { + rerender: function () { + var _this = this; + wx.nextTick(function () { + var _a; + (_a = _this.parent) === null || _a === void 0 ? void 0 : _a.updateItemListData(); + }); + }, + updateDataFromParent: function () { + if (this.parent) { + var _a = this.parent.data, overlay = _a.overlay, duration = _a.duration, activeColor = _a.activeColor, closeOnClickOverlay = _a.closeOnClickOverlay, direction = _a.direction, safeAreaTabBar = _a.safeAreaTabBar; + this.setData({ + overlay: overlay, + duration: duration, + activeColor: activeColor, + closeOnClickOverlay: closeOnClickOverlay, + direction: direction, + safeAreaTabBar: safeAreaTabBar, + }); + } + }, + onOpen: function () { + this.$emit('open'); + }, + onOpened: function () { + this.$emit('opened'); + }, + onClose: function () { + this.$emit('close'); + }, + onClosed: function () { + this.$emit('closed'); + this.setData({ showWrapper: false }); + }, + onOptionTap: function (event) { + var option = event.currentTarget.dataset.option; + var value = option.value; + var shouldEmitChange = this.data.value !== value; + this.setData({ showPopup: false, value: value }); + this.$emit('close'); + this.rerender(); + if (shouldEmitChange) { + this.$emit('change', value); + } + }, + toggle: function (show, options) { + var _this = this; + if (options === void 0) { options = {}; } + var showPopup = this.data.showPopup; + if (typeof show !== 'boolean') { + show = !showPopup; + } + if (show === showPopup) { + return; + } + this.onBeforeToggle(show).then(function (status) { + var _a; + if (!status) { + return; + } + _this.setData({ + transition: !options.immediate, + showPopup: show, + }); + if (show) { + (_a = _this.parent) === null || _a === void 0 ? void 0 : _a.getChildWrapperStyle().then(function (wrapperStyle) { + _this.setData({ wrapperStyle: wrapperStyle, showWrapper: true }); + _this.rerender(); + }); + } + else { + _this.rerender(); + } + }); + }, + onBeforeToggle: function (status) { + var _this = this; + var useBeforeToggle = this.data.useBeforeToggle; + if (!useBeforeToggle) { + return Promise.resolve(true); + } + return new Promise(function (resolve) { + _this.$emit('before-toggle', { + status: status, + callback: function (value) { return resolve(value); }, + }); + }); + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/index.json b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.json new file mode 100644 index 0000000..88d5409 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "../popup/index", + "van-cell": "../cell/index", + "van-icon": "../icon/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxml b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxml new file mode 100644 index 0000000..63904f4 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxml @@ -0,0 +1,50 @@ + + + + + + + {{ item.text }} + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxss b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxss new file mode 100644 index 0000000..80505e9 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-dropdown-item{left:0;overflow:hidden;position:fixed;right:0}.van-dropdown-item__option{text-align:left}.van-dropdown-item__option--active .van-dropdown-item__icon,.van-dropdown-item__option--active .van-dropdown-item__title{color:var(--dropdown-menu-option-active-color,#ee0a24)}.van-dropdown-item--up{top:0}.van-dropdown-item--down{bottom:0}.van-dropdown-item__icon{display:block;line-height:inherit} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/shared.d.ts b/src/miniprogram_npm/@vant/weapp/dropdown-item/shared.d.ts new file mode 100644 index 0000000..774eb4c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/shared.d.ts @@ -0,0 +1,5 @@ +export interface Option { + text: string; + value: string | number; + icon: string; +} diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-item/shared.js b/src/miniprogram_npm/@vant/weapp/dropdown-item/shared.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-item/shared.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.d.ts b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.js b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.js new file mode 100644 index 0000000..aed2921 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.js @@ -0,0 +1,122 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +var relation_1 = require("../common/relation"); +var utils_1 = require("../common/utils"); +var ARRAY = []; +(0, component_1.VantComponent)({ + field: true, + classes: ['title-class'], + relation: (0, relation_1.useChildren)('dropdown-item', function () { + this.updateItemListData(); + }), + props: { + activeColor: { + type: String, + observer: 'updateChildrenData', + }, + overlay: { + type: Boolean, + value: true, + observer: 'updateChildrenData', + }, + zIndex: { + type: Number, + value: 10, + }, + duration: { + type: Number, + value: 200, + observer: 'updateChildrenData', + }, + direction: { + type: String, + value: 'down', + observer: 'updateChildrenData', + }, + safeAreaTabBar: { + type: Boolean, + value: false, + }, + closeOnClickOverlay: { + type: Boolean, + value: true, + observer: 'updateChildrenData', + }, + closeOnClickOutside: { + type: Boolean, + value: true, + }, + }, + data: { + itemListData: [], + }, + beforeCreate: function () { + var windowHeight = (0, utils_1.getSystemInfoSync)().windowHeight; + this.windowHeight = windowHeight; + ARRAY.push(this); + }, + destroyed: function () { + var _this = this; + ARRAY = ARRAY.filter(function (item) { return item !== _this; }); + }, + methods: { + updateItemListData: function () { + this.setData({ + itemListData: this.children.map(function (child) { return child.data; }), + }); + }, + updateChildrenData: function () { + this.children.forEach(function (child) { + child.updateDataFromParent(); + }); + }, + toggleItem: function (active) { + this.children.forEach(function (item, index) { + var showPopup = item.data.showPopup; + if (index === active) { + item.toggle(); + } + else if (showPopup) { + item.toggle(false, { immediate: true }); + } + }); + }, + close: function () { + this.children.forEach(function (child) { + child.toggle(false, { immediate: true }); + }); + }, + getChildWrapperStyle: function () { + var _this = this; + var _a = this.data, zIndex = _a.zIndex, direction = _a.direction; + return (0, utils_1.getRect)(this, '.van-dropdown-menu').then(function (rect) { + var _a = rect.top, top = _a === void 0 ? 0 : _a, _b = rect.bottom, bottom = _b === void 0 ? 0 : _b; + var offset = direction === 'down' ? bottom : _this.windowHeight - top; + var wrapperStyle = "z-index: ".concat(zIndex, ";"); + if (direction === 'down') { + wrapperStyle += "top: ".concat((0, utils_1.addUnit)(offset), ";"); + } + else { + wrapperStyle += "bottom: ".concat((0, utils_1.addUnit)(offset), ";"); + } + return wrapperStyle; + }); + }, + onTitleTap: function (event) { + var _this = this; + var index = event.currentTarget.dataset.index; + var child = this.children[index]; + if (!child.data.disabled) { + ARRAY.forEach(function (menuItem) { + if (menuItem && + menuItem.data.closeOnClickOutside && + menuItem !== _this) { + menuItem.close(); + } + }); + this.toggleItem(index); + } + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.json b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxml b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxml new file mode 100644 index 0000000..ec165a9 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxml @@ -0,0 +1,23 @@ + + + + + + + + {{ computed.displayTitle(item) }} + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxs b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxs new file mode 100644 index 0000000..6538854 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxs @@ -0,0 +1,16 @@ +/* eslint-disable */ +function displayTitle(item) { + if (item.title) { + return item.title; + } + + var match = item.options.filter(function(option) { + return option.value === item.value; + }); + var displayTitle = match.length ? match[0].text : ''; + return displayTitle; +} + +module.exports = { + displayTitle: displayTitle +}; diff --git a/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxss b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxss new file mode 100644 index 0000000..dba000e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/dropdown-menu/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-dropdown-menu{background-color:var(--dropdown-menu-background-color,#fff);box-shadow:var(--dropdown-menu-box-shadow,0 2px 12px hsla(210,1%,40%,.12));display:flex;height:var(--dropdown-menu-height,50px);-webkit-user-select:none;user-select:none}.van-dropdown-menu__item{align-items:center;display:flex;flex:1;justify-content:center;min-width:0}.van-dropdown-menu__item:active{opacity:.7}.van-dropdown-menu__item--disabled:active{opacity:1}.van-dropdown-menu__item--disabled .van-dropdown-menu__title{color:var(--dropdown-menu-title-disabled-text-color,#969799)}.van-dropdown-menu__title{box-sizing:border-box;color:var(--dropdown-menu-title-text-color,#323233);font-size:var(--dropdown-menu-title-font-size,15px);line-height:var(--dropdown-menu-title-line-height,18px);max-width:100%;padding:var(--dropdown-menu-title-padding,0 24px 0 8px);position:relative}.van-dropdown-menu__title:after{border-color:transparent transparent currentcolor currentcolor;border-style:solid;border-width:3px;content:"";margin-top:-5px;opacity:.8;position:absolute;right:11px;top:50%;transform:rotate(-45deg)}.van-dropdown-menu__title--active{color:var(--dropdown-menu-title-active-text-color,#ee0a24)}.van-dropdown-menu__title--down:after{margin-top:-1px;transform:rotate(135deg)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/empty/index.d.ts b/src/miniprogram_npm/@vant/weapp/empty/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/empty/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/empty/index.js b/src/miniprogram_npm/@vant/weapp/empty/index.js new file mode 100644 index 0000000..755e638 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/empty/index.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var component_1 = require("../common/component"); +(0, component_1.VantComponent)({ + props: { + description: String, + image: { + type: String, + value: 'default', + }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/empty/index.json b/src/miniprogram_npm/@vant/weapp/empty/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/empty/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/src/miniprogram_npm/@vant/weapp/empty/index.wxml b/src/miniprogram_npm/@vant/weapp/empty/index.wxml new file mode 100644 index 0000000..9c7b719 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/empty/index.wxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + {{ description }} + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/empty/index.wxs b/src/miniprogram_npm/@vant/weapp/empty/index.wxs new file mode 100644 index 0000000..cf92ece --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/empty/index.wxs @@ -0,0 +1,15 @@ +/* eslint-disable */ +var PRESETS = ['error', 'search', 'default', 'network']; + +function imageUrl(image) { + if (PRESETS.indexOf(image) !== -1) { + return 'https://img.yzcdn.cn/vant/empty-image-' + image + '.png'; + } + + return image; +} + +module.exports = { + imageUrl: imageUrl, +}; + diff --git a/src/miniprogram_npm/@vant/weapp/empty/index.wxss b/src/miniprogram_npm/@vant/weapp/empty/index.wxss new file mode 100644 index 0000000..0fb74fe --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/empty/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-empty{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;padding:32px 0}.van-empty__image{height:160px;width:160px}.van-empty__image:empty{display:none}.van-empty__image__img{height:100%;width:100%}.van-empty__image:not(:empty)+.van-empty__image{display:none}.van-empty__description{color:#969799;font-size:14px;line-height:20px;margin-top:16px;padding:0 60px}.van-empty__description:empty,.van-empty__description:not(:empty)+.van-empty__description{display:none}.van-empty__bottom{margin-top:24px} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/field/index.d.ts b/src/miniprogram_npm/@vant/weapp/field/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/miniprogram_npm/@vant/weapp/field/index.js b/src/miniprogram_npm/@vant/weapp/field/index.js new file mode 100644 index 0000000..ee64d5f --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/index.js @@ -0,0 +1,152 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var utils_1 = require("../common/utils"); +var component_1 = require("../common/component"); +var props_1 = require("./props"); +(0, component_1.VantComponent)({ + field: true, + classes: ['input-class', 'right-icon-class', 'label-class'], + props: __assign(__assign(__assign(__assign({}, props_1.commonProps), props_1.inputProps), props_1.textareaProps), { size: String, icon: String, label: String, error: Boolean, center: Boolean, isLink: Boolean, leftIcon: String, rightIcon: String, autosize: null, required: Boolean, iconClass: String, clickable: Boolean, inputAlign: String, customStyle: String, errorMessage: String, arrowDirection: String, showWordLimit: Boolean, errorMessageAlign: String, readonly: { + type: Boolean, + observer: 'setShowClear', + }, clearable: { + type: Boolean, + observer: 'setShowClear', + }, clearTrigger: { + type: String, + value: 'focus', + }, border: { + type: Boolean, + value: true, + }, titleWidth: { + type: String, + value: '6.2em', + }, clearIcon: { + type: String, + value: 'clear', + }, extraEventParams: { + type: Boolean, + value: false, + } }), + data: { + focused: false, + innerValue: '', + showClear: false, + }, + watch: { + value: function (value) { + if (value !== this.value) { + this.setData({ innerValue: value }); + this.value = value; + this.setShowClear(); + } + }, + clearTrigger: function () { + this.setShowClear(); + }, + }, + created: function () { + this.value = this.data.value; + this.setData({ innerValue: this.value }); + }, + methods: { + formatValue: function (value) { + var maxlength = this.data.maxlength; + if (maxlength !== -1 && value.length > maxlength) { + return value.slice(0, maxlength); + } + return value; + }, + onInput: function (event) { + var _a = (event.detail || {}).value, value = _a === void 0 ? '' : _a; + var formatValue = this.formatValue(value); + this.value = formatValue; + this.setShowClear(); + return this.emitChange(__assign(__assign({}, event.detail), { value: formatValue })); + }, + onFocus: function (event) { + this.focused = true; + this.setShowClear(); + this.$emit('focus', event.detail); + }, + onBlur: function (event) { + this.focused = false; + this.setShowClear(); + this.$emit('blur', event.detail); + }, + onClickIcon: function () { + this.$emit('click-icon'); + }, + onClickInput: function (event) { + this.$emit('click-input', event.detail); + }, + onClear: function () { + var _this = this; + this.setData({ innerValue: '' }); + this.value = ''; + this.setShowClear(); + (0, utils_1.nextTick)(function () { + _this.emitChange({ value: '' }); + _this.$emit('clear', ''); + }); + }, + onConfirm: function (event) { + var _a = (event.detail || {}).value, value = _a === void 0 ? '' : _a; + this.value = value; + this.setShowClear(); + this.$emit('confirm', value); + }, + setValue: function (value) { + this.value = value; + this.setShowClear(); + if (value === '') { + this.setData({ innerValue: '' }); + } + this.emitChange({ value: value }); + }, + onLineChange: function (event) { + this.$emit('linechange', event.detail); + }, + onKeyboardHeightChange: function (event) { + this.$emit('keyboardheightchange', event.detail); + }, + onBindNicknameReview: function (event) { + this.$emit('nicknamereview', event.detail); + }, + emitChange: function (detail) { + var extraEventParams = this.data.extraEventParams; + this.setData({ value: detail.value }); + var result; + var data = extraEventParams + ? __assign(__assign({}, detail), { callback: function (data) { + result = data; + } }) : detail.value; + this.$emit('input', data); + this.$emit('change', data); + return result; + }, + setShowClear: function () { + var _a = this.data, clearable = _a.clearable, readonly = _a.readonly, clearTrigger = _a.clearTrigger; + var _b = this, focused = _b.focused, value = _b.value; + var showClear = false; + if (clearable && !readonly) { + var hasValue = !!value; + var trigger = clearTrigger === 'always' || (clearTrigger === 'focus' && focused); + showClear = hasValue && trigger; + } + this.setView({ showClear: showClear }); + }, + noop: function () { }, + }, +}); diff --git a/src/miniprogram_npm/@vant/weapp/field/index.json b/src/miniprogram_npm/@vant/weapp/field/index.json new file mode 100644 index 0000000..5906c50 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "van-cell": "../cell/index", + "van-icon": "../icon/index" + } +} diff --git a/src/miniprogram_npm/@vant/weapp/field/index.wxml b/src/miniprogram_npm/@vant/weapp/field/index.wxml new file mode 100644 index 0000000..6018993 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/index.wxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/miniprogram_npm/@vant/weapp/field/index.wxs b/src/miniprogram_npm/@vant/weapp/field/index.wxs new file mode 100644 index 0000000..78575b9 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/index.wxs @@ -0,0 +1,18 @@ +/* eslint-disable */ +var style = require('../wxs/style.wxs'); +var addUnit = require('../wxs/add-unit.wxs'); + +function inputStyle(autosize) { + if (autosize && autosize.constructor === 'Object') { + return style({ + 'min-height': addUnit(autosize.minHeight), + 'max-height': addUnit(autosize.maxHeight), + }); + } + + return ''; +} + +module.exports = { + inputStyle: inputStyle, +}; diff --git a/src/miniprogram_npm/@vant/weapp/field/index.wxss b/src/miniprogram_npm/@vant/weapp/field/index.wxss new file mode 100644 index 0000000..5f7d306 --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/index.wxss @@ -0,0 +1 @@ +@import '../common/index.wxss';.van-field{--cell-icon-size:var(--field-icon-size,16px)}.van-field__label{color:var(--field-label-color,#646566)}.van-field__label--disabled{color:var(--field-disabled-text-color,#c8c9cc)}.van-field__body{align-items:center;display:flex}.van-field__body--textarea{box-sizing:border-box;line-height:1.2em;min-height:var(--cell-line-height,24px);padding:3.6px 0}.van-field__control:empty+.van-field__control{display:block}.van-field__control{background-color:initial;border:0;box-sizing:border-box;color:var(--field-input-text-color,#323233);display:none;height:var(--cell-line-height,24px);line-height:inherit;margin:0;min-height:var(--cell-line-height,24px);padding:0;position:relative;resize:none;text-align:left;width:100%}.van-field__control:empty{display:none}.van-field__control--textarea{height:var(--field-text-area-min-height,18px);min-height:var(--field-text-area-min-height,18px)}.van-field__control--error{color:var(--field-input-error-text-color,#ee0a24)}.van-field__control--disabled{background-color:initial;color:var(--field-input-disabled-text-color,#c8c9cc);opacity:1}.van-field__control--center{text-align:center}.van-field__control--right{text-align:right}.van-field__control--custom{align-items:center;display:flex;min-height:var(--cell-line-height,24px)}.van-field__placeholder{color:var(--field-placeholder-text-color,#c8c9cc);left:0;pointer-events:none;position:absolute;right:0;top:0}.van-field__placeholder--error{color:var(--field-error-message-color,#ee0a24)}.van-field__icon-root{align-items:center;display:flex;min-height:var(--cell-line-height,24px)}.van-field__clear-root,.van-field__icon-container{line-height:inherit;margin-right:calc(var(--padding-xs, 8px)*-1);padding:0 var(--padding-xs,8px);vertical-align:middle}.van-field__button,.van-field__clear-root,.van-field__icon-container{flex-shrink:0}.van-field__clear-root{color:var(--field-clear-icon-color,#c8c9cc);font-size:var(--field-clear-icon-size,16px)}.van-field__icon-container{color:var(--field-icon-container-color,#969799);font-size:var(--field-icon-size,16px)}.van-field__icon-container:empty{display:none}.van-field__button{padding-left:var(--padding-xs,8px)}.van-field__button:empty{display:none}.van-field__error-message{color:var(--field-error-message-color,#ee0a24);display:block;font-size:var(--field-error-message-text-font-size,12px);text-align:left}.van-field__error-message--center{text-align:center}.van-field__error-message--right{text-align:right}.van-field__word-limit{color:var(--field-word-limit-color,#646566);font-size:var(--field-word-limit-font-size,12px);line-height:var(--field-word-limit-line-height,16px);margin-top:var(--padding-base,4px);text-align:right}.van-field__word-num{display:inline}.van-field__word-num--full{color:var(--field-word-num-full-color,#ee0a24)} \ No newline at end of file diff --git a/src/miniprogram_npm/@vant/weapp/field/input.wxml b/src/miniprogram_npm/@vant/weapp/field/input.wxml new file mode 100644 index 0000000..86b288b --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/input.wxml @@ -0,0 +1,31 @@ + + diff --git a/src/miniprogram_npm/@vant/weapp/field/props.d.ts b/src/miniprogram_npm/@vant/weapp/field/props.d.ts new file mode 100644 index 0000000..5cd130a --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/props.d.ts @@ -0,0 +1,4 @@ +/// +export declare const commonProps: WechatMiniprogram.Component.PropertyOption; +export declare const inputProps: WechatMiniprogram.Component.PropertyOption; +export declare const textareaProps: WechatMiniprogram.Component.PropertyOption; diff --git a/src/miniprogram_npm/@vant/weapp/field/props.js b/src/miniprogram_npm/@vant/weapp/field/props.js new file mode 100644 index 0000000..5ec647b --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/props.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.textareaProps = exports.inputProps = exports.commonProps = void 0; +exports.commonProps = { + value: String, + placeholder: String, + placeholderStyle: String, + placeholderClass: String, + disabled: Boolean, + maxlength: { + type: Number, + value: -1, + }, + cursorSpacing: { + type: Number, + value: 50, + }, + autoFocus: Boolean, + focus: Boolean, + cursor: { + type: Number, + value: -1, + }, + selectionStart: { + type: Number, + value: -1, + }, + selectionEnd: { + type: Number, + value: -1, + }, + adjustPosition: { + type: Boolean, + value: true, + }, + holdKeyboard: Boolean, +}; +exports.inputProps = { + type: { + type: String, + value: 'text', + }, + password: Boolean, + confirmType: String, + confirmHold: Boolean, + alwaysEmbed: Boolean, +}; +exports.textareaProps = { + autoHeight: Boolean, + fixed: Boolean, + showConfirmBar: { + type: Boolean, + value: true, + }, + disableDefaultPadding: { + type: Boolean, + value: true, + }, +}; diff --git a/src/miniprogram_npm/@vant/weapp/field/textarea.wxml b/src/miniprogram_npm/@vant/weapp/field/textarea.wxml new file mode 100644 index 0000000..945d03e --- /dev/null +++ b/src/miniprogram_npm/@vant/weapp/field/textarea.wxml @@ -0,0 +1,32 @@ + + +