evomeme 0.1.9 → 0.1.10
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/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 +143 -0
- package/dist/canvas-public/canvas/camera.js +28 -0
- package/dist/canvas-public/canvas/chrome.js +13 -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 +27 -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 +234 -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 +538 -0
- package/dist/canvas-public/features/editing/canvas-size.js +532 -0
- package/dist/canvas-public/features/editing/color-key.js +469 -0
- package/dist/canvas-public/features/editing/cutout.js +20 -0
- package/dist/canvas-public/features/editing/interactive-image-editing.js +981 -0
- package/dist/canvas-public/features/editing/layer-decomposition.js +44 -0
- package/dist/canvas-public/features/editing/manual-split.js +114 -0
- package/dist/canvas-public/features/editing/perfect-pixel.js +336 -0
- package/dist/canvas-public/features/editing/scroll-preview.js +129 -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 +48 -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 +149 -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 +83 -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 +2518 -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 +79 -0
- package/dist/canvas-public/language/zh-CN.js +1059 -0
- package/dist/canvas-public/map/export.js +9 -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 +401 -0
- package/dist/canvas-public/ui/settings.js +83 -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/canvas-public/workers/perfect-pixel-worker.js +510 -0
- package/dist/index.js +42236 -13382
- 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 +176 -0
- package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-cover/SKILL.md +132 -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 +92 -0
- package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -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 +45 -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 +45 -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 +32 -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 +39 -0
- package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
- package/dist/skills/en-US/game-asset-image-generator/SKILL.md +104 -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 +32 -0
- package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
- package/dist/skills/en-US/game-audio/SKILL.md +82 -0
- package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -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-maker/SKILL.md +111 -0
- package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -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-ui/SKILL.md +177 -0
- package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
- package/dist/skills/en-US/godot-3d-game/SKILL.md +39 -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 +52 -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 +153 -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 +4 -4
- package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +1 -1
- package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
- 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 +45 -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 +45 -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 +32 -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 +39 -0
- package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
- package/{skills → dist/skills/zh-CN}/game-asset-image-generator/SKILL.md +1 -1
- package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +127 -0
- package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +77 -0
- package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -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/godot-3d-game/SKILL.md +39 -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 +52 -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/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-asset-pipeline.md +52 -15
- 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 +21 -7
- package/dist/canvas-public/cycle-detect.js +0 -166
- package/dist/canvas-public/smart-split.js +0 -185
- /package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +0 -0
- /package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +0 -0
- /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/SKILL.md +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-asset-image-generator/references/background.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-audio/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-audio/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/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 8 8" shape-rendering="geometricPrecision">
|
|
3
|
+
<title>Two-terrain 4x4 transition mask</title>
|
|
4
|
+
<desc>White is terrain 0 and black is terrain 1. Every 2x2 logical region forms one tile. Rounded transitions begin halfway through a logical half-tile and use an exact quarter-circle with radius 0.5.</desc>
|
|
5
|
+
<defs>
|
|
6
|
+
<mask id="terrain-one" maskUnits="userSpaceOnUse" x="0" y="0" width="8" height="8">
|
|
7
|
+
<rect width="8" height="8" fill="black"/>
|
|
8
|
+
<!-- 00011000 / 10011111 / 10011111 / 01111110 / 01111110 / 00000110 / 00000110 / 00011000 -->
|
|
9
|
+
<g fill="white">
|
|
10
|
+
<rect x="3" y="0" width="2" height="1"/><rect x="0" y="1" width="1" height="1"/>
|
|
11
|
+
<rect x="3" y="1" width="5" height="1"/><rect x="0" y="2" width="1" height="1"/>
|
|
12
|
+
<rect x="3" y="2" width="5" height="1"/><rect x="1" y="3" width="6" height="1"/>
|
|
13
|
+
<rect x="1" y="4" width="6" height="1"/><rect x="5" y="5" width="2" height="1"/>
|
|
14
|
+
<rect x="5" y="6" width="2" height="1"/><rect x="3" y="7" width="2" height="1"/>
|
|
15
|
+
</g>
|
|
16
|
+
<g fill="black">
|
|
17
|
+
<rect x="0.5" y="1" width="0.5" height="0.5"/><rect x="0.5" y="2.5" width="0.5" height="0.5"/>
|
|
18
|
+
<rect x="1" y="3" width="0.5" height="0.5"/><rect x="1" y="4.5" width="0.5" height="0.5"/>
|
|
19
|
+
<rect x="3" y="7" width="0.5" height="0.5"/><rect x="5" y="6.5" width="0.5" height="0.5"/>
|
|
20
|
+
<rect x="4.5" y="7" width="0.5" height="0.5"/><rect x="6.5" y="6.5" width="0.5" height="0.5"/>
|
|
21
|
+
</g>
|
|
22
|
+
<g fill="white">
|
|
23
|
+
<circle cx="0.5" cy="1.5" r="0.5"/><circle cx="0.5" cy="2.5" r="0.5"/>
|
|
24
|
+
<circle cx="1.5" cy="3.5" r="0.5"/><circle cx="1.5" cy="4.5" r="0.5"/>
|
|
25
|
+
<circle cx="3.5" cy="7.5" r="0.5"/><circle cx="5.5" cy="6.5" r="0.5"/>
|
|
26
|
+
<circle cx="4.5" cy="7.5" r="0.5"/><circle cx="6.5" cy="6.5" r="0.5"/>
|
|
27
|
+
</g>
|
|
28
|
+
<g fill="white">
|
|
29
|
+
<rect x="5" y="0.5" width="0.5" height="0.5"/><rect x="2.5" y="2.5" width="0.5" height="0.5"/>
|
|
30
|
+
<rect x="7" y="3" width="0.5" height="0.5"/><rect x="4.5" y="5" width="0.5" height="0.5"/>
|
|
31
|
+
</g>
|
|
32
|
+
<g fill="black">
|
|
33
|
+
<circle cx="5.5" cy="0.5" r="0.5"/><circle cx="2.5" cy="2.5" r="0.5"/>
|
|
34
|
+
<circle cx="7.5" cy="3.5" r="0.5"/><circle cx="4.5" cy="5.5" r="0.5"/>
|
|
35
|
+
</g>
|
|
36
|
+
</mask>
|
|
37
|
+
</defs>
|
|
38
|
+
<rect width="8" height="8" fill="white"/>
|
|
39
|
+
<rect width="8" height="8" fill="black" mask="url(#terrain-one)"/>
|
|
40
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evomeme",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "evomemeplugin_client - local stdio MCP server. Install: npx -y evomeme@latest install --ide cursor. Init: npx -y evomeme@latest init.",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist/index.js",
|
|
12
|
+
"dist/tile-transition-mask.svg",
|
|
12
13
|
"dist/canvas-public",
|
|
14
|
+
"dist/stage-public",
|
|
15
|
+
"dist/stage-blender",
|
|
13
16
|
"bin/evomeme",
|
|
14
|
-
"skills"
|
|
17
|
+
"dist/skills"
|
|
15
18
|
],
|
|
16
19
|
"engines": {
|
|
17
20
|
"node": ">=18.14.1"
|
|
@@ -20,21 +23,27 @@
|
|
|
20
23
|
"version:sync": "node scripts/sync-version.mjs",
|
|
21
24
|
"prepare:prod": "node scripts/prepare-channel.mjs --channel prod",
|
|
22
25
|
"prepare:dev": "node scripts/prepare-channel.mjs --channel dev",
|
|
26
|
+
"skills:render": "node scripts/render-skills.mjs",
|
|
27
|
+
"skills:validate": "npm run skills:render && node scripts/validate-skills.mjs --skills-dir dist/skills",
|
|
23
28
|
"prebuild": "npm run version:sync",
|
|
24
29
|
"build": "node scripts/bundle.mjs",
|
|
25
30
|
"start": "node bin/evomeme",
|
|
26
31
|
"dev": "tsx src/index.ts",
|
|
27
32
|
"canvas:dev": "tsx watch src/index.ts canvas --no-open",
|
|
33
|
+
"stage:dev": "tsx watch src/index.ts stage --no-open",
|
|
28
34
|
"mcp:list": "node scripts/call-mcp.mjs --list",
|
|
29
35
|
"mcp:call": "node scripts/call-mcp.mjs",
|
|
30
36
|
"mcp:image:demo": "node scripts/call-mcp.mjs --demo-image",
|
|
31
37
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
32
38
|
"test": "jest",
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
39
|
+
"test:publish": "node --test __tests__/scripts/renderSkills.test.mjs",
|
|
40
|
+
"test:canvas": "jest --runInBand __tests__/canvas",
|
|
41
|
+
"test:canvas:browser": "node scripts/canvas-feature-smoke.mjs",
|
|
42
|
+
"prepack": "npm run build",
|
|
43
|
+
"pack:local": "npm run prepare:prod && npm pack",
|
|
44
|
+
"pack:dev": "npm run prepare:dev && npm pack && npm run prepare:prod",
|
|
45
|
+
"publish:prod": "npm run prepare:prod && npm publish --access public && npm run prepare:prod",
|
|
46
|
+
"publish:dev": "npm run prepare:dev && npm publish --access public && npm run prepare:prod"
|
|
38
47
|
},
|
|
39
48
|
"publishConfig": {
|
|
40
49
|
"access": "public"
|
|
@@ -51,6 +60,9 @@
|
|
|
51
60
|
"@ffmpeg-installer/ffmpeg": "^1.1.0",
|
|
52
61
|
"@ffprobe-installer/ffprobe": "^2.1.2",
|
|
53
62
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
63
|
+
"@pixi/tilemap": "^5.0.2",
|
|
64
|
+
"gltf-validator": "2.0.0-dev.3.10",
|
|
65
|
+
"pixi.js": "^8.20.1",
|
|
54
66
|
"semver": "^7.8.5",
|
|
55
67
|
"update-notifier": "^7.3.1"
|
|
56
68
|
},
|
|
@@ -61,7 +73,9 @@
|
|
|
61
73
|
"@types/update-notifier": "^6.0.8",
|
|
62
74
|
"esbuild": "^0.27.0",
|
|
63
75
|
"jest": "^29.7.0",
|
|
76
|
+
"jsdom": "26.1.0",
|
|
64
77
|
"painterro": "^1.2.92",
|
|
78
|
+
"playwright": "1.63.0",
|
|
65
79
|
"ts-jest": "^29.2.5",
|
|
66
80
|
"tsx": "^4.20.6",
|
|
67
81
|
"typescript": "^5.6.3"
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 浏览器端:缩略灰度 + z-score + 点积,从前向后找最早高相似帧。
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
function zscoreInPlace(vec) {
|
|
6
|
-
let sum = 0
|
|
7
|
-
for (let i = 0; i < vec.length; i++) sum += vec[i]
|
|
8
|
-
const mean = sum / vec.length
|
|
9
|
-
let varSum = 0
|
|
10
|
-
for (let i = 0; i < vec.length; i++) {
|
|
11
|
-
const d = vec[i] - mean
|
|
12
|
-
varSum += d * d
|
|
13
|
-
}
|
|
14
|
-
const std = Math.sqrt(varSum / vec.length) + 1e-8
|
|
15
|
-
for (let i = 0; i < vec.length; i++) vec[i] = (vec[i] - mean) / std
|
|
16
|
-
return vec
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function featureFromImageData(imageData) {
|
|
20
|
-
const { data, width, height } = imageData
|
|
21
|
-
const n = width * height
|
|
22
|
-
const vec = new Float32Array(n)
|
|
23
|
-
for (let i = 0, p = 0; i < n; i++, p += 4) {
|
|
24
|
-
// ITU-R BT.601 亮度
|
|
25
|
-
vec[i] = data[p] * 0.299 + data[p + 1] * 0.587 + data[p + 2] * 0.114
|
|
26
|
-
}
|
|
27
|
-
return zscoreInPlace(vec)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function nccScore(a, b) {
|
|
31
|
-
const n = Math.min(a.length, b.length)
|
|
32
|
-
if (!n) return 0
|
|
33
|
-
let sum = 0
|
|
34
|
-
for (let i = 0; i < n; i++) sum += a[i] * b[i]
|
|
35
|
-
return sum / n
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function waitEvent(target, event, { signal } = {}) {
|
|
39
|
-
return new Promise((resolve, reject) => {
|
|
40
|
-
if (signal?.aborted) {
|
|
41
|
-
reject(new DOMException('Aborted', 'AbortError'))
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
const onAbort = () => {
|
|
45
|
-
cleanup()
|
|
46
|
-
reject(new DOMException('Aborted', 'AbortError'))
|
|
47
|
-
}
|
|
48
|
-
const onOk = () => {
|
|
49
|
-
cleanup()
|
|
50
|
-
resolve()
|
|
51
|
-
}
|
|
52
|
-
const cleanup = () => {
|
|
53
|
-
target.removeEventListener(event, onOk)
|
|
54
|
-
signal?.removeEventListener('abort', onAbort)
|
|
55
|
-
}
|
|
56
|
-
target.addEventListener(event, onOk, { once: true })
|
|
57
|
-
signal?.addEventListener('abort', onAbort, { once: true })
|
|
58
|
-
})
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async function seekVideo(video, time, signal) {
|
|
62
|
-
const duration = Number(video.duration)
|
|
63
|
-
const maxT = Number.isFinite(duration) && duration > 0 ? Math.max(0, duration - 1e-4) : time
|
|
64
|
-
const t = Math.min(Math.max(0, time), maxT)
|
|
65
|
-
if (Math.abs((video.currentTime || 0) - t) < 1e-4) return
|
|
66
|
-
const p = waitEvent(video, 'seeked', { signal })
|
|
67
|
-
video.currentTime = t
|
|
68
|
-
await p
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function drawFeature(video, canvas, ctx, thumbWidth) {
|
|
72
|
-
const vw = video.videoWidth || 1
|
|
73
|
-
const vh = video.videoHeight || 1
|
|
74
|
-
const w = Math.max(8, Math.round(thumbWidth))
|
|
75
|
-
const h = Math.max(8, Math.round((vh / vw) * w))
|
|
76
|
-
if (canvas.width !== w) canvas.width = w
|
|
77
|
-
if (canvas.height !== h) canvas.height = h
|
|
78
|
-
ctx.drawImage(video, 0, 0, w, h)
|
|
79
|
-
return featureFromImageData(ctx.getImageData(0, 0, w, h))
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* @param {string} videoUrl
|
|
84
|
-
* @param {{
|
|
85
|
-
* threshold?: number,
|
|
86
|
-
* minGapSec?: number,
|
|
87
|
-
* thumbWidth?: number,
|
|
88
|
-
* onProgress?: (info: object) => void,
|
|
89
|
-
* signal?: AbortSignal,
|
|
90
|
-
* }} [options]
|
|
91
|
-
* @returns {Promise<{ start: number, end: number, score: number, fps: number, scanned: number }>}
|
|
92
|
-
*/
|
|
93
|
-
export async function detectFirstCycle(videoUrl, options = {}) {
|
|
94
|
-
const threshold = Math.min(0.999, Math.max(0.5, Number(options.threshold) || 0.98))
|
|
95
|
-
const minGapSec = Math.max(0.05, Number(options.minGapSec) || 0.4)
|
|
96
|
-
const thumbWidth = Math.max(16, Math.round(Number(options.thumbWidth) || 96))
|
|
97
|
-
const onProgress = typeof options.onProgress === 'function' ? options.onProgress : null
|
|
98
|
-
const signal = options.signal
|
|
99
|
-
|
|
100
|
-
const video = document.createElement('video')
|
|
101
|
-
video.muted = true
|
|
102
|
-
video.playsInline = true
|
|
103
|
-
video.preload = 'auto'
|
|
104
|
-
video.crossOrigin = 'anonymous'
|
|
105
|
-
|
|
106
|
-
const canvas = document.createElement('canvas')
|
|
107
|
-
const ctx = canvas.getContext('2d', { willReadFrequently: true })
|
|
108
|
-
if (!ctx) throw new Error('无法创建 canvas')
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
const loaded = waitEvent(video, 'loadedmetadata', { signal })
|
|
112
|
-
video.src = videoUrl
|
|
113
|
-
video.load()
|
|
114
|
-
await loaded
|
|
115
|
-
if (!video.videoWidth || !Number.isFinite(video.duration) || video.duration <= 0) {
|
|
116
|
-
throw new Error('无法读取视频元数据')
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const duration = video.duration
|
|
120
|
-
const step = 1 / 24
|
|
121
|
-
const minT = Math.min(duration - step, minGapSec)
|
|
122
|
-
if (!(minT > step)) {
|
|
123
|
-
throw new Error('视频太短,无法提取周期')
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
await seekVideo(video, 0, signal)
|
|
127
|
-
// 部分浏览器 seek(0) 后需一帧稳定
|
|
128
|
-
await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r)))
|
|
129
|
-
const ref = drawFeature(video, canvas, ctx, thumbWidth)
|
|
130
|
-
|
|
131
|
-
let scanned = 0
|
|
132
|
-
for (let t = minT; t < duration - 1e-4; t += step) {
|
|
133
|
-
if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')
|
|
134
|
-
await seekVideo(video, t, signal)
|
|
135
|
-
const feat = drawFeature(video, canvas, ctx, thumbWidth)
|
|
136
|
-
const score = nccScore(ref, feat)
|
|
137
|
-
scanned += 1
|
|
138
|
-
onProgress?.({
|
|
139
|
-
time: t,
|
|
140
|
-
score,
|
|
141
|
-
scanned,
|
|
142
|
-
duration,
|
|
143
|
-
threshold,
|
|
144
|
-
})
|
|
145
|
-
if (score >= threshold) {
|
|
146
|
-
return {
|
|
147
|
-
start: 0,
|
|
148
|
-
end: Math.min(t, duration),
|
|
149
|
-
score,
|
|
150
|
-
fps: 24,
|
|
151
|
-
scanned,
|
|
152
|
-
threshold,
|
|
153
|
-
minGapSec,
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
throw new Error(
|
|
159
|
-
`未找到相似度 ≥ ${(threshold * 100).toFixed(0)}% 的周期终点(已扫 ${scanned} 帧,最短间隔 ${minGapSec}s)`,
|
|
160
|
-
)
|
|
161
|
-
} finally {
|
|
162
|
-
video.pause()
|
|
163
|
-
video.removeAttribute('src')
|
|
164
|
-
video.load()
|
|
165
|
-
}
|
|
166
|
-
}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 智能切分:从一张含多主体的图中提取连通区域,按阅读顺序返回裁切 dataURL。
|
|
3
|
-
* 纯浏览器 Canvas,无外部依赖。
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
function isForeground(r, g, b, a, bg) {
|
|
7
|
-
if (a < 24) return false
|
|
8
|
-
// 相对背景色差够大才算前景(兼容白底 / 棋盘格近似色)
|
|
9
|
-
const dr = r - bg.r
|
|
10
|
-
const dg = g - bg.g
|
|
11
|
-
const db = b - bg.b
|
|
12
|
-
const dist = Math.sqrt(dr * dr + dg * dg + db * db)
|
|
13
|
-
return dist > 28 || a < 250 && a > 24
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function sampleBackground(data, w, h) {
|
|
17
|
-
// 取四角均值作为背景估计
|
|
18
|
-
const pts = [
|
|
19
|
-
[0, 0],
|
|
20
|
-
[w - 1, 0],
|
|
21
|
-
[0, h - 1],
|
|
22
|
-
[w - 1, h - 1],
|
|
23
|
-
[Math.floor(w / 2), 0],
|
|
24
|
-
[0, Math.floor(h / 2)],
|
|
25
|
-
]
|
|
26
|
-
let r = 0
|
|
27
|
-
let g = 0
|
|
28
|
-
let b = 0
|
|
29
|
-
let n = 0
|
|
30
|
-
for (const [x, y] of pts) {
|
|
31
|
-
const i = (y * w + x) * 4
|
|
32
|
-
r += data[i]
|
|
33
|
-
g += data[i + 1]
|
|
34
|
-
b += data[i + 2]
|
|
35
|
-
n += 1
|
|
36
|
-
}
|
|
37
|
-
return { r: r / n, g: g / n, b: b / n }
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function loadImageElement(url) {
|
|
41
|
-
return new Promise((resolve, reject) => {
|
|
42
|
-
const img = new Image()
|
|
43
|
-
img.crossOrigin = 'anonymous'
|
|
44
|
-
img.onload = () => resolve(img)
|
|
45
|
-
img.onerror = () => reject(new Error('图片加载失败'))
|
|
46
|
-
img.src = url
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* @param {string} imageUrl
|
|
52
|
-
* @returns {Promise<string[]>} PNG dataURL 列表(至少 2 张才有意义;找不到则空数组)
|
|
53
|
-
*/
|
|
54
|
-
export async function smartSplitImage(imageUrl) {
|
|
55
|
-
const img = await loadImageElement(imageUrl)
|
|
56
|
-
const maxSide = 1600
|
|
57
|
-
const scale = Math.min(1, maxSide / Math.max(img.naturalWidth, img.naturalHeight))
|
|
58
|
-
const w = Math.max(1, Math.round(img.naturalWidth * scale))
|
|
59
|
-
const h = Math.max(1, Math.round(img.naturalHeight * scale))
|
|
60
|
-
|
|
61
|
-
const canvas = document.createElement('canvas')
|
|
62
|
-
canvas.width = w
|
|
63
|
-
canvas.height = h
|
|
64
|
-
const ctx = canvas.getContext('2d', { willReadFrequently: true })
|
|
65
|
-
ctx.drawImage(img, 0, 0, w, h)
|
|
66
|
-
const { data } = ctx.getImageData(0, 0, w, h)
|
|
67
|
-
const bg = sampleBackground(data, w, h)
|
|
68
|
-
|
|
69
|
-
const visited = new Uint8Array(w * h)
|
|
70
|
-
const boxes = []
|
|
71
|
-
const minArea = Math.max(64, Math.floor((w * h) / 800))
|
|
72
|
-
const queue = new Int32Array(w * h)
|
|
73
|
-
|
|
74
|
-
for (let y = 0; y < h; y += 1) {
|
|
75
|
-
for (let x = 0; x < w; x += 1) {
|
|
76
|
-
const start = y * w + x
|
|
77
|
-
if (visited[start]) continue
|
|
78
|
-
const i0 = start * 4
|
|
79
|
-
if (!isForeground(data[i0], data[i0 + 1], data[i0 + 2], data[i0 + 3], bg)) {
|
|
80
|
-
visited[start] = 1
|
|
81
|
-
continue
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
let qh = 0
|
|
85
|
-
let qt = 0
|
|
86
|
-
queue[qt++] = start
|
|
87
|
-
visited[start] = 1
|
|
88
|
-
let minX = x
|
|
89
|
-
let maxX = x
|
|
90
|
-
let minY = y
|
|
91
|
-
let maxY = y
|
|
92
|
-
let area = 0
|
|
93
|
-
|
|
94
|
-
while (qh < qt) {
|
|
95
|
-
const p = queue[qh++]
|
|
96
|
-
const px = p % w
|
|
97
|
-
const py = (p / w) | 0
|
|
98
|
-
area += 1
|
|
99
|
-
if (px < minX) minX = px
|
|
100
|
-
if (px > maxX) maxX = px
|
|
101
|
-
if (py < minY) minY = py
|
|
102
|
-
if (py > maxY) maxY = py
|
|
103
|
-
|
|
104
|
-
const neighbors = [p - 1, p + 1, p - w, p + w]
|
|
105
|
-
for (const n of neighbors) {
|
|
106
|
-
if (n < 0 || n >= w * h) continue
|
|
107
|
-
if (visited[n]) continue
|
|
108
|
-
const nx = n % w
|
|
109
|
-
const ny = (n / w) | 0
|
|
110
|
-
// 防跨行左右邻居
|
|
111
|
-
if (Math.abs(nx - px) + Math.abs(ny - py) !== 1) continue
|
|
112
|
-
const ni = n * 4
|
|
113
|
-
if (!isForeground(data[ni], data[ni + 1], data[ni + 2], data[ni + 3], bg)) {
|
|
114
|
-
visited[n] = 1
|
|
115
|
-
continue
|
|
116
|
-
}
|
|
117
|
-
visited[n] = 1
|
|
118
|
-
queue[qt++] = n
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const bw = maxX - minX + 1
|
|
123
|
-
const bh = maxY - minY + 1
|
|
124
|
-
if (area >= minArea && bw >= 8 && bh >= 8) {
|
|
125
|
-
// 过滤几乎铺满整图的单一大块(切不出多图)
|
|
126
|
-
if (bw * bh < w * h * 0.92) {
|
|
127
|
-
boxes.push({ minX, minY, maxX, maxY, area })
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (boxes.length < 2) return []
|
|
134
|
-
|
|
135
|
-
// 阅读顺序:先上后下,同行按左到右
|
|
136
|
-
const rowTol = Math.max(12, Math.floor(h * 0.03))
|
|
137
|
-
boxes.sort((a, b) => {
|
|
138
|
-
if (Math.abs(a.minY - b.minY) > rowTol) return a.minY - b.minY
|
|
139
|
-
return a.minX - b.minX
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
// 原图尺寸裁切(更高清),并统一到完全相同的画布尺寸,保证序列播放不抖动
|
|
143
|
-
const inv = 1 / scale
|
|
144
|
-
const crops = []
|
|
145
|
-
for (const box of boxes) {
|
|
146
|
-
const sx = Math.max(0, Math.floor(box.minX * inv))
|
|
147
|
-
const sy = Math.max(0, Math.floor(box.minY * inv))
|
|
148
|
-
const sw = Math.min(img.naturalWidth - sx, Math.ceil((box.maxX - box.minX + 1) * inv))
|
|
149
|
-
const sh = Math.min(img.naturalHeight - sy, Math.ceil((box.maxY - box.minY + 1) * inv))
|
|
150
|
-
if (sw < 4 || sh < 4) continue
|
|
151
|
-
crops.push({ sx, sy, sw, sh })
|
|
152
|
-
}
|
|
153
|
-
if (crops.length < 2) return []
|
|
154
|
-
|
|
155
|
-
// 统一尺寸:先按最高补上方白边,再按最宽左右均匀补白边
|
|
156
|
-
const frameW = Math.max(...crops.map((c) => c.sw))
|
|
157
|
-
const frameH = Math.max(...crops.map((c) => c.sh))
|
|
158
|
-
const full = document.createElement('canvas')
|
|
159
|
-
full.width = frameW
|
|
160
|
-
full.height = frameH
|
|
161
|
-
const fctx = full.getContext('2d')
|
|
162
|
-
|
|
163
|
-
const out = []
|
|
164
|
-
for (const crop of crops) {
|
|
165
|
-
fctx.fillStyle = '#ffffff'
|
|
166
|
-
fctx.fillRect(0, 0, frameW, frameH)
|
|
167
|
-
const padTop = frameH - crop.sh
|
|
168
|
-
const padX = frameW - crop.sw
|
|
169
|
-
const dx = Math.floor(padX / 2)
|
|
170
|
-
const dy = padTop
|
|
171
|
-
fctx.drawImage(
|
|
172
|
-
img,
|
|
173
|
-
crop.sx,
|
|
174
|
-
crop.sy,
|
|
175
|
-
crop.sw,
|
|
176
|
-
crop.sh,
|
|
177
|
-
dx,
|
|
178
|
-
dy,
|
|
179
|
-
crop.sw,
|
|
180
|
-
crop.sh,
|
|
181
|
-
)
|
|
182
|
-
out.push(full.toDataURL('image/png'))
|
|
183
|
-
}
|
|
184
|
-
return out
|
|
185
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md
RENAMED
|
File without changes
|
/package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md
RENAMED
|
File without changes
|
/package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md
RENAMED
|
File without changes
|
/package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md
RENAMED
|
File without changes
|
/package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md
RENAMED
|
File without changes
|
/package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|