evomeme 0.1.9 → 0.1.10-beta.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/canvas-public/app.js +509 -5999
- package/dist/canvas-public/assets/presets/catalog.json +47 -0
- package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
- package/dist/canvas-public/canvas/actions.js +144 -0
- package/dist/canvas-public/canvas/camera.js +28 -0
- package/dist/canvas-public/canvas/chrome.js +14 -0
- package/dist/canvas-public/canvas/data.js +123 -0
- package/dist/canvas-public/canvas/dependencies.js +19 -0
- package/dist/canvas-public/canvas/interactions.js +544 -0
- package/dist/canvas-public/canvas/panel-resize.js +5 -0
- package/dist/canvas-public/canvas/renderer.js +297 -0
- package/dist/canvas-public/canvas/selection.js +62 -0
- package/dist/canvas-public/canvas/serialization.js +118 -0
- package/dist/canvas-public/canvas/sync.js +202 -0
- package/dist/canvas-public/core/api.js +32 -0
- package/dist/canvas-public/core/feature-registry.js +29 -0
- package/dist/canvas-public/core/feature-state.js +228 -0
- package/dist/canvas-public/core/layout.js +133 -0
- package/dist/canvas-public/core/operations.js +38 -0
- package/dist/canvas-public/core/project.js +203 -0
- package/dist/canvas-public/core/state.js +27 -0
- package/dist/canvas-public/dialogs/context-menu.js +118 -0
- package/dist/canvas-public/elements/base.js +100 -0
- package/dist/canvas-public/elements/connections.js +105 -0
- package/dist/canvas-public/elements/drag.js +53 -0
- package/dist/canvas-public/elements/image.js +259 -0
- package/dist/canvas-public/elements/loading-recovery.js +5 -0
- package/dist/canvas-public/elements/loading.js +21 -0
- package/dist/canvas-public/elements/map.js +64 -0
- package/dist/canvas-public/elements/registry.js +58 -0
- package/dist/canvas-public/elements/replacement.js +78 -0
- package/dist/canvas-public/elements/resize.js +210 -0
- package/dist/canvas-public/elements/task-pipeline.js +235 -0
- package/dist/canvas-public/elements/types.js +21 -0
- package/dist/canvas-public/elements/ui.js +14 -0
- package/dist/canvas-public/elements/video.js +64 -0
- package/dist/canvas-public/features/assets/local-assets.js +72 -0
- package/dist/canvas-public/features/assets/official-assets.js +539 -0
- package/dist/canvas-public/features/editing/canvas-size.js +532 -0
- package/dist/canvas-public/features/editing/color-key.js +471 -0
- package/dist/canvas-public/features/editing/cutout.js +20 -0
- package/dist/canvas-public/features/editing/interactive-image-editing.js +982 -0
- package/dist/canvas-public/features/editing/layer-decomposition.js +45 -0
- package/dist/canvas-public/features/editing/manual-split.js +115 -0
- package/dist/canvas-public/features/editing/perfect-pixel.js +299 -0
- package/dist/canvas-public/features/editing/scroll-preview.js +130 -0
- package/dist/canvas-public/features/editing/scroll-seam-elimination.js +71 -0
- package/dist/canvas-public/features/editing/seam-elimination.js +46 -0
- package/dist/canvas-public/features/editing/smart-split.js +49 -0
- package/dist/canvas-public/features/editing/source-preview.js +43 -0
- package/dist/canvas-public/features/editing/video-cycle.js +49 -0
- package/dist/canvas-public/features/editing/video-frames.js +35 -0
- package/dist/canvas-public/features/frame-editor/frame-editing.js +755 -0
- package/dist/canvas-public/features/frame-editor/frame-model.js +63 -0
- package/dist/canvas-public/features/frame-editor/playback.js +83 -0
- package/dist/canvas-public/features/frame-editor/preview.js +151 -0
- package/dist/canvas-public/features/generation/animation.js +272 -0
- package/dist/canvas-public/features/generation/asset-batch.js +102 -0
- package/dist/canvas-public/features/generation/direction.js +163 -0
- package/dist/canvas-public/features/generation/fields.js +73 -0
- package/dist/canvas-public/features/generation/game-ui.js +64 -0
- package/dist/canvas-public/features/generation/image.js +96 -0
- package/dist/canvas-public/features/generation/scroll-image.js +157 -0
- package/dist/canvas-public/features/generation/seamless-tile.js +52 -0
- package/dist/canvas-public/features/generation/tile-transition-atlas.js +79 -0
- package/dist/canvas-public/features/generation/video.js +105 -0
- package/dist/canvas-public/features/map/creation.js +73 -0
- package/dist/canvas-public/features/map/tile-map-editor.js +2520 -0
- package/dist/canvas-public/features/registry.js +59 -0
- package/dist/canvas-public/index.html +84 -259
- package/dist/canvas-public/inspector/controls.js +49 -0
- package/dist/canvas-public/inspector/frame-preview.js +11 -0
- package/dist/canvas-public/inspector/inspector.js +190 -0
- package/dist/canvas-public/inspector/media-inspector.js +517 -0
- package/dist/canvas-public/inspector/media-preview.js +56 -0
- package/dist/canvas-public/inspector/number-stepper.js +96 -0
- package/dist/canvas-public/inspector/resize.js +88 -0
- package/dist/canvas-public/inspector/scroll-preview.js +11 -0
- package/dist/canvas-public/inspector/ui-inspector.js +14 -0
- package/dist/canvas-public/language/en-US.js +1059 -0
- package/dist/canvas-public/language/index.js +91 -0
- package/dist/canvas-public/language/zh-CN.js +1059 -0
- package/dist/canvas-public/map/export.js +10 -0
- package/dist/canvas-public/map/inspector.js +8 -0
- package/dist/canvas-public/map/model.js +409 -0
- package/dist/canvas-public/map/tile-map-editor.js +2 -0
- package/dist/canvas-public/media/metadata.js +183 -0
- package/dist/canvas-public/media/support.js +183 -0
- package/dist/canvas-public/styles/base.css +49 -0
- package/dist/canvas-public/styles/canvas.css +127 -0
- package/dist/canvas-public/styles/controls.css +203 -0
- package/dist/canvas-public/styles/dialogs.css +521 -0
- package/dist/canvas-public/styles/feature-form.css +409 -0
- package/dist/canvas-public/styles/inspector.css +441 -0
- package/dist/canvas-public/styles/layout.css +344 -0
- package/dist/canvas-public/styles/map.css +11 -0
- package/dist/canvas-public/styles/nodes.css +636 -0
- package/dist/canvas-public/styles.css +9 -2247
- package/dist/canvas-public/ui/controls.js +222 -0
- package/dist/canvas-public/ui/elements.js +9 -0
- package/dist/canvas-public/ui/feature-controller.js +296 -0
- package/dist/canvas-public/ui/feature-form.js +402 -0
- package/dist/canvas-public/ui/settings.js +84 -0
- package/dist/canvas-public/ui/toolbar.js +55 -0
- package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
- package/dist/canvas-public/vendor/pixi.min.js +2340 -0
- package/dist/canvas-public/workers/color-key-worker.js +289 -0
- package/dist/image-workers/perfect-pixel/perfect-pixel-core.js +441 -0
- package/dist/image-workers/perfect-pixel/perfect-pixel-worker.cjs +10 -0
- package/dist/index.js +46710 -12400
- package/dist/skills/en-US/evomeme-canvas/SKILL.md +52 -0
- package/dist/skills/en-US/evomeme-canvas/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +203 -0
- package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-cover/SKILL.md +131 -0
- package/dist/skills/en-US/evomeme-cover/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-game-maker/SKILL.md +288 -0
- package/dist/skills/en-US/evomeme-game-maker/agents/openai.yaml +4 -0
- package/dist/skills/en-US/evomeme-login/SKILL.md +97 -0
- package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-mcp/SKILL.md +71 -0
- package/dist/skills/en-US/evomeme-mcp/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-mcp/references/troubleshooting.md +55 -0
- package/dist/skills/en-US/evomeme-native-bridge-sdk/SKILL.md +286 -0
- package/dist/skills/en-US/evomeme-native-bridge-sdk/agents/openai.yaml +8 -0
- package/dist/skills/en-US/evomeme-tos-upload/SKILL.md +47 -0
- package/dist/skills/en-US/evomeme-tos-upload/agents/openai.yaml +5 -0
- package/dist/skills/en-US/evomeme-ui/SKILL.md +123 -0
- package/dist/skills/en-US/evomeme-ui/agents/openai.yaml +4 -0
- package/dist/skills/en-US/evomeme-ui/references/host-layout.md +69 -0
- package/dist/skills/en-US/game-art/SKILL.md +121 -0
- package/dist/skills/en-US/game-art/agents/openai.yaml +8 -0
- package/dist/skills/en-US/game-asset-align/SKILL.md +47 -0
- package/dist/skills/en-US/game-asset-align/agents/openai.yaml +8 -0
- package/dist/skills/en-US/game-asset-align/references/alignment-contract.md +61 -0
- package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +35 -0
- package/dist/skills/en-US/game-asset-align/references/canonical-package.md +26 -0
- package/dist/skills/en-US/game-asset-align/references/engine-capabilities.md +14 -0
- package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +34 -0
- package/dist/skills/en-US/game-asset-align/references/repair-policy.md +30 -0
- package/dist/skills/en-US/game-asset-align/references/tool-contract.md +69 -0
- package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
- package/dist/skills/en-US/game-asset-batch-generator/SKILL.md +117 -0
- package/dist/skills/en-US/game-asset-batch-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-asset-image-generator/SKILL.md +86 -0
- package/dist/skills/en-US/game-asset-image-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-asset-image-generator/references/background.md +34 -0
- package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
- package/dist/skills/en-US/game-asset-mesh-generator/SKILL.md +35 -0
- package/dist/skills/en-US/game-asset-mesh-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/animation-presets.md +313 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/generation-contracts.md +131 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/threejs-integration.md +113 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/tool-reference.md +67 -0
- package/dist/skills/en-US/game-audio/SKILL.md +121 -0
- package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
- package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +7 -11
- package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +6 -4
- package/dist/skills/en-US/game-character-view-generator/SKILL.md +110 -0
- package/dist/skills/en-US/game-character-view-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-demo/SKILL.md +103 -0
- package/dist/skills/en-US/game-demo/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-image-layer-decomposer/SKILL.md +99 -0
- package/dist/skills/en-US/game-image-layer-decomposer/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-image-splitter/SKILL.md +114 -0
- package/dist/skills/en-US/game-image-splitter/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-maker/SKILL.md +111 -0
- package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -0
- package/dist/skills/en-US/game-perfect-pixel/SKILL.md +123 -0
- package/dist/skills/en-US/game-perfect-pixel/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-scroll-generator/SKILL.md +110 -0
- package/dist/skills/en-US/game-scroll-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-test/SKILL.md +58 -0
- package/dist/skills/en-US/game-test/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-tile-generator/SKILL.md +152 -0
- package/dist/skills/en-US/game-tile-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-ui/SKILL.md +177 -0
- package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
- package/dist/skills/en-US/game-ui-generator/SKILL.md +82 -0
- package/dist/skills/en-US/game-ui-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-ui-generator/references/component-patterns.md +65 -0
- package/dist/skills/en-US/game-ui-generator/references/runtime-integration.md +45 -0
- package/dist/skills/en-US/game-video-cycle/SKILL.md +98 -0
- package/dist/skills/en-US/game-video-cycle/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-video-generator/SKILL.md +78 -0
- package/dist/skills/en-US/game-video-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/godot-3d-game/SKILL.md +41 -0
- package/dist/skills/en-US/godot-3d-game/agents/openai.yaml +8 -0
- package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +26 -0
- package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +54 -0
- package/dist/skills/en-US/godot-3d-game/references/build-and-qa.md +22 -0
- package/dist/skills/en-US/godot-3d-game/references/canonical-asset-runtime.md +27 -0
- package/dist/skills/en-US/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
- package/dist/skills/en-US/godot-3d-game/references/physics-colliders.md +13 -0
- package/dist/skills/en-US/godot-3d-game/references/project-structure.md +22 -0
- package/dist/skills/en-US/godot-3d-game/references/skeleton-animation.md +16 -0
- package/dist/skills/en-US/phaser-2d-game/SKILL.md +127 -0
- package/dist/skills/en-US/phaser-2d-game/agents/openai.yaml +8 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-performance.md +64 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-physics.md +139 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-runtime.md +129 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-spritesheets.md +99 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-tilemaps.md +80 -0
- package/dist/skills/en-US/phaser-2d-game/references/file-structure.md +94 -0
- package/dist/skills/en-US/phaser-2d-graphics-builder/SKILL.md +68 -0
- package/dist/skills/en-US/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
- package/dist/skills/en-US/threejs-3d-game/SKILL.md +117 -0
- package/dist/skills/en-US/threejs-3d-game/agents/openai.yaml +7 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-audio.md +70 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-input-camera.md +84 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-performance.md +96 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-physics.md +142 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-runtime.md +199 -0
- package/dist/skills/en-US/threejs-3d-game/references/file-structure.md +353 -0
- package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +62 -0
- package/dist/skills/en-US/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
- package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/SKILL.md +33 -6
- package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +7 -8
- package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
- package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +5 -0
- package/dist/skills/zh-CN/evomeme-mcp/SKILL.md +71 -0
- package/dist/skills/zh-CN/evomeme-mcp/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/evomeme-mcp/references/troubleshooting.md +55 -0
- package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/SKILL.md +6 -5
- package/dist/skills/zh-CN/evomeme-ui/SKILL.md +123 -0
- package/dist/skills/zh-CN/evomeme-ui/agents/openai.yaml +4 -0
- package/dist/skills/zh-CN/evomeme-ui/references/host-layout.md +69 -0
- package/dist/skills/zh-CN/game-asset-align/SKILL.md +47 -0
- package/dist/skills/zh-CN/game-asset-align/agents/openai.yaml +8 -0
- package/dist/skills/zh-CN/game-asset-align/references/alignment-contract.md +61 -0
- package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +35 -0
- package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +26 -0
- package/dist/skills/zh-CN/game-asset-align/references/engine-capabilities.md +14 -0
- package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +34 -0
- package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +30 -0
- package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +69 -0
- package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
- package/dist/skills/zh-CN/game-asset-batch-generator/SKILL.md +117 -0
- package/dist/skills/zh-CN/game-asset-batch-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-asset-image-generator/SKILL.md +86 -0
- package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +3 -1
- package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +2 -2
- package/dist/skills/zh-CN/game-asset-mesh-generator/SKILL.md +35 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/animation-presets.md +313 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/generation-contracts.md +131 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/threejs-integration.md +113 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/tool-reference.md +67 -0
- package/dist/skills/zh-CN/game-audio/SKILL.md +121 -0
- package/dist/skills/zh-CN/game-audio/agents/openai.yaml +4 -0
- package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +123 -0
- package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +79 -0
- package/dist/skills/zh-CN/game-character-view-generator/SKILL.md +110 -0
- package/dist/skills/zh-CN/game-character-view-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-image-layer-decomposer/SKILL.md +99 -0
- package/dist/skills/zh-CN/game-image-layer-decomposer/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-image-splitter/SKILL.md +114 -0
- package/dist/skills/zh-CN/game-image-splitter/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-perfect-pixel/SKILL.md +123 -0
- package/dist/skills/zh-CN/game-perfect-pixel/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-scroll-generator/SKILL.md +110 -0
- package/dist/skills/zh-CN/game-scroll-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
- package/dist/skills/zh-CN/game-tile-generator/SKILL.md +151 -0
- package/dist/skills/zh-CN/game-tile-generator/agents/openai.yaml +7 -0
- package/{skills → dist/skills/zh-CN}/game-ui/SKILL.md +9 -1
- package/dist/skills/zh-CN/game-ui/references/checklists/game-ui-quality.md +14 -0
- package/dist/skills/zh-CN/game-ui/references/checklists/hud-readability.md +12 -0
- package/dist/skills/zh-CN/game-ui/references/checklists/mobile-input.md +12 -0
- package/dist/skills/zh-CN/game-ui/references/checklists/responsive-ui-fit.md +12 -0
- package/dist/skills/zh-CN/game-ui/references/ui-patterns.md +140 -0
- package/dist/skills/zh-CN/game-ui/references/ui-prompt-templates.md +63 -0
- package/dist/skills/zh-CN/game-ui-generator/SKILL.md +82 -0
- package/dist/skills/zh-CN/game-ui-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-ui-generator/references/component-patterns.md +65 -0
- package/dist/skills/zh-CN/game-ui-generator/references/runtime-integration.md +45 -0
- package/dist/skills/zh-CN/game-video-cycle/SKILL.md +98 -0
- package/dist/skills/zh-CN/game-video-cycle/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-video-generator/SKILL.md +78 -0
- package/dist/skills/zh-CN/game-video-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/godot-3d-game/SKILL.md +41 -0
- package/dist/skills/zh-CN/godot-3d-game/agents/openai.yaml +8 -0
- package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +26 -0
- package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +54 -0
- package/dist/skills/zh-CN/godot-3d-game/references/build-and-qa.md +22 -0
- package/dist/skills/zh-CN/godot-3d-game/references/canonical-asset-runtime.md +27 -0
- package/dist/skills/zh-CN/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
- package/dist/skills/zh-CN/godot-3d-game/references/physics-colliders.md +13 -0
- package/dist/skills/zh-CN/godot-3d-game/references/project-structure.md +22 -0
- package/dist/skills/zh-CN/godot-3d-game/references/skeleton-animation.md +16 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/technical-art.md +67 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
- package/{skills → dist/skills/zh-CN}/threejs-3d-game/SKILL.md +6 -2
- package/dist/skills/zh-CN/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
- package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +6 -6
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
- package/dist/stage-blender/bake_materials.py +102 -0
- package/dist/stage-blender/export_scene.py +275 -0
- package/dist/stage-blender/preview_camera.py +90 -0
- package/dist/stage-blender/repair_mesh.py +112 -0
- package/dist/stage-public/app.js +759 -0
- package/dist/stage-public/baked/bakePilot.js +44 -0
- package/dist/stage-public/baked/bakedScene.js +129 -0
- package/dist/stage-public/baked/sceneAppearance.js +225 -0
- package/dist/stage-public/baked/sceneCamera.js +45 -0
- package/dist/stage-public/comparison-contract.js +28 -0
- package/dist/stage-public/delivery.html +4 -0
- package/dist/stage-public/delivery.js +17 -0
- package/dist/stage-public/godot/appearance.gd +170 -0
- package/dist/stage-public/godot/preview.gd +79 -0
- package/dist/stage-public/index.html +141 -0
- package/dist/stage-public/review-app.js +289 -0
- package/dist/stage-public/review-runtime.js +63 -0
- package/dist/stage-public/review.css +24 -0
- package/dist/stage-public/review.html +47 -0
- package/dist/stage-public/scene-runtime.js +212 -0
- package/dist/stage-public/sceneContractRuntime.js +235 -0
- package/dist/stage-public/styles.css +328 -0
- package/dist/stage-public/three-appearance.js +104 -0
- package/dist/stage-public/vendor/three170/LICENSE +21 -0
- package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
- package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
- package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
- package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
- package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
- package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
- package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
- package/dist/tile-transition-mask.svg +40 -0
- package/package.json +24 -8
- package/dist/canvas-public/cycle-detect.js +0 -166
- package/dist/canvas-public/smart-split.js +0 -185
- package/skills/game-asset-image-generator/SKILL.md +0 -104
- package/skills/game-audio/SKILL.md +0 -82
- package/skills/game-audio/agents/openai.yaml +0 -4
- package/skills/threejs-3d-game/references/engine-asset-pipeline.md +0 -116
- /package/{skills → dist/skills/en-US}/game-test/references/checklists/playtest-qa.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/game-ui-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/hud-readability.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/mobile-input.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/responsive-ui-fit.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/ui-patterns.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/ui-prompt-templates.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/compose-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/implementation-blueprint.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/vfx-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/implementation-blueprint.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-canvas/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-canvas/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-cover/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-game-maker/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-login/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-art/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-art/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-demo/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-demo/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-maker/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-maker/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-test/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-test/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-ui/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-performance.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-physics.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-runtime.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-spritesheets.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-tilemaps.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/file-structure.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-audio.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-input-camera.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-performance.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-physics.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-runtime.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/file-structure.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/** Scene loading/rendering without DOM, controls or game rules. */
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
|
|
4
|
+
import { RoomEnvironment } from "three/addons/environments/RoomEnvironment.js";
|
|
5
|
+
import { rebuildContractLights } from "./sceneContractRuntime.js";
|
|
6
|
+
import { applyThreeAppearance } from "./three-appearance.js";
|
|
7
|
+
function applySceneCamera(camera, value) {
|
|
8
|
+
camera.position.fromArray(value.position);
|
|
9
|
+
camera.quaternion.fromArray(value.quaternion || value.quaternion_xyzw);
|
|
10
|
+
camera.fov = value.fov || value.vertical_fov_rad * 180 / Math.PI;
|
|
11
|
+
camera.near = value.near;
|
|
12
|
+
camera.far = value.far;
|
|
13
|
+
camera.aspect = value.aspect || value.aspect_ratio;
|
|
14
|
+
camera.updateProjectionMatrix();
|
|
15
|
+
camera.updateMatrixWorld(true);
|
|
16
|
+
}
|
|
17
|
+
async function loadCanonicalScene({ renderer, world, parent = world, assetBase, asset, contract = null, files, presentation, profile = null, appearanceEnabled = true, onProgress = () => {
|
|
18
|
+
} }) {
|
|
19
|
+
if (!renderer?.isWebGLRenderer || !world?.isScene || !parent?.isObject3D) throw new Error("A Three.js WebGLRenderer, Scene, and parent scene node are required.");
|
|
20
|
+
for (let node = parent; node; node = node.parent) if (node.userData.canonical_alignment_root) throw new Error("A canonical scene cannot be nested under an aligned root node.");
|
|
21
|
+
const base = new URL(assetBase, globalThis.location?.href || import.meta.url);
|
|
22
|
+
if (!base.pathname.endsWith("/")) throw new Error("The asset directory URL must end with /.");
|
|
23
|
+
const read = async (file) => {
|
|
24
|
+
const url = new URL(file, base);
|
|
25
|
+
if (!url.href.startsWith(base.href) || /(^|\/)\.\.(\/|$)/.test(file)) throw new Error("An asset dependency is outside the package directory.");
|
|
26
|
+
const response = await fetch(url);
|
|
27
|
+
if (!response.ok) throw new Error("Failed to read asset: " + file);
|
|
28
|
+
const bytes = await response.arrayBuffer();
|
|
29
|
+
if (files?.[file]) {
|
|
30
|
+
const hash = [...new Uint8Array(await crypto.subtle.digest("SHA-256", bytes))].map((v) => v.toString(16).padStart(2, "0")).join("");
|
|
31
|
+
if (hash !== files[file].sha256 || bytes.byteLength !== files[file].bytes) throw new Error("Asset version mismatch: " + file);
|
|
32
|
+
}
|
|
33
|
+
return bytes;
|
|
34
|
+
};
|
|
35
|
+
const json = async (file) => JSON.parse(new TextDecoder().decode(await read(file)));
|
|
36
|
+
const mode = contract?.files?.["runtime/bake-scene/bake.contract.json"] ? "baked" : contract ? "contract" : "standard";
|
|
37
|
+
if (presentation && (presentation.mode !== mode || presentation.three_revision !== THREE.REVISION)) throw new Error("Delivery renderer version mismatch.");
|
|
38
|
+
if (appearanceEnabled && world.userData.canonicalAppearanceOwner) throw new Error("The scene already has a canonical environment. Disable appearanceEnabled when loading props.");
|
|
39
|
+
const root = new THREE.Group();
|
|
40
|
+
root.name = `${asset.asset_id}_AlignmentRoot`;
|
|
41
|
+
root.userData.canonical_alignment_root = true;
|
|
42
|
+
root.userData.canonical_asset_id = asset.asset_id;
|
|
43
|
+
root.userData.canonical_alignment_key = asset.alignment?.revisions?.alignment_key;
|
|
44
|
+
const previous = { background: world.background, environment: world.environment, fog: world.fog, tone: renderer.toneMapping, exposure: renderer.toneMappingExposure, output: renderer.outputColorSpace, shadows: renderer.shadowMap.enabled };
|
|
45
|
+
let appearance, pipeline, baked, pmrem, environment, override, gltf, disposed = false;
|
|
46
|
+
const materials = /* @__PURE__ */ new Set(), textures = /* @__PURE__ */ new Set(), helpers = new THREE.Group(), visibility = /* @__PURE__ */ new Map(), inventory = [], ownedURLs = [];
|
|
47
|
+
if (appearanceEnabled) world.userData.canonicalAppearanceOwner = root.uuid;
|
|
48
|
+
try {
|
|
49
|
+
let render = function(camera, delta = 0) {
|
|
50
|
+
if (disposed) return;
|
|
51
|
+
appearance?.update(delta, camera);
|
|
52
|
+
camera.updateMatrixWorld(true);
|
|
53
|
+
if (pipeline && !override) {
|
|
54
|
+
baked.update(camera);
|
|
55
|
+
pipeline.render(world, camera);
|
|
56
|
+
} else renderer.render(world, camera);
|
|
57
|
+
};
|
|
58
|
+
onProgress("读取模型与显示依赖…");
|
|
59
|
+
const bytes = await read("model.glb");
|
|
60
|
+
const manager = new THREE.LoadingManager(), resources = /* @__PURE__ */ new Map();
|
|
61
|
+
const header = new DataView(bytes), binary = bytes.byteLength >= 20 && header.getUint32(0, true) === 1179937895;
|
|
62
|
+
const sourceJson = JSON.parse(new TextDecoder().decode(binary ? bytes.slice(20, 20 + header.getUint32(12, true)) : bytes));
|
|
63
|
+
for (const ref of [...sourceJson.buffers || [], ...sourceJson.images || []]) {
|
|
64
|
+
if (!ref.uri || ref.uri.startsWith("data:")) continue;
|
|
65
|
+
const file = decodeURIComponent(ref.uri);
|
|
66
|
+
if (!files?.[file]) throw new Error("External model dependency is missing from the manifest: " + file);
|
|
67
|
+
const url = URL.createObjectURL(new Blob([await read(file)]));
|
|
68
|
+
ownedURLs.push(url);
|
|
69
|
+
resources.set(new URL(ref.uri, base).href, url);
|
|
70
|
+
}
|
|
71
|
+
manager.setURLModifier((url) => resources.get(url) || url);
|
|
72
|
+
gltf = await new GLTFLoader(manager).parseAsync(bytes, base.href);
|
|
73
|
+
root.add(gltf.scene);
|
|
74
|
+
parent.add(root);
|
|
75
|
+
gltf.scene.traverse((o) => {
|
|
76
|
+
if (!o.isMesh) return;
|
|
77
|
+
inventory.push({ name: o.name || "未命名对象", object: o });
|
|
78
|
+
for (const m of Array.isArray(o.material) ? o.material : [o.material]) {
|
|
79
|
+
materials.add(m);
|
|
80
|
+
for (const v of Object.values(m)) if (v?.isTexture) textures.add(v);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const recipe = presentation?.recipe || (asset.alignment?.recipe?.source_revision === asset.alignment?.source?.sha256 ? asset.alignment?.recipe : null);
|
|
84
|
+
if (recipe) {
|
|
85
|
+
root.position.fromArray(recipe.translation_metres);
|
|
86
|
+
root.quaternion.fromArray(recipe.rotation_quaternion_xyzw);
|
|
87
|
+
root.scale.fromArray(recipe.scale_xyz);
|
|
88
|
+
} else if (asset.up_axis !== "+y" || asset.forward_axis !== "-z" || asset.pivot !== "origin" || asset.yaw_offset_degrees || asset.pitch_offset_degrees || asset.roll_offset_degrees || asset.scale_hint_metres) {
|
|
89
|
+
if (asset.up_axis !== "+y") throw new Error("Confirm the asset axes first.");
|
|
90
|
+
const box = new THREE.Box3().setFromObject(root), center = box.getCenter(new THREE.Vector3());
|
|
91
|
+
if (asset.pivot !== "origin") root.position.set(-center.x, asset.pivot === "bounds_center" ? -center.y : -box.min.y, -center.z);
|
|
92
|
+
const yaw = { "+z": Math.PI, "-z": 0, "+x": Math.PI / 2, "-x": -Math.PI / 2 }[asset.forward_axis] || 0;
|
|
93
|
+
root.rotation.set(THREE.MathUtils.degToRad(asset.pitch_offset_degrees || 0), yaw + THREE.MathUtils.degToRad(asset.yaw_offset_degrees || 0), THREE.MathUtils.degToRad(asset.roll_offset_degrees || 0), "YXZ");
|
|
94
|
+
if (asset.scale_hint_metres) {
|
|
95
|
+
const h = new THREE.Box3().setFromObject(root).getSize(new THREE.Vector3()).y;
|
|
96
|
+
if (h > 0) root.scale.setScalar(asset.scale_hint_metres / h);
|
|
97
|
+
if (asset.pivot === "ground_center") root.position.y -= new THREE.Box3().setFromObject(root).min.y;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
root.updateMatrixWorld(true);
|
|
101
|
+
const bounds = new THREE.Box3().setFromObject(root, true), size = bounds.getSize(new THREE.Vector3());
|
|
102
|
+
if (appearanceEnabled) {
|
|
103
|
+
world.userData.canonicalAppearanceOwner = root.uuid;
|
|
104
|
+
if (mode === "baked") {
|
|
105
|
+
const [{ createAppearance }, { annotateSourceNames }, { loadBakedScene, createBakedPipeline }] = await Promise.all([import("./baked/sceneAppearance.js"), import("./baked/bakePilot.js"), import("./baked/bakedScene.js")]);
|
|
106
|
+
const legacy = await json("runtime/three.profile.json");
|
|
107
|
+
if (legacy.three_revision !== THREE.REVISION) throw new Error("Baked renderer version mismatch.");
|
|
108
|
+
const manifest = await json("runtime/bake-scene/bake.contract.json");
|
|
109
|
+
annotateSourceNames(gltf);
|
|
110
|
+
appearance = createAppearance(world, gltf.scene, renderer, contract, legacy);
|
|
111
|
+
baked = await loadBakedScene(manifest, read, renderer);
|
|
112
|
+
root.add(baked.root);
|
|
113
|
+
world.add(baked.sky);
|
|
114
|
+
const names = new Set(manifest.groups.flatMap((g) => g.source_gltf_nodes));
|
|
115
|
+
gltf.scene.traverse((o) => {
|
|
116
|
+
if (o.isMesh) {
|
|
117
|
+
for (let p = o; p; p = p.parent) if (names.has(p.userData.canonicalSourceName)) {
|
|
118
|
+
o.visible = false;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
appearance.setAuthoredSky(true);
|
|
124
|
+
world.fog = null;
|
|
125
|
+
renderer.toneMapping = THREE.NoToneMapping;
|
|
126
|
+
renderer.shadowMap.enabled = false;
|
|
127
|
+
pipeline = createBakedPipeline(renderer, baked, manifest);
|
|
128
|
+
} else if (profile) appearance = applyThreeAppearance(world, gltf.scene, renderer, profile);
|
|
129
|
+
else if (contract) {
|
|
130
|
+
rebuildContractLights(helpers, contract);
|
|
131
|
+
world.add(helpers);
|
|
132
|
+
helpers.add(new THREE.HemisphereLight(13493473, 4217156, 0.8));
|
|
133
|
+
world.background = new THREE.Color("#1a2428");
|
|
134
|
+
} else {
|
|
135
|
+
world.background = new THREE.Color("#1a2428");
|
|
136
|
+
pmrem = new THREE.PMREMGenerator(renderer);
|
|
137
|
+
const room = new RoomEnvironment();
|
|
138
|
+
environment = pmrem.fromScene(room).texture;
|
|
139
|
+
room.dispose();
|
|
140
|
+
world.environment = environment;
|
|
141
|
+
const key = new THREE.DirectionalLight(16773860, 2.5);
|
|
142
|
+
key.position.set(4, 8, 5);
|
|
143
|
+
helpers.add(key, new THREE.HemisphereLight(13034991, 4936e3, 0.8));
|
|
144
|
+
world.add(helpers);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
gltf.scene.traverse((o) => {
|
|
148
|
+
if (o.isMesh) visibility.set(o, o.visible);
|
|
149
|
+
});
|
|
150
|
+
const stats = { meshes: gltf.parser.json.meshes?.length || 0, nodes: gltf.parser.json.nodes?.length || 0, materials: gltf.parser.json.materials?.length || 0, cameras: gltf.parser.json.cameras?.length || 0, skins: gltf.parser.json.skins?.length || 0, objects: inventory.length, animations: gltf.animations.length, size: size.toArray(), bounds: { min: bounds.min.toArray(), max: bounds.max.toArray() } };
|
|
151
|
+
return {
|
|
152
|
+
root,
|
|
153
|
+
world,
|
|
154
|
+
renderer,
|
|
155
|
+
mode,
|
|
156
|
+
stats,
|
|
157
|
+
inventory,
|
|
158
|
+
animations: gltf.animations,
|
|
159
|
+
render,
|
|
160
|
+
diagnostic(kind) {
|
|
161
|
+
override?.dispose();
|
|
162
|
+
override = kind === "normal" ? new THREE.MeshNormalMaterial() : kind === "wire" ? new THREE.MeshBasicMaterial({ color: 10870473, wireframe: true }) : null;
|
|
163
|
+
world.overrideMaterial = override;
|
|
164
|
+
if (baked) {
|
|
165
|
+
baked.root.visible = !override;
|
|
166
|
+
baked.sky.visible = !override;
|
|
167
|
+
visibility.forEach((visible, o) => {
|
|
168
|
+
o.visible = override ? true : visible;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
get diagnosticActive() {
|
|
173
|
+
return !!override;
|
|
174
|
+
},
|
|
175
|
+
dispose
|
|
176
|
+
};
|
|
177
|
+
} catch (error) {
|
|
178
|
+
dispose();
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
function dispose() {
|
|
182
|
+
if (disposed) return;
|
|
183
|
+
disposed = true;
|
|
184
|
+
appearance?.dispose();
|
|
185
|
+
pipeline?.dispose();
|
|
186
|
+
baked?.dispose();
|
|
187
|
+
helpers.removeFromParent();
|
|
188
|
+
root.removeFromParent();
|
|
189
|
+
root.traverse((o) => o.geometry?.dispose());
|
|
190
|
+
materials.forEach((m) => m.dispose());
|
|
191
|
+
textures.forEach((t) => t.dispose());
|
|
192
|
+
override?.dispose();
|
|
193
|
+
if (world.overrideMaterial === override) world.overrideMaterial = null;
|
|
194
|
+
environment?.dispose();
|
|
195
|
+
pmrem?.dispose();
|
|
196
|
+
ownedURLs.forEach((url) => URL.revokeObjectURL(url));
|
|
197
|
+
if (appearanceEnabled && world.userData.canonicalAppearanceOwner === root.uuid) {
|
|
198
|
+
delete world.userData.canonicalAppearanceOwner;
|
|
199
|
+
world.background = previous.background;
|
|
200
|
+
world.environment = previous.environment;
|
|
201
|
+
world.fog = previous.fog;
|
|
202
|
+
renderer.toneMapping = previous.tone;
|
|
203
|
+
renderer.toneMappingExposure = previous.exposure;
|
|
204
|
+
renderer.outputColorSpace = previous.output;
|
|
205
|
+
renderer.shadowMap.enabled = previous.shadows;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export {
|
|
210
|
+
applySceneCamera,
|
|
211
|
+
loadCanonicalScene
|
|
212
|
+
};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three.js helpers for windworn_sanctuary.scene_contract.v1 (and compatible packs).
|
|
3
|
+
* Geometry stays at identity root; cameras/lights come from the supplement contract.
|
|
4
|
+
*/
|
|
5
|
+
import * as THREE from 'three';
|
|
6
|
+
|
|
7
|
+
/** Blender (X right, Y forward, Z up) → glTF/three (X right, Y up, Z back). */
|
|
8
|
+
export function blenderPosToGltf(v) {
|
|
9
|
+
return new THREE.Vector3(v[0], v[2], -v[1]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function blenderDirToGltf(v) {
|
|
13
|
+
return new THREE.Vector3(v.x, v.z, -v.y);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Blender lights point along local -Z. Convert Euler XYZ (Blender) to a glTF direction.
|
|
18
|
+
*/
|
|
19
|
+
export function blenderLightDirectionGltf(rotationXyzRad) {
|
|
20
|
+
// Blender XYZ is Rz * Ry * Rx, equivalent to Three intrinsic ZYX.
|
|
21
|
+
const euler = new THREE.Euler(rotationXyzRad[0], rotationXyzRad[1], rotationXyzRad[2], 'ZYX');
|
|
22
|
+
const dirBlender = new THREE.Vector3(0, 0, -1).applyEuler(euler);
|
|
23
|
+
return blenderDirToGltf(dirBlender).normalize();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function clearGroup(group) {
|
|
27
|
+
while (group.children.length) {
|
|
28
|
+
const child = group.children[group.children.length - 1];
|
|
29
|
+
group.remove(child);
|
|
30
|
+
child.traverse?.((obj) => {
|
|
31
|
+
obj.geometry?.dispose?.();
|
|
32
|
+
const mats = Array.isArray(obj.material) ? obj.material : [obj.material];
|
|
33
|
+
for (const mat of mats) mat?.dispose?.();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Rebuild contract lights under `lightRoot`. Returns { sun, fill }.
|
|
40
|
+
*/
|
|
41
|
+
export function rebuildContractLights(lightRoot, contract) {
|
|
42
|
+
clearGroup(lightRoot);
|
|
43
|
+
const entries = contract.blender_lights || [];
|
|
44
|
+
let sun = null;
|
|
45
|
+
let fill = null;
|
|
46
|
+
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
const color = new THREE.Color().fromArray(entry.color_linear || [1, 1, 1]);
|
|
49
|
+
if (entry.type === 'SUN') {
|
|
50
|
+
// Blender sun energy ~4.5 is harsh under three.js ACES; keep softer.
|
|
51
|
+
const light = new THREE.DirectionalLight(color, Math.min((entry.energy || 1) * 0.28, 1.6));
|
|
52
|
+
const dir = blenderLightDirectionGltf(entry.rotation_xyz_rad || [0, 0, 0]);
|
|
53
|
+
light.target.position.set(0, 8, -10);
|
|
54
|
+
light.position.copy(light.target.position).addScaledVector(dir, -120);
|
|
55
|
+
lightRoot.add(light);
|
|
56
|
+
lightRoot.add(light.target);
|
|
57
|
+
sun = light;
|
|
58
|
+
} else if (entry.type === 'AREA') {
|
|
59
|
+
const light = new THREE.DirectionalLight(color, Math.min((entry.energy || 100) / 2200, 0.7));
|
|
60
|
+
const pos = blenderPosToGltf(entry.position || [0, 0, 20]);
|
|
61
|
+
light.position.copy(pos);
|
|
62
|
+
light.target.position.set(0, 4, -12);
|
|
63
|
+
lightRoot.add(light);
|
|
64
|
+
lightRoot.add(light.target);
|
|
65
|
+
fill = light;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const hemi = new THREE.HemisphereLight(0xb9cfe0, 0x7f9478, 0.42);
|
|
70
|
+
lightRoot.add(hemi);
|
|
71
|
+
const ambient = new THREE.AmbientLight(0xd7e0e6, 0.22);
|
|
72
|
+
lightRoot.add(ambient);
|
|
73
|
+
return { sun, fill, hemi, ambient };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function findCamera(contract, cameraId = 'reference') {
|
|
77
|
+
const list = contract.cameras || [];
|
|
78
|
+
return list.find((c) => c.id === cameraId) || list[0] || null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Apply a contract camera to THREE.PerspectiveCamera + OrbitControls target.
|
|
83
|
+
* Preserves vertical FOV; caller letterboxes to aspect_ratio.
|
|
84
|
+
*/
|
|
85
|
+
export function applyContractCamera(camera, controls, camDef) {
|
|
86
|
+
if (!camDef) return;
|
|
87
|
+
camera.fov = camDef.vertical_fov_degrees;
|
|
88
|
+
camera.near = camDef.near || 0.1;
|
|
89
|
+
camera.far = camDef.far || 500;
|
|
90
|
+
camera.aspect = camDef.aspect_ratio || 1.88;
|
|
91
|
+
camera.position.fromArray(camDef.position);
|
|
92
|
+
const q = camDef.quaternion_xyzw;
|
|
93
|
+
if (q) {
|
|
94
|
+
camera.quaternion.set(q[0], q[1], q[2], q[3]);
|
|
95
|
+
} else if (camDef.look_at) {
|
|
96
|
+
camera.up.fromArray(camDef.up || [0, 1, 0]);
|
|
97
|
+
camera.lookAt(camDef.look_at[0], camDef.look_at[1], camDef.look_at[2]);
|
|
98
|
+
}
|
|
99
|
+
camera.updateProjectionMatrix();
|
|
100
|
+
// Keep OrbitControls target aligned, but do not call controls.update()
|
|
101
|
+
// (it would overwrite the contract quaternion).
|
|
102
|
+
if (controls && camDef.look_at) {
|
|
103
|
+
controls.target.fromArray(camDef.look_at);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Fit a DOM viewport into a parent with letterboxing for the contract aspect.
|
|
109
|
+
*/
|
|
110
|
+
export function letterboxElement(el, parent, aspect = 1.88) {
|
|
111
|
+
const pw = parent.clientWidth;
|
|
112
|
+
const ph = parent.clientHeight;
|
|
113
|
+
if (pw < 1 || ph < 1) return { width: pw, height: ph };
|
|
114
|
+
let width = pw;
|
|
115
|
+
let height = width / aspect;
|
|
116
|
+
if (height > ph) {
|
|
117
|
+
height = ph;
|
|
118
|
+
width = height * aspect;
|
|
119
|
+
}
|
|
120
|
+
el.style.width = `${Math.floor(width)}px`;
|
|
121
|
+
el.style.height = `${Math.floor(height)}px`;
|
|
122
|
+
return { width: Math.floor(width), height: Math.floor(height) };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function makeTurquoiseSkyTexture() {
|
|
126
|
+
const size = 512;
|
|
127
|
+
const canvas = document.createElement('canvas');
|
|
128
|
+
canvas.width = size;
|
|
129
|
+
canvas.height = size;
|
|
130
|
+
const ctx = canvas.getContext('2d');
|
|
131
|
+
const grad = ctx.createLinearGradient(0, 0, 0, size);
|
|
132
|
+
// Soft turquoise / storm-bank sky, low saturation.
|
|
133
|
+
grad.addColorStop(0, '#7ea0b5');
|
|
134
|
+
grad.addColorStop(0.35, '#9bb7c6');
|
|
135
|
+
grad.addColorStop(0.62, '#b7c9d4');
|
|
136
|
+
grad.addColorStop(0.82, '#c9d5dc');
|
|
137
|
+
grad.addColorStop(1, '#d5dde2');
|
|
138
|
+
ctx.fillStyle = grad;
|
|
139
|
+
ctx.fillRect(0, 0, size, size);
|
|
140
|
+
|
|
141
|
+
const blobs = [
|
|
142
|
+
[90, 120, 95],
|
|
143
|
+
[200, 100, 110],
|
|
144
|
+
[330, 140, 100],
|
|
145
|
+
[430, 110, 80],
|
|
146
|
+
[140, 190, 70],
|
|
147
|
+
[280, 210, 90],
|
|
148
|
+
[50, 240, 60],
|
|
149
|
+
[400, 230, 75],
|
|
150
|
+
];
|
|
151
|
+
for (const [x, y, r] of blobs) {
|
|
152
|
+
const g = ctx.createRadialGradient(x, y, r * 0.12, x, y, r);
|
|
153
|
+
g.addColorStop(0, 'rgba(248,250,252,0.5)');
|
|
154
|
+
g.addColorStop(0.4, 'rgba(220,230,236,0.22)');
|
|
155
|
+
g.addColorStop(1, 'rgba(158,183,198,0)');
|
|
156
|
+
ctx.fillStyle = g;
|
|
157
|
+
ctx.beginPath();
|
|
158
|
+
ctx.arc(x, y, r, 0, Math.PI * 2);
|
|
159
|
+
ctx.fill();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const texture = new THREE.CanvasTexture(canvas);
|
|
163
|
+
texture.colorSpace = THREE.SRGBColorSpace;
|
|
164
|
+
texture.needsUpdate = true;
|
|
165
|
+
return texture;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Soft valley haze + a few vertical light shafts (non-volumetric approximation).
|
|
170
|
+
*/
|
|
171
|
+
export function rebuildAtmosphere(fxRoot, contract) {
|
|
172
|
+
clearGroup(fxRoot);
|
|
173
|
+
const bounds = contract.coordinates?.bounds_gltf_metres;
|
|
174
|
+
const size = bounds?.size || [200, 60, 140];
|
|
175
|
+
const center = bounds?.center || [0, 20, -40];
|
|
176
|
+
|
|
177
|
+
// Valley fog plane (very soft).
|
|
178
|
+
const fogPlane = new THREE.Mesh(
|
|
179
|
+
new THREE.PlaneGeometry(size[0] * 1.2, size[2] * 1.2),
|
|
180
|
+
new THREE.MeshBasicMaterial({
|
|
181
|
+
color: 0xc5d4de,
|
|
182
|
+
transparent: true,
|
|
183
|
+
opacity: 0.08,
|
|
184
|
+
depthWrite: false,
|
|
185
|
+
side: THREE.DoubleSide,
|
|
186
|
+
})
|
|
187
|
+
);
|
|
188
|
+
fogPlane.rotation.x = -Math.PI / 2;
|
|
189
|
+
fogPlane.position.set(center[0], 1.2, center[2]);
|
|
190
|
+
fxRoot.add(fogPlane);
|
|
191
|
+
|
|
192
|
+
// Relic light shafts near plaza (approximate).
|
|
193
|
+
const shaftMat = new THREE.MeshBasicMaterial({
|
|
194
|
+
color: 0xe8f0f4,
|
|
195
|
+
transparent: true,
|
|
196
|
+
opacity: 0.08,
|
|
197
|
+
depthWrite: false,
|
|
198
|
+
side: THREE.DoubleSide,
|
|
199
|
+
});
|
|
200
|
+
const shaftSpots = [
|
|
201
|
+
[2, 0, -6],
|
|
202
|
+
[-4, 0, -14],
|
|
203
|
+
[10, 0, -2],
|
|
204
|
+
[-8, 0, 4],
|
|
205
|
+
];
|
|
206
|
+
for (const [x, , z] of shaftSpots) {
|
|
207
|
+
const shaft = new THREE.Mesh(new THREE.CylinderGeometry(0.35, 1.4, 28, 8, 1, true), shaftMat);
|
|
208
|
+
shaft.position.set(x, 14, z);
|
|
209
|
+
fxRoot.add(shaft);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Floating mote particles.
|
|
213
|
+
const count = 180;
|
|
214
|
+
const positions = new Float32Array(count * 3);
|
|
215
|
+
for (let i = 0; i < count; i++) {
|
|
216
|
+
positions[i * 3] = center[0] + (Math.random() - 0.5) * size[0] * 0.35;
|
|
217
|
+
positions[i * 3 + 1] = 2 + Math.random() * 22;
|
|
218
|
+
positions[i * 3 + 2] = center[2] + (Math.random() - 0.5) * size[2] * 0.35;
|
|
219
|
+
}
|
|
220
|
+
const geo = new THREE.BufferGeometry();
|
|
221
|
+
geo.setAttribute('position', new THREE.BufferAttribute(positions, 3));
|
|
222
|
+
const points = new THREE.Points(
|
|
223
|
+
geo,
|
|
224
|
+
new THREE.PointsMaterial({
|
|
225
|
+
color: 0xf2f6f8,
|
|
226
|
+
size: 0.35,
|
|
227
|
+
transparent: true,
|
|
228
|
+
opacity: 0.45,
|
|
229
|
+
depthWrite: false,
|
|
230
|
+
sizeAttenuation: true,
|
|
231
|
+
})
|
|
232
|
+
);
|
|
233
|
+
fxRoot.add(points);
|
|
234
|
+
return { points };
|
|
235
|
+
}
|