Copy disabled (too large)
Download .txt
Showing preview only (20,054K chars total). Download the full file to get everything.
Repository: mlt131220/ES-3DEditor
Branch: main
Commit: 8c2836c30b64
Files: 748
Total size: 18.9 MB
Directory structure:
gitextract_eu8tak94/
├── .gitignore
├── .npmrc
├── .prettierrc.js
├── CONTRIBUTING.md
├── LEGAL.md
├── LICENSE
├── README.en.md
├── README.md
├── common/
│ └── build/
│ ├── package.json
│ ├── src/
│ │ ├── index.ts
│ │ ├── plugins/
│ │ │ ├── appConfig.ts
│ │ │ ├── compress.ts
│ │ │ ├── index.ts
│ │ │ └── visualizer.ts
│ │ └── utils.ts
│ └── tsconfig.json
├── package.json
├── packages/
│ ├── docs/
│ │ ├── .gitignore
│ │ ├── .npmrc
│ │ ├── package.json
│ │ └── src/
│ │ ├── .vuepress/
│ │ │ ├── _bulletin.md
│ │ │ ├── client.ts
│ │ │ ├── config.ts
│ │ │ ├── navbar.ts
│ │ │ ├── notes.ts
│ │ │ ├── plume.config.ts
│ │ │ └── theme/
│ │ │ ├── components/
│ │ │ │ └── Custom.vue
│ │ │ ├── shim.d.ts
│ │ │ └── styles/
│ │ │ └── custom.css
│ │ ├── README.md
│ │ └── notes/
│ │ ├── cooperation/
│ │ │ └── README.md
│ │ ├── guide/
│ │ │ ├── manual/
│ │ │ │ ├── editor/
│ │ │ │ │ ├── extras/
│ │ │ │ │ │ ├── 动画编辑器.md
│ │ │ │ │ │ ├── 日志.md
│ │ │ │ │ │ └── 资源中心.md
│ │ │ │ │ ├── leftSidebar/
│ │ │ │ │ │ ├── BIM轻量化.md
│ │ │ │ │ │ ├── CAD解析预览.md
│ │ │ │ │ │ └── 场景树.md
│ │ │ │ │ ├── rightSidebar/
│ │ │ │ │ │ ├── Html面板.md
│ │ │ │ │ │ ├── 几何.md
│ │ │ │ │ │ ├── 动画.md
│ │ │ │ │ │ ├── 历史记录.md
│ │ │ │ │ │ ├── 后期处理.md
│ │ │ │ │ │ ├── 场景图纸.md
│ │ │ │ │ │ ├── 场景配置.md
│ │ │ │ │ │ ├── 天气.md
│ │ │ │ │ │ ├── 对象.md
│ │ │ │ │ │ ├── 广告牌.md
│ │ │ │ │ │ ├── 材质.md
│ │ │ │ │ │ ├── 渲染器配置.md
│ │ │ │ │ │ ├── 粒子.md
│ │ │ │ │ │ └── 脚本.md
│ │ │ │ │ ├── viewport/
│ │ │ │ │ │ ├── 2D图纸.md
│ │ │ │ │ │ └── 3D场景.md
│ │ │ │ │ ├── 界面.md
│ │ │ │ │ └── 顶栏.md
│ │ │ │ ├── home/
│ │ │ │ │ ├── 数据中心.md
│ │ │ │ │ ├── 设置中心.md
│ │ │ │ │ ├── 资源中心.md
│ │ │ │ │ └── 项目.md
│ │ │ │ └── preview/
│ │ │ │ └── 界面.md
│ │ │ ├── plugins/
│ │ │ │ ├── builtin/
│ │ │ │ │ └── glTFHandler.md
│ │ │ │ ├── 入门.md
│ │ │ │ └── 插件开发.md
│ │ │ └── quick-start/
│ │ │ ├── 介绍.md
│ │ │ ├── 安装.md
│ │ │ ├── 部署.md
│ │ │ └── 项目结构.md
│ │ ├── more/
│ │ │ └── questions.md
│ │ ├── promotion/
│ │ │ └── README.md
│ │ └── sdk/
│ │ └── README.md
│ ├── editor/
│ │ ├── .gitignore
│ │ ├── .npmrc
│ │ ├── components.d.ts
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── libs/
│ │ │ │ └── draco/
│ │ │ │ ├── draco_decoder.js
│ │ │ │ ├── draco_decoder.wasm
│ │ │ │ ├── draco_decoder_gltf.js
│ │ │ │ ├── draco_decoder_gltf.wasm
│ │ │ │ ├── draco_encoder.js
│ │ │ │ ├── draco_encoder.wasm
│ │ │ │ ├── draco_encoder_wrapper.js
│ │ │ │ ├── draco_wasm_wrapper.js
│ │ │ │ └── draco_wasm_wrapper_gltf.js
│ │ │ ├── robots.txt
│ │ │ ├── static/
│ │ │ │ ├── model/
│ │ │ │ │ ├── animal/
│ │ │ │ │ │ └── Rat_astral3d.optimize.glb
│ │ │ │ │ ├── building/
│ │ │ │ │ │ └── Stall_astral3d.optimize.glb
│ │ │ │ │ ├── furniture/
│ │ │ │ │ │ ├── Sofa_astral3d.optimize.glb
│ │ │ │ │ │ └── WoodenStool_astral3d.optimize.glb
│ │ │ │ │ ├── mehicle/
│ │ │ │ │ │ └── Drill_astral3d.optimize.glb
│ │ │ │ │ ├── other/
│ │ │ │ │ │ └── Baseball_astral3d.optimize.glb
│ │ │ │ │ ├── outdoor/
│ │ │ │ │ │ └── WoodenDiningTable_astral3d.optimize.glb
│ │ │ │ │ ├── person/
│ │ │ │ │ │ └── Jackie.glb
│ │ │ │ │ ├── plant/
│ │ │ │ │ │ ├── DragonSpruce_astral3d.optimize.glb
│ │ │ │ │ │ ├── Grass_astral3d.optimize.glb
│ │ │ │ │ │ ├── Lemon_astral3d.optimize.glb
│ │ │ │ │ │ ├── MapleTree_astral3d.optimize.glb
│ │ │ │ │ │ ├── SmallFlower_astral3d.optimize.glb
│ │ │ │ │ │ └── SmallTree_astral3d.optimize.glb
│ │ │ │ │ └── vehicle/
│ │ │ │ │ └── CoveredCar_astral3d.optimize.glb
│ │ │ │ └── resource/
│ │ │ │ ├── hdr/
│ │ │ │ │ └── cloudy.hdr
│ │ │ │ ├── htmlPanel/
│ │ │ │ │ └── technology/
│ │ │ │ │ └── factoryEquipment.html
│ │ │ │ └── material/
│ │ │ │ └── wallBrick/
│ │ │ │ ├── red_brick/
│ │ │ │ │ └── red_brick_nor_gl_1k.exr
│ │ │ │ ├── red_sandstone/
│ │ │ │ │ └── red_sandstone_wall_diff_1k.exr
│ │ │ │ └── rustic_stone_wall/
│ │ │ │ └── rustic_stone_wall_02_diff_1k.exr
│ │ │ └── wasm/
│ │ │ └── Astral3DglTFHandler.wasm
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ ├── assets/
│ │ │ │ ├── color/
│ │ │ │ │ ├── ChineseColors.json
│ │ │ │ │ ├── all_in_one.json
│ │ │ │ │ └── recommend.json
│ │ │ │ └── less/
│ │ │ │ ├── common.less
│ │ │ │ ├── index.less
│ │ │ │ ├── reset.less
│ │ │ │ └── viewport.cube.less
│ │ │ ├── components/
│ │ │ │ ├── code/
│ │ │ │ │ ├── CodeEditor.vue
│ │ │ │ │ ├── HtmlPanelCode.vue
│ │ │ │ │ ├── JSONEditor.vue
│ │ │ │ │ ├── SQLEditor.vue
│ │ │ │ │ ├── Script.vue
│ │ │ │ │ └── UserData.vue
│ │ │ │ ├── drawing/
│ │ │ │ │ ├── Drawing.vue
│ │ │ │ │ └── toolbar/
│ │ │ │ │ ├── CAD.vue
│ │ │ │ │ ├── CadLayers.vue
│ │ │ │ │ └── Image.vue
│ │ │ │ ├── es/
│ │ │ │ │ ├── EsContextmenu.vue
│ │ │ │ │ ├── EsCubeLoading.vue
│ │ │ │ │ ├── EsDocument.vue
│ │ │ │ │ ├── EsFormItemHelpLabel.vue
│ │ │ │ │ ├── EsInput.vue
│ │ │ │ │ ├── EsInputNumber.vue
│ │ │ │ │ ├── EsKeyFrame.vue
│ │ │ │ │ ├── EsParticleEasing.vue
│ │ │ │ │ ├── EsPlugin.vue
│ │ │ │ │ ├── EsPopTreeSelect.vue
│ │ │ │ │ ├── EsTexture.vue
│ │ │ │ │ ├── EsTip.vue
│ │ │ │ │ └── plugin/
│ │ │ │ │ ├── EsPluginDialog.vue
│ │ │ │ │ ├── EsPluginList.vue
│ │ │ │ │ └── builtin/
│ │ │ │ │ ├── EarthGenerator.vue
│ │ │ │ │ ├── GLTFHandler.vue
│ │ │ │ │ ├── PointCloudReconstructor.vue
│ │ │ │ │ ├── glTFHandler/
│ │ │ │ │ │ └── GLTFHandlerForm.vue
│ │ │ │ │ └── pointCloudReconstructor/
│ │ │ │ │ └── ReconstructorForm.vue
│ │ │ │ ├── header/
│ │ │ │ │ ├── Logo.vue
│ │ │ │ │ ├── NavigationOperation.vue
│ │ │ │ │ ├── RightOperation.vue
│ │ │ │ │ ├── navigation/
│ │ │ │ │ │ ├── Clear.vue
│ │ │ │ │ │ ├── Copy.vue
│ │ │ │ │ │ ├── Delete.vue
│ │ │ │ │ │ ├── Do.vue
│ │ │ │ │ │ ├── Fullscreen.vue
│ │ │ │ │ │ └── ImportExport.vue
│ │ │ │ │ └── right/
│ │ │ │ │ ├── SaveToService.vue
│ │ │ │ │ └── XR.vue
│ │ │ │ ├── preview/
│ │ │ │ │ ├── AssetPreview.vue
│ │ │ │ │ ├── CommonPreview.vue
│ │ │ │ │ └── CommonPreview_backup.vue
│ │ │ │ ├── project/
│ │ │ │ │ └── ProjectInfoForm.vue
│ │ │ │ ├── setting/
│ │ │ │ │ ├── Setting.vue
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── Color.vue
│ │ │ │ │ │ ├── Locale.vue
│ │ │ │ │ │ ├── SettingCenter.vue
│ │ │ │ │ │ └── Theme.vue
│ │ │ │ │ └── components/
│ │ │ │ │ ├── PreviewSetting.vue
│ │ │ │ │ ├── SettingTabs.vue
│ │ │ │ │ ├── Shortcuts.vue
│ │ │ │ │ └── SystemSetting.vue
│ │ │ │ └── tree/
│ │ │ │ └── SceneTree.vue
│ │ │ ├── config/
│ │ │ │ └── service.ts
│ │ │ ├── core/
│ │ │ │ └── AssetPreview.ts
│ │ │ ├── hooks/
│ │ │ │ ├── index.ts
│ │ │ │ ├── useBoolean.ts
│ │ │ │ ├── useLoading.ts
│ │ │ │ └── useWebSocket.ts
│ │ │ ├── http/
│ │ │ │ ├── api/
│ │ │ │ │ ├── assetsCategory.ts
│ │ │ │ │ ├── assetsInfo.ts
│ │ │ │ │ ├── bim.ts
│ │ │ │ │ ├── cad.ts
│ │ │ │ │ ├── sceneExample.ts
│ │ │ │ │ ├── scenes.ts
│ │ │ │ │ └── sys.ts
│ │ │ │ └── request/
│ │ │ │ ├── ConcurrencyManager.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── instance.ts
│ │ │ │ └── request.ts
│ │ │ ├── language/
│ │ │ │ ├── index.ts
│ │ │ │ └── zh-CN-en-US.ts
│ │ │ ├── main.ts
│ │ │ ├── plugin/
│ │ │ │ ├── glTFHandler/
│ │ │ │ │ ├── Listr.ts
│ │ │ │ │ ├── glTFHandler.ts
│ │ │ │ │ ├── optimizePng.ts
│ │ │ │ │ ├── session.ts
│ │ │ │ │ └── util.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── pointCloudReconstructor/
│ │ │ │ └── PointCloudReconstructor.ts
│ │ │ ├── router/
│ │ │ │ ├── index.ts
│ │ │ │ └── routes.ts
│ │ │ ├── store/
│ │ │ │ ├── index.ts
│ │ │ │ └── modules/
│ │ │ │ ├── animation.ts
│ │ │ │ ├── assets.ts
│ │ │ │ ├── drag.ts
│ │ │ │ ├── globalConfig.ts
│ │ │ │ ├── plugin.ts
│ │ │ │ ├── previewOperation.ts
│ │ │ │ └── websocket.ts
│ │ │ ├── utils/
│ │ │ │ ├── common/
│ │ │ │ │ ├── base64.ts
│ │ │ │ │ ├── color.ts
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ ├── dateTime.ts
│ │ │ │ │ ├── file.ts
│ │ │ │ │ ├── init.ts
│ │ │ │ │ ├── render.ts
│ │ │ │ │ ├── scenes.ts
│ │ │ │ │ ├── utils.ts
│ │ │ │ │ └── verify.ts
│ │ │ │ ├── drawing/
│ │ │ │ │ └── drawRect.ts
│ │ │ │ ├── preview/
│ │ │ │ │ └── menuOperation.ts
│ │ │ │ ├── service/
│ │ │ │ │ ├── error.ts
│ │ │ │ │ ├── fetchController.ts
│ │ │ │ │ ├── handler.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── msg.ts
│ │ │ │ ├── signals/
│ │ │ │ │ └── signalRegister.ts
│ │ │ │ └── storage/
│ │ │ │ └── config.ts
│ │ │ └── views/
│ │ │ ├── editor/
│ │ │ │ ├── components/
│ │ │ │ │ └── extraPane/
│ │ │ │ │ ├── ExtraPane.vue
│ │ │ │ │ ├── animation/
│ │ │ │ │ │ ├── Animation.vue
│ │ │ │ │ │ ├── AnimationList.vue
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ ├── log/
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ └── resource/
│ │ │ │ │ ├── builtin/
│ │ │ │ │ │ ├── Billboard.vue
│ │ │ │ │ │ ├── Cameras.vue
│ │ │ │ │ │ ├── HtmlPanel.vue
│ │ │ │ │ │ ├── Lights.vue
│ │ │ │ │ │ ├── Materials.vue
│ │ │ │ │ │ ├── Models.vue
│ │ │ │ │ │ ├── Particles.vue
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ └── ModelCard.vue
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── public/
│ │ │ │ │ ├── AssetsList.vue
│ │ │ │ │ └── index.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── layouts/
│ │ │ │ ├── Assets.vue
│ │ │ │ ├── Footer.vue
│ │ │ │ ├── Header.vue
│ │ │ │ ├── Scene.vue
│ │ │ │ ├── Sidebar.vue
│ │ │ │ ├── assets/
│ │ │ │ │ ├── CadLibrary.vue
│ │ │ │ │ └── cadLibrary/
│ │ │ │ │ └── CadUploadDialog.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── sidebar/
│ │ │ │ │ ├── SidebarAnimations.vue
│ │ │ │ │ ├── SidebarBillboard.vue
│ │ │ │ │ ├── SidebarDrawing.vue
│ │ │ │ │ ├── SidebarEffect.vue
│ │ │ │ │ ├── SidebarGeometry.vue
│ │ │ │ │ ├── SidebarHistory.vue
│ │ │ │ │ ├── SidebarHtmlPanel.vue
│ │ │ │ │ ├── SidebarMaterial.vue
│ │ │ │ │ ├── SidebarObject.vue
│ │ │ │ │ ├── SidebarParticle.vue
│ │ │ │ │ ├── SidebarRenderer.vue
│ │ │ │ │ ├── SidebarScene.vue
│ │ │ │ │ ├── SidebarScript.vue
│ │ │ │ │ ├── SidebarWeather.vue
│ │ │ │ │ ├── billboard/
│ │ │ │ │ │ ├── Sidebar.Billboard.Image.vue
│ │ │ │ │ │ └── Sidebar.Billboard.Text.vue
│ │ │ │ │ ├── effect/
│ │ │ │ │ │ ├── Sidebar.Effect.Afterimage.vue
│ │ │ │ │ │ ├── Sidebar.Effect.Bokeh.vue
│ │ │ │ │ │ ├── Sidebar.Effect.FXAA.vue
│ │ │ │ │ │ ├── Sidebar.Effect.Halftone.vue
│ │ │ │ │ │ ├── Sidebar.Effect.LUT.vue
│ │ │ │ │ │ ├── Sidebar.Effect.Outline.vue
│ │ │ │ │ │ ├── Sidebar.Effect.Pixelate.vue
│ │ │ │ │ │ └── Sidebar.Effect.UnrealBloom.vue
│ │ │ │ │ ├── geometry/
│ │ │ │ │ │ ├── Sidebar.Geometry.BoxGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.BufferGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.CapsuleGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.CircleGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.CylinderGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.DodecahedronGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.ExtrudeGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.IcosahedronGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.LatheGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.Modifiers.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.OctahedronGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.PlaneGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.RingGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.ShapeGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.SphereGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.TeapotGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.TetrahedronGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.TorusGeometry.vue
│ │ │ │ │ │ ├── Sidebar.Geometry.TorusKnotGeometry.vue
│ │ │ │ │ │ └── Sidebar.Geometry.TubeGeometry.vue
│ │ │ │ │ ├── material/
│ │ │ │ │ │ ├── SceneAllMaterials.vue
│ │ │ │ │ │ ├── SidebarMaterialBooleanProperty.vue
│ │ │ │ │ │ ├── SidebarMaterialColorProperty.vue
│ │ │ │ │ │ ├── SidebarMaterialConstantProperty.vue
│ │ │ │ │ │ ├── SidebarMaterialMapProperty.vue
│ │ │ │ │ │ ├── SidebarMaterialNumberProperty.vue
│ │ │ │ │ │ ├── SidebarMaterialProgram.vue
│ │ │ │ │ │ └── SidebarMaterialRangeValueProperty.vue
│ │ │ │ │ ├── particle/
│ │ │ │ │ │ ├── Sidebar.Particle.Attribute.vue
│ │ │ │ │ │ ├── Sidebar.Particle.Behaviour.vue
│ │ │ │ │ │ ├── Sidebar.Particle.Initializer.vue
│ │ │ │ │ │ └── initializer/
│ │ │ │ │ │ ├── Sidebar.Particle.Initializer.Body.vue
│ │ │ │ │ │ ├── Sidebar.Particle.Initializer.Velocity.vue
│ │ │ │ │ │ └── Sidebar.Particle.Initializer.Zones.vue
│ │ │ │ │ ├── renderer/
│ │ │ │ │ │ └── Sidebar.Renderer.CSM.vue
│ │ │ │ │ ├── scene/
│ │ │ │ │ │ ├── Sidebar.Scene.ProjectSetting.vue
│ │ │ │ │ │ └── Sidebar.Scene.Setting.vue
│ │ │ │ │ └── weather/
│ │ │ │ │ ├── Sidebar.Weather.Fog.vue
│ │ │ │ │ ├── Sidebar.Weather.Rain.vue
│ │ │ │ │ └── Sidebar.Weather.Snow.vue
│ │ │ │ └── viewport/
│ │ │ │ ├── BIMProperties.vue
│ │ │ │ ├── IFCProperties.vue
│ │ │ │ ├── Toolbar.vue
│ │ │ │ ├── Viewport.vue
│ │ │ │ ├── ViewportCamera.vue
│ │ │ │ ├── ViewportInfo.vue
│ │ │ │ └── ViewportShading.vue
│ │ │ ├── home/
│ │ │ │ ├── assetsCenter/
│ │ │ │ │ ├── AssetsList.vue
│ │ │ │ │ ├── UploadAsset.vue
│ │ │ │ │ └── components/
│ │ │ │ │ ├── AssetDetail.vue
│ │ │ │ │ └── CardAction.vue
│ │ │ │ ├── components/
│ │ │ │ │ ├── HeaderCarousel.vue
│ │ │ │ │ ├── SidebarBottomInfo.vue
│ │ │ │ │ └── SidebarTopInfo.vue
│ │ │ │ ├── container/
│ │ │ │ │ ├── AssetsCenter.vue
│ │ │ │ │ ├── DataCenter.vue
│ │ │ │ │ ├── Project.vue
│ │ │ │ │ └── SettingCenter.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── project/
│ │ │ │ ├── MyProject.vue
│ │ │ │ ├── SharedProject.vue
│ │ │ │ └── components/
│ │ │ │ ├── CardAction.vue
│ │ │ │ ├── CreateProject.vue
│ │ │ │ └── ProjectDetail.vue
│ │ │ ├── index.vue
│ │ │ └── preview/
│ │ │ ├── components/
│ │ │ │ ├── OperationItem.vue
│ │ │ │ ├── Operations.vue
│ │ │ │ ├── PreviewSceneTree.vue
│ │ │ │ └── operationConfigModal/
│ │ │ │ ├── AutoRotate.vue
│ │ │ │ ├── ModelExplode.vue
│ │ │ │ └── index.vue
│ │ │ └── index.vue
│ │ ├── tsconfig.json
│ │ ├── types/
│ │ │ ├── assets.d.ts
│ │ │ ├── billboard.d.ts
│ │ │ ├── bim.d.ts
│ │ │ ├── config.d.ts
│ │ │ ├── data-source.d.ts
│ │ │ ├── drawing.d.ts
│ │ │ ├── env.d.ts
│ │ │ ├── ignore.d.ts
│ │ │ ├── naive-ui.d.ts
│ │ │ ├── network.d.ts
│ │ │ ├── particle.d.ts
│ │ │ ├── plugin.d.ts
│ │ │ ├── scene.d.ts
│ │ │ ├── script.d.ts
│ │ │ ├── three.d.ts
│ │ │ └── window.d.ts
│ │ ├── uno.config.ts
│ │ └── vite.config.ts
│ └── sdk/
│ ├── .gitignore
│ ├── index.html
│ ├── lib/
│ │ ├── constant/
│ │ │ ├── enum.ts
│ │ │ ├── index.ts
│ │ │ └── type.ts
│ │ ├── core/
│ │ │ ├── animation/
│ │ │ │ ├── AnimationManager.ts
│ │ │ │ └── TimelineTrack.ts
│ │ │ ├── app/
│ │ │ │ ├── App.ts
│ │ │ │ └── modules/
│ │ │ │ ├── CSM.ts
│ │ │ │ ├── Config.ts
│ │ │ │ ├── History.ts
│ │ │ │ ├── Project.ts
│ │ │ │ ├── Resource.ts
│ │ │ │ ├── Selector.ts
│ │ │ │ ├── Storage.ts
│ │ │ │ └── index.ts
│ │ │ ├── built-in/
│ │ │ │ └── assets/
│ │ │ │ ├── BasicObject3D.ts
│ │ │ │ └── Particles.ts
│ │ │ ├── commands/
│ │ │ │ ├── AddObjectCommand.ts
│ │ │ │ ├── AddScriptCommand.ts
│ │ │ │ ├── Command.ts
│ │ │ │ ├── Commands.ts
│ │ │ │ ├── MoveObjectCommand.ts
│ │ │ │ ├── RemoveObjectCommand.ts
│ │ │ │ ├── RemoveScriptCommand.ts
│ │ │ │ ├── SetColorCommand.ts
│ │ │ │ ├── SetGeometryCommand.ts
│ │ │ │ ├── SetGeometryValueCommand.ts
│ │ │ │ ├── SetMaterialColorCommand.ts
│ │ │ │ ├── SetMaterialCommand.ts
│ │ │ │ ├── SetMaterialMapCommand.ts
│ │ │ │ ├── SetMaterialRangeCommand.ts
│ │ │ │ ├── SetMaterialValueCommand.ts
│ │ │ │ ├── SetMaterialVectorCommand.ts
│ │ │ │ ├── SetPositionCommand.ts
│ │ │ │ ├── SetRotationCommand.ts
│ │ │ │ ├── SetScaleCommand.ts
│ │ │ │ ├── SetSceneCommand.ts
│ │ │ │ ├── SetScriptValueCommand.ts
│ │ │ │ ├── SetUuidCommand.ts
│ │ │ │ └── SetValueCommand.ts
│ │ │ ├── controls/
│ │ │ │ └── DragControls.js
│ │ │ ├── expansion/
│ │ │ │ ├── Material.ts
│ │ │ │ ├── Object3D.ts
│ │ │ │ └── index.ts
│ │ │ ├── geometries/
│ │ │ │ ├── TeapotGeometry.ts
│ │ │ │ └── index.ts
│ │ │ ├── libs/
│ │ │ │ ├── astral-timeline/
│ │ │ │ │ ├── animation-timeline.ts
│ │ │ │ │ ├── enums/
│ │ │ │ │ │ ├── timelineCapShape.ts
│ │ │ │ │ │ ├── timelineCursorType.ts
│ │ │ │ │ │ ├── timelineElementType.ts
│ │ │ │ │ │ ├── timelineEventSource.ts
│ │ │ │ │ │ ├── timelineEvents.ts
│ │ │ │ │ │ ├── timelineInteractionMode.ts
│ │ │ │ │ │ ├── timelineKeyframeShape.ts
│ │ │ │ │ │ ├── timelineScrollSource.ts
│ │ │ │ │ │ ├── timelineSelectionEventSource.ts
│ │ │ │ │ │ └── timelineSelectionMode.ts
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── timelineGroup.ts
│ │ │ │ │ │ ├── timelineKeyframe.ts
│ │ │ │ │ │ ├── timelineModel.ts
│ │ │ │ │ │ ├── timelineRanged.ts
│ │ │ │ │ │ └── timelineRow.ts
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── defaults/
│ │ │ │ │ │ │ ├── defaultGroupStyle.ts
│ │ │ │ │ │ │ ├── defaultTimelineConsts.ts
│ │ │ │ │ │ │ ├── defaultTimelineKeyframeStyle.ts
│ │ │ │ │ │ │ ├── defaultTimelineOptions.ts
│ │ │ │ │ │ │ ├── defaultTimelineRowStyle.ts
│ │ │ │ │ │ │ └── defaultTimelineStyle.ts
│ │ │ │ │ │ ├── styles/
│ │ │ │ │ │ │ ├── timelineCapStyle.ts
│ │ │ │ │ │ │ ├── timelineGroupStyle.ts
│ │ │ │ │ │ │ ├── timelineKeyframeStyle.ts
│ │ │ │ │ │ │ ├── timelineRowStyle.ts
│ │ │ │ │ │ │ └── timelineStyle.ts
│ │ │ │ │ │ ├── timelineConsts.ts
│ │ │ │ │ │ └── timelineOptions.ts
│ │ │ │ │ ├── timeline.ts
│ │ │ │ │ ├── timelineEventsEmitter.ts
│ │ │ │ │ ├── utils/
│ │ │ │ │ │ ├── events/
│ │ │ │ │ │ │ ├── timelineBaseEvent.ts
│ │ │ │ │ │ │ ├── timelineClickEvent.ts
│ │ │ │ │ │ │ ├── timelineDragEvent.ts
│ │ │ │ │ │ │ ├── timelineKeyframeChangedEvent.ts
│ │ │ │ │ │ │ ├── timelineScrollEvent.ts
│ │ │ │ │ │ │ ├── timelineSelectedEvent.ts
│ │ │ │ │ │ │ └── timelineTimeChangedEvent.ts
│ │ │ │ │ │ ├── timelineCutBoundsRectResults.ts
│ │ │ │ │ │ ├── timelineDraggableData.ts
│ │ │ │ │ │ ├── timelineElement.ts
│ │ │ │ │ │ ├── timelineElementDragState.ts
│ │ │ │ │ │ ├── timelineMouseData.ts
│ │ │ │ │ │ ├── timelinePoint.ts
│ │ │ │ │ │ ├── timelineSelectable.ts
│ │ │ │ │ │ ├── timelineSelectionResults.ts
│ │ │ │ │ │ ├── timelineStyleUtils.ts
│ │ │ │ │ │ └── timelineUtils.ts
│ │ │ │ │ └── viewModels/
│ │ │ │ │ ├── timelineGroupViewModel.ts
│ │ │ │ │ ├── timelineKeyframeViewModel.ts
│ │ │ │ │ ├── timelineRowViewModel.ts
│ │ │ │ │ └── timelineViewModel.ts
│ │ │ │ └── three-nebula/
│ │ │ │ ├── behaviour/
│ │ │ │ │ ├── Alpha.js
│ │ │ │ │ ├── Attraction.js
│ │ │ │ │ ├── Behaviour.js
│ │ │ │ │ ├── Collision.js
│ │ │ │ │ ├── Color.js
│ │ │ │ │ ├── CrossZone.js
│ │ │ │ │ ├── Force.js
│ │ │ │ │ ├── Gravity.js
│ │ │ │ │ ├── RandomDrift.js
│ │ │ │ │ ├── Repulsion.js
│ │ │ │ │ ├── Rotate.js
│ │ │ │ │ ├── Scale.js
│ │ │ │ │ ├── Spring.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── types.js
│ │ │ │ ├── constants/
│ │ │ │ │ └── index.js
│ │ │ │ ├── core/
│ │ │ │ │ ├── Particle.js
│ │ │ │ │ ├── Pool.js
│ │ │ │ │ ├── System.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── fromJSON.js
│ │ │ │ │ ├── fromJSONAsync.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── three/
│ │ │ │ │ │ ├── Euler.js
│ │ │ │ │ │ ├── Math.js
│ │ │ │ │ │ ├── Matrix4.js
│ │ │ │ │ │ ├── Quaternion.js
│ │ │ │ │ │ ├── Vector3.js
│ │ │ │ │ │ ├── constants.js
│ │ │ │ │ │ └── index.js
│ │ │ │ │ └── types.js
│ │ │ │ ├── debug/
│ │ │ │ │ ├── Debug.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── log.js
│ │ │ │ ├── ease/
│ │ │ │ │ └── index.js
│ │ │ │ ├── emitter/
│ │ │ │ │ ├── Emitter.js
│ │ │ │ │ ├── FollowEmitter.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── types.js
│ │ │ │ ├── events/
│ │ │ │ │ ├── EventDispatcher.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── index.js
│ │ │ │ ├── initializer/
│ │ │ │ │ ├── Body.js
│ │ │ │ │ ├── BodySprite.js
│ │ │ │ │ ├── Initializer.js
│ │ │ │ │ ├── InitializerUtil.js
│ │ │ │ │ ├── Life.js
│ │ │ │ │ ├── Mass.js
│ │ │ │ │ ├── Position.js
│ │ │ │ │ ├── Radius.js
│ │ │ │ │ ├── Rate.js
│ │ │ │ │ ├── Rotation.js
│ │ │ │ │ ├── Texture.js
│ │ │ │ │ ├── Velocity/
│ │ │ │ │ │ ├── PolarVelocity.js
│ │ │ │ │ │ ├── RadialVelocity.js
│ │ │ │ │ │ ├── VectorVelocity.js
│ │ │ │ │ │ ├── Velocity.js
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── types.js
│ │ │ │ ├── math/
│ │ │ │ │ ├── ArraySpan.js
│ │ │ │ │ ├── Box.js
│ │ │ │ │ ├── ColorSpan.js
│ │ │ │ │ ├── MathUtils.js
│ │ │ │ │ ├── Polar3D.js
│ │ │ │ │ ├── Span.js
│ │ │ │ │ ├── Vector3D.js
│ │ │ │ │ ├── constants.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── integration.js
│ │ │ │ │ └── types.js
│ │ │ │ ├── renderer/
│ │ │ │ │ ├── BaseRenderer.js
│ │ │ │ │ ├── CustomRenderer.js
│ │ │ │ │ ├── GPURenderer/
│ │ │ │ │ │ ├── Desktop/
│ │ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ │ └── shaders/
│ │ │ │ │ │ │ ├── fragmentShader.js
│ │ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ │ └── vertexShader.js
│ │ │ │ │ │ ├── Mobile/
│ │ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ │ └── shaders/
│ │ │ │ │ │ │ ├── fragmentShader.js
│ │ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ │ └── vertexShader.js
│ │ │ │ │ │ ├── common/
│ │ │ │ │ │ │ ├── ParticleBuffer/
│ │ │ │ │ │ │ │ ├── constants.js
│ │ │ │ │ │ │ │ └── index.js
│ │ │ │ │ │ │ ├── TextureAtlas/
│ │ │ │ │ │ │ │ ├── constants.js
│ │ │ │ │ │ │ │ └── index.js
│ │ │ │ │ │ │ ├── constants.js
│ │ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ │ ├── shaders/
│ │ │ │ │ │ │ │ └── constants.js
│ │ │ │ │ │ │ └── stores/
│ │ │ │ │ │ │ ├── Target.js
│ │ │ │ │ │ │ ├── UniqueList.js
│ │ │ │ │ │ │ └── index.js
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── MeshRenderer.js
│ │ │ │ │ ├── SpriteRenderer.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── types.js
│ │ │ │ ├── utils/
│ │ │ │ │ ├── ColorUtil.js
│ │ │ │ │ ├── PUID.js
│ │ │ │ │ ├── THREEUtil.js
│ │ │ │ │ ├── Util.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── isNumber.js
│ │ │ │ │ ├── potpack.js
│ │ │ │ │ ├── sample.js
│ │ │ │ │ └── uid.js
│ │ │ │ └── zone/
│ │ │ │ ├── BoxZone.js
│ │ │ │ ├── LineZone.js
│ │ │ │ ├── MeshZone.js
│ │ │ │ ├── PointZone.js
│ │ │ │ ├── ScreenZone.js
│ │ │ │ ├── SphereZone.js
│ │ │ │ ├── Zone.js
│ │ │ │ ├── index.js
│ │ │ │ └── types.js
│ │ │ ├── loader/
│ │ │ │ ├── Loader.ts
│ │ │ │ ├── ObjectLoader.js
│ │ │ │ ├── Package.Skeleton.ts
│ │ │ │ └── Package.ts
│ │ │ ├── objects/
│ │ │ │ ├── Billboard.ts
│ │ │ │ ├── HtmlPanel.ts
│ │ │ │ ├── LineMesh.ts
│ │ │ │ ├── ParticleEmitter.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── texture/
│ │ │ │ │ └── BillboardTexture.ts
│ │ │ │ └── weather/
│ │ │ │ ├── Rain.ts
│ │ │ │ └── Snow.ts
│ │ │ ├── plugin/
│ │ │ │ ├── builtin/
│ │ │ │ │ └── builtin.ts
│ │ │ │ ├── plugin.ts
│ │ │ │ └── pluginLoader.ts
│ │ │ ├── points/
│ │ │ │ ├── PointCloudReconstructor.ts
│ │ │ │ └── index.ts
│ │ │ ├── preview/
│ │ │ │ ├── Preview.ts
│ │ │ │ └── PreviewOptions.ts
│ │ │ ├── script/
│ │ │ │ ├── Animation.ts
│ │ │ │ ├── Helper.ts
│ │ │ │ ├── Source.ts
│ │ │ │ └── index.ts
│ │ │ ├── shaderMaterial/
│ │ │ │ ├── ShaderMaterialManager.ts
│ │ │ │ └── modules/
│ │ │ │ ├── CircleGridShaderMaterial.ts
│ │ │ │ ├── DynamicCheckerboardShaderMaterial.ts
│ │ │ │ ├── FlickerShaderMaterial.ts
│ │ │ │ ├── SlowSmokeShaderMaterial.ts
│ │ │ │ ├── SnowingShaderMaterial.ts
│ │ │ │ ├── StreamerWallShaderMaterial.ts
│ │ │ │ └── index.ts
│ │ │ ├── tools/
│ │ │ │ ├── ClippedEdgesBox.ts
│ │ │ │ ├── Export.ts
│ │ │ │ ├── Measure.ts
│ │ │ │ ├── MiniMap-20240823.ts
│ │ │ │ ├── MiniMap.ts
│ │ │ │ ├── ModelExplode.ts
│ │ │ │ ├── Roaming.ts
│ │ │ │ ├── RoamingStatus.ts
│ │ │ │ └── index.ts
│ │ │ └── viewer/
│ │ │ ├── Viewer.ts
│ │ │ ├── ViewerOptions.ts
│ │ │ ├── ViewerPathTracer.ts
│ │ │ └── modules/
│ │ │ ├── CameraManage.ts
│ │ │ ├── Drag.ts
│ │ │ ├── Effect.ts
│ │ │ ├── Helper.ts
│ │ │ ├── ParticleSystem.ts
│ │ │ ├── Signals.ts
│ │ │ ├── Weather.ts
│ │ │ └── index.ts
│ │ ├── dxf/
│ │ │ ├── DragControls.js
│ │ │ ├── bspline.ts
│ │ │ ├── drawRect.ts
│ │ │ ├── drawShare.ts
│ │ │ ├── drawUtils.ts
│ │ │ ├── index.ts
│ │ │ ├── offScreenCanvas.worker.ts
│ │ │ ├── parser/
│ │ │ │ ├── AutoCadColorIndex.ts
│ │ │ │ ├── DimStyleCodes.ts
│ │ │ │ ├── DxfArrayScanner.ts
│ │ │ │ ├── DxfParser.ts
│ │ │ │ ├── ExtendedDataParser.ts
│ │ │ │ ├── ParseHelpers.ts
│ │ │ │ ├── entities/
│ │ │ │ │ ├── 3dface.ts
│ │ │ │ │ ├── arc.ts
│ │ │ │ │ ├── attdef.ts
│ │ │ │ │ ├── attribute.ts
│ │ │ │ │ ├── circle.ts
│ │ │ │ │ ├── dimension.ts
│ │ │ │ │ ├── ellipse.ts
│ │ │ │ │ ├── geomtry.ts
│ │ │ │ │ ├── hatch.ts
│ │ │ │ │ ├── insert.ts
│ │ │ │ │ ├── line.ts
│ │ │ │ │ ├── lwpolyline.ts
│ │ │ │ │ ├── mtext.ts
│ │ │ │ │ ├── point.ts
│ │ │ │ │ ├── polyline.ts
│ │ │ │ │ ├── solid.ts
│ │ │ │ │ ├── spline.ts
│ │ │ │ │ ├── text.ts
│ │ │ │ │ └── vertex.ts
│ │ │ │ └── index.ts
│ │ │ ├── pickHelper.ts
│ │ │ ├── round10.ts
│ │ │ ├── troika-three-text.esm.js
│ │ │ ├── troika-three-utils.esm.js
│ │ │ └── troika-worker-utils.esm.js
│ │ ├── hooks/
│ │ │ ├── index.ts
│ │ │ └── useSignal.ts
│ │ ├── index.ts
│ │ ├── utils/
│ │ │ ├── common/
│ │ │ │ ├── dom.ts
│ │ │ │ ├── download.ts
│ │ │ │ ├── helper.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── object.ts
│ │ │ │ ├── performance.ts
│ │ │ │ └── verify.ts
│ │ │ ├── index.ts
│ │ │ ├── log/
│ │ │ │ └── Logger.ts
│ │ │ ├── request/
│ │ │ │ ├── fetchController.ts
│ │ │ │ └── index.ts
│ │ │ ├── scene/
│ │ │ │ ├── Stats.ts
│ │ │ │ ├── controls.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── material.ts
│ │ │ ├── signals/
│ │ │ │ └── signalRegister.ts
│ │ │ └── wasm/
│ │ │ ├── index.ts
│ │ │ ├── inject.ts
│ │ │ ├── wasm_exec.js
│ │ │ └── zip.ts
│ │ └── workers/
│ │ ├── bvh/
│ │ │ ├── GenerateColliderEnvironmentWorker.js
│ │ │ ├── GenerateMeshBVHWorker.js
│ │ │ ├── generateAsync.worker.js
│ │ │ └── generateColliderEnvironment.worker.js
│ │ └── mergeGeometries.worker.ts
│ ├── package.json
│ ├── public/
│ │ ├── libs/
│ │ │ ├── basis/
│ │ │ │ ├── README.md
│ │ │ │ ├── basis_transcoder.js
│ │ │ │ └── basis_transcoder.wasm
│ │ │ ├── draco/
│ │ │ │ ├── draco_decoder.js
│ │ │ │ ├── draco_decoder.wasm
│ │ │ │ ├── draco_decoder_gltf.js
│ │ │ │ ├── draco_decoder_gltf.wasm
│ │ │ │ ├── draco_encoder.js
│ │ │ │ ├── draco_encoder.wasm
│ │ │ │ ├── draco_encoder_wrapper.js
│ │ │ │ ├── draco_wasm_wrapper.js
│ │ │ │ ├── draco_wasm_wrapper_gltf.js
│ │ │ │ └── gltf/
│ │ │ │ ├── draco_decoder.js
│ │ │ │ ├── draco_decoder.wasm
│ │ │ │ ├── draco_encoder.js
│ │ │ │ └── draco_wasm_wrapper.js
│ │ │ └── web-ifc/
│ │ │ ├── IFCWorker.js
│ │ │ ├── web-ifc-mt.wasm
│ │ │ └── web-ifc.wasm
│ │ ├── resource/
│ │ │ ├── luts/
│ │ │ │ ├── Bourbon 64.CUBE
│ │ │ │ ├── Chemical 168.CUBE
│ │ │ │ ├── Clayton 33.CUBE
│ │ │ │ ├── Cubicle 99.CUBE
│ │ │ │ ├── Presetpro-Cinematic.3dl
│ │ │ │ └── Remy 24.CUBE
│ │ │ └── model/
│ │ │ ├── Jackie.glb
│ │ │ ├── Workman.glb
│ │ │ ├── X_Bot.glb
│ │ │ └── Y_Bot.glb
│ │ └── static/
│ │ └── wasm/
│ │ └── Astral3DEngine.wasm
│ ├── tsconfig.json
│ ├── types/
│ │ ├── Scene.d.ts
│ │ ├── Script.d.ts
│ │ ├── Three.d.ts
│ │ ├── app/
│ │ │ ├── Config.d.ts
│ │ │ └── Project.d.ts
│ │ ├── astral-zip.d.ts
│ │ ├── core/
│ │ │ ├── Cad.d.ts
│ │ │ └── Plugin.d.ts
│ │ ├── global.d.ts
│ │ ├── objects/
│ │ │ ├── Billboard.d.ts
│ │ │ └── Particle.d.ts
│ │ ├── setting/
│ │ │ ├── PreviewSetting.d.ts
│ │ │ └── ViewerSetting.d.ts
│ │ └── vite-env.d.ts
│ └── vite.config.ts
└── pnpm-workspace.yaml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
packages/examples
================================================
FILE: .npmrc
================================================
# 解决pnpm add时优先在本地查找依赖
link-workspace-packages=true
================================================
FILE: .prettierrc.js
================================================
/** @type {import("prettier").Config} */
module.exports = {
// 一行最多160字符
printWidth: 160,
// 指定一个制表符等于的空格数
tabWidth: 4,
// 使用制表符,而不使用空格
useTabs: true,
// 行尾需要有分号
semi: true,
// 使用单引号代替双引号
singleQuote: false,
// 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行
proseWrap: "preserve",
// 对象的key仅在必要时用引号括起来
quoteProps: "as-needed",
// 尾逗号根据ES5规则使用
trailingComma: "es5",
// 在对象,数组括号与文字之间加空格 "{ foo: bar }"
bracketSpacing: true,
// (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号
arrowParens: "avoid",
// 指定 HTML 文件的空白字符敏感度
htmlWhitespaceSensitivity: "ignore",
// 缩进 Vue SFC 文件中的 <script> 和 <style> 标签
vueIndentScriptAndStyle: true,
// 结尾是 \n \r \n\r auto
endOfLine: "auto",
// 在jsx中使用单引号代替双引号
jsxSingleQuote: false,
// 在jsx中是否把'>' 单独放一行
bracketSameLine: false,
// === 不同文件的定制 ===
overrides: [
{
files: "*.md",
options: {
printWidth: 120,
proseWrap: "preserve",
},
},
{
files: "*.json",
options: {
printWidth: 120,
},
},
],
};
================================================
FILE: CONTRIBUTING.md
================================================
# 贡献指南
欢迎来到 Astral 3D 社区!以下是参与贡献的指南:
## 🛠️ 开发流程
### 环境要求
- Node.js 23.11+
- PNPM
### 代码规范
1. Git 提交信息格式:
```
<type>(<scope>): <subject>
- type: feat|fix|docs|style|refactor|test|chore
- scope: Editor|Preview|Home|SDK 等模块范围
- subject: 50字内简明描述
```
2. 前端规范:
- Vue 组件使用 Composition API
- TypeScript 严格模式
- CSS 使用 UnoCSS 原子化方案
## 🐛 问题报告
使用 [GitHub Issues](https://github.com/mlt131220/Astral3D/issues) 时请包含:
1. 环境信息(OS/浏览器/Node版本)
2. 重现步骤
3. 预期与实际行为
4. 相关截图/日志
## ✨ 功能建议
1. 在 Discussions 发起提案讨论
2. 提供使用场景描述
3. 如有原型设计请附示意图
## 🌐 国际化
添加新语言请按以下步骤:
1. 在 `src/language` 创建语言文件
2. 会以文件名作为语言标识符 注册新语言
3. 在 `src/components/setting/common/Locale.vue` 中添加新语言选项
4. 提交 Pull Request 并 @ 维护者
## 🔄 代码提交
1. Fork 仓库并创建特性分支
2. 编写单元测试(重要功能必须包含)
3. 执行代码检查:
```bash
pnpm lint
```
4. 发起 Pull Request 至 dev 分支
## 🏅 贡献者公约
请遵守 [贡献者公约](https://www.contributor-covenant.org/version/2/1/code_of_conduct/),我们承诺:
- 友好包容的交流环境
- 尊重不同的开发经验
- 建设性的技术讨论
## 💼 代码所有权
所有贡献代码默认遵循项目 Apache-2.0 协议,作者保留对代码库的最终管理权限。
================================================
FILE: LEGAL.md
================================================
# 法律声明
## 📜 许可协议
本项目采用 [Apache-2.0 许可证](LICENSE),核心条款包括:
### 您必须遵守:
1. **保留声明**
所有副本必须包含:
- 原始版权声明(见本文件底部)
- NOTICE 文件(如有)
- 许可证副本
2. **修改标识**
修改后的版本必须:
- 在文件头添加显著修改声明
- 保留所有现有版权声明
3. **附加商业条款:**
- 直接使用本源码产生的商业行为需获得作者书面授权
- 基于本项目的二次开发产品需在显著位置声明原始项目信息
## ⚠️ 免责声明
1. 作者不对使用本项目产生的任何直接/间接损失负责
2. 禁止将本项目用于任何违法用途,包括但不限于:
- 侵犯他人知识产权
- 传播恶意软件
- 进行网络攻击
- 其他违反当地法律法规的行为
## ®️ 商标条款
1. "Astral"名称及标识为项目作者注册商标
2. 未经授权不得:
- 使用项目名称进行商业宣传
- 修改或隐藏原始项目标识
- 在衍生品中使用Astral商标
- 暗示与官方项目的关联性
## ©️ 版权声明
2019-2025 © ErSan<mlt131220@163.com>. All rights reserved.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2024 ErSan
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.en.md
================================================
# <img src="https://editor.astraljs.com/static/images/logo/logo.png" width="30" height="30"> Astral 3D Editor
🌍 [简体中文](README.md) | English
Link:
[](https://github.com/mlt131220/Astral3D)
[](https://gitee.com/mlt131220/Astral3D)
[](https://editor.astraljs.com)
> Modern Web 3D editor based on Vue3 + Three.js
<div align="center">
<img src="http://editor-doc.astraljs.com/images/home/thumbnailDark.png?t=20250518" width="800" alt="Editor City Preview">
<img src="http://editor-doc.astraljs.com/images/home/industryDark.png?t=20250318" width="800" alt="Editor Preview">
</div>
## 💬 Join the community
Get the latest news and technical support in the following ways:
|  | -07C160?logo=wechat&logoColor=white) |
|---------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <img src="https://fs.mhbdng.cn/temp/4851677b-661d-4e60-884d-414316290425.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=6TE7OKPZN15R380TGT1V%2F20260111%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260111T135452Z&X-Amz-Expires=3600&X-Amz-Security-Token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJwYXJlbnQiOiJtbHQxMzEyMjAiLCJleHAiOjE3NjgxODExNTV9.RAvlAnLKtG-9rNIZMrO5lrSJc_N1VqHf3yF3-slD59b-miNqdorqsI9Zmaz6_imBe_uw1u5KMt_OGE7No-vxfA&X-Amz-Signature=4868484133727ab3881d0f7eb65a52db07ee91bc154b4bf4b88d19a91446188e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" width="200"> | <img src="https://fs.mhbdng.cn/temp/c1c7ecef-d655-4bb3-97e8-54402e3a48ef.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=6TE7OKPZN15R380TGT1V%2F20260111%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260111T135514Z&X-Amz-Expires=3600&X-Amz-Security-Token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJwYXJlbnQiOiJtbHQxMzEyMjAiLCJleHAiOjE3NjgxODExNTV9.RAvlAnLKtG-9rNIZMrO5lrSJc_N1VqHf3yF3-slD59b-miNqdorqsI9Zmaz6_imBe_uw1u5KMt_OGE7No-vxfA&X-Amz-Signature=7005038e2ded3dbad425f6a23341002bf79c3ffe9f2166af18348dcaeb61dca0&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" width="200"> |
## 🚀 Core competence
### Core function
- ✅ Multi-format support: 30+ model format (GLTF/OBJ/FBX/GLB/RVT/IFC, etc.)
- ✅ BIM Model Lightweight Demonstration (RVT/IFC)
- ✅ CAD drawing analysis (DWG/DXF)
- ✅ Scenario subcontract storage and loading
- ✅ Animation editor
### Expansion capability
- 🧩 plug-in system
- 📜 When the script is running
- 💫 Particle system
- ❄️ Weather system
- ☁️ Cloud Storage Integration (USS again)
- 🎠 Resource center
### Coming soon
- 🚧 Physical engine support
- 🚧 WebGPU support
- 🚧 Data components (API/WebSocket)
- 🚧 low code data large screen
- 🚧 WebSocket Multi-party collaboration
## 🛠️ Technology stack




## ⚡ Quick start
### pre-demand
- Node.js ≥ 23.11.x
- Yarn
### Local run
```bash
git clone https://github.com/mlt131220/Astral3D.git
cd Astral3D
pnpm install
pnpm run sdk:build
pnpm run editor:dev
```
### Production construction
```bash
pnpm run editor:build
```
## 📚 Ecological correlation
### Back-end implementation
[](https://github.com/yx8663/astral-service)
### Document center
[](http://editor-doc.astraljs.com/)
## ☕ Support project
If this project is helpful to you, please feel free to:
1. In case wall [user] (https://github.com/mlt131220/Astral3D/issues/2) leave your usage scenario
2. Scan code support developers:
| AliPay | WeChat |
|---------------------------------------------------------------------------|------------------------------------------------------------------------------|
| <img src="https://editor-doc.astraljs.com/images/AliPay.png" width="200"> | <img src="https://editor-doc.astraljs.com/images/WeChatPay.png" width="200"> |
## ⚖️ License agreement
This project adopts the [![Apache License] (https://img.shields.io/badge/License-Apache_2.0-blue.svg)] (License) open source licenses, please comply with the terms of the agreement and the following supplementary conditions:
- ✅ allows: individual learning/secondary development
- ⚠️ A copyright notice is required
- ⚠️ commercial use requires authorization
- ❌ Prohibited: using this project for business or illegal purposes that are competitive with **hangzhou xingluan digital technology**
**[Full legal notice](LEGAL.md)** | **[Contribution guide](CONTRIBUTING.md)**
## 🌟 Star trend
[](https://star-history.com/#mlt131220/Astral3D&Date)
================================================
FILE: README.md
================================================
# <img src="https://editor.astraljs.com/static/images/logo/logo.png" width="30" height="30"> Astral 3D Editor
🌍 简体中文 | [English](README.en.md)
直达:
[](https://github.com/mlt131220/Astral3D)
[](https://gitee.com/mlt131220/Astral3D)
[](https://editor.astraljs.com)
> 基于 Vue3 + Three.js 的现代 Web 3D 编辑器
<div align="center">
<img src="http://editor-doc.astraljs.com/images/home/thumbnailDark.png?t=20250518" width="800" alt="Editor City Preview">
<img src="http://editor-doc.astraljs.com/images/home/industryDark.png?t=20250318" width="800" alt="Editor Preview">
</div>
## 💬 加入社区
通过以下方式获取最新动态和技术支持:
|  | -07C160?logo=wechat&logoColor=white)
|---------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <img src="https://fs.mhbdng.cn/temp/4851677b-661d-4e60-884d-414316290425.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=6TE7OKPZN15R380TGT1V%2F20260111%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260111T135452Z&X-Amz-Expires=3600&X-Amz-Security-Token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJwYXJlbnQiOiJtbHQxMzEyMjAiLCJleHAiOjE3NjgxODExNTV9.RAvlAnLKtG-9rNIZMrO5lrSJc_N1VqHf3yF3-slD59b-miNqdorqsI9Zmaz6_imBe_uw1u5KMt_OGE7No-vxfA&X-Amz-Signature=4868484133727ab3881d0f7eb65a52db07ee91bc154b4bf4b88d19a91446188e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" width="200"> | <img src="https://fs.mhbdng.cn/temp/c1c7ecef-d655-4bb3-97e8-54402e3a48ef.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=6TE7OKPZN15R380TGT1V%2F20260111%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260111T135514Z&X-Amz-Expires=3600&X-Amz-Security-Token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJwYXJlbnQiOiJtbHQxMzEyMjAiLCJleHAiOjE3NjgxODExNTV9.RAvlAnLKtG-9rNIZMrO5lrSJc_N1VqHf3yF3-slD59b-miNqdorqsI9Zmaz6_imBe_uw1u5KMt_OGE7No-vxfA&X-Amz-Signature=7005038e2ded3dbad425f6a23341002bf79c3ffe9f2166af18348dcaeb61dca0&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" width="200">
## 🚀 核心能力
### 核心功能
- ✅ 多格式支持:[30+ 模型格式(GLTF/OBJ/FBX/GLB/RVT/IFC等)](http://editor-doc.astraljs.com/guide/f7smai4w/#%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E5%8C%BA)
- ✅ BIM模型轻量化展示(RVT/IFC)
- ✅ CAD图纸解析(DWG/DXF)
- ✅ 场景分包存储与加载
- ✅ 动画编辑器
### 扩展能力
- 🧩 插件系统
- 📜 脚本运行时
- 💫 粒子系统
- ❄️ 天气系统
- ☁️ 云存储集成
- 🎠 资源中心
### 即将到来
- 🚧 物理引擎支持
- 🚧 WebGPU 支持
- 🚧 数据组件(API/WebSocket)
- 🚧 低代码数据大屏
- 🚧 WebSocket 多人协作
## 🛠️ 技术栈




## ⚡ 快速开始
### 前置需求
- Node.js ≥ 23.11.x
- PNPM
### 本地运行
```bash
git clone https://github.com/mlt131220/Astral3D.git
cd Astral3D
pnpm install
pnpm run sdk:build
pnpm run editor:dev
```
### 生产构建
```bash
pnpm run editor:build
```
## 📚 生态相关
### 后端实现
[](https://github.com/yx8663/astral-service)
### 文档中心
[](http://editor-doc.astraljs.com/)
## ☕ 支持项目
如果本项目对您有帮助,欢迎:
1. 在 [用户案例墙](https://github.com/mlt131220/Astral3D/issues/2) 留下您的使用场景
2. 扫码支持开发者:
| 支付宝 | 微信 |
|---------------------------------------------------------------------------|------------------------------------------------------------------------------|
| <img src="https://editor-doc.astraljs.com/images/AliPay.png" width="200"> | <img src="https://editor-doc.astraljs.com/images/WeChatPay.png" width="200"> |
## ⚖️ 许可协议
本项目采用 [](LICENSE) 开源协议,使用时请遵守协议条款及以下补充条款:
- ✅ 允许:个人学习/二次开发
- ⚠️ 需要版权声明
- ⚠️ 商业用途需要授权
- ❌ 禁止:将本项目用于与**杭州星孪数字科技**有竞争性的业务或非法用途
**[完整法律声明](LEGAL.md)** | **[贡献指南](CONTRIBUTING.md)**
## 🌟 Star 趋势
[](https://star-history.com/#mlt131220/Astral3D&Date)
================================================
FILE: common/build/package.json
================================================
{
"name": "@astral3d/build-vite-plugins",
"author": "ErSan<mlt131220@163.com>",
"private": true,
"version": "1.0.0",
"type": "module",
"main": "./src/index.ts",
"dependencies": {
},
"devDependencies": {
"@types/fs-extra": "^11.0.3",
"dotenv": "16.3.1",
"fs-extra": "^11.1.1",
"rollup-plugin-visualizer": "catalog:",
"typescript": "catalog:",
"unplugin-config": "^0.1.5",
"vite": "catalog:",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-enhance-log": "^0.6.2",
"vite-plugin-top-level-await": "^1.3.1"
}
}
================================================
FILE: common/build/src/index.ts
================================================
export * from './utils.ts';
export * from './plugins/index.ts';
================================================
FILE: common/build/src/plugins/appConfig.ts
================================================
// @ts-ignore
import ConfigPlugin from 'unplugin-config/vite';
import type { PluginOption } from 'vite';
import {getEnvConfig,strToHex} from "../utils.ts";
export async function createConfigPluginConfig(
shouldGenerateConfig: boolean,
): Promise<PluginOption> {
const config:Record<string, any> = await getEnvConfig();
const APP_NAME = strToHex(config?.VITE_GLOB_APP_TITLE ?? '__APP');
// https://github.com/kirklin/unplugin-config
return ConfigPlugin({
appName: APP_NAME,
baseDir:"./",
envVariables: {
prefix: 'VITE_GLOB_',
files: [".env.production", ".env"],
},
configFile: {
generate: shouldGenerateConfig,
fileName: '_astral3d.config.js',
outputDir: 'dist',
},
htmlInjection: {
decodeEntities: true,
},
});
}
================================================
FILE: common/build/src/plugins/compress.ts
================================================
/**
* 用于打包和输出gzip;
* 注意,这在Vite中不能正常工作,具体原因还在调查中
* https://github.com/anncwb/vite-plugin-compression
*/
import type { PluginOption } from 'vite';
import compressPlugin from 'vite-plugin-compression';
export function configCompressPlugin({compress,deleteOriginFile = false}: {
compress: "gzip" | "brotli" | "none";
deleteOriginFile?: boolean;
}): PluginOption[] {
const compressList = compress.split(',');
const plugins: PluginOption[] = [];
if (compressList.includes('gzip')) {
plugins.push(
compressPlugin({
ext: '.gz',
deleteOriginFile,
}),
);
}
if (compressList.includes('brotli')) {
plugins.push(
compressPlugin({
ext: '.br',
algorithm: 'brotliCompress',
deleteOriginFile,
}),
);
}
return plugins;
}
================================================
FILE: common/build/src/plugins/index.ts
================================================
import type {PluginOption} from 'vite';
import topLevelAwait from "vite-plugin-top-level-await";
import EnhanceLog from 'vite-plugin-enhance-log';
import {createConfigPluginConfig} from "./appConfig.ts";
import {configCompressPlugin} from "./compress.ts";
import {configVisualizerConfig} from "./visualizer.ts";
interface Options {
isBuild: boolean;
root: string;
compress: {
compress: "gzip" | "brotli" | "none";
deleteOriginFile: boolean;
};
enableAnalyze?: boolean;
enableConfig?: boolean;
}
export async function createPlugins({isBuild,compress,enableAnalyze,enableConfig}: Options) {
const vitePlugins: (PluginOption | PluginOption[])[] = [
topLevelAwait({
// 每个块模块的顶级await promise的导出名称
promiseExportName: "__tla",
// 用于在每个块模块中生成顶级await承诺的导入名称的函数
promiseImportName: i => `__tla_${i}`
}),
EnhanceLog({
/** 高亮文件名(firefox不支持) */
colorFileName: true,
splitBy: '\n',
preTip: '🚀🚀🚀🚀🚀🚀',
enableFileName: { enableDir: false}
}),
];
if(enableConfig){
const appConfigPlugin = await createConfigPluginConfig(isBuild);
vitePlugins.push(appConfigPlugin);
}
// 以下插件只在生产环境中工作
if (isBuild) {
// rollup-plugin-gzip
vitePlugins.push(configCompressPlugin(compress));
// 打包视图分析 rollup-plugin-visualizer
if (enableAnalyze) {
vitePlugins.push(configVisualizerConfig());
}
}
return vitePlugins;
}
================================================
FILE: common/build/src/plugins/visualizer.ts
================================================
/**
* package.json包文件容量分析
*/
// @ts-ignore
import {visualizer} from 'rollup-plugin-visualizer';
import { type PluginOption } from 'vite';
export function configVisualizerConfig() {
return visualizer({
filename: 'node_modules/.cache/visualizer/stats.html',
open: true,
gzipSize: true,
brotliSize: true,
}) as PluginOption;
}
================================================
FILE: common/build/src/utils.ts
================================================
import { join } from 'node:path';
import pkg from 'fs-extra';
import {parse} from "dotenv";
/**
* 读取所有环境变量配置文件以处理.env
*/
export function wrapperEnv(envConf) {
const ret:any = {};
for (const envName of Object.keys(envConf)) {
let realName = envConf[envName].replace(/\\n/g, '\n');
realName = realName === 'true' ? true : realName === 'false' ? false : realName;
if (envName === 'VITE_PORT') {
realName = Number(realName);
}
ret[envName] = realName;
if (typeof realName === 'string') {
process.env[envName] = realName;
} else if (typeof realName === 'object') {
process.env[envName] = JSON.stringify(realName);
}
}
return ret;
}
/**
* 获取当前环境下生效的配置文件名
*/
function getConfFiles() {
const script = process.env.npm_lifecycle_script;
const reg = new RegExp('--mode ([a-z_\\d]+)');
const result = reg.exec(script as string) as any;
if (result) {
const mode = result[1] as string;
return ['.env', `.env.${mode}`];
}
return ['.env', '.env.production'];
}
/**
* 获取以指定前缀开头的环境变量
* @param match prefix
* @param confFiles ext
*/
export async function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) {
let envConfig = {};
for (const confFile of confFiles) {
try {
const envPath = await pkg.readFile(join(process.cwd(), confFile), { encoding: 'utf8' });
const env = parse(envPath);
envConfig = { ...envConfig, ...env };
} catch (e) {
console.error(`Error in parsing ${confFile}`, e);
}
}
const reg = new RegExp(`^(${match})`);
Object.keys(envConfig).forEach((key) => {
if (!reg.test(key)) {
Reflect.deleteProperty(envConfig, key);
}
});
return envConfig;
}
export function strToHex(str: string) {
const result: string[] = [];
for (let i = 0; i < str.length; ++i) {
const hex = str.charCodeAt(i).toString(16);
result.push(('000' + hex).slice(-4));
}
return result.join('').toUpperCase();
}
================================================
FILE: common/build/tsconfig.json
================================================
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "esnext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"noImplicitAny": false,
/* Bundler mode */
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": ".",
"types": [],
"typeRoots": ["./node_modules/@types/"]
},
"include": ["src"],
"exclude": []
}
================================================
FILE: package.json
================================================
{
"name": "astral3d",
"version": "1.0.0",
"description": "Astral3D Engine",
"author": "ErSan <mlt131220@163.com>",
"scripts": {
"docs:dev": "pnpm run -C packages/docs docs:dev",
"docs:dev-clean": "pnpm run -C packages/docs docs:dev-clean",
"docs:build": "pnpm run -C packages/docs docs:build",
"docs:preview": "pnpm run -C packages/docs docs:preview",
"editor:dev": "pnpm run -C packages/editor dev",
"editor:build": "pnpm run sdk:build && pnpm run -C packages/editor build",
"editor:tsc": "pnpm run -C packages/editor tsc",
"editor:preview": "pnpm run -C packages/editor preview",
"sdk:dev": "pnpm run -C packages/sdk dev",
"sdk:build": "pnpm run -C packages/sdk build",
"examples:dev": "pnpm run -C packages/examples dev",
"examples:build": "pnpm run -C packages/examples build"
},
"engines": {
"node": ">=23.0.0"
},
"keywords": [],
"devDependencies": {
"prettier": "^3.7.4"
},
"packageManager": "pnpm@10.8.1"
}
================================================
FILE: packages/docs/.gitignore
================================================
node_modules
src/.vuepress/.cache
src/.vuepress/dist
src/.vuepress/.temp
================================================
FILE: packages/docs/.npmrc
================================================
shamefully-hoist=true
shell-emulator=true
auto-install-peers=true
================================================
FILE: packages/docs/package.json
================================================
{
"name": "@astral3d/docs",
"type": "module",
"version": "1.0.0",
"description": "Astral3D 文档",
"packageManager": "pnpm@10.8.1",
"author": "ErSan <mlt131220@163.com>",
"scripts": {
"docs:dev": "vuepress dev src",
"docs:dev-clean": "vuepress dev src --clean-cache --clean-temp",
"docs:build": "vuepress build src --clean-cache --clean-temp",
"docs:preview": "http-server src/.vuepress/dist",
"vp-update": "pnpm dlx vp-update"
},
"devDependencies": {
"@vuepress/bundler-vite": "^2.0.0-rc.24",
"http-server": "^14.1.1",
"sass-embedded": "^1.85.0",
"typescript": "catalog:",
"vue": "catalog:",
"vuepress": "^2.0.0-rc.24",
"vuepress-theme-plume": "^1.0.0-rc.164"
}
}
================================================
FILE: packages/docs/src/.vuepress/_bulletin.md
================================================
---
title: _bulletin
createTime: 2025/10/02 00:22:16
permalink: /astral/ib77r5fd/
---
::: center
**QQ 交流群:** [1040320579](https://qm.qq.com/cgi-bin/qm/qr?k=Ewp9bODHFFaY6yphwEzmSe4lv889WbjR&jump_from=webapi&authKey=5gUSKPjhnXjhIy3pudNN/9igLNGxEwnN8yiXEDnEalE9loBQ4lEtVISG8OyXWmx8)
{width="618" height="616" style="width: 200px"}
您在使用过程中遇到任何问题,欢迎通过 [issue](https://github.com/mlt131220/Astral3D/issues/new) 反馈。也欢迎加入我们的 QQ 交流群一起讨论。
> :fire: 4核8G 200兆服务器,仅需49元/月,[点击这里购买](https://www.rainyun.com/Astral3D_)
> 专属优惠码:Astral3D
:::
================================================
FILE: packages/docs/src/.vuepress/client.ts
================================================
import { defineClientConfig } from 'vuepress/client'
// import RepoCard from 'vuepress-theme-plume/features/RepoCard.vue'
// import NpmBadge from 'vuepress-theme-plume/features/NpmBadge.vue'
// import NpmBadgeGroup from 'vuepress-theme-plume/features/NpmBadgeGroup.vue'
// import Swiper from 'vuepress-theme-plume/features/Swiper.vue'
// import CustomComponent from './theme/components/Custom.vue'
// import './theme/styles/custom.css'
export default defineClientConfig({
enhance({ app }) {
// built-in components
// app.component('RepoCard', RepoCard)
// app.component('NpmBadge', NpmBadge)
// app.component('NpmBadgeGroup', NpmBadgeGroup)
// app.component('Swiper', Swiper) // you should install `swiper`
// your custom components
// app.component('CustomComponent', CustomComponent)
},
})
================================================
FILE: packages/docs/src/.vuepress/config.ts
================================================
import { viteBundler } from '@vuepress/bundler-vite'
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'
import path from 'node:path'
export default defineUserConfig({
port: 8089,
base: '/',
lang: 'zh-CN',
title: 'Astral3D',
description: 'Astral3D 文档',
head: [
// 配置站点图标
['link', { rel: 'icon', type: 'image/png', href: '/logo64x64.png' }],
],
bundler: viteBundler(),
shouldPrefetch: false, // 站点较大,页面数量较多时,不建议启用
theme: plumeTheme({
/* 添加您的部署域名, 有助于 SEO, 生成 sitemap */
hostname: 'https://docs.astraljs.com',
// 公告板
bulletin: {
lifetime:"session", // 在会话周期内关闭公告后不再显示
contentType:"markdown",
contentFile: path.join(__dirname, '_bulletin.md'),
},
/* 文档仓库配置,用于 editLink */
// docsRepo: '',
// docsDir: 'docs',
// docsBranch: '',
/* 页内信息 */
// editLink: true,
// lastUpdated: true,
// contributors: true,
// changelog: false,
/**
* 博客
* @see https://theme-plume.vuejs.press/config/basic/#blog
*/
// blog: false, // 禁用博客
// blog: {
// postList: true, // 是否启用文章列表页
// tags: true, // 是否启用标签页
// archives: true, // 是否启用归档页
// categories: true, // 是否启用分类页
// postCover: 'right', // 文章封面位置
// pagination: 15, // 每页显示文章数量
// },
/* 博客文章页面链接前缀 */
article: '/astral/',
/**
* 编译缓存,加快编译速度
* @see https://theme-plume.vuejs.press/config/basic/#cache
*/
cache: 'filesystem',
/**
* 为 markdown 文件自动添加 frontmatter 配置
* @see https://theme-plume.vuejs.press/config/basic/#autofrontmatter
*/
// autoFrontmatter: {
// permalink: true, // 是否生成永久链接
// createTime: true, // 是否生成创建时间
// title: true, // 是否生成标题
// },
// 文章贡献者
contributors: {
mode: 'block',
},
plugins: {
git: true,
/**
* Shiki 代码高亮
* @see https://theme-plume.vuejs.press/config/plugins/code-highlight/
*/
// shiki: {
// // 强烈建议预设代码块高亮语言,插件默认加载所有语言会产生不必要的时间开销
// languages: ['shell', 'bash', 'typescript', 'javascript'],
// twoslash: true, // 启用 twoslash
// whitespace: true, // 启用 空格/Tab 高亮
// lineNumbers: true, // 启用行号
// },
/* 本地搜索, 默认启用 */
// search: true,
/**
* Algolia DocSearch
* 启用此搜索需要将 本地搜索 search 设置为 false
* @see https://theme-plume.vuejs.press/config/plugins/search/#algolia-docsearch
*/
// docsearch: {
// appId: '',
// apiKey: '',
// indexName: '',
// },
/* 文章字数统计、阅读时间,设置为 false 则禁用 */
// readingTime: true,
/**
* markdown enhance
* @see https://theme-plume.vuejs.press/config/plugins/markdown-enhance/
*/
// markdownEnhance: {
// chartjs: true,
// echarts: true,
// mermaid: true,
// flowchart: true,
// },
/**
* markdown power
* @see https://theme-plume.vuejs.press/config/plugin/markdown-power/
*/
// markdownPower: {
// pdf: true, // 启用 PDF 嵌入 @[pdf](/xxx.pdf)
// caniuse: true, // 启用 caniuse 语法 @[caniuse](feature_name)
// plot: true, // 启用隐秘文本语法 !!xxxx!!
// bilibili: true, // 启用嵌入 bilibili视频 语法 @[bilibili](bid)
// youtube: true, // 启用嵌入 youtube视频 语法 @[youtube](video_id)
// artPlayer: true, // 启用嵌入 artPlayer 本地视频 语法 @[artPlayer](url)
// audioReader: true, // 启用嵌入音频朗读功能 语法 @[audioReader](url)
// icons: true, // 启用内置图标语法 :[icon-name]:
// codepen: true, // 启用嵌入 codepen 语法 @[codepen](user/slash)
// replit: true, // 启用嵌入 replit 语法 @[replit](user/repl-name)
// codeSandbox: true, // 启用嵌入 codeSandbox 语法 @[codeSandbox](id)
// jsfiddle: true, // 启用嵌入 jsfiddle 语法 @[jsfiddle](user/id)
// npmTo: true, // 启用 npm-to 容器 ::: npm-to
// demo: true, // 启用 demo 容器 ::: demo
// repl: { // 启用 代码演示容器
// go: true, // ::: go-repl
// rust: true, // ::: rust-repl
// kotlin: true, // ::: kotlin-repl
// },
// imageSize: 'local', // 启用 自动填充 图片宽高属性,避免页面抖动
// },
/**
* 在 Markdown 文件中导入其他 markdown 文件内容。
* @see https://theme-plume.vuejs.press/guide/markdown/include/
*/
// markdownInclude: true,
/**
* Markdown 数学公式
* @see https://theme-plume.vuejs.press/config/plugins/markdown-math/
*/
// markdownMath: {
// type: 'katex',
// },
/**
* 水印
* @see https://theme-plume.vuejs.press/guide/features/watermark/
*/
// watermark: true,
/**
* 评论 comments
* @see https://theme-plume.vuejs.press/guide/features/comments/
*/
comment: {
provider: 'Giscus', // "Artalk" | "Giscus" | "Twikoo" | "Waline"
comment: true,
repo: 'mlt131220/Astral3D-Docs',
repoId: 'R_kgDOLuBMGg',
category: 'Announcements',
categoryId: 'DIC_kwDOLuBMGs4Cero3',
mapping: 'pathname',
reactionsEnabled: true,
inputPosition: 'top',
},
},
markdown: {
annotation: true,
},
/**
* 加密功能
* @see https://theme-plume.vuejs.press/guide/features/encryption/
*/
// encrypt: {},
}),
})
================================================
FILE: packages/docs/src/.vuepress/navbar.ts
================================================
import { defineNavbarConfig } from 'vuepress-theme-plume';
import { version } from '../../package.json';
export const navbar = defineNavbarConfig([
{
text: '指南',
icon: 'icon-park-outline:guide-board',
link: '/notes/guide/quick-start/介绍.md',
},
{ text: 'SDK', link: '/notes/sdk/README.md', icon: 'carbon:api' },
{ text: '示例', link: 'https://examples.astraljs.com/', icon: 'carbon:carbon-for-ibm-dotcom' },
{ text: '推广中心', link: '/notes/promotion/README.md', icon: 'mdi:star-shooting-outline' },
{ text: '商务合作', link: '/notes/cooperation/README.md', icon: 'carbon:partnership' },
{
text: '更多',
icon: 'icon-park-outline:more-three',
items: [
{ text: '常见问题', link: '/notes/more/questions.md', icon: 'wpf:faq' },
],
},
{
text: `${version}`,
icon: 'codicon:versions',
items: [
{
text: '更新日志',
link: '/notes/update/logs/',
}
],
},
])
================================================
FILE: packages/docs/src/.vuepress/notes.ts
================================================
import { defineNoteConfig, defineNotesConfig } from 'vuepress-theme-plume'
const updateNote = defineNoteConfig({
dir: 'update/logs',
link: '/update',
sidebar: [
{
text: '2025年',
collapsed: false,
icon: 'carbon:calendar',
items: [
'_2025_01',
'_2025_02',
'_2025_03',
'_2025_04',
'_2025_05',
'_2025_06',
]
},
{
text: '2024年',
collapsed: false,
icon: 'carbon:calendar',
items: [
'_2024_03',
'_2024_04',
'_2024_05',
'_2024_06',
'_2024_07',
'_2024_08',
'_2024_09',
'_2024_10',
'_2024_11',
'_2024_12',
]
},
{
text: '2023年',
collapsed: false,
icon: 'carbon:calendar',
items: [
'_2023_02',
'_2023_03',
'_2023_04',
'_2023_05',
'_2023_07',
'_2023_08',
]
}
]
})
const planNote = defineNoteConfig({
dir: 'update/plan',
link: '/update/plan',
sidebar: 'auto'
})
const guideNote = defineNoteConfig({
dir: 'guide',
link: '/guide',
sidebar: [
{
text: '快速入门',
collapsed: false,
prefix: 'quick-start',
icon: 'carbon:lightning',
items: [
'介绍',
'安装',
'项目结构',
'部署'
]
},
{
text: '编辑器使用手册',
collapsed: false,
prefix: 'manual',
icon: 'carbon:apps',
items: [
{
text: '首页',
collapsed: false,
prefix: 'home',
items: [
'项目',
'数据中心',
'资源中心',
'设置中心',
]
},
{
text: '编辑器',
collapsed: false,
prefix: 'editor',
items: [
'界面',
"顶栏",
{
text: '左侧边栏',
collapsed: false,
prefix: 'leftSidebar',
items: [
'场景树',
'CAD解析预览',
'BIM轻量化',
]
},
{
text: '视口',
collapsed: false,
prefix: 'viewport',
items: [
'2D图纸',
'3D场景'
]
},
{
text: '扩展栏',
collapsed: false,
prefix: 'extras',
items: [
'资源中心',
'动画编辑器',
'日志'
]
},
{
text: '右侧边栏',
collapsed: false,
prefix: 'rightSidebar',
items: [
'场景配置',
'渲染器配置',
'后期处理',
'天气',
'历史记录',
'场景图纸',
'对象',
'几何',
'材质',
'动画',
'脚本',
'粒子',
'广告牌',
'Html面板',
]
},
]
},
{
text: '预览页',
collapsed: false,
prefix: 'preview',
items: [
'界面',
]
},
]
},
{
text: '插件系统',
collapsed: false,
prefix: 'plugins',
icon: 'carbon:lightning',
items: [
'入门',
'插件开发',
{
text: '内置插件',
collapsed: false,
prefix: 'builtin',
icon: 'carbon:plug',
items: [
'glTFHandler'
]
}
]
},
]
})
export const notes = defineNotesConfig({
dir: 'notes',
link: '/',
notes: [updateNote, planNote, guideNote],
})
================================================
FILE: packages/docs/src/.vuepress/plume.config.ts
================================================
import { defineThemeConfig } from 'vuepress-theme-plume'
import { navbar } from './navbar'
import { notes } from './notes'
/**
* @see https://theme-plume.vuejs.press/config/basic/
*/
export default defineThemeConfig({
logo: '/logo64x64.png',
appearance: true, // 配置 深色模式
social: [
{ icon: 'github', link: 'https://github.com/mlt131220/Astral3D' },
],
// navbarSocialInclude: ['github'], // 允许显示在导航栏的 social 社交链接
// aside: true, // 页内侧边栏, 默认显示在右侧
// outline: [2, 3], // 页内大纲, 默认显示 h2, h3
/**
* 文章版权信息
* @see https://theme-plume.vuejs.press/guide/features/copyright/
*/
copyright: true,
prevPage: true, // 是否启用上一页链接
nextPage: true, // 是否启用下一页链接
createTime: true, // 是否显示文章创建时间
/* 站点页脚 */
footer: {
message: '',
copyright: 'Copyright © 2023-present <a target="_blank" href="https://github.com/mlt131220">ErSan <mlt131220@163.com></a>',
},
/**
* @see https://theme-plume.vuejs.press/config/basic/#profile
*/
profile: {
avatar: '/logo64x64.png',
name: 'Astral3D',
description: 'Astral3D 文档',
// circle: true,
// location: '',
// organization: '',
},
// 导航栏配置
navbar,
notes,
/* 过渡动画 @see https://theme-plume.vuejs.press/config/basic/#transition */
// transition: {
// page: true, // 启用 页面间跳转过渡动画
// postList: true, // 启用 博客文章列表过渡动画
// appearance: 'fade', // 启用 深色模式切换过渡动画, 或配置过渡动画类型
// },
})
================================================
FILE: packages/docs/src/.vuepress/theme/components/Custom.vue
================================================
<script setup lang="ts">
import { ref } from 'vue'
const message = ref('Hello World!')
</script>
<template>
<div class="my-custom-content">
{{ message }}
</div>
</template>
================================================
FILE: packages/docs/src/.vuepress/theme/shim.d.ts
================================================
declare module '*.vue' {
import type { ComponentOptions } from 'vue'
const comp: ComponentOptions
export default comp
}
================================================
FILE: packages/docs/src/.vuepress/theme/styles/custom.css
================================================
:root {
/** 主题颜色 */
/*
--vp-c-brand-1: #5086a1;
--vp-c-brand-2: #6aa1b7;
--vp-c-brand-3: #8cccd5;
--vp-c-brand-soft: rgba(131, 208, 218, 0.314);
*/
/** 背景颜色 */
/*
--vp-c-bg: #fff;
--vp-c-bg-alt: #f6f6f7;
--vp-c-bg-elv: #fff;
--vp-c-bg-soft: #f6f6f7;
*/
/** 文本颜色 */
/*
--vp-c-text-1: rgba(60, 60, 67);
--vp-c-text-2: rgba(60, 60, 67, 0.78);
--vp-c-text-3: rgba(60, 60, 67, 0.56);
*/
}
/** 深色模式 */
[data-theme="dark"] {
/*
--vp-c-brand-1: #8cccd5;
--vp-c-brand-2: #6aa1b7;
--vp-c-brand-3: #5086a1;
--vp-c-brand-soft: rgba(131, 208, 218, 0.314);
*/
/*
--vp-c-bg: #1b1b1f;
--vp-c-bg-alt: #161618;
--vp-c-bg-elv: #202127;
--vp-c-bg-soft: #202127;
*/
/*
--vp-c-text-1: rgba(255, 255, 245, 0.86);
--vp-c-text-2: rgba(235, 235, 245, 0.6);
--vp-c-text-3: rgba(235, 235, 245, 0.38);
*/
}
================================================
FILE: packages/docs/src/README.md
================================================
---
pageLayout: home
externalLinkIcon: false
config:
-
type: hero
full: true
background: tint-plate
hero:
name: Astral 3D Engine
tagline: Astral 3D Editor
text: 工业孪生3D引擎
actions:
-
theme: brand
text: 快速入门 -->
link: /guide/6xkx4dnv/
-
theme: alt
text: Demo
link: https://editor.astraljs.com/#/
-
theme: alt
text: Github
link: https://github.com/mlt131220/Astral3D
-
type: features
features:
-
title: 最新技术栈
icon: 🍡
details: 基于Vue3、Vite、TypeScript、Naive UI等最新技术栈开发
-
title: 基于ThreeJS
icon: 🌷
details: Three.js 是基于webGL的封装的一个易于使用且轻量级的3D库,是前端开发者研发3D绘图的主要工具
-
title: 简洁易用
icon: 🔅
details: 高效进行场景处理,并且提供网络压缩存储功能,在项目中快速读取加载
-
title: CAD 在线解析
icon: 🌈
details: 支持CAD图纸在线解析预览
-
title: 插件系统
icon: 🏝️
details: 编辑器提供了开放的插件系统,内置丰富的插件库,如:glTF处理器、地形生成器、模型转换器等等。
-
title: 粒子系统
icon: 💊
details: 内置多种粒子效果,如:烟花、火焰、烟雾、萤火虫等,丰富的配置项可以满足用户各种需求。
-
title: 动画系统
icon: 🎡
details: 支持在线编辑动画关键帧,完善的动画编辑器将支撑你的创作。
-
title: 天气系统
icon: 🌤️
details: 支持多种天气效果,如:晴天、雾天、雨天、雪天等。
-
title: 资源中心
icon: 🎁
details: 模型、材质、粒子、广告牌(Billboard)、HtmlPanel....
-
title: WebGPU (开发阶段)
icon: 🚩
details: 更快的计算...
-
type: image-text
title: 工业范
description: CAD? BIM? 亦或更多?
image: /images/home/industryDark.png
width: 600
list:
-
title: CAD
description: 支持 <code>.dwg,.dxf</code> 图纸解析预览
-
title: Future
description: PDMS、VTU
-
type: custom
---
<script setup>
import RepoCard from 'vuepress-theme-plume/features/RepoCard.vue'
</script>
<CardGrid>
<RepoCard repo="mlt131220/Astral3D" />
<RepoCard repo="mlt131220/Astral3D" provider="gitee" />
</CardGrid>
### :zap: 快速开始
:::code-tabs
@tab bash
```bash
git clone https://github.com/mlt131220/Astral3D.git
cd Astral3D
pnpm install
pnpm run sdk:build
pnpm run editor:dev
```
:::
================================================
FILE: packages/docs/src/notes/cooperation/README.md
================================================
---
title: 商务合作
createTime: 2025/10/06 21:04:41
permalink: /astral/nf8y5syx/
---
# 寻求合作,共创价值
> 您好!我们是 ==Astral 3D== 开源项目的核心开发团队。
> ==Astral 3D Editor== 是一个功能强大的、完全开源的 Web3D 编辑器,致力于为开发者和设计师提供高效、便捷的 3D 场景创作工具。
> 我们拥有深厚的 `WebGL、WebGPU、Three.js、Babylon.js、Vue/React` 等全栈开发经验,除了维护核心的开源项目外,我们也承接相关的商业项目,旨在将专业的技术实力转化为您的商业价值。
## 我们的合作模式
我们专注于提供高质量的 ==Web 前后端== 技术开发服务,主要合作模式包括:
* **Web3D 项目外包:**
* **产品3D展示:** 将您的产品以交互式3D模型的形式呈现在网页上。
* **数据可视化:** 构建复杂的 3D 数据可视化大屏,让数据生动直观。
* **虚拟展厅/数字孪生:** 为您的业务打造沉浸式的在线虚拟空间。
* **3D场景与游戏开发:** 基于 Web 技术开发轻量级的 3D 互动场景或小游戏。
* **Web 开发外包:**
* **复杂前端页面开发:** 擅长使用 `Vue/React` 等现代框架构建高性能、高交互性的 Web 应用。
* **全栈项目开发:** 提供从前端到后端的整套解决方案。
* **定制化开发与技术咨询:**
* 基于我们的开源编辑器进行二次开发,为您量身定制专属功能。
* 提供 `Web3D` 相关的技术咨询、方案设计和性能优化服务。
* **更多的合作可能性?**
* 专业团队,为您提供所需。
## 为什么选择我们?
* **核心团队,技术保障:** 您将直接与开源项目的核心开发者沟通,我们对 ==Web3D 技术/ Web前后端== 有深入的理解和丰富的实战经验。
* **开源基础,降本增效:** 基于我们成熟的开源编辑器/其他产品,可以为您快速搭建项目原型,显著缩短开发周期,降低开发成本。
* **代码质量,值得信赖:** 开源意味着我们的代码经过了社区的广泛检验,我们始终坚持高标准的编码规范和交付质量。
* **专注高效,沟通直接:** 我们是纯粹的技术团队,沟通直接高效,致力于用最合适的技术方案解决您的实际问题。
## 联系方式
如果您有项目需求或合作意向,欢迎添加我的微信进行深入沟通。请在好友申请中备注“**商务合作**”或“**您的公司/项目名**”,以便我能快速通过并了解您的需求。
<div style="display:flex;justify-content: center;align-items: center;flex-direction: column">
| 商务微信 |
|:--------------------------------------------------------------:|
| {width="300" height="300"} |
微信号:**mahaibing130802**
</div>
我们期待通过精湛的技术,助力您的业务在==数字化浪潮==中脱颖而出。
================================================
FILE: packages/docs/src/notes/guide/manual/editor/extras/动画编辑器.md
================================================
---
title: 动画编辑器
createTime: 2025/03/31 19:50:56
permalink: /guide/5s7acuj0/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/extras/日志.md
================================================
---
title: 日志
createTime: 2025/03/31 20:03:00
permalink: /guide/0q1bxrub/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/extras/资源中心.md
================================================
---
title: 资源中心
createTime: 2025/03/31 19:51:33
permalink: /guide/dju4ekca/
---
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/extras/resource.png"
title="资源中心"
author="ErSan"
date="2025/04/17"
/>
:::
## 简要说明
在扩展栏左上角下拉菜单中可将扩展面板切换到资源中心模块。<br />
资源共分为==模型、材质、粒子、广告牌、Html面板、灯光、相机==。<br />
编辑器已内置大多通用资源,也可在扩展栏右上角切换资源来源:==内置资源/公共资源==。
**主要亮点:**
- **资源分类清晰**:支持多种资源类型,方便用户快速查找和使用。
- **资源来源灵活**:可切换内置资源和公共资源,满足不同场景需求。
- **高效管理**:支持资源的快速预览、搜索和分类管理。
- **扩展性强**:用户可自定义资源并上传到公共资源库。
## 功能说明
- **资源搜索**:按名称模糊搜索已选择分类下的资源。
- **模型**:内置多种类型的模型,用户可快速预览模型并拖拽到场景中使用。
- **材质**:提供丰富的材质库,用户可实时预览材质效果并应用至模型。
- **粒子**:内置多种粒子效果模板,支持参数调整和自定义粒子效果创建。
- **广告牌**:支持图片和文字广告牌的快速创建,适用于场景标注和装饰。
- **Html面板**:允许嵌入自定义HTML内容,支持动态交互和样式调整。
- **灯光**:提供多种灯光类型(如点光源、聚光灯等),支持实时调整光照参数。
- **相机**:内置透视相机与正交相机,满足不同场景需求。
### 资源搜索
搜索框位于扩展栏顶部中间。
输入搜索内容,将根据当前所选取资源类型进行模糊查询。
### 模型
如本页首图,内置了多种类型的模型,用户可通过==拖拽/双击==方式将模型添加到场景中。
- ==拖拽==:模型将放置在鼠标放开的屏幕位置
- ==双击==:模型将放置在场景中心
### 材质
内置了多类型的PBR材质、Shader材质,用户可通过==拖拽/双击==方式将材质应用到模型上; <br />
成功应用的材质可在 右侧边栏-[材质](/guide/l1df4723/) 进行参数配置及修改。
- ==右键==:预览材质
- ==拖拽==:材质将应用至鼠标放开位置选取到的模型上
- ==双击==:材质将应用至所选取的模型上
**注意**:材质只能应用至Mesh节点,不能应用于Group、广告牌、粒子、Html面板等节点。即材质只能应用于本身就包含材质属性的模型节点。
### 粒子
内置火焰、烟雾、萤火虫等常见粒子效果模板,用户可通过==拖拽/双击==方式将粒子添加到场景中; <br />
成功添加的粒子可在 右侧边栏-[粒子](/guide/siz46vj0/) 调整粒子发射器参数及粒子行为。
- ==拖拽==:粒子将放置在鼠标放开的屏幕位置
- ==双击==:粒子将放置在场景中心
### 广告牌
内置图标、文本广告牌,用户可通过==拖拽/双击==方式将广告牌添加到场景中; <br />
成功添加的广告牌可在 右侧边栏-[广告牌](/guide/18al65zg/) 进行参数配置及修改。
- ==拖拽==:广告牌将放置在鼠标放开的屏幕位置
- ==双击==:广告牌将放置在场景中心
### Html面板
内置多个Html面板模板,用户可通过==拖拽/双击==方式将Html面板添加到场景中; <br />
该功能允许用户在场景中嵌入HTML内容,如视频播放器、交互式表单、数据图表等,支持动态更新; <br />
成功添加的Html面板可在 右侧边栏-[Html面板](/guide/kk5cv2ij/) 进行参数配置及内容修改。
- ==拖拽==:Html面板将放置在鼠标放开的屏幕位置
- ==双击==:Html面板将放置在场景中心
### 灯光
内置==环境光、平行光、半球光、点光源、聚光灯==五种灯光类型,用户可通过==拖拽/双击==方式将灯光添加到场景中; <br />
成功添加的灯光(选中后)可在 右侧边栏-[对象](/guide/2xlh6nrf/) 进行参数配置及修改。
- ==拖拽==:灯光将放置在鼠标放开的屏幕位置
- ==双击==:灯光将放置在场景中心
### 相机
内置==透视相机、正交相机==,用户可通过==拖拽/双击==方式将相机添加到场景中; <br />
相机添加后可在[3D视口](/guide/jkg3yahd/)左上角进行主相机切换;<br />
成功添加的相机(选中后)可在 右侧边栏-[对象](/guide/2xlh6nrf/) 进行参数配置及修改。
- ==拖拽==:相机将放置在鼠标放开的屏幕位置
- ==双击==:相机将放置在场景中心
================================================
FILE: packages/docs/src/notes/guide/manual/editor/leftSidebar/BIM轻量化.md
================================================
---
title: BIM轻量化
createTime: 2025/03/31 19:48:15
permalink: /guide/rf1xgf4z/
---
<div style="display:flex;justify-content:center;">
<ImageCard
image="/images/manual/editor/leftSidebar/bim.png"
title="BIM"
description="通过将BIM工程文件(.rvt)转换为glTF文件,在保留BIM构件属性的同时压缩优化模型,以达到web端解析BIM并且轻量化的目的。"
width="300"
author="ErSan"
date="2025/04/15"
/>
</div>
## 简要说明
通过编辑器的BIM轻量化功能,您可以将复杂的BIM工程文件(如`.rvt`)转换为轻量化的`.glTF`文件。
转换过程中保留了BIM构件的属性信息,同时对模型进行了压缩优化,方便在Web端进行高效解析与展示。
**主要亮点:**
- 支持BIM文件的轻量化转换,优化模型大小。
- 保留构件属性,便于后续操作与分析。
- 界面设计与[CAD解析预览](/guide/u1631nwk/)类似,操作直观易用。
## 功能说明
- **模型列表**:展示用户上传转换的所有BIM模型。
- **上传模型**:点击顶部==历史记录==右侧的==上传按钮==,会打开模型上传界面。
- **历史记录**:点击顶部==历史记录==按钮,会弹出历史上传记录列表。
### 模型列表
- **功能描述**:展示用户上传并转换成功的所有BIM模型。
- **操作方式**:
如本页面首图,列表以网格形式展示;
从列表中直接==拖动==相应模型到中间的三维视口 或 ==双击==该模型,都可加载并渲染对应模型。
### 上传模型
<div style="display:flex;justify-content:center;">
<ImageCard
image="/images/manual/editor/leftSidebar/bimUpload.png"
title="上传模型"
width="400"
author="ErSan"
date="2025/04/15"
/>
</div>
- **支持格式**:`.rvt、.rfa`
- **转换方式**:
- 文件会在上传后通过WebSocket发起轻量化转换请求。
- 转换结果通过WebSocket消息返回,并加载渲染展示。
- **转换配置**:
- 极致轻量化:模型会在转换过程中执行==网格优化、材质贴图压缩并转换格式为WebP、网格实例化、网格合并==等模型优化操作,以确保输出的BIM轻量化模型是最小体积及最小渲染损耗的glTF模型。过程中可能执行的具体优化项可参考[glTF处理器](/guide/plugin/builtin/jo87cfk0/)章节;
- 导出属性:生成的glTF模型中是否包含构件属性;
- 转换视图:一个BIM文件中可能会包含多个3D视图,如果用户有确切的转换视图目标,可选择`按名称`并输入视图名称以转换;否则将自动以`默认3D视图`为目标转换;
-视觉样式:此设置影响最终输出的模型材质。`着色`模式基本不包含任何材质贴图,以纯色材质方式输出;`真实`模式会包含用户建模时的材质贴图,输出材质更真实;
- 坐标参考:一般情况下,一个BIM工程模型会由多工程师完成,便会存在多个单体BIM文件。此设置会决定最终输出模型与笛卡尔坐标系原点的相对位置信息。关于==原点、项目基点、测量点==的详细说明,可以参考这篇文章:[详解Revit坐标系](https://zhuanlan.zhihu.com/p/220113797)
### 历史记录
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/leftSidebar/bimHistory.png"
title="历史记录"
author="ErSan"
date="2025/04/15"
/>
:::
- **功能描述**:展示用户之前上传的所有BIM模型记录,方便快速查找和重新加载。
- **操作方式**:点击顶部==历史记录==按钮,弹出历史上传记录列表。
================================================
FILE: packages/docs/src/notes/guide/manual/editor/leftSidebar/CAD解析预览.md
================================================
---
title: CAD解析预览
createTime: 2025/03/31 19:49:44
permalink: /guide/u1631nwk/
---
<div style="display:flex;justify-content:center;">
<ImageCard
image="/images/manual/editor/leftSidebar/cad.png"
title="CAD"
description="编辑器支持用户上传CAD图纸(.dwg、.dxf)进行解析预览"
width="300"
author="ErSan"
date="2025/04/15"
/>
</div>
## 简要说明
通过编辑器的CAD解析预览功能,您可以轻松上传并查看多种格式的CAD图纸。<br />
无论是`.dwg`还是`.dxf`,都能快速解析并在三维视口中直观展示。<br />
这一功能不仅提升了图纸管理的效率,还为三维设计和协作提供了极大的便利。<br />
**主要亮点:**
- 支持多种图纸格式,满足不同需求。
- 即时解析与预览,操作简单高效。
- 历史记录功能,方便快速查找和重新加载。
让您的设计流程更加流畅,体验前所未有的便捷与高效!
## 功能说明
- **图纸列表**:展示用户上传并解析成功的所有图纸。
- **上传图纸**:点击顶部==历史记录==右侧的==上传按钮==,会打开图纸上传界面。
- **历史记录**:点击顶部==历史记录==按钮,会弹出历史上传记录列表。
### 图纸列表
- **功能描述**:展示用户上传并解析成功的所有图纸。
- **操作方式**:
如本页面首图,列表以网格形式展示;
从列表中直接==拖动==相应图纸到中间的三维视口 或 ==双击==该图纸,都可加载并渲染对应图纸。
### 上传图纸
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/leftSidebar/cadUpload.png"
title="上传图纸"
author="ErSan"
date="2025/04/15"
/>
:::
- **支持格式**:`.dwg、.dxf、.png、.jpg(jpeg)`
- **解析方式**:
- `.dwg`格式图纸由于无法在前端直接解析,会在上传后通过WebSocket发起图纸解析请求。
- 解析结果通过WebSocket消息返回,并加载渲染展示。
- 如果`.dwg`图纸中包含缩略图,会自动解析为封面图,在`图纸列表`中展示。
### 历史记录
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/leftSidebar/cadHistory.png"
title="历史记录"
author="ErSan"
date="2025/04/15"
/>
:::
- **功能描述**:展示用户之前上传的所有图纸记录,方便快速查找和重新加载。
- **操作方式**:点击顶部==历史记录==按钮,弹出历史上传记录列表。
================================================
FILE: packages/docs/src/notes/guide/manual/editor/leftSidebar/场景树.md
================================================
---
title: 场景树
createTime: 2025/03/31 19:58:06
permalink: /guide/rzqb0h0l/
---
<CardGrid>
<ImageCard
image="/images/manual/editor/leftSidebar/sceneTree.png"
title="场景树"
description="场景树是 Astral3D 编辑器中用于管理场景中所有对象的工具。它以树状结构展示场景中的层级关系,便于用户快速定位和操作对象"
author="ErSan"
date="2025/04/14"
/>
<ImageCard
image="/images/manual/editor/leftSidebar/sceneTreeContextMenu.png"
title="场景节点右键菜单"
description="聚焦、删除、拷贝"
author="ErSan"
date="2025/04/14"
/>
</CardGrid>
## 简要说明
场景树是 Astral3D 编辑器中用于管理场景中所有对象的工具。它以树状结构展示场景中的层级关系,便于用户快速定位和操作对象。
## 功能说明
- **节点搜索**:顶部搜索栏用于快速查找节点,模糊查询到的节点父级会自动展开,并在改节点下添加下划线。
- **层级管理**:通过拖拽操作,可以调整对象的父子关系。
- **对象选择**:点击场景树中的对象名称,可以在场景中选中对应的对象(不会自动聚焦)。
- **聚焦对象**:右键菜单中提供聚焦选项,用以在视口中定位模型(更推荐使用快捷键,默认是`F`)。
- **删除对象**:右键菜单中提供删除选项,方便移除不需要的对象(更推荐使用快捷键,默认是`Del`)。
- **拷贝对象**:右键菜单中提供拷贝选项,方便快速复制对象(同[顶栏](/guide/f7smai4w/)基础操作区中的拷贝)。
<!-- - **对象隐藏/显示**:通过点击对象名称旁的图标,可以快速隐藏或显示对象。
- **重命名**:双击对象名称可以对其进行重命名。 -->
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/Html面板.md
================================================
---
title: Html面板
createTime: 2025/04/17 17:03:07
permalink: /guide/kk5cv2ij/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/几何.md
================================================
---
title: 几何
createTime: 2025/03/31 20:06:40
permalink: /guide/nct00cif/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/动画.md
================================================
---
title: 动画
createTime: 2025/03/31 20:07:33
permalink: /guide/g3kxptm0/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/历史记录.md
================================================
---
title: 历史记录
createTime: 2025/03/31 20:05:25
permalink: /guide/ae7ufigr/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/后期处理.md
================================================
---
title: 后期处理
createTime: 2025/03/31 20:04:44
permalink: /guide/l8hd921o/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/场景图纸.md
================================================
---
title: 场景图纸
createTime: 2025/03/31 20:05:40
permalink: /guide/ta6draim/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/场景配置.md
================================================
---
title: 场景配置
createTime: 2025/03/31 20:04:17
permalink: /guide/pnmbue0k/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/天气.md
================================================
---
title: 天气
createTime: 2025/03/31 20:05:08
permalink: /guide/fn9xwbkf/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/对象.md
================================================
---
title: 对象
createTime: 2025/03/31 20:06:07
permalink: /guide/2xlh6nrf/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/广告牌.md
================================================
---
title: 广告牌
createTime: 2025/04/17 17:11:18
permalink: /guide/18al65zg/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/材质.md
================================================
---
title: 材质
createTime: 2025/03/31 20:07:10
permalink: /guide/l1df4723/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/渲染器配置.md
================================================
---
title: 渲染器配置
createTime: 2025/03/31 20:04:34
permalink: /guide/crvssx6j/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/粒子.md
================================================
---
title: 粒子
createTime: 2025/03/31 19:50:23
permalink: /guide/siz46vj0/
---
================================================
FILE: packages/docs/src/notes/guide/manual/editor/rightSidebar/脚本.md
================================================
---
lang: zh-CN
title: 脚本
createTime: 2025/02/20 15:13:36
permalink: /guide/component/h4v1bkyh/
---
> 主要面相于开发人员,主要功能有:
>
>1. 编写脚本逻辑,并将其挂载于实体模型上;
>2. 脚本组件使用`JavaScript`编程语言;
>3. 脚本组件由事件驱动,在对应生命周期内执行;
>4. 脚本组件可以访问实体模型的属性和方法;
>5. 运行时执行脚本逻辑,并获取脚本执行结果;
### 内置变量
在脚本中已经内置了以下变量:
| 变量 | 描述 | 类型 |
|----------|------------|--------------------------------------------------------------|
| this | 当前实体模型的引用 | `THREE.Object3D` |
| THREE | THREE对象 | `THREE` |
| helper | 辅助类函数集合 | [Helper](#helper) |
| renderer | 当前渲染器的引用 | `THREE.WebGLRenderer` |
| scene | 当前场景的引用 | `THREE.Scene` |
| camera | 当前场景相机的引用 | `THREE.PerspectiveCamera` |
| controls | 当前场景控制器的引用 | [CameraControls](https://github.com/yomotsu/camera-controls) |
| timer | 场景运行时间跟踪 | `three/addons/misc/Timer.js` |
### 内置方法
在脚本中已经内置了以下方法:
| 方法 | 描述 | 传入参数 |
|--------|-----------|-------------------|
| render | 驱动场景渲染一帧。 | `{delta?:number}` |
### 内置生命周期
支持以下几个基本生命周期:
| 生命周期 | 描述 | 参数 |
|-----------------|-------------------------------|----------------------------------------------------------------|
| loaded | 场景加载完成时执行,仅执行一次 | - |
| beforeAnimation | 场景当前动画帧循环开始之前触发,每一帧执行一次 | `{"delta":number}` |
| afterAnimation | 场景当前动画帧循环完成之后立即触发,每一帧执行一次 | `{"delta":number,"toBeRender":(_needRender: boolean) => void}` |
| beforeRender | 场景当前动画帧循环完成之后渲染之前触发,每一次渲染执行一次 | `{"delta":number}` |
| afterRender | 场景当前帧渲染完成之后触发,每一次渲染执行一次 | `{"delta":number}` |
| beforeDestroy | 场景销毁前调用,仅执行一次 | - |
| afterDestroy | 场景销毁后调用,仅执行一次 | - |
> Tips:
>> `toBeRender`:由于本系统默认为事件驱动渲染,而非持续渲染,故提供此方法以便在脚本中实现自定义的逻辑。推荐用法:
>> ```javascript
>> afterAnimation(delta,toBeRender){
>> // 传入true则下一帧一定渲染
>> toBeRender(true);
>> }
>> ```
### 内置事件
支持以下几个基本事件:
| 事件 | 描述 | 参数 |
|---------------|------------|--------------------------------|
| onPick | 模型单击事件 | `intersect:THREE.Intersection` |
| onDoubleClick | 模型双击事件 | `intersect:THREE.Intersection` |
| onKeydown | 键盘按下事件(全局) | `event:KeyboardEvent` |
| onKeyup | 键盘抬起事件(全局) | `event:KeyboardEvent` |
| onPointerDown | 指针按下事件(全局) | `event:PointerEvent` |
| onPointerUp | 指针抬起事件(全局) | `event:PointerEvent` |
| onPointerMove | 指针移动事件(全局) | `event:PointerEvent` |
| onTouchStart | 触屏按下事件(全局) | `event:TouchEvent` |
| onTouchEnd | 触屏释放事件(全局) | `event:TouchEvent` |
<br/>
***
### 辅助类(<a id="helper">Helper</a>)
| 成员 | 描述 | 类型 |
|-----------|----------------------|--------------------------------|
| scene | 当前场景的引用,内置变量scene的引用 | `THREE.Scene` |
| Animation | 未实例化的动画类 | [Animation](#helper-animation) |
| 方法 | 描述 | 参数 | 返回值 |
|--------------|------------------------|------------------------------------------------------------------|------------------|
| objectByUuid | 通过uuid获取场景中的Object3D对象 | `uuid:string` | `THREE.Object3D` |
| moveObject | 移动3D对象到指定位置 | `object: Object3D`<br/>`parent: Object3D`<br/>`before: Object3D` | - |
| removeObject | 从场景中移除3D对象 | `object: THREE.Object3D` | - |
### 动画类(<a id="helper-animation">Animation</a>)
#### 基础用法
```javascript
const animation = new helper.Animation(this);
```
#### API
```typescript
new helper.Animation(object:THREE.Object3D)
```
| 成员 | 描述 | 类型 |
|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------|
| object | 构造函数形参值,动画绑定的对象。<br/> 如果实例化时传入参数this(如上),则指向内置变量this | `THREE.Object3D` |
| actions | 动画动作集合 | `THREE.AnimationAction[]` |
| actionsMap | 动画动作映射表,key为动作名称,value为THREE.AnimationAction对象 | `Map<string, THREE.AnimationAction>` |
| lastPlayAction | 正在播放的动作名称 | `THREE.AnimationAction \| undefined` |
| repetitions | 动画重复次数 | `number` |
| ActionLoop (static) | 动画循环模式枚举:<br/> LoopOnce - 只执行一次 <br/> LoopRepeat - 重复次数为repetitions的值, 且每次循环结束时候将回到起始动作开始下一次循环。 <br/> LoopPingPong - 重复次数为repetitions的值, 且像乒乓球一样在起始点与结束点之间来回循环。 | `Enum` |
| 方法 | 描述 | 参数 | 返回值 |
|-----------|----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------|--------------------------------------|
| getAction | 获取指定名称的动画动作,用于用户直接调用[THREE.AnimationAction的方法](https://threejs.org/docs/index.html#api/zh/animation/AnimationAction) | `name:string` | `THREE.AnimationAction \| undefined` |
| play | 播放指定名称的动画动作,支持链式调用 | `name:string` <br/> `loop:AnimationActionLoopStyles = helper.Animation.ActionLoop.LoopRepeat` <br/> `timeScale:number = 1` | `this(helper.Animation)` |
| pause | 暂停动画,支持链式调用 | `name:string \| undefined` | `this(helper.Animation)` |
| stop | 停止动画,支持链式调用 | `name:string \| undefined` | `this(helper.Animation)` |
### 基础用法
完整结构:
```javascript
/**
* 场景加载完成时执行,仅执行一次
*/
function loaded() {
console.group('loaded');
console.log(this);
console.log(renderer);
console.log(scene);
console.log(camera);
console.log(controls);
console.log(timer);
console.groupEnd()
}
/**
* 场景当前动画帧循环开始之前触发,每一帧执行一次
* @param {number} delta
*/
function beforeAnimation(delta) {}
/**
* 场景当前动画帧循环完成之后立即触发,每一帧执行一次
* @param {number} delta
* @param {(_needRender: boolean) => void} toBeRender 设置下一帧是否将渲染
*/
function afterAnimation(delta,toBeRender) {}
/**
* 场景当前动画帧循环完成之后渲染之前触发,每一次渲染执行一次
* @param {number} delta
*/
function beforeRender(delta) {}
/**
* 场景当前帧渲染完成之后触发,每一次渲染执行一次
* @param {number} delta
*/
function afterRender(delta) {}
/**
* 场景销毁前调用,仅执行一次
*/
function beforeDestroy() {}
/**
* 场景销毁后调用,仅执行一次
*/
function afterDestroy() {}
/**
* 模型单击事件
* @param {THREE.Intersection} intersect
*/
function onPick(intersect) {}
/**
* 模型双击事件
* @param {THREE.Intersection} intersect
*/
function onDoubleClick(intersect) {}
/**
* 键盘按下事件(全局)
* @param {KeyboardEvent} event
*/
function onKeyDown(event) {}
/**
* 键盘抬起事件(全局)
* @param {KeyboardEvent} event
*/
function onKeyUp(event) {}
/**
* 指针按下事件(全局)
* @param {PointerEvent} event
*/
function onPointerDown(event) {}
/**
* 指针抬起事件(全局)
* @param {PointerEvent} event
*/
function onPointerUp(event) {}
/**
* 指针移动事件(全局)
* @param {PointerEvent} event
*/
function onPointerMove(event) {}
/**
* 触屏按下事件(全局)
* @param {TouchEvent} event
*/
function onTouchStart(event) {}
/**
* 触屏释放事件(全局)
* @param {TouchEvent} event
*/
function onTouchEnd(event) {}
```
***
### 示例代码
#### 1. 动态天空盒/模型动画/键盘事件
::: tabs#animate
@tab Scene#scene
```javascript
function afterAnimation(delta,toBeRender){
toBeRender(true)
}
const DEG2RAD = Math.PI / 180;
function beforeRender(delta) {
const t = delta * DEG2RAD;
scene.backgroundRotation.y = t;
}
```
@tab:active Wolf#wolf
```javascript
const anime = new helper.Animation(this);
function loaded() {
anime.play("01_Run_Armature_0");
}
function onKeyDown(event) {
// 按下1则执行 "01_Run_Armature_0" 动画,按下2则执行 "02_walk_Armature_0" 动画,按下3则执行 ""05_site_Armature_0"" 动画,
switch (event.key) {
case "1":
anime.stop();
anime.play("02_walk_Armature_0");
break;
case "2":
anime.stop();
anime.play("05_site_Armature_0");
break;
case "3":
anime.stop();
anime.play("01_Run_Armature_0");
break;
}
}
function beforeDestroy() {
anime.stop();
}
```
:::
<iframe height=500 width=100% src="https://editor.astraljs.com/#/preview/a18eb710-c1f8-4cff-b8ab-c3a2056ccf57" frameborder=0 allowfullscreen></iframe>
================================================
FILE: packages/docs/src/notes/guide/manual/editor/viewport/2D图纸.md
================================================
---
title: 2D图纸
createTime: 2025/03/31 20:00:46
permalink: /guide/7eo51kfy/
---
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/viewport/drawing.png"
title="2D图纸"
description="拖入(双击)添加至场景中的图纸会自动占据中心视口一半的位置,其与3D视图中间的垂直分割线可以左右拖动以改变占据视口的大小"
author="ErSan"
date="2025/04/16"
/>
:::
## 简要说明
==拖入(双击)== 添加至场景中的图纸会自动占据中心视口一半的位置,其与3D视图中间的 ==垂直分割线== 可以左右拖动以改变占据视口的大小。<br />
图纸可以与3D视图联动,提供更直观的设计体验。<br />
这一功能不仅提升了图纸的可视化效果,还为设计和协作提供了极大的便利。<br />
**主要亮点:**
- 使用OffscreenCanvas技术在Worker线程中对图纸内容进行渲染,不会阻塞主线程3D场景的渲染。
- 图纸与3D视图联动,操作简单高效。
- 灵活调整视口分割线,优化工作空间。
## 功能说明
- **图纸加载**:支持将图纸拖入或双击添加至场景。
- **视口分割**:通过拖动分割线调整2D图纸与3D视图的占比。
- **图纸复位**:将图纸的显示区域恢复为初始状态。
- **图层显隐**:查看图纸的图层列表,并显示/隐藏任意图层。
- **新增标记**:在3D视图中选中模型后,便可以在图纸中新增对应的标记框。
- **删除标记**:删除当前选中的标记。
### 图纸加载
- **功能描述**:将图纸拖入或双击添加至场景后,图纸会自动占据中心视口的一半位置。
- **操作方式**:
- 在左侧CAD图纸列表中双击目标图纸,快速加载到场景中。
### 视口分割
- **功能描述**:调整2D图纸与3D视图的占比,优化工作空间。
- **操作方式**:
- 拖动2D图纸与3D视图中间的垂直分割线,调整两者的占比。
<!-- - 分割线位置会自动保存,方便下次使用。 -->
### 图纸复位
- **功能描述**:将图纸的显示区域恢复为初始状态。
- **操作方式**:
- 点击图纸菜单栏中的复位按钮(第一个)。
### 图层显隐
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/viewport/drawingLayer.png"
title="CAD图层"
author="ErSan"
date="2025/04/16"
/>
:::
- **功能描述**:查看图纸的图层列表,并显示/隐藏任意图层。
- **操作方式**:
- 点击图纸菜单栏中的图层按钮(第二个)。
- 弹出的图层列表中,点击任一个图层前面的小眼睛图标即可隐藏对应图层,反正显示对应图层。
- 图层列表顶部的==全部图层==节点可以同时显示/隐藏所有图层。
### 新增标记
- **功能描述**:在图纸中新增3D场景中所选中模型的对应的标记框。
- **操作方式**:
- 在右侧3D场景中选中需要标注的模型。
- 点击图纸菜单栏中的新增标记按钮(第三个)。
- 在图纸需要标记的位置按住鼠标左键拖动,即可绘制出长方形标记框。
- 只会只要在图纸中点击该标记,右侧3D场景便会自动聚焦并选中相应模型。
### 删除标记
- **功能描述**:删除当前选中的标记。
- **操作方式**:
- 在图纸上选中需要删除的标记。
- 点击图纸菜单栏中的删除按钮(第四个)。
- 标记及其与模型的关联关系将被移除。
================================================
FILE: packages/docs/src/notes/guide/manual/editor/viewport/3D场景.md
================================================
---
title: 3D场景
createTime: 2025/03/31 20:00:56
permalink: /guide/jkg3yahd/
---
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/viewport/viewer.png"
title="3D场景"
description="编辑器的核心视口,展示用户所编辑的场景内容。"
author="ErSan"
date="2025/04/16"
/>
:::
## 简要说明
编辑器的核心视口,展示用户所编辑的场景内容。
**主要亮点:**
- 提供六视角切换/主相机切换功能,方便用户观察3D场景。
- 自适应视口。
- 支持多种渲染模式,满足不同场景需求。
- 提供丰富的变换控制工具,便于编辑和调整模型。
## 功能说明
- **主相机切换**:支持在默认的透视相机和其他添加进场景的相机之间切换,满足不同场景的观察需求。
- **六视图**:快速切换到==前、后、左、右、上、下==六个标准视角,便于精确调整模型。
- **渲染模式**:提供==真实、原色、法线、线框==四种渲染模式,适应不同的设计需求。
- **变换控制**:支持平移、旋转、缩放三种变换操作,用户可以通过鼠标或快捷键快速调整模型。
- **坐标参考**:可以切换==世界坐标、本地坐标==,以查看不同坐标系下的轴情况,帮助用户明确模型的方向和位置。
- **场景统计信息**:实时显示场景中的模型数量、顶点数、三角面数、帧时等信息,便于性能优化。
- **视角辅助**:提供视角导航工具,帮助用户快速调整观察方向。
- **操作快捷键**:内置聚焦、删除等快捷键操作,便于快速设计。
### 主相机切换/六视图
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/viewport/viewerCamera.png"
title="场景相机/六视图"
author="ErSan"
date="2025/04/16"
/>
:::
### 渲染模式
<div style="display:flex;justify-content:center;">
<ImageCard
image="/images/manual/editor/viewport/viewerRenderMode.png"
title="渲染模式"
width="400"
author="ErSan"
date="2025/04/16"
/>
</div>
提供以下渲染模式:
- **真实模式**:显示模型的材质效果,并进行实时采样,以产生类似光线追踪的效果。
- **原色模式**:显示模型的材质效果,便于检查纹理和光影。
- **法线模式**:
- **线框模式**:仅显示模型的边框线条,便于查看内部结构。
### 变换控制
<div style="display:flex;justify-content:center;">
<ImageCard
image="/images/manual/editor/viewport/viewerTransform.png"
title="变换控制"
width="400"
author="ErSan"
date="2025/04/16"
/>
</div>
支持以下变换操作:
- **平移**:拖动模型在平面内移动。
- **旋转**:绕指定轴旋转模型。
- **缩放**:调整模型的大小比例。
### 坐标参考
变换控制右边的按钮,点击后会在==世界坐标/本地坐标==之间切换。<br />
用于表明场景中显示的坐标轴(X、Y、Z)所使用的参考坐标系。<br />
比如:A模型在世界坐标下Y轴向上,但是本地坐标下却是Z轴向上。确定轴向可以辅助用户快速定位一些矩阵变换错误的原因。<br />
### 场景统计信息
在界面左下角显示场景的实时统计信息,包括:
- 模型数量
- 顶点数
- 三角面数
- 帧时(帧率 = 1000/帧时)
### 视角辅助
在界面右下角提供了视角辅助器,方便用户快速切换视角,共支持22个视角。
其颜色会跟随编辑器主题变换(深色/浅色)。
### 操作快捷键
支持以下快捷键操作:
- **W**:切换到平移模式。
- **E**:切换到旋转模式。
- **R**:切换到缩放模式。
- **F**:聚焦选中模型。
- **Del**:删除选中模型。
- **Ctrl + Z**:撤销上一步操作。
- **Ctrl + Shift +Z**:重做被撤销的操作。
如果在设置中修改了对应快捷键,则请使用对应快捷键操作。
================================================
FILE: packages/docs/src/notes/guide/manual/editor/界面.md
================================================
---
title: 界面
createTime: 2025/03/31 19:45:41
permalink: /guide/swepocsg/
---
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/editor/page.png"
title="编辑器"
description="整个编辑界面分为 `顶栏`,`左侧边栏`,`场景视口`,`扩展栏`,`右侧边栏` 五个区域"
author="ErSan"
date="2025/04/14"
/>
:::
::: tip 说明
整个编辑界面分为 `顶栏`,`左侧边栏`,`场景视口`,`扩展栏`,`右侧边栏` 五个区域
:::
================================================
FILE: packages/docs/src/notes/guide/manual/editor/顶栏.md
================================================
---
title: 顶栏
createTime: 2025/03/31 20:09:24
permalink: /guide/f7smai4w/
---
::: demo-wrapper img no-padding

:::
::: tip 说明
`顶栏`部分为左中右布局,左侧为`基础操作区`,中间仅展示`场景名称`,右侧为`多功能区域`
:::
## 基础操作区
> 图标/按钮 从左到右依次是 ==Logo、撤回、重做、删除、清空、拷贝、全屏、导出、导入==
::: tabs
@tab Logo
方寸藏寰宇,虚实映乾坤
@tab 撤回
撤销上一步操作。
@tab 重做
恢复被撤销的操作。
@tab 删除
删除当前选中的对象。
@tab 清空
清空场景中的所有内容并重置所有模块。
@tab 拷贝
复制当前选中的对象。
@tab 全屏
切换编辑器的全屏模式,全屏后会变为退出全屏图标,点击可退出全屏。
@tab 导出
<CardGrid>
<ImageCard
image="/images/manual/editor/header/exportObject.png"
title="导出选中对象"
author="ErSan"
date="2025/04/14"
/>
<ImageCard
image="/images/manual/editor/header/exportScene.png"
title="导出场景"
author="ErSan"
date="2025/04/14"
/>
</CardGrid>
导出功能分为两类,一是导出选中的物体,二是导出整个场景。<br />
两者所支持的导出格式一致,分别是==JSON、GLB、GLTF、OBJ、PLY、PLY(二进制)、STL、STL(二进制)、USDZ==
@tab 导入
从文件系统导入模型/场景文件,允许多选,支持在此处导入的文件格式如下:
- [x] glb
- [x] gltf
- [x] fbx
- [x] json (Three JSON / Astral3D JSON)
- [x] zip [+zip]
- [x] obj
- [x] mtl
- [x] ifc
- [x] 3dm
- [x] 3ds
- [x] 3mf
- [x] amf
- [x] dae
- [x] drc
- [x] kmz
- [x] ldr
- [x] mpd
- [x] md2
- [x] pcd
- [x] ply
- [x] stl
- [x] svg
- [x] usdz
- [x] vox
- [x] vtk
- [x] vtp
- [ ] vtu
- [x] wrl
- [x] xyz
- [x] js
[+zip]:
导入zip包时,系统会自动解析处理,分为下面几种情况:
* 同时包含`model.obj`和`materials.mtl`,会按照`.obj`解析
* 遍历解析zip包中的`fbx`、`glb`、`gltf`
:::
## 多功能区域
> 图标/按钮 从左到右依次是 ==保存、预览、国际化、主题、主色调、设置==
::: tabs
@tab 保存
打包当前场景,并保存至服务器。
@tab 预览
打开新的[预览页](/guide/chhmeza7/)窗口进行场景预览。
@tab 国际化
切换编辑器的语言,默认支持语言如下:
- [x] 简体中文
- [x] English
@tab 主题
切换编辑器的主题风格。<br />
切换顺序为`深色`-->`跟随系统`-->`浅色`-->`深色` <br />
系统默认为`深色`风格
@tab 主色调
<ImageCard
image="/images/manual/editor/header/mainColor.png"
title="主色调"
description="调整编辑器的主色,系统会自动生成相应的浅色、深色色阶,用于鼠标经过以及选中等效果"
author="ErSan"
date="2025/04/14"
/>
调整编辑器的主色,系统会自动生成相应的浅色、深色色阶,用于鼠标经过以及选中等效果。
@tab 设置
<ImageCard
image="/images/manual/editor/header/setting.png"
title="系统设置"
author="ErSan"
date="2025/04/14"
/>
打开编辑器的设置面板。
:::
================================================
FILE: packages/docs/src/notes/guide/manual/home/数据中心.md
================================================
---
title: 数据中心
createTime: 2025/08/01 15:14:30
permalink: /guide/v0m2jmb5/
---
================================================
FILE: packages/docs/src/notes/guide/manual/home/设置中心.md
================================================
---
title: 设置中心
createTime: 2025/08/01 15:14:51
permalink: /guide/sekzh2c0/
---
================================================
FILE: packages/docs/src/notes/guide/manual/home/资源中心.md
================================================
---
title: 资源中心
createTime: 2025/08/01 15:14:39
permalink: /guide/4tirtbsc/
---
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/home/assets/assets-page.jpg"
title="资源中心"
description="多级分类,精细控制"
author="ErSan"
date="2025/08/01"
/>
:::
## 上传资源
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/home/assets/asset-upload.png"
title="上传资源"
description="多级分类,精细控制"
author="ErSan"
date="2025/08/01"
/>
:::
- **类型**:可上传资源类型默认为:==模型、材质、纹理、广告牌、HDR==;
- **分类**:从树节点中选择资源所属的详细类别;
- **标签**:为资源添加特定的标签,比如 ==“有动画、有骨骼”== 之类的,便于在资源列表顶部勾选标签快速搜索;
- **缩略图**:可以从本地选择,或者在选择资源文件后,点击 ==通过预览截图== 生成。
::: tabs
@tab 通过预览截图
> 假设在`模型`类型下我先选择了一个飞机模型,然后点击按钮`通过预览截图`
<ImageCard
image="/images/manual/home/assets/asset-preview-screenshot.png"
title="通过预览截图"
description="点击截图按钮,将自动截取当前画布填充至表单缩略图字段,并关闭此预览弹窗"
author="ErSan"
date="2025/08/01"
/>
:::
- **文件**:不同类型的资源具有不同的文件格式支持。
::: tabs
@tab 模型
- [x] glb
- [x] gltf
- [x] fbx
- [x] obj
@tab 材质
- [x] zip
> 默认解析为==PBR材质==。
> 上传的ZIP包内文件应依照特定规则(以下两种之一):
> * <Badge type="tip" text="推荐" /> 一. zip包中包含一个`material.json`的文件,其中指明各类贴图使用的纹理文件及材质属性,示例如下:
> ```json:no-line-numbers title="material.json"
> {
> textures: {
> baseColor: xxx.[png/jpg/webp/tga/hdr/exr],
> normal: xxx.[png/jpg/webp/tga/hdr/exr],
> bump: xxx.[png/jpg/webp/tga/hdr/exr],
> displacement: xxx.[png/jpg/webp/tga/hdr/exr],
> roughness: xxx.[png/jpg/webp/tga/hdr/exr],
> metalness: xxx.[png/jpg/webp/tga/hdr/exr],
> ao: xxx.[png/jpg/webp/tga/hdr/exr],
> emissive: xxx.[png/jpg/webp/tga/hdr/exr],
> alpha: xxx.[png/jpg/webp/tga/hdr/exr],
> env: xxx.[png/jpg/webp/tga/hdr/exr],
> light: xxx.[png/jpg/webp/tga/hdr/exr],
> },
> properties: {
> metalness: 1,
> roughness: 0.5,
> ...
> }
> }
> ```
> * 二. zip包中不包含`material.json`文件,此时包中的各纹理文件应语义化命名,如下(文件名均为按照关键字模糊匹配):
>
> ::: file-tree
> - *.zip
> - %baseColor%.[png/jpg/webp/tga/hdr/exr] // 基础颜色贴图(高光反射/光泽度工作流:diffuse, 金属/粗糙度工作流:baseColor)
> - %normal%.[png/jpg/webp/tga/hdr/exr] // 法线贴图
> - %bump%.[png/jpg/webp/tga/hdr/exr] // 凹凸贴图,如果定义了法线贴图,则将忽略该贴图
> - %displacement%.[png/jpg/webp/tga/hdr/exr] // 置换贴图(位移贴图)
> - %roughness%.[png/jpg/webp/tga/hdr/exr] // 粗糙度贴图(使用该纹理的绿色通道)
> - %metalness%.[png/jpg/webp/tga/hdr/exr] // 金属度贴图(使用该纹理的蓝色通道)
> - %ao%.[png/jpg/webp/tga/hdr/exr] // 环境遮挡贴图(该纹理的红色通道)
> - %emissive%.[png/jpg/webp/tga/hdr/exr] // 自发光贴图(放射贴图)
> - %alpha%.[png/jpg/webp/tga/hdr/exr] // 透明贴图(一张灰度纹理,用于控制整个表面的不透明度:黑色:完全透明;白色:完全不透明)
> - %env%.[png/jpg/webp/tga/hdr/exr] // 环境贴图(一般不会设置,因为会使用scene.environment)
> - %light%.[png/jpg/webp/tga/hdr/exr] // 光照贴图(需要第二组UV)
> :::
@tab 纹理
- [x] png
- [x] jpg/jpeg
- [x] webp
@tab 广告牌
- [x] png
- [x] jpg/jpeg
- [x] webp
- [x] svg
@tab HDR
- [x] hdr
- [x] exr
:::
- **名称**:默认会在上传资源文件后自动获取文件名填充;
- **大小**:会在上传资源文件后自动计算,无需填写。
## 预览资源
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/home/assets/asset-preview.png"
title="预览资源"
description="点击资源卡片/资源卡片操作栏的预览按钮进行资源预览。 预览弹窗左侧为可操作画布,右侧为资源详情及操作。"
author="ErSan"
date="2025/08/01"
/>
:::
## 编辑资源
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/home/assets/asset-edit.png"
title="编辑资源"
description="点击资源卡片操作栏的编辑选项进行资源编辑。 编辑时无法修改资源类型和资源文件。"
author="ErSan"
date="2025/08/01"
/>
:::
================================================
FILE: packages/docs/src/notes/guide/manual/home/项目.md
================================================
---
title: 项目
createTime: 2025/08/01 15:13:58
permalink: /guide/dbd366ps/
---
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/home/project/project-page.png"
title="项目"
description=""
author="ErSan"
date="2025/08/01"
/>
:::
## 新建项目
> 可以选择新建一个空项目或者依据内置模板创建。
::: demo-wrapper img no-padding
<ImageCard
image="/images/manual/home/project/new-project.png"
title="新建项目"
description="可以选择新建一个空项目或者依据内置模板创建"
author="ErSan"
date="2025/08/01"
/>
:::
================================================
FILE: packages/docs/src/notes/guide/manual/preview/界面.md
================================================
---
title: 界面
createTime: 2025/04/14 00:49:50
permalink: /guide/chhmeza7/
---
================================================
FILE: packages/docs/src/notes/guide/plugins/builtin/glTFHandler.md
================================================
---
lang: zh-CN
title: glTF 处理器
createTime: 2025/02/20 15:13:36
permalink: /guide/plugin/builtin/jo87cfk0/
---
> 此插件提供了在 Web 端处理 glTF 文件的能力,主要能力如下:
>
> - 优化 glTF 文件:
> - a. 压缩模型数据(包括贴图材质与几何数据),减少文件大小;
> - b. 网格顶点优化,减少顶点数量,提升渲染性能;
> - c. 实例化网格,减少渲染 DrawCall,提升渲染性能;
> - d. 压缩裁剪纹理贴图,减少内存占用,提升渲染性能;
<!-- > - 查看glTF文件构成:
> - a. 显示glTF文件的结构,包括文件头、场景、节点、动画、材质、几何体等;
> - b. 显示glTF文件中的贴图、几何体、动画等资源的属性信息; -->
## 面板

## 使用方法
#### 1. 点击面板顶部上传区域,选择 glTF 文件(相关文件不会上传至服务器,仅用于本地处理);
#### 2. 修改配置选项或直接使用默认配置;
#### 3. 点击“优化”按钮,开始处理 glTF 文件,优化日志会实时显示在面板顶部(原上传文件区域);
## 配置说明
| 配置项 | 描述 | 值 |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ |
| 压缩方式 | 网格浮点压缩方法<br/>Draco 压缩 geometry;<br/>Meshopt & Quantization 压缩 geometry 和 animation; | `Draco`|`Meshopt`|`Quantization`|`None` |
| Meshopt 压缩级别 | 压缩方式选择`Meshopt`时需要选择压缩级别 | `low`|`medium`|`high` |
| 实例化网格 | 使用 GPU 实例化技术共享网格引用,即生成`THREE.InstancedMesh`对象,减少 DrawCall | `true`|`false` |
| 实例化网格界限 | 实例化网格所需的实例数,实例数低于该值的网格将不会实例化 | `min:2,max:Infinity` |
| 展平场景树 | 将场景内子模型对象全部展平到场景根节点。<br/>开启合并网格时此项无法关闭 | `true`|`false` |
| 合并网格 | 合并网格以减少渲染调用,合并后的网格无法单独选中。<br/>前置条件:开启展平场景树 | `true`|`false` |
| 合并纹理 | 创建调色板纹理并合并材质 | `true`|`false` |
| 合并纹理界限 | 合并纹理所需的纹理数,纹理数低于该值将不会合并 | `min:2,max:Infinity` |
| 修剪 | 从文件中删除未被场景引用的属性 | `true`|`false` |
| 修剪顶点 | 是否修剪未使用的顶点属性 | `true`|`false` |
| 修剪子节点 | 是否修剪空的叶子节点 | `true`|`false` |
| 修剪纹理 | 是否修剪实体(单色)纹理,将其转换为材质元素 | `true`|`false` |
| 合并同位顶点 | 合并按位相同的顶点。合并和索引后,顶点之间的数据共享效率更高。文件大小可以减小,GPU 可以更高效地使用顶点缓存。<br/>开启简化网格时此项无法关闭 | `true`|`false` |
| 简化网格 | 基于`meshoptimizer`的简化算法,生成具有较少三角形和顶点的网格。简化是有损的,但该算法旨在针对给定的参数尽可能地保持视觉质量。<br/>前置条件:开启合并同位顶点 | `true`|`false` |
| 简化误差界限 | 简化网格误差容忍度,以网格尺寸的百分比表示 | `min:0.01,max:100` |
| 简化锁定边界 | 是否锁定网格的拓扑边界,拓扑结构(尤其是分割顶点)会限制简化器 | `true`|`false` |
| 简化比率 | 要保留的顶点的比率(0-1) | `min:0,max:1` |
| 纹理压缩 | `AVIF`和`WebP`优化传输大小;<br/>`Auto`按原始格式进行压缩; | `WebP`|`AVIF`|`Auto`|`None` |
| 纹理最大尺寸 | 超过该尺寸的纹理将被压缩,值一般为 2 的 N 次方 | `min:2,max:Infinity` |
## 结果



================================================
FILE: packages/docs/src/notes/guide/plugins/入门.md
================================================
---
lang: zh-CN
title: 入门
createTime: 2025/02/20 15:13:36
permalink: /guide/plugin/31eucyqc/
---
> Astral 3D 内置了插件系统,为其提供了巨大的灵活性和可扩展性。
## 使用方法
1. 打开插件中心:

2. 单击需要使用的插件运行(以<kbd>glTF处理器</kbd>为例):


## 内置插件
Astral 3D Editor 内置了以下插件:
- glTF处理器:在Web端处理glTF文件的能力。用于对 glTF 格式的模型文件进行压缩、优化等操作;
================================================
FILE: packages/docs/src/notes/guide/plugins/插件开发.md
================================================
---
lang: zh-CN
title: 插件开发
createTime: 2025/02/20 15:13:36
permalink: /guide/plugin/7ro8hsc0/
---
> 开发插件时,插件入口类需要实现以下接口,并以esm方式导出,Astral3D Engine会加载默认导出模块。
## 插件入口类接口
```typescript
export interface Plugin {
// 插件名称,插件的唯一标识
name: string;
// 插件版本号
version:number;
// 插件图标
icon:string;
// 插件安装函数,在插件安装时调用
install(config?: any): void;
// 插件卸载函数,在插件卸载时调用
uninstall(): void;
// 从插件盒子面板点击插件时的运行方法
run(): void;
}
```
## 示例插件
```typescript
// 暂未发布到npm,请自行将代码拷贝到项目中
// import { Plugin } from 'msy3d';
class ExamplePlugin implements Plugin {
name = 'example-plugin';
version = 1.0;
icon = 'https://example.com/icon.png';
install(config?: any): void {
console.log('ExamplePlugin installed');
}
uninstall(): void {
console.log('ExamplePlugin uninstalled');
}
run(): void {
console.log('ExamplePlugin run');
}
}
export default ExamplePlugin;
```
================================================
FILE: packages/docs/src/notes/guide/quick-start/介绍.md
================================================
---
lang: zh-CN
title: 介绍
createTime: 2025/02/20 15:13:36
permalink: /guide/6xkx4dnv/
---
> `Astral 3D Engine` 是一个基于 `ThreeJS` 的三维快速开发引擎。 <br />
> `Astral 3D Editor` 是一个以 `Astral 3D` 作为底层的三维可视化编辑器。 <br />
> 从诞生之初,其定位便是快捷、轻量、可扩展的3D低代码创作工具,意在解决Web3D产品开发难,迭代速度慢,并且视觉效果不达标的行业痛点,推动Web3D的发展。 <br />
## 重点功能
- [x] 场景数据无损压缩;
- [x] 网络分包渐进存取;
- [x] 支持20+模型格式;
- [ ] `BIM`模型在线轻量化;
- [x] `CAD`图纸解析预览;
- [x] 碰撞检测
- [x] 粒子系统
- [ ] 插件系统
- [x] 动画编辑器
- [x] Billboard、HtmlPanel(在线解析html、Vue/React打包工程)
- [x] 资源中心
- [ ] 3DTiles支持
- [ ] 数据组件 (API接口、前端SQL、WebSocket、静态JSON)
- [ ] Cesium场景融合(GIS支持)
- [ ] WebGPU 支持
- [ ] 低代码数据大屏(:tada:开发阶段)
## 需要掌握的技能
本项目二开及与服务器交互需要一定前端基础知识,建议在开发前先学习一下以下内容,会对项目理解非常有帮助:
- [Vue3](https://vuejs.org/)
- [ThreeJS](https://threejs.org/)
- [Naive UI](https://www.naiveui.com/zh-CN/os-theme)
- [TypeScript](https://www.typescriptlang.org/)
- [Vite](https://vitejs.dev/)
- [UnoCSS](https://uno.antfu.me/)
================================================
FILE: packages/docs/src/notes/guide/quick-start/安装.md
================================================
---
title: 安装/使用
createTime: 2025/10/06 21:35:36
permalink: /guide/p8awar6v/
---
[+node-versions]: **>= 23.0.0:** `23.0.0` 及以上的版本
[+pnpm-versions]: **>= 10.0.0:** `10.0.0` 及以上的版本
[+corepack]: 从 **v16.13** 开始,`Node.js` 附带 `Corepack` 用于管理包管理器
## 依赖环境
- [Node.js](https://nodejs.org/) : **>= 23.0.0** [+node-versions]
- [pnpm](https://pnpm.io/zh/) : **>= 10.0.0** [+pnpm-versions]
:::: details 怎么安装依赖环境?
::: steps
1. **请前往 [Node.js 官网](https://nodejs.org/zh-cn) 下载最新稳定版本**
请根据指引完成安装,一般而言,在安装过程中,您只需要保持其默认设置,直接选择下一步即可。
2. **安装 PNPM**
在您安装完成 node.js 后,请打开 终端,执行如下命令:[+corepack]
```sh
corepack enable pnpm
# [optional]
# 这会添加一个 packageManager 字段到你本地的 package.json,
# 指示 Corepack 始终在该项目上使用特定的版本。
# 如果你想要可复现性,这可能很有用,因为所有使用 Corepack 的开发人员都将使用与你相同的版本
corepack use pnpm@latest-10
```
3. **完成**
:::
::::
## 安装
:::: steps
- ### Git拉取项目
``` sh
git clone https://github.com/mlt131220/Astral3D.git
```
- ### 进入目录
``` sh
cd Astral3D
```
- ### 安装相关依赖
::: code-tabs
@tab pnpm
``` sh
pnpm install
```
:::
- ### 构建SDK
::: code-tabs
@tab pnpm
``` sh
pnpm run sdk:build
```
:::
- ### 运行编辑器
::: code-tabs
@tab pnpm
``` sh
pnpm run editor:dev
```
:::
- ### 完成
::::
================================================
FILE: packages/docs/src/notes/guide/quick-start/部署.md
================================================
---
title: 部署
createTime: 2025/03/29 23:50:17
permalink: /guide/n6o11owv/
---
> 本文档适用于部署 Astral3D 编辑器到服务器上。 <br />
> 以[Java版本](https://github.com/yx8663/astral-service)后端为例,其他语言版本后端部署方式请参考官方文档。
## 本地打包
### 前端打包
```bash
# 确认 Node.js 版本(≥ 23.11.x)
node -v
# 拉取代码
git clone https://github.com/mlt131220/Astral3D.git
# 进入项目
cd Astral3D
# 安装依赖
pnpm install
# 打包 Astral 3D Engine SDK
pnpm run sdk:build
# 打包Astral 3D Editor
pnpm run editor:build
```
### 后端打包
```bash
# 确认java环境
java -version
# 确认maven环境
mvn -v
# 拉取代码
git clone https://github.com/yx8663/astral-service
# 安装依赖
mvn clean install
# 修改数据库等配置(修改 astral-web/src/main/resources/application-dev.yml,详见 https://github.com/yx8663/astral-service/blob/develop/README.md#%E9%85%8D%E7%BD%AE)
vim astral-web/src/main/resources/application-dev.yml
# 编译打包(通过maven打包即可跨平台)
# 生产环境推荐用clean package跳过测试
mvn clean package -DskipTests
# jar包: astral-web/target/astral-web.jar
ls -l astral-web/target/*.jar
```
## 服务器部署(Windows)
### 基础环境
- [Nginx](https://nginx.org/en/download.html)/[caddy](https://caddyserver.com/)
- [MySQL](https://www.mysql.com/cn/downloads/)
或者直接使用集成环境,如[PHPStudy](https://old.xp.cn/download.html)。
### 前端部署
将Astral 3D Editor打包后的文件放到方便读取的目录下,如 `C:\www\Astral3dEditor`;
### 后端部署
1. 将后端部署所需文件/文件夹放到方便读取的目录下,如 `C:\www\Astral3DEditorBack`,所需文件/文件夹如下:
* `static` 文件夹;
* `astral-web/target/astral-web.jar`;
* `astral-web/src/main/resources/application.yml`
* `astral-web/src/main/resources/application-dev.yml`
2. 此时`C:\www\Astral3DEditorBack`内容如下:
``` shell
- static/
- application.yml
- application-dev.yml
- astral-web.jar
```
3. 打开 MySQL 数据库,创建配置在 `application-dev.yml` 的数据库,并导入 `static/sql/astral_3d.sql` 文件;
4. 启动 MySQL 服务,并确保 MySQL 服务正常运行;
5. 在 `C:\www\Astral3DEditorBack` 下运行命令 `java -jar astral-web.jar` 启动后端服务,默认监听 `8080` 端口;
### Nginx 配置
1. 打开 Nginx 配置文件,假设nginx安装目录为`C:\nginx`,则配置文件路径为`C:\nginx\conf\nginx.conf`;
2. 在 `http` 块中添加以下配置:
```
http {
# ... 忽略原有其他配置不变更
# 开启gzip
gzip on;
# 导入所有的server配置
include vhosts/*.conf;
}
```
3. 在 `C:\nginx\conf` 目录下创建 `vhosts` 目录(与上方http中增加的配置路径同名,并非一定要为`vhost`,可以自定义);
4. 在 `C:\nginx\conf\vhosts` 目录下创建 `astral3d.conf` 文件,内容如下:
```
server {
# 监听端口,即前端部署的端口,一般设置为80
listen 80;
# 域名/ip/localhost
server_name 127.0.0.1;
# 访问 server_name:listen 后,请求就会被转发到这个location块中
location / {
# 前端部署的目录,即前端打包后的文件所在目录
root "C:\www\Astral3dEditor";
# 文件url重写规则,将请求转发到index.html(单页面应用)
try_files $uri $uri/ index.html;
# 项目入口文件
index index.html;
# 协商缓存配置,30天
add_header Cache-Control "public, max-age=2592000";
expires 30d;
etag on;
}
# 后端api接口代理,接口请求匹配 /api 的会走此处转发,下面都同理
location /api {
# 后端接口访问地址,上面部署在了本机的8080端口
proxy_pass http://127.0.0.1:8080/api;
}
# 前端websocket代理
location /socket {
proxy_pass http://127.0.0.1:8080/api/sys/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_connect_timeout 10s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location /file/static {
log_not_found off;
# 关闭日志
access_log off;
# 强缓存设置,缓存时间设置为0.5年
add_header Cache-Control "public, max-age=15768000";
proxy_pass http://localhost:8080/api/common/static;
}
}
```
### 启动服务
```bash
nginx -s start
# 重启 nginx(如果修改了配置文件)
nginx -s reload
```
此时访问 `http://127.0.0.1` 即可访问到 Astral 3D Editor。
## 服务器部署(Linux)
## Docker 部署
================================================
FILE: packages/docs/src/notes/guide/quick-start/项目结构.md
================================================
---
title: 项目结构(更新中)
createTime: 2025/10/06 22:08:28
permalink: /guide/zdiy72f2/
---
本指南将向您说明 `Astral 3D` 项目的文件结构。
`Astral 3D`代码是以`Monorepo`的方式管理的,它的文件结构是这样的:
::: file-tree
- .git/
- .idea/
- common \# 通用代码包
- build/ \# vite构建相关
- packages \# 主项目包
- docs/ \# Astral 3D 文档
- **editor/** \# Astral 3D 编辑器
- **sdk/** \# Astral 3D 引擎
- .gitignore
- .npmrc
- CONTRIBUTING.md
- LEGAL.md
- LICENSE
- package.json
- pnpm-lock.yaml
- pnpm-workspace.yaml
- README.en.md
- README.md
:::
================================================
FILE: packages/docs/src/notes/more/questions.md
================================================
---
title: 常见问题
createTime: 2025/02/20 16:19:54
permalink: /questions/
---
本文主要包含了Astral3D过程中可能会遇到的常见问题与解决方法。
如果您遇到任何问题,您可以先在以下内容中寻找是否有相关的问题和解决方法。
如果没有找到,您可以先通过 Github [Discussions](https://github.com/mlt131220/Astral3D/discussions/new?category=q-a) 与我们讨论。
如果您确定某处确实存在问题,请在 Github [Open an issue](https://github.com/mlt131220/Astral3D/issues/new),
在 Issue 中说明该问题的具体细节,我们会尽快解决。
## XXXXXX?
XXXXXXXXXXXXXXXXXXX
================================================
FILE: packages/docs/src/notes/promotion/README.md
================================================
---
title: 推广中心
createTime: 2025/10/04 19:34:07
permalink: /promotion/
---
:::important 作者的话
`Astral 3D` 是一款基于 `Three.js` 的完全开源且免费的三维引擎。
如果使用起来觉得还不错,欢迎通过 [Star](https://github.com/mlt131220/Astral3D) 支持。
它源于个人的兴趣与曾经的工作需求,我将会长期维护它。
如果它对你产生了帮助,那我也深感荣幸。
如果你想,可以捐助我。
一切都是自由的,愿大家,平安喜乐。
==岁岁平,岁岁安,岁岁平安。==
:::
<div class="sponsor-table">
| 支付宝 | 微信 |
|:-------------------------------------------------------:|:----------------------------------------------------------:|
| {width="300" height="300"} | {width="300" height="300"} |
</div>
> 本页面为各种大网站的推广链接,在此处购买您将会受到一定的优惠,而我收到一部分提成
<LinkCard title="雨云" href="https://www.rainyun.com/Astral3D_">
:fire: 4核8G 200兆服务器,仅需49元/月,[点击这里购买](https://www.rainyun.com/Astral3D_)
:fire: 专属优惠码:Astral3D
</LinkCard>
<LinkCard title="阿里云" href="https://www.aliyun.com/minisite/goods?userCode=y6ecbjpi">
2核2G 轻量应用服务器 ¥38.00/年
从此链接购买享 **==9折优惠==**!!
</LinkCard>
<LinkCard title="腾讯云" href="https://curl.qcloud.com/i2zqxlkP">
云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中
</LinkCard>
<style>
.vp-doc .sponsor-table {
display: flex;
align-items: center;
justify-content: center;
}
.vp-doc .sponsor-table img {
width: 150px;
}
@media (min-width: 768px) {
.vp-doc .sponsor-table img {
width: 180px;
}
}
</style>
================================================
FILE: packages/docs/src/notes/sdk/README.md
================================================
---
lang: zh-CN
---
# :watermelon: 暂未编写
================================================
FILE: packages/editor/.gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
public/*.zip
dev-dist
================================================
FILE: packages/editor/.npmrc
================================================
auto-install-peers=true
================================================
FILE: packages/editor/components.d.ts
================================================
/* eslint-disable */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
AssetPreview: typeof import('./src/components/preview/AssetPreview.vue')['default']
CAD: typeof import('./src/components/drawing/toolbar/CAD.vue')['default']
CadLayers: typeof import('./src/components/drawing/toolbar/CadLayers.vue')['default']
Clear: typeof import('./src/components/header/navigation/Clear.vue')['default']
CodeEditor: typeof import('./src/components/code/CodeEditor.vue')['default']
Color: typeof import('./src/components/setting/common/Color.vue')['default']
CommonPreview: typeof import('./src/components/preview/CommonPreview.vue')['default']
CommonPreview_backup: typeof import('./src/components/preview/CommonPreview_backup.vue')['default']
Copy: typeof import('./src/components/header/navigation/Copy.vue')['default']
Delete: typeof import('./src/components/header/navigation/Delete.vue')['default']
Do: typeof import('./src/components/header/navigation/Do.vue')['default']
Drawing: typeof import('./src/components/drawing/Drawing.vue')['default']
EarthGenerator: typeof import('./src/components/es/plugin/builtin/EarthGenerator.vue')['default']
EsContextmenu: typeof import('./src/components/es/EsContextmenu.vue')['default']
EsCubeLoading: typeof import('./src/components/es/EsCubeLoading.vue')['default']
EsDocument: typeof import('./src/components/es/EsDocument.vue')['default']
EsFormItemHelpLabel: typeof import('./src/components/es/EsFormItemHelpLabel.vue')['default']
EsInput: typeof import('./src/components/es/EsInput.vue')['default']
EsInputNumber: typeof import('./src/components/es/EsInputNumber.vue')['default']
EsKeyFrame: typeof import('./src/components/es/EsKeyFrame.vue')['default']
EsParticleEasing: typeof import('./src/components/es/EsParticleEasing.vue')['default']
EsPlugin: typeof import('./src/components/es/EsPlugin.vue')['default']
EsPluginDialog: typeof import('./src/components/es/plugin/EsPluginDialog.vue')['default']
EsPluginList: typeof import('./src/components/es/plugin/EsPluginList.vue')['default']
EsPopTreeSelect: typeof import('./src/components/es/EsPopTreeSelect.vue')['default']
EsTexture: typeof import('./src/components/es/EsTexture.vue')['default']
EsTip: typeof import('./src/components/es/EsTip.vue')['default']
Fullscreen: typeof import('./src/components/header/navigation/Fullscreen.vue')['default']
GLTFHandler: typeof import('./src/components/es/plugin/builtin/GLTFHandler.vue')['default']
GLTFHandlerForm: typeof import('./src/components/es/plugin/builtin/glTFHandler/GLTFHandlerForm.vue')['default']
HtmlPanelCode: typeof import('./src/components/code/HtmlPanelCode.vue')['default']
Image: typeof import('./src/components/drawing/toolbar/Image.vue')['default']
ImportExport: typeof import('./src/components/header/navigation/ImportExport.vue')['default']
JSONEditor: typeof import('./src/components/code/JSONEditor.vue')['default']
Locale: typeof import('./src/components/setting/common/Locale.vue')['default']
Logo: typeof import('./src/components/header/Logo.vue')['default']
NavigationOperation: typeof import('./src/components/header/NavigationOperation.vue')['default']
NButton: typeof import('naive-ui')['NButton']
NCard: typeof import('naive-ui')['NCard']
NCarousel: typeof import('naive-ui')['NCarousel']
NCheckbox: typeof import('naive-ui')['NCheckbox']
NCheckboxGroup: typeof import('naive-ui')['NCheckboxGroup']
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
NDescriptions: typeof import('naive-ui')['NDescriptions']
NDescriptionsItem: typeof import('naive-ui')['NDescriptionsItem']
NDialogProvider: typeof import('naive-ui')['NDialogProvider']
NDivider: typeof import('naive-ui')['NDivider']
NDropdown: typeof import('naive-ui')['NDropdown']
NForm: typeof import('naive-ui')['NForm']
NFormItem: typeof import('naive-ui')['NFormItem']
NGradientText: typeof import('naive-ui')['NGradientText']
NIcon: typeof import('naive-ui')['NIcon']
NImage: typeof import('naive-ui')['NImage']
NInfiniteScroll: typeof import('naive-ui')['NInfiniteScroll']
NInput: typeof import('naive-ui')['NInput']
NInputNumber: typeof import('naive-ui')['NInputNumber']
NLayout: typeof import('naive-ui')['NLayout']
NLayoutContent: typeof import('naive-ui')['NLayoutContent']
NLayoutHeader: typeof import('naive-ui')['NLayoutHeader']
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
NLoadingBarProvider: typeof import('naive-ui')['NLoadingBarProvider']
NMenu: typeof import('naive-ui')['NMenu']
NMessageProvider: typeof import('naive-ui')['NMessageProvider']
NModal: typeof import('naive-ui')['NModal']
NModalProvider: typeof import('naive-ui')['NModalProvider']
NNotificationProvider: typeof import('naive-ui')['NNotificationProvider']
NPopover: typeof import('naive-ui')['NPopover']
NPopselect: typeof import('naive-ui')['NPopselect']
NProgress: typeof import('naive-ui')['NProgress']
NRadio: typeof import('naive-ui')['NRadio']
NRadioGroup: typeof import('naive-ui')['NRadioGroup']
NResult: typeof import('naive-ui')['NResult']
NSelect: typeof import('naive-ui')['NSelect']
NSkeleton: typeof import('naive-ui')['NSkeleton']
NSpace: typeof import('naive-ui')['NSpace']
NSpin: typeof import('naive-ui')['NSpin']
NTabPane: typeof import('naive-ui')['NTabPane']
NTabs: typeof import('naive-ui')['NTabs']
NTag: typeof import('naive-ui')['NTag']
NText: typeof import('naive-ui')['NText']
NTooltip: typeof import('naive-ui')['NTooltip']
NTree: typeof import('naive-ui')['NTree']
NTreeSelect: typeof import('naive-ui')['NTreeSelect']
NUpload: typeof import('naive-ui')['NUpload']
NUploadDragger: typeof import('naive-ui')['NUploadDragger']
PointCloudReconstructor: typeof import('./src/components/es/plugin/builtin/PointCloudReconstructor.vue')['default']
PreviewSetting: typeof import('./src/components/setting/components/PreviewSetting.vue')['default']
ProjectInfoForm: typeof import('./src/components/project/ProjectInfoForm.vue')['default']
ReconstructorForm: typeof import('./src/components/es/plugin/builtin/pointCloudReconstructor/ReconstructorForm.vue')['default']
RightOperation: typeof import('./src/components/header/RightOperation.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SaveToService: typeof import('./src/components/header/right/SaveToService.vue')['default']
SceneTree: typeof import('./src/components/tree/SceneTree.vue')['default']
Script: typeof import('./src/components/code/Script.vue')['default']
Setting: typeof import('./src/components/setting/Setting.vue')['default']
SettingCenter: typeof import('./src/components/setting/common/SettingCenter.vue')['default']
SettingTabs: typeof import('./src/components/setting/components/SettingTabs.vue')['default']
Shortcuts: typeof import('./src/components/setting/components/Shortcuts.vue')['default']
SQLEditor: typeof import('./src/components/code/SQLEditor.vue')['default']
SystemSetting: typeof import('./src/components/setting/components/SystemSetting.vue')['default']
Theme: typeof import('./src/components/setting/common/Theme.vue')['default']
UserData: typeof import('./src/components/code/UserData.vue')['default']
XR: typeof import('./src/components/header/right/XR.vue')['default']
}
}
================================================
FILE: packages/editor/index.html
================================================
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8"/>
<link rel="icon" sizes="any" type="image/svg+xml" href="/static/images/logo/logo.svg"/>
<link rel="mask-icon" href="/static/images/logo/logo.svg" color="#63E2B7" />
<link rel="apple-touch-icon" href="/static/images/logo/pwa/pwa-180x180.png" sizes="180x180" />
<meta name="theme-color" content="#63E2B7" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="author" content="ErSan,mlt131220@163.com">
<meta name="copyright" content="ErSan,mlt131220@163.com">
<meta name="keywords" content="threejs,editor,threeeditor,三维,三维可视化,3D,3D编辑器,编辑器,模型,网页设计工具,低代码,lowcode, WebGL,WebGPU,BIM,rvt,ifc,CAD,dwg,dxf">
<meta name="description" content="一款基于THREE.JS开发的专业的面相浏览器端(webgl/webgpu)的三维可视化编辑器,包含BIM轻量化,CAD解析预览等特色功能">
<!-- 百度seo -->
<meta name="baidu-site-verification" content="codeva-AVKCbnEhHf" />
<!-- bing seo -->
<meta name="msvalidate.01" content="51C05441E591099C88B3C1975F9B9D73" />
<!-- google seo -->
<meta name="google-site-verification" content="_hU0qCzBII0F3mupE17AaGpLznXbpQ89WGNaxrhVqfE" />
<title>Astral 3D Editor - 高效的三维可视化编辑工具</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
================================================
FILE: packages/editor/package.json
================================================
{
"name": "@astral3d/editor",
"author": "ErSan<mlt131220@163.com>",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"tsc": "tsc",
"preview": "vite preview"
},
"engines": {
"node": ">=23.11.0"
},
"dependencies": {
"@ant-design/colors": "^7.0.2",
"@astral3d/engine": "workspace:^",
"@gltf-transform/core": "^4.2.1",
"@gltf-transform/extensions": "^4.2.1",
"@gltf-transform/functions": "^4.2.1",
"@vicons/carbon": "^0.12.0",
"@vicons/ionicons5": "^0.12.0",
"@vueuse/core": "^13.2.0",
"animate.css": "^4.1.1",
"axios": "^1.8.2",
"disable-devtool": "^0.3.8",
"keyframe-resample": "^0.1.0",
"meshoptimizer": "^0.23.0",
"monaco-editor": "^0.52.2",
"naive-ui": "catalog:",
"pinia": "^2.1.4",
"three": "catalog:",
"vite-plugin-static-copy": "catalog:",
"vue": "catalog:",
"vue-i18n": "^11.1.2",
"vue-router": "^4.3.2"
},
"devDependencies": {
"@astral3d/build-vite-plugins": "workspace:^",
"@types/three": "catalog:",
"@vitejs/plugin-vue":"catalog:",
"dotenv": "^16.3.1",
"less": "^4.3.0",
"typescript": "catalog:",
"unocss": "^66.1.0-beta.12",
"unplugin-vue-components": "^0.27.3",
"vite": "catalog:",
"vite-plugin-mkcert": "^1.16.0"
}
}
================================================
FILE: packages/editor/public/libs/draco/draco_decoder.js
================================================
var DracoDecoderModule = (() => {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(DracoDecoderModule = {}) {
var Module=typeof DracoDecoderModule!="undefined"?DracoDecoderModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var isRuntimeInitialized=false;var isModuleParsed=false;Module["onRuntimeInitialized"]=function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}};Module["onModuleParsed"]=function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}};function isVersionSupported(versionString){if(typeof versionString!=="string")return false;const version=versionString.split(".");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=5)return true;if(version[0]!=0||version[1]>10)return false;return true}Module["isVersionSupported"]=isVersionSupported;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=(
// EMSCRIPTEN_START_ASM
function instantiate(na){function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-(o[j-1]=="=");for(;a<j;a+=4){g=f[o.charCodeAt(a+1)];h=f[o.charCodeAt(a+2)];m[i++]=f[o.charCodeAt(a)]<<2|g>>4;if(i<k)m[i++]=g<<4|h>>2;if(i<k)m[i++]=h<<6|f[o.charCodeAt(a+3)]}}function p(q){l(e,1028,"YAQAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAE41ZHJhY28yOEF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1FAAAYOwAAOAQAALAHAAAtKyAgIDBYMHgAX19uZXh0X3ByaW1lIG92ZXJmbG93AHZlY3RvcgBzdGQ6OmV4Y2VwdGlvbgBza2lwX2F0dHJpYnV0ZV90cmFuc2Zvcm0AYmFkX2FycmF5X25ld19sZW5ndGgAYmFzaWNfc3RyaW5nAHN0ZDo6YmFkX2FsbG9jAERSQUNPAFVzaW5nIGluY29tcGF0aWJsZSBkZWNvZGVyIGZvciB0aGUgaW5wdXQgZ2VvbWV0cnkuAEZhaWxlZCB0byBkZWNvZGUgcG9pbnQgYXR0cmlidXRlcy4ARmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGRlY29kZXIuAFVua25vd24gbWlub3IgdmVyc2lvbi4AVW5rbm93biBtYWpvciB2ZXJzaW9uLgBJbnB1dCBpcyBub3QgYSBtZXNoLgBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlLgBOb3QgYSBEcmFjbyBmaWxlLgBJbnB1dCBpcyBub3QgYSBwb2ludCBjbG91ZC4AVW5zdXBwb3J0ZWQgZW5jb2RpbmcgbWV0aG9kLgBGYWlsZWQgdG8gZGVjb2RlIG1ldGFkYXRhLgBGYWlsZWQgdG8gZGVjb2RlIGdlb21ldHJ5IGRhdGEuAChudWxsKQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQBLZFRyZWVBdHRyaWJ1dGVzRGVjb2RlcjogY29tcHJlc3Npb24gbGV2ZWwgJWkgbm90IHN1cHBvcnRlZC4KAEZsb2F0UG9pbnRzVHJlZURlY29kZXI6IGNvbXByZXNzaW9uIGxldmVsICVpIG5vdCBzdXBwb3J0ZWQuCgBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQuIAoATWV0aG9kIG5vdCBzdXBwb3J0ZWQuIAoAAAAAAACEBwAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAACwAAABgAAAAZAAAATjVkcmFjbzMwQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtRQAAAAAYOwAAWAcAALAHAABONWRyYWNvMThBdHRyaWJ1dGVUcmFuc2Zvcm1FAAAAAPA6AACQBwAAAAAAADwIAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAABONWRyYWNvMTdBdHRyaWJ1dGVzRGVjb2RlckUATjVkcmFjbzI2QXR0cmlidXRlc0RlY29kZXJJbnRlcmZhY2VFAAAAAPA6AAAMCAAAGDsAAPAHAAA0CAAAAAAAAKQIAAAmAAAAJwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAoAAAAKQAAACoAAABONWRyYWNvMjNLZFRyZWVBdHRyaWJ1dGVzRGVjb2RlckUAAAAYOwAAgAgAADwIAAAAAAAABAkAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAAE41ZHJhY28yNlNlcXVlbnRpYWxBdHRyaWJ1dGVEZWNvZGVyRQAAAADwOgAA3AgAAP////8AAAAAfAkAADQAAAA1AAAAHAAAADYAAAA3AAAAHwAAACAAAAAhAAAAOAAAADkAAAA6AAAAOwAAADwAAABONWRyYWNvMzdTZXF1ZW50aWFsQXR0cmlidXRlRGVjb2RlcnNDb250cm9sbGVyRQAYOwAATAkAADwIAAAAAAAA8AkAAD0AAAA+AAAAPwAAAC4AAAAvAAAAMAAAAEAAAAAyAAAAQQAAAEIAAABDAAAARAAAAEUAAABONWRyYWNvMzNTZXF1ZW50aWFsSW50ZWdlckF0dHJpYnV0ZURlY29kZXJFABg7AADECQAABAkAAAAAAAB8DAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yM1ByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRUVFAE41ZHJhY28zN1ByZWRpY3Rpb25TY2hlbWVUeXBlZERlY29kZXJJbnRlcmZhY2VJaWlFRQBONWRyYWNvMzJQcmVkaWN0aW9uU2NoZW1lRGVjb2RlckludGVyZmFjZUUATjVkcmFjbzI1UHJlZGljdGlvblNjaGVtZUludGVyZmFjZUUA8DoAACAMAAAYOwAA9QsAAEQMAAAYOwAAwQsAAEwMAAAYOwAAbQsAAFgMAAAYOwAA1woAAGQMAAAYOwAANAoAAHAMAAAAAAAAcAwAAEYAAABSAAAAIwAAAEkAAAAjAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAIwAAAAAAAABkDAAARgAAAFMAAAAjAAAASQAAACMAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAAAjAAAAAAAAANgNAABGAAAAVAAAAFUAAABJAAAAVgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFcAAABONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAYOwAAMA0AAHAMAAAAAAAA0A4AAFgAAABZAAAAWgAAAEkAAABbAAAASwAAAEwAAABNAAAATgAAAE8AAABcAAAAXQAAAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1EZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAABg7AAAcDgAAcAwAAAAAAAC0DwAAXgAAAF8AAABgAAAASQAAAGEAAABiAAAAYwAAAGQAAABOAAAATwAAAGUAAABmAAAATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAABg7AAAUDwAAcAwAAAAAAACgEAAAZwAAAGgAAABpAAAASQAAAGoAAABrAAAAbAAAAG0AAABOAAAATwAAAG4AAABvAAAATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAAGDsAAPgPAABwDAAAAAAAAIwRAABwAAAAcQAAAHIAAABJAAAAcwAAAHQAAAB1AAAAdgAAAE4AAABPAAAAdwAAAHgAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAAAAAYOwAA5BAAAHAMAAAAAAAAFBMAAHkAAAB6AAAAewAAAHwAAAB9AAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAAADwOgAAXxIAABg7AAC0EQAADBMAAAAAAAAMEwAAeQAAAH4AAAAjAAAAfAAAACMAAAAAAAAAoBQAAEYAAAB/AAAAgAAAAEkAAACBAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAggAAAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUAABg7AAAKFAAAZAwAABg7AAB0EwAAlBQAAAAAAACUFAAARgAAAIMAAAAjAAAASQAAACMAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAAAjAAAAAAAAALgVAABGAAAAhAAAAIUAAABJAAAAhgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAIcAAABONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAYOwAAHBUAAJQUAAAAAAAApBYAAIgAAACJAAAAigAAAEkAAACLAAAASwAAAEwAAABNAAAATgAAAE8AAACMAAAAjQAAAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1EZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAABg7AAD8FQAAlBQAAAAAAAB8FwAAjgAAAI8AAACQAAAASQAAAJEAAACSAAAAkwAAAJQAAABOAAAATwAAAJUAAACWAAAATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAABg7AADoFgAAlBQAAAAAAABcGAAAlwAAAJgAAACZAAAASQAAAJoAAACbAAAAnAAAAJ0AAABOAAAATwAAAJ4AAACfAAAATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAAGDsAAMAXAACUFAAAAAAAADgZAACgAAAAoQAAAKIAAABJAAAAowAAAKQAAAClAAAApgAAAE4AAABPAAAApwAAAKgAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFABg7AACgGAAAlBQAAAAAAACkGgAAqQAAAKoAAACrAAAArAAAAK0AAABONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUA8DoAAP4ZAAAYOwAAYBkAAJwaAAAAAAAAnBoAAKkAAACuAAAAIwAAAKwAAAAjAAAAAAAAAGAbAABGAAAArwAAALAAAABJAAAAsQAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAALIAAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRUVFAAAAABg7AAAEGwAAZAwAAAAAAADUGwAAswAAALQAAAC1AAAALgAAAC8AAAC2AAAAQAAAADIAAABBAAAAtwAAALgAAAC5AAAAugAAAE41ZHJhY28zMlNlcXVlbnRpYWxOb3JtYWxBdHRyaWJ1dGVEZWNvZGVyRQAAGDsAAKgbAADwCQAAAAAAAOAdAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADBAAAAwgAAAMMAAADEAAAAxQAAAMYAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfNDlQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkRlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVFRQAYOwAAaR0AAFgMAAAYOwAAyBwAAMgdAAAYOwAAGBwAANQdAAAAAAAAfB8AAMcAAADIAAAAyQAAAMoAAADLAAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAPA6AAC+HgAAGDsAAAgeAAB0HwAAAAAAAAQhAADMAAAAzQAAAM4AAAC+AAAAzwAAANAAAADRAAAA0gAAAMMAAADEAAAA0wAAANQAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAYOwAAYyAAAMgdAAAYOwAAwB8AAPggAAAAAAAAiCIAANUAAADWAAAA1wAAANgAAADZAAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNDlQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkRlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAAPA6AADVIQAAGDsAACwhAACAIgAAAAAAADAjAADaAAAA2wAAANwAAAC+AAAA3QAAAN4AAADfAAAA4AAAAMMAAADEAAAA4QAAAOIAAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFRUUAGDsAAMwiAADIHQAAAAAAAGQlAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVFRQAAGDsAAN8kAABYDAAAGDsAADEkAABMJQAAGDsAAHQjAABYJQAAAAAAABwnAADvAAAA8AAAAPEAAADyAAAA8wAAAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAAAA8DoAAE8mAAAYOwAAjCUAABQnAAAAAAAAwCgAAPQAAAD1AAAA9gAAAOYAAAD3AAAA+AAAAPkAAAD6AAAA6wAAAOwAAAD7AAAA/AAAAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAAAAYOwAAECgAAEwlAAAYOwAAYCcAALQoAAAAAAAAXCoAAP0AAAD+AAAA/wAAAAABAAABAQAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAPA6AACeKQAAGDsAAOgoAABUKgAAAAAAABQrAADaAAAAAgEAAAMBAADmAAAABAEAAAUBAAAGAQAABwEAAOsAAADsAAAACAEAAAkBAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRUVFAAAAABg7AACgKgAATCUAAAAAAACYKwAACgEAAAsBAAAMAQAALgAAAC8AAAANAQAAQAAAADIAAABBAAAADgEAAEMAAABEAAAADwEAABABAAARAQAATjVkcmFjbzM4U2VxdWVudGlhbFF1YW50aXphdGlvbkF0dHJpYnV0ZURlY29kZXJFAAAAABg7AABkKwAA8AkAAAAAAAD4KwAAEgEAABMBAAAUAQAAFQEAACMAAAAWAQAAFwEAABgBAAAZAQAAGgEAABsBAAAcAQAAIwAAAE41ZHJhY28xMU1lc2hEZWNvZGVyRQAAABg7AADgKwAATDQAAAAAAABkLAAAHQEAAB4BAAAUAQAAHwEAACABAAAWAQAAFwEAABgBAAAhAQAAIgEAACMBAAAkAQAAJQEAAE41ZHJhY28yMk1lc2hFZGdlYnJlYWtlckRlY29kZXJFAAAAABg7AABALAAA+CsAAAAAAACILQAAJgEAACcBAAAoAQAAKQEAACoBAAArAQAALAEAAC0BAAAuAQAALwEAAP////8AAAAA7C0AADABAAAxAQAAMgEAADMBAAA0AQAANQEAADYBAAA3AQAAOAEAADkBAAAAAAAATC4AADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEAAEABAABBAQAAQgEAAEMBAABONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbElOU18zMU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbERlY29kZXJFRUUATjVkcmFjbzM1TWVzaEVkZ2VicmVha2VyRGVjb2RlckltcGxJbnRlcmZhY2VFAAAA8DoAAFAtAAAYOwAABC0AAIAtAABONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbElOU180MU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbFByZWRpY3RpdmVEZWNvZGVyRUVFAAAAGDsAAJQtAACALQAATjVkcmFjbzI2TWVzaEVkZ2VicmVha2VyRGVjb2RlckltcGxJTlNfMzhNZXNoRWRnZWJyZWFrZXJUcmF2ZXJzYWxWYWxlbmNlRGVjb2RlckVFRQAAGDsAAPgtAACALQAAAAAAAEgvAABEAQAARQEAAEYBAABONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzEzVHJhdmVyc2VyQmFzZUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMV9FRUVFAPA6AADZLgAAGDsAAGwuAABALwAAAAAAAEAvAABHAQAASAEAAEYB");l(e,12148,"AQAAAAMAAAAFAAAABwAAAAAAAABIMAAASQEAAEoBAABLAQAATAEAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUAAAAA8DoAACMwAAAYOwAAnC8AAEAwAAD/////AAAAADgxAABNAQAATgEAAE8BAABONWRyYWNvMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTNUcmF2ZXJzZXJCYXNlSU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQAA8DoAANUwAAAYOwAAbDAAADAxAAAAAAAAMDEAAFABAABRAQAATwEAAAAAAADwMQAAUgEAAFMBAABUAQAAVQEAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAAAAGDsAAHAxAABAMAAAAAAAAHAyAABWAQAAVwEAAE8BAABONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQAYOwAAEDIAADAxAAAAAAAAIDMAAFgBAABZAQAAWgEAAFsBAABONWRyYWNvMjJNZXNoVHJhdmVyc2FsU2VxdWVuY2VySU5TXzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUAABg7AACUMgAAQDA=");l(e,13108,"jDMAABIBAABcAQAAFAEAABUBAABdAQAAFgEAABcBAAAYAQAAGQEAABoBAAAbAQAAHAEAAF4BAABONWRyYWNvMjFNZXNoU2VxdWVudGlhbERlY29kZXJFABg7AABsMwAA+CsAAAAAAADMMwAAXwEAAGABAABhAQAAYgEAAE41ZHJhY28xNUxpbmVhclNlcXVlbmNlckUAAAAYOwAAsDMAAEAwAAAAAAAATDQAABIBAABjAQAAZAEAABUBAAAjAAAAZQEAABcBAAAYAQAAGQE=");l(e,13328,"RmFpbGVkIHRvIHBhcnNlIERyYWNvIGhlYWRlci4ATjVkcmFjbzE3UG9pbnRDbG91ZERlY29kZXJFAAAA8DoAAC40AAAAAAAApDQAABIBAABmAQAAZAEAABUBAABnAQAAaAEAABcBAAAYAQAAGQEAAE41ZHJhY28yM1BvaW50Q2xvdWRLZFRyZWVEZWNvZGVyRQAAABg7AACANAAATDQAAAAAAAAENQAAEgEAAGkBAABkAQAAFQEAAGoBAABrAQAAFwEAABgBAAAZAQAATjVkcmFjbzI3UG9pbnRDbG91ZFNlcXVlbnRpYWxEZWNvZGVyRQAAABg7AADcNAAATDQAAAEAAAABAAAAAgAAAAIAAAAEAAAABAAAAAgAAAAIAAAABAAAAAgAAAAB");l(e,13635,"wAAAAMAAAADAAAAAwP//////////AAAAAIA1AABsAQAAbQEAAG4BAABvAQAATjVkcmFjbzRNZXNoRQAAABg7AABwNQAAxDUAAP////8AAAAAAAAAAMQ1AABwAQAAcQEAAHIBAABzAQAATjVkcmFjbzEwUG9pbnRDbG91ZEUAAAAA8DoAAKw1AAC4PAAAGQAKABkZGQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAAZABEKGRkZAwoHAAEACQsYAAAJBgsAAAsABhkAAAAZGRk=");l(e,13857,"DgAAAAAAAAAAGQAKDRkZGQANAAACAAkOAAAACQAOAAAO");l(e,13915,"DA==");l(e,13927,"EwAAAAATAAAAAAkMAAAAAAAMAAAM");l(e,13973,"EA==");l(e,13985,"DwAAAAQPAAAAAAkQAAAAAAAQAAAQ");l(e,14031,"Eg==");l(e,14043,"EQAAAAARAAAAAAkSAAAAAAASAAASAAAaAAAAGhoa");l(e,14098,"GgAAABoaGgAAAAAAAAk=");l(e,14147,"FA==");l(e,14159,"FwAAAAAXAAAAAAkUAAAAAAAUAAAU");l(e,14205,"Fg==");l(e,14217,"FQAAAAAVAAAAAAkWAAAAAAAWAAAWAAAwMTIzNDU2Nzg5QUJDREVGAAAAAAIAAAADAAAABQAAAAcAAAALAAAADQAAABEAAAATAAAAFwAAAB0AAAAfAAAAJQAAACkAAAArAAAALwAAADUAAAA7AAAAPQAAAEMAAABHAAAASQAAAE8AAABTAAAAWQAAAGEAAABlAAAAZwAAAGsAAABtAAAAcQAAAH8AAACDAAAAiQAAAIsAAACVAAAAlwAAAJ0AAACjAAAApwAAAK0AAACzAAAAtQAAAL8AAADBAAAAxQAAAMcAAADTAAAAAQAAAAsAAAANAAAAEQAAABMAAAAXAAAAHQAAAB8AAAAlAAAAKQAAACsAAAAvAAAANQAAADsAAAA9AAAAQwAAAEcAAABJAAAATwAAAFMAAABZAAAAYQAAAGUAAABnAAAAawAAAG0AAABxAAAAeQAAAH8AAACDAAAAiQAAAIsAAACPAAAAlQAAAJcAAACdAAAAowAAAKcAAACpAAAArQAAALMAAAC1AAAAuwAAAL8AAADBAAAAxQAAAMcAAADRAAAAAAAAAAoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFAMqaOwAAAAAAAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlOMTBfX2N4eGFiaXYxMTZfX3NoaW1fdHlwZV9pbmZvRQAAAAAYOwAAKDoAAKw8AABOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAAAAYOwAAWDoAAEw6AABOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0UAAAAYOwAAiDoAAEw6AABOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQAYOwAAuDoAAKw6AAAAAAAAfDoAAHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACAAQAAAAAAAGA7AAB5AQAAgQEAAHsBAAB8AQAAfQEAAIIBAACDAQAAhAEAAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQAAAAAYOwAAODsAAHw6AAAAAAAA0DsAAA4AAACFAQAAhgEAAAAAAAD4OwAADgAAAIcBAACIAQAAAAAAALg7AAAOAAAAiQEAAIoBAABTdDlleGNlcHRpb24AAAAA8DoAAKg7AABTdDliYWRfYWxsb2MAAAAAGDsAAMA7AAC4OwAAU3QyMGJhZF9hcnJheV9uZXdfbGVuZ3RoAAAAABg7AADcOwAA0DsAAAAAAAAoPAAAAQAAAIsBAACMAQAAU3QxMWxvZ2ljX2Vycm9yABg7AAAYPAAAuDsAAAAAAABcPAAAAQAAAI0BAACMAQAAU3QxMmxlbmd0aF9lcnJvcgAAAAAYOwAASDwAACg8AAAAAAAAkDwAAAEAAACOAQAAjAEAAFN0MTJvdXRfb2ZfcmFuZ2UAAAAAGDsAAHw8AAAoPAAAU3Q5dHlwZV9pbmZvAAAAAPA6AACcPA==");l(e,15544,"BQ==");l(e,15556,"dAE=");l(e,15580,"dQEAAHYBAABsPg==");l(e,15604,"Ag==");l(e,15620,"//////////8=");l(e,15688,"BQ==");l(e,15700,"dwE=");l(e,15724,"dQEAAHgBAAB4PgAAAAQ=");l(e,15748,"AQ==");l(e,15764,"/////wo=");l(e,15832,"IEUB")}var r=new ArrayBuffer(16);var s=new Int32Array(r);var t=new Float32Array(r);var u=new Float64Array(r);function v(){throw new Error("abort")}function w(x){t[2]=x}function y(z){return s[z]}function A(z,x){s[z]=x}function B(){return t[2]}function ma(q){var C=q.a;var D=C.a;var E=D.buffer;D.grow=ka;var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=C.b;var Y=C.c;var Z=C.d;var _=C.e;var $=C.f;var aa=C.g;var ba=C.h;var ca=83232;var da=0;
// EMSCRIPTEN_START_FUNCS
function Ud(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;B=ca-672|0;ca=B;k=H[b+8>>2];s=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;a:{b:{c:{if(g>>>0>k>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break c}d=e+H[b>>2]|0;H[a>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[a>>2]>31){break c}s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;H[a+4>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;H[a+12>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;d=H[a+20>>2];x=H[a+12>>2];if((x|0)!=(d|0)?d:0){break c}s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[a+16>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(e>>>0>=7){H[B>>2]=e;Qd(1713,B);break c}H[B+664>>2]=c;d:{if(!x){break d}e:{k=H[c>>2];if(x>>>0<=(H[c+8>>2]-k|0)/12>>>0){break e}if(x>>>0<357913942){l=H[c+4>>2];d=N(x,12);e=pa(d);g=d+e|0;e=e+N((l-k|0)/12|0,12)|0;d=e;if((k|0)!=(l|0)){while(1){d=d-12|0;l=l-12|0;H[d>>2]=H[l>>2];H[d+4>>2]=H[l+4>>2];H[d+8>>2]=H[l+8>>2];if((k|0)!=(l|0)){continue}break}}H[c+8>>2]=g;H[c+4>>2]=e;H[c>>2]=d;if(!k){break e}oa(k);break e}break b}f:{switch(H[a+16>>2]){case 0:i=wb(B+8|0,3);z=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;g:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break g}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break g}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break g}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break g}H[i+8>>2]=0;if(!ua(i+16|0,b)){break g}if(!ua(i+36|0,b)){break g}if(!ua(i+56|0,b)){break g}if(!ua(i+76|0,b)){break g}A=H[i+4>>2];d=0;g=0;f=ca-32|0;ca=f;m=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(m){if(m>>>0>=1073741824){break b}b=m<<2;g=pa(b);H[f+8>>2]=g;d=b+g|0;H[f+16>>2]=d;ra(g,0,b);H[f+12>>2]=d}e=H[i+120>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);m=H[i+12>>2];g=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=g;H[e+8>>2]=H[f+16>>2];g=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;h:{if(m){if(m>>>0>=1073741824){break b}b=m<<2;w=pa(b);H[f+8>>2]=w;g=b+w|0;H[f+16>>2]=g;ra(w,0,b);H[f+12>>2]=g}d=H[i+132>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);w=H[f+8>>2];g=H[f+12>>2]}H[d+4>>2]=g;H[d>>2]=w;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=A;m=H[f+28>>2]+1|0;H[f+28>>2]=m;i:{if(!m){break i}y=i+96|0;while(1){n=H[f+12>>2];g=H[f+24>>2];e=m-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[n+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;o=H[b+8>>2];k=H[b+4>>2];t=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(g+m|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}b=0;if(t>>>0>A>>>0){break i}d=H[i+12>>2];m=(k|0)!=(d-1|0)?k+1|0:0;if(m>>>0>=d>>>0){break i}q=N(o,12);p=q+H[i+132>>2]|0;l=q+H[i+120>>2]|0;g=H[i>>2];r=m<<2;e=H[r+H[p>>2]>>2];j:{k:{if((g|0)==(e|0)){if(!t){break k}while(1){d=H[l>>2];x=H[d+8>>2];s=H[d+4>>2];n=H[d>>2];q=H[z>>2];m=H[q+4>>2];d=H[q+8>>2];l:{if(m>>>0<d>>>0){H[m+8>>2]=x;H[m+4>>2]=s;H[m>>2]=n;H[q+4>>2]=m+12;break l}r=H[q>>2];g=(m-r|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(d-r|0)/12|0;d=e<<1;k=e>>>0>=178956970?357913941:d>>>0>k>>>0?d:k;if(k){if(k>>>0>=357913942){break a}d=pa(N(k,12))}else{d=0}w=d+N(g,12)|0;H[w+8>>2]=x;H[w+4>>2]=s;H[w>>2]=n;e=w+12|0;if((m|0)!=(r|0)){while(1){w=w-12|0;m=m-12|0;H[w>>2]=H[m>>2];H[w+4>>2]=H[m+4>>2];H[w+8>>2]=H[m+8>>2];if((m|0)!=(r|0)){continue}break}}H[q+8>>2]=d+N(k,12);H[q+4>>2]=e;H[q>>2]=w;if(!r){break l}oa(r)}H[i+8>>2]=H[i+8>>2]+1;b=b+1|0;if((t|0)!=(b|0)){continue}break}break k}m:{n:{o:{p:{if(t>>>0<=2){d=H[i+108>>2];H[d>>2]=m;w=1;g=H[i+12>>2];if(g>>>0>1){break p}break m}if(K[i+8>>2]>K[i+4>>2]){break i}b=H[i+120>>2];s=o+1|0;x=N(s,12);d=b+x|0;if((d|0)!=(l|0)){Aa(d,H[l>>2],H[l+4>>2]);b=H[i+120>>2]}b=r+H[b+x>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));n=Q(t)^31;k=H[i+32>>2];e=32-k|0;q:{if((n|0)<=(e|0)){e=H[i+28>>2];if((e|0)==H[i+20>>2]){break o}d=H[e>>2];b=k+n|0;H[i+32>>2]=b;w=d<<k>>>32-n|0;if((b|0)!=32){break q}H[i+32>>2]=0;H[i+28>>2]=e+4;break q}g=H[i+28>>2];b=g+4|0;if((b|0)==H[i+20>>2]){break o}d=H[g>>2];H[i+28>>2]=b;b=n-e|0;H[i+32>>2]=b;w=H[g+4>>2]>>>32-b|d<<k>>>32-n}d=t>>>1|0;if(w>>>0>d>>>0){break i}break n}while(1){m=(g-1|0)!=(m|0)?m+1|0:0;H[d+(w<<2)>>2]=m;g=H[i+12>>2];w=w+1|0;if(g>>>0>w>>>0){continue}break}break m}d=t>>>1|0;w=0}r:{s:{e=d-w|0;b=t-e|0;t:{if((b|0)==(e|0)){b=e;break t}n=H[i+88>>2];if((n|0)==H[i+80>>2]){break s}k=H[n>>2];g=H[i+92>>2];d=g+1|0;H[i+92>>2]=d;g=k&-2147483648>>>g;u:{if((d|0)==32){H[i+92>>2]=0;H[i+88>>2]=n+4;if(g){break u}break s}if(!g){break s}}}d=b;b=e;break r}d=e}n=H[i+132>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+x|0,g,H[k+4>>2]);if(b){g=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];w=H[f+12>>2];if((g|0)==(((e|0)!=(w|0)?N(e-w>>2,341)-1|0:0)|0)){xa(f+8|0);w=H[f+12>>2];g=H[f+24>>2]+H[f+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+w>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=m;H[e>>2]=b;H[f+28>>2]=H[f+28>>2]+1}if(!d){break k}g=H[f+28>>2]+H[f+24>>2]|0;b=H[f+16>>2];w=H[f+12>>2];if((g|0)==(((b|0)!=(w|0)?N(b-w>>2,341)-1|0:0)|0)){xa(f+8|0);w=H[f+12>>2];g=H[f+24>>2]+H[f+28>>2]|0}b=(g>>>0)/341|0;b=H[(b<<2)+w>>2]+N(g-N(b,341)|0,12)|0;H[b+8>>2]=s;H[b+4>>2]=m;H[b>>2]=d;m=H[f+28>>2]+1|0;H[f+28>>2]=m;break j}if(!t){break k}while(1){if(H[i+12>>2]){o=H[i+40>>2];n=H[p>>2];w=H[i+96>>2];k=H[i+108>>2];m=0;while(1){q=k+(m<<2)|0;H[w+(H[q>>2]<<2)>>2]=0;g=H[i>>2];e=H[q>>2]<<2;d=H[e+n>>2];v:{if((g|0)==(d|0)){break v}r=e+w|0;u=g-d|0;x=H[i+52>>2];g=32-x|0;if((u|0)<=(g|0)){e=H[i+48>>2];if((e|0)==(o|0)){break i}H[r>>2]=H[e>>2]<<x>>>32-u;d=u+H[i+52>>2]|0;H[i+52>>2]=d;if((d|0)!=32){break v}H[i+52>>2]=0;H[i+48>>2]=e+4;break v}s=H[i+48>>2];d=s+4|0;if((d|0)==(o|0)){break i}e=H[s>>2];H[i+48>>2]=d;d=u-g|0;H[i+52>>2]=d;H[r>>2]=H[s+4>>2]>>>32-d|e<<x>>>32-u}e=H[q>>2]<<2;d=e+w|0;H[d>>2]=H[d>>2]|H[e+H[l>>2]>>2];m=m+1|0;if(m>>>0<K[i+12>>2]){continue}break}}jb(z,y);H[i+8>>2]=H[i+8>>2]+1;b=b+1|0;if((t|0)!=(b|0)){continue}break}}m=H[f+28>>2]}if(m){continue}break}}H[f+28>>2]=0;w=H[f+16>>2];m=H[f+12>>2];g=w-m|0;if(g>>>0>=9){while(1){oa(H[m>>2]);m=H[f+12>>2]+4|0;H[f+12>>2]=m;w=H[f+16>>2];g=w-m|0;if(g>>>0>8){continue}break}}b=170;w:{switch((g>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break w}}x:{if((m|0)==(w|0)){break x}while(1){oa(H[m>>2]);m=m+4|0;if((w|0)!=(m|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break x}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break h}}xb(i);break d;case 1:i=wb(B+8|0,3);A=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;y:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break y}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break y}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break y}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break y}H[i+8>>2]=0;if(!ua(i+16|0,b)){break y}if(!ua(i+36|0,b)){break y}if(!ua(i+56|0,b)){break y}if(!ua(i+76|0,b)){break y}p=H[i+4>>2];d=0;f=ca-32|0;ca=f;m=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(m){if(m>>>0>=1073741824){break b}b=m<<2;t=pa(b);H[f+8>>2]=t;d=b+t|0;H[f+16>>2]=d;ra(t,0,b);H[f+12>>2]=d}e=H[i+120>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);m=H[i+12>>2];t=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=t;H[e+8>>2]=H[f+16>>2];t=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;z:{if(m){if(m>>>0>=1073741824){break b}b=m<<2;o=pa(b);H[f+8>>2]=o;t=b+o|0;H[f+16>>2]=t;ra(o,0,b);H[f+12>>2]=t}d=H[i+132>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);t=H[f+12>>2];o=H[f+8>>2]}H[d+4>>2]=t;H[d>>2]=o;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=p;m=H[f+28>>2]+1|0;H[f+28>>2]=m;A:{if(!m){break A}s=i+96|0;while(1){k=H[f+12>>2];g=H[f+24>>2];e=m-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;q=H[b+8>>2];d=H[b+4>>2];l=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(g+m|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}if(l>>>0>p>>>0){break A}b=H[i+12>>2];m=(d|0)!=(b-1|0)?d+1|0:0;if(m>>>0>=b>>>0){break A}b=H[i+120>>2];r=N(q,12);u=b+r|0;e=H[i>>2];x=m<<2;n=r+H[i+132>>2]|0;d=H[x+H[n>>2]>>2];B:{C:{if((e|0)==(d|0)){x=0;if(!l){break C}while(1){b=H[u>>2];y=H[b+8>>2];n=H[b+4>>2];k=H[b>>2];q=H[A>>2];m=H[q+4>>2];b=H[q+8>>2];D:{if(m>>>0<b>>>0){H[m+8>>2]=y;H[m+4>>2]=n;H[m>>2]=k;H[q+4>>2]=m+12;break D}r=H[q>>2];e=(m-r|0)/12|0;g=e+1|0;if(g>>>0>=357913942){break b}d=(b-r|0)/12|0;b=d<<1;g=d>>>0>=178956970?357913941:b>>>0>g>>>0?b:g;if(g){if(g>>>0>=357913942){break a}b=pa(N(g,12))}else{b=0}o=b+N(e,12)|0;H[o+8>>2]=y;H[o+4>>2]=n;H[o>>2]=k;d=o+12|0;if((m|0)!=(r|0)){while(1){o=o-12|0;m=m-12|0;H[o>>2]=H[m>>2];H[o+4>>2]=H[m+4>>2];H[o+8>>2]=H[m+8>>2];if((m|0)!=(r|0)){continue}break}}H[q+8>>2]=b+N(g,12);H[q+4>>2]=d;H[q>>2]=o;if(!r){break D}oa(r)}H[i+8>>2]=H[i+8>>2]+1;x=x+1|0;if((l|0)!=(x|0)){continue}break}break C}E:{F:{G:{H:{if(l>>>0<=2){b=H[i+108>>2];H[b>>2]=m;o=1;t=H[i+12>>2];if(t>>>0>1){break H}break E}if(K[i+8>>2]>K[i+4>>2]){break A}k=b;b=r+12|0;Aa(k+b|0,H[u>>2],H[u+4>>2]);b=x+H[b+H[i+120>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<e+(d^-1));n=Q(l)^31;k=H[i+32>>2];e=32-k|0;I:{if((n|0)<=(e|0)){e=H[i+28>>2];if((e|0)==H[i+20>>2]){break G}d=H[e>>2];b=k+n|0;H[i+32>>2]=b;d=d<<k>>>32-n|0;if((b|0)!=32){break I}H[i+32>>2]=0;H[i+28>>2]=e+4;break I}g=H[i+28>>2];b=g+4|0;if((b|0)==H[i+20>>2]){break G}d=H[g>>2];H[i+28>>2]=b;b=n-e|0;H[i+32>>2]=b;d=H[g+4>>2]>>>32-b|d<<k>>>32-n}o=l>>>1|0;if(o>>>0<d>>>0){break A}break F}while(1){m=(t-1|0)!=(m|0)?m+1|0:0;H[b+(o<<2)>>2]=m;o=o+1|0;t=H[i+12>>2];if(o>>>0<t>>>0){continue}break}break E}o=l>>>1|0;d=0}y=q+1|0;J:{K:{e=o-d|0;d=l-e|0;L:{if((d|0)==(e|0)){b=e;break L}n=H[i+88>>2];if((n|0)==H[i+80>>2]){break K}k=H[n>>2];g=H[i+92>>2];b=g+1|0;H[i+92>>2]=b;g=k&-2147483648>>>g;M:{if((b|0)==32){H[i+92>>2]=0;H[i+88>>2]=n+4;if(g){break M}break K}if(!g){break K}}b=d}d=e;break J}b=e}n=H[i+132>>2];k=n+r|0;g=H[k>>2];e=g+x|0;H[e>>2]=H[e>>2]+1;Aa(n+N(y,12)|0,g,H[k+4>>2]);if(d){t=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];o=H[f+12>>2];if((t|0)==(((e|0)!=(o|0)?N(e-o>>2,341)-1|0:0)|0)){xa(f+8|0);t=H[f+24>>2]+H[f+28>>2]|0;o=H[f+12>>2]}e=(t>>>0)/341|0;e=H[o+(e<<2)>>2]+N(t-N(e,341)|0,12)|0;H[e+8>>2]=q;H[e+4>>2]=m;H[e>>2]=d;H[f+28>>2]=H[f+28>>2]+1}if(!b){break C}t=H[f+28>>2]+H[f+24>>2]|0;d=H[f+16>>2];o=H[f+12>>2];if((t|0)==(((d|0)!=(o|0)?N(d-o>>2,341)-1|0:0)|0)){xa(f+8|0);t=H[f+24>>2]+H[f+28>>2]|0;o=H[f+12>>2]}d=(t>>>0)/341|0;d=H[o+(d<<2)>>2]+N(t-N(d,341)|0,12)|0;H[d+8>>2]=y;H[d+4>>2]=m;H[d>>2]=b;m=H[f+28>>2]+1|0;H[f+28>>2]=m;break B}t=0;if(!l){break C}while(1){if(H[i+12>>2]){o=H[i+40>>2];k=H[n>>2];z=H[i+96>>2];g=H[i+108>>2];m=0;while(1){q=g+(m<<2)|0;H[z+(H[q>>2]<<2)>>2]=0;e=H[i>>2];d=H[q>>2]<<2;b=H[d+k>>2];N:{if((e|0)==(b|0)){break N}r=d+z|0;w=e-b|0;x=H[i+52>>2];e=32-x|0;if((w|0)<=(e|0)){d=H[i+48>>2];if((d|0)==(o|0)){break A}H[r>>2]=H[d>>2]<<x>>>32-w;b=w+H[i+52>>2]|0;H[i+52>>2]=b;if((b|0)!=32){break N}H[i+52>>2]=0;H[i+48>>2]=d+4;break N}y=H[i+48>>2];b=y+4|0;if((b|0)==(o|0)){break A}d=H[y>>2];H[i+48>>2]=b;b=w-e|0;H[i+52>>2]=b;H[r>>2]=H[y+4>>2]>>>32-b|d<<x>>>32-w}d=H[q>>2]<<2;b=d+z|0;H[b>>2]=H[b>>2]|H[d+H[u>>2]>>2];m=m+1|0;if(m>>>0<K[i+12>>2]){continue}break}}jb(A,s);H[i+8>>2]=H[i+8>>2]+1;t=t+1|0;if((l|0)!=(t|0)){continue}break}}m=H[f+28>>2]}if(m){continue}break}}H[f+28>>2]=0;o=H[f+16>>2];m=H[f+12>>2];t=o-m|0;if(t>>>0>=9){while(1){oa(H[m>>2]);m=H[f+12>>2]+4|0;H[f+12>>2]=m;o=H[f+16>>2];t=o-m|0;if(t>>>0>8){continue}break}}b=170;O:{switch((t>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break O}}P:{if((m|0)==(o|0)){break P}while(1){oa(H[m>>2]);m=m+4|0;if((o|0)!=(m|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break P}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break z}}xb(i);break d;case 2:f=ub(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Q:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Q}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Q}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Q}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Q}H[f+8>>2]=0;if(!ta(f+16|0,b)){break Q}if(!ua(f+32|0,b)){break Q}if(!ua(f+52|0,b)){break Q}if(!ua(f+72|0,b)){break Q}z=H[f+4>>2];g=0;b=0;h=ca-32|0;ca=h;j=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(j){if(j>>>0>=1073741824){break b}d=j<<2;g=pa(d);H[h+8>>2]=g;b=d+g|0;H[h+16>>2]=b;ra(g,0,d);H[h+12>>2]=b}e=H[f+116>>2];d=H[e>>2];if(d){H[e+4>>2]=d;oa(d);j=H[f+12>>2];g=H[h+8>>2];b=H[h+12>>2]}H[e+4>>2]=b;H[e>>2]=g;H[e+8>>2]=H[h+16>>2];g=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;R:{if(j){if(j>>>0>=1073741824){break b}b=j<<2;u=pa(b);H[h+8>>2]=u;g=b+u|0;H[h+16>>2]=g;ra(u,0,b);H[h+12>>2]=g}d=H[f+128>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);u=H[h+8>>2];g=H[h+12>>2]}H[d+4>>2]=g;H[d>>2]=u;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;j=H[h+28>>2]+1|0;H[h+28>>2]=j;S:{if(!j){break S}x=f+92|0;y=f+16|0;while(1){n=H[h+12>>2];g=H[h+24>>2];e=j-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[n+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;p=H[b+8>>2];k=H[b+4>>2];i=H[b>>2];H[h+28>>2]=e;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(g+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}d=0;if(i>>>0>z>>>0){break S}b=H[f+12>>2];j=(k|0)!=(b-1|0)?k+1|0:0;if(j>>>0>=b>>>0){break S}o=N(p,12);A=o+H[f+128>>2]|0;t=o+H[f+116>>2]|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];T:{if((g|0)==(e|0)){if(!i){break T}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];o=H[w>>2];j=H[o+4>>2];b=H[o+8>>2];U:{if(j>>>0<b>>>0){H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;H[o+4>>2]=j+12;break U}q=H[o>>2];g=(j-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}u=b+N(g,12)|0;H[u+8>>2]=r;H[u+4>>2]=s;H[u>>2]=n;e=u+12|0;if((j|0)!=(q|0)){while(1){u=u-12|0;j=j-12|0;H[u>>2]=H[j>>2];H[u+4>>2]=H[j+4>>2];H[u+8>>2]=H[j+8>>2];if((j|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(k,12);H[o+4>>2]=e;H[o>>2]=u;if(!q){break U}oa(q)}H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((i|0)!=(d|0)){continue}break}break T}V:{W:{X:{Y:{if(i>>>0<=2){b=H[f+104>>2];H[b>>2]=j;u=1;g=H[f+12>>2];if(g>>>0>1){break Y}break V}if(K[f+8>>2]>K[f+4>>2]){break S}b=H[f+116>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+116>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));H[h+4>>2]=0;pc(y,Q(i)^31,h+4|0);d=i>>>1|0;b=H[h+4>>2];if(d>>>0<b>>>0){break S}e=d-b|0;d=i-e|0;Z:{if((d|0)==(e|0)){b=e;break Z}n=H[f+84>>2];if((n|0)==H[f+76>>2]){break X}k=H[n>>2];g=H[f+88>>2];b=g+1|0;H[f+88>>2]=b;g=k&-2147483648>>>g;_:{if((b|0)==32){H[f+88>>2]=0;H[f+84>>2]=n+4;if(g){break _}break X}if(!g){break X}}b=d}d=e;break W}while(1){j=(g-1|0)!=(j|0)?j+1|0:0;H[b+(u<<2)>>2]=j;g=H[f+12>>2];u=u+1|0;if(g>>>0>u>>>0){continue}break}break V}b=e}n=H[f+128>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];u=H[h+12>>2];if((g|0)==(((e|0)!=(u|0)?N(e-u>>2,341)-1|0:0)|0)){xa(h+8|0);u=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+u>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break T}g=H[h+28>>2]+H[h+24>>2]|0;d=H[h+16>>2];u=H[h+12>>2];if((g|0)==(((d|0)!=(u|0)?N(d-u>>2,341)-1|0:0)|0)){xa(h+8|0);u=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}d=(g>>>0)/341|0;d=H[(d<<2)+u>>2]+N(g-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;H[h+28>>2]=H[h+28>>2]+1;break T}if(!i){break T}while(1){if(H[f+12>>2]){p=H[f+36>>2];n=H[A>>2];u=H[f+92>>2];k=H[f+104>>2];j=0;while(1){o=k+(j<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];$:{if((g|0)==(b|0)){break $}q=e+u|0;l=g-b|0;r=H[f+48>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+44>>2];if((e|0)==(p|0)){break S}H[q>>2]=H[e>>2]<<r>>>32-l;b=l+H[f+48>>2]|0;H[f+48>>2]=b;if((b|0)!=32){break $}H[f+48>>2]=0;H[f+44>>2]=e+4;break $}s=H[f+44>>2];b=s+4|0;if((b|0)==(p|0)){break S}e=H[s>>2];H[f+44>>2]=b;b=l-g|0;H[f+48>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<<r>>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];j=j+1|0;if(j>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((i|0)!=(d|0)){continue}break}}j=H[h+28>>2];if(j){continue}break}}H[h+28>>2]=0;u=H[h+16>>2];j=H[h+12>>2];g=u-j|0;if(g>>>0>=9){while(1){oa(H[j>>2]);j=H[h+12>>2]+4|0;H[h+12>>2]=j;u=H[h+16>>2];g=u-j|0;if(g>>>0>8){continue}break}}b=170;aa:{switch((g>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break aa}}ba:{if((j|0)==(u|0)){break ba}while(1){oa(H[j>>2]);j=j+4|0;if((u|0)!=(j|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break ba}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break R}}vb(f);break d;case 3:i=ub(B+8|0,3);z=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;ca:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break ca}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break ca}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break ca}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break ca}H[i+8>>2]=0;if(!ta(i+16|0,b)){break ca}if(!ua(i+32|0,b)){break ca}if(!ua(i+52|0,b)){break ca}if(!ua(i+72|0,b)){break ca}A=H[i+4>>2];d=0;f=ca-32|0;ca=f;j=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(j){if(j>>>0>=1073741824){break b}b=j<<2;m=pa(b);H[f+8>>2]=m;d=b+m|0;H[f+16>>2]=d;ra(m,0,b);H[f+12>>2]=d}e=H[i+116>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);j=H[i+12>>2];m=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=m;H[e+8>>2]=H[f+16>>2];m=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;da:{if(j){if(j>>>0>=1073741824){break b}b=j<<2;p=pa(b);H[f+8>>2]=p;m=b+p|0;H[f+16>>2]=m;ra(p,0,b);H[f+12>>2]=m}d=H[i+128>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);m=H[f+12>>2];p=H[f+8>>2]}H[d+4>>2]=m;H[d>>2]=p;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=A;j=H[f+28>>2]+1|0;H[f+28>>2]=j;ea:{if(!j){break ea}y=i+92|0;s=i+16|0;while(1){k=H[f+12>>2];g=H[f+24>>2];e=j-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;o=H[b+8>>2];d=H[b+4>>2];t=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(g+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}if(t>>>0>A>>>0){break ea}b=H[i+12>>2];j=(d|0)!=(b-1|0)?d+1|0:0;if(j>>>0>=b>>>0){break ea}b=H[i+116>>2];q=N(o,12);l=b+q|0;e=H[i>>2];r=j<<2;n=q+H[i+128>>2]|0;d=H[r+H[n>>2]>>2];fa:{if((e|0)==(d|0)){r=0;if(!t){break fa}while(1){b=H[l>>2];x=H[b+8>>2];n=H[b+4>>2];k=H[b>>2];o=H[z>>2];j=H[o+4>>2];b=H[o+8>>2];ga:{if(j>>>0<b>>>0){H[j+8>>2]=x;H[j+4>>2]=n;H[j>>2]=k;H[o+4>>2]=j+12;break ga}q=H[o>>2];e=(j-q|0)/12|0;g=e+1|0;if(g>>>0>=357913942){break b}d=(b-q|0)/12|0;b=d<<1;g=d>>>0>=178956970?357913941:b>>>0>g>>>0?b:g;if(g){if(g>>>0>=357913942){break a}b=pa(N(g,12))}else{b=0}p=b+N(e,12)|0;H[p+8>>2]=x;H[p+4>>2]=n;H[p>>2]=k;d=p+12|0;if((j|0)!=(q|0)){while(1){p=p-12|0;j=j-12|0;H[p>>2]=H[j>>2];H[p+4>>2]=H[j+4>>2];H[p+8>>2]=H[j+8>>2];if((j|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(g,12);H[o+4>>2]=d;H[o>>2]=p;if(!q){break ga}oa(q)}H[i+8>>2]=H[i+8>>2]+1;r=r+1|0;if((t|0)!=(r|0)){continue}break}break fa}ha:{ia:{ja:{ka:{if(t>>>0<=2){b=H[i+104>>2];H[b>>2]=j;p=1;m=H[i+12>>2];if(m>>>0>1){break ka}break ha}if(K[i+8>>2]>K[i+4>>2]){break ea}k=b;b=q+12|0;Aa(k+b|0,H[l>>2],H[l+4>>2]);b=r+H[b+H[i+116>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<e+(d^-1));H[f+4>>2]=0;pc(s,Q(t)^31,f+4|0);d=t>>>1|0;b=H[f+4>>2];if(d>>>0<b>>>0){break ea}x=o+1|0;e=d-b|0;d=t-e|0;la:{if((d|0)==(e|0)){b=e;break la}n=H[i+84>>2];if((n|0)==H[i+76>>2]){break ja}k=H[n>>2];g=H[i+88>>2];b=g+1|0;H[i+88>>2]=b;g=k&-2147483648>>>g;ma:{if((b|0)==32){H[i+88>>2]=0;H[i+84>>2]=n+4;if(g){break ma}break ja}if(!g){break ja}}b=d}d=e;break ia}while(1){j=(m-1|0)!=(j|0)?j+1|0:0;H[b+(p<<2)>>2]=j;m=H[i+12>>2];p=p+1|0;if(m>>>0>p>>>0){continue}break}break ha}b=e}n=H[i+128>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+N(x,12)|0,g,H[k+4>>2]);if(d){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];p=H[f+12>>2];if((m|0)==(((e|0)!=(p|0)?N(e-p>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;p=H[f+12>>2]}e=(m>>>0)/341|0;e=H[p+(e<<2)>>2]+N(m-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=j;H[e>>2]=d;H[f+28>>2]=H[f+28>>2]+1}if(!b){break fa}m=H[f+28>>2]+H[f+24>>2]|0;d=H[f+16>>2];p=H[f+12>>2];if((m|0)==(((d|0)!=(p|0)?N(d-p>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;p=H[f+12>>2]}d=(m>>>0)/341|0;d=H[p+(d<<2)>>2]+N(m-N(d,341)|0,12)|0;H[d+8>>2]=x;H[d+4>>2]=j;H[d>>2]=b;H[f+28>>2]=H[f+28>>2]+1;break fa}m=0;if(!t){break fa}while(1){if(H[i+12>>2]){p=H[i+36>>2];k=H[n>>2];w=H[i+92>>2];g=H[i+104>>2];j=0;while(1){o=g+(j<<2)|0;H[w+(H[o>>2]<<2)>>2]=0;e=H[i>>2];d=H[o>>2]<<2;b=H[d+k>>2];na:{if((e|0)==(b|0)){break na}q=d+w|0;u=e-b|0;r=H[i+48>>2];e=32-r|0;if((u|0)<=(e|0)){d=H[i+44>>2];if((d|0)==(p|0)){break ea}H[q>>2]=H[d>>2]<<r>>>32-u;b=u+H[i+48>>2]|0;H[i+48>>2]=b;if((b|0)!=32){break na}H[i+48>>2]=0;H[i+44>>2]=d+4;break na}x=H[i+44>>2];b=x+4|0;if((b|0)==(p|0)){break ea}d=H[x>>2];H[i+44>>2]=b;b=u-e|0;H[i+48>>2]=b;H[q>>2]=H[x+4>>2]>>>32-b|d<<r>>>32-u}d=H[o>>2]<<2;b=d+w|0;H[b>>2]=H[b>>2]|H[d+H[l>>2]>>2];j=j+1|0;if(j>>>0<K[i+12>>2]){continue}break}}jb(z,y);H[i+8>>2]=H[i+8>>2]+1;m=m+1|0;if((t|0)!=(m|0)){continue}break}}j=H[f+28>>2];if(j){continue}break}}H[f+28>>2]=0;p=H[f+16>>2];j=H[f+12>>2];m=p-j|0;if(m>>>0>=9){while(1){oa(H[j>>2]);j=H[f+12>>2]+4|0;H[f+12>>2]=j;p=H[f+16>>2];m=p-j|0;if(m>>>0>8){continue}break}}b=170;oa:{switch((m>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break oa}}pa:{if((j|0)==(p|0)){break pa}while(1){oa(H[j>>2]);j=j+4|0;if((p|0)!=(j|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break pa}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break da}}vb(i);break d;case 4:f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;qa:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break qa}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break qa}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break qa}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break qa}H[f+8>>2]=0;if(!sb(f+16|0,b)){break qa}if(!ua(f+544|0,b)){break qa}if(!ua(f+564|0,b)){break qa}if(!ua(f+584|0,b)){break qa}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;ra:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;j=pa(b);H[h+8>>2]=j;l=b+j|0;H[h+16>>2]=l;ra(j,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);j=H[h+8>>2];l=H[h+12>>2]}H[d+4>>2]=l;H[d>>2]=j;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;sa:{if(!d){break sa}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;p=H[b+8>>2];e=H[b+4>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break sa}b=H[f+12>>2];j=(e|0)!=(b-1|0)?e+1|0:0;if(j>>>0>=b>>>0){break sa}o=N(p,12);A=o+H[f+640>>2]|0;t=o+H[f+628>>2]|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];ta:{ua:{if((g|0)==(e|0)){o=0;if(!i){break ua}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];p=H[w>>2];d=H[p+4>>2];b=H[p+8>>2];va:{if(d>>>0<b>>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[p+4>>2]=d+12;break va}q=H[p>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}j=b+N(g,12)|0;H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;e=j+12|0;if((d|0)!=(q|0)){while(1){j=j-12|0;d=d-12|0;H[j>>2]=H[d>>2];H[j+4>>2]=H[d+4>>2];H[j+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[p+8>>2]=b+N(k,12);H[p+4>>2]=e;H[p>>2]=j;if(!q){break va}oa(q)}H[f+8>>2]=H[f+8>>2]+1;o=o+1|0;if((i|0)!=(o|0)){continue}break}break ua}wa:{xa:{ya:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=j;d=1;l=H[f+12>>2];if(l>>>0>1){break ya}break wa}if(K[f+8>>2]>K[f+4>>2]){break sa}b=H[f+628>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+628>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));l=0;d=0;b=Q(i)^31;if(!b){d=i>>>1|0;break xa}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break xa}break sa}while(1){j=(l-1|0)!=(j|0)?j+1|0:0;H[b+(d<<2)>>2]=j;d=d+1|0;l=H[f+12>>2];if(d>>>0<l>>>0){continue}break}break wa}za:{Aa:{e=d-l|0;d=i-e|0;Ba:{if((d|0)==(e|0)){b=e;break Ba}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break Aa}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;Ca:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break Ca}break Aa}if(!g){break Aa}}b=d}d=e;break za}b=e}n=H[f+640>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((g|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+l>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break ua}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break ta}j=0;if(!i){break ua}while(1){if(H[f+12>>2]){p=H[f+548>>2];n=H[A>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){o=k+(d<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];Da:{if((g|0)==(b|0)){break Da}q=e+u|0;l=g-b|0;r=H[f+560>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(p|0)){break sa}H[q>>2]=H[e>>2]<<r>>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break Da}H[f+560>>2]=0;H[f+556>>2]=e+4;break Da}s=H[f+556>>2];b=s+4|0;if((b|0)==(p|0)){break sa}e=H[s>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<<r>>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;j=j+1|0;if((i|0)!=(j|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;j=H[h+16>>2];d=H[h+12>>2];l=j-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;j=H[h+16>>2];l=j-d|0;if(l>>>0>8){continue}break}}b=170;Ea:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break Ea}}Fa:{if((d|0)==(j|0)){break Fa}while(1){oa(H[d>>2]);d=d+4|0;if((j|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break Fa}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break ra}}ab(f);break d;case 5:f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Ga:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Ga}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Ga}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Ga}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Ga}H[f+8>>2]=0;if(!sb(f+16|0,b)){break Ga}if(!ua(f+544|0,b)){break Ga}if(!ua(f+564|0,b)){break Ga}if(!ua(f+584|0,b)){break Ga}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;Ha:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;p=pa(b);H[h+8>>2]=p;l=b+p|0;H[h+16>>2]=l;ra(p,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);l=H[h+12>>2];p=H[h+8>>2]}H[d+4>>2]=l;H[d>>2]=p;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;Ia:{if(!d){break Ia}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;o=H[b+8>>2];e=H[b+4>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break Ia}m=0;b=H[f+12>>2];p=(e|0)!=(b-1|0)?e+1|0:0;if(p>>>0>=b>>>0){break Ia}b=H[f+628>>2];q=N(o,12);t=b+q|0;e=H[f>>2];r=p<<2;s=q+H[f+640>>2]|0;d=H[r+H[s>>2]>>2];Ja:{Ka:{if((e|0)==(d|0)){if(!i){break Ka}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];o=H[w>>2];d=H[o+4>>2];b=H[o+8>>2];La:{if(d>>>0<b>>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[o+4>>2]=d+12;break La}q=H[o>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}p=b+N(g,12)|0;H[p+8>>2]=r;H[p+4>>2]=s;H[p>>2]=n;e=p+12|0;if((d|0)!=(q|0)){while(1){p=p-12|0;d=d-12|0;H[p>>2]=H[d>>2];H[p+4>>2]=H[d+4>>2];H[p+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(k,12);H[o+4>>2]=e;H[o>>2]=p;if(!q){break La}oa(q)}H[f+8>>2]=H[f+8>>2]+1;m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ka}Ma:{Na:{Oa:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=p;d=1;l=H[f+12>>2];if(l>>>0>1){break Oa}break Ma}if(K[f+8>>2]>K[f+4>>2]){break Ia}k=b;b=q+12|0;Aa(k+b|0,H[t>>2],H[t+4>>2]);b=r+H[b+H[f+628>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<e+(d^-1));l=0;d=0;b=Q(i)^31;if(!b){d=i>>>1|0;break Na}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break Na}break Ia}while(1){p=(l-1|0)!=(p|0)?p+1|0:0;H[b+(d<<2)>>2]=p;d=d+1|0;l=H[f+12>>2];if(d>>>0<l>>>0){continue}break}break Ma}s=o+1|0;Pa:{Qa:{e=d-l|0;d=i-e|0;Ra:{if((d|0)==(e|0)){b=e;break Ra}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break Qa}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;Sa:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break Sa}break Qa}if(!g){break Qa}}b=d}d=e;break Pa}b=e}n=H[f+640>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+N(s,12)|0,g,H[k+4>>2]);if(d){m=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((m|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);m=H[h+24>>2]+H[h+28>>2]|0;l=H[h+12>>2]}e=(m>>>0)/341|0;e=H[l+(e<<2)>>2]+N(m-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=p;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break Ka}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=p;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break Ja}if(!i){break Ka}while(1){if(H[f+12>>2]){A=H[f+548>>2];n=H[s>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){p=k+(d<<2)|0;H[u+(H[p>>2]<<2)>>2]=0;g=H[f>>2];e=H[p>>2]<<2;b=H[e+n>>2];Ta:{if((g|0)==(b|0)){break Ta}o=e+u|0;l=g-b|0;q=H[f+560>>2];g=32-q|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(A|0)){break Ia}H[o>>2]=H[e>>2]<<q>>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break Ta}H[f+560>>2]=0;H[f+556>>2]=e+4;break Ta}r=H[f+556>>2];b=r+4|0;if((b|0)==(A|0)){break Ia}e=H[r>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[o>>2]=H[r+4>>2]>>>32-b|e<<q>>>32-l}e=H[p>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;m=m+1|0;if((i|0)!=(m|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;p=H[h+16>>2];d=H[h+12>>2];l=p-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;p=H[h+16>>2];l=p-d|0;if(l>>>0>8){continue}break}}b=170;Ua:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break Ua}}Va:{if((d|0)==(p|0)){break Va}while(1){oa(H[d>>2]);d=d+4|0;if((p|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break Va}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break Ha}}ab(f);break d;case 6:break f;default:break c}}f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Wa:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Wa}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Wa}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Wa}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Wa}H[f+8>>2]=0;if(!sb(f+16|0,b)){break Wa}if(!ua(f+544|0,b)){break Wa}if(!ua(f+564|0,b)){break Wa}if(!ua(f+584|0,b)){break Wa}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;Xa:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;j=pa(b);H[h+8>>2]=j;l=b+j|0;H[h+16>>2]=l;ra(j,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);j=H[h+8>>2];l=H[h+12>>2]}H[d+4>>2]=l;H[d>>2]=j;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;Ya:{if(!d){break Ya}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;p=H[b+8>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break Ya}b=H[f+628>>2];o=N(p,12);A=o+H[f+640>>2]|0;j=Vd(f,i,A);if(j>>>0>=K[f+12>>2]){break Ya}t=b+o|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];Za:{_a:{if((g|0)==(e|0)){o=0;if(!i){break _a}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];p=H[w>>2];d=H[p+4>>2];b=H[p+8>>2];$a:{if(d>>>0<b>>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[p+4>>2]=d+12;break $a}q=H[p>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}j=b+N(g,12)|0;H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;e=j+12|0;if((d|0)!=(q|0)){while(1){j=j-12|0;d=d-12|0;H[j>>2]=H[d>>2];H[j+4>>2]=H[d+4>>2];H[j+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[p+8>>2]=b+N(k,12);H[p+4>>2]=e;H[p>>2]=j;if(!q){break $a}oa(q)}H[f+8>>2]=H[f+8>>2]+1;o=o+1|0;if((i|0)!=(o|0)){continue}break}break _a}ab:{bb:{cb:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=j;d=1;l=H[f+12>>2];if(l>>>0>1){break cb}break ab}if(K[f+8>>2]>K[f+4>>2]){break Ya}b=H[f+628>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+628>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));l=0;d=0;b=Q(i)^31;if(!b){d=i>>>1|0;break bb}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break bb}break Ya}while(1){j=(l-1|0)!=(j|0)?j+1|0:0;H[b+(d<<2)>>2]=j;d=d+1|0;l=H[f+12>>2];if(d>>>0<l>>>0){continue}break}break ab}db:{eb:{e=d-l|0;d=i-e|0;fb:{if((d|0)==(e|0)){b=e;break fb}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break eb}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;gb:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break gb}break eb}if(!g){break eb}}b=d}d=e;break db}b=e}n=H[f+640>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((g|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+l>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break _a}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break Za}j=0;if(!i){break _a}while(1){if(H[f+12>>2]){p=H[f+548>>2];n=H[A>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){o=k+(d<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];hb:{if((g|0)==(b|0)){break hb}q=e+u|0;l=g-b|0;r=H[f+560>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(p|0)){break Ya}H[q>>2]=H[e>>2]<<r>>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break hb}H[f+560>>2]=0;H[f+556>>2]=e+4;break hb}s=H[f+556>>2];b=s+4|0;if((b|0)==(p|0)){break Ya}e=H[s>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<<r>>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;j=j+1|0;if((i|0)!=(j|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;j=H[h+16>>2];d=H[h+12>>2];l=j-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;j=H[h+16>>2];l=j-d|0;if(l>>>0>8){continue}break}}b=170;ib:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break ib}}jb:{if((d|0)==(j|0)){break jb}while(1){oa(H[d>>2]);d=d+4|0;if((j|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break jb}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break Xa}}ab(f)}n=H[a+12>>2]==((H[c+4>>2]-H[c>>2]|0)/12|0)}ca=B+672|0;return n}sa();v()}wa();v()}function kd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if(!a){return 1}e=H[c+20>>2];g=H[c+12>>2];i=H[c+16>>2];a:{if((e|0)>=(g|0)&i>>>0>=K[c+8>>2]|(e|0)>(g|0)){break a}g=I[i+H[c>>2]|0];i=i+1|0;e=i?e:e+1|0;H[c+16>>2]=i;H[c+20>>2]=e;b:{switch(g|0){case 0:e=a;f=b;i=d;a=0;d=0;m=ca+-64|0;ca=m;H[m+56>>2]=0;H[m+48>>2]=0;H[m+52>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;c:{if(!Ne(m+8|0,c)){break c}if(!Me(m+8|0,c)|(H[m+20>>2]?0:e)){break c}Db(c,0,0);if(e){s=f<<2;t=H[m+36>>2];w=H[m+48>>2];x=H[m+24>>2];l=H[m+56>>2];j=H[m+52>>2];while(1){d:{if(l>>>0>16383){break d}while(1){if((j|0)<=0){break d}j=j-1|0;H[m+52>>2]=j;l=I[j+w|0]|l<<8;H[m+56>>2]=l;if(l>>>0<16384){continue}break}}a=l&4095;r=H[(a<<2)+x>>2];b=(r<<3)+t|0;l=(N(H[b>>2],l>>>12|0)+a|0)-H[b+4>>2]|0;H[m+56>>2]=l;if((f|0)>0){a=0;if(!I[c+36|0]|r>>>0>32){break c}g=d+f|0;e:{if(!r){ra(i+(d<<2)|0,0,s);break e}y=r&-2;z=r&1;b=H[c+32>>2];h=H[c+28>>2];n=H[c+24>>2];while(1){k=0;a=b;o=0;q=0;if((r|0)!=1){while(1){p=n+(a>>>3|0)|0;f:{if(p>>>0>=h>>>0){p=0;break f}p=I[p|0];b=a+1|0;H[c+32>>2]=b;p=p>>>(a&7)&1;a=b}p=p<<k|o;o=0;u=n+(a>>>3|0)|0;if(u>>>0<h>>>0){o=I[u|0];b=a+1|0;H[c+32>>2]=b;o=o>>>(a&7)&1;a=b}u=k|1;k=k+2|0;o=p|o<<u;q=q+2|0;if((y|0)!=(q|0)){continue}break}}q=i+(d<<2)|0;if(z){p=n+(a>>>3|0)|0;if(p>>>0<h>>>0){p=I[p|0];b=a+1|0;H[c+32>>2]=b;a=p>>>(a&7)&1}else{a=0}o=a<<k|o}H[q>>2]=o;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=g}v=f+v|0;if(e>>>0>v>>>0){continue}break}}F[c+36|0]=0;b=H[c+20>>2];e=0;d=H[c+32>>2]+7|0;e=d>>>0<7?1:e;d=(e&7)<<29|d>>>3;a=d+H[c+16>>2]|0;e=(e>>>3|0)+b|0;H[c+16>>2]=a;H[c+20>>2]=a>>>0<d>>>0?e+1|0:e;a=1}b=H[m+36>>2];if(b){H[m+40>>2]=b;oa(b)}b=H[m+24>>2];if(b){H[m+28>>2]=b;oa(b)}b=H[m+8>>2];if(b){H[m+12>>2]=b;oa(b)}ca=m- -64|0;return a;case 1:break b;default:break a}}b=0;e=H[c+20>>2];g=H[c+12>>2];i=H[c+16>>2];g:{if((e|0)>=(g|0)&i>>>0>=K[c+8>>2]|(e|0)>(g|0)){break g}g=I[i+H[c>>2]|0];i=i+1|0;e=i?e:e+1|0;H[c+16>>2]=i;H[c+20>>2]=e;h:{switch(g-1|0){case 8:g=a;r=d;i=ca+-64|0;ca=i;H[i+56>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+32>>2]=0;H[i+36>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;H[i+16>>2]=0;H[i+20>>2]=0;H[i+8>>2]=0;H[i+12>>2]=0;j=i+8|0;a=J[c+38>>1];i:{j:{if(!a){break j}k:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break j}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break k}if(!hb(1,j+12|0,c)){break j}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break j}b=H[j>>2];a=H[j+4>>2]-b>>2;l:{if(a>>>0<h>>>0){ya(j,h-a|0);h=H[j+12>>2];break l}if(a>>>0<=h>>>0){break l}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break i}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];m=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=m>>>0|(e|0)>(n|0)){break i}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;m:{n:{o:{p:{t=p&3;switch(t|0){case 0:break n;case 3:break p;default:break o}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break i}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break m}while(1){if((f|0)==(m|0)&(e|0)==(n|0)){break j}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0<h>>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;q:{if(b>>>0<=32767){ya(a,8192-(b>>>2|0)|0);break q}if((b|0)==32768){break q}H[j+20>>2]=d+32768}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;r:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break r}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break j}}m=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>8192){break j}s:{if(a>>>0>=d>>>0){break s}l=0;j=e&7;if(j){while(1){H[m+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break s}while(1){e=m+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==8192}d=k}t:{if(!d|(H[i+20>>2]?0:g)){break t}d=0;m=ca-16|0;ca=m;u:{v:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break u}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break v}if(!gb(1,m+8|0,c)){break u}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[m+8>>2];k=H[m+12>>2]}j=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>j>>>0|b>>>0<k>>>0){break u}e=e+k|0;b=a+f|0;e=b>>>0<a>>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break u}b=H[c>>2]+f|0;H[i+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];w:{if(e>>>0<=63){H[i+52>>2]=c;a=I[f|0]&63;break w}x:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break u}a=a-2|0;H[i+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break w;case 1:if(a>>>0<3){break u}a=a-3|0;H[i+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break w;default:break x}}a=a-4|0;H[i+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[i+56>>2]=a+32768;d=a>>>0<8355840}ca=m+16|0;if(!d){break t}if(!g){o=1;break t}b=H[i+52>>2];a=H[i+56>>2];c=H[i+36>>2];d=H[i+48>>2];f=H[i+24>>2];while(1){y:{if(a>>>0>32767){break y}while(1){if((b|0)<=0){break y}b=b-1|0;H[i+52>>2]=b;a=I[b+d|0]|a<<8;H[i+56>>2]=a;if(a>>>0<32768){continue}break}}e=a&8191;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>13|0)+e|0)-H[k+4>>2]|0;H[i+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((g|0)!=(q|0)){continue}break}}a=H[i+36>>2];if(a){H[i+40>>2]=a;oa(a)}a=H[i+24>>2];if(a){H[i+28>>2]=a;oa(a)}a=H[i+8>>2];if(a){H[i+12>>2]=a;oa(a)}ca=i- -64|0;b=o;break g;case 9:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];z:{A:{if(!a){break A}B:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break A}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break B}if(!hb(1,j+12|0,c)){break A}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break A}b=H[j>>2];a=H[j+4>>2]-b>>2;C:{if(a>>>0<h>>>0){ya(j,h-a|0);h=H[j+12>>2];break C}if(a>>>0<=h>>>0){break C}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break z}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break z}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;D:{E:{F:{G:{t=p&3;switch(t|0){case 0:break E;case 3:break G;default:break F}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break z}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break D}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break A}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0<h>>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;H:{if(b>>>0<=131071){ya(a,32768-(b>>>2|0)|0);break H}if((b|0)==131072){break H}H[j+20>>2]=d+131072}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;I:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break I}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break A}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>32768){break A}J:{if(a>>>0>=d>>>0){break J}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break J}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==32768}d=k}K:{if(!d|(H[g+20>>2]?0:m)){break K}d=0;j=ca-16|0;ca=j;L:{M:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break L}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break M}if(!gb(1,j+8|0,c)){break L}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[j+8>>2];k=H[j+12>>2]}i=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>i>>>0|b>>>0<k>>>0){break L}i=e+k|0;b=a+f|0;i=b>>>0<a>>>0?i+1|0:i;H[c+16>>2]=b;H[c+20>>2]=i;if((a|0)<=0){break L}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];N:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break N}O:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break L}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break N;case 1:if(a>>>0<3){break L}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break N;default:break O}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+131072;d=a>>>0<33423360}ca=j+16|0;if(!d){break K}if(!m){o=1;break K}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){P:{if(a>>>0>131071){break P}while(1){if((b|0)<=0){break P}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<131072){continue}break}}e=a&32767;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>15|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 10:m=a;j=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;n=g+8|0;a=J[c+38>>1];Q:{R:{if(!a){break R}S:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break R}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[n+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break S}if(!hb(1,n+12|0,c)){break R}f=H[c+16>>2];e=H[c+20>>2];h=H[n+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break R}b=H[n>>2];a=H[n+4>>2]-b>>2;T:{if(a>>>0<h>>>0){ya(n,h-a|0);h=H[n+12>>2];break T}if(a>>>0<=h>>>0){break T}H[n+4>>2]=b+(h<<2)}d=1;if(!h){break Q}f=H[c+16>>2];e=H[c+20>>2];t=H[n>>2];r=H[c+8>>2];p=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(p|0)&f>>>0>=r>>>0|(e|0)>(p|0)){break Q}d=H[c>>2];s=I[d+f|0];f=f+1|0;i=f?e:e+1|0;H[c+16>>2]=f;e=i;H[c+20>>2]=e;a=s>>>2|0;l=0;U:{V:{W:{X:{i=s&3;switch(i|0){case 0:break V;case 3:break X;default:break W}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break Q}ra(t+(b<<2)|0,0,(s&252)+4|0);b=a;break U}while(1){if((f|0)==(r|0)&(e|0)==(p|0)){break R}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((i|0)!=(l|0)){continue}break}}H[t+(b<<2)>>2]=a}b=b+1|0;h=H[n+12>>2];if(b>>>0<h>>>0){continue}break}a=n+16|0;r=H[n>>2];d=H[n+16>>2];b=H[n+20>>2]-d|0;Y:{if(b>>>0<=262143){ya(a,65536-(b>>>2|0)|0);break Y}if((b|0)==262144){break Y}H[n+20>>2]=d+262144}d=n+28|0;b=H[d>>2];f=H[n+32>>2]-b>>3;Z:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break Z}if(f>>>0>h>>>0){H[n+32>>2]=(h<<3)+b}if(!h){break R}}i=H[a>>2];f=0;d=0;while(1){e=r+(f<<2)|0;l=H[e>>2];n=(f<<3)+b|0;a=d;H[n+4>>2]=a;H[n>>2]=l;e=H[e>>2];d=e+a|0;if(d>>>0>65536){break R}_:{if(a>>>0>=d>>>0){break _}l=0;n=e&7;if(n){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((n|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break _}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==65536}d=k}$:{if(!d|(H[g+20>>2]?0:m)){break $}d=0;i=ca-16|0;ca=i;aa:{ba:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break aa}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break ba}if(!gb(1,i+8|0,c)){break aa}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[i+8>>2];k=H[i+12>>2]}r=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>r>>>0|b>>>0<k>>>0){break aa}e=e+k|0;b=a+f|0;e=b>>>0<a>>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break aa}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];ca:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break ca}da:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break aa}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break ca;case 1:if(a>>>0<3){break aa}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break ca;default:break da}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+262144;d=a>>>0<66846720}ca=i+16|0;if(!d){break $}if(!m){o=1;break $}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){ea:{if(a>>>0>262143){break ea}while(1){if((b|0)<=0){break ea}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<262144){continue}break}}e=a&65535;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>16|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[j+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>
gitextract_eu8tak94/ ├── .gitignore ├── .npmrc ├── .prettierrc.js ├── CONTRIBUTING.md ├── LEGAL.md ├── LICENSE ├── README.en.md ├── README.md ├── common/ │ └── build/ │ ├── package.json │ ├── src/ │ │ ├── index.ts │ │ ├── plugins/ │ │ │ ├── appConfig.ts │ │ │ ├── compress.ts │ │ │ ├── index.ts │ │ │ └── visualizer.ts │ │ └── utils.ts │ └── tsconfig.json ├── package.json ├── packages/ │ ├── docs/ │ │ ├── .gitignore │ │ ├── .npmrc │ │ ├── package.json │ │ └── src/ │ │ ├── .vuepress/ │ │ │ ├── _bulletin.md │ │ │ ├── client.ts │ │ │ ├── config.ts │ │ │ ├── navbar.ts │ │ │ ├── notes.ts │ │ │ ├── plume.config.ts │ │ │ └── theme/ │ │ │ ├── components/ │ │ │ │ └── Custom.vue │ │ │ ├── shim.d.ts │ │ │ └── styles/ │ │ │ └── custom.css │ │ ├── README.md │ │ └── notes/ │ │ ├── cooperation/ │ │ │ └── README.md │ │ ├── guide/ │ │ │ ├── manual/ │ │ │ │ ├── editor/ │ │ │ │ │ ├── extras/ │ │ │ │ │ │ ├── 动画编辑器.md │ │ │ │ │ │ ├── 日志.md │ │ │ │ │ │ └── 资源中心.md │ │ │ │ │ ├── leftSidebar/ │ │ │ │ │ │ ├── BIM轻量化.md │ │ │ │ │ │ ├── CAD解析预览.md │ │ │ │ │ │ └── 场景树.md │ │ │ │ │ ├── rightSidebar/ │ │ │ │ │ │ ├── Html面板.md │ │ │ │ │ │ ├── 几何.md │ │ │ │ │ │ ├── 动画.md │ │ │ │ │ │ ├── 历史记录.md │ │ │ │ │ │ ├── 后期处理.md │ │ │ │ │ │ ├── 场景图纸.md │ │ │ │ │ │ ├── 场景配置.md │ │ │ │ │ │ ├── 天气.md │ │ │ │ │ │ ├── 对象.md │ │ │ │ │ │ ├── 广告牌.md │ │ │ │ │ │ ├── 材质.md │ │ │ │ │ │ ├── 渲染器配置.md │ │ │ │ │ │ ├── 粒子.md │ │ │ │ │ │ └── 脚本.md │ │ │ │ │ ├── viewport/ │ │ │ │ │ │ ├── 2D图纸.md │ │ │ │ │ │ └── 3D场景.md │ │ │ │ │ ├── 界面.md │ │ │ │ │ └── 顶栏.md │ │ │ │ ├── home/ │ │ │ │ │ ├── 数据中心.md │ │ │ │ │ ├── 设置中心.md │ │ │ │ │ ├── 资源中心.md │ │ │ │ │ └── 项目.md │ │ │ │ └── preview/ │ │ │ │ └── 界面.md │ │ │ ├── plugins/ │ │ │ │ ├── builtin/ │ │ │ │ │ └── glTFHandler.md │ │ │ │ ├── 入门.md │ │ │ │ └── 插件开发.md │ │ │ └── quick-start/ │ │ │ ├── 介绍.md │ │ │ ├── 安装.md │ │ │ ├── 部署.md │ │ │ └── 项目结构.md │ │ ├── more/ │ │ │ └── questions.md │ │ ├── promotion/ │ │ │ └── README.md │ │ └── sdk/ │ │ └── README.md │ ├── editor/ │ │ ├── .gitignore │ │ ├── .npmrc │ │ ├── components.d.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ ├── libs/ │ │ │ │ └── draco/ │ │ │ │ ├── draco_decoder.js │ │ │ │ ├── draco_decoder.wasm │ │ │ │ ├── draco_decoder_gltf.js │ │ │ │ ├── draco_decoder_gltf.wasm │ │ │ │ ├── draco_encoder.js │ │ │ │ ├── draco_encoder.wasm │ │ │ │ ├── draco_encoder_wrapper.js │ │ │ │ ├── draco_wasm_wrapper.js │ │ │ │ └── draco_wasm_wrapper_gltf.js │ │ │ ├── robots.txt │ │ │ ├── static/ │ │ │ │ ├── model/ │ │ │ │ │ ├── animal/ │ │ │ │ │ │ └── Rat_astral3d.optimize.glb │ │ │ │ │ ├── building/ │ │ │ │ │ │ └── Stall_astral3d.optimize.glb │ │ │ │ │ ├── furniture/ │ │ │ │ │ │ ├── Sofa_astral3d.optimize.glb │ │ │ │ │ │ └── WoodenStool_astral3d.optimize.glb │ │ │ │ │ ├── mehicle/ │ │ │ │ │ │ └── Drill_astral3d.optimize.glb │ │ │ │ │ ├── other/ │ │ │ │ │ │ └── Baseball_astral3d.optimize.glb │ │ │ │ │ ├── outdoor/ │ │ │ │ │ │ └── WoodenDiningTable_astral3d.optimize.glb │ │ │ │ │ ├── person/ │ │ │ │ │ │ └── Jackie.glb │ │ │ │ │ ├── plant/ │ │ │ │ │ │ ├── DragonSpruce_astral3d.optimize.glb │ │ │ │ │ │ ├── Grass_astral3d.optimize.glb │ │ │ │ │ │ ├── Lemon_astral3d.optimize.glb │ │ │ │ │ │ ├── MapleTree_astral3d.optimize.glb │ │ │ │ │ │ ├── SmallFlower_astral3d.optimize.glb │ │ │ │ │ │ └── SmallTree_astral3d.optimize.glb │ │ │ │ │ └── vehicle/ │ │ │ │ │ └── CoveredCar_astral3d.optimize.glb │ │ │ │ └── resource/ │ │ │ │ ├── hdr/ │ │ │ │ │ └── cloudy.hdr │ │ │ │ ├── htmlPanel/ │ │ │ │ │ └── technology/ │ │ │ │ │ └── factoryEquipment.html │ │ │ │ └── material/ │ │ │ │ └── wallBrick/ │ │ │ │ ├── red_brick/ │ │ │ │ │ └── red_brick_nor_gl_1k.exr │ │ │ │ ├── red_sandstone/ │ │ │ │ │ └── red_sandstone_wall_diff_1k.exr │ │ │ │ └── rustic_stone_wall/ │ │ │ │ └── rustic_stone_wall_02_diff_1k.exr │ │ │ └── wasm/ │ │ │ └── Astral3DglTFHandler.wasm │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── assets/ │ │ │ │ ├── color/ │ │ │ │ │ ├── ChineseColors.json │ │ │ │ │ ├── all_in_one.json │ │ │ │ │ └── recommend.json │ │ │ │ └── less/ │ │ │ │ ├── common.less │ │ │ │ ├── index.less │ │ │ │ ├── reset.less │ │ │ │ └── viewport.cube.less │ │ │ ├── components/ │ │ │ │ ├── code/ │ │ │ │ │ ├── CodeEditor.vue │ │ │ │ │ ├── HtmlPanelCode.vue │ │ │ │ │ ├── JSONEditor.vue │ │ │ │ │ ├── SQLEditor.vue │ │ │ │ │ ├── Script.vue │ │ │ │ │ └── UserData.vue │ │ │ │ ├── drawing/ │ │ │ │ │ ├── Drawing.vue │ │ │ │ │ └── toolbar/ │ │ │ │ │ ├── CAD.vue │ │ │ │ │ ├── CadLayers.vue │ │ │ │ │ └── Image.vue │ │ │ │ ├── es/ │ │ │ │ │ ├── EsContextmenu.vue │ │ │ │ │ ├── EsCubeLoading.vue │ │ │ │ │ ├── EsDocument.vue │ │ │ │ │ ├── EsFormItemHelpLabel.vue │ │ │ │ │ ├── EsInput.vue │ │ │ │ │ ├── EsInputNumber.vue │ │ │ │ │ ├── EsKeyFrame.vue │ │ │ │ │ ├── EsParticleEasing.vue │ │ │ │ │ ├── EsPlugin.vue │ │ │ │ │ ├── EsPopTreeSelect.vue │ │ │ │ │ ├── EsTexture.vue │ │ │ │ │ ├── EsTip.vue │ │ │ │ │ └── plugin/ │ │ │ │ │ ├── EsPluginDialog.vue │ │ │ │ │ ├── EsPluginList.vue │ │ │ │ │ └── builtin/ │ │ │ │ │ ├── EarthGenerator.vue │ │ │ │ │ ├── GLTFHandler.vue │ │ │ │ │ ├── PointCloudReconstructor.vue │ │ │ │ │ ├── glTFHandler/ │ │ │ │ │ │ └── GLTFHandlerForm.vue │ │ │ │ │ └── pointCloudReconstructor/ │ │ │ │ │ └── ReconstructorForm.vue │ │ │ │ ├── header/ │ │ │ │ │ ├── Logo.vue │ │ │ │ │ ├── NavigationOperation.vue │ │ │ │ │ ├── RightOperation.vue │ │ │ │ │ ├── navigation/ │ │ │ │ │ │ ├── Clear.vue │ │ │ │ │ │ ├── Copy.vue │ │ │ │ │ │ ├── Delete.vue │ │ │ │ │ │ ├── Do.vue │ │ │ │ │ │ ├── Fullscreen.vue │ │ │ │ │ │ └── ImportExport.vue │ │ │ │ │ └── right/ │ │ │ │ │ ├── SaveToService.vue │ │ │ │ │ └── XR.vue │ │ │ │ ├── preview/ │ │ │ │ │ ├── AssetPreview.vue │ │ │ │ │ ├── CommonPreview.vue │ │ │ │ │ └── CommonPreview_backup.vue │ │ │ │ ├── project/ │ │ │ │ │ └── ProjectInfoForm.vue │ │ │ │ ├── setting/ │ │ │ │ │ ├── Setting.vue │ │ │ │ │ ├── common/ │ │ │ │ │ │ ├── Color.vue │ │ │ │ │ │ ├── Locale.vue │ │ │ │ │ │ ├── SettingCenter.vue │ │ │ │ │ │ └── Theme.vue │ │ │ │ │ └── components/ │ │ │ │ │ ├── PreviewSetting.vue │ │ │ │ │ ├── SettingTabs.vue │ │ │ │ │ ├── Shortcuts.vue │ │ │ │ │ └── SystemSetting.vue │ │ │ │ └── tree/ │ │ │ │ └── SceneTree.vue │ │ │ ├── config/ │ │ │ │ └── service.ts │ │ │ ├── core/ │ │ │ │ └── AssetPreview.ts │ │ │ ├── hooks/ │ │ │ │ ├── index.ts │ │ │ │ ├── useBoolean.ts │ │ │ │ ├── useLoading.ts │ │ │ │ └── useWebSocket.ts │ │ │ ├── http/ │ │ │ │ ├── api/ │ │ │ │ │ ├── assetsCategory.ts │ │ │ │ │ ├── assetsInfo.ts │ │ │ │ │ ├── bim.ts │ │ │ │ │ ├── cad.ts │ │ │ │ │ ├── sceneExample.ts │ │ │ │ │ ├── scenes.ts │ │ │ │ │ └── sys.ts │ │ │ │ └── request/ │ │ │ │ ├── ConcurrencyManager.ts │ │ │ │ ├── index.ts │ │ │ │ ├── instance.ts │ │ │ │ └── request.ts │ │ │ ├── language/ │ │ │ │ ├── index.ts │ │ │ │ └── zh-CN-en-US.ts │ │ │ ├── main.ts │ │ │ ├── plugin/ │ │ │ │ ├── glTFHandler/ │ │ │ │ │ ├── Listr.ts │ │ │ │ │ ├── glTFHandler.ts │ │ │ │ │ ├── optimizePng.ts │ │ │ │ │ ├── session.ts │ │ │ │ │ └── util.ts │ │ │ │ ├── index.ts │ │ │ │ └── pointCloudReconstructor/ │ │ │ │ └── PointCloudReconstructor.ts │ │ │ ├── router/ │ │ │ │ ├── index.ts │ │ │ │ └── routes.ts │ │ │ ├── store/ │ │ │ │ ├── index.ts │ │ │ │ └── modules/ │ │ │ │ ├── animation.ts │ │ │ │ ├── assets.ts │ │ │ │ ├── drag.ts │ │ │ │ ├── globalConfig.ts │ │ │ │ ├── plugin.ts │ │ │ │ ├── previewOperation.ts │ │ │ │ └── websocket.ts │ │ │ ├── utils/ │ │ │ │ ├── common/ │ │ │ │ │ ├── base64.ts │ │ │ │ │ ├── color.ts │ │ │ │ │ ├── constant.ts │ │ │ │ │ ├── dateTime.ts │ │ │ │ │ ├── file.ts │ │ │ │ │ ├── init.ts │ │ │ │ │ ├── render.ts │ │ │ │ │ ├── scenes.ts │ │ │ │ │ ├── utils.ts │ │ │ │ │ └── verify.ts │ │ │ │ ├── drawing/ │ │ │ │ │ └── drawRect.ts │ │ │ │ ├── preview/ │ │ │ │ │ └── menuOperation.ts │ │ │ │ ├── service/ │ │ │ │ │ ├── error.ts │ │ │ │ │ ├── fetchController.ts │ │ │ │ │ ├── handler.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── msg.ts │ │ │ │ ├── signals/ │ │ │ │ │ └── signalRegister.ts │ │ │ │ └── storage/ │ │ │ │ └── config.ts │ │ │ └── views/ │ │ │ ├── editor/ │ │ │ │ ├── components/ │ │ │ │ │ └── extraPane/ │ │ │ │ │ ├── ExtraPane.vue │ │ │ │ │ ├── animation/ │ │ │ │ │ │ ├── Animation.vue │ │ │ │ │ │ ├── AnimationList.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── log/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ └── resource/ │ │ │ │ │ ├── builtin/ │ │ │ │ │ │ ├── Billboard.vue │ │ │ │ │ │ ├── Cameras.vue │ │ │ │ │ │ ├── HtmlPanel.vue │ │ │ │ │ │ ├── Lights.vue │ │ │ │ │ │ ├── Materials.vue │ │ │ │ │ │ ├── Models.vue │ │ │ │ │ │ ├── Particles.vue │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── ModelCard.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── index.vue │ │ │ │ │ └── public/ │ │ │ │ │ ├── AssetsList.vue │ │ │ │ │ └── index.vue │ │ │ │ ├── index.vue │ │ │ │ └── layouts/ │ │ │ │ ├── Assets.vue │ │ │ │ ├── Footer.vue │ │ │ │ ├── Header.vue │ │ │ │ ├── Scene.vue │ │ │ │ ├── Sidebar.vue │ │ │ │ ├── assets/ │ │ │ │ │ ├── CadLibrary.vue │ │ │ │ │ └── cadLibrary/ │ │ │ │ │ └── CadUploadDialog.vue │ │ │ │ ├── index.ts │ │ │ │ ├── sidebar/ │ │ │ │ │ ├── SidebarAnimations.vue │ │ │ │ │ ├── SidebarBillboard.vue │ │ │ │ │ ├── SidebarDrawing.vue │ │ │ │ │ ├── SidebarEffect.vue │ │ │ │ │ ├── SidebarGeometry.vue │ │ │ │ │ ├── SidebarHistory.vue │ │ │ │ │ ├── SidebarHtmlPanel.vue │ │ │ │ │ ├── SidebarMaterial.vue │ │ │ │ │ ├── SidebarObject.vue │ │ │ │ │ ├── SidebarParticle.vue │ │ │ │ │ ├── SidebarRenderer.vue │ │ │ │ │ ├── SidebarScene.vue │ │ │ │ │ ├── SidebarScript.vue │ │ │ │ │ ├── SidebarWeather.vue │ │ │ │ │ ├── billboard/ │ │ │ │ │ │ ├── Sidebar.Billboard.Image.vue │ │ │ │ │ │ └── Sidebar.Billboard.Text.vue │ │ │ │ │ ├── effect/ │ │ │ │ │ │ ├── Sidebar.Effect.Afterimage.vue │ │ │ │ │ │ ├── Sidebar.Effect.Bokeh.vue │ │ │ │ │ │ ├── Sidebar.Effect.FXAA.vue │ │ │ │ │ │ ├── Sidebar.Effect.Halftone.vue │ │ │ │ │ │ ├── Sidebar.Effect.LUT.vue │ │ │ │ │ │ ├── Sidebar.Effect.Outline.vue │ │ │ │ │ │ ├── Sidebar.Effect.Pixelate.vue │ │ │ │ │ │ └── Sidebar.Effect.UnrealBloom.vue │ │ │ │ │ ├── geometry/ │ │ │ │ │ │ ├── Sidebar.Geometry.BoxGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.BufferGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.CapsuleGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.CircleGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.CylinderGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.DodecahedronGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.ExtrudeGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.IcosahedronGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.LatheGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.Modifiers.vue │ │ │ │ │ │ ├── Sidebar.Geometry.OctahedronGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.PlaneGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.RingGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.ShapeGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.SphereGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.TeapotGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.TetrahedronGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.TorusGeometry.vue │ │ │ │ │ │ ├── Sidebar.Geometry.TorusKnotGeometry.vue │ │ │ │ │ │ └── Sidebar.Geometry.TubeGeometry.vue │ │ │ │ │ ├── material/ │ │ │ │ │ │ ├── SceneAllMaterials.vue │ │ │ │ │ │ ├── SidebarMaterialBooleanProperty.vue │ │ │ │ │ │ ├── SidebarMaterialColorProperty.vue │ │ │ │ │ │ ├── SidebarMaterialConstantProperty.vue │ │ │ │ │ │ ├── SidebarMaterialMapProperty.vue │ │ │ │ │ │ ├── SidebarMaterialNumberProperty.vue │ │ │ │ │ │ ├── SidebarMaterialProgram.vue │ │ │ │ │ │ └── SidebarMaterialRangeValueProperty.vue │ │ │ │ │ ├── particle/ │ │ │ │ │ │ ├── Sidebar.Particle.Attribute.vue │ │ │ │ │ │ ├── Sidebar.Particle.Behaviour.vue │ │ │ │ │ │ ├── Sidebar.Particle.Initializer.vue │ │ │ │ │ │ └── initializer/ │ │ │ │ │ │ ├── Sidebar.Particle.Initializer.Body.vue │ │ │ │ │ │ ├── Sidebar.Particle.Initializer.Velocity.vue │ │ │ │ │ │ └── Sidebar.Particle.Initializer.Zones.vue │ │ │ │ │ ├── renderer/ │ │ │ │ │ │ └── Sidebar.Renderer.CSM.vue │ │ │ │ │ ├── scene/ │ │ │ │ │ │ ├── Sidebar.Scene.ProjectSetting.vue │ │ │ │ │ │ └── Sidebar.Scene.Setting.vue │ │ │ │ │ └── weather/ │ │ │ │ │ ├── Sidebar.Weather.Fog.vue │ │ │ │ │ ├── Sidebar.Weather.Rain.vue │ │ │ │ │ └── Sidebar.Weather.Snow.vue │ │ │ │ └── viewport/ │ │ │ │ ├── BIMProperties.vue │ │ │ │ ├── IFCProperties.vue │ │ │ │ ├── Toolbar.vue │ │ │ │ ├── Viewport.vue │ │ │ │ ├── ViewportCamera.vue │ │ │ │ ├── ViewportInfo.vue │ │ │ │ └── ViewportShading.vue │ │ │ ├── home/ │ │ │ │ ├── assetsCenter/ │ │ │ │ │ ├── AssetsList.vue │ │ │ │ │ ├── UploadAsset.vue │ │ │ │ │ └── components/ │ │ │ │ │ ├── AssetDetail.vue │ │ │ │ │ └── CardAction.vue │ │ │ │ ├── components/ │ │ │ │ │ ├── HeaderCarousel.vue │ │ │ │ │ ├── SidebarBottomInfo.vue │ │ │ │ │ └── SidebarTopInfo.vue │ │ │ │ ├── container/ │ │ │ │ │ ├── AssetsCenter.vue │ │ │ │ │ ├── DataCenter.vue │ │ │ │ │ ├── Project.vue │ │ │ │ │ └── SettingCenter.vue │ │ │ │ ├── index.vue │ │ │ │ └── project/ │ │ │ │ ├── MyProject.vue │ │ │ │ ├── SharedProject.vue │ │ │ │ └── components/ │ │ │ │ ├── CardAction.vue │ │ │ │ ├── CreateProject.vue │ │ │ │ └── ProjectDetail.vue │ │ │ ├── index.vue │ │ │ └── preview/ │ │ │ ├── components/ │ │ │ │ ├── OperationItem.vue │ │ │ │ ├── Operations.vue │ │ │ │ ├── PreviewSceneTree.vue │ │ │ │ └── operationConfigModal/ │ │ │ │ ├── AutoRotate.vue │ │ │ │ ├── ModelExplode.vue │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ ├── tsconfig.json │ │ ├── types/ │ │ │ ├── assets.d.ts │ │ │ ├── billboard.d.ts │ │ │ ├── bim.d.ts │ │ │ ├── config.d.ts │ │ │ ├── data-source.d.ts │ │ │ ├── drawing.d.ts │ │ │ ├── env.d.ts │ │ │ ├── ignore.d.ts │ │ │ ├── naive-ui.d.ts │ │ │ ├── network.d.ts │ │ │ ├── particle.d.ts │ │ │ ├── plugin.d.ts │ │ │ ├── scene.d.ts │ │ │ ├── script.d.ts │ │ │ ├── three.d.ts │ │ │ └── window.d.ts │ │ ├── uno.config.ts │ │ └── vite.config.ts │ └── sdk/ │ ├── .gitignore │ ├── index.html │ ├── lib/ │ │ ├── constant/ │ │ │ ├── enum.ts │ │ │ ├── index.ts │ │ │ └── type.ts │ │ ├── core/ │ │ │ ├── animation/ │ │ │ │ ├── AnimationManager.ts │ │ │ │ └── TimelineTrack.ts │ │ │ ├── app/ │ │ │ │ ├── App.ts │ │ │ │ └── modules/ │ │ │ │ ├── CSM.ts │ │ │ │ ├── Config.ts │ │ │ │ ├── History.ts │ │ │ │ ├── Project.ts │ │ │ │ ├── Resource.ts │ │ │ │ ├── Selector.ts │ │ │ │ ├── Storage.ts │ │ │ │ └── index.ts │ │ │ ├── built-in/ │ │ │ │ └── assets/ │ │ │ │ ├── BasicObject3D.ts │ │ │ │ └── Particles.ts │ │ │ ├── commands/ │ │ │ │ ├── AddObjectCommand.ts │ │ │ │ ├── AddScriptCommand.ts │ │ │ │ ├── Command.ts │ │ │ │ ├── Commands.ts │ │ │ │ ├── MoveObjectCommand.ts │ │ │ │ ├── RemoveObjectCommand.ts │ │ │ │ ├── RemoveScriptCommand.ts │ │ │ │ ├── SetColorCommand.ts │ │ │ │ ├── SetGeometryCommand.ts │ │ │ │ ├── SetGeometryValueCommand.ts │ │ │ │ ├── SetMaterialColorCommand.ts │ │ │ │ ├── SetMaterialCommand.ts │ │ │ │ ├── SetMaterialMapCommand.ts │ │ │ │ ├── SetMaterialRangeCommand.ts │ │ │ │ ├── SetMaterialValueCommand.ts │ │ │ │ ├── SetMaterialVectorCommand.ts │ │ │ │ ├── SetPositionCommand.ts │ │ │ │ ├── SetRotationCommand.ts │ │ │ │ ├── SetScaleCommand.ts │ │ │ │ ├── SetSceneCommand.ts │ │ │ │ ├── SetScriptValueCommand.ts │ │ │ │ ├── SetUuidCommand.ts │ │ │ │ └── SetValueCommand.ts │ │ │ ├── controls/ │ │ │ │ └── DragControls.js │ │ │ ├── expansion/ │ │ │ │ ├── Material.ts │ │ │ │ ├── Object3D.ts │ │ │ │ └── index.ts │ │ │ ├── geometries/ │ │ │ │ ├── TeapotGeometry.ts │ │ │ │ └── index.ts │ │ │ ├── libs/ │ │ │ │ ├── astral-timeline/ │ │ │ │ │ ├── animation-timeline.ts │ │ │ │ │ ├── enums/ │ │ │ │ │ │ ├── timelineCapShape.ts │ │ │ │ │ │ ├── timelineCursorType.ts │ │ │ │ │ │ ├── timelineElementType.ts │ │ │ │ │ │ ├── timelineEventSource.ts │ │ │ │ │ │ ├── timelineEvents.ts │ │ │ │ │ │ ├── timelineInteractionMode.ts │ │ │ │ │ │ ├── timelineKeyframeShape.ts │ │ │ │ │ │ ├── timelineScrollSource.ts │ │ │ │ │ │ ├── timelineSelectionEventSource.ts │ │ │ │ │ │ └── timelineSelectionMode.ts │ │ │ │ │ ├── models/ │ │ │ │ │ │ ├── timelineGroup.ts │ │ │ │ │ │ ├── timelineKeyframe.ts │ │ │ │ │ │ ├── timelineModel.ts │ │ │ │ │ │ ├── timelineRanged.ts │ │ │ │ │ │ └── timelineRow.ts │ │ │ │ │ ├── settings/ │ │ │ │ │ │ ├── defaults/ │ │ │ │ │ │ │ ├── defaultGroupStyle.ts │ │ │ │ │ │ │ ├── defaultTimelineConsts.ts │ │ │ │ │ │ │ ├── defaultTimelineKeyframeStyle.ts │ │ │ │ │ │ │ ├── defaultTimelineOptions.ts │ │ │ │ │ │ │ ├── defaultTimelineRowStyle.ts │ │ │ │ │ │ │ └── defaultTimelineStyle.ts │ │ │ │ │ │ ├── styles/ │ │ │ │ │ │ │ ├── timelineCapStyle.ts │ │ │ │ │ │ │ ├── timelineGroupStyle.ts │ │ │ │ │ │ │ ├── timelineKeyframeStyle.ts │ │ │ │ │ │ │ ├── timelineRowStyle.ts │ │ │ │ │ │ │ └── timelineStyle.ts │ │ │ │ │ │ ├── timelineConsts.ts │ │ │ │ │ │ └── timelineOptions.ts │ │ │ │ │ ├── timeline.ts │ │ │ │ │ ├── timelineEventsEmitter.ts │ │ │ │ │ ├── utils/ │ │ │ │ │ │ ├── events/ │ │ │ │ │ │ │ ├── timelineBaseEvent.ts │ │ │ │ │ │ │ ├── timelineClickEvent.ts │ │ │ │ │ │ │ ├── timelineDragEvent.ts │ │ │ │ │ │ │ ├── timelineKeyframeChangedEvent.ts │ │ │ │ │ │ │ ├── timelineScrollEvent.ts │ │ │ │ │ │ │ ├── timelineSelectedEvent.ts │ │ │ │ │ │ │ └── timelineTimeChangedEvent.ts │ │ │ │ │ │ ├── timelineCutBoundsRectResults.ts │ │ │ │ │ │ ├── timelineDraggableData.ts │ │ │ │ │ │ ├── timelineElement.ts │ │ │ │ │ │ ├── timelineElementDragState.ts │ │ │ │ │ │ ├── timelineMouseData.ts │ │ │ │ │ │ ├── timelinePoint.ts │ │ │ │ │ │ ├── timelineSelectable.ts │ │ │ │ │ │ ├── timelineSelectionResults.ts │ │ │ │ │ │ ├── timelineStyleUtils.ts │ │ │ │ │ │ └── timelineUtils.ts │ │ │ │ │ └── viewModels/ │ │ │ │ │ ├── timelineGroupViewModel.ts │ │ │ │ │ ├── timelineKeyframeViewModel.ts │ │ │ │ │ ├── timelineRowViewModel.ts │ │ │ │ │ └── timelineViewModel.ts │ │ │ │ └── three-nebula/ │ │ │ │ ├── behaviour/ │ │ │ │ │ ├── Alpha.js │ │ │ │ │ ├── Attraction.js │ │ │ │ │ ├── Behaviour.js │ │ │ │ │ ├── Collision.js │ │ │ │ │ ├── Color.js │ │ │ │ │ ├── CrossZone.js │ │ │ │ │ ├── Force.js │ │ │ │ │ ├── Gravity.js │ │ │ │ │ ├── RandomDrift.js │ │ │ │ │ ├── Repulsion.js │ │ │ │ │ ├── Rotate.js │ │ │ │ │ ├── Scale.js │ │ │ │ │ ├── Spring.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── types.js │ │ │ │ ├── constants/ │ │ │ │ │ └── index.js │ │ │ │ ├── core/ │ │ │ │ │ ├── Particle.js │ │ │ │ │ ├── Pool.js │ │ │ │ │ ├── System.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── fromJSON.js │ │ │ │ │ ├── fromJSONAsync.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── three/ │ │ │ │ │ │ ├── Euler.js │ │ │ │ │ │ ├── Math.js │ │ │ │ │ │ ├── Matrix4.js │ │ │ │ │ │ ├── Quaternion.js │ │ │ │ │ │ ├── Vector3.js │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ └── index.js │ │ │ │ │ └── types.js │ │ │ │ ├── debug/ │ │ │ │ │ ├── Debug.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── log.js │ │ │ │ ├── ease/ │ │ │ │ │ └── index.js │ │ │ │ ├── emitter/ │ │ │ │ │ ├── Emitter.js │ │ │ │ │ ├── FollowEmitter.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── types.js │ │ │ │ ├── events/ │ │ │ │ │ ├── EventDispatcher.js │ │ │ │ │ ├── constants.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ ├── initializer/ │ │ │ │ │ ├── Body.js │ │ │ │ │ ├── BodySprite.js │ │ │ │ │ ├── Initializer.js │ │ │ │ │ ├── InitializerUtil.js │ │ │ │ │ ├── Life.js │ │ │ │ │ ├── Mass.js │ │ │ │ │ ├── Position.js │ │ │ │ │ ├── Radius.js │ │ │ │ │ ├── Rate.js │ │ │ │ │ ├── Rotation.js │ │ │ │ │ ├── Texture.js │ │ │ │ │ ├── Velocity/ │ │ │ │ │ │ ├── PolarVelocity.js │ │ │ │ │ │ ├── RadialVelocity.js │ │ │ │ │ │ ├── VectorVelocity.js │ │ │ │ │ │ ├── Velocity.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── types.js │ │ │ │ ├── math/ │ │ │ │ │ ├── ArraySpan.js │ │ │ │ │ ├── Box.js │ │ │ │ │ ├── ColorSpan.js │ │ │ │ │ ├── MathUtils.js │ │ │ │ │ ├── Polar3D.js │ │ │ │ │ ├── Span.js │ │ │ │ │ ├── Vector3D.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── integration.js │ │ │ │ │ └── types.js │ │ │ │ ├── renderer/ │ │ │ │ │ ├── BaseRenderer.js │ │ │ │ │ ├── CustomRenderer.js │ │ │ │ │ ├── GPURenderer/ │ │ │ │ │ │ ├── Desktop/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── shaders/ │ │ │ │ │ │ │ ├── fragmentShader.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── vertexShader.js │ │ │ │ │ │ ├── Mobile/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── shaders/ │ │ │ │ │ │ │ ├── fragmentShader.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── vertexShader.js │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ ├── ParticleBuffer/ │ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── TextureAtlas/ │ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── shaders/ │ │ │ │ │ │ │ │ └── constants.js │ │ │ │ │ │ │ └── stores/ │ │ │ │ │ │ │ ├── Target.js │ │ │ │ │ │ │ ├── UniqueList.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── MeshRenderer.js │ │ │ │ │ ├── SpriteRenderer.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── types.js │ │ │ │ ├── utils/ │ │ │ │ │ ├── ColorUtil.js │ │ │ │ │ ├── PUID.js │ │ │ │ │ ├── THREEUtil.js │ │ │ │ │ ├── Util.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── isNumber.js │ │ │ │ │ ├── potpack.js │ │ │ │ │ ├── sample.js │ │ │ │ │ └── uid.js │ │ │ │ └── zone/ │ │ │ │ ├── BoxZone.js │ │ │ │ ├── LineZone.js │ │ │ │ ├── MeshZone.js │ │ │ │ ├── PointZone.js │ │ │ │ ├── ScreenZone.js │ │ │ │ ├── SphereZone.js │ │ │ │ ├── Zone.js │ │ │ │ ├── index.js │ │ │ │ └── types.js │ │ │ ├── loader/ │ │ │ │ ├── Loader.ts │ │ │ │ ├── ObjectLoader.js │ │ │ │ ├── Package.Skeleton.ts │ │ │ │ └── Package.ts │ │ │ ├── objects/ │ │ │ │ ├── Billboard.ts │ │ │ │ ├── HtmlPanel.ts │ │ │ │ ├── LineMesh.ts │ │ │ │ ├── ParticleEmitter.ts │ │ │ │ ├── index.ts │ │ │ │ ├── texture/ │ │ │ │ │ └── BillboardTexture.ts │ │ │ │ └── weather/ │ │ │ │ ├── Rain.ts │ │ │ │ └── Snow.ts │ │ │ ├── plugin/ │ │ │ │ ├── builtin/ │ │ │ │ │ └── builtin.ts │ │ │ │ ├── plugin.ts │ │ │ │ └── pluginLoader.ts │ │ │ ├── points/ │ │ │ │ ├── PointCloudReconstructor.ts │ │ │ │ └── index.ts │ │ │ ├── preview/ │ │ │ │ ├── Preview.ts │ │ │ │ └── PreviewOptions.ts │ │ │ ├── script/ │ │ │ │ ├── Animation.ts │ │ │ │ ├── Helper.ts │ │ │ │ ├── Source.ts │ │ │ │ └── index.ts │ │ │ ├── shaderMaterial/ │ │ │ │ ├── ShaderMaterialManager.ts │ │ │ │ └── modules/ │ │ │ │ ├── CircleGridShaderMaterial.ts │ │ │ │ ├── DynamicCheckerboardShaderMaterial.ts │ │ │ │ ├── FlickerShaderMaterial.ts │ │ │ │ ├── SlowSmokeShaderMaterial.ts │ │ │ │ ├── SnowingShaderMaterial.ts │ │ │ │ ├── StreamerWallShaderMaterial.ts │ │ │ │ └── index.ts │ │ │ ├── tools/ │ │ │ │ ├── ClippedEdgesBox.ts │ │ │ │ ├── Export.ts │ │ │ │ ├── Measure.ts │ │ │ │ ├── MiniMap-20240823.ts │ │ │ │ ├── MiniMap.ts │ │ │ │ ├── ModelExplode.ts │ │ │ │ ├── Roaming.ts │ │ │ │ ├── RoamingStatus.ts │ │ │ │ └── index.ts │ │ │ └── viewer/ │ │ │ ├── Viewer.ts │ │ │ ├── ViewerOptions.ts │ │ │ ├── ViewerPathTracer.ts │ │ │ └── modules/ │ │ │ ├── CameraManage.ts │ │ │ ├── Drag.ts │ │ │ ├── Effect.ts │ │ │ ├── Helper.ts │ │ │ ├── ParticleSystem.ts │ │ │ ├── Signals.ts │ │ │ ├── Weather.ts │ │ │ └── index.ts │ │ ├── dxf/ │ │ │ ├── DragControls.js │ │ │ ├── bspline.ts │ │ │ ├── drawRect.ts │ │ │ ├── drawShare.ts │ │ │ ├── drawUtils.ts │ │ │ ├── index.ts │ │ │ ├── offScreenCanvas.worker.ts │ │ │ ├── parser/ │ │ │ │ ├── AutoCadColorIndex.ts │ │ │ │ ├── DimStyleCodes.ts │ │ │ │ ├── DxfArrayScanner.ts │ │ │ │ ├── DxfParser.ts │ │ │ │ ├── ExtendedDataParser.ts │ │ │ │ ├── ParseHelpers.ts │ │ │ │ ├── entities/ │ │ │ │ │ ├── 3dface.ts │ │ │ │ │ ├── arc.ts │ │ │ │ │ ├── attdef.ts │ │ │ │ │ ├── attribute.ts │ │ │ │ │ ├── circle.ts │ │ │ │ │ ├── dimension.ts │ │ │ │ │ ├── ellipse.ts │ │ │ │ │ ├── geomtry.ts │ │ │ │ │ ├── hatch.ts │ │ │ │ │ ├── insert.ts │ │ │ │ │ ├── line.ts │ │ │ │ │ ├── lwpolyline.ts │ │ │ │ │ ├── mtext.ts │ │ │ │ │ ├── point.ts │ │ │ │ │ ├── polyline.ts │ │ │ │ │ ├── solid.ts │ │ │ │ │ ├── spline.ts │ │ │ │ │ ├── text.ts │ │ │ │ │ └── vertex.ts │ │ │ │ └── index.ts │ │ │ ├── pickHelper.ts │ │ │ ├── round10.ts │ │ │ ├── troika-three-text.esm.js │ │ │ ├── troika-three-utils.esm.js │ │ │ └── troika-worker-utils.esm.js │ │ ├── hooks/ │ │ │ ├── index.ts │ │ │ └── useSignal.ts │ │ ├── index.ts │ │ ├── utils/ │ │ │ ├── common/ │ │ │ │ ├── dom.ts │ │ │ │ ├── download.ts │ │ │ │ ├── helper.ts │ │ │ │ ├── index.ts │ │ │ │ ├── object.ts │ │ │ │ ├── performance.ts │ │ │ │ └── verify.ts │ │ │ ├── index.ts │ │ │ ├── log/ │ │ │ │ └── Logger.ts │ │ │ ├── request/ │ │ │ │ ├── fetchController.ts │ │ │ │ └── index.ts │ │ │ ├── scene/ │ │ │ │ ├── Stats.ts │ │ │ │ ├── controls.ts │ │ │ │ ├── index.ts │ │ │ │ └── material.ts │ │ │ ├── signals/ │ │ │ │ └── signalRegister.ts │ │ │ └── wasm/ │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ ├── wasm_exec.js │ │ │ └── zip.ts │ │ └── workers/ │ │ ├── bvh/ │ │ │ ├── GenerateColliderEnvironmentWorker.js │ │ │ ├── GenerateMeshBVHWorker.js │ │ │ ├── generateAsync.worker.js │ │ │ └── generateColliderEnvironment.worker.js │ │ └── mergeGeometries.worker.ts │ ├── package.json │ ├── public/ │ │ ├── libs/ │ │ │ ├── basis/ │ │ │ │ ├── README.md │ │ │ │ ├── basis_transcoder.js │ │ │ │ └── basis_transcoder.wasm │ │ │ ├── draco/ │ │ │ │ ├── draco_decoder.js │ │ │ │ ├── draco_decoder.wasm │ │ │ │ ├── draco_decoder_gltf.js │ │ │ │ ├── draco_decoder_gltf.wasm │ │ │ │ ├── draco_encoder.js │ │ │ │ ├── draco_encoder.wasm │ │ │ │ ├── draco_encoder_wrapper.js │ │ │ │ ├── draco_wasm_wrapper.js │ │ │ │ ├── draco_wasm_wrapper_gltf.js │ │ │ │ └── gltf/ │ │ │ │ ├── draco_decoder.js │ │ │ │ ├── draco_decoder.wasm │ │ │ │ ├── draco_encoder.js │ │ │ │ └── draco_wasm_wrapper.js │ │ │ └── web-ifc/ │ │ │ ├── IFCWorker.js │ │ │ ├── web-ifc-mt.wasm │ │ │ └── web-ifc.wasm │ │ ├── resource/ │ │ │ ├── luts/ │ │ │ │ ├── Bourbon 64.CUBE │ │ │ │ ├── Chemical 168.CUBE │ │ │ │ ├── Clayton 33.CUBE │ │ │ │ ├── Cubicle 99.CUBE │ │ │ │ ├── Presetpro-Cinematic.3dl │ │ │ │ └── Remy 24.CUBE │ │ │ └── model/ │ │ │ ├── Jackie.glb │ │ │ ├── Workman.glb │ │ │ ├── X_Bot.glb │ │ │ └── Y_Bot.glb │ │ └── static/ │ │ └── wasm/ │ │ └── Astral3DEngine.wasm │ ├── tsconfig.json │ ├── types/ │ │ ├── Scene.d.ts │ │ ├── Script.d.ts │ │ ├── Three.d.ts │ │ ├── app/ │ │ │ ├── Config.d.ts │ │ │ └── Project.d.ts │ │ ├── astral-zip.d.ts │ │ ├── core/ │ │ │ ├── Cad.d.ts │ │ │ └── Plugin.d.ts │ │ ├── global.d.ts │ │ ├── objects/ │ │ │ ├── Billboard.d.ts │ │ │ └── Particle.d.ts │ │ ├── setting/ │ │ │ ├── PreviewSetting.d.ts │ │ │ └── ViewerSetting.d.ts │ │ └── vite-env.d.ts │ └── vite.config.ts └── pnpm-workspace.yaml
Showing preview only (1,422K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (11079 symbols across 366 files)
FILE: common/build/src/plugins/appConfig.ts
function createConfigPluginConfig (line 6) | async function createConfigPluginConfig(
FILE: common/build/src/plugins/compress.ts
function configCompressPlugin (line 9) | function configCompressPlugin({compress,deleteOriginFile = false}: {
FILE: common/build/src/plugins/index.ts
type Options (line 9) | interface Options {
function createPlugins (line 20) | async function createPlugins({isBuild,compress,enableAnalyze,enableConfi...
FILE: common/build/src/plugins/visualizer.ts
function configVisualizerConfig (line 8) | function configVisualizerConfig() {
FILE: common/build/src/utils.ts
function wrapperEnv (line 8) | function wrapperEnv(envConf) {
function getConfFiles (line 32) | function getConfFiles() {
function getEnvConfig (line 48) | async function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFil...
function strToHex (line 68) | function strToHex(str: string) {
FILE: packages/docs/src/.vuepress/client.ts
method enhance (line 12) | enhance({ app }) {
FILE: packages/editor/components.d.ts
type GlobalComponents (line 9) | interface GlobalComponents {
FILE: packages/editor/public/libs/draco/draco_decoder.js
function isVersionSupported (line 8) | function isVersionSupported(versionString){if(typeof versionString!=="st...
function locateFile (line 8) | function locateFile(path){if(Module["locateFile"]){return Module["locate...
function logExceptionOnExit (line 8) | function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toL...
function c (line 10) | function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return th...
function l (line 10) | function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-...
function p (line 10) | function p(q){l(e,1028,"YAQAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAA...
function v (line 10) | function v(){throw new Error("abort")}
function w (line 10) | function w(x){t[2]=x}
function y (line 10) | function y(z){return s[z]}
function A (line 10) | function A(z,x){s[z]=x}
function B (line 10) | function B(){return t[2]}
function ma (line 10) | function ma(q){var C=q.a;var D=C.a;var E=D.buffer;D.grow=ka;var F=new In...
function assert (line 22) | function assert(condition,text){if(!condition){abort(text)}}
function UTF8ArrayToString (line 22) | function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=id...
function UTF8ToString (line 22) | function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(H...
function stringToUTF8Array (line 22) | function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxByte...
function lengthBytesUTF8 (line 22) | function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){va...
function updateMemoryViews (line 22) | function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEA...
function keepRuntimeAlive (line 22) | function keepRuntimeAlive(){return noExitRuntime}
function preRun (line 22) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
function initRuntime (line 22) | function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__AT...
function postRun (line 22) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
function addOnPreRun (line 22) | function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}
function addOnInit (line 22) | function addOnInit(cb){__ATINIT__.unshift(cb)}
function addOnPostRun (line 22) | function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}
function addRunDependency (line 22) | function addRunDependency(id){runDependencies++;if(Module["monitorRunDep...
function removeRunDependency (line 22) | function removeRunDependency(id){runDependencies--;if(Module["monitorRun...
function abort (line 22) | function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what=...
function isDataURI (line 22) | function isDataURI(filename){return filename.startsWith(dataURIPrefix)}
function isFileURI (line 22) | function isFileURI(filename){return filename.startsWith("file://")}
function getBinary (line 22) | function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return...
function getBinaryPromise (line 22) | function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRON...
function createWasm (line 22) | function createWasm(){var info={"a":wasmImports};function receiveInstanc...
function ExitStatus (line 22) | function ExitStatus(status){this.name="ExitStatus";this.message="Program...
function callRuntimeCallbacks (line 22) | function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callb...
function intArrayToString (line 22) | function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i...
function ExceptionInfo (line 22) | function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;thi...
function ___cxa_throw (line 22) | function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(pt...
function _abort (line 22) | function _abort(){abort("")}
function _emscripten_memcpy_big (line 22) | function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src...
function getHeapMax (line 22) | function getHeapMax(){return 2147483648}
function emscripten_realloc_buffer (line 22) | function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{was...
function _emscripten_resize_heap (line 22) | function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.lengt...
function _fd_close (line 22) | function _fd_close(fd){return 52}
function _fd_seek (line 22) | function _fd_seek(fd,offset_low,offset_high,whence,newOffset){return 70}
function printChar (line 22) | function printChar(stream,curr){var buffer=printCharBuffers[stream];if(c...
function _fd_write (line 22) | function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i<iovcnt;i+...
function intArrayFromString (line 22) | function intArrayFromString(stringy,dontAddNull,length){var len=length>0...
function intArrayFromBase64 (line 22) | function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE=="boolean"&...
function tryParseAsDataURI (line 22) | function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}ret...
function run (line 22) | function run(){if(runDependencies>0){return}preRun();if(runDependencies>...
function WrapperObject (line 22) | function WrapperObject(){}
function getCache (line 22) | function getCache(__class__){return(__class__||WrapperObject).__cache__}
function wrapPointer (line 22) | function wrapPointer(ptr,__class__){var cache=getCache(__class__);var re...
function castObject (line 22) | function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}
function destroy (line 22) | function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy...
function compare (line 22) | function compare(obj1,obj2){return obj1.ptr===obj2.ptr}
function getPointer (line 22) | function getPointer(obj){return obj.ptr}
function getClass (line 22) | function getClass(obj){return obj.__class__}
function ensureString (line 22) | function ensureString(value){if(typeof value==="string"){var intArray=in...
function ensureInt8 (line 22) | function ensureInt8(value){if(typeof value==="object"){var offset=ensure...
function VoidPtr (line 22) | function VoidPtr(){throw"cannot construct a VoidPtr, no constructor in I...
function DecoderBuffer (line 22) | function DecoderBuffer(){this.ptr=_emscripten_bind_DecoderBuffer_Decoder...
function AttributeTransformData (line 22) | function AttributeTransformData(){this.ptr=_emscripten_bind_AttributeTra...
function GeometryAttribute (line 22) | function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute...
function PointAttribute (line 22) | function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_Point...
function AttributeQuantizationTransform (line 22) | function AttributeQuantizationTransform(){this.ptr=_emscripten_bind_Attr...
function AttributeOctahedronTransform (line 22) | function AttributeOctahedronTransform(){this.ptr=_emscripten_bind_Attrib...
function PointCloud (line 22) | function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0(...
function Mesh (line 22) | function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[t...
function Metadata (line 22) | function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getC...
function Status (line 22) | function Status(){throw"cannot construct a Status, no constructor in IDL"}
function DracoFloat32Array (line 22) | function DracoFloat32Array(){this.ptr=_emscripten_bind_DracoFloat32Array...
function DracoInt8Array (line 22) | function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_Draco...
function DracoUInt8Array (line 22) | function DracoUInt8Array(){this.ptr=_emscripten_bind_DracoUInt8Array_Dra...
function DracoInt16Array (line 22) | function DracoInt16Array(){this.ptr=_emscripten_bind_DracoInt16Array_Dra...
function DracoUInt16Array (line 22) | function DracoUInt16Array(){this.ptr=_emscripten_bind_DracoUInt16Array_D...
function DracoInt32Array (line 22) | function DracoInt32Array(){this.ptr=_emscripten_bind_DracoInt32Array_Dra...
function DracoUInt32Array (line 22) | function DracoUInt32Array(){this.ptr=_emscripten_bind_DracoUInt32Array_D...
function MetadataQuerier (line 22) | function MetadataQuerier(){this.ptr=_emscripten_bind_MetadataQuerier_Met...
function Decoder (line 22) | function Decoder(){this.ptr=_emscripten_bind_Decoder_Decoder_0();getCach...
function setupEnums (line 22) | function setupEnums(){Module["ATTRIBUTE_INVALID_TRANSFORM"]=_emscripten_...
FILE: packages/editor/public/libs/draco/draco_decoder_gltf.js
function isVersionSupported (line 8) | function isVersionSupported(versionString){if(typeof versionString!=="st...
function locateFile (line 8) | function locateFile(path){if(Module["locateFile"]){return Module["locate...
function logExceptionOnExit (line 8) | function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toL...
function c (line 10) | function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return th...
function l (line 10) | function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-...
function p (line 10) | function p(q){l(e,1028,"YAQAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAA...
function v (line 10) | function v(){throw new Error("abort")}
function w (line 10) | function w(x){t[2]=x}
function y (line 10) | function y(z){return s[z]}
function ha (line 10) | function ha(q){var A=q.a;var B=A.a;var C=B.buffer;B.grow=fa;var D=new In...
function assert (line 21) | function assert(condition,text){if(!condition){abort(text)}}
function UTF8ArrayToString (line 21) | function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=id...
function UTF8ToString (line 21) | function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(H...
function stringToUTF8Array (line 21) | function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxByte...
function lengthBytesUTF8 (line 21) | function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){va...
function updateMemoryViews (line 21) | function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEA...
function keepRuntimeAlive (line 21) | function keepRuntimeAlive(){return noExitRuntime}
function preRun (line 21) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
function initRuntime (line 21) | function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__AT...
function postRun (line 21) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
function addOnPreRun (line 21) | function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}
function addOnInit (line 21) | function addOnInit(cb){__ATINIT__.unshift(cb)}
function addOnPostRun (line 21) | function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}
function addRunDependency (line 21) | function addRunDependency(id){runDependencies++;if(Module["monitorRunDep...
function removeRunDependency (line 21) | function removeRunDependency(id){runDependencies--;if(Module["monitorRun...
function abort (line 21) | function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what=...
function isDataURI (line 21) | function isDataURI(filename){return filename.startsWith(dataURIPrefix)}
function isFileURI (line 21) | function isFileURI(filename){return filename.startsWith("file://")}
function getBinary (line 21) | function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return...
function getBinaryPromise (line 21) | function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRON...
function createWasm (line 21) | function createWasm(){var info={"a":wasmImports};function receiveInstanc...
function ExitStatus (line 21) | function ExitStatus(status){this.name="ExitStatus";this.message="Program...
function callRuntimeCallbacks (line 21) | function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callb...
function intArrayToString (line 21) | function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i...
function ExceptionInfo (line 21) | function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;thi...
function ___cxa_throw (line 21) | function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(pt...
function _abort (line 21) | function _abort(){abort("")}
function _emscripten_memcpy_big (line 21) | function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src...
function getHeapMax (line 21) | function getHeapMax(){return 2147483648}
function emscripten_realloc_buffer (line 21) | function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{was...
function _emscripten_resize_heap (line 21) | function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.lengt...
function intArrayFromString (line 21) | function intArrayFromString(stringy,dontAddNull,length){var len=length>0...
function intArrayFromBase64 (line 21) | function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE=="boolean"&...
function tryParseAsDataURI (line 21) | function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}ret...
function run (line 21) | function run(){if(runDependencies>0){return}preRun();if(runDependencies>...
function WrapperObject (line 21) | function WrapperObject(){}
function getCache (line 21) | function getCache(__class__){return(__class__||WrapperObject).__cache__}
function wrapPointer (line 21) | function wrapPointer(ptr,__class__){var cache=getCache(__class__);var re...
function castObject (line 21) | function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}
function destroy (line 21) | function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy...
function compare (line 21) | function compare(obj1,obj2){return obj1.ptr===obj2.ptr}
function getPointer (line 21) | function getPointer(obj){return obj.ptr}
function getClass (line 21) | function getClass(obj){return obj.__class__}
function ensureString (line 21) | function ensureString(value){if(typeof value==="string"){var intArray=in...
function ensureInt8 (line 21) | function ensureInt8(value){if(typeof value==="object"){var offset=ensure...
function VoidPtr (line 21) | function VoidPtr(){throw"cannot construct a VoidPtr, no constructor in I...
function DecoderBuffer (line 21) | function DecoderBuffer(){this.ptr=_emscripten_bind_DecoderBuffer_Decoder...
function AttributeTransformData (line 21) | function AttributeTransformData(){this.ptr=_emscripten_bind_AttributeTra...
function GeometryAttribute (line 21) | function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute...
function PointAttribute (line 21) | function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_Point...
function AttributeQuantizationTransform (line 21) | function AttributeQuantizationTransform(){this.ptr=_emscripten_bind_Attr...
function AttributeOctahedronTransform (line 21) | function AttributeOctahedronTransform(){this.ptr=_emscripten_bind_Attrib...
function PointCloud (line 21) | function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0(...
function Mesh (line 21) | function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[t...
function Metadata (line 21) | function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getC...
function Status (line 21) | function Status(){throw"cannot construct a Status, no constructor in IDL"}
function DracoFloat32Array (line 21) | function DracoFloat32Array(){this.ptr=_emscripten_bind_DracoFloat32Array...
function DracoInt8Array (line 21) | function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_Draco...
function DracoUInt8Array (line 21) | function DracoUInt8Array(){this.ptr=_emscripten_bind_DracoUInt8Array_Dra...
function DracoInt16Array (line 21) | function DracoInt16Array(){this.ptr=_emscripten_bind_DracoInt16Array_Dra...
function DracoUInt16Array (line 21) | function DracoUInt16Array(){this.ptr=_emscripten_bind_DracoUInt16Array_D...
function DracoInt32Array (line 21) | function DracoInt32Array(){this.ptr=_emscripten_bind_DracoInt32Array_Dra...
function DracoUInt32Array (line 21) | function DracoUInt32Array(){this.ptr=_emscripten_bind_DracoUInt32Array_D...
function MetadataQuerier (line 21) | function MetadataQuerier(){this.ptr=_emscripten_bind_MetadataQuerier_Met...
function Decoder (line 21) | function Decoder(){this.ptr=_emscripten_bind_Decoder_Decoder_0();getCach...
function setupEnums (line 21) | function setupEnums(){Module["ATTRIBUTE_INVALID_TRANSFORM"]=_emscripten_...
FILE: packages/editor/public/libs/draco/draco_encoder.js
function isVersionSupported (line 8) | function isVersionSupported(versionString){if(typeof versionString!=="st...
function locateFile (line 8) | function locateFile(path){if(Module["locateFile"]){return Module["locate...
function logExceptionOnExit (line 8) | function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toL...
function c (line 10) | function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return th...
function l (line 10) | function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-...
function p (line 10) | function p(q){l(e,1028,"YAQAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAA...
function v (line 10) | function v(w){return s[w]}
function x (line 10) | function x(w,y){s[w]=y}
function z (line 10) | function z(){return u[0]}
function A (line 10) | function A(y){u[0]=y}
function B (line 10) | function B(){throw new Error("abort")}
function C (line 10) | function C(y){t[2]=y}
function D (line 10) | function D(){return t[2]}
function la (line 10) | function la(q){var E=q.a;var F=E.a;var G=F.buffer;F.grow=ja;var H=new In...
function assert (line 23) | function assert(condition,text){if(!condition){abort(text)}}
function stringToUTF8Array (line 23) | function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxByte...
function lengthBytesUTF8 (line 23) | function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){va...
function updateMemoryViews (line 23) | function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEA...
function keepRuntimeAlive (line 23) | function keepRuntimeAlive(){return noExitRuntime}
function preRun (line 23) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
function initRuntime (line 23) | function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__AT...
function postRun (line 23) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
function addOnPreRun (line 23) | function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}
function addOnInit (line 23) | function addOnInit(cb){__ATINIT__.unshift(cb)}
function addOnPostRun (line 23) | function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}
function addRunDependency (line 23) | function addRunDependency(id){runDependencies++;if(Module["monitorRunDep...
function removeRunDependency (line 23) | function removeRunDependency(id){runDependencies--;if(Module["monitorRun...
function abort (line 23) | function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what=...
function isDataURI (line 23) | function isDataURI(filename){return filename.startsWith(dataURIPrefix)}
function isFileURI (line 23) | function isFileURI(filename){return filename.startsWith("file://")}
function getBinary (line 23) | function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return...
function getBinaryPromise (line 23) | function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRON...
function createWasm (line 23) | function createWasm(){var info={"a":wasmImports};function receiveInstanc...
function ExitStatus (line 23) | function ExitStatus(status){this.name="ExitStatus";this.message="Program...
function callRuntimeCallbacks (line 23) | function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callb...
function intArrayToString (line 23) | function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i...
function ExceptionInfo (line 23) | function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;thi...
function ___cxa_throw (line 23) | function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(pt...
function _abort (line 23) | function _abort(){abort("")}
function _emscripten_memcpy_big (line 23) | function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src...
function getHeapMax (line 23) | function getHeapMax(){return 2147483648}
function emscripten_realloc_buffer (line 23) | function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{was...
function _emscripten_resize_heap (line 23) | function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.lengt...
function intArrayFromString (line 23) | function intArrayFromString(stringy,dontAddNull,length){var len=length>0...
function intArrayFromBase64 (line 23) | function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE=="boolean"&...
function tryParseAsDataURI (line 23) | function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}ret...
function run (line 23) | function run(){if(runDependencies>0){return}preRun();if(runDependencies>...
function WrapperObject (line 23) | function WrapperObject(){}
function getCache (line 23) | function getCache(__class__){return(__class__||WrapperObject).__cache__}
function wrapPointer (line 23) | function wrapPointer(ptr,__class__){var cache=getCache(__class__);var re...
function castObject (line 23) | function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}
function destroy (line 23) | function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy...
function compare (line 23) | function compare(obj1,obj2){return obj1.ptr===obj2.ptr}
function getPointer (line 23) | function getPointer(obj){return obj.ptr}
function getClass (line 23) | function getClass(obj){return obj.__class__}
function ensureString (line 23) | function ensureString(value){if(typeof value==="string"){var intArray=in...
function ensureInt8 (line 23) | function ensureInt8(value){if(typeof value==="object"){var offset=ensure...
function ensureInt16 (line 23) | function ensureInt16(value){if(typeof value==="object"){var offset=ensur...
function ensureInt32 (line 23) | function ensureInt32(value){if(typeof value==="object"){var offset=ensur...
function ensureFloat32 (line 23) | function ensureFloat32(value){if(typeof value==="object"){var offset=ens...
function VoidPtr (line 23) | function VoidPtr(){throw"cannot construct a VoidPtr, no constructor in I...
function GeometryAttribute (line 23) | function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute...
function PointAttribute (line 23) | function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_Point...
function PointCloud (line 23) | function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0(...
function Mesh (line 23) | function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[t...
function Metadata (line 23) | function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getC...
function DracoInt8Array (line 23) | function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_Draco...
function MetadataBuilder (line 23) | function MetadataBuilder(){this.ptr=_emscripten_bind_MetadataBuilder_Met...
function PointCloudBuilder (line 23) | function PointCloudBuilder(){this.ptr=_emscripten_bind_PointCloudBuilder...
function MeshBuilder (line 23) | function MeshBuilder(){this.ptr=_emscripten_bind_MeshBuilder_MeshBuilder...
function Encoder (line 23) | function Encoder(){this.ptr=_emscripten_bind_Encoder_Encoder_0();getCach...
function ExpertEncoder (line 23) | function ExpertEncoder(pc){if(pc&&typeof pc==="object")pc=pc.ptr;this.pt...
function setupEnums (line 23) | function setupEnums(){Module["INVALID"]=_emscripten_enum_draco_GeometryA...
FILE: packages/editor/public/libs/draco/draco_encoder_wrapper.js
function p (line 8) | function p(){this.batch_=null}
function m (line 8) | function m(h){return h instanceof k?h:new k(function(q,w){q(h)})}
function h (line 10) | function h(B){return function(v){w||(w=!0,B.call(q,v))}}
function w (line 14) | function w(I,J){return"function"==typeof I?function(Q){try{B(I(Q))}catch...
function w (line 14) | function w(){switch(B.state_){case 1:h(B.result_);
function D (line 16) | function D(Q){return function(R){I[Q]=R;J--;0==J&&B(I)}}
function p (line 19) | function p(m){m=Number(m);return Infinity===m||-Infinity===m?m:m|0}
function m (line 22) | function m(f){return a.locateFile?a.locateFile(f,L):L+f}
function r (line 22) | function r(){var f=ba.buffer;a.HEAP8=O=new Int8Array(f);a.HEAP16=ea=new ...
function k (line 23) | function k(f){if(a.onAbort)a.onAbort(f);f="Aborted("+f+")";W(f);na=!0;f=...
function C (line 23) | function C(f){try{if(f==K&&X)return new Uint8Array(X);if(ia)return ia(f)...
function h (line 23) | function h(){if(!X&&(oa||Y)){if("function"==typeof fetch&&!K.startsWith(...
function q (line 24) | function q(f){for(;0<f.length;)f.shift()(a)}
function w (line 24) | function w(f){this.excPtr=f;this.ptr=f-24;this.set_type=function(b){T[th...
function B (line 26) | function B(){function f(){if(!da&&(da=!0,a.calledRun=!0,!na)){qa=!0;q(ka...
function v (line 27) | function v(){}
function D (line 27) | function D(f){return(f||v).__cache__}
function I (line 27) | function I(f,b){var c=D(b),d=c[f];if(d)return d;d=Object.create((b||v).p...
function J (line 27) | function J(f){if("string"===typeof f){for(var b=0,c=0;c<f.length;++c){va...
function Q (line 29) | function Q(f){if("object"===typeof f){var b=n.alloc(f,O);n.copy(f,O,b);r...
function R (line 29) | function R(f){if("object"===typeof f){var b=n.alloc(f,ea);n.copy(f,ea,b)...
function V (line 29) | function V(f){if("object"===typeof f){var b=n.alloc(f,S);n.copy(f,S,b);r...
function Z (line 29) | function Z(f){if("object"===typeof f){var b=n.alloc(f,ha);n.copy(f,ha,b)...
function P (line 29) | function P(){throw"cannot construct a VoidPtr, no constructor in IDL";}
function M (line 29) | function M(){this.ptr=ua();D(M)[this.ptr]=this}
function z (line 29) | function z(){this.ptr=va();
function G (line 30) | function G(){this.ptr=wa();D(G)[this.ptr]=this}
function E (line 30) | function E(){this.ptr=xa();D(E)[this.ptr]=this}
function N (line 30) | function N(){this.ptr=ya();D(N)[this.ptr]=this}
function H (line 30) | function H(){this.ptr=za();D(H)[this.ptr]=this}
function F (line 30) | function F(){this.ptr=Aa();D(F)[this.ptr]=this}
function x (line 30) | function x(){this.ptr=Ba();D(x)[this.ptr]=this}
function u (line 30) | function u(){this.ptr=Ca();D(u)[this.ptr]=this}
function y (line 30) | function y(){this.ptr=Da();D(y)[this.ptr]=this}
function A (line 30) | function A(f){f&&"object"===typeof f&&(f=f.ptr);this.ptr=Ea(f);D(A)[this...
function f (line 36) | function f(e,g){a.asm=e.exports;ba=a.asm.e;r();ka.unshift(a.asm.f);U--;a...
function b (line 36) | function b(e){f(e.instance)}
function c (line 36) | function c(e){return h().then(function(g){return WebAssembly.instantiate...
function b (line 97) | function b(){a.INVALID=ec();a.POSITION=fc();a.NORMAL=gc();a.COLOR=hc();a...
FILE: packages/editor/public/libs/draco/draco_wasm_wrapper.js
function n (line 8) | function n(){this.batch_=null}
function l (line 8) | function l(f){return f instanceof h?f:new h(function(q,v){q(f)})}
function f (line 10) | function f(z){return function(O){v||(v=!0,z.call(q,O))}}
function v (line 14) | function v(t,x){return"function"==typeof t?function(D){try{z(t(D))}catch...
function v (line 14) | function v(){switch(z.state_){case 1:f(z.result_);
function ba (line 16) | function ba(D){return function(R){t[D]=R;x--;0==x&&z(t)}}
function n (line 19) | function n(l){l=Number(l);return Infinity===l||-Infinity===l?l:l|0}
function l (line 22) | function l(e){return a.locateFile?a.locateFile(e,U):U+e}
function p (line 22) | function p(e,b,c){var d=b+c;for(c=b;e[c]&&!(c>=d);)++c;if(16<c-b&&e.buff...
function h (line 23) | function h(e,b){return e?p(ea,e,b):""}
function A (line 23) | function A(){var e=ja.buffer;a.HEAP8=Y=new Int8Array(e);a.HEAP16=new Int...
function f (line 23) | function f(e){if(a.onAbort)a.onAbort(e);
function q (line 24) | function q(e){try{if(e==P&&fa)return new Uint8Array(fa);if(ma)return ma(...
function v (line 24) | function v(){if(!fa&&(xa||ha)){if("function"==typeof fetch&&!P.startsWit...
function z (line 25) | function z(e){for(;0<e.length;)e.shift()(a)}
function O (line 25) | function O(e){this.excPtr=e;this.ptr=e-24;this.set_type=function(b){V[th...
function ba (line 27) | function ba(){function e(){if(!la&&(la=!0,a.calledRun=!0,!wa)){za=!0;z(o...
function t (line 28) | function t(){}
function x (line 28) | function x(e){return(e||t).__cache__}
function D (line 28) | function D(e,b){var c=x(b),d=c[e];if(d)return d;d=Object.create((b||t).p...
function R (line 28) | function R(e){if("string"===typeof e){for(var b=0,c=0;c<e.length;++c){va...
function pa (line 29) | function pa(e){if("object"===typeof e){var b=
function Z (line 30) | function Z(){throw"cannot construct a VoidPtr, no constructor in IDL";}
function S (line 30) | function S(){this.ptr=Da();x(S)[this.ptr]=this}
function Q (line 30) | function Q(){this.ptr=Ea();x(Q)[this.ptr]=this}
function W (line 30) | function W(){this.ptr=Fa();x(W)[this.ptr]=this}
function w (line 30) | function w(){this.ptr=Ga();x(w)[this.ptr]=this}
function C (line 30) | function C(){this.ptr=Ha();x(C)[this.ptr]=this}
function F (line 30) | function F(){this.ptr=Ia();x(F)[this.ptr]=this}
function G (line 30) | function G(){this.ptr=Ja();x(G)[this.ptr]=this}
function E (line 30) | function E(){this.ptr=Ka();x(E)[this.ptr]=this}
function T (line 30) | function T(){this.ptr=
function B (line 31) | function B(){throw"cannot construct a Status, no constructor in IDL";}
function H (line 31) | function H(){this.ptr=Ma();x(H)[this.ptr]=this}
function I (line 31) | function I(){this.ptr=Na();x(I)[this.ptr]=this}
function J (line 31) | function J(){this.ptr=Oa();x(J)[this.ptr]=this}
function K (line 31) | function K(){this.ptr=Pa();x(K)[this.ptr]=this}
function L (line 31) | function L(){this.ptr=Qa();x(L)[this.ptr]=this}
function M (line 31) | function M(){this.ptr=Ra();x(M)[this.ptr]=this}
function N (line 31) | function N(){this.ptr=Sa();x(N)[this.ptr]=this}
function y (line 31) | function y(){this.ptr=Ta();x(y)[this.ptr]=this}
function m (line 31) | function m(){this.ptr=Ua();x(m)[this.ptr]=
function e (line 38) | function e(g,u){a.asm=g.exports;ja=a.asm.h;A();oa.unshift(a.asm.i);aa--;...
function b (line 38) | function b(g){e(g.instance)}
function c (line 38) | function c(g){return v().then(function(u){return WebAssembly.instantiate...
function b (line 114) | function b(){a.ATTRIBUTE_INVALID_TRANSFORM=Pc();a.ATTRIBUTE_NO_TRANSFORM...
FILE: packages/editor/public/libs/draco/draco_wasm_wrapper_gltf.js
function n (line 8) | function n(){this.batch_=null}
function k (line 8) | function k(f){return f instanceof l?f:new l(function(q,u){q(f)})}
function f (line 10) | function f(A){return function(F){u||(u=!0,A.call(q,F))}}
function u (line 14) | function u(w,B){return"function"==typeof w?function(R){try{A(w(R))}catch...
function u (line 14) | function u(){switch(A.state_){case 1:f(A.result_);
function v (line 16) | function v(R){return function(Z){w[R]=Z;B--;0==B&&A(w)}}
function n (line 19) | function n(k){k=Number(k);return Infinity===k||-Infinity===k?k:k|0}
function k (line 22) | function k(e){return a.locateFile?a.locateFile(e,U):U+e}
function p (line 22) | function p(e,b){if(e){var c=ia;var d=e+b;for(b=e;c[b]&&!(b>=d);)++b;if(1...
function l (line 23) | function l(){var e=ja.buffer;a.HEAP8=W=new Int8Array(e);a.HEAP16=new Int...
function y (line 23) | function y(e){if(a.onAbort)a.onAbort(e);
function f (line 24) | function f(e){try{if(e==P&&ea)return new Uint8Array(ea);if(ma)return ma(...
function q (line 24) | function q(){if(!ea&&(ta||fa)){if("function"==typeof fetch&&!P.startsWit...
function u (line 25) | function u(e){for(;0<e.length;)e.shift()(a)}
function A (line 25) | function A(e){this.excPtr=e;this.ptr=e-24;this.set_type=function(b){Y[th...
function F (line 27) | function F(){function e(){if(!la&&(la=!0,a.calledRun=!0,!sa)){va=!0;u(oa...
function v (line 28) | function v(){}
function w (line 28) | function w(e){return(e||v).__cache__}
function B (line 28) | function B(e,b){var c=w(b),d=c[e];if(d)return d;d=Object.create((b||v).p...
function R (line 28) | function R(e){if("string"===typeof e){for(var b=0,c=0;c<e.length;++c){va...
function Z (line 29) | function Z(e){if("object"===
function X (line 30) | function X(){throw"cannot construct a VoidPtr, no constructor in IDL";}
function S (line 30) | function S(){this.ptr=za();w(S)[this.ptr]=this}
function Q (line 30) | function Q(){this.ptr=Aa();w(Q)[this.ptr]=this}
function V (line 30) | function V(){this.ptr=Ba();w(V)[this.ptr]=this}
function x (line 30) | function x(){this.ptr=Ca();w(x)[this.ptr]=this}
function D (line 30) | function D(){this.ptr=Da();w(D)[this.ptr]=this}
function G (line 30) | function G(){this.ptr=Ea();w(G)[this.ptr]=this}
function H (line 30) | function H(){this.ptr=Fa();w(H)[this.ptr]=this}
function E (line 30) | function E(){this.ptr=Ga();w(E)[this.ptr]=
function T (line 31) | function T(){this.ptr=Ha();w(T)[this.ptr]=this}
function C (line 31) | function C(){throw"cannot construct a Status, no constructor in IDL";}
function I (line 31) | function I(){this.ptr=Ia();w(I)[this.ptr]=this}
function J (line 31) | function J(){this.ptr=Ja();w(J)[this.ptr]=this}
function K (line 31) | function K(){this.ptr=Ka();w(K)[this.ptr]=this}
function L (line 31) | function L(){this.ptr=La();w(L)[this.ptr]=this}
function M (line 31) | function M(){this.ptr=Ma();w(M)[this.ptr]=this}
function N (line 31) | function N(){this.ptr=Na();w(N)[this.ptr]=this}
function O (line 31) | function O(){this.ptr=Oa();w(O)[this.ptr]=this}
function z (line 31) | function z(){this.ptr=Pa();w(z)[this.ptr]=this}
function m (line 31) | function m(){this.ptr=
function e (line 37) | function e(g,t){a.asm=g.exports;ja=a.asm.e;l();oa.unshift(a.asm.f);ba--;...
function b (line 37) | function b(g){e(g.instance)}
function c (line 38) | function c(g){return q().then(function(t){return WebAssembly.instantiate...
function b (line 114) | function b(){a.ATTRIBUTE_INVALID_TRANSFORM=Kc();a.ATTRIBUTE_NO_TRANSFORM...
FILE: packages/editor/src/config/service.ts
constant ERROR_MSG_DURATION (line 2) | const ERROR_MSG_DURATION = 3 * 1000;
constant DEFAULT_REQUEST_ERROR_CODE (line 5) | const DEFAULT_REQUEST_ERROR_CODE = 'DEFAULT';
constant DEFAULT_REQUEST_ERROR_MSG (line 8) | const DEFAULT_REQUEST_ERROR_MSG = '请求错误~';
constant REQUEST_TIMEOUT_CODE (line 11) | const REQUEST_TIMEOUT_CODE = 'ECONNABORTED';
constant REQUEST_TIMEOUT_MSG (line 14) | const REQUEST_TIMEOUT_MSG = '请求超时~';
constant NETWORK_ERROR_CODE (line 17) | const NETWORK_ERROR_CODE = 'NETWORK_ERROR';
constant NETWORK_ERROR_MSG (line 20) | const NETWORK_ERROR_MSG = '网络不可用~';
constant ERROR_STATUS (line 23) | const ERROR_STATUS = {
constant NO_ERROR_MSG_CODE (line 40) | const NO_ERROR_MSG_CODE: (string | number)[] = [];
constant REFRESH_TOKEN_CODE (line 43) | const REFRESH_TOKEN_CODE: (string | number)[] = [978, 998, 999];
FILE: packages/editor/src/core/AssetPreview.ts
class AssetPreview (line 3) | class AssetPreview {
method getInstance (line 8) | static getInstance(container?:HTMLElement) {
method constructor (line 18) | constructor(container?:HTMLElement) {
method updateContainer (line 34) | updateContainer(container:HTMLElement){
method load (line 44) | load(fileOrUrl:string | File,type:string = "Model"){
method clear (line 48) | clear(){
method dispose (line 52) | dispose(){
FILE: packages/editor/src/hooks/useBoolean.ts
function useBoolean (line 7) | function useBoolean(initValue = false) {
FILE: packages/editor/src/hooks/useLoading.ts
function useLoading (line 3) | function useLoading(initValue = false) {
FILE: packages/editor/src/hooks/useWebSocket.ts
function connectWebSocket (line 20) | function connectWebSocket(url) {
function onMessage (line 75) | function onMessage(e: MessageEvent) {
function onWebSocket (line 100) | function onWebSocket(callback: (data: object) => any) {
function offWebSocket (line 115) | function offWebSocket(callback: (data: object) => any) {
function useWebSocket (line 119) | function useWebSocket() {
function send (line 123) | function send(message: string | ArrayBuffer | Blob) {
FILE: packages/editor/src/http/api/assetsCategory.ts
function fetchAssetsCategoryTreeList (line 6) | function fetchAssetsCategoryTreeList(params = {type: ''}){
FILE: packages/editor/src/http/api/assetsInfo.ts
function fetchGetAssetsList (line 6) | function fetchGetAssetsList(params:Service.ListPageQueryParams){
function fetchAddAsset (line 13) | function fetchAddAsset(data:IAssets.Item){
function fetchUpdateAsset (line 20) | function fetchUpdateAsset(data:IAssets.Item){
function fetchRemoveAsset (line 27) | function fetchRemoveAsset(id:IAssets.Item['id']){
function fetchGetAssetCategoryTags (line 35) | function fetchGetAssetCategoryTags(type:IAssets.SupportType, category: s...
FILE: packages/editor/src/http/api/bim.ts
function fetchGetBim2GltfList (line 9) | function fetchGetBim2GltfList(params) {
function fetchUploadRvt (line 16) | function fetchUploadRvt(data) {
function fetchAddBim2Gltf (line 23) | function fetchAddBim2Gltf(data) {
FILE: packages/editor/src/http/api/cad.ts
function fetchGetCadList (line 9) | function fetchGetCadList(params) {
function fetchAddDwg2dxf (line 16) | function fetchAddDwg2dxf(data) {
FILE: packages/editor/src/http/api/sceneExample.ts
function fetchSceneExampleList (line 13) | function fetchSceneExampleList(params) {
function fetchSceneExample (line 20) | function fetchSceneExample(id) {
function fetchAddSceneExample (line 27) | function fetchAddSceneExample(data) {
function fetchDeleteSceneExample (line 35) | function fetchDeleteSceneExample(id: number) {
FILE: packages/editor/src/http/api/scenes.ts
function fetchGetAllScenes (line 6) | function fetchGetAllScenes(params:Service.ListPageQueryParams) {
function fetchGetOneScene (line 13) | function fetchGetOneScene(id:string) {
function fetchAddScene (line 20) | function fetchAddScene(data) {
function fetchUpdateScene (line 27) | function fetchUpdateScene(id:string,data:ISceneFetchData) {
function fetchDeleteScenes (line 35) | function fetchDeleteScenes(id: string) {
FILE: packages/editor/src/http/api/sys.ts
function fetchUpload (line 6) | function fetchUpload(data:{file:File,biz:string,type?:string}) {
FILE: packages/editor/src/http/request/instance.ts
constant MAX_CONCURRENT_REQUESTS (line 16) | const MAX_CONCURRENT_REQUESTS = 6;
class CustomAxiosInstance (line 17) | class CustomAxiosInstance {
method constructor (line 27) | constructor(
method setInterceptor (line 43) | setInterceptor() {
FILE: packages/editor/src/http/request/request.ts
type RequestMethod (line 8) | type RequestMethod = 'get' | 'post' | 'put' | 'delete';
type RequestParam (line 10) | interface RequestParam {
function createRequest (line 22) | function createRequest(axiosConfig: AxiosRequestConfig, backendConfig?: ...
type RequestResultHook (line 93) | interface RequestResultHook<T = any> {
function createHookRequest (line 105) | function createHookRequest(axiosConfig: AxiosRequestConfig, backendConfi...
function getRequestResponse (line 193) | async function getRequestResponse(params: {
FILE: packages/editor/src/language/index.ts
type Message (line 11) | type Message = {
type ReturnMessage (line 14) | type ReturnMessage = {
type LangFilesList (line 25) | type LangFilesList = {
type LocaleObj (line 38) | type LocaleObj = {
type LangObj (line 72) | type LangObj = {
function setupI18n (line 102) | function setupI18n(app: App) {
function t (line 106) | function t(key: string):string {
function cpt (line 110) | function cpt(key: string): ComputedRef<string> {
function setLocale (line 114) | function setLocale(locale: IConfig.Locale) {
FILE: packages/editor/src/main.ts
function main (line 16) | async function main() {
FILE: packages/editor/src/plugin/glTFHandler/Listr.ts
class ListrTask (line 8) | class ListrTask {
method constructor (line 14) | constructor(title, taskFn) {
method run (line 20) | async run() {
class Listr (line 31) | class Listr {
method constructor (line 34) | constructor(tasks: { title:string,task:(task: any) => Promise<void> }[...
method run (line 38) | async run() {
FILE: packages/editor/src/plugin/glTFHandler/glTFHandler.ts
constant MICROMATCH_OPTIONS (line 39) | const MICROMATCH_OPTIONS = { nocase: true, contains: true };
class GLTFHandler (line 41) | class GLTFHandler implements Plugin{
method install (line 72) | async install() {
method run (line 77) | async run() {
method finish (line 115) | finish(){
method uninstall (line 121) | uninstall(): void {}
method setLogger (line 123) | setLogger(log:string){
method registerDependencies (line 129) | async registerDependencies(){
method optimize (line 139) | async optimize(opts:IPlugin.GLTFHandlerOptimizeModel,inputFile:File,ou...
FILE: packages/editor/src/plugin/glTFHandler/optimizePng.ts
function asUint8Array (line 4) | function asUint8Array(data: unknown): Uint8Array {
FILE: packages/editor/src/plugin/glTFHandler/session.ts
class Session (line 8) | class Session {
method constructor (line 12) | constructor(
method create (line 24) | public static create(handler: GLTFHandler, inputFileUrl: string, input...
method setDisplay (line 28) | public setDisplay(display: boolean): this {
method transform (line 33) | public async transform(...transforms: Transform[]): Promise<File> {
function updateMetadata (line 117) | function updateMetadata(_document: Document): void {
FILE: packages/editor/src/plugin/glTFHandler/util.ts
function formatLong (line 11) | function formatLong(x: number): string {
function formatBytes (line 15) | function formatBytes(bytes: number, decimals = 2): string {
function dim (line 27) | function dim(str: string): string {
function ensureWasmReady (line 34) | async function ensureWasmReady() {
function encodeGLB (line 40) | async function encodeGLB(u8: Uint8Array, meta: Record<string, any> = {}) {
function encodePNG (line 47) | async function encodePNG(png: Uint8Array) {
FILE: packages/editor/src/plugin/pointCloudReconstructor/PointCloudReconstructor.ts
class PointCloudReconstructor (line 12) | class PointCloudReconstructor implements Plugin {
method install (line 20) | async install() {
method run (line 25) | async run() {
method finish (line 48) | finish() {
method uninstall (line 54) | uninstall(): void { }
FILE: packages/editor/src/router/index.ts
function setupRouter (line 13) | function setupRouter(app: App<Element>) {
FILE: packages/editor/src/store/index.ts
function setupStore (line 6) | function setupStore(app: App<Element>) {
FILE: packages/editor/src/store/modules/animation.ts
type IAnimationItem (line 11) | interface IAnimationItem {
type IAnimationState (line 18) | interface IAnimationState {
function useAnimationStoreWithOut (line 333) | function useAnimationStoreWithOut() {
FILE: packages/editor/src/store/modules/assets.ts
type IAssetsState (line 9) | interface IAssetsState {
function useAssetsStoreWithOut (line 76) | function useAssetsStoreWithOut() {
FILE: packages/editor/src/store/modules/drag.ts
type IDragState (line 5) | interface IDragState {
method setData (line 32) | setData(data:any){
method setActionTarget (line 35) | setActionTarget(actionTarget){
method setEndArea (line 38) | setEndArea(area){
function useDragStoreWithOut (line 45) | function useDragStoreWithOut() {
FILE: packages/editor/src/store/modules/globalConfig.ts
function useGlobalConfigStoreWithOut (line 99) | function useGlobalConfigStoreWithOut() {
FILE: packages/editor/src/store/modules/plugin.ts
type IPluginState (line 11) | interface IPluginState {
function usePluginStoreWithOut (line 52) | function usePluginStoreWithOut() {
FILE: packages/editor/src/store/modules/previewOperation.ts
type IPreviewOperation (line 21) | interface IPreviewOperation {
type IPreviewOperationState (line 31) | interface IPreviewOperationState {
function usePreviewOperationStoreWithOut (line 90) | function usePreviewOperationStoreWithOut() {
FILE: packages/editor/src/store/modules/websocket.ts
type IWebsocketState (line 7) | interface IWebsocketState<T> {
function useWebsocketStoreWithOut (line 57) | function useWebsocketStoreWithOut() {
FILE: packages/editor/src/utils/common/base64.ts
function _arrayBufferToBase64 (line 6) | function _arrayBufferToBase64(buffer) {
function _base64ToArrayBuffer (line 21) | function _base64ToArrayBuffer(base64) {
FILE: packages/editor/src/utils/common/color.ts
function decToRgb (line 2) | function decToRgb(number:number) {
FILE: packages/editor/src/utils/common/constant.ts
constant MODEL_SUPPORT_TYPE (line 8) | const MODEL_SUPPORT_TYPE = [
constant ASSET_UPLOAD_SUPPORT_TYPE (line 33) | const ASSET_UPLOAD_SUPPORT_TYPE = {
constant NEED_CONVERT_BIM_MODEL (line 42) | const NEED_CONVERT_BIM_MODEL = ["rvt", "rfa"];
constant DRAWING_SUPPORT_TYPE (line 45) | const DRAWING_SUPPORT_TYPE = ["dwg", "dxf", "png", "jpg", "jpeg"];
constant NEED_CONVERT_DRAWING (line 48) | const NEED_CONVERT_DRAWING = ["dwg"];
constant DOC_SUPPORT_TYPE (line 51) | const DOC_SUPPORT_TYPE = ["doc","docx","xls","xlsx","xlsm","ppt",'pptx',...
constant SCENE_TYPE (line 53) | const SCENE_TYPE = [
FILE: packages/editor/src/utils/common/dateTime.ts
function dateTimeFormat (line 1) | function dateTimeFormat(fmt) {
FILE: packages/editor/src/utils/common/file.ts
function downloadWithFetch (line 8) | async function downloadWithFetch(url:string, filename:string = "") {
FILE: packages/editor/src/utils/common/init.ts
function change (line 14) | function change() {
FILE: packages/editor/src/utils/common/render.ts
function renderIcon (line 10) | function renderIcon(icon: Component) {
FILE: packages/editor/src/utils/common/scenes.ts
type IModel (line 5) | interface IModel extends THREE.Object3D {
function getMaterialName (line 9) | function getMaterialName(material) {
function getObjectType (line 23) | function getObjectType(object) {
function getSelectedModelPath (line 37) | function getSelectedModelPath() {
function screenToWorld (line 53) | function screenToWorld(x: number, y: number) {
function reBufferGeometryUv (line 67) | function reBufferGeometryUv(geometry: THREE.BufferGeometry) {
function setUserData (line 107) | function setUserData(object: IModel, key: string, value: any) {
function setMetaData (line 121) | function setMetaData(object: IModel, key: string, value: any) {
function createBasicScene (line 144) | function createBasicScene(container: HTMLElement) {
FILE: packages/editor/src/utils/common/utils.ts
function escapeHTML (line 6) | function escapeHTML(html:string) {
function findSiblingsAndIndex (line 22) | function findSiblingsAndIndex(node: TreeOption, nodes?: TreeOption[]): [...
function base64ToFile (line 35) | function base64ToFile(dataurl, filename) {
function pow1024 (line 51) | function pow1024(num) {
function loadScript (line 60) | function loadScript(src:string,async:boolean = true){
function copyToClipboard (line 82) | function copyToClipboard(text: string) {
function remToPxNumber (line 102) | function remToPxNumber(rem: number): number {
function injectJS (line 111) | function injectJS(src) {
function findTreeNode (line 131) | function findTreeNode(tree:TreeOption[], targetKey:string | number):Tree...
function markLeafNodes (line 154) | function markLeafNodes(tree:TreeOption[]) {
FILE: packages/editor/src/utils/common/verify.ts
function formItemIsFile (line 6) | function formItemIsFile(_, value:File | null){
function formItemNotNil (line 17) | function formItemNotNil(_, value:any){
FILE: packages/editor/src/utils/drawing/drawRect.ts
class DrawRect (line 11) | class DrawRect {
method constructor (line 44) | constructor(canvas: HTMLCanvasElement, parentElement: HTMLDivElement) {
method init (line 69) | init(){
method addRect (line 86) | public addRect() {
method exitRect (line 95) | public exitRect() {
method deleteRect (line 104) | public deleteRect() {
method canvasReset (line 114) | public canvasReset(){
method setRectColor (line 128) | public setRectColor(color: string) {
method selectRectColor (line 138) | get selectRectColor(){
method selectRect (line 146) | public selectRect(uuid: string) {
method onmousemove (line 195) | private onmousemove(em) {
method onmousedown (line 286) | private onmousedown(ed) {
method handleMouseDown (line 322) | private handleMouseDown(offsetX, offsetY) {
method onmouseup (line 370) | private onmouseup(eu) {
method onmouseleave (line 433) | private onmouseleave(){
method onmousewheel (line 437) | private onmousewheel(event){
method reDrawCanvas (line 462) | reDrawCanvas(showSelectLineColor = false) {
method onParentMouseDown (line 520) | private onParentMouseDown(e){
method onParentMouseUp (line 527) | private onParentMouseUp(){
method onParentMouseMove (line 534) | private onParentMouseMove(e){
method onParentMouseLeave (line 543) | private onParentMouseLeave(){
method dispose (line 547) | dispose() {
FILE: packages/editor/src/utils/preview/menuOperation.ts
class MenuOperation (line 22) | class MenuOperation {
method Init (line 53) | static Init(key: string) {
method ClippedEdgesBox (line 61) | static get ClippedEdgesBox(){
method Measure (line 69) | static get Measure():Measure{
method Explode (line 86) | static get Explode():ModelExplode{
method Roaming (line 94) | static get Roaming():Roaming{
method MiniMap (line 102) | static get MiniMap():MiniMap{
method toHome (line 118) | static toHome() {
method autoRotate (line 130) | static autoRotate() {
method cutting (line 137) | static cutting() {
method distance (line 148) | static distance() {
method angle (line 165) | static angle() {
method area (line 181) | static area() {
method clearMeasure (line 197) | static clearMeasure() {
method explode (line 206) | static explode(){
method roaming (line 235) | static roaming() {
method enterRoaming (line 248) | static enterRoaming() {
method leaveRoaming (line 312) | static leaveRoaming() {
method miniMap (line 327) | static miniMap() {
method settings (line 338) | static settings(){
method fullscreen (line 342) | static fullscreen() {
method exitFullscreen (line 349) | static exitFullscreen() {
FILE: packages/editor/src/utils/service/error.ts
type ErrorStatus (line 14) | type ErrorStatus = keyof typeof ERROR_STATUS;
function exeStrategyActions (line 20) | function exeStrategyActions(actions: Common.StrategyAction[]) {
function handleAxiosError (line 34) | function handleAxiosError(axiosError: AxiosError) {
function handleResponseError (line 79) | function handleResponseError(response: AxiosResponse) {
function handleBackendError (line 105) | function handleBackendError(backendResult: Record<string, any>, config: ...
FILE: packages/editor/src/utils/service/fetchController.ts
function fetchController (line 8) | function fetchController (limit:number, timeout:number | boolean) {
FILE: packages/editor/src/utils/service/handler.ts
function handleServiceResult (line 4) | async function handleServiceResult(error: Service.RequestError | null, d...
function adapter (line 21) | function adapter<T extends Service.ServiceAdapter>(
FILE: packages/editor/src/utils/service/msg.ts
function addErrorMsg (line 6) | function addErrorMsg(error: Service.RequestError) {
function removeErrorMsg (line 9) | function removeErrorMsg(error: Service.RequestError) {
function hasErrorMsg (line 12) | function hasErrorMsg(error: Service.RequestError) {
function showErrorMsg (line 20) | function showErrorMsg(error: Service.RequestError) {
FILE: packages/editor/src/utils/storage/config.ts
class Config (line 3) | class Config {
method initialize (line 7) | static initialize(storage: Storage) {
method getKey (line 41) | static getKey(key: string) {
method setKey (line 45) | static setKey(...args: any[]) {
method clear (line 55) | static clear() {
FILE: packages/editor/types/assets.d.ts
type SupportType (line 2) | type SupportType = 'Model' | 'Material' | 'Texture' | 'Billboard' | 'HDR';
type MainCategory (line 4) | interface MainCategory {
type Category (line 11) | interface Category {
type Item (line 21) | interface Item {
FILE: packages/editor/types/billboard.d.ts
type options (line 2) | interface options {
FILE: packages/editor/types/bim.d.ts
type IBIMData (line 1) | interface IBIMData {
FILE: packages/editor/types/config.d.ts
type Theme (line 2) | type Theme = 'osTheme' |'lightTheme' | 'darkTheme';
type Locale (line 4) | type Locale = 'zh-CN' |'en-US';
type Color (line 6) | interface Color {
FILE: packages/editor/types/data-source.d.ts
type Item (line 2) | interface Item {
type Item (line 13) | interface Item {
type IGroup (line 25) | interface IGroup {
FILE: packages/editor/types/drawing.d.ts
type IDrawingMark (line 1) | interface IDrawingMark {
type IDrawingImgInfo (line 11) | interface IDrawingImgInfo {
type IDrawing (line 16) | interface IDrawing {
type DxfLayer (line 28) | interface DxfLayer{
type DxfLayers (line 37) | interface DxfLayers{
type Data (line 41) | interface Data {
FILE: packages/editor/types/naive-ui.d.ts
type UploadFileInfo (line 2) | interface UploadFileInfo {
type uploadOption (line 12) | interface uploadOption {
FILE: packages/editor/types/network.d.ts
type RequestErrorType (line 8) | type RequestErrorType = 'axios' | 'http' | 'backend';
type RequestError (line 11) | interface RequestError {
type BackendResultConfig (line 21) | interface BackendResultConfig {
type SuccessResult (line 33) | interface SuccessResult<T = any> {
type FailedResult (line 41) | interface FailedResult {
type RequestResult (line 49) | type RequestResult<T = any> = SuccessResult<T> | FailedResult;
type MultiRequestResult (line 52) | type MultiRequestResult<T extends any[]> = T extends [infer First, ...in...
type ServiceAdapter (line 63) | type ServiceAdapter<T = any, A extends any[] = any> = (...args: A) => T;
type ListPageResult (line 66) | interface ListPageResult<T> {
type ListPageQueryParams (line 75) | interface ListPageQueryParams {
type WebSocketMessage (line 85) | interface WebSocketMessage<T>{
type Bim2GltfWsData (line 97) | interface Bim2GltfWsData{
FILE: packages/editor/types/particle.d.ts
type Config (line 2) | interface Config {
type Object3DJSON (line 164) | interface Object3DJSON {
type BoxZone (line 185) | interface BoxZone {
type LineZone (line 196) | interface LineZone {
type MeshZone (line 207) | interface MeshZone {
type PointZone (line 214) | interface PointZone {
type SphereZone (line 222) | interface SphereZone {
type RadialVelocity (line 231) | interface RadialVelocity {
type PolarVelocity (line 241) | interface PolarVelocity {
type VectorVelocity (line 250) | interface VectorVelocity {
FILE: packages/editor/types/plugin.d.ts
type Item (line 2) | interface Item {
type GLTFHandlerOptimizeModel (line 12) | interface GLTFHandlerOptimizeModel {
type PointCloudReconstructorModel (line 35) | interface PointCloudReconstructorModel {
FILE: packages/editor/types/scene.d.ts
type ISceneInfo (line 1) | interface ISceneInfo {
type ISceneScript (line 23) | interface ISceneScript {
type ISceneJson (line 28) | interface ISceneJson {
type ISceneFetchData (line 87) | interface ISceneFetchData extends ISceneInfo {
FILE: packages/editor/types/script.d.ts
type IStruct (line 2) | interface IStruct {
FILE: packages/editor/types/three.d.ts
type Object3D (line 7) | interface Object3D extends THREE.Object3D{
FILE: packages/editor/types/window.d.ts
type Window (line 1) | interface Window {
type Number (line 18) | interface Number{
type StrategyAction (line 27) | type StrategyAction = [boolean, () => void];
FILE: packages/sdk/lib/constant/enum.ts
constant POSITION (line 4) | const POSITION = {
constant FPS_OPTIONS (line 21) | const FPS_OPTIONS = {
constant ROAMING_CHARACTERS (line 37) | const ROAMING_CHARACTERS = {
FILE: packages/sdk/lib/constant/type.ts
constant TYPED_ARRAYS (line 3) | const TYPED_ARRAYS = {
constant BASE64_TYPES (line 16) | const BASE64_TYPES = {
constant TEXTURE_MAPPING (line 36) | const TEXTURE_MAPPING = {
constant TEXTURE_WRAPPING (line 45) | const TEXTURE_WRAPPING = {
constant TEXTURE_FILTER (line 51) | const TEXTURE_FILTER = {
FILE: packages/sdk/lib/core/animation/AnimationManager.ts
class AnimationManager (line 7) | class AnimationManager {
method constructor (line 13) | constructor() {}
method hasExistingTrack (line 21) | hasExistingTrack(clip: THREE.AnimationClip, prop: string, object: THRE...
method createEmptyAnimation (line 59) | createEmptyAnimation(name: string, object: THREE.Object3D | null = nul...
method reClipAction (line 87) | reClipAction(action: THREE.AnimationAction, currentTime = 0) {
method update (line 129) | update(delta: number) {
FILE: packages/sdk/lib/core/animation/TimelineTrack.ts
type ITimelineKeyframe (line 16) | interface ITimelineKeyframe extends TimelineKeyframe {
type ITimelineRow (line 20) | interface ITimelineRow extends TimelineRow {
type ITimelineModel (line 27) | interface ITimelineModel extends TimelineModel {
type CustomEvents (line 32) | type CustomEvents = {
class TimelineTrack (line 38) | class TimelineTrack extends THREE.EventDispatcher<CustomEvents> {
method constructor (line 53) | constructor(container: HTMLDivElement, outlineContainer: HTMLDivElemen...
method _maxDuration (line 131) | get _maxDuration() {
method init (line 146) | init() {
method initEvent (line 173) | initEvent() {
method updateTrackLength (line 249) | updateTrackLength() {
method setRows (line 258) | setRows(rows: Array<ITimelineRow>) {
method setRowIsVisible (line 273) | setRowIsVisible(keys: string[], visible: boolean) {
method handleMixerUpdate (line 288) | handleMixerUpdate(mixer: THREE.AnimationMixer, delta: number) {
method deleteRow (line 312) | deleteRow(row: ITimelineRow) {
method addKeyframe (line 337) | addKeyframe(attr: string) {
method onKeyframeChanged (line 527) | onKeyframeChanged(args:TimelineKeyframeChangedEvent) {
method deleteSelectedKeyframes (line 561) | deleteSelectedKeyframes() {
method resize (line 582) | resize() {
method play (line 591) | play() {
method pause (line 609) | pause() {
method stop (line 636) | stop() {
method setOptions (line 655) | setOptions(_options: TimelineOptions) {
method dispose (line 660) | dispose() {
FILE: packages/sdk/lib/core/app/App.ts
class App (line 23) | class App {
method constructor (line 154) | constructor() {
method FPS (line 165) | get FPS(): number {
method FPS (line 173) | set FPS(fps: number) {
method setConfig (line 182) | setConfig(_config: Record<string, any>) {
method setScene (line 190) | setScene(scene: THREE.Scene) {
method clipAction (line 213) | clipAction(object: THREE.Object3D) {
method addObject (line 246) | addObject(object: THREE.Object3D, parent?: THREE.Object3D, index?: num...
method moveObject (line 288) | moveObject(object: THREE.Object3D, parent: THREE.Object3D, before: THR...
method nameObject (line 310) | nameObject(object: THREE.Object3D, name: string) {
method removeObject (line 319) | removeObject(object: THREE.Object3D) {
method addGeometry (line 340) | addGeometry(geometry: THREE.BufferGeometry) {
method setGeometryName (line 349) | setGeometryName(geometry: THREE.BufferGeometry, name: string) {
method addMaterial (line 358) | addMaterial(material: THREE.Material | THREE.Material[]) {
method addMaterialToRefCounter (line 374) | addMaterialToRefCounter(material: THREE.Material) {
method removeMaterial (line 395) | removeMaterial(material: THREE.Material | THREE.Material[]) {
method removeMaterialFromRefCounter (line 411) | removeMaterialFromRefCounter(material: THREE.Material) {
method getMaterialByUuid (line 428) | getMaterialByUuid(uuid: string) {
method setMaterialName (line 437) | setMaterialName(material: THREE.Material, name: string) {
method addTexture (line 446) | addTexture(texture: THREE.Texture) {
method addCamera (line 454) | addCamera(camera: THREE.Camera) {
method removeCamera (line 465) | removeCamera(camera: THREE.Camera | THREE.Object3D) {
method addHelper (line 477) | addHelper(object: any, helper?: THREE.Object3D) {
method removeHelper (line 514) | removeHelper(object: THREE.Object3D) {
method addScript (line 527) | addScript(object: THREE.Object3D, script: ISceneScript) {
method removeScript (line 536) | removeScript(object: THREE.Object3D, script: ISceneScript) {
method getObjectMaterial (line 545) | getObjectMaterial(object: THREE.Object3D, slot: number) {
method setObjectMaterial (line 560) | setObjectMaterial(object: THREE.Object3D, slot: number | undefined, ne...
method setViewportCamera (line 572) | setViewportCamera(uuid: string) {
method setViewportShading (line 581) | setViewportShading(value: string) {
method select (line 590) | select(object: THREE.Object3D) {
method selectById (line 598) | selectById(id: number) {
method selectByUuid (line 613) | selectByUuid(uuid: string) {
method deselect (line 625) | deselect() {
method lock (line 633) | lock(object?: THREE.Object3D | null) {
method unlock (line 647) | unlock() {
method focus (line 656) | focus(object: THREE.Object3D) {
method focusById (line 666) | focusById(id: number) {
method focusByUuid (line 676) | focusByUuid(uuid: string) {
method getObjectByUuid (line 690) | getObjectByUuid(uuid: string) {
method traverseMeshToArr (line 698) | traverseMeshToArr(object: THREE.Object3D) {
method getSceneWithoutIgnore (line 714) | getSceneWithoutIgnore() {
method createPBRMaterial (line 733) | createPBRMaterial(textures: { [type: string]: string | THREE.Texture }...
method clear (line 899) | clear() {
method fromJSON (line 932) | async fromJSON(sceneJson: ISceneJson) {
method toJSON (line 968) | toJSON() {
method execute (line 1003) | execute(cmd, optionalName?: string) {
method undo (line 1010) | undo() {
method redo (line 1017) | redo() {
FILE: packages/sdk/lib/core/app/modules/CSM.ts
class CSM (line 7) | class CSM {
method constructor (line 10) | constructor(options:IAppProject.CSM){
method enabled (line 14) | get enabled(){
method enabled (line 18) | set enabled(isEnabled:boolean){
method reset (line 76) | reset() {
method setupMaterial (line 84) | setupMaterial(material:THREE.Material){
method updateProperty (line 91) | updateProperty(key,value){
method updateLightColor (line 101) | updateLightColor(color: string){
method updateLightIntensity (line 111) | updateLightIntensity(intensity: number){
method updateLightDirection (line 123) | updateLightDirection(direction: "x" | "y" | "z", value: number){
method updateFrustums (line 131) | updateFrustums(){
method update (line 139) | update(){
FILE: packages/sdk/lib/core/app/modules/Config.ts
class Config (line 11) | class Config {
method constructor (line 15) | constructor(storage: Storage) {
method setConfig (line 42) | setConfig(_config:Record<string, any>){
method syncStorage (line 51) | syncStorage(){
method getKey (line 78) | getKey(key:string): any {
method setKey (line 87) | setKey(key:string,value:unknown) {
method getShortcutItem (line 113) | getShortcutItem(key: string) {
method setShortcutItem (line 122) | setShortcutItem(key: string,value:any) {
method clear (line 127) | clear() {
FILE: packages/sdk/lib/core/app/modules/History.ts
type Undos (line 8) | interface Undos{
class History (line 25) | class History {
method constructor (line 31) | constructor() {
method execute (line 38) | execute( cmd, optionalName ) {
method undo (line 79) | undo() {
method redo (line 96) | redo():Undos |undefined {
method toJSON (line 114) | toJSON() {
method fromJSON (line 136) | fromJSON( json ) {
method clear (line 165) | clear() {
method goToState (line 173) | goToState( id:number ) {
method enableSerialization (line 199) | enableSerialization( id ) {
FILE: packages/sdk/lib/core/app/modules/Project.ts
class Project (line 208) | class Project {
method constructor (line 212) | constructor(app: App) {
method getKey (line 225) | getKey(key: string): any {
method setKey (line 235) | setKey(key: string, value: unknown,executeAction: boolean = true) {
method setDrawingSrc (line 334) | setDrawingSrc(src: string) {
method setDrawingLayerVisible (line 344) | setDrawingLayerVisible(layerName: string, visible: boolean) {
method setDrawingLayerAllVisible (line 352) | setDrawingLayerAllVisible(visible: boolean) {
method drawingMarkListChange (line 363) | drawingMarkListChange(type: "add" | "update", rect: IAppProject.Drawin...
method resetDrawing (line 380) | resetDrawing() {
method dispose (line 395) | dispose() {
FILE: packages/sdk/lib/core/app/modules/Resource.ts
class Resource (line 4) | class Resource{
method constructor (line 5) | constructor() { }
method loadURLTexture (line 7) | loadURLTexture(url: string | THREE.Texture, onload: (tex: THREE.Textur...
FILE: packages/sdk/lib/core/app/modules/Selector.ts
class Selector (line 7) | class Selector {
method constructor (line 17) | constructor() {
method select (line 71) | select(object:THREE.Object3D | null) {
method deselect (line 80) | deselect() {
FILE: packages/sdk/lib/core/app/modules/Storage.ts
class Storage (line 3) | class Storage {
method constructor (line 6) | constructor() {
method initDB (line 10) | initDB(){
method setModel (line 24) | setModel(key: string, value: any){
method getModel (line 28) | async getModel(key: string){
method removeModel (line 32) | removeModel(key: string){
method setOtherItem (line 36) | setOtherItem(key: string, value: any){
method getOtherItem (line 40) | async getOtherItem(key:string){
method removeOtherItem (line 44) | removeOtherItem(key: string){
method setConfigItem (line 48) | setConfigItem(key: string, value: any){
method getConfigItem (line 52) | async getConfigItem(key:string){
method removeConfigItem (line 56) | removeConfigItem(key: string){
FILE: packages/sdk/lib/core/built-in/assets/BasicObject3D.ts
function Group (line 6) | function Group() {
function Box (line 14) | function Box() {
function Capsule (line 23) | function Capsule() {
function Circle (line 33) | function Circle() {
function Cylinder (line 42) | function Cylinder() {
function Dodecahedron (line 51) | function Dodecahedron() {
function Icosahedron (line 60) | function Icosahedron() {
function DoubleCone (line 69) | function DoubleCone() {
function Octahedron (line 81) | function Octahedron() {
function Plane (line 90) | function Plane() {
function Ring (line 100) | function Ring() {
function Sphere (line 109) | function Sphere() {
function Sprite (line 118) | function Sprite() {
function Tetrahedron (line 126) | function Tetrahedron() {
function Torus (line 135) | function Torus() {
function TorusKnot (line 144) | function TorusKnot() {
function Tube (line 153) | function Tube() {
function Teapot (line 169) | function Teapot() {
function AmbientLight (line 189) | function AmbientLight() {
function DirectionalLight (line 199) | function DirectionalLight() {
function HemisphereLight (line 213) | function HemisphereLight() {
function PointLight (line 227) | function PointLight() {
function Spotlight (line 239) | function Spotlight() {
function OrthographicCamera (line 258) | function OrthographicCamera() {
function PerspectiveCamera (line 267) | function PerspectiveCamera() {
FILE: packages/sdk/lib/core/built-in/assets/Particles.ts
class Particles (line 4) | class Particles {
method constructor (line 8) | constructor() { }
method smoke (line 11) | static smoke(initPosition = { x: 0, y: 0, z: 0 }) {
method fire (line 65) | static fire(initPosition = { x: 0, y: 0, z: 0 }) {
method fireLine (line 116) | static fireLine(initPosition = { x: 0, y: 0, z: 0 }) {
method firefly (line 174) | static firefly(initPosition = { x: 0, y: 0, z: 0 }) {
method fireworks (line 230) | static fireworks(initPosition = { x: 0, y: 0, z: 0 }) {
FILE: packages/sdk/lib/core/commands/AddObjectCommand.ts
class AddObjectCommand (line 9) | class AddObjectCommand extends Command {
method constructor (line 12) | constructor( object ) {
method execute (line 22) | execute() {
method undo (line 27) | undo() {
method toJSON (line 32) | toJSON() {
method fromJSON (line 38) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/AddScriptCommand.ts
class AddScriptCommand (line 11) | class AddScriptCommand extends Command {
method constructor (line 15) | constructor(object:Object3D, script) {
method execute (line 25) | execute() {
method undo (line 35) | undo() {
method toJSON (line 47) | toJSON() {
method fromJSON (line 56) | fromJSON(json) {
FILE: packages/sdk/lib/core/commands/Command.ts
class Command (line 4) | class Command {
method constructor (line 11) | constructor() {
method toJSON (line 19) | toJSON() {
method fromJSON (line 27) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/MoveObjectCommand.ts
class MoveObjectCommand (line 11) | class MoveObjectCommand extends Command {
method constructor (line 19) | constructor(object, newParent, newBefore ) {
method execute (line 43) | execute() {
method undo (line 69) | undo() {
method toJSON (line 95) | toJSON() {
method fromJSON (line 107) | fromJSON(json) {
FILE: packages/sdk/lib/core/commands/RemoveObjectCommand.ts
class RemoveObjectCommand (line 9) | class RemoveObjectCommand extends Command {
method constructor (line 14) | constructor( object ) {
method execute (line 27) | execute() {
method undo (line 32) | undo() {
method toJSON (line 37) | toJSON() {
method fromJSON (line 46) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/RemoveScriptCommand.ts
class RemoveScriptCommand (line 11) | class RemoveScriptCommand extends Command {
method constructor (line 16) | constructor(object:Object3D, script) {
method execute (line 29) | execute() {
method undo (line 39) | undo() {
method toJSON (line 49) | toJSON() {
method fromJSON (line 59) | fromJSON(json) {
FILE: packages/sdk/lib/core/commands/SetColorCommand.ts
class SetColorCommand (line 11) | class SetColorCommand extends Command {
method constructor (line 17) | constructor(object, attributeName, newValue ) {
method execute (line 29) | execute() {
method undo (line 34) | undo() {
method update (line 39) | update( cmd ) {
method toJSON (line 43) | toJSON() {
method fromJSON (line 54) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetGeometryCommand.ts
class SetGeometryCommand (line 13) | class SetGeometryCommand extends Command {
method constructor (line 18) | constructor(object:Mesh, newGeometry:BufferGeometry) {
method execute (line 31) | execute() {
method undo (line 40) | undo() {
method update (line 49) | update(cmd: { newGeometry: BufferGeometry | InstancedBufferGeometry; }) {
method toJSON (line 53) | toJSON() {
method fromJSON (line 63) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetGeometryValueCommand.ts
class SetGeometryValueCommand (line 11) | class SetGeometryValueCommand extends Command {
method constructor (line 17) | constructor(object, attributeName, newValue ) {
method execute (line 30) | execute() {
method undo (line 37) | undo() {
method toJSON (line 44) | toJSON() {
method fromJSON (line 54) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetMaterialColorCommand.ts
class SetMaterialColorCommand (line 11) | class SetMaterialColorCommand extends Command {
method constructor (line 18) | constructor(object, attributeName, newValue, materialSlot ) {
method execute (line 34) | execute() {
method undo (line 39) | undo() {
method update (line 44) | update( cmd ) {
method toJSON (line 48) | toJSON() {
method fromJSON (line 59) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetMaterialCommand.ts
class SetMaterialCommand (line 11) | class SetMaterialCommand extends Command {
method constructor (line 17) | constructor(object, newMaterial, materialSlot? ) {
method execute (line 30) | execute() {
method undo (line 35) | undo() {
method toJSON (line 40) | toJSON() {
method fromJSON (line 48) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetMaterialMapCommand.ts
class SetMaterialMapCommand (line 12) | class SetMaterialMapCommand extends Command {
method constructor (line 19) | constructor( object, mapName, newMap, materialSlot ) {
method execute (line 34) | execute() {
method undo (line 43) | undo() {
method toJSON (line 50) | toJSON() {
method fromJSON (line 102) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetMaterialRangeCommand.ts
class SetMaterialRangeCommand (line 12) | class SetMaterialRangeCommand extends Command {
method constructor (line 19) | constructor(object, attributeName, newMinValue, newMaxValue, materialS...
method execute (line 35) | execute() {
method undo (line 43) | undo() {
method update (line 51) | update( cmd ) {
method toJSON (line 55) | toJSON() {
method fromJSON (line 66) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetMaterialValueCommand.ts
class SetMaterialValueCommand (line 11) | class SetMaterialValueCommand extends Command {
method constructor (line 18) | constructor(object, attributeName, newValue, materialSlot = 0 ) {
method execute (line 34) | execute() {
method undo (line 41) | undo() {
method update (line 49) | update( cmd ) {
method toJSON (line 53) | toJSON() {
method fromJSON (line 64) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetMaterialVectorCommand.ts
class SetMaterialVectorCommand (line 5) | class SetMaterialVectorCommand extends Command {
method constructor (line 12) | constructor(object, attributeName, newValue, materialSlot) {
method attribute (line 28) | get attribute() {
method execute (line 32) | execute() {
method undo (line 37) | undo() {
method update (line 42) | update( cmd ) {
method toJSON (line 46) | toJSON() {
method fromJSON (line 57) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetPositionCommand.ts
class SetPositionCommand (line 12) | class SetPositionCommand extends Command {
method constructor (line 17) | constructor(object, newValue, optionaloldValue? ) {
method execute (line 34) | execute() {
method undo (line 40) | undo() {
method update (line 46) | update( command ) {
method toJSON (line 50) | toJSON() {
method fromJSON (line 60) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetRotationCommand.ts
class SetRotationCommand (line 12) | class SetRotationCommand extends Command {
method constructor (line 17) | constructor(object, newValue, optionaloldValue ) {
method execute (line 36) | execute() {
method undo (line 42) | undo() {
method update (line 48) | update( command ) {
method toJSON (line 52) | toJSON() {
method fromJSON (line 62) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetScaleCommand.ts
class SetScaleCommand (line 12) | class SetScaleCommand extends Command {
method constructor (line 17) | constructor(object, newValue, optionaloldValue ) {
method execute (line 36) | execute() {
method undo (line 42) | undo() {
method update (line 48) | update( command ) {
method toJSON (line 52) | toJSON() {
method fromJSON (line 62) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetSceneCommand.ts
class SetSceneCommand (line 15) | class SetSceneCommand extends Command {
method constructor (line 17) | constructor(scene:Scene) {
method execute (line 37) | execute() {
method undo (line 48) | undo() {
method toJSON (line 59) | toJSON() {
method fromJSON (line 72) | fromJSON(json) {
FILE: packages/sdk/lib/core/commands/SetScriptValueCommand.ts
class SetScriptValueCommand (line 13) | class SetScriptValueCommand extends Command {
method constructor (line 20) | constructor(object:Object3D, script:IScript.IStruct, attributeName:str...
method execute (line 35) | execute() {
method undo (line 41) | undo() {
method update (line 47) | update(cmd) {
method toJSON (line 51) | toJSON() {
method fromJSON (line 63) | fromJSON(json) {
FILE: packages/sdk/lib/core/commands/SetUuidCommand.ts
class SetUuidCommand (line 10) | class SetUuidCommand extends Command {
method constructor (line 15) | constructor(object, newValue ) {
method execute (line 28) | execute() {
method undo (line 34) | undo() {
method toJSON (line 40) | toJSON() {
method fromJSON (line 48) | fromJSON( json ) {
FILE: packages/sdk/lib/core/commands/SetValueCommand.ts
class SetValueCommand (line 11) | class SetValueCommand extends Command {
method constructor (line 17) | constructor(object, attributeName, newValue) {
method execute (line 31) | execute() {
method undo (line 37) | undo() {
method update (line 43) | update( cmd ) {
method toJSON (line 47) | toJSON() {
method fromJSON (line 58) | fromJSON( json ) {
FILE: packages/sdk/lib/core/controls/DragControls.js
class DragControls (line 19) | class DragControls extends EventDispatcher {
method constructor (line 20) | constructor( _objects, _camera, _domElement ) {
FILE: packages/sdk/lib/core/expansion/Object3D.ts
function serialize (line 151) | function serialize(library, element) {
function extractFromCache (line 277) | function extractFromCache(cache) {
FILE: packages/sdk/lib/core/geometries/TeapotGeometry.ts
class TeapotGeometry (line 15) | class TeapotGeometry extends BufferGeometry {
method parameters (line 18) | get parameters(): { size: number; bottom: boolean; lid: boolean; blinn...
method constructor (line 22) | constructor( size = 50, segments = 10, bottom = true, lid = true, body...
method copy (line 677) | copy( source ) {
method fromJSON (line 685) | static fromJSON(data) {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineCapShape.ts
type TimelineCapShape (line 1) | enum TimelineCapShape {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineCursorType.ts
type TimelineCursorType (line 1) | enum TimelineCursorType {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineElementType.ts
type TimelineElementType (line 4) | enum TimelineElementType {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineEventSource.ts
type TimelineEventSource (line 1) | enum TimelineEventSource {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineEvents.ts
type TimelineEvents (line 4) | enum TimelineEvents {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineInteractionMode.ts
type TimelineInteractionMode (line 1) | enum TimelineInteractionMode {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineKeyframeShape.ts
type TimelineKeyframeShape (line 1) | enum TimelineKeyframeShape {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineScrollSource.ts
type TimelineScrollSource (line 1) | enum TimelineScrollSource {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineSelectionEventSource.ts
type TimelineSelectionEventSource (line 4) | enum TimelineSelectionEventSource {
FILE: packages/sdk/lib/core/libs/astral-timeline/enums/timelineSelectionMode.ts
type TimelineSelectionMode (line 4) | enum TimelineSelectionMode {
FILE: packages/sdk/lib/core/libs/astral-timeline/models/timelineGroup.ts
type TimelineGroup (line 6) | interface TimelineGroup {
FILE: packages/sdk/lib/core/libs/astral-timeline/models/timelineKeyframe.ts
type TimelineKeyframe (line 6) | interface TimelineKeyframe extends TimelineSelectable, TimelineRanged {
FILE: packages/sdk/lib/core/libs/astral-timeline/models/timelineModel.ts
type TimelineModel (line 2) | interface TimelineModel {
FILE: packages/sdk/lib/core/libs/astral-timeline/models/timelineRanged.ts
type TimelineRanged (line 1) | interface TimelineRanged {
FILE: packages/sdk/lib/core/libs/astral-timeline/models/timelineRow.ts
type TimelineRow (line 5) | interface TimelineRow extends TimelineRanged {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/styles/timelineCapStyle.ts
type TimelineCapStyle (line 6) | interface TimelineCapStyle {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/styles/timelineGroupStyle.ts
type TimelineGroupStyle (line 7) | interface TimelineGroupStyle {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/styles/timelineKeyframeStyle.ts
type TimelineKeyframeStyle (line 4) | interface TimelineKeyframeStyle {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/styles/timelineRowStyle.ts
type TimelineRowStyle (line 7) | interface TimelineRowStyle {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/styles/timelineStyle.ts
type TimelineStyle (line 7) | interface TimelineStyle {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/timelineConsts.ts
type TimelineConsts (line 5) | interface TimelineConsts {
FILE: packages/sdk/lib/core/libs/astral-timeline/settings/timelineOptions.ts
type TimelineOptions (line 5) | interface TimelineOptions extends TimelineRanged {
FILE: packages/sdk/lib/core/libs/astral-timeline/timeline.ts
class Timeline (line 56) | class Timeline extends TimelineEventsEmitter {
method constructor (line 169) | constructor(options: TimelineOptions | null = null, model: TimelineMod...
method _getCtx (line 262) | _getCtx(): CanvasRenderingContext2D | null {
method _moveElements (line 811) | _moveElements(offset: number, elements: TimelineElementDragState[], so...
method _forEachKeyframe (line 1177) | _forEachKeyframe(callback: (keyframe: TimelineKeyframeViewModel, index...
method _trackMousePos (line 1212) | _trackMousePos(canvas: HTMLCanvasElement, mouseArgs: MouseEvent | Touc...
method getClientWidth (line 1246) | getClientWidth(): number {
method getClientHeight (line 1252) | getClientHeight(): number {
method _cleanUpSelection (line 1255) | _cleanUpSelection(forcePrevent = false): void {
method _clickTimeoutIsOver (line 1275) | _clickTimeoutIsOver(): boolean {
method _checkUpdateSpeedTooFast (line 1313) | _checkUpdateSpeedTooFast(): boolean {
method _scrollByPan (line 1326) | _scrollByPan(start: DOMPoint, pos: DOMPoint, scrollStartPos: DOMPoint ...
method _scrollBySelectionOutOfBounds (line 1351) | _scrollBySelectionOutOfBounds(pos: DOMPoint): boolean {
method pxToVal (line 1418) | public pxToVal(px: number): number {
method snapVal (line 1467) | public snapVal(val: number): number {
method scrollLeft (line 2353) | public get scrollLeft(): number {
method scrollLeft (line 2356) | public set scrollLeft(value: number) {
method scrollTop (line 2362) | public get scrollTop(): number {
method scrollTop (line 2366) | public set scrollTop(value: number) {
FILE: packages/sdk/lib/core/libs/astral-timeline/timelineEventsEmitter.ts
type TimelineEvent (line 2) | interface TimelineEvent {
class TimelineEventsEmitter (line 10) | class TimelineEventsEmitter {
method on (line 21) | on<T>(topic: string, callback: (args: T) => void): boolean {
method off (line 35) | off<T>(topic: string, callback: (args: T) => void): boolean {
method offAll (line 46) | offAll(): void {
method emit (line 56) | emit<T>(topic: string, args: T): void {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineBaseEvent.ts
class TimelineBaseEvent (line 4) | class TimelineBaseEvent {
method preventDefault (line 9) | preventDefault(): void {
method isPrevented (line 13) | isPrevented(): boolean {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineClickEvent.ts
class TimelineClickEvent (line 5) | class TimelineClickEvent extends TimelineBaseEvent {
method pos (line 10) | get pos(): DOMPoint | null {
method val (line 13) | get val(): number {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineDragEvent.ts
class TimelineDragEvent (line 5) | class TimelineDragEvent extends TimelineBaseEvent {
method pos (line 7) | get pos(): DOMPoint | null {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineKeyframeChangedEvent.ts
class TimelineKeyframeChangedEvent (line 5) | class TimelineKeyframeChangedEvent extends TimelineBaseEvent {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineScrollEvent.ts
type TimelineScrollEvent (line 1) | interface TimelineScrollEvent {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineSelectedEvent.ts
class TimelineSelectedEvent (line 4) | class TimelineSelectedEvent {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/events/timelineTimeChangedEvent.ts
class TimelineTimeChangedEvent (line 4) | class TimelineTimeChangedEvent extends TimelineBaseEvent {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineCutBoundsRectResults.ts
type TimelineCutBoundsRectResults (line 4) | interface TimelineCutBoundsRectResults {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineDraggableData.ts
class TimelineDraggableData (line 7) | class TimelineDraggableData {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineElement.ts
type TimelineElement (line 9) | interface TimelineElement {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineElementDragState.ts
type TimelineElementDragState (line 3) | interface TimelineElementDragState extends TimelineElement {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineMouseData.ts
type TimelineMouseData (line 6) | interface TimelineMouseData extends TimelinePoint {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelinePoint.ts
type TimelinePoint (line 4) | interface TimelinePoint {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineSelectable.ts
type TimelineSelectable (line 4) | interface TimelineSelectable {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineSelectionResults.ts
type TimelineSelectionResults (line 3) | interface TimelineSelectionResults {
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineStyleUtils.ts
class TimelineStyleUtils (line 17) | class TimelineStyleUtils {
method getGroup (line 18) | static getGroup(groupModel: TimelineGroup | string | null | undefined)...
method getGroupStyle (line 25) | static getGroupStyle(groupModel: TimelineGroup | string | null | undef...
method getFirstSet (line 28) | static getFirstSet<T>(defaultValue: T, ...params: Array<T | undefined ...
method getValue (line 38) | static getValue<T>(defaultValue: T, returnFalseIfAnyFalse = false, ......
method getValueOrDefault (line 70) | static getValueOrDefault<T>(value: T, defaultValue: T): T | undefined {
method keyframeWidth (line 86) | static keyframeWidth(
method keyframeHeight (line 106) | static keyframeHeight(
method keyframeShape (line 126) | static keyframeShape(keyframe: TimelineKeyframe | null, group: Timelin...
method keyframeFillColor (line 145) | static keyframeFillColor(keyframe: TimelineKeyframe | null, group: Tim...
method keyframeSelectedFillColor (line 164) | static keyframeSelectedFillColor(keyframe: TimelineKeyframe | null, gr...
method keyframeStrokeThickness (line 184) | static keyframeStrokeThickness(keyframe: TimelineKeyframe | null, grou...
method keyframeStrokeColor (line 204) | static keyframeStrokeColor(keyframe: TimelineKeyframe | null, group: T...
method keyframeSelectedStrokeColor (line 223) | static keyframeSelectedStrokeColor(keyframe: TimelineKeyframe | null, ...
method groupHeight (line 243) | static groupHeight(options: TimelineOptions | null | undefined, group:...
method groupMarginTop (line 256) | static groupMarginTop(options: TimelineOptions | null | undefined, gro...
method groupFillColor (line 269) | static groupFillColor(options: TimelineOptions | null | undefined, gro...
method groupStrokeColor (line 281) | static groupStrokeColor(options: TimelineOptions | null | undefined, g...
method groupStrokeThickness (line 294) | static groupStrokeThickness(options: TimelineOptions | null | undefine...
method groupsRadii (line 309) | static groupsRadii(
method groupText (line 328) | static groupText(options: TimelineOptions | null | undefined, group: T...
method getRowHeight (line 346) | static getRowHeight(rowStyle: TimelineRowStyle | null, options: Timeli...
method getRowMarginBottom (line 357) | static getRowMarginBottom(rowStyle: TimelineRowStyle | null, options: ...
method getRowFillColor (line 369) | static getRowFillColor(rowStyle: TimelineRowStyle | null, options: Tim...
method headerHeight (line 381) | static headerHeight(options: TimelineOptions | null, defaultRowHeight ...
method keyframeDraggable (line 384) | static keyframeDraggable(keyframe: TimelineKeyframe | null, group: Tim...
method groupDraggable (line 401) | static groupDraggable(group: TimelineGroup | string | null | undefined...
FILE: packages/sdk/lib/core/libs/astral-timeline/utils/timelineUtils.ts
class TimelineUtils (line 5) | class TimelineUtils {
method drawLine (line 6) | static drawLine(ctx: CanvasRenderingContext2D, x1: number, y1: number,...
method isNumber (line 13) | static isNumber(val?: number | null): boolean {
method deleteElement (line 20) | static deleteElement<T>(array: Array<T>, element: T): Array<T> {
method isOverlap (line 31) | static isOverlap(x: number, y: number, rectangle: DOMRect): boolean {
method findGoodStep (line 45) | static findGoodStep(originalStep: number, divisionCheck = 0, denominat...
method keepInBounds (line 78) | static keepInBounds(value: number, min: number | null | undefined = nu...
method setMinMax (line 90) | static setMinMax(to: TimelineRanged, from: TimelineRanged | null, shri...
method shrinkSelf (line 116) | static shrinkSelf(rect: DOMRect, value: number): DOMRect {
method isRectIntersects (line 129) | static isRectIntersects(rect: DOMRect, rect2: DOMRect, touch = false):...
method getDistance (line 169) | static getDistance(x1: number, y1: number, x2?: number, y2?: number): ...
method sign (line 180) | static sign(p: number): number {
method clearBrowserSelection (line 187) | static clearBrowserSelection(): void {
method getPowArgument (line 204) | static getPowArgument(toCheck: number): number {
method mergeOptions (line 253) | static mergeOptions(previousOptions: TimelineOptions, newOptions: Time...
method timePadZero (line 294) | static timePadZero(num: number, len = 2): string {
FILE: packages/sdk/lib/core/libs/astral-timeline/viewModels/timelineGroupViewModel.ts
type TimelineGroupViewModel (line 4) | interface TimelineGroupViewModel {
FILE: packages/sdk/lib/core/libs/astral-timeline/viewModels/timelineKeyframeViewModel.ts
type TimelineKeyframeViewModel (line 9) | interface TimelineKeyframeViewModel {
FILE: packages/sdk/lib/core/libs/astral-timeline/viewModels/timelineRowViewModel.ts
type TimelineRowViewModel (line 5) | interface TimelineRowViewModel {
FILE: packages/sdk/lib/core/libs/astral-timeline/viewModels/timelineViewModel.ts
type TimelineViewModel (line 4) | interface TimelineViewModel {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Alpha.js
class Alpha (line 11) | class Alpha extends Behaviour {
method constructor (line 22) | constructor(alphaA = 1, alphaB = null, life = Infinity, easing, isEnab...
method same (line 45) | get same() {
method same (line 56) | set same(same) {
method reset (line 73) | reset(alphaA = 1, alphaB = null, life, easing) {
method initialize (line 87) | initialize(particle) {
method mutate (line 102) | mutate(particle, time, index) {
method fromJSON (line 122) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Attraction.js
class Attraction (line 11) | class Attraction extends Behaviour {
method constructor (line 23) | constructor(targetPosition = new Vector3D(), force = DEFAULT_ATTRACTIO...
method reset (line 74) | reset(targetPosition = new Vector3D(), force = DEFAULT_ATTRACTION_FORC...
method mutate (line 93) | mutate(particle, time, index) {
method fromJSON (line 120) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Behaviour.js
class Behaviour (line 12) | class Behaviour {
method constructor (line 22) | constructor(life = Infinity, easing = DEFAULT_BEHAVIOUR_EASING, type =...
method reset (line 79) | reset(life = DEFAULT_LIFE, easing = DEFAULT_BEHAVIOUR_EASING) {
method life (line 90) | set life(life) {
method life (line 100) | get life() {
method normalizeForce (line 111) | normalizeForce(force) {
method normalizeValue (line 122) | normalizeValue(value) {
method initialize (line 133) | initialize(particle) {}
method applyBehaviour (line 148) | applyBehaviour(target, time, index) {
method mutate (line 165) | mutate(target, time, index) {}
method energize (line 178) | energize(particle, time) {
method destroy (line 201) | destroy() {}
method fromJSON (line 211) | fromJSON(json) {}
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Collision.js
class Collision (line 8) | class Collision extends Behaviour {
method constructor (line 20) | constructor(emitter, useMass, onCollide, life, easing, isEnabled = tru...
method reset (line 36) | reset(emitter, useMass, onCollide, life, easing) {
method mutate (line 55) | mutate(particle, time, index) {
method _getAverageMass (line 91) | _getAverageMass(particleA, particleB) {
method fromJSON (line 96) | fromJSON(json) {}
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Color.js
class Color (line 11) | class Color extends Behaviour {
method constructor (line 22) | constructor(colorA, colorB, life=Infinity, easing, isEnabled = true) {
method same (line 33) | get same() {
method same (line 44) | set same(same) {
method reset (line 51) | reset(colorA, colorB, life, easing) {
method initialize (line 58) | initialize(particle) {
method mutate (line 64) | mutate(particle, time, index) {
method fromJSON (line 89) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/CrossZone.js
class CrossZone (line 12) | class CrossZone extends Behaviour {
method constructor (line 22) | constructor(zone, crossType, life, easing, isEnabled) {
method reset (line 36) | reset(zone, crossType = DEFAULT_CROSS_TYPE, life, easing) {
method mutate (line 56) | mutate(particle, time, index) {
method fromJSON (line 68) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Force.js
class Force (line 10) | class Force extends Behaviour {
method constructor (line 22) | constructor(fx, fy, fz, life = Infinity, easing, isEnabled = true) {
method reset (line 35) | reset(fx, fy, fz) {
method mutate (line 58) | mutate(particle, time, index) {
method fromJSON (line 70) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Gravity.js
class Gravity (line 9) | class Gravity extends Force {
method constructor (line 19) | constructor(gravity, life, easing, isEnabled = true) {
method fromJSON (line 29) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/RandomDrift.js
class RandomDrift (line 11) | class RandomDrift extends Behaviour {
method constructor (line 23) | constructor(driftX, driftY, driftZ, delay = DEFAULT_RANDOM_DRIFT_DELAY...
method reset (line 45) | reset(driftX, driftY, driftZ, delay = DEFAULT_RANDOM_DRIFT_DELAY, life...
method mutate (line 70) | mutate(particle, time, index) {
method fromJSON (line 83) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Repulsion.js
class Repulsion (line 10) | class Repulsion extends Attraction {
method constructor (line 21) | constructor(targetPosition, force, radius, life, easing, isEnabled = t...
method reset (line 48) | reset(targetPosition, force, radius, life, easing) {
method fromJSON (line 66) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Rotate.js
class Rotate (line 10) | class Rotate extends Behaviour {
method constructor (line 22) | constructor(x, y, z, life = Infinity, easing, isEnabled = true) {
method rotationType (line 33) | get rotationType() {
method rotationType (line 44) | set rotationType(rotationType) {
method reset (line 63) | reset(x, y, z, life, easing) {
method initialize (line 105) | initialize(particle) {
method _setRotation (line 146) | _setRotation(particleRotation, value) {
method mutate (line 172) | mutate(particle, time, index) {
method fromJSON (line 201) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Scale.js
class Scale (line 10) | class Scale extends Behaviour {
method constructor (line 21) | constructor(scaleA, scaleB, life=Infinity, easing, isEnabled = true) {
method same (line 32) | get same() {
method same (line 43) | set same(same) {
method reset (line 60) | reset(scaleA, scaleB, life, easing) {
method initialize (line 85) | initialize(particle) {
method mutate (line 101) | mutate(particle, time, index) {
method fromJSON (line 119) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/Spring.js
class Spring (line 10) | class Spring extends Behaviour {
method constructor (line 24) | constructor(x, y, z, spring, friction, life = Infinity, easing, isEnab...
method reset (line 40) | reset(x, y, z, spring, friction) {
method mutate (line 61) | mutate(particle, time, index) {
method fromJSON (line 75) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/constants.js
constant DEFAULT_LIFE (line 2) | const DEFAULT_LIFE = Infinity;
constant DEFAULT_ATTRACITON_RADIUS (line 3) | const DEFAULT_ATTRACITON_RADIUS = 1000;
constant DEFAULT_ATTRACTION_FORCE_SCALAR (line 4) | const DEFAULT_ATTRACTION_FORCE_SCALAR = 100;
constant DEFAULT_BEHAVIOUR_EASING (line 5) | const DEFAULT_BEHAVIOUR_EASING = easeLinear;
constant DEFAULT_BEHAVIOUR_EASING_TYPE (line 6) | const DEFAULT_BEHAVIOUR_EASING_TYPE = 'easeLinear';
constant DEFAULT_RANDOM_DRIFT_DELAY (line 7) | const DEFAULT_RANDOM_DRIFT_DELAY = 0.03;
constant PARTICLE_ALPHA_THRESHOLD (line 8) | const PARTICLE_ALPHA_THRESHOLD = 0.002;
constant PARTICLE_LENGTH_SQ_THRESHOLD (line 9) | const PARTICLE_LENGTH_SQ_THRESHOLD = 0.000004;
constant DEFAULT_CROSS_TYPE (line 10) | const DEFAULT_CROSS_TYPE = 'dead';
FILE: packages/sdk/lib/core/libs/three-nebula/behaviour/types.js
constant BEHAVIOUR_TYPE_ABSTRACT (line 1) | const BEHAVIOUR_TYPE_ABSTRACT = 'Behaviour';
constant BEHAVIOUR_TYPE_ALPHA (line 2) | const BEHAVIOUR_TYPE_ALPHA = 'Alpha';
constant BEHAVIOUR_TYPE_ATTRACTION (line 3) | const BEHAVIOUR_TYPE_ATTRACTION = 'Attraction';
constant BEHAVIOUR_TYPE_COLLISION (line 4) | const BEHAVIOUR_TYPE_COLLISION = 'Collision';
constant BEHAVIOUR_TYPE_COLOR (line 5) | const BEHAVIOUR_TYPE_COLOR = 'Color';
constant BEHAVIOUR_TYPE_CROSS_ZONE (line 6) | const BEHAVIOUR_TYPE_CROSS_ZONE = 'CrossZone';
constant BEHAVIOUR_TYPE_FORCE (line 7) | const BEHAVIOUR_TYPE_FORCE = 'Force';
constant BEHAVIOUR_TYPE_GRAVITY (line 8) | const BEHAVIOUR_TYPE_GRAVITY = 'Gravity';
constant BEHAVIOUR_TYPE_RANDOM_DRIFT (line 9) | const BEHAVIOUR_TYPE_RANDOM_DRIFT = 'RandomDrift';
constant BEHAVIOUR_TYPE_REPULSION (line 10) | const BEHAVIOUR_TYPE_REPULSION = 'Repulsion';
constant BEHAVIOUR_TYPE_ROTATE (line 11) | const BEHAVIOUR_TYPE_ROTATE = 'Rotate';
constant BEHAVIOUR_TYPE_SCALE (line 12) | const BEHAVIOUR_TYPE_SCALE = 'Scale';
constant BEHAVIOUR_TYPE_SPRING (line 13) | const BEHAVIOUR_TYPE_SPRING = 'Spring';
FILE: packages/sdk/lib/core/libs/three-nebula/constants/index.js
constant POOL_MAX (line 9) | const POOL_MAX = 500;
constant TIME_STEP (line 10) | const TIME_STEP = 60;
constant MEASURE (line 18) | const MEASURE = 100;
constant EULER (line 19) | const EULER = 'euler';
constant RK2 (line 20) | const RK2 = 'runge-kutta2';
constant RK4 (line 21) | const RK4 = 'runge-kutta4';
constant VERLET (line 22) | const VERLET = 'verlet';
constant BIND_EMITTER_EVENT (line 23) | const BIND_EMITTER_EVENT = false;
FILE: packages/sdk/lib/core/libs/three-nebula/core/Particle.js
class Particle (line 11) | class Particle {
method constructor (line 37) | constructor(properties) {
method getDirection (line 219) | getDirection() {
method reset (line 231) | reset() {
method update (line 271) | update(time, index) {
method addBehaviour (line 298) | addBehaviour(behaviour) {
method addBehaviours (line 310) | addBehaviours(behaviours) {
method removeBehaviour (line 325) | removeBehaviour(behaviour) {
method removeAllBehaviours (line 339) | removeAllBehaviours() {
method destroy (line 349) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/core/Pool.js
class Pool (line 9) | class Pool {
method constructor (line 15) | constructor() {
method create (line 44) | create(functionOrObject, ...constructorArgs) {
method canInstantiateObject (line 67) | canInstantiateObject(object) {
method canCloneObject (line 78) | canCloneObject(object) {
method canCreateNewObject (line 89) | canCreateNewObject(object) {
method getCount (line 99) | getCount() {
method get (line 115) | get(obj, ...args) {
method expire (line 130) | expire(obj) {
method destroy (line 140) | destroy() {
method _getList (line 154) | _getList(uid) {
FILE: packages/sdk/lib/core/libs/three-nebula/core/System.js
class System (line 17) | class System {
method constructor (line 26) | constructor(preParticles = POOL_MAX, integrationType = INTEGRATION_TYP...
method fromJSON (line 92) | static fromJSON(json, THREE) {
method fromJSONAsync (line 106) | static fromJSONAsync(json, THREE, options) {
method dispatch (line 117) | dispatch(event, target = this) {
method addRenderer (line 128) | addRenderer(renderer) {
method removeRenderer (line 141) | removeRenderer(renderer) {
method addEmitter (line 155) | addEmitter(emitter) {
method removeEmitter (line 172) | removeEmitter(emitter) {
method emit (line 196) | emit({
method update (line 257) | update(delta = DEFAULT_SYSTEM_DELTA) {
method getCount (line 283) | getCount() {
method destroy (line 303) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/core/constants.js
constant DEFAULT_LIFE (line 11) | const DEFAULT_LIFE = Infinity;
constant DEFAULT_AGE (line 17) | const DEFAULT_AGE = 0;
constant DEFAULT_ENERGY (line 23) | const DEFAULT_ENERGY = 1;
constant DEFAULT_DEAD (line 29) | const DEFAULT_DEAD = false;
constant DEFAULT_SLEEP (line 35) | const DEFAULT_SLEEP = false;
constant DEFAULT_INDEX (line 41) | const DEFAULT_INDEX = 0;
constant DEFAULT_BODY (line 47) | const DEFAULT_BODY = null;
constant DEFAULT_PARENT (line 53) | const DEFAULT_PARENT = null;
constant DEFAULT_MASS (line 59) | const DEFAULT_MASS = 1;
constant DEFAULT_RADIUS (line 65) | const DEFAULT_RADIUS = 10;
constant DEFAULT_ALPHA (line 71) | const DEFAULT_ALPHA = 1;
constant DEFAULT_SCALE (line 77) | const DEFAULT_SCALE = 1;
constant DEFAULT_USE_COLOR (line 83) | const DEFAULT_USE_COLOR = false;
constant DEFAULT_USE_ALPHA (line 89) | const DEFAULT_USE_ALPHA = false;
constant DEFAULT_EASING (line 95) | const DEFAULT_EASING = easeLinear;
constant DEFAULT_SYSTEM_DELTA (line 101) | const DEFAULT_SYSTEM_DELTA = 0.0167;
constant SUPPORTED_JSON_INITIALIZER_TYPES (line 107) | const SUPPORTED_JSON_INITIALIZER_TYPES = [INITIALIZER_TYPE_POSITION, INI...
constant SUPPORTED_JSON_BEHAVIOUR_TYPES (line 113) | const SUPPORTED_JSON_BEHAVIOUR_TYPES = [BEHAVIOUR_TYPE_ALPHA, BEHAVIOUR_...
constant SUPPORTED_JSON_RENDERER_TYPES (line 119) | const SUPPORTED_JSON_RENDERER_TYPES = [RENDERER_TYPE_SPRITE];
constant SUPPORTED_JSON_ZONE_TYPES (line 125) | const SUPPORTED_JSON_ZONE_TYPES = [ZONE_TYPE_BOX, ZONE_TYPE_LINE, ZONE_T...
FILE: packages/sdk/lib/core/libs/three-nebula/core/fromJSONAsync.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
constant DEFAULT_OPTIONS (line 13) | const DEFAULT_OPTIONS = {
FILE: packages/sdk/lib/core/libs/three-nebula/core/three/Euler.js
function Euler (line 11) | function Euler(x, y, z, order) {
FILE: packages/sdk/lib/core/libs/three-nebula/core/three/Matrix4.js
function Matrix4 (line 15) | function Matrix4() {
FILE: packages/sdk/lib/core/libs/three-nebula/core/three/Quaternion.js
function Quaternion (line 9) | function Quaternion(x, y, z, w) {
FILE: packages/sdk/lib/core/libs/three-nebula/core/three/Vector3.js
function Vector3 (line 12) | function Vector3(x, y, z) {
FILE: packages/sdk/lib/core/libs/three-nebula/core/types.js
constant CORE_TYPE_PARTICLE (line 1) | const CORE_TYPE_PARTICLE = 'Particle';
constant CORE_TYPE_POOL (line 2) | const CORE_TYPE_POOL = 'Pool';
constant CORE_TYPE_SYSTEM (line 3) | const CORE_TYPE_SYSTEM = 'System';
FILE: packages/sdk/lib/core/libs/three-nebula/debug/Debug.js
function getCreatedNumber (line 111) | function getCreatedNumber(type, system) {
function getEmitterPos (line 117) | function getEmitterPos(system) {
FILE: packages/sdk/lib/core/libs/three-nebula/debug/constants.js
constant DEFAULT_WIDTH (line 1) | const DEFAULT_WIDTH = 10;
constant DEFAULT_HEIGHT (line 2) | const DEFAULT_HEIGHT = 10;
constant DEFAULT_DEPTH (line 3) | const DEFAULT_DEPTH = 10;
constant DEFAULT_RADIUS (line 4) | const DEFAULT_RADIUS = 15;
constant DEFAULT_SIZE (line 5) | const DEFAULT_SIZE = 15;
constant DEFAULT_POSITION (line 6) | const DEFAULT_POSITION = 0;
FILE: packages/sdk/lib/core/libs/three-nebula/emitter/Emitter.js
class Emitter (line 15) | class Emitter extends Particle {
method constructor (line 22) | constructor(properties = {}) {
method dispatch (line 127) | dispatch(event, target = this) {
method setRate (line 138) | setRate(rate) {
method setPosition (line 150) | setPosition(newPosition = {}) {
method setRotation (line 170) | setRotation(newRotation = {}) {
method emit (line 193) | emit(totalEmitTimes = Infinity, life = Infinity) {
method experimental_emit (line 214) | experimental_emit() {
method setTotalEmitTimes (line 246) | setTotalEmitTimes(totalEmitTimes = Infinity) {
method setLife (line 258) | setLife(life = Infinity) {
method stopEmit (line 274) | stopEmit() {
method removeAllParticles (line 286) | removeAllParticles() {
method addInitializer (line 302) | addInitializer(initializer) {
method addInitializers (line 314) | addInitializers(initializers) {
method setInitializers (line 331) | setInitializers(initializers) {
method removeInitializer (line 343) | removeInitializer(initializer) {
method removeAllInitializers (line 359) | removeAllInitializers() {
method addBehaviour (line 372) | addBehaviour(behaviour) {
method addBehaviours (line 384) | addBehaviours(behaviours) {
method setBehaviours (line 401) | setBehaviours(behaviours) {
method removeBehaviour (line 413) | removeBehaviour(behaviour) {
method removeAllBehaviours (line 429) | removeAllBehaviours() {
method addEmitterBehaviour (line 441) | addEmitterBehaviour(behaviour) {
method addEmitterBehaviours (line 454) | addEmitterBehaviours(behaviours) {
method setEmitterBehaviours (line 471) | setEmitterBehaviours(behaviours) {
method removeEmitterBehaviour (line 489) | removeEmitterBehaviour(behaviour) {
method removeAllEmitterBehaviours (line 505) | removeAllEmitterBehaviours() {
method addOnEmitterDeadEventListener (line 517) | addOnEmitterDeadEventListener(onEmitterDead) {
method createParticle (line 529) | createParticle() {
method setupParticle (line 546) | setupParticle(particle, index) {
method update (line 571) | update(time) {
method updateEmitterBehaviours (line 614) | updateEmitterBehaviours(time) {
method integrate (line 634) | integrate(time) {
method generate (line 656) | generate(time) {
method destroy (line 693) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/emitter/FollowEmitter.js
class FollowEmitter (line 5) | class FollowEmitter extends Emitter {
method constructor (line 18) | constructor(mouseTarget, ease, pObj) {
method initEventHandler (line 32) | initEventHandler() {
method emit (line 55) | emit() {
method stopEmit (line 64) | stopEmit() {
method setCameraAndCanvas (line 68) | setCameraAndCanvas(camera, canvas) {
method mousemove (line 73) | mousemove(e) {
method destroy (line 91) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/emitter/constants.js
constant DEFAULT_DAMPING (line 2) | const DEFAULT_DAMPING = 0.006;
constant DEFAULT_BIND_EMITTER (line 3) | const DEFAULT_BIND_EMITTER = true;
constant DEFAULT_EMITTER_RATE (line 4) | const DEFAULT_EMITTER_RATE = new Rate(1, 0.1);
constant DEFAULT_BIND_EMITTER_EVENT (line 5) | const DEFAULT_BIND_EMITTER_EVENT = false;
constant DEFAULT_EMITTER_INDEX (line 6) | const DEFAULT_EMITTER_INDEX = undefined;
FILE: packages/sdk/lib/core/libs/three-nebula/emitter/types.js
constant EMITTER_TYPE_EMITTER (line 1) | const EMITTER_TYPE_EMITTER = 'Emitter';
constant EMITTER_TYPE_FOLLOW (line 2) | const EMITTER_TYPE_FOLLOW = 'FollowEmitter';
FILE: packages/sdk/lib/core/libs/three-nebula/events/EventDispatcher.js
class EventDispatcher (line 6) | class EventDispatcher {
method constructor (line 7) | constructor() {
method listeners (line 11) | set listeners(listeners) {
method listeners (line 15) | get listeners() {
method addEventListener (line 26) | addEventListener(type, listener,toTop = false) {
method removeEventListener (line 44) | removeEventListener(type, listener) {
method removeAllEventListeners (line 63) | removeAllEventListeners(type) {
method dispatchEvent (line 67) | dispatchEvent(eventName, eventTarget) {
method hasEventListener (line 89) | hasEventListener(type) {
FILE: packages/sdk/lib/core/libs/three-nebula/events/constants.js
constant SYSTEM_UPDATE (line 1) | const SYSTEM_UPDATE = 'SYSTEM_UPDATE';
constant PARTICLE_CREATED (line 2) | const PARTICLE_CREATED = 'PARTICLE_CREATED';
constant PARTICLE_UPDATE (line 3) | const PARTICLE_UPDATE = 'PARTICLE_UPDATE';
constant PARTICLE_DEAD (line 4) | const PARTICLE_DEAD = 'PARTICLE_DEAD';
constant EMITTER_ADDED (line 5) | const EMITTER_ADDED = 'EMITTER_ADDED';
constant EMITTER_REMOVED (line 6) | const EMITTER_REMOVED = 'EMITTER_REMOVED';
constant EMITTER_DEAD (line 7) | const EMITTER_DEAD = 'EMITTER_DEAD';
constant SYSTEM_UPDATE_AFTER (line 8) | const SYSTEM_UPDATE_AFTER = 'SYSTEM_UPDATE_AFTER';
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Body.js
class Body (line 9) | class Body extends Initializer {
method constructor (line 19) | constructor(body, w=null, h=null, isEnabled = true) {
method initialize (line 48) | initialize(particle) {
method fromJSON (line 72) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/BodySprite.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
class BodySprite (line 18) | class BodySprite extends Initializer {
method constructor (line 28) | constructor(THREE, texture, materialProperties = DEFAULT_MATERIAL_PROP...
method initialize (line 74) | initialize(particle) {
method fromJSON (line 88) | static fromJSON(json, THREE) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Initializer.js
class Initializer (line 8) | class Initializer {
method constructor (line 16) | constructor(type = INITIALIZER_TYPE_ABSTRACT, isEnabled = true) {
method init (line 30) | init(emitter, particle) {
method reset (line 48) | reset() {}
method initialize (line 57) | initialize(target) {}
method requiresWebGlApi (line 68) | static requiresWebGlApi() {
method fromJSON (line 80) | static fromJSON(json) {}
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Life.js
class Life (line 9) | class Life extends Initializer {
method constructor (line 19) | constructor(min, max, center, isEnabled = true) {
method initialize (line 36) | initialize(particle) {
method fromJSON (line 55) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Mass.js
class Mass (line 9) | class Mass extends Initializer {
method constructor (line 18) | constructor(min, max, center = false, isEnabled = true) {
method initialize (line 35) | initialize(particle) {
method fromJSON (line 49) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Position.js
class Position (line 13) | class Position extends Initializer {
method constructor (line 20) | constructor() {
method reset (line 33) | reset() {
method addZone (line 55) | addZone() {
method fromJSON (line 67) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Radius.js
class Radius (line 9) | class Radius extends Initializer {
method constructor (line 18) | constructor(width, height, center = false, isEnabled = true) {
method reset (line 38) | reset(width, height, center = false) {
method initialize (line 49) | initialize(particle) {
method fromJSON (line 64) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Rate.js
class Rate (line 14) | class Rate extends Initializer {
method constructor (line 22) | constructor(numPan = DEFAULT_RATE_NUM_PAN, timePan = DEFAULT_RATE_TIME...
method init (line 57) | init() {
method getValue (line 69) | getValue(time) {
method fromJSON (line 96) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Rotation.js
class Rotation (line 9) | class Rotation extends Initializer {
method constructor (line 20) | constructor(x, y, z, useEmitterRotation = true, isEnabled = true) {
method initialize (line 33) | initialize(particle) {
method fromJSON (line 42) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Texture.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
class Texture (line 16) | class Texture extends Initializer {
method constructor (line 25) | constructor(THREE, loadedTexture, materialProperties = DEFAULT_MATERIA...
method initialize (line 67) | initialize(particle) {
method fromJSON (line 81) | static fromJSON(json, THREE) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Velocity/PolarVelocity.js
class PolarVelocity (line 10) | class PolarVelocity extends Velocity {
method constructor (line 18) | constructor(polar3d, theta, isEnabled = true) {
method fromJSON (line 53) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Velocity/RadialVelocity.js
class RadialVelocity (line 10) | class RadialVelocity extends Velocity {
method constructor (line 19) | constructor(radius, vector3d, theta, isEnabled = true) {
method fromJSON (line 59) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Velocity/VectorVelocity.js
class VectorVelocity (line 10) | class VectorVelocity extends Velocity {
method constructor (line 18) | constructor(vector3d, theta, isEnabled = true) {
method fromJSON (line 57) | static fromJSON(json) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/Velocity/Velocity.js
class Velocity (line 9) | class Velocity extends Initializer {
method constructor (line 15) | constructor(type, isEnabled = true) {
method normalize (line 25) | normalize(vr) {
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/constants.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
constant SUPPORTED_MATERIAL_BLENDING_MODES (line 8) | const SUPPORTED_MATERIAL_BLENDING_MODES = {
constant DEFAULT_MATERIAL_PROPERTIES (line 16) | const DEFAULT_MATERIAL_PROPERTIES = {
constant DEFAULT_JSON_MATERIAL_PROPERTIES (line 21) | const DEFAULT_JSON_MATERIAL_PROPERTIES = _objectSpread(_objectSpread({},...
constant DEFAULT_RATE_NUM_PAN (line 24) | const DEFAULT_RATE_NUM_PAN = 1;
constant DEFAULT_RATE_TIME_PAN (line 25) | const DEFAULT_RATE_TIME_PAN = 1;
FILE: packages/sdk/lib/core/libs/three-nebula/initializer/types.js
constant INITIALIZER_TYPE_ABSTRACT (line 1) | const INITIALIZER_TYPE_ABSTRACT = 'Initializer';
constant INITIALIZER_TYPE_BODY (line 2) | const INITIALIZER_TYPE_BODY = 'Body';
constant INITIALIZER_TYPE_BODY_SPRITE (line 3) | const INITIALIZER_TYPE_BODY_SPRITE = 'BodySprite';
constant INITIALIZER_TYPE_TEXTURE (line 4) | const INITIALIZER_TYPE_TEXTURE = 'Texture';
constant INITIALIZER_TYPE_LIFE (line 5) | const INITIALIZER_TYPE_LIFE = 'Life';
constant INITIALIZER_TYPE_MASS (line 6) | const INITIALIZER_TYPE_MASS = 'Mass';
constant INITIALIZER_TYPE_POSITION (line 7) | const INITIALIZER_TYPE_POSITION = 'Position';
constant INITIALIZER_TYPE_ROTATION (line 8) | const INITIALIZER_TYPE_ROTATION = 'Rotation';
constant INITIALIZER_TYPE_RADIUS (line 9) | const INITIALIZER_TYPE_RADIUS = 'Radius';
constant INITIALIZER_TYPE_ZONE (line 10) | const INITIALIZER_TYPE_ZONE = 'Zone';
constant INITIALIZER_TYPE_VECTOR_VELOCITY (line 11) | const INITIALIZER_TYPE_VECTOR_VELOCITY = 'VectorVelocity';
constant INITIALIZER_TYPE_POLAR_VELOCITY (line 12) | const INITIALIZER_TYPE_POLAR_VELOCITY = 'PolarVelocity';
constant INITIALIZER_TYPE_RADIAL_VELOCITY (line 13) | const INITIALIZER_TYPE_RADIAL_VELOCITY = 'RadialVelocity';
constant INITIALIZER_TYPE_RATE (line 14) | const INITIALIZER_TYPE_RATE = 'Rate';
constant INITIALIZER_TYPES_THAT_REQUIRE_THREE (line 15) | const INITIALIZER_TYPES_THAT_REQUIRE_THREE = [INITIALIZER_TYPE_BODY_SPRI...
FILE: packages/sdk/lib/core/libs/three-nebula/math/ArraySpan.js
class ArraySpan (line 10) | class ArraySpan extends Span {
method constructor (line 17) | constructor(items) {
method getValue (line 39) | getValue() {
FILE: packages/sdk/lib/core/libs/three-nebula/math/Box.js
class Box (line 2) | class Box {
method constructor (line 3) | constructor(x, y, z, w, h, d) {
method contains (line 20) | contains(x, y, z) {
FILE: packages/sdk/lib/core/libs/three-nebula/math/ColorSpan.js
class ColorSpan (line 10) | class ColorSpan extends Span {
method constructor (line 18) | constructor(colors) {
method getValue (line 47) | getValue() {
FILE: packages/sdk/lib/core/libs/three-nebula/math/Polar3D.js
class Polar3D (line 3) | class Polar3D {
method constructor (line 4) | constructor(radius, theta, phi) {
method set (line 15) | set(radius, theta, phi) {
method setRadius (line 22) | setRadius(radius) {
method setPhi (line 27) | setPhi(phi) {
method setTheta (line 32) | setTheta(theta) {
method copy (line 37) | copy(p) {
method toVector3D (line 44) | toVector3D() {
method getX (line 48) | getX() {
method getY (line 52) | getY() {
method getZ (line 56) | getZ() {
method normalize (line 60) | normalize() {
method equals (line 65) | equals(v) {
method clear (line 69) | clear() {
method clone (line 76) | clone() {
FILE: packages/sdk/lib/core/libs/three-nebula/math/Span.js
class Span (line 4) | class Span {
method constructor (line 19) | constructor(a, b, center = false) {
method getValue (line 45) | getValue(INT) {
FILE: packages/sdk/lib/core/libs/three-nebula/math/Vector3D.js
class Vector3D (line 2) | class Vector3D extends Vector3 {
method clear (line 3) | clear() {
method scalar (line 10) | scalar(s) {
method addValue (line 17) | addValue(a, b, c) {
method toString (line 24) | toString() {
method eulerFromDir (line 28) | eulerFromDir(vector3D) {
FILE: packages/sdk/lib/core/libs/three-nebula/math/constants.js
constant INTEGRATION_TYPE_EULER (line 5) | const INTEGRATION_TYPE_EULER = 'EULER';
constant INTEGRATION_TYPE_RK2 (line 11) | const INTEGRATION_TYPE_RK2 = 'RUNGE_KUTTA_2';
constant INTEGRATION_TYPE_RK4 (line 17) | const INTEGRATION_TYPE_RK4 = 'RUNGE_KUTTA_4';
constant INTEGRATION_TYPE_VERLET (line 23) | const INTEGRATION_TYPE_VERLET = 'VERLET';
FILE: packages/sdk/lib/core/libs/three-nebula/math/types.js
constant MATH_TYPE_ARRAY_SPAN (line 1) | const MATH_TYPE_ARRAY_SPAN = 'ArraySpan';
constant MATH_TYPE_COLOR_SPAN (line 2) | const MATH_TYPE_COLOR_SPAN = 'ColorSpan';
constant MATH_TYPE_BOX (line 3) | const MATH_TYPE_BOX = 'Box';
constant MATH_TYPE_POLAR_3D (line 4) | const MATH_TYPE_POLAR_3D = 'Polar3D';
constant MATH_TYPE_SPAN (line 5) | const MATH_TYPE_SPAN = 'Span';
constant MATH_TYPE_VECTOR_3D (line 6) | const MATH_TYPE_VECTOR_3D = 'Vector3D';
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/BaseRenderer.js
class BaseRenderer (line 4) | class BaseRenderer {
method constructor (line 5) | constructor(type = RENDERER_TYPE_BASE) {
method init (line 13) | init(system) {
method remove (line 31) | remove() {
method onParticleCreated (line 39) | onParticleCreated(particle) {}
method onParticleUpdate (line 46) | onParticleUpdate(particle) {}
method onParticleDead (line 53) | onParticleDead(particle) {}
method onSystemUpdate (line 60) | onSystemUpdate(system) {}
method logRendererType (line 69) | logRendererType() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/CustomRenderer.js
class CustomRenderer (line 4) | class CustomRenderer extends BaseRenderer {
method constructor (line 5) | constructor() {
method onSystemUpdate (line 11) | onSystemUpdate() {}
method onParticleCreated (line 13) | onParticleCreated(particle) {}
method onParticleUpdate (line 16) | onParticleUpdate(particle) {}
method onParticleDead (line 19) | onParticleDead(particle) {}
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/Desktop/index.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
constant THREE (line 13) | let THREE;
class DesktopGPURenderer (line 21) | class DesktopGPURenderer extends BaseRenderer {
method constructor (line 22) | constructor(container, three, options = DEFAULT_RENDERER_OPTIONS) {
method onSystemUpdate (line 73) | onSystemUpdate(system) {
method onParticleCreated (line 86) | onParticleCreated(particle) {
method onParticleUpdate (line 101) | onParticleUpdate(particle) {
method onParticleDead (line 115) | onParticleDead(particle) {
method updateTarget (line 132) | updateTarget(particle) {
method mapParticleTargetPropsToPoint (line 173) | mapParticleTargetPropsToPoint(particle) {
method updatePointPosition (line 185) | updatePointPosition(particle) {
method updatePointSize (line 211) | updatePointSize(particle) {
method updatePointRotation (line 235) | updatePointRotation(particle) {
method updatePointColor (line 259) | updatePointColor(particle) {
method updatePointAlpha (line 285) | updatePointAlpha(particle) {
method updatePointTextureIndex (line 309) | updatePointTextureIndex(particle) {
method getTextureID (line 326) | getTextureID(texture, debug) {
method destroy (line 344) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/Mobile/index.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
constant THREE (line 13) | let THREE;
class MobileGPURenderer (line 21) | class MobileGPURenderer extends BaseRenderer {
method constructor (line 22) | constructor(container, three, options = DEFAULT_RENDERER_OPTIONS) {
method onSystemUpdate (line 75) | onSystemUpdate(system) {
method onParticleCreated (line 95) | onParticleCreated(particle) {
method onParticleUpdate (line 110) | onParticleUpdate(particle) {
method onParticleDead (line 124) | onParticleDead(particle) {
method updateTarget (line 141) | updateTarget(particle) {
method mapParticleTargetPropsToPoint (line 182) | mapParticleTargetPropsToPoint(particle) {
method updatePointPosition (line 194) | updatePointPosition(particle) {
method updatePointSize (line 220) | updatePointSize(particle) {
method updatePointRotation (line 244) | updatePointRotation(particle) {
method updatePointColor (line 268) | updatePointColor(particle) {
method updatePointAlpha (line 294) | updatePointAlpha(particle) {
method updatePointTextureIndex (line 318) | updatePointTextureIndex(particle) {
method getTextureID (line 350) | getTextureID(texture, debug) {
method destroy (line 362) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/ParticleBuffer/constants.js
constant DEFAULT_MAX_PARTICLES (line 2) | const DEFAULT_MAX_PARTICLES = 10000;
constant VECTOR_3_SIZE (line 3) | const VECTOR_3_SIZE = ['x', 'y', 'z'].length;
constant RGBA_SIZE (line 4) | const RGBA_SIZE = ['r', 'g', 'b', 'a'].length;
constant FLOAT_BYTE_SIZE (line 5) | const FLOAT_BYTE_SIZE = 4;
constant POSITION_BYTE_SIZE (line 7) | const POSITION_BYTE_SIZE = VECTOR_3_SIZE * FLOAT_BYTE_SIZE;
constant ROTATION_BYTE_SIZE (line 8) | const ROTATION_BYTE_SIZE = FLOAT_BYTE_SIZE;
constant SIZE_BYTE_SIZE (line 9) | const SIZE_BYTE_SIZE = FLOAT_BYTE_SIZE;
constant RGBA_BYTE_SIZE (line 10) | const RGBA_BYTE_SIZE = RGBA_SIZE * FLOAT_BYTE_SIZE;
constant ALL_BYTE_SIZES (line 11) | const ALL_BYTE_SIZES = [POSITION_BYTE_SIZE, ROTATION_BYTE_SIZE, SIZE_BYT...
constant PARTICLE_BYTE_SIZE (line 12) | const PARTICLE_BYTE_SIZE = ALL_BYTE_SIZES.reduce((cur, acc) => cur + acc);
constant POSITION_ATTRIBUTE_BUFFER_SIZE (line 14) | const POSITION_ATTRIBUTE_BUFFER_SIZE = VECTOR_3_SIZE;
constant ROTATION_ATTRIBUTE_BUFFER_SIZE (line 15) | const ROTATION_ATTRIBUTE_BUFFER_SIZE = 1;
constant SIZE_ATTRIBUTE_BUFFER_SIZE (line 16) | const SIZE_ATTRIBUTE_BUFFER_SIZE = 1;
constant RGBA_ATTRIBUTE_BUFFER_SIZE (line 17) | const RGBA_ATTRIBUTE_BUFFER_SIZE = RGBA_SIZE;
constant ALPHA_ATTRIBUTE_BUFFER_SIZE (line 18) | const ALPHA_ATTRIBUTE_BUFFER_SIZE = 1;
constant TEXID_ATTRIBUTE_BUFFER_SIZE (line 19) | const TEXID_ATTRIBUTE_BUFFER_SIZE = 2;
constant ATTRIBUTE_TO_SIZE_MAP (line 20) | const ATTRIBUTE_TO_SIZE_MAP = {
constant PARTICLE_STRIDE (line 29) | const PARTICLE_STRIDE = [POSITION_ATTRIBUTE_BUFFER_SIZE, ROTATION_ATTRIB...
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/ParticleBuffer/index.js
constant THREE (line 2) | let THREE;
class ParticleBuffer (line 12) | class ParticleBuffer {
method constructor (line 13) | constructor(maxParticles = DEFAULT_MAX_PARTICLES, three) {
method createInterleavedBuffer (line 25) | createInterleavedBuffer() {
method createBufferGeometry (line 41) | createBufferGeometry() {
method buffer (line 61) | get buffer() {
method stride (line 65) | get stride() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/TextureAtlas/constants.js
constant DATA_TEXTURE_SIZE (line 1) | const DATA_TEXTURE_SIZE = 256;
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/TextureAtlas/index.js
class TextureAtlas (line 11) | class TextureAtlas {
method constructor (line 12) | constructor(renderer, shouldDebug) {
method log (line 54) | log(...args) {
method debug (line 67) | debug() {
method addTexture (line 98) | addTexture(texture) {
method update (line 112) | update() {
method destroy (line 190) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/constants.js
constant DEFAULT_RENDERER_OPTIONS (line 2) | const DEFAULT_RENDERER_OPTIONS = {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/shaders/constants.js
constant SIZE_ATTENUATION_FACTOR (line 1) | const SIZE_ATTENUATION_FACTOR = '600.0';
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/stores/Target.js
class Target (line 5) | class Target {
method constructor (line 6) | constructor(THREE) {
method reset (line 16) | reset() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/common/stores/UniqueList.js
class UniqueList (line 4) | class UniqueList {
method constructor (line 5) | constructor(max = Infinity) {
method add (line 11) | add(item) {
method find (line 19) | find(item) {
method destroy (line 23) | destroy() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/GPURenderer/index.js
class GPURenderer (line 18) | class GPURenderer extends BaseRenderer {
method constructor (line 19) | constructor(container, THREE, options = DEFAULT_RENDERER_OPTIONS) {
method isFloatingPointTextureSupported (line 42) | isFloatingPointTextureSupported() {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/MeshRenderer.js
class MeshRenderer (line 9) | class MeshRenderer extends BaseRenderer {
method constructor (line 14) | constructor(container, THREE) {
method isThreeSprite (line 24) | isThreeSprite(particle) {
method onSystemUpdate (line 28) | onSystemUpdate() {}
method onParticleCreated (line 30) | onParticleCreated(particle) {
method onParticleUpdate (line 48) | onParticleUpdate(particle) {
method rotate (line 73) | rotate(particle) {
method scale (line 77) | scale(particle) {
method onParticleDead (line 81) | onParticleDead(particle) {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/SpriteRenderer.js
class SpriteRenderer (line 7) | class SpriteRenderer extends MeshRenderer {
method constructor (line 8) | constructor(container, THREE) {
method rotate (line 21) | rotate(particle) {
method scale (line 25) | scale(particle) {
FILE: packages/sdk/lib/core/libs/three-nebula/renderer/types.js
constant RENDERER_TYPE_BASE (line 1) | const RENDERER_TYPE_BASE = 'BaseRenderer';
constant RENDERER_TYPE_CUSTOM (line 2) | const RENDERER_TYPE_CUSTOM = 'CustomRenderer';
constant RENDERER_TYPE_SPRITE (line 3) | const RENDERER_TYPE_SPRITE = 'SpriteRenderer';
constant RENDERER_TYPE_MESH (line 4) | const RENDERER_TYPE_MESH = 'MeshRenderer';
constant RENDERER_TYPE_GPU (line 5) | const RENDERER_TYPE_GPU = 'GPURenderer';
constant RENDERER_TYPE_GPU_MOBILE (line 6) | const RENDERER_TYPE_GPU_MOBILE = 'MobileGPURenderer';
constant RENDERER_TYPE_GPU_DESKTOP (line 7) | const RENDERER_TYPE_GPU_DESKTOP = 'DesktopGPURenderer';
FILE: packages/sdk/lib/core/libs/three-nebula/utils/index.js
function ownKeys (line 3) | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object...
function _objectSpread (line 5) | function _objectSpread(target) { for (var i = 1; i < arguments.length; i...
FILE: packages/sdk/lib/core/libs/three-nebula/utils/isNumber.js
function isObjectLike (line 7) | function isObjectLike(value) {
function isNumber (line 11) | function isNumber(value) {
FILE: packages/sdk/lib/core/libs/three-nebula/utils/potpack.js
function potpack (line 2) | function potpack(boxes) {
FILE: packages/sdk/lib/core/libs/three-nebula/utils/sample.js
constant MAX_SAFE_INTEGER (line 1) | let MAX_SAFE_INTEGER = 9007199254740991;
function arrayMap (line 9) | function arrayMap(array, iteratee) {
function baseTimes (line 20) | function baseTimes(n, iteratee) {
function baseValues (line 30) | function baseValues(object, props) {
function overArg (line 36) | function overArg(func, transform) {
function arrayLikeKeys (line 54) | function arrayLikeKeys(value, inherited) {
function baseKeys (line 73) | function baseKeys(object) {
function baseRandom (line 86) | function baseRandom(lower, upper) {
function isIndex (line 90) | function isIndex(value, length) {
function isPrototype (line 97) | function isPrototype(value) {
function sample (line 104) | function sample(collection) {
function isArguments (line 111) | function isArguments(value) {
function isArrayLike (line 119) | function isArrayLike(value) {
function isArrayLikeObject (line 123) | function isArrayLikeObject(value) {
function isFunction (line 127) | function isFunction(value) {
function isLength (line 134) | function isLength(value) {
function isObject (line 139) | function isObject(value) {
function isObjectLike (line 144) | function isObjectLike(value) {
function keys (line 148) | function keys(object) {
function values (line 152) | function values(object) {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/BoxZone.js
class BoxZone (line 5) | class BoxZone extends Zone {
method constructor (line 21) | constructor(a, b, c, d, e, f) {
method isBoxZone (line 62) | isBoxZone() {
method getPosition (line 66) | getPosition() {
method _dead (line 73) | _dead(particle) {
method _bound (line 79) | _bound(particle) {
method _static (line 117) | _static(particle, axis) {
method _cross (line 126) | _cross(particle) {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/LineZone.js
class LineZone (line 4) | class LineZone extends Zone {
method constructor (line 20) | constructor(x1, y1, z1, x2, y2, z2) {
method isLineZone (line 48) | isLineZone() {
method getPosition (line 52) | getPosition() {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/MeshZone.js
class MeshZone (line 8) | class MeshZone extends Zone {
method constructor (line 16) | constructor(bounds, scale = 1) {
method isMeshZone (line 41) | isMeshZone() {
method getPosition (line 45) | getPosition() {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/PointZone.js
class PointZone (line 4) | class PointZone extends Zone {
method constructor (line 17) | constructor(a, b, c) {
method isPointZone (line 47) | isPointZone() {
method getPosition (line 51) | getPosition() {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/ScreenZone.js
class ScreenZone (line 5) | class ScreenZone extends Zone {
method constructor (line 15) | constructor(camera, renderer, dis, dir) {
method isScreenZone (line 31) | isScreenZone() {
method _dead (line 35) | _dead(particle) {
method _bound (line 52) | _bound(particle) {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/SphereZone.js
class SphereZone (line 11) | class SphereZone extends Zone {
method constructor (line 21) | constructor(centerX, centerY, centerZ, radius) {
method isSphereZone (line 54) | isSphereZone() {
method _dead (line 65) | _dead(particle) {
method _cross (line 76) | _cross() {
FILE: packages/sdk/lib/core/libs/three-nebula/zone/Zone.js
class Zone (line 13) | class Zone {
method constructor (line 20) | constructor(type = ZONE_TYPE_ABSTRACT) {
method getPosition (line 29) | getPosition() {
method crossing (line 33) | crossing(particle) {
method isBoxZone (line 62) | isBoxZone() {
method isLineZone (line 72) | isLineZone() {
method isMeshZone (line 82) | isMeshZone() {
method isPointZone (line 92) | isPointZone() {
method isScreenZone (line 102) | isScreenZone() {
method isSphereZone (line 112) | isSphereZone() {
method _dead (line 123) | _dead(particle) {}
method _bound (line 130) | _bound(particle) {}
method _cross (line 137) | _cross(particle) {}
FILE: packages/sdk/lib/core/libs/three-nebula/zone/types.js
constant ZONE_TYPE_ABSTRACT (line 1) | const ZONE_TYPE_ABSTRACT = 'Zone';
constant ZONE_TYPE_BOX (line 2) | const ZONE_TYPE_BOX = 'BoxZone';
constant ZONE_TYPE_LINE (line 3) | const ZONE_TYPE_LINE = 'LineZone';
constant ZONE_TYPE_MESH (line 4) | const ZONE_TYPE_MESH = 'MeshZone';
constant ZONE_TYPE_POINT (line 5) | const ZONE_TYPE_POINT = 'PointZone';
constant ZONE_TYPE_SCREEN (line 6) | const ZONE_TYPE_SCREEN = 'ScreenZone';
constant ZONE_TYPE_SPHERE (line 7) | const ZONE_TYPE_SPHERE = 'SphereZone';
FILE: packages/sdk/lib/core/loader/Loader.ts
function onEntryHandled (line 36) | function onEntryHandled() {
function handleEntry (line 48) | function handleEntry( entry ) {
class Loader (line 98) | class Loader {
method constructor (line 109) | constructor(){}
method objectLoader (line 111) | get objectLoader():ObjectLoader{
method objectLoader (line 119) | set objectLoader(value:ObjectLoader | null){
method dracoLoader (line 123) | get dracoLoader():DRACOLoader{
method dracoLoader (line 132) | set dracoLoader(value:DRACOLoader | null) {
method ktx2Loader (line 136) | get ktx2Loader():KTX2Loader{
method ktx2Loader (line 146) | set ktx2Loader(value:KTX2Loader | null) {
method exrLoader (line 150) | get exrLoader():EXRLoader{
method exrLoader (line 158) | set exrLoader(value:EXRLoader | null) {
method loadItemList (line 162) | loadItemList(items) {
method loadFiles (line 168) | loadFiles(files, filesMap): Promise<THREE.Object3D[]> {
method loadFile (line 224) | loadFile(file, manager:THREE.LoadingManager = new THREE.LoadingManager...
method handleJSON (line 777) | handleJSON(data,addToScene = true) {
method handleZIP (line 833) | async handleZIP(contents,addToScene = true) {
method createGLTFLoader (line 918) | async createGLTFLoader(manager?:THREE.LoadingManager) {
method disposeGLTFLoaderEffects (line 929) | disposeGLTFLoaderEffects(loader:any){
method loadUrlTexture (line 953) | loadUrlTexture(extension: string, url: string, onload?: (tex: THREE.Te...
FILE: packages/sdk/lib/core/loader/ObjectLoader.js
class ObjectLoader (line 13) | class ObjectLoader extends THREE.Loader {
method constructor (line 14) | constructor(manager) {
method load (line 18) | load(url, onLoad, onProgress, onError) {
method loadAsync (line 63) | async loadAsync(url, onProgress) {
method parse (line 91) | parse(json, onLoad) {
method parseAsync (line 137) | async parseAsync(json) {
method parseShapes (line 158) | parseShapes(json) {
method parseSkeletons (line 178) | parseSkeletons(json, object) {
method parseGeometries (line 209) | parseGeometries(json, shapes) {
method parseMaterials (line 259) | parseMaterials(json, textures) {
method parseAnimations (line 289) | parseAnimations(json) {
method parseImages (line 311) | parseImages(json, onLoad) {
method parseImagesAsync (line 426) | async parseImagesAsync(json) {
method parseTextures (line 522) | parseTextures(json, images) {
method parseObject (line 630) | parseObject(data, geometries, materials, textures, animations) {
method copyAttrByData (line 961) | copyAttrByData(object, data,geometries = {}, materials = {}, textures ...
method bindSkeletons (line 1048) | bindSkeletons(object, skeletons) {
method bindLightTargets (line 1074) | bindLightTargets(object) {
FILE: packages/sdk/lib/core/loader/Package.Skeleton.ts
class PackageSkeleton (line 9) | class PackageSkeleton{
method constructor (line 17) | constructor() {
method addBones (line 20) | addBones(bones:Bone[]){
method handleSkeletons (line 43) | handleSkeletons(skeletons,group:Object3D){
method clear (line 95) | clear(){
FILE: packages/sdk/lib/core/loader/Package.ts
type IPackConfig (line 24) | interface IPackConfig {
type IUnpackConfig (line 32) | interface IUnpackConfig {
type SourceData (line 39) | interface SourceData {
type GroupJson (line 47) | interface GroupJson {
class Package (line 56) | class Package {
method constructor (line 80) | constructor(viewer: Viewer) {
method handleImage (line 115) | handleImage(imageJson: ITHREEScene.ImageJSON, zipData: SourceData[]): ...
method handleMesh (line 141) | handleMesh(mesh: Mesh, json: ITHREEScene.SceneJSON, zipData: SourceDat...
method pack (line 234) | async pack(packConfig: IPackConfig) {
method zip (line 436) | private async zip(sourceData: SourceData[], zipName: string | number, ...
method unGzipImage (line 507) | private unGzipImage(imageName: string, data) {
method recordUuid (line 536) | private recordUuid(object3D) {
method unpack (line 558) | public unpack(unpackConfig: IUnpackConfig) {
method unpackGroup (line 859) | private unpackGroup(uuid: string, parent, rootGroupUuid) {
method dispose (line 1040) | dispose() {
FILE: packages/sdk/lib/core/objects/Billboard.ts
type BillboardEventMap (line 12) | interface BillboardEventMap extends THREE.Object3DEventMap {
class Billboard (line 73) | class Billboard extends THREE.Sprite<BillboardEventMap> {
method constructor (line 79) | constructor(options: IBillboard.options, material?: THREE.SpriteMateri...
method toJSON (line 151) | toJSON(meta?: THREE.JSONMeta) {
method fromJSON (line 165) | static fromJSON(json: { material: THREE.SpriteMaterial, options: IBill...
FILE: packages/sdk/lib/core/objects/HtmlPanel.ts
type IHtmlPanelOption (line 11) | interface IHtmlPanelOption {
class HtmlPanelConverter (line 24) | class HtmlPanelConverter {
method constructor (line 38) | private constructor() {
method getInstance (line 58) | public static getInstance(): HtmlPanelConverter {
method _createSandbox (line 66) | private _createSandbox() {
method loadAsync (line 155) | loadAsync(option: { url: string, isSprite: boolean, fileName?: string ...
method _validateResponse (line 248) | private _validateResponse(response: Response) {
method parseToCSS3D (line 257) | parseToCSS3D(options: IHtmlPanelOption) {
method _parseHtml (line 336) | private _parseHtml(content: string) {
method _processContent (line 342) | private _processContent(htmlDoc: Document) {
method _sanitizeContent (line 357) | private _sanitizeContent(content: HTMLElement) {
method _processScripts (line 373) | private async _processScripts(content: HTMLElement) {
method _getMimeType (line 417) | private _getMimeType(filename: string): string {
method _isEditable (line 445) | _isEditable(filePath: string): boolean {
method _replaceResourceUrls (line 451) | private _replaceResourceUrls(doc: Document, filesMap: Map<string, stri...
class HtmlPanel (line 500) | class HtmlPanel extends CSS3DObject {
method constructor (line 505) | constructor(element: HTMLElement, options: IHtmlPanelOption) {
method toJSON (line 514) | toJSON(meta?: JSONMeta) {
method fromJSON (line 534) | static fromJSON(data: any) {
class HtmlSprite (line 539) | class HtmlSprite extends CSS3DSprite {
method constructor (line 544) | constructor(element: HTMLElement, options: IHtmlPanelOption) {
method toJSON (line 553) | toJSON(meta?: JSONMeta) {
method fromJSON (line 573) | static fromJSON(data: any) {
FILE: packages/sdk/lib/core/objects/LineMesh.ts
function materialProxy (line 10) | function materialProxy(lineMesh: LineMesh) {
class LineMesh (line 28) | class LineMesh extends Mesh {
method constructor (line 29) | constructor(geometry = new BufferGeometry(), material: Material = new ...
FILE: packages/sdk/lib/core/objects/ParticleEmitter.ts
class ParticleEmitter (line 153) | class ParticleEmitter extends THREE.Object3D {
method constructor (line 158) | constructor(emitter: Particle.Emitter) {
method initEvent (line 173) | initEvent(){
method handleParticleCreated (line 194) | handleParticleCreated(particle){
method handleAddToParticleSystem (line 208) | handleAddToParticleSystem(_emitter: Particle.Emitter){
method syncProperties (line 217) | syncProperties() {
method proxyProperties (line 229) | proxyProperties() {
method getEmitterJSON (line 342) | getEmitterJSON() {
method fromJSON (line 557) | static fromJSON(json: IParticle.Object3DJSON) {
method toJSON (line 873) | toJSON(meta?: THREE.JSONMeta) {
method dispose (line 916) | dispose(){
FILE: packages/sdk/lib/core/objects/texture/BillboardTexture.ts
class BillboardTexture (line 11) | class BillboardTexture extends THREE.CanvasTexture {
method constructor (line 16) | constructor(options:IBillboard.options,image?:HTMLImageElement) {
method lines (line 62) | get lines() {
method font (line 68) | get font(){
method textWidth (line 72) | get textWidth(){
method textHeight (line 83) | get textHeight(){
method imageSize (line 90) | get imageSize(){
method width (line 97) | get width(){
method height (line 129) | get height(){
method loadImg (line 153) | async loadImg(image?:HTMLImageElement){
method redraw (line 210) | redraw(){
FILE: packages/sdk/lib/core/objects/weather/Rain.ts
type IRainOption (line 10) | interface IRainOption {
class Rain (line 18) | class Rain{
method constructor (line 23) | constructor(option: IRainOption, controls: CameraControls) {
method createMesh (line 41) | createMesh(){
method updatePosition (line 117) | updatePosition() {
method updateOptions (line 130) | updateOptions(option) {
method update (line 151) | update(deltaTime){
method dispose (line 159) | dispose(){
FILE: packages/sdk/lib/core/objects/weather/Snow.ts
type ISnowOption (line 10) | interface ISnowOption {
class Snow (line 17) | class Snow {
method constructor (line 22) | constructor(option: ISnowOption, controls: CameraControls) {
method createMesh (line 40) | createMesh() {
method updatePosition (line 146) | updatePosition() {
method updateOptions (line 162) | updateOptions(option) {
method update (line 173) | update(deltaTime) {
method dispose (line 181) | dispose() {
FILE: packages/sdk/lib/core/plugin/builtin/builtin.ts
class Builtin (line 9) | class Builtin{
method constructor (line 11) | constructor(pluginManager:PluginManager) {
FILE: packages/sdk/lib/core/plugin/plugin.ts
type Plugin (line 6) | interface Plugin {
class PluginManager (line 15) | class PluginManager {
method constructor (line 18) | constructor() {
method list (line 23) | get list(){
method loadAsync (line 39) | async loadAsync(pluginPaths: string | string[],autoUse = false){
method use (line 66) | use(plugin: Plugin, config?: any): this {
method getPlugin (line 82) | getPlugin<T extends Plugin>(pluginName: string): T | undefined {
method getPlugins (line 90) | getPlugins<T extends Plugin[]>(pluginNames: string[]): T | undefined {
method getStrings (line 98) | getStrings(names: string | string[]): string[] {
method traverse (line 111) | traverse(pluginNames: string | string[], callback: (data: { name: stri...
method run (line 126) | run(pluginNames: string | string[]) {
method uninstall (line 140) | uninstall(pluginNames: string | string[]): this {
FILE: packages/sdk/lib/core/plugin/pluginLoader.ts
function loadPluginAsync (line 9) | async function loadPluginAsync(src: string): Promise<any> {
FILE: packages/sdk/lib/core/points/PointCloudReconstructor.ts
class PointCloudReconstructor (line 10) | class PointCloudReconstructor {
method constructor (line 24) | constructor() {
method processGeometry (line 42) | processGeometry(geometry) {
method downsamplePoints (line 70) | downsamplePoints(points, resolution) {
method groupBySemanticColor (line 92) | groupBySemanticColor() {
method getColorKey (line 117) | getColorKey(color) {
method spatialClustering (line 129) | spatialClustering(points:THREE.Vector3[]) {
method getGridKey (line 197) | getGridKey(point, gridSize) {
method getNeighborCells (line 205) | getNeighborCells(point, gridSize) {
method reconstruct (line 226) | reconstruct(onProgress, onComplete) {
method dispose (line 328) | dispose(){
FILE: packages/sdk/lib/core/preview/Preview.ts
type PreviewerEventMap (line 22) | interface PreviewerEventMap {
type PreviewerModules (line 30) | interface PreviewerModules {
class Preview (line 49) | class Preview extends THREE.EventDispatcher<PreviewerEventMap> {
method constructor (line 62) | constructor(options: IPreviewSetting) {
method container (line 88) | get container(): HTMLElement {
method container (line 92) | set container(container: HTMLElement) {
method basicCreation (line 107) | basicCreation(){
method initModules (line 147) | initModules():PreviewerModules {
method loadEnv (line 161) | loadEnv(
method load (line 190) | load(fileOrUrl:string | File,type:string = "Model") {
method onResize (line 329) | onResize(){
method clear (line 353) | clear(){
method animate (line 364) | animate(){
method render (line 376) | render(){
method dispose (line 393) | dispose() {
method addParticle (line 436) | addParticle(emitter: Emitter, body: THREE.Sprite | THREE.Mesh, name: s...
method getViewportImage (line 453) | getViewportImage() {
FILE: packages/sdk/lib/core/script/Animation.ts
class Animation (line 4) | class Animation {
method constructor (line 17) | constructor(object:Object3D) {
method getActionsMap (line 27) | getActionsMap():Map<string, AnimationAction> {
method getAction (line 45) | getAction(name:string):AnimationAction | undefined {
method actions (line 49) | get actions():AnimationAction[] {
method play (line 56) | play(name:string, loop:AnimationActionLoopStyles = Animation.ActionLoo...
method pause (line 74) | pause(name:string | undefined):Animation {
method stop (line 92) | stop(name:string | undefined):Animation {
FILE: packages/sdk/lib/core/script/Helper.ts
class Helper (line 10) | class Helper {
method constructor (line 16) | constructor(scene: Scene) {
method objectByUuid (line 31) | objectByUuid(uuid: string) {
method moveObject (line 41) | moveObject(object: Object3D, parent: Object3D, before: Object3D) {
method removeObject (line 60) | removeObject(object: Object3D) {
FILE: packages/sdk/lib/core/shaderMaterial/ShaderMaterialManager.ts
type IShaderMaterialClass (line 11) | interface IShaderMaterialClass {
class ShaderMaterialManager (line 18) | class ShaderMaterialManager {
method constructor (line 22) | constructor() {
method needRender (line 37) | get needRender() {
method init (line 41) | init() {
method push (line 79) | push(sm: IShaderMaterialClass) {
method update (line 86) | update() {
FILE: packages/sdk/lib/core/shaderMaterial/modules/CircleGridShaderMaterial.ts
class CircleGridShaderMaterial (line 66) | class CircleGridShaderMaterial {
method Material (line 70) | static get Material() {
method Material (line 77) | static set Material(value: ShaderMaterial) {
method PreviewMaterial (line 81) | static get PreviewMaterial() {
method InstanceShaderMaterial (line 85) | static InstanceShaderMaterial(){
method Init (line 99) | static Init() {
method Update (line 107) | static Update() {
method UpdatePreview (line 113) | static UpdatePreview(previewMaterial: ShaderMaterial) {
FILE: packages/sdk/lib/core/shaderMaterial/modules/DynamicCheckerboardShaderMaterial.ts
class DynamicCheckerboardShaderMaterial (line 49) | class DynamicCheckerboardShaderMaterial {
method Material (line 53) | static get Material() {
method Material (line 60) | static set Material(value: ShaderMaterial) {
method PreviewMaterial (line 64) | static get PreviewMaterial() {
method InstanceShaderMaterial (line 68) | static InstanceShaderMaterial() {
method Init (line 84) | static Init() {
method Update (line 92) | static Update() {
method UpdatePreview (line 98) | static UpdatePreview(previewMaterial : ShaderMaterial) {
FILE: packages/sdk/lib/core/shaderMaterial/modules/FlickerShaderMaterial.ts
class FlickerShaderMaterial (line 31) | class FlickerShaderMaterial{
method Material (line 35) | static get Material() {
method Material (line 42) | static set Material(value: ShaderMaterial) {
method PreviewMaterial (line 46) | static get PreviewMaterial() {
method InstanceShaderMaterial (line 50) | static InstanceShaderMaterial(){
method Init (line 73) | static Init() {
method Update (line 81) | static Update() {
method UpdatePreview (line 87) | static UpdatePreview(previewMaterial: ShaderMaterial) {
FILE: packages/sdk/lib/core/shaderMaterial/modules/SlowSmokeShaderMaterial.ts
class SlowSmokeShaderMaterial (line 131) | class SlowSmokeShaderMaterial {
method Material (line 135) | static get Material() {
method Material (line 142) | static set Material(value: ShaderMaterial) {
method PreviewMaterial (line 146) | static get PreviewMaterial() {
method Resolution (line 150) | static get Resolution() {
method Resolution (line 155) | static set Resolution(value: Vector2) {
method InstanceShaderMaterial (line 159) | static InstanceShaderMaterial() {
method Init (line 174) | static Init() {
method Update (line 182) | static Update() {
method UpdatePreview (line 188) | static UpdatePreview(previewMaterial: ShaderMaterial) {
FILE: packages/sdk/lib/core/shaderMaterial/modules/SnowingShaderMaterial.ts
class SnowingShaderMaterial (line 114) | class SnowingShaderMaterial {
method Material (line 118) | static get Material() {
method Material (line 125) | static set Material(value) {
method PreviewMaterial (line 129) | static get PreviewMaterial() {
method Resolution (line 133) | static get Resolution() {
method Resolution (line 137) | static set Resolution(value) {
method InstanceShaderMaterial (line 141) | static InstanceShaderMaterial() {
method Init (line 172) | static Init() {
method Update (line 180) | static Update() {
method UpdatePreview (line 186) | static UpdatePreview(previewMaterial: ShaderMaterial) {
FILE: packages/sdk/lib/core/shaderMaterial/modules/StreamerWallShaderMaterial.ts
class StreamerWallShaderMaterial (line 35) | class StreamerWallShaderMaterial{
method Material (line 39) | static get Material() {
method Material (line 46) | static set Material(value: ShaderMaterial) {
method PreviewMaterial (line 50) | static get PreviewMaterial() {
method InstanceShaderMaterial (line 54) | static InstanceShaderMaterial(){
method Init (line 77) | static Init() {
method Update (line 85) | static Update() {
method UpdatePreview (line 91) | static UpdatePreview(previewMaterial: ShaderMaterial) {
FILE: packages/sdk/lib/core/tools/ClippedEdgesBox.ts
class ClippedEdgesBox (line 29) | class ClippedEdgesBox {
method constructor (line 40) | constructor(viewer:Viewer) {
method domElement (line 50) | get domElement(){
method setSectionBox (line 57) | protected setSectionBox() {
method objectSelected (line 72) | objectSelected(){
method open (line 81) | open() {
method close (line 93) | close() {
method reset (line 105) | reset() {
method dispose (line 112) | dispose() {
method initSectionBox (line 137) | protected initSectionBox() {
method initPlanes (line 156) | protected initPlanes() {
method updatePlanes (line 189) | protected updatePlanes() {
method initOrUpdateVertices (line 201) | protected initOrUpdateVertices() {
method initOrUpdateFaces (line 215) | protected initOrUpdateFaces() {
method initOrUpdateLines (line 245) | protected initOrUpdateLines() {
method clearSectionBox (line 288) | protected clearSectionBox() {
method addMouseListener (line 322) | private addMouseListener() {
method removeMouseListener (line 327) | private removeMouseListener() {
method updateMouseAndRay (line 335) | protected updateMouseAndRay(event: MouseEvent) {
class BoxLine (line 484) | class BoxLine extends LineSegments {
method constructor (line 492) | constructor(vertices: Array<Vector3>, faces: Array<BoxFace>) {
method setFromPoints (line 503) | setFromPoints(vertices: Vector3[]) {
method setActive (line 511) | setActive(isActive: boolean) {
class BoxFace (line 519) | class BoxFace extends Mesh {
method constructor (line 528) | constructor(axis: string, vertices: Array<Vector3>) {
method setFromPoints (line 544) | setFromPoints(vertices: Vector3[]) {
method setActive (line 552) | setActive(isActive: boolean) {
FILE: packages/sdk/lib/core/tools/Export.ts
class Export (line 4) | class Export {
method constructor (line 5) | constructor() {
method exportObjectToJSON (line 10) | exportObjectToJSON() {
method exportObjectToGlb (line 26) | async exportObjectToGlb() {
method exportObjectToGltf (line 48) | async exportObjectToGltf() {
method exportObjectToObj (line 67) | async exportObjectToObj() {
method exportObjectToPly (line 78) | async exportObjectToPly() {
method exportObjectToPlyBinary (line 95) | async exportObjectToPlyBinary() {
method exportObjectToStl (line 112) | async exportObjectToStl() {
method exportObjectToStlBinary (line 123) | async exportObjectToStlBinary() {
method exportObjectToUSDZ (line 134) | async exportObjectToUSDZ() {
method exportSceneToJSON (line 145) | exportSceneToJSON() {
method exportSceneToGlb (line 159) | async exportSceneToGlb(){
method exportSceneToGltf (line 178) | async exportSceneToGltf() {
method exportSceneToObj (line 195) | async exportSceneToObj() {
method exportSceneToPly (line 204) | async exportSceneToPly() {
method exportSceneToPlyBinary (line 219) | async exportSceneToPlyBinary() {
method exportSceneToStl (line 234) | async exportSceneToStl() {
method exportSceneToStlBinary (line 243) | async exportSceneToStlBinary() {
method exportSceneToUSDZ (line 252) | async exportSceneToUSDZ() {
FILE: packages/sdk/lib/core/tools/Measure.ts
type MeasureEventMap (line 6) | interface MeasureEventMap{
type MeasureMode (line 13) | enum MeasureMode {
class Measure (line 24) | class Measure extends THREE.EventDispatcher<MeasureEventMap>{
method constructor (line 70) | constructor(viewer:Viewer, mode: MeasureMode = MeasureMode.Distance) {
method domElement (line 89) | get domElement(): HTMLCanvasElement{
method canvas (line 93) | get canvas(): HTMLCanvasElement {
method addEvent (line 97) | addEvent() {
method removeEvent (line 108) | removeEvent() {
method open (line 120) | open() {
method redraw (line 155) | redraw(point: THREE.Sprite) {
method clear (line 195) | clear() {
method setFromPoints (line 230) | setFromPoints(geo: THREE.BufferGeometry, points: THREE.Vector3[]){
method initPointMarkerMaterial (line 244) | initPointMarkerMaterial() {
method createPointMarker (line 257) | createPointMarker(position?: THREE.Vector3): THREE.Sprite {
method createLine (line 280) | private createLine(): THREE.Line {
method createFaces (line 294) | private createFaces() {
method clearTemp (line 309) | clearTemp() {
method complete (line 319) | complete() {
method clearCurrentLabel (line 406) | clearCurrentLabel() {
method getClosestIntersection (line 416) | getClosestIntersection(e: MouseEvent){
method redrawMousemove (line 431) | redrawMousemove(e: MouseEvent) {
method redrawComplete (line 474) | redrawComplete() {
method addOrUpdateTempLabel (line 676) | addOrUpdateTempLabel(label: string, position: THREE.Vector3) {
method createLabel (line 688) | createLabel(text: string): CSS2DObject {
method createCurve (line 712) | createCurve(p0: THREE.Vector3, p1: THREE.Vector3, p2: THREE.Vector3) {
method calculateArea (line 730) | calculateArea(points: THREE.Vector3[]) {
method calculateAngle (line 745) | calculateAngle(startPoint: THREE.Vector3, middlePoint: THREE.Vector3, ...
method getAngleBisector (line 758) | getAngleBisector(startPoint: THREE.Vector3, middlePoint: THREE.Vector3...
method getBarycenter (line 770) | getBarycenter(points: THREE.Vector3[]): THREE.Vector3 {
method getUnitString (line 786) | getUnitString() {
method numberToString (line 796) | numberToString(num: number) {
method dispose (line 809) | dispose(): void {
FILE: packages/sdk/lib/core/tools/MiniMap-20240823.ts
type IMiniMapOptions (line 4) | interface IMiniMapOptions {
class MiniMap (line 11) | class MiniMap {
method constructor (line 20) | constructor(viewport,options:IMiniMapOptions = {}) {
method createDomElement (line 37) | createDomElement(){
method init (line 53) | init(){
method initControls (line 74) | initControls() {
method initEvent (line 83) | initEvent(){
method onPointerDown (line 88) | onPointerDown(e: PointerEvent){
method miniMapAnimation (line 107) | miniMapAnimation(){
method update (line 111) | update(){
method dispose (line 115) | dispose(){
FILE: packages/sdk/lib/core/tools/MiniMap.ts
type IMiniMapOptions (line 4) | interface IMiniMapOptions {
class MiniMap (line 11) | class MiniMap {
method constructor (line 24) | constructor(viewer:Viewer, options:IMiniMapOptions) {
method createDomElement (line 54) | createDomElement() {
method open (line 88) | open(){
method close (line 93) | close(){
method updateCamera (line 98) | updateCamera() {
method update (line 113) | update() {
FILE: packages/sdk/lib/core/tools/ModelExplode.ts
type IModelExplodeData (line 7) | interface IModelExplodeData {
class ModelExplode (line 20) | class ModelExplode{
method constructor (line 27) | constructor() {
method computedExplodeData (line 33) | computedExplodeData(model:THREE.Object3D):void{
method getWorldCenterPosition (line 64) | getWorldCenterPosition(box:THREE.Box3,scalar = 0.5){
method explodeModel (line 68) | explodeModel(model:THREE.Object3D,scalar:number = 0.5){
method restore (line 99) | restore(){
method clear (line 125) | clear(){
FILE: packages/sdk/lib/core/tools/Roaming.ts
class Roaming (line 23) | class Roaming {
method constructor (line 57) | constructor(viewer: Viewer) {
method keyDown (line 78) | keyDown(e: KeyboardEvent) {
method keyUp (line 136) | keyUp(e: KeyboardEvent) {
method addPlayer (line 165) | addPlayer(){
method reloadPerson (line 189) | async reloadPerson() {
method generateColliderEnvironment (line 234) | generateColliderEnvironment() {
method resetPlayer (line 362) | resetPlayer() {
method startRoaming (line 381) | startRoaming() {
method exitRoaming (line 394) | exitRoaming(lastRoadCameraPos = new THREE.Vector3(1, 1, 1), lastRoadCa...
method render (line 413) | render(delta: number) {
method dispose (line 557) | dispose() {
FILE: packages/sdk/lib/core/tools/RoamingStatus.ts
class RoamingStatus (line 9) | class RoamingStatus{
method constructor (line 26) | constructor(person:THREE.Group,clips:THREE.AnimationClip[]) {
method init (line 48) | init(){
method isWalkingForward (line 53) | get isWalkingForward(){
method setStatus (line 57) | setStatus(key:string,value: boolean){
method fadeIn (line 138) | fadeIn(name: string) {
method fadeOut (line 149) | fadeOut(name:string){
method stopAllAction (line 158) | stopAllAction(){
method update (line 164) | update(delta:number){
method dispose (line 174) | dispose(){
FILE: packages/sdk/lib/core/viewer/Viewer.ts
type ViewerEventMap (line 35) | interface ViewerEventMap {
type ViewerModules (line 97) | interface ViewerModules {
type EventHandlers (line 144) | type EventHandlers = {
class Viewer (line 171) | class Viewer extends THREE.EventDispatcher<ViewerEventMap> {
method constructor (line 193) | constructor(options: IViewerSetting) {
method edit (line 262) | get edit(): IViewerEdit {
method edit (line 270) | set edit(config: IViewerEdit) {
method enableScript (line 351) | get enableScript() {
method enableScript (line 358) | set enableScript(enable: boolean) {
method createEngine (line 371) | createEngine() {
method engineCreated (line 398) | engineCreated(newRenderer: THREE.WebGLRenderer) {
method initGrid (line 463) | initGrid() {
method initModules (line 491) | initModules() {
method loadEnv (line 575) | loadEnv(setBg: boolean = true, onLoad?: (texture: THREE.Texture) => vo...
method initEvent (line 596) | initEvent() {
method installScripts (line 612) | installScripts(uuids?: string | string[], filterName: string = "") {
method uninstallScriptsByUuid (line 740) | uninstallScriptsByUuid(uuid: string, filterName: string = "") {
method unInstallScripts (line 787) | unInstallScripts() {
method loadOfflineScene (line 813) | loadOfflineScene() {
method computedSceneBox3 (line 821) | computedSceneBox3() {
method updateAspectRatio (line 828) | updateAspectRatio() {
method getIntersects (line 849) | getIntersects(point: THREE.Vector2) {
method handleClick (line 887) | handleClick() {
method onPointerDown (line 910) | onPointerDown(event: PointerEvent) {
method onPointerUp (line 924) | onPointerUp(event: PointerEvent) {
method onPointerMove (line 938) | onPointerMove(event: PointerEvent) {
method onTouchStart (line 946) | onTouchStart(event: TouchEvent) {
method onTouchEnd (line 960) | onTouchEnd(event: TouchEvent) {
method onDoubleClick (line 975) | onDoubleClick(event: PointerEvent) {
method animate (line 994) | animate() {
method initPT (line 1064) | initPT() {
method updatePTBackground (line 1070) | updatePTBackground() {
method updatePTEnvironment (line 1076) | updatePTEnvironment() {
method updatePTMaterials (line 1082) | updatePTMaterials() {
method updatePT (line 1088) | updatePT() {
method render (line 1098) | render(delta?: number) {
method dispose (line 1140) | dispose() {
method addParticle (line 1170) | addParticle(emitter: Emitter, body: THREE.Sprite | THREE.Mesh, name: s...
method getViewportImage (line 1185) | getViewportImage() {
FILE: packages/sdk/lib/core/viewer/ViewerPathTracer.ts
class ViewerPathTracer (line 4) | class ViewerPathTracer {
method constructor (line 8) | constructor(renderer:THREE.WebGLRenderer) {
method init (line 12) | init(scene:THREE.Scene, camera:THREE.Camera) {
method setSize (line 21) | setSize() {
method setBackground (line 28) | setBackground() {
method setEnvironment (line 35) | setEnvironment() {
method updateMaterials (line 41) | updateMaterials() {
method update (line 47) | update() {
method reset (line 53) | reset() {
method getSamples (line 59) | getSamples() {
FILE: packages/sdk/lib/core/viewer/modules/CameraManage.ts
class CameraManage (line 11) | class CameraManage {
method constructor (line 21) | constructor(viewer:Viewer,cameraControls:CameraControls) {
method init (line 30) | init(){
method setInteract (line 37) | setInteract(config){
method front (line 51) | front() {
method rear (line 76) | rear() {
method left (line 101) | left() {
method right (line 126) | right() {
method top (line 151) | top() {
method bottom (line 175) | bottom() {
FILE: packages/sdk/lib/core/viewer/modules/Drag.ts
class Drag (line 11) | class Drag {
method constructor (line 20) | constructor(viewer:Viewer) {
method domElement (line 37) | set domElement(element: HTMLElement) {
method setMeasureInstance (line 41) | setMeasureInstance(measureInstance: Measure) {
method setDragObjects (line 45) | setDragObjects(objects: THREE.Object3D[], type: "eq" | "push" | "remov...
method dragControlsStart (line 73) | dragControlsStart(e) {
method drag (line 96) | drag(e) {
method dragControlsEnd (line 101) | dragControlsEnd(e) {
method clickblank (line 128) | clickblank(e){
method dispose (line 132) | dispose() {
FILE: packages/sdk/lib/core/viewer/modules/Effect.ts
type supportPass (line 29) | type supportPass = Pass | OutlinePass | ShaderPass | UnrealBloomPass | B...
class Effect (line 45) | class Effect {
method constructor (line 54) | constructor(viewer: Viewer) {
method enabled (line 61) | get enabled() {
method createComposer (line 65) | createComposer() {
method initComposer (line 90) | protected initComposer() {
method FXAA (line 138) | get FXAA(): ShaderPass | null {
method UnrealBloom (line 162) | get UnrealBloom(): UnrealBloomPass {
method Bokeh (line 182) | get Bokeh(): BokehPass {
method Pixelate (line 204) | get Pixelate(): RenderPixelatedPass {
method Halftone (line 224) | get Halftone(): HalftonePass {
method LUT (line 241) | get LUT(): LUTPass {
method Afterimage (line 309) | get Afterimage():AfterimagePass{
method handlePassConfigChange (line 328) | handlePassConfigChange(name: string, config) {
method getPassConfigValue (line 410) | getPassConfigValue(key: string, value: any) {
method render (line 422) | render(deltaTime: number) {
method clear (line 438) | clear() {
method dispose (line 449) | dispose() {
FILE: packages/sdk/lib/core/viewer/modules/Helper.ts
class Helper (line 9) | class Helper {
method constructor (line 14) | constructor(viewer: Viewer, controls: CameraControls) {
method animating (line 22) | get animating() {
method hidden (line 30) | set hidden(value: boolean) {
method init (line 40) | init() {
method initEvent (line 56) | initEvent() {
method initDomEvent (line 78) | initDomEvent() {
method getGizmoConfig (line 93) | getGizmoConfig(type = "cube") {
method setConfig (line 139) | setConfig() {
method update (line 149) | update() {
method render (line 156) | render() {
method dispose (line 162) | dispose() {
FILE: packages/sdk/lib/core/viewer/modules/ParticleSystem.ts
class ParticleSystem (line 13) | class ParticleSystem {
method constructor (line 42) | constructor(viewer:Viewer | Preview) {
method needsUpdate (line 63) | get needsUpdate() {
method initEvent (line 67) | initEvent(){
method handleAddEmitter (line 82) | handleAddEmitter(emitter: Particle.Emitter){
method handleObjectRemoved (line 89) | handleObjectRemoved(object) {
method handleObjectAdded (line 111) | handleObjectAdded(object) {
method handleParticleBodyChanged (line 130) | handleParticleBodyChanged(data: IParticle.Config['init']['body'], obje...
method handleEmitterAdd (line 266) | handleEmitterAdd(emitter:Particle.Emitter,system = "spriteSystem"){
method update (line 270) | update(delta: number) {
method dispose (line 279) | dispose() {
FILE: packages/sdk/lib/core/viewer/modules/Signals.ts
class Signals (line 10) | class Signals {
method constructor (line 15) | constructor(viewer:Viewer) {
method init (line 21) | init() {
method objectIsCanPick (line 61) | objectIsCanPick(object:THREE.Object3D | null){
method sceneCleared (line 68) | sceneCleared() {
method transformModeChanged (line 91) | transformModeChanged(mode) {
method snapChanged (line 99) | snapChanged(dist:number) {
method spaceChanged (line 107) | spaceChanged(space:"world" | "local") {
method effectEnabledChange (line 114) | effectEnabledChange(enabled:boolean){
method rendererUpdated (line 140) | rendererUpdated() {
method rendererCreated (line 153) | rendererCreated(newRenderer: THREE.WebGLRenderer) {
method rendererConfigUpdate (line 157) | rendererConfigUpdate(){
method rendererDetectKTX2Support (line 161) | rendererDetectKTX2Support( ktx2Loader ) {
method sceneBackgroundChanged (line 175) | sceneBackgroundChanged(backgroundType:"" | "Color" | "Texture" | "Equi...
method sceneEnvironmentChanged (line 215) | sceneEnvironmentChanged(environmentType: '' | 'Background' | 'Equirect...
method sceneGraphChanged (line 255) | sceneGraphChanged(){
method cameraChanged (line 263) | cameraChanged(){
method viewportCameraChanged (line 271) | viewportCameraChanged(){
method viewportShadingChanged (line 299) | viewportShadingChanged(){
method objectSelected (line 325) | objectSelected(object){
method objectFocused (line 347) | objectFocused(object){
method objectAdded (line 354) | objectAdded(){
method objectChanged (line 362) | objectChanged(object){
method objectRemoved (line 384) | objectRemoved(object){
method geometryChanged (line 397) | geometryChanged(object){
method materialChanged (line 409) | materialChanged(){
method sceneResize (line 417) | sceneResize(){
method showGridChanged (line 443) | showGridChanged(showGrid:boolean){
method scriptAdded (line 454) | scriptAdded(object:THREE.Object3D, _:ISceneScript){
method scriptRemoved (line 461) | scriptRemoved(object:THREE.Object3D, sc:ISceneScript){
method scriptChanged (line 468) | scriptChanged(attributeName:string,object:THREE.Object3D, sc:ISceneScr...
method render (line 477) | render(){
FILE: packages/sdk/lib/core/viewer/modules/Weather.ts
class Weather (line 20) | class Weather {
method constructor (line 26) | constructor(viewer: Viewer) {
method objectAdded (line 42) | objectAdded(object) {
method sceneFogSettingsChanged (line 55) | sceneFogSettingsChanged() {
method sceneRainSettingsChanged (line 90) | sceneRainSettingsChanged() {
method replaceSnowMaterial (line 127) | replaceSnowMaterial(obj) {
method initSnowMap (line 167) | initSnowMap() {
method removeSnowMap (line 178) | removeSnowMap() {
method sceneSnowSettingsChanged (line 204) | sceneSnowSettingsChanged() {
method update (line 251) | update(deltaTime) {
method dispose (line 283) | dispose() {
FILE: packages/sdk/lib/dxf/DragControls.js
class DragControls (line 19) | class DragControls extends EventDispatcher {
method constructor (line 21) | constructor( _objects, _camera, _domElement ) {
FILE: packages/sdk/lib/dxf/drawRect.ts
function throttle (line 8) | function throttle(func, wait) {
class DrawRect (line 23) | class DrawRect {
method constructor (line 59) | constructor(canvas: HTMLCanvasElement, scene: THREE.Scene, camera: THR...
method init (line 168) | init() {
method setList (line 178) | setList({list}) {
method setControls (line 184) | setControls(controls: OrbitControls) {
method setSelect (line 189) | setSelect({modelUuid}){
method restoreRect (line 216) | restoreRect({rect}) {
method addRect (line 233) | addRect({modelUuid}) {
method deleteRect (line 247) | deleteRect({modelUuid}){
method onpointerdown (line 259) | onpointerdown(event: PointerEvent) {
method onpointermove (line 271) | onpointermove(event: PointerEvent) {
method onpointerup (line 292) | onpointerup(event: PointerEvent) {
method clearTemp (line 321) | clearTemp() {
method drawDone (line 328) | drawDone(rect:IDrawingMark) {
method exit (line 338) | exit() {
method draw (line 348) | draw(item: IDrawingMark) {
method screenToScenePosition (line 381) | screenToScenePosition(event) {
FILE: packages/sdk/lib/dxf/drawShare.ts
constant BLOOM_SCENE (line 27) | const BLOOM_SCENE = 10;
function main (line 55) | function main(d) {
function createLineTypeShaders (line 159) | function createLineTypeShaders() {
function createDashedLineShader (line 171) | function createDashedLineShader(pattern) {
function init (line 246) | function init() {
function select (line 415) | function select({ modelOrName }) {
function getColor (line 427) | function getColor(entity) {
function drawEntity (line 440) | function drawEntity(entity) {
function drawArc (line 506) | function drawArc(entity) {
function drawLine (line 536) | function drawLine(entity) {
function drawText (line 580) | function drawText(entity) {
function drawMtext (line 610) | function drawMtext(entity) {
function drawAttdef (line 655) | function drawAttdef(entity) {
function drawAttrib (line 660) | function drawAttrib(entity) {
function drawSolid (line 664) | function drawSolid(entity) {
function drawPoint (line 680) | function drawPoint(entity) {
function drawBlock (line 694) | function drawBlock(entity) {
function drawSpline (line 729) | function drawSpline(entity) {
function drawEllipse (line 740) | function drawEllipse(entity) {
function drawHatch (line 763) | function drawHatch(entity) {
function drawDimension (line 769) | function drawDimension(entity) {
function setLayerVisible (line 798) | function setLayerVisible(data: { layerName: string, visible: boolean }) {
function callModuleMethod (line 804) | function callModuleMethod(data: { moduleName: string, methodName: string...
function resetCamera (line 812) | function resetCamera() {
function resize (line 834) | function resize({ width, height }) {
function render (line 872) | function render() {
function stopRender (line 885) | function stopRender() {
function renderLoop (line 889) | function renderLoop() {
function helpRender (line 893) | function helpRender() {
function dispose (line 898) | function dispose() {
function changeClearColor (line 912) | function changeClearColor(color: 0x000000 | 0xffffff) {
FILE: packages/sdk/lib/dxf/drawUtils.ts
function getBulgeCurvePoints (line 43) | function getBulgeCurvePoints(startPoint: { x: number; y: number; }, endP...
function getBSplinePolyline (line 91) | function getBSplinePolyline(controlPoints, degree, knots, interpolations...
function addTriangleFacingCamera (line 123) | function addTriangleFacingCamera(verts, p0, p1, p2) {
function mtextContentAndFormattingToTextAndStyle (line 143) | function mtextContentAndFormattingToTextAndStyle(textAndControlChars, en...
function createTextForScene (line 181) | function createTextForScene(text, style, entity, color,fontUrl:string) {
function findExtents (line 266) | function findExtents(scene) {
FILE: packages/sdk/lib/dxf/index.ts
function wheelEventHandler (line 28) | function wheelEventHandler( event, sendFn ) {
function preventDefaultHandler (line 33) | function preventDefaultHandler( event ) {
function copyProperties (line 37) | function copyProperties(src, properties, dst) {
function makeSendPropertiesHandler (line 43) | function makeSendPropertiesHandler( properties ) {
function touchEventHandler (line 51) | function touchEventHandler(event, sendFn) {
function filteredKeydownEventHandler (line 72) | function filteredKeydownEventHandler(event, sendFn) {
class ElementProxy (line 85) | class ElementProxy {
method constructor (line 90) | constructor(element, worker, eventHandlers) {
method sendEvent (line 114) | sendEvent(data){
method sendSize (line 124) | sendSize() {
class DxfViewer (line 145) | class DxfViewer {
method set (line 150) | set(target, p: string | symbol, newValue: any): boolean {
method constructor (line 162) | constructor(data: any, canvas: HTMLCanvasElement, width: number, heigh...
method handleSignal (line 277) | handleSignal(args){
method callMethod (line 287) | callMethod(methodName:string, data:any = {}){
method dispose (line 298) | dispose() {
method selectRectIndex (line 311) | get selectRectIndex(){
method deleteRect (line 316) | deleteRect(){
method selectRect (line 327) | selectRect(uuid:string){
FILE: packages/sdk/lib/dxf/offScreenCanvas.worker.ts
function noop (line 4) | function noop() {
class ElementProxyReceiver (line 7) | class ElementProxyReceiver extends EventDispatcher {
method constructor (line 19) | constructor() {
method clientWidth (line 39) | get clientWidth() {
method clientHeight (line 43) | get clientHeight() {
method offsetLeft (line 47) | get offsetLeft() {
method offsetTop (line 51) | get offsetTop() {
method setPointerCapture (line 56) | setPointerCapture() {
method releasePointerCapture (line 59) | releasePointerCapture() {
method getBoundingClientRect (line 62) | getBoundingClientRect() {
method handleEvent (line 74) | handleEvent(data) {
method focus (line 90) | focus() {
method getRootNode (line 95) | getRootNode(){
class ProxyManager (line 100) | class ProxyManager {
method constructor (line 103) | constructor() {
method makeProxy (line 112) | makeProxy(data: { id: number }) {
method getProxy (line 117) | getProxy(id: number) {
method handleEvent (line 121) | handleEvent(data) {
method set (line 130) | set(target: {}, p: string | symbol, newValue: any): boolean {
function start (line 145) | function start(data: { canvasId: number, canvas: HTMLCanvasElement, data...
function makeProxy (line 171) | function makeProxy(data: { id: number }) {
FILE: packages/sdk/lib/dxf/parser/DxfArrayScanner.ts
type IGroup (line 3) | interface IGroup {
class DxfArrayScanner (line 18) | class DxfArrayScanner {
method constructor (line 24) | constructor(data: string[]) {
method next (line 33) | public next() {
method peek (line 76) | public peek() {
method rewind (line 94) | public rewind(numberOfGroups = 1) {
method hasNext (line 102) | public hasNext() {
method isEOF (line 116) | public isEOF() {
function parseGroupValue (line 129) | function parseGroupValue(code: number, value: string) {
function parseBoolean (line 163) | function parseBoolean(str: '0' | '1') {
FILE: packages/sdk/lib/dxf/parser/DxfParser.ts
type IBlock (line 28) | interface IBlock {
type IViewPort (line 42) | interface IViewPort {
type IViewPortTableDefinition (line 70) | interface IViewPortTableDefinition {
type ILineType (line 78) | interface ILineType {
type ILineTypeTableDefinition (line 85) | interface ILineTypeTableDefinition {
type ILayer (line 93) | interface ILayer {
type ILayerTableDefinition (line 101) | interface ILayerTableDefinition {
type ITableDefinitions (line 109) | interface ITableDefinitions {
type IBaseTable (line 117) | interface IBaseTable {
type IViewPortTable (line 122) | interface IViewPortTable extends IBaseTable {
type ILayerTypesTable (line 126) | interface ILayerTypesTable extends IBaseTable {
type ILayersTable (line 130) | interface ILayersTable extends IBaseTable {
type ITables (line 134) | interface ITables {
type ITable (line 140) | type ITable = IViewPortTable | ILayerTypesTable | ILayersTable;
type IDxf (line 142) | interface IDxf {
function registerDefaultEntityHandlers (line 149) | function registerDefaultEntityHandlers(dxfParser: DxfParser) {
class DxfParser (line 171) | class DxfParser {
method constructor (line 174) | constructor() {
method parse (line 178) | public parse(source: string | Readable) {
method registerEntityHandler (line 187) | public registerEntityHandler(handlerType: new () => IGeometry) {
method parseSync (line 192) | public parseSync(source: string) {
method parseStream (line 196) | public parseStream(stream: Readable) {
method _parse (line 217) | private _parse(dxfString: string) {
function groupIs (line 946) | function groupIs(group: IGroup, code: number, value: string | number | b...
function logUnhandledGroup (line 951) | function logUnhandledGroup(curr: IGroup) {
function debugCode (line 956) | function debugCode(curr: IGroup) {
function getAcadColor (line 964) | function getAcadColor(index: number) {
FILE: packages/sdk/lib/dxf/parser/ExtendedDataParser.ts
class ExtendedDataParser (line 3) | class ExtendedDataParser {
method constructor (line 10) | constructor() {
method Feed (line 22) | Feed(curr) {
method Finish (line 92) | Finish(entity) {
method _currentSection (line 108) | get _currentSection() {
method _CreateSection (line 112) | _CreateSection() {
method _CreateValue (line 118) | _CreateValue(code, value) {
FILE: packages/sdk/lib/dxf/parser/ParseHelpers.ts
function getAcadColor (line 10) | function getAcadColor(index: number) {
function parsePoint (line 18) | function parsePoint(scanner: DxfArrayScanner) {
function skipEmbeddedObject (line 51) | function skipEmbeddedObject(scanner: DxfArrayScanner) {
function checkCommonEntityProperties (line 70) | function checkCommonEntityProperties(entity: IEntity, curr:IGroup, scann...
FILE: packages/sdk/lib/dxf/parser/entities/3dface.ts
type I3DfaceEntity (line 7) | interface I3DfaceEntity extends IEntity {
class ThreeDface (line 13) | class ThreeDface implements IGeometry {
method parseEntity (line 15) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
function parse3dFaceVertices (line 39) | function parse3dFaceVertices(scanner:DxfArrayScanner, curr:IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/arc.ts
type IArcEntity (line 7) | interface IArcEntity extends IEntity {
class Arc (line 18) | class Arc implements IGeometry {
method parseEntity (line 20) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/attdef.ts
type IAttdefEntity (line 5) | interface IAttdefEntity extends IEntity {
class Attdef (line 31) | class Attdef implements IGeometry {
method parseEntity (line 33) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/attribute.ts
type IAttribEntity (line 5) | interface IAttribEntity extends IEntity {
class Attrib (line 35) | class Attrib implements IGeometry{
method parseEntity (line 38) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/circle.ts
type ICircleEntity (line 6) | interface ICircleEntity extends IEntity {
class Circle (line 14) | class Circle implements IGeometry {
method parseEntity (line 16) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/dimension.ts
type IDimensionEntity (line 6) | interface IDimensionEntity extends IEntity{
class Dimension (line 22) | class Dimension implements IGeometry {
method parseEntity (line 24) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/ellipse.ts
type IEllipseEntity (line 6) | interface IEllipseEntity extends IEntity {
class Ellipse (line 15) | class Ellipse implements IGeometry {
method parseEntity (line 17) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/geomtry.ts
type IPoint (line 3) | interface IPoint {
type IEntity (line 9) | interface IEntity {
type EntityName (line 28) | type EntityName = 'POINT'
type IGeometry (line 47) | interface IGeometry {
FILE: packages/sdk/lib/dxf/parser/entities/hatch.ts
type IHatchEntity (line 5) | interface IHatchEntity extends IEntity {
class Hatch (line 17) | class Hatch implements IGeometry {
method parseEntity (line 20) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
function ParseBoundaryLoop (line 124) | function ParseBoundaryLoop(curr: IGroup, scanner: DxfArrayScanner) {
function ParseDefinitionLine (line 294) | function ParseDefinitionLine(curr: IGroup, scanner: DxfArrayScanner) {
function ParseSeedPoint (line 341) | function ParseSeedPoint(curr: IGroup, scanner: DxfArrayScanner) {
FILE: packages/sdk/lib/dxf/parser/entities/insert.ts
type IInsertEntity (line 5) | interface IInsertEntity extends IEntity {
class Insert (line 19) | class Insert implements IGeometry {
method parseEntity (line 21) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/line.ts
type ILineEntity (line 6) | interface ILineEntity extends IEntity{
class Line (line 11) | class Line implements IGeometry{
method parseEntity (line 13) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/lwpolyline.ts
type IVertex (line 5) | interface IVertex extends IPoint{
type ILwpolylineEntity (line 11) | interface ILwpolylineEntity extends IEntity {
class Lwpolyline (line 23) | class Lwpolyline implements IGeometry {
method parseEntity (line 25) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
function parseLWPolylineVertices (line 71) | function parseLWPolylineVertices(n:number, scanner: DxfArrayScanner) {
FILE: packages/sdk/lib/dxf/parser/entities/mtext.ts
type IMtextEntity (line 6) | interface IMtextEntity extends IEntity {
class Mtext (line 17) | class Mtext implements IGeometry {
method parseEntity (line 19) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/point.ts
type IPointEntity (line 6) | interface IPointEntity extends IEntity{
class Point (line 12) | class Point implements IGeometry{
method parseEntity (line 14) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/polyline.ts
type IPolylineEntity (line 7) | interface IPolylineEntity extends IEntity {
class Polyline (line 21) | class Polyline implements IGeometry {
method parseEntity (line 23) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
function parsePolylineVertices (line 79) | function parsePolylineVertices(scanner:DxfArrayScanner, curr:IGroup) {
function parseSeqEnd (line 97) | function parseSeqEnd(scanner:DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/solid.ts
type ISolidEntity (line 6) | interface ISolidEntity extends IEntity {
class Solid (line 11) | class Solid implements IGeometry {
method parseEntity (line 13) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/spline.ts
type ISplineEntity (line 6) | interface ISplineEntity extends IEntity {
class Spline (line 24) | class Spline implements IGeometry {
method parseEntity (line 26) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/text.ts
type ITextEntity (line 5) | interface ITextEntity extends IEntity {
class Text (line 20) | class Text implements IGeometry {
method parseEntity (line 23) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/parser/entities/vertex.ts
type IVertexEntity (line 7) | interface IVertexEntity extends IEntity, IPoint{
class Vertex (line 22) | class Vertex implements IGeometry {
method parseEntity (line 24) | public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
FILE: packages/sdk/lib/dxf/pickHelper.ts
class PickHelper (line 3) | class PickHelper {
method constructor (line 13) | constructor(scene: Scene, camera: OrthographicCamera, bloomLayer: numb...
method pick (line 30) | pick(normalizedPosition: Vector2,) {
method select (line 41) | select(object: Mesh | Group) {
FILE: packages/sdk/lib/dxf/troika-three-text.esm.js
function createSDFGenerator (line 12) | function createSDFGenerator(createGlyphSegmentsQuadtree, config) {
function createFontProcessor (line 209) | function createFontProcessor(fontParser, sdfGenerator, config) {
function createGlyphSegmentsQuadtree (line 783) | function createGlyphSegmentsQuadtree(glyphObj) {
function typrFactory (line 977) | function typrFactory() {
function woff2otfFactory (line 3626) | function woff2otfFactory() {
function parserFactory (line 4173) | function parserFactory(Typr, woff2otf) {
method init (line 4281) | init(typrFactory, woff2otfFactory, parserFactory) {
constant CONFIG (line 4291) | const CONFIG = {
function configureTextBuilder (line 4318) | function configureTextBuilder(config) {
constant SDF_DISTANCE_PERCENT (line 4333) | const SDF_DISTANCE_PERCENT = 1 / 8;
function getTextRenderInfo (line 4385) | function getTextRenderInfo(args, callback) {
function preloadFont (line 4507) | function preloadFont({font, characters, sdfGlyphSize}, callback) {
function assign (line 4514) | function assign(toObj, fromObj) {
function toAbsoluteURL (line 4525) | function toAbsoluteURL(path) {
method init (line 4544) | init(config, sdfDistancePercent, fontParser, createGlyphSegmentsQuadtree...
method init (line 4560) | init(fontProcessor, Thenable) {
method getTransferables (line 4567) | getTransferables(result) {
function getTemplateGeometry (line 4586) | function getTemplateGeometry(detail) {
class GlyphsGeometry (line 4634) | class GlyphsGeometry extends InstancedBufferGeometry {
method constructor (line 4635) | constructor() {
method computeBoundingSphere (line 4645) | computeBoundingSphere() {
method computeBoundingBox (line 4649) | computeBoundingBox() {
method detail (line 4653) | set detail(detail) {
method detail (line 4666) | get detail() {
method updateGlyphs (line 4682) | updateGlyphs(
method applyClipRect (line 4731) | applyClipRect(clipRect) {
function updateBufferAttr (line 4761) | function updateBufferAttr(geom, attrName, newArray, itemSize) {
function setInstanceCount (line 4788) | function setInstanceCount(geom, count) {
constant VERTEX_DEFS (line 4795) | const VERTEX_DEFS = `
constant VERTEX_TRANSFORM (line 4811) | const VERTEX_TRANSFORM = `
constant FRAGMENT_DEFS (line 4838) | const FRAGMENT_DEFS = `
constant FRAGMENT_TRANSFORM (line 4881) | const FRAGMENT_TRANSFORM = `
function createTextDerivedMaterial (line 4894) | function createTextDerivedMaterial(baseMaterial) {
constant SYNCABLE_PROPS (line 4973) | const SYNCABLE_PROPS = [
constant COPYABLE_PROPS (line 4990) | const COPYABLE_PROPS = SYNCABLE_PROPS.concat(
class Text (line 5007) | class Text extends Mesh {
method constructor (line 5008) | constructor() {
method sync (line 5187) | sync(callback) {
method onBeforeRender (line 5255) | onBeforeRender() {
method dispose (line 5267) | dispose() {
method textRenderInfo (line 5278) | get textRenderInfo() {
method material (line 5284) | get material() {
method material (line 5297) | set material(baseMaterial) {
method glyphGeometryDetail (line 5306) | get glyphGeometryDetail() {
method glyphGeometryDetail (line 5309) | set glyphGeometryDetail(detail) {
method customDepthMaterial (line 5314) | get customDepthMaterial() {
method customDistanceMaterial (line 5317) | get customDistanceMaterial() {
method _prepareForRender (line 5321) | _prepareForRender() {
method raycast (line 5380) | raycast(raycaster, intersects) {
method copy (line 5402) | copy(source) {
method clone (line 5410) | clone() {
method get (line 5420) | get() {
method set (line 5423) | set(value) {
method get (line 5436) | get() {
method set (line 5439) | set(val) {
function getCaretAtPoint (line 5472) | function getCaretAtPoint(textRenderInfo, x, y) {
function getSelectionRects (line 5505) | function getSelectionRects(textRenderInfo, start, end) {
function groupCaretsByRow (line 5552) | function groupCaretsByRow(textRenderInfo) {
FILE: packages/sdk/lib/dxf/troika-three-utils.esm.js
function expandShaderIncludes (line 16) | function expandShaderIncludes( source ) {
function generateUUID (line 37) | function generateUUID() {
constant CONSTRUCTOR_CACHE (line 73) | const CONSTRUCTOR_CACHE = new WeakMap();
constant SHADER_UPGRADE_CACHE (line 74) | const SHADER_UPGRADE_CACHE = new Map();
function createDerivedMaterial (line 140) | function createDerivedMaterial(baseMaterial, options) {
function upgradeShaders (line 324) | function upgradeShaders({vertexShader, fragmentShader}, options, key) {
function injectIntoShaderCode (line 424) | function injectIntoShaderCode(shaderCode, id, defs, intro, outro) {
function optionsJsonReplacer (line 441) | function optionsJsonReplacer(key, value) {
function getKeyForOptions (line 447) | function getKeyForOptions(options) {
constant MATERIAL_TYPES_TO_SHADERS (line 458) | const MATERIAL_TYPES_TO_SHADERS = {
function getShadersForMaterial (line 483) | function getShadersForMaterial(material) {
function getShaderUniformTypes (line 494) | function getShaderUniformTypes(shader) {
function invertMatrix4 (line 510) | function invertMatrix4(srcMatrix, tgtMatrix = new Matrix4()) {
function createBezierMeshMaterial (line 606) | function createBezierMeshMaterial(baseMaterial) {
class BezierMesh (line 659) | class BezierMesh extends Mesh {
method getGeometry (line 660) | static getGeometry() {
method constructor (line 666) | constructor() {
method ma
Copy disabled (too large)
Download .json
Condensed preview — 748 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (20,514K chars).
[
{
"path": ".gitignore",
"chars": 271,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
},
{
"path": ".npmrc",
"chars": 51,
"preview": "# 解决pnpm add时优先在本地查找依赖\nlink-workspace-packages=true"
},
{
"path": ".prettierrc.js",
"chars": 994,
"preview": "/** @type {import(\"prettier\").Config} */\nmodule.exports = {\n\t// 一行最多160字符\n\tprintWidth: 160,\n\t// 指定一个制表符等于的空格数\n\ttabWidth:"
},
{
"path": "CONTRIBUTING.md",
"chars": 1015,
"preview": "# 贡献指南\n\n欢迎来到 Astral 3D 社区!以下是参与贡献的指南:\n\n## 🛠️ 开发流程\n\n### 环境要求\n- Node.js 23.11+\n- PNPM\n\n### 代码规范\n1. Git 提交信息格式:\n ```\n "
},
{
"path": "LEGAL.md",
"chars": 609,
"preview": "# 法律声明\n\n## 📜 许可协议\n本项目采用 [Apache-2.0 许可证](LICENSE),核心条款包括:\n\n### 您必须遵守:\n1. **保留声明** \n 所有副本必须包含:\n - 原始版权声明(见本文件底部)\n "
},
{
"path": "LICENSE",
"chars": 11335,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.en.md",
"chars": 6074,
"preview": "# <img src=\"https://editor.astraljs.com/static/images/logo/logo.png\" width=\"30\" height=\"30\"> Astral 3D Editor\n\n🌍 [简体中文]("
},
{
"path": "README.md",
"chars": 5242,
"preview": "# <img src=\"https://editor.astraljs.com/static/images/logo/logo.png\" width=\"30\" height=\"30\"> Astral 3D Editor\n\n🌍 简体中文 | "
},
{
"path": "common/build/package.json",
"chars": 569,
"preview": "{\n \"name\": \"@astral3d/build-vite-plugins\",\n \"author\": \"ErSan<mlt131220@163.com>\",\n \"private\": true,\n \"version\": \"1.0"
},
{
"path": "common/build/src/index.ts",
"chars": 63,
"preview": "export * from './utils.ts';\nexport * from './plugins/index.ts';"
},
{
"path": "common/build/src/plugins/appConfig.ts",
"chars": 873,
"preview": "// @ts-ignore\nimport ConfigPlugin from 'unplugin-config/vite';\nimport type { PluginOption } from 'vite';\nimport {getEnvC"
},
{
"path": "common/build/src/plugins/compress.ts",
"chars": 906,
"preview": "/**\n * 用于打包和输出gzip;\n * 注意,这在Vite中不能正常工作,具体原因还在调查中\n * https://github.com/anncwb/vite-plugin-compression\n */\nimport type {"
},
{
"path": "common/build/src/plugins/index.ts",
"chars": 1564,
"preview": "import type {PluginOption} from 'vite';\nimport topLevelAwait from \"vite-plugin-top-level-await\";\nimport EnhanceLog from "
},
{
"path": "common/build/src/plugins/visualizer.ts",
"chars": 366,
"preview": "/**\n * package.json包文件容量分析\n */\n// @ts-ignore\nimport {visualizer} from 'rollup-plugin-visualizer';\nimport { type PluginOp"
},
{
"path": "common/build/src/utils.ts",
"chars": 2126,
"preview": "import { join } from 'node:path';\nimport pkg from 'fs-extra';\nimport {parse} from \"dotenv\";\n\n/**\n * 读取所有环境变量配置文件以处理.env\n"
},
{
"path": "common/build/tsconfig.json",
"chars": 654,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"useDefineForClassFields\": true,\n \"module\": \"esnext\",\n \"lib\":"
},
{
"path": "package.json",
"chars": 1073,
"preview": "{\n \"name\": \"astral3d\",\n \"version\": \"1.0.0\",\n \"description\": \"Astral3D Engine\",\n \"author\": \"ErSan <mlt131220@"
},
{
"path": "packages/docs/.gitignore",
"chars": 73,
"preview": "node_modules\nsrc/.vuepress/.cache\nsrc/.vuepress/dist\nsrc/.vuepress/.temp\n"
},
{
"path": "packages/docs/.npmrc",
"chars": 65,
"preview": "shamefully-hoist=true\nshell-emulator=true\nauto-install-peers=true"
},
{
"path": "packages/docs/package.json",
"chars": 730,
"preview": "{\n \"name\": \"@astral3d/docs\",\n \"type\": \"module\",\n \"version\": \"1.0.0\",\n \"description\": \"Astral3D 文档\",\n \"packageManage"
},
{
"path": "packages/docs/src/.vuepress/_bulletin.md",
"chars": 565,
"preview": "---\ntitle: _bulletin\ncreateTime: 2025/10/02 00:22:16\npermalink: /astral/ib77r5fd/\n---\n::: center\n\n**QQ 交流群:** [104032057"
},
{
"path": "packages/docs/src/.vuepress/client.ts",
"chars": 828,
"preview": "import { defineClientConfig } from 'vuepress/client'\n// import RepoCard from 'vuepress-theme-plume/features/RepoCard.vue"
},
{
"path": "packages/docs/src/.vuepress/config.ts",
"chars": 6303,
"preview": "import { viteBundler } from '@vuepress/bundler-vite'\nimport { defineUserConfig } from 'vuepress'\nimport { plumeTheme } f"
},
{
"path": "packages/docs/src/.vuepress/navbar.ts",
"chars": 1026,
"preview": "import { defineNavbarConfig } from 'vuepress-theme-plume';\nimport { version } from '../../package.json';\n\nexport const n"
},
{
"path": "packages/docs/src/.vuepress/notes.ts",
"chars": 5238,
"preview": "import { defineNoteConfig, defineNotesConfig } from 'vuepress-theme-plume'\n\nconst updateNote = defineNoteConfig({\n di"
},
{
"path": "packages/docs/src/.vuepress/plume.config.ts",
"chars": 1526,
"preview": "import { defineThemeConfig } from 'vuepress-theme-plume'\nimport { navbar } from './navbar'\nimport { notes } from './note"
},
{
"path": "packages/docs/src/.vuepress/theme/components/Custom.vue",
"chars": 183,
"preview": "<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\nconst message = ref('Hello World!')\n</script>\n\n<template>\n <div cla"
},
{
"path": "packages/docs/src/.vuepress/theme/shim.d.ts",
"chars": 127,
"preview": "declare module '*.vue' {\n import type { ComponentOptions } from 'vue'\n\n const comp: ComponentOptions\n export default "
},
{
"path": "packages/docs/src/.vuepress/theme/styles/custom.css",
"chars": 860,
"preview": ":root {\n /** 主题颜色 */\n\n /*\n --vp-c-brand-1: #5086a1;\n --vp-c-brand-2: #6aa1b7;\n --vp-c-brand-3: #8cccd5;\n --vp-c-br"
},
{
"path": "packages/docs/src/README.md",
"chars": 2239,
"preview": "---\npageLayout: home\nexternalLinkIcon: false\nconfig:\n -\n type: hero\n full: true\n background: tint-plate\n he"
},
{
"path": "packages/docs/src/notes/cooperation/README.md",
"chars": 1547,
"preview": "---\ntitle: 商务合作\ncreateTime: 2025/10/06 21:04:41\npermalink: /astral/nf8y5syx/\n---\n\n# 寻求合作,共创价值\n\n> 您好!我们是 ==Astral 3D== 开源"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/extras/动画编辑器.md",
"chars": 81,
"preview": "---\ntitle: 动画编辑器\ncreateTime: 2025/03/31 19:50:56\npermalink: /guide/5s7acuj0/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/extras/日志.md",
"chars": 78,
"preview": "---\ntitle: 日志\ncreateTime: 2025/03/31 20:03:00\npermalink: /guide/0q1bxrub/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/extras/资源中心.md",
"chars": 2135,
"preview": "---\ntitle: 资源中心\ncreateTime: 2025/03/31 19:51:33\npermalink: /guide/dju4ekca/\n---\n\n::: demo-wrapper img no-padding\n<ImageC"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/leftSidebar/BIM轻量化.md",
"chars": 1923,
"preview": "---\ntitle: BIM轻量化\ncreateTime: 2025/03/31 19:48:15\npermalink: /guide/rf1xgf4z/\n---\n\n<div style=\"display:flex;justify-cont"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/leftSidebar/CAD解析预览.md",
"chars": 1413,
"preview": "---\ntitle: CAD解析预览\ncreateTime: 2025/03/31 19:49:44\npermalink: /guide/u1631nwk/\n---\n\n<div style=\"display:flex;justify-con"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/leftSidebar/场景树.md",
"chars": 950,
"preview": "---\ntitle: 场景树\ncreateTime: 2025/03/31 19:58:06\npermalink: /guide/rzqb0h0l/\n---\n\n<CardGrid>\n <ImageCard\n image=\"/images"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/Html面板.md",
"chars": 82,
"preview": "---\ntitle: Html面板\ncreateTime: 2025/04/17 17:03:07\npermalink: /guide/kk5cv2ij/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/几何.md",
"chars": 78,
"preview": "---\ntitle: 几何\ncreateTime: 2025/03/31 20:06:40\npermalink: /guide/nct00cif/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/动画.md",
"chars": 78,
"preview": "---\ntitle: 动画\ncreateTime: 2025/03/31 20:07:33\npermalink: /guide/g3kxptm0/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/历史记录.md",
"chars": 80,
"preview": "---\ntitle: 历史记录\ncreateTime: 2025/03/31 20:05:25\npermalink: /guide/ae7ufigr/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/后期处理.md",
"chars": 80,
"preview": "---\ntitle: 后期处理\ncreateTime: 2025/03/31 20:04:44\npermalink: /guide/l8hd921o/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/场景图纸.md",
"chars": 80,
"preview": "---\ntitle: 场景图纸\ncreateTime: 2025/03/31 20:05:40\npermalink: /guide/ta6draim/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/场景配置.md",
"chars": 80,
"preview": "---\ntitle: 场景配置\ncreateTime: 2025/03/31 20:04:17\npermalink: /guide/pnmbue0k/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/天气.md",
"chars": 78,
"preview": "---\ntitle: 天气\ncreateTime: 2025/03/31 20:05:08\npermalink: /guide/fn9xwbkf/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/对象.md",
"chars": 78,
"preview": "---\ntitle: 对象\ncreateTime: 2025/03/31 20:06:07\npermalink: /guide/2xlh6nrf/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/广告牌.md",
"chars": 79,
"preview": "---\ntitle: 广告牌\ncreateTime: 2025/04/17 17:11:18\npermalink: /guide/18al65zg/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/材质.md",
"chars": 78,
"preview": "---\ntitle: 材质\ncreateTime: 2025/03/31 20:07:10\npermalink: /guide/l1df4723/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/渲染器配置.md",
"chars": 81,
"preview": "---\ntitle: 渲染器配置\ncreateTime: 2025/03/31 20:04:34\npermalink: /guide/crvssx6j/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/粒子.md",
"chars": 78,
"preview": "---\ntitle: 粒子\ncreateTime: 2025/03/31 19:50:23\npermalink: /guide/siz46vj0/\n---\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/rightSidebar/脚本.md",
"chars": 10835,
"preview": "---\nlang: zh-CN\ntitle: 脚本\ncreateTime: 2025/02/20 15:13:36\npermalink: /guide/component/h4v1bkyh/\n---\n\n> 主要面相于开发人员,主要功能有:\n"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/viewport/2D图纸.md",
"chars": 1695,
"preview": "---\ntitle: 2D图纸\ncreateTime: 2025/03/31 20:00:46\npermalink: /guide/7eo51kfy/\n---\n\n::: demo-wrapper img no-padding\n<ImageC"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/viewport/3D场景.md",
"chars": 2061,
"preview": "---\ntitle: 3D场景\ncreateTime: 2025/03/31 20:00:56\npermalink: /guide/jkg3yahd/\n---\n\n::: demo-wrapper img no-padding\n<ImageC"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/界面.md",
"chars": 344,
"preview": "---\ntitle: 界面\ncreateTime: 2025/03/31 19:45:41\npermalink: /guide/swepocsg/\n---\n\n::: demo-wrapper img no-padding\n<ImageCar"
},
{
"path": "packages/docs/src/notes/guide/manual/editor/顶栏.md",
"chars": 2006,
"preview": "---\ntitle: 顶栏\ncreateTime: 2025/03/31 20:09:24\npermalink: /guide/f7smai4w/\n---\n\n::: demo-wrapper img no-padding\n\ncreateTime: 2025/10/06 22:08:28\npermalink: /guide/zdiy72f2/\n---\n\n本指南将向您说明 `Astral 3D` 项目的文件结构。\n\n`As"
},
{
"path": "packages/docs/src/notes/more/questions.md",
"chars": 414,
"preview": "---\ntitle: 常见问题\ncreateTime: 2025/02/20 16:19:54\npermalink: /questions/\n---\n\n本文主要包含了Astral3D过程中可能会遇到的常见问题与解决方法。\n\n如果您遇到任何问"
},
{
"path": "packages/docs/src/notes/promotion/README.md",
"chars": 1433,
"preview": "---\ntitle: 推广中心\ncreateTime: 2025/10/04 19:34:07\npermalink: /promotion/\n---\n\n:::important 作者的话\n`Astral 3D` 是一款基于 `Three.j"
},
{
"path": "packages/docs/src/notes/sdk/README.md",
"chars": 40,
"preview": "---\nlang: zh-CN\n---\n\n# :watermelon: 暂未编写"
},
{
"path": "packages/editor/.gitignore",
"chars": 276,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
},
{
"path": "packages/editor/.npmrc",
"chars": 24,
"preview": "auto-install-peers=true\n"
},
{
"path": "packages/editor/components.d.ts",
"chars": 7764,
"preview": "/* eslint-disable */\n// @ts-nocheck\n// Generated by unplugin-vue-components\n// Read more: https://github.com/vuejs/core/"
},
{
"path": "packages/editor/index.html",
"chars": 1322,
"preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n\n<head>\n <meta charset=\"UTF-8\"/>\n <link rel=\"icon\" sizes=\"any\" type=\"image/svg"
},
{
"path": "packages/editor/package.json",
"chars": 1338,
"preview": "{\n \"name\": \"@astral3d/editor\",\n \"author\": \"ErSan<mlt131220@163.com>\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scr"
},
{
"path": "packages/editor/public/libs/draco/draco_decoder.js",
"chars": 720148,
"preview": "\nvar DracoDecoderModule = (() => {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? docume"
},
{
"path": "packages/editor/public/libs/draco/draco_decoder_gltf.js",
"chars": 513057,
"preview": "\nvar DracoDecoderModule = (() => {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? docume"
},
{
"path": "packages/editor/public/libs/draco/draco_encoder.js",
"chars": 880075,
"preview": "\nvar DracoEncoderModule = (() => {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? docume"
},
{
"path": "packages/editor/public/libs/draco/draco_encoder_wrapper.js",
"chars": 49007,
"preview": "var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(l){var p=0;return function(){return p<l.leng"
},
{
"path": "packages/editor/public/libs/draco/draco_wasm_wrapper.js",
"chars": 58763,
"preview": "var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(k){var n=0;return function(){return n<k.leng"
},
{
"path": "packages/editor/public/libs/draco/draco_wasm_wrapper_gltf.js",
"chars": 58456,
"preview": "var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(h){var n=0;return function(){return n<h.leng"
},
{
"path": "packages/editor/public/robots.txt",
"chars": 22,
"preview": "User-agent: *\nAllow: /"
},
{
"path": "packages/editor/public/static/resource/htmlPanel/technology/factoryEquipment.html",
"chars": 1182,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>工厂设备</title>\n</head>\n<body>\n<div style=\"po"
},
{
"path": "packages/editor/src/App.vue",
"chars": 1794,
"preview": "<script lang=\"ts\" setup>\nimport {computed} from 'vue';\nimport {GlobalThemeOverrides,zhCN, dateZhCN,enUS,dateEnUS} from \""
},
{
"path": "packages/editor/src/assets/color/ChineseColors.json",
"chars": 104557,
"preview": "[\n {\n \"CMYK\": [\n 4,\n 5,\n 18,\n 0\n ],\n \"RGB\": [\n 249,\n 244,\n 220\n ],\n \""
},
{
"path": "packages/editor/src/assets/color/all_in_one.json",
"chars": 425122,
"preview": "{\n \"red\": [\n {\n \"id\": \"255179167\",\n \"name\": \"粉红\",\n \"tra_name\": \"粉紅\",\n \"color_series\""
},
{
"path": "packages/editor/src/assets/color/recommend.json",
"chars": 848,
"preview": "[\n {\n \"CMYK\": [56, 0, 19, 11],\n \"RGB\": [99, 226, 183],\n \"hex\": \"#63E2B7\",\n \"hexHover\": \"#63E2B7\",\n \"hexP"
},
{
"path": "packages/editor/src/assets/less/common.less",
"chars": 1013,
"preview": ".sidebar-config-item{\n display: flex;\n align-items: center;\n padding: 0 1rem 0.5rem 1rem;\n width: calc(100% - 2rem);"
},
{
"path": "packages/editor/src/assets/less/index.less",
"chars": 80,
"preview": "@import './reset.less';\n@import './common.less';\n@import './viewport.cube.less';"
},
{
"path": "packages/editor/src/assets/less/reset.less",
"chars": 921,
"preview": ":root {\n --header-height: 50px;\n --footer-height: 40px;\n // scene下方扩展面板顶部高度\n --scene-extend-header-height: 3"
},
{
"path": "packages/editor/src/assets/less/viewport.cube.less",
"chars": 1489,
"preview": "#es-view-cube-container {\n width: 120px;\n height: 120px;\n margin: 10px;\n perspective: 600px;\n position: absolute;\n "
},
{
"path": "packages/editor/src/components/code/CodeEditor.vue",
"chars": 7861,
"preview": "<template>\n <div ref=\"monacoEditorRef\" class=\"h-full\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMoun"
},
{
"path": "packages/editor/src/components/code/HtmlPanelCode.vue",
"chars": 1645,
"preview": "<template>\n <n-modal :show=\"show\" @update:show=\"(s) => emits('update:show',s)\" class=\"!w-80vw\" preset=\"dialog\"\n "
},
{
"path": "packages/editor/src/components/code/JSONEditor.vue",
"chars": 1227,
"preview": "<template>\n <div class=\"w-full h-auto relative\">\n <CodeEditor ref=\"editorRef\" v-model:source=\"source\" mode=\"json\" cl"
},
{
"path": "packages/editor/src/components/code/SQLEditor.vue",
"chars": 1217,
"preview": "<template>\n <div class=\"w-full h-auto\">\n <CodeEditor ref=\"editorRef\" v-model:source=\"source\" mode=\"sql\" class=\"!h-30"
},
{
"path": "packages/editor/src/components/code/Script.vue",
"chars": 4896,
"preview": "<template>\n <n-modal v-model:show=\"show\" class=\"!w-90vw\" preset=\"dialog\" :title=\"title\" :showIcon=\"false\">\n <CodeEdi"
},
{
"path": "packages/editor/src/components/code/UserData.vue",
"chars": 1595,
"preview": "<template>\n <n-modal :show=\"show\" @update:show=\"(s) => emits('update:show',s)\" class=\"!w-60vw\" preset=\"dialog\"\n "
},
{
"path": "packages/editor/src/components/drawing/Drawing.vue",
"chars": 5582,
"preview": "<template>\n <div id=\"drawing\" class=\"!w-full !h-full\" @contextmenu=\"handleContextMenu\">\n <n-spin :show=\"loading\">\n "
},
{
"path": "packages/editor/src/components/drawing/toolbar/CAD.vue",
"chars": 4646,
"preview": "<template>\n <div class=\"drawing-tool-bar\">\n <n-tooltip trigger=\"hover\" placement=\"bottom\" v-for=\"m in toolbar\" :key="
},
{
"path": "packages/editor/src/components/drawing/toolbar/CadLayers.vue",
"chars": 2854,
"preview": "<template>\n <n-popover trigger=\"manual\" :show=\"show\">\n <template #trigger>\n <span class=\"absolute\" ref=\"trigger"
},
{
"path": "packages/editor/src/components/drawing/toolbar/Image.vue",
"chars": 3802,
"preview": "<template>\n <div class=\"drawing-tool-bar\">\n <n-tooltip trigger=\"hover\" placement=\"bottom\" v-for=\"m in toolbar\" :key="
},
{
"path": "packages/editor/src/components/es/EsContextmenu.vue",
"chars": 748,
"preview": "<template>\n <n-dropdown v-bind=\"attrs\" :x=\"x\" :y=\"y\" :options=\"options\" :show=\"visible\" :on-clickoutside=\"onClickouts"
},
{
"path": "packages/editor/src/components/es/EsCubeLoading.vue",
"chars": 2857,
"preview": "<script setup lang=\"ts\">\nwithDefaults(defineProps<{\n visible:boolean\n}>(),{\n visible:false\n})\n</script>\n\n<template>\n "
},
{
"path": "packages/editor/src/components/es/EsDocument.vue",
"chars": 502,
"preview": "<template>\n <n-alert type=\"success\" :show-icon=\"false\" closable class=\"mb-2\">\n <div class=\"flex items-center\">\n "
},
{
"path": "packages/editor/src/components/es/EsFormItemHelpLabel.vue",
"chars": 509,
"preview": "<script setup lang=\"ts\">\nimport {Help} from '@vicons/carbon';\n\nwithDefaults(defineProps<{\n label:string\n}>(),{\n label:"
},
{
"path": "packages/editor/src/components/es/EsInput.vue",
"chars": 1011,
"preview": "<template>\n <div class=\"es-input flex items-center w-full\">\n <label v-if=\"label\">{{ label }}</label>\n <div v-if=\""
},
{
"path": "packages/editor/src/components/es/EsInputNumber.vue",
"chars": 3555,
"preview": "<template>\n <n-input-number ref=\"inRef\" v-model:value=\"esNumber\" :step=\"step\" :min=\"min\" :max=\"max\" v-bind=\"attrs\"\n "
},
{
"path": "packages/editor/src/components/es/EsKeyFrame.vue",
"chars": 783,
"preview": "<script setup lang=\"ts\">\nimport {ConditionPoint} from '@vicons/carbon';\nimport {t} from \"@/language\";\nimport {useAnimati"
},
{
"path": "packages/editor/src/components/es/EsParticleEasing.vue",
"chars": 2267,
"preview": "<template>\n <n-select size=\"small\" v-bind=\"attrs\" v-model:value=\"selected\" @update:value=\"update\" :options=\"options\"/>\n"
},
{
"path": "packages/editor/src/components/es/EsPlugin.vue",
"chars": 3455,
"preview": "<script setup lang=\"ts\">\nimport {ref, computed, onMounted} from 'vue';\nimport {useThemeVars} from 'naive-ui'\nimport {use"
},
{
"path": "packages/editor/src/components/es/EsPopTreeSelect.vue",
"chars": 1993,
"preview": "<script setup lang=\"ts\">\nimport {ref, onMounted, nextTick} from 'vue';\nimport type {TreeOption} from 'naive-ui';\nimport "
},
{
"path": "packages/editor/src/components/es/EsTexture.vue",
"chars": 7035,
"preview": "<script lang=\"ts\" setup>\nimport {ref, onMounted, watch,nextTick} from \"vue\";\nimport type {UploadFileInfo} from 'naive-ui"
},
{
"path": "packages/editor/src/components/es/EsTip.vue",
"chars": 889,
"preview": "<script setup lang=\"ts\">\nimport {AlertCircleOutline} from '@vicons/ionicons5';\n\nwithDefaults(defineProps<{\n size?: stri"
},
{
"path": "packages/editor/src/components/es/plugin/EsPluginDialog.vue",
"chars": 1344,
"preview": "<script setup lang=\"ts\">\nimport {ref} from \"vue\";\nimport {t} from \"@/language\";\nimport Logo from \"@/components/header/Lo"
},
{
"path": "packages/editor/src/components/es/plugin/EsPluginList.vue",
"chars": 1161,
"preview": "<script setup lang=\"ts\">\nimport {computed} from \"vue\";\nimport {usePluginStore} from \"@/store/modules/plugin\";\nimport Log"
},
{
"path": "packages/editor/src/components/es/plugin/builtin/EarthGenerator.vue",
"chars": 98,
"preview": "<script setup lang=\"ts\">\n\n</script>\n\n<template>\n\n</template>\n\n<style scoped lang=\"less\">\n\n</style>"
},
{
"path": "packages/editor/src/components/es/plugin/builtin/GLTFHandler.vue",
"chars": 9343,
"preview": "<script setup lang=\"ts\">\nimport {computed, ref,watchEffect,nextTick} from \"vue\";\nimport { useThemeVars } from 'naive-ui'"
},
{
"path": "packages/editor/src/components/es/plugin/builtin/PointCloudReconstructor.vue",
"chars": 12701,
"preview": "<script setup lang=\"ts\">\nimport { computed, ref, onMounted, nextTick, useTemplateRef, reactive } from \"vue\";\nimport { us"
},
{
"path": "packages/editor/src/components/es/plugin/builtin/glTFHandler/GLTFHandlerForm.vue",
"chars": 11367,
"preview": "<script setup lang=\"ts\">\nimport {ref} from \"vue\";\nimport {t} from \"@/language\";\nimport EsFormItemHelpLabel from \"@/compo"
},
{
"path": "packages/editor/src/components/es/plugin/builtin/pointCloudReconstructor/ReconstructorForm.vue",
"chars": 2951,
"preview": "<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport { t } from \"@/language\";\nimport EsFormItemHelpLabel from \"@/c"
},
{
"path": "packages/editor/src/components/header/Logo.vue",
"chars": 1296,
"preview": "<template>\n <svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m27.19815,87.08654l-20.82,-11.8"
},
{
"path": "packages/editor/src/components/header/NavigationOperation.vue",
"chars": 764,
"preview": "<template>\n <div id=\"navigationOperation\" class=\"flex items-center\">\n <!-- 撤回/重做 -->\n <Do />\n\n <!-- 删除 -->"
},
{
"path": "packages/editor/src/components/header/RightOperation.vue",
"chars": 1293,
"preview": "<script lang=\"ts\" setup>\nimport {ref,onMounted} from 'vue';\nimport XR from '@/components/header/right/XR.vue';\nimport {A"
},
{
"path": "packages/editor/src/components/header/navigation/Clear.vue",
"chars": 992,
"preview": "<template>\n\t<n-tooltip trigger=\"hover\">\n\t\t<template #trigger>\n\t\t\t<n-button text class=\"mr-5\" :disabled=\"disabled\" @click"
},
{
"path": "packages/editor/src/components/header/navigation/Copy.vue",
"chars": 1037,
"preview": "<template>\n <n-tooltip trigger=\"hover\">\n <template #trigger>\n <n-button text class=\"mr-2\" :disabled=\"disabled\" "
},
{
"path": "packages/editor/src/components/header/navigation/Delete.vue",
"chars": 1015,
"preview": "<template>\n <n-tooltip trigger=\"hover\">\n <template #trigger>\n <n-button text class=\"mr-2\" :disabled=\"disabled\" "
},
{
"path": "packages/editor/src/components/header/navigation/Do.vue",
"chars": 1647,
"preview": "<template>\n <n-tooltip trigger=\"hover\">\n <template #trigger>\n <n-button text class=\"mr-2\" :disabled=\"undoDisabl"
},
{
"path": "packages/editor/src/components/header/navigation/Fullscreen.vue",
"chars": 1711,
"preview": "<template>\n <div class=\"flex items-center mr-5\">\n <n-tooltip trigger=\"hover\" v-if=\"!isFullscreen\">\n <template #"
},
{
"path": "packages/editor/src/components/header/navigation/ImportExport.vue",
"chars": 3305,
"preview": "<template>\n <n-dropdown :options=\"exportOptions\" placement=\"bottom-start\" trigger=\"click\" @select=\"handleExportSelect\">"
},
{
"path": "packages/editor/src/components/header/right/SaveToService.vue",
"chars": 3737,
"preview": "<script lang=\"ts\" setup>\n\timport { nextTick } from \"vue\";\n\timport { Save } from \"@vicons/carbon\";\n\timport { t } from \"@/"
},
{
"path": "packages/editor/src/components/header/right/XR.vue",
"chars": 1213,
"preview": "<template>\n <div class=\"flex items-center mr-2\">\n <n-tooltip trigger=\"hover\" v-if=\"supportVR\">\n <template #trig"
},
{
"path": "packages/editor/src/components/preview/AssetPreview.vue",
"chars": 3769,
"preview": "<template>\n\t<n-modal\n\t\t:show=\"visible\"\n\t\t@update:show=\"emits('update:visible', $event)\"\n\t\tdisplay-directive=\"show\"\n\t\tcla"
},
{
"path": "packages/editor/src/components/preview/CommonPreview.vue",
"chars": 2376,
"preview": "<template>\n <n-modal :show=\"visible\" @update:show=\"emits('update:visible',$event)\" display-directive=\"show\" class=\"w-66"
},
{
"path": "packages/editor/src/components/preview/CommonPreview_backup.vue",
"chars": 2211,
"preview": "<template>\n <n-modal :show=\"visible\" @update:show=\"emits('update:visible',$event)\" display-directive=\"show\" class=\"w-66"
},
{
"path": "packages/editor/src/components/project/ProjectInfoForm.vue",
"chars": 2377,
"preview": "<script lang=\"ts\" setup>\nimport {ref, watch} from \"vue\";\nimport {t} from \"@/language\";\nimport {defaultProjectInfo} from "
},
{
"path": "packages/editor/src/components/setting/Setting.vue",
"chars": 506,
"preview": "<script setup lang=\"ts\">\nimport Theme from \"./common/Theme.vue\";\nimport Locale from \"./common/Locale.vue\";\nimport Color "
},
{
"path": "packages/editor/src/components/setting/common/Color.vue",
"chars": 5501,
"preview": "<template>\n <n-tooltip trigger=\"hover\">\n <template #trigger>\n <n-button quaternary @click=\"show = true\">\n "
},
{
"path": "packages/editor/src/components/setting/common/Locale.vue",
"chars": 682,
"preview": "<template>\n <n-popselect v-model:value=\"value\" :options=\"options\" @update:value=\"setLocale\">\n <n-button quaternary c"
},
{
"path": "packages/editor/src/components/setting/common/SettingCenter.vue",
"chars": 853,
"preview": "<template>\n <n-tooltip trigger=\"hover\">\n <template #trigger>\n <n-button quaternary @click=\"show = true\">\n "
},
{
"path": "packages/editor/src/components/setting/common/Theme.vue",
"chars": 1114,
"preview": "<template>\n <n-tooltip trigger=\"hover\">\n <template #trigger>\n <n-button quaternary @click=\"globalConfigStore.se"
},
{
"path": "packages/editor/src/components/setting/components/PreviewSetting.vue",
"chars": 1684,
"preview": "<template>\n <n-form :model=\"form\" label-placement=\"left\" :label-width=\"120\" class=\"mt-2\" :style=\"{ minWidth: '300px' }\""
},
{
"path": "packages/editor/src/components/setting/components/SettingTabs.vue",
"chars": 592,
"preview": "<script setup lang=\"ts\">\nimport {t} from \"@/language\";\n</script>\n\n<template>\n <n-tabs type=\"line\" animated default-valu"
},
{
"path": "packages/editor/src/components/setting/components/Shortcuts.vue",
"chars": 4205,
"preview": "<template>\n <n-form :model=\"form\" label-placement=\"left\" :label-width=\"120\" class=\"mt-2\"\n :style=\"{ minWidth: "
},
{
"path": "packages/editor/src/components/setting/components/SystemSetting.vue",
"chars": 250,
"preview": "<template>\n <n-result status=\"418\" class=\"my-20\" title=\"Empty\" :description=\"t('setting.system.No system Settings are a"
},
{
"path": "packages/editor/src/components/tree/SceneTree.vue",
"chars": 12144,
"preview": "<script lang=\"ts\" setup>\nimport {h, ref, onMounted, nextTick, onBeforeUnmount} from \"vue\";\nimport {TreeOption, TreeDropI"
},
{
"path": "packages/editor/src/config/service.ts",
"chars": 1067,
"preview": "/** 错误信息的显示时间 */\nexport const ERROR_MSG_DURATION = 3 * 1000;\n\n/** 默认的请求错误code */\nexport const DEFAULT_REQUEST_ERROR_CODE"
},
{
"path": "packages/editor/src/core/AssetPreview.ts",
"chars": 1558,
"preview": "import {Preview,Utils} from \"@astral3d/engine\";\n\nexport class AssetPreview {\n static #instance:AssetPreview; // 静态"
},
{
"path": "packages/editor/src/hooks/index.ts",
"chars": 114,
"preview": "import useBoolean from './useBoolean';\nimport useLoading from './useLoading';\n\nexport { useBoolean, useLoading };\n"
},
{
"path": "packages/editor/src/hooks/useBoolean.ts",
"chars": 455,
"preview": "import { ref } from 'vue';\n\n/**\n * boolean组合式函数\n * @param initValue 初始值\n */\nexport default function useBoolean(initValue"
},
{
"path": "packages/editor/src/hooks/useLoading.ts",
"chars": 257,
"preview": "import useBoolean from './useBoolean';\n\nexport default function useLoading(initValue = false) {\n const { bool: loading,"
},
{
"path": "packages/editor/src/hooks/useWebSocket.ts",
"chars": 3304,
"preview": "/**\n * @author MaHaiBing\n * @email mlt131220@163.com\n * @date 2023/11/29 10:10\n * @description websocket hook;使用store"
},
{
"path": "packages/editor/src/http/api/assetsCategory.ts",
"chars": 215,
"preview": "import {request} from \"@/http/request\";\n\n/**\n * 获取资产分类树\n */\nexport function fetchAssetsCategoryTreeList(params = {type: "
},
{
"path": "packages/editor/src/http/api/assetsInfo.ts",
"chars": 895,
"preview": "import {request} from \"@/http/request\";\n\n/**\n * 获取资产列表\n */\nexport function fetchGetAssetsList(params:Service.ListPageQue"
},
{
"path": "packages/editor/src/http/api/bim.ts",
"chars": 688,
"preview": "import {request} from \"@/http/request\";\nimport {useWebsocketStore} from \"@/store/modules/websocket\";\n\nconst websocketSto"
},
{
"path": "packages/editor/src/http/api/cad.ts",
"chars": 545,
"preview": "import {request} from \"@/http/request\";\nimport {useWebsocketStore} from \"@/store/modules/websocket\";\n\nconst websocketSto"
},
{
"path": "packages/editor/src/http/api/sceneExample.ts",
"chars": 749,
"preview": "/**\n * @author MaHaiBing\n * @email mlt131220@163.com\n * @date 2024/7/28 14:54\n * @description 示例场景\n */\nimport {reques"
},
{
"path": "packages/editor/src/http/api/scenes.ts",
"chars": 813,
"preview": "import {request} from \"@/http/request\";\n\n/**\n * 获取所有工程信息\n */\nexport function fetchGetAllScenes(params:Service.ListPageQu"
},
{
"path": "packages/editor/src/http/api/sys.ts",
"chars": 233,
"preview": "import {request} from \"@/http/request\";\n\n/**\n * 上传\n */\nexport function fetchUpload(data:{file:File,biz:string,type?:stri"
},
{
"path": "packages/editor/src/http/request/ConcurrencyManager.ts",
"chars": 1604,
"preview": "const ConcurrencyManager = (axios, MAX_CONCURRENT = 10) => {\n if (MAX_CONCURRENT < 1)\n throw \"并发管理器错误: 最小并发请求数为 1\";\n"
},
{
"path": "packages/editor/src/http/request/index.ts",
"chars": 99,
"preview": "import {createRequest} from \"./request\";\n\nexport const request = createRequest({ baseURL:\"/api\" });"
},
{
"path": "packages/editor/src/http/request/instance.ts",
"chars": 3192,
"preview": "import axios from 'axios';\nimport type {AxiosError, AxiosInstance, AxiosRequestConfig} from 'axios';\nimport {\n handle"
},
{
"path": "packages/editor/src/http/request/request.ts",
"chars": 5284,
"preview": "import { ref } from 'vue';\nimport type { Ref } from 'vue';\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios"
},
{
"path": "packages/editor/src/language/index.ts",
"chars": 2972,
"preview": "import type { App } from 'vue';\nimport { computed,ComputedRef } from 'vue';\nimport { createI18n } from 'vue-i18n';\nimpor"
},
{
"path": "packages/editor/src/language/zh-CN-en-US.ts",
"chars": 39756,
"preview": "export default {\n ErSan:\"二三\",\n home: {\n 'Project': \"项目\",\n 'Data Center': \"数据中心\",\n 'Resource C"
},
{
"path": "packages/editor/src/main.ts",
"chars": 643,
"preview": "import '@/utils/common/init';\n\nimport { createApp } from 'vue';\nimport App from './App.vue';\nimport { setupStore } from "
},
{
"path": "packages/editor/src/plugin/glTFHandler/Listr.ts",
"chars": 930,
"preview": "/**\n * @author ErSan\n * @email mlt131220@163.com\n * @date 2024/9/18 22:24\n * @description\n */\n\nexport class ListrTask"
},
{
"path": "packages/editor/src/plugin/glTFHandler/glTFHandler.ts",
"chars": 8066,
"preview": "/**\n * @author ErSan\n * @email mlt131220@163.com\n * @date 2024/9/16 23:19\n * @description glTF处理器插件\n */\nimport {h, re"
},
{
"path": "packages/editor/src/plugin/glTFHandler/optimizePng.ts",
"chars": 831,
"preview": "import type { Transform } from '@gltf-transform/core';\nimport { encodePNG } from './util';\n\nfunction asUint8Array(data: "
},
{
"path": "packages/editor/src/plugin/glTFHandler/session.ts",
"chars": 5317,
"preview": "import { Document, WebIO, FileUtils, Transform, Format, Logger } from '@gltf-transform/core';\nimport type { Packet, KHRX"
},
{
"path": "packages/editor/src/plugin/glTFHandler/util.ts",
"chars": 1588,
"preview": "import { Utils } from \"@astral3d/engine\";\n\nexport const XMPContext: Record<string, string> = {\n dc: 'http://purl.org/"
},
{
"path": "packages/editor/src/plugin/index.ts",
"chars": 345,
"preview": "import GLTFHandler from \"./glTFHandler/glTFHandler\";\nimport PointCloudReconstructor from \"./pointCloudReconstructor/Poin"
},
{
"path": "packages/editor/src/plugin/pointCloudReconstructor/PointCloudReconstructor.ts",
"chars": 1573,
"preview": "/**\n * @author ErSan\n * @email mlt131220@163.com\n * @date 2025/07/03 14:20\n * @description 语义化点云重建\n */\nimport { h, re"
},
{
"path": "packages/editor/src/router/index.ts",
"chars": 386,
"preview": "import type { App } from 'vue';\nimport {createRouter, createWebHashHistory} from 'vue-router';\nimport {routes} from \"@/r"
},
{
"path": "packages/editor/src/router/routes.ts",
"chars": 392,
"preview": "export const routes = [\n {\n path: '/',\n name: 'Home',\n component: () => import('@/views/home/ind"
},
{
"path": "packages/editor/src/store/index.ts",
"chars": 188,
"preview": "import type { App } from 'vue';\nimport { createPinia } from 'pinia';\n\nconst store = createPinia();\n\nexport function setu"
},
{
"path": "packages/editor/src/store/modules/animation.ts",
"chars": 10551,
"preview": "import {reactive, toRefs, h,computed} from \"vue\";\nimport {NIcon} from 'naive-ui';\nimport type {TreeOption} from 'naive-u"
},
{
"path": "packages/editor/src/store/modules/assets.ts",
"chars": 2219,
"preview": "import {reactive, toRefs,markRaw} from \"vue\";\nimport {defineStore} from 'pinia';\nimport {Hdr, ImageReference, LocationHe"
},
{
"path": "packages/editor/src/store/modules/drag.ts",
"chars": 989,
"preview": "import { defineStore } from 'pinia';\nimport {Vector2} from \"three\";\nimport { store } from '@/store';\n\ninterface IDragSta"
},
{
"path": "packages/editor/src/store/modules/globalConfig.ts",
"chars": 2926,
"preview": "import {ref} from 'vue';\nimport {defineStore} from 'pinia';\nimport {darkTheme, useOsTheme} from \"naive-ui\";\nimport type "
},
{
"path": "packages/editor/src/store/modules/plugin.ts",
"chars": 1246,
"preview": "/**\n * @author ErSan\n * @email mlt131220@163.com\n * @date 2024/9/16 0:36\n * @description\n */\nimport { defineStore } f"
},
{
"path": "packages/editor/src/store/modules/previewOperation.ts",
"chars": 3203,
"preview": "import type {Component} from 'vue'\nimport {defineStore} from 'pinia';\nimport {store} from '@/store';\nimport {\n Home,\n"
},
{
"path": "packages/editor/src/store/modules/websocket.ts",
"chars": 1302,
"preview": "import {reactive, toRefs} from \"vue\";\nimport { defineStore } from 'pinia';\nimport { useStorage } from '@vueuse/core'\nimp"
},
{
"path": "packages/editor/src/utils/common/base64.ts",
"chars": 740,
"preview": "/**\n * byte数组转换成base64 数据\n * @param {Array<byte>} buffer\n * @return {string} base64 string\n */\nexport function _arrayBuf"
},
{
"path": "packages/editor/src/utils/common/color.ts",
"chars": 208,
"preview": "// 10进制转rgba\nexport function decToRgb(number:number) {\n const blue = number & 0xff;\n const green = number >> 8 & 0"
},
{
"path": "packages/editor/src/utils/common/constant.ts",
"chars": 1376,
"preview": "/**\n * @author ErSan\n * @email mlt131220@163.com\n * @date 2024/3/26 9:57\n * @description 全局常量\n */\n// 支持的模型格式\nexport c"
},
{
"path": "packages/editor/src/utils/common/dateTime.ts",
"chars": 695,
"preview": "export function dateTimeFormat(fmt) {\n let myDate = new Date();\n let o = {\n \"M+\": myDate.getMonth() + 1, //"
},
{
"path": "packages/editor/src/utils/common/file.ts",
"chars": 1733,
"preview": "import {pow1024} from \"./utils\";\n\n/**\n * 通过Fetch API下载文件/图片(支持跨域/Blob处理)\n * @param {string} url 文件地址\n * @param {string} "
},
{
"path": "packages/editor/src/utils/common/init.ts",
"chars": 1989,
"preview": "import \"../signals/signalRegister\";\n\nwindow.URL = window.URL || window.webkitURL;\n// @ts-ignore\nwindow.BlobBuilder = win"
},
{
"path": "packages/editor/src/utils/common/render.ts",
"chars": 256,
"preview": "import { h } from 'vue';\nimport type { Component } from 'vue'\nimport { NIcon } from 'naive-ui';\n\n/**\n * 渲染icon\n * @param"
},
{
"path": "packages/editor/src/utils/common/scenes.ts",
"chars": 5272,
"preview": "import * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/Addons';\nimport { App } from \"@astral3"
},
{
"path": "packages/editor/src/utils/common/utils.ts",
"chars": 4389,
"preview": "import type { TreeOption } from 'naive-ui';\nimport {BASE64_TYPES} from \"@astral3d/engine\";\nimport {t} from \"@/language\";"
},
{
"path": "packages/editor/src/utils/common/verify.ts",
"chars": 635,
"preview": "/**\n * 用于验证的工具函数集合\n */\nimport {t} from \"@/language\";\n\nexport function formItemIsFile(_, value:File | null){\n return n"
},
{
"path": "packages/editor/src/utils/drawing/drawRect.ts",
"chars": 18631,
"preview": "import {App,Utils,Hooks} from \"@astral3d/engine\";\nimport {getSelectedModelPath} from \"@/utils/common/scenes\";\n\nlet canva"
},
{
"path": "packages/editor/src/utils/preview/menuOperation.ts",
"chars": 9433,
"preview": "/**\n * @author ErSan\n * @email mlt131220@163.com\n * @date 2024/8/22\n * @description 预览菜单操作\n */\nimport { useFullscreen"
},
{
"path": "packages/editor/src/utils/service/error.ts",
"chars": 2910,
"preview": "import type { AxiosError, AxiosResponse } from 'axios';\nimport {\n DEFAULT_REQUEST_ERROR_CODE,\n DEFAULT_REQUEST_ERROR_M"
},
{
"path": "packages/editor/src/utils/service/fetchController.ts",
"chars": 2217,
"preview": "/**\n * 创建一个handlerFetch\n *\n * @param limit 并发控制 \n * @param timeout 超时设\n * @return function 返回一个函数\n */\nexport function fe"
},
{
"path": "packages/editor/src/utils/service/handler.ts",
"chars": 993,
"preview": "import {Service} from \"~/network\";\n\n/** 统一失败和成功的请求结果的数据类型 */\nexport async function handleServiceResult(error: Service.Re"
},
{
"path": "packages/editor/src/utils/service/index.ts",
"chars": 52,
"preview": "export * from './error';\nexport * from './handler';\n"
},
{
"path": "packages/editor/src/utils/service/msg.ts",
"chars": 846,
"preview": "import { ERROR_MSG_DURATION, NO_ERROR_MSG_CODE } from '@/config/service';\n\n/** 错误消息栈,防止同一错误同时出现 */\nconst errorMsgStack ="
},
{
"path": "packages/editor/src/utils/signals/signalRegister.ts",
"chars": 198,
"preview": "import {Utils} from '@astral3d/engine';\n\n/**\n * 其他不便分类的\n */\nconst otherSignal = [\n // 编辑脚本\n \"editScript\",\n // 场"
}
]
// ... and 548 more files (download for full content)
About this extraction
This page contains the full source code of the mlt131220/ES-3DEditor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 748 files (18.9 MB), approximately 5.0M tokens, and a symbol index with 11079 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.