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,7 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Phaser 2D Graphics Builder"
|
|
3
|
+
short_description: "Comprehensively improve a 2D game's characters, scenes, composition, effects, and overall visual quality"
|
|
4
|
+
default_prompt: "Please use $phaser-2d-graphics-builder to improve this 2D game's overall visual quality, and refine its characters, scene layering, composition, and effects presentation."
|
|
5
|
+
|
|
6
|
+
policy:
|
|
7
|
+
allow_implicit_invocation: false
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: threejs-3d-game
|
|
3
|
+
description: Implement 3D browser games with Three.js, React Three Fiber, TypeScript, and Vite. Use when R3F Canvas, simulation systems, DOM HUD overlays, event-bus bridging, or 3D project file structure is needed.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Three.js 3D Game Implementation
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This skill is for the concrete implementation phase of 3D browser games.
|
|
11
|
+
|
|
12
|
+
Tech stack: **Three.js + React + R3F + TypeScript + Vite + pnpm**. R3F `<Canvas>` owns the 3D / WebGL world; React DOM (`src/ui`) owns the HUD, menus, and narrative panels. Cross-layer communication goes through the event bus, unified input actions, and serializable simulation state.
|
|
13
|
+
|
|
14
|
+
## Architecture Principles
|
|
15
|
+
|
|
16
|
+
1. **Separate R3F and DOM**
|
|
17
|
+
- `<Canvas>` / `game/three` owns scenes, meshes, lights, `AnimationMixer`, and camera orchestration.
|
|
18
|
+
- `src/ui` owns the formal HUD, menus, settings, inventory, quests, and narrative panels.
|
|
19
|
+
- MUST NOT use R3F `<Html>` as a replacement for the formal HUD.
|
|
20
|
+
|
|
21
|
+
2. **Simulation Before Rendering**
|
|
22
|
+
- Rules, values, win/loss, and saves belong in `game/simulation`, with no Three / React dependencies. (Aligned with the System layer in the 2D skill: the rules source-of-truth layer.)
|
|
23
|
+
- `useFrame` only orchestrates: read input/simulation -> sync `Object3D` -> mixer/camera; it does not write core rules.
|
|
24
|
+
|
|
25
|
+
3. **Pure Three Modules Must Be Unit-Testable**
|
|
26
|
+
- `game/three/*` MUST NOT import React; scene construction and math helpers can be verified independently.
|
|
27
|
+
|
|
28
|
+
4. **Stable Asset Keys + Canonical Semantics**
|
|
29
|
+
- All game code references assets through `manifest` / `public/config.json` / canonical packages, and does not hardcode glTF / texture paths in business code.
|
|
30
|
+
- **3D meshes MUST come from** `assets/canonical/<id>/` (or from `evomeme asset sync <id> --target three_js --project "<project>" --workspace "<workspace>" --json` syncing to `public/assets/canonical/<id>/`).
|
|
31
|
+
- After loading, orientation/scale **MUST** be applied according to `asset.json` (see `references/engine-asset-pipeline.md`); hardcoding `rotation.y += Math.PI` inside entities is prohibited.
|
|
32
|
+
- Alignment and preview default to `game-asset-align` + CLI `evomeme stage --asset <id> --target three_js`. Read the [CLI contract](../game-asset-align/references/tool-contract.md): `evomeme` abbreviates `npx -y evomeme@latest` or a local build of the same version; supply `--workspace` and use `--json` for automation. Keep Stage in a persistent session, return its URL at startup, and run subsequent commands in another terminal.
|
|
33
|
+
- **After Blender modeling or modification, Stage MUST be opened first, and the asset may only be imported after the user views and confirms the current Three.js version.** `alignment.ready=true` or `asset align` does not replace user confirmation; do not manually copy or click on behalf of the user to bypass the gate.
|
|
34
|
+
|
|
35
|
+
## Implementation Guidance
|
|
36
|
+
|
|
37
|
+
- Use `gameBus` (mitt) so React UI emits `command:*`, and the game runtime emits factual events such as `game:*` / `player:*`.
|
|
38
|
+
- Centralize physical input mapping in `game/input`; UI and Canvas only consume unified semantic actions.
|
|
39
|
+
- Put content data (levels, encounters, items) in `game/content`, decoupled from the rendering lifecycle.
|
|
40
|
+
- Centralize audio in `game/audio`, driven by bus events; MUST NOT play in-game SFX with `new Audio()` inside the HUD (see `references/engine-audio.md` for details).
|
|
41
|
+
- Canvas / gl / DPR defaults and R3F loading boundaries are covered in `references/engine-runtime.md`.
|
|
42
|
+
|
|
43
|
+
## Covered 3D Game Types
|
|
44
|
+
|
|
45
|
+
- Third-person / top-down exploration and lightweight action
|
|
46
|
+
- Endless runners and obstacle dodging
|
|
47
|
+
- Vehicles, pinball, and rigid-body sketches
|
|
48
|
+
- Lightweight shooting or encounter battles
|
|
49
|
+
- Casual gameplay that needs spatial 3D presentation
|
|
50
|
+
|
|
51
|
+
## Camera and Presentation
|
|
52
|
+
|
|
53
|
+
- Decide the camera model early: follow, orbit, lock-on, over-the-shoulder.
|
|
54
|
+
- Separate camera logic from game rules; shake / FOV changes serve readability.
|
|
55
|
+
- Resources MUST be disposed on StrictMode remount / unmount (geometry, materials, mixer, bus subscriptions).
|
|
56
|
+
- See `references/engine-input-camera.md` for details.
|
|
57
|
+
|
|
58
|
+
## Engine References (Load As Needed)
|
|
59
|
+
|
|
60
|
+
When writing/modifying 3D runtime code, load references by task in addition to `file-structure.md`; do not pre-read everything at once:
|
|
61
|
+
|
|
62
|
+
| Task | Load |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| Frame loop, Canvas/gl defaults, dispose, blank screen/double loop, R3F policy, diagnostic hooks | `references/engine-runtime.md` |
|
|
65
|
+
| Input intent, touch stickiness, camera follow / FOV | `references/engine-input-camera.md` |
|
|
66
|
+
| Physics selection, Rapier/fixed step, collision proxies | `references/engine-physics.md` |
|
|
67
|
+
| GLB/FBX import, AnimationMixer, root motion, import performance | `references/engine-asset-pipeline.md` |
|
|
68
|
+
| Stutter, pooling, InstancedMesh, DPR, LOD, hot-path allocation | `references/engine-performance.md` |
|
|
69
|
+
| AudioContext unlock, bus-driven audio playback, mute, restart cleanup | `references/engine-audio.md` |
|
|
70
|
+
|
|
71
|
+
Directory structure and layering are governed by this skill's `file-structure.md`; **do not** create separate directories based on the unrelated `core/entities/systems` scaffold.
|
|
72
|
+
|
|
73
|
+
## UI Integration
|
|
74
|
+
|
|
75
|
+
- HUDs, command menus, settings, and narrative interfaces use React DOM, overlaid above Canvas (`App` composition).
|
|
76
|
+
- `GameCanvas.tsx` is the WebGL <-> React DOM boundary.
|
|
77
|
+
- Business UI goes in `src/ui`; shared non-business primitives go in `src/components`.
|
|
78
|
+
|
|
79
|
+
## Scaffolding and Configuration
|
|
80
|
+
|
|
81
|
+
New project entry points: `index.html`, `src/main.tsx`, `public/config.json`. The package manager is **pnpm**. Build artifacts go to `dist/`, which must include `dist/index.html` and `dist/config.json`.
|
|
82
|
+
|
|
83
|
+
Directory layout, layering responsibilities, config schema, and deployment paths use `references/file-structure.md` as the only normative source.
|
|
84
|
+
|
|
85
|
+
## Common Anti-Patterns
|
|
86
|
+
|
|
87
|
+
- Writing combat/win-loss rules in `useFrame` or `Hud.tsx`
|
|
88
|
+
- Piling formal menus and settings into R3F `<Html>`
|
|
89
|
+
- Importing React hooks / components inside `game/three`
|
|
90
|
+
- HUD directly holding an `Object3D` reference and changing `position` every frame
|
|
91
|
+
- Hardcoding the same glTF / texture path in multiple places
|
|
92
|
+
- Adding an extra `new WebGLRenderer` or a second rAF that competes with R3F's loop
|
|
93
|
+
- Not capping DPR; aggressively creating meshes/audio sources on hot paths
|
|
94
|
+
- Playing in-game SFX with `new Audio()` inside the HUD
|
|
95
|
+
- Replacing this specification with a CRA / Next.js / npm-only scaffold (unless the user explicitly requests it)
|
|
96
|
+
|
|
97
|
+
## References
|
|
98
|
+
|
|
99
|
+
**Engine (This Skill)**
|
|
100
|
+
- File structure and layering: `references/file-structure.md`
|
|
101
|
+
- Runtime / Canvas / R3F policy: `references/engine-runtime.md`
|
|
102
|
+
- Input and camera: `references/engine-input-camera.md`
|
|
103
|
+
- Physics and collision: `references/engine-physics.md`
|
|
104
|
+
- Asset loading and animation: `references/engine-asset-pipeline.md`
|
|
105
|
+
- Performance: `references/engine-performance.md`
|
|
106
|
+
- Audio runtime: `references/engine-audio.md`
|
|
107
|
+
|
|
108
|
+
**Cross-Skill (Gameplay / Acceptance, Not Engine Implementation Details)**
|
|
109
|
+
- Gameplay workflow: `../game-designer/references/gameplay-workflows.md`
|
|
110
|
+
- Game-feel tuning: `../game-designer/references/game-feel.md`
|
|
111
|
+
- Level design: `../game-designer/references/game-design-level-design.md`
|
|
112
|
+
- Physics selection (design-side comparison): `../game-designer/references/physics-engine-selection.md`
|
|
113
|
+
- Definition of done for new games: `../game-designer/references/checklists/new-game-definition-of-done.md`
|
|
114
|
+
- Art style guide: `../game-art/references/art-styles.md`
|
|
115
|
+
- UI style specification: `../game-ui/references/ui-styles.md`
|
|
116
|
+
- Audio asset generation: `../game-audio/SKILL.md`
|
|
117
|
+
- QA / performance profiling: `../game-test/SKILL.md`
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Three.js 3D Game"
|
|
3
|
+
short_description: "Build clearly structured 3D browser games, separating gameplay simulation, scene rendering, and interface"
|
|
4
|
+
default_prompt: "Please use $threejs-3d-game to implement this 3D browser game according to my requirements, while keeping the boundaries between gameplay simulation, 3D scene, and interface clear."
|
|
5
|
+
|
|
6
|
+
policy:
|
|
7
|
+
allow_implicit_invocation: true
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Engine: Asset Loading and Animation Pipeline
|
|
2
|
+
|
|
3
|
+
Focuses on **how to safely connect GLB at runtime**, and how to consume **canonical asset packages** (`model.glb` + `asset.json`).
|
|
4
|
+
|
|
5
|
+
Load this file when loading/binding meshes, `AnimationMixer`, root motion, collision proxies, or post-import performance. Paths and config contracts are still governed by `file-structure.md`. For the alignment process, see skill `game-asset-align`.
|
|
6
|
+
|
|
7
|
+
Resolve the `evomeme` launcher through the [CLI contract](../../game-asset-align/references/tool-contract.md) and supply the workspace explicitly. Keep Stage in a persistent foreground session and run sync in another terminal.
|
|
8
|
+
|
|
9
|
+
## Canonical Package (Mandatory)
|
|
10
|
+
|
|
11
|
+
**After Blender modeling/modification, the Stage board MUST be opened first. Only after the user views it and clicks "confirm current version, allow import" may the next import step proceed.** `evomeme stage --asset <id> --workspace "<workspace>" --target three_js --json`; format checks and `alignment.ready` only indicate technical status and cannot skip confirmation. After changing the model, textures, lights, or display configuration, the old confirmation becomes invalid and it MUST be viewed and confirmed again.
|
|
12
|
+
|
|
13
|
+
Before entering the game, Tripo / code-modeled / Blender / uploaded models MUST be:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
assets/canonical/<asset_id>/model.glb
|
|
17
|
+
assets/canonical/<asset_id>/asset.json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Sync into the Vite project:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
evomeme asset sync <id> --target three_js --project "<project>" --workspace "<workspace>" --json
|
|
24
|
+
-> public/assets/canonical/<asset_id>/
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Key fields in `asset.json`: `forward_axis`, `scale_hint_metres`, `yaw/pitch/roll_offset_degrees`, `verified_by`.
|
|
28
|
+
For directional assets (characters/firearms/vehicles), `verified_by` MUST NOT be `unverified`.
|
|
29
|
+
|
|
30
|
+
Runtime convention: **-Z forward, +Y up** (same as Godot). For full scenes, use the synced `src/evomeme-stage/<id>/canonical_loader.js` and call `loadReviewedScene`. It shares scene-runtime.js and three-appearance.js with Stage, reproducing the confirmed PBR, lights, environment, camera, and existing baked display path. The project must use Three.js **0.170.0**; mismatched versions will error and require dependencies to be unified before viewing again.
|
|
31
|
+
|
|
32
|
+
The package includes three.appearance.json (confirmed profile, diagnostics, and file fingerprints), THREE_IMPORT.md, the pinned runtime, and independently viewable three-preview.html. The old applyCanonicalOrientation.ts is only for compatibility with old model code; it is not responsible for full-scene display.
|
|
33
|
+
|
|
34
|
+
## Output and Loading Preferences
|
|
35
|
+
|
|
36
|
+
| Purpose | Format |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| Three runtime | Prefer GLB (PBR) + same-directory `asset.json` |
|
|
39
|
+
| Animation exchange | FBX as needed, then import carefully or convert offline to GLB |
|
|
40
|
+
| Printing / AR | STL/3MF, USDZ - not the default for this game runtime |
|
|
41
|
+
|
|
42
|
+
- Use `GLTFLoader` (`three/addons/loaders/GLTFLoader.js`).
|
|
43
|
+
- Runtime URL: `./` relative paths, `/assets/canonical/<id>/model.glb`, or external `http(s)`; arbitrary site-root absolute paths are prohibited (see deployment rules).
|
|
44
|
+
- Put loading in the asset layer / `game/three` helpers; **do not** `load` inside entity per-frame update.
|
|
45
|
+
- Business code references assets through `manifest` / `config` / canonical `asset_id`, and does not hardcode bare URLs.
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import * as THREE from 'three';
|
|
49
|
+
import { loadReviewedScene } from '../../evomeme-stage/courtyard/canonical_loader.js';
|
|
50
|
+
|
|
51
|
+
// assetBase comes from deployment resource config, points to this scene directory, and ends with /.
|
|
52
|
+
const runtime = await loadReviewedScene({
|
|
53
|
+
renderer, world: scene, camera, assetBase: config.assets.courtyard,
|
|
54
|
+
});
|
|
55
|
+
// Game main loop; the game is responsible for updating camera aspect and renderer size.
|
|
56
|
+
runtime.render(camera, deltaSeconds);
|
|
57
|
+
// When leaving the scene
|
|
58
|
+
runtime.dispose();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
A full environment is loaded only once inside one Scene. Props use appearanceEnabled:false to attach to an existing environment. The returned root node already has canonical TRS applied; do not wrap it in compensating rotation or scale again. The return value also includes animations and stats; gameplay, physics, and animation playback are taken over by the game's asset layer. R3F or custom postprocessing must take over the render loop and call runtime.render; merely letting the framework call renderer.render will skip the full scene bake/postprocessing path.
|
|
62
|
+
|
|
63
|
+
## Wrapping Entities
|
|
64
|
+
|
|
65
|
+
When importing a scene package into game entities, explicitly handle:
|
|
66
|
+
|
|
67
|
+
- **MUST** use `asset.json` to unify scale, pivot, and orientation (outer `Group`)
|
|
68
|
+
- Bounding boxes / logical bounds
|
|
69
|
+
- **Collision proxy separated from visuals**
|
|
70
|
+
- Loading failure placeholder or error state
|
|
71
|
+
- Records: file size, triangle count, material count, texture dimensions, clip names, `verified_by`
|
|
72
|
+
|
|
73
|
+
## AnimationMixer
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
const mixer = new THREE.AnimationMixer(gltf.scene);
|
|
77
|
+
const action = mixer.clipAction(gltf.animations[0]);
|
|
78
|
+
action.play();
|
|
79
|
+
|
|
80
|
+
// After useFrame / simulation: seconds
|
|
81
|
+
mixer.update(deltaSeconds);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- Map gameplay states to clips: idle / walk-run / jump / attack / hurt / fall / turn, etc.
|
|
85
|
+
- Arcade default: **in-place animation + code-driven displacement**; if root motion is retained, it MUST be intentional.
|
|
86
|
+
- On restart, stop actions and dispose the mixer to avoid stacked playback.
|
|
87
|
+
|
|
88
|
+
## Root Motion and Imported Animation Notes (Engine Side)
|
|
89
|
+
|
|
90
|
+
If upstream rigging/retargeting pitfalls exist, fix them on the engine side this way:
|
|
91
|
+
|
|
92
|
+
1. When in-place animation is needed, handle it preferentially **after import**; do not depend on uncontrolled upstream `animate_in_place` behavior.
|
|
93
|
+
2. When making an animation in-place, change only the top-level root bone position track (common name `Root.position`), and pin only horizontal XZ; **preserve Y** (jumping rise/fall).
|
|
94
|
+
3. Do not broadly delete Hip/Pelvis or twist tracks: some rigs skin limbs to twist bones, and deleting tracks will collapse limbs.
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
for (const clip of clips) {
|
|
98
|
+
for (const tr of clip.tracks) {
|
|
99
|
+
if (tr.name !== 'Root.position') continue;
|
|
100
|
+
const v = tr.values;
|
|
101
|
+
const x0 = v[0];
|
|
102
|
+
const z0 = v[2];
|
|
103
|
+
for (let i = 0; i < v.length; i += 3) {
|
|
104
|
+
v[i] = x0;
|
|
105
|
+
v[i + 2] = z0;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
If batch retargeting produces `NlaTrack` / `NlaTrack.001`: map to preset names by index according to the **request order**, then after loading set `clip.name = 'walk'` and select by name.
|
|
112
|
+
|
|
113
|
+
Log after loading: `gltf.animations.map(c => \`${c.name} ${c.tracks.length} tracks\`)`. Healthy humanoid clips should drive many bones; very few tracks usually mean upstream rigging is broken, so fix rigging first.
|
|
114
|
+
|
|
115
|
+
### FBX Intake (Common for Humanoid Retargeting)
|
|
116
|
+
|
|
117
|
+
- `FBXLoader` depends on `fflate`; bundlers generally include it automatically.
|
|
118
|
+
- The same take may produce two clips with different `|` path depths: **keep the shallower** one.
|
|
119
|
+
- Select clips with keywords (walk / idle / attack); do not blindly use `animations[0]` unless the pipeline guarantees a single take.
|
|
120
|
+
- FBX is often Phong and darker than GLB PBR; final art alignment can convert offline to GLB.
|
|
121
|
+
- Apart from "pinning horizontal motion on a single root bone", avoid further loader-side animation "fixes" (they easily make things worse).
|
|
122
|
+
|
|
123
|
+
## Performance Discipline
|
|
124
|
+
|
|
125
|
+
- Browser/mobile: control polygon count and texture dimensions; hero pieces high quality + instanced/procedural supporting elements.
|
|
126
|
+
- Share geometry/material as much as possible when cloning.
|
|
127
|
+
- Dispose loaded resources on scene exit / level change.
|
|
128
|
+
- Record renderer diagnostics before and after import: calls, triangles, geometries, textures, materials, file size.
|
|
129
|
+
- Runtime stutter, pooling, DPR, and LOD are covered in `engine-performance.md`.
|
|
130
|
+
|
|
131
|
+
## Import Checkup Checklist
|
|
132
|
+
|
|
133
|
+
- [ ] File size and triangle count are acceptable
|
|
134
|
+
- [ ] Mesh / material / texture counts and dimensions
|
|
135
|
+
- [ ] PBR appearance under current lighting
|
|
136
|
+
- [ ] Metric scale and pivot / bounds come from `asset.json`, not guesses
|
|
137
|
+
- [ ] `verified_by` is recorded (directional assets are not unverified)
|
|
138
|
+
- [ ] Collision proxy is separate and visible in debug
|
|
139
|
+
- [ ] Clip names, durations, and root-motion strategy are clear
|
|
140
|
+
- [ ] Failure has a placeholder; success path enters manifest/config/canonical
|
|
141
|
+
- [ ] No leaks on unload and restart
|
|
142
|
+
- [ ] No hardcoded compensating rotation in gameplay code
|
|
143
|
+
|
|
144
|
+
## Common Fixes
|
|
145
|
+
|
|
146
|
+
| Problem | Handling |
|
|
147
|
+
| --- | --- |
|
|
148
|
+
| Too large/small | Normalize bounds on the outer Group |
|
|
149
|
+
| Wrong orientation | **Change asset.json / return to the board**, do not permanently hard-rotate inside gameplay wrappers |
|
|
150
|
+
| Wrong scale | Write `scale_hint_metres`, then reload |
|
|
151
|
+
| Broken geometry | Edit and re-export from Blender (`evomeme asset repair <id>` supports origin/grounding) -> confirm in Stage again -> sync |
|
|
152
|
+
| Animation foot sliding/drifting away | Keep exported root motion, then pin only XZ as above |
|
|
153
|
+
| Too expensive | Reduce geometry, shrink textures, reduce unique retopology |
|
|
154
|
+
| Material too dark/bright | Color space, tone mapping, ambient light, exposure |
|
|
155
|
+
| Strange collision | Visual mesh does not participate in physics; create a separate proxy |
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Engine: Audio Runtime
|
|
2
|
+
|
|
3
|
+
The audio runtime lives in `game/audio` + `gameBus`. Asset generation and music selection go through `../game-audio`; this file only governs **runtime wiring and lifecycle**.
|
|
4
|
+
|
|
5
|
+
Load this file when changing in-game BGM/SFX playback, unlock, mute, or restart cleanup.
|
|
6
|
+
|
|
7
|
+
## Ownership
|
|
8
|
+
|
|
9
|
+
| Item | Location |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Playback / decode / dispose | `game/audio` (`audioManager`, etc.) |
|
|
12
|
+
| Gameplay facts -> sound | `audioHooks` subscribes to `gameBus` (`game:*` / `player:*` / `game:feedback`) |
|
|
13
|
+
| Mute / volume preferences | HUD emits `command:audio-prefs` -> `audioPrefs` applies |
|
|
14
|
+
| URL / toggles | `public/config.json` or `game/assets` manifest |
|
|
15
|
+
|
|
16
|
+
Prohibited:
|
|
17
|
+
|
|
18
|
+
- Playing in-game SFX with `new Audio()` inside HUD / `useFrame`
|
|
19
|
+
- Creating new audio sources or footstep loops every frame
|
|
20
|
+
- Duplicating playback logic across multiple components
|
|
21
|
+
|
|
22
|
+
## User-Gesture Unlock
|
|
23
|
+
|
|
24
|
+
Browsers require resuming `AudioContext` (or equivalent unlock) after a **user gesture**:
|
|
25
|
+
|
|
26
|
+
- The first "start / continue / tap Canvas" path calls `audioManager.unlock()` (or `context.resume()`)
|
|
27
|
+
- Unlock failure must be visible (logs / diagnostics); do not fail silently
|
|
28
|
+
- Mobile MUST be verified once on a real device or with a simulated gesture
|
|
29
|
+
|
|
30
|
+
## Event-Driven Hooks (Minimum Set)
|
|
31
|
+
|
|
32
|
+
Play sounds by state, not as random decoration:
|
|
33
|
+
|
|
34
|
+
| Event Class | Examples |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| UI | Click, pause, retry |
|
|
37
|
+
| Progress | Pickup, score, milestone / combo |
|
|
38
|
+
| Pressure | Hurt, failure, danger approaching |
|
|
39
|
+
| Ability | Dash / accelerate / fire |
|
|
40
|
+
| Ambience | BGM or environment loop (toggleable) |
|
|
41
|
+
|
|
42
|
+
Payloads such as `game:feedback` / `player:movement` use plain data; `game/audio` maps them to concrete clips, and does not write URLs into UI.
|
|
43
|
+
|
|
44
|
+
## Lifecycle
|
|
45
|
+
|
|
46
|
+
- **Pause / hidden page**: stop or lower in-game BGM; `visibilitychange` MUST NOT stack a second loop
|
|
47
|
+
- **Failure / results / restart**: stop in-game loops and short SFX; remove subscriptions for this run only; return pooled audio sources (if any)
|
|
48
|
+
- **Level change**: unload buffers unique to this level; common UI sounds may remain
|
|
49
|
+
- **Mute / volume**: preferences MUST apply to all groups (BGM / SFX / UI)
|
|
50
|
+
|
|
51
|
+
## With config
|
|
52
|
+
|
|
53
|
+
`http(s)` URLs for BGM/SFX, default volume, and whether music is enabled go into flat `config.json`; code reads through `getSetting` / manifest keys, and scattered hardcoded paths are prohibited.
|
|
54
|
+
|
|
55
|
+
## Troubleshooting
|
|
56
|
+
|
|
57
|
+
- File URL, MIME, CORS
|
|
58
|
+
- Whether decode/load rejects are visible
|
|
59
|
+
- Whether `play` is called without ever unlocking
|
|
60
|
+
- Whether SFX is triggered every frame
|
|
61
|
+
- Whether pause/restart causes double BGM
|
|
62
|
+
- Whether mute misses any group
|
|
63
|
+
|
|
64
|
+
## Engine Anti-Patterns
|
|
65
|
+
|
|
66
|
+
- UI buttons directly call `new Audio(url).play()`
|
|
67
|
+
- Depending on autoplay without unlocking
|
|
68
|
+
- BGM residue / stacked listeners after restart
|
|
69
|
+
- Business code hardcodes audio URLs
|
|
70
|
+
- Writing generation-pipeline details into `game/audio` (generation belongs to the `game-audio` skill)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Engine: Input and Camera
|
|
2
|
+
|
|
3
|
+
Input and camera live in `game/input` + `game/three`. This does not include UI visual design or numerical juice recipes (for game feel, see `game-designer/references/game-feel.md`).
|
|
4
|
+
|
|
5
|
+
Load this file when changing controls, touch stickiness, camera follow, FOV, or pointer lock.
|
|
6
|
+
|
|
7
|
+
## Input: Intent and Ownership
|
|
8
|
+
|
|
9
|
+
1. **Collection** (keyboard/mouse / pointer / touch / gamepad) is separated from **simulation**.
|
|
10
|
+
2. Physical device -> semantic action (such as `move`, `dash`, `confirm`) is centralized in `game/input`.
|
|
11
|
+
3. `GameCanvas` / DOM HUD only reads the unified input surface; hardcoded keybindings MUST NOT be scattered inside `useFrame`.
|
|
12
|
+
4. UI buttons enter the runtime through the same action set or `command:*`, and do not duplicate a separate rule set inside buttons.
|
|
13
|
+
|
|
14
|
+
### Stickiness and Cancellation
|
|
15
|
+
|
|
16
|
+
- MUST handle `pointerup` / `pointercancel` / `blur` / `visibilitychange` to avoid stuck joysticks or dash buttons.
|
|
17
|
+
- Pointer controls use `setPointerCapture`; test environments may not have a real pointerId, so tolerate that.
|
|
18
|
+
- Use `event.code` for keys (layout-independent); do not rely only on `key`.
|
|
19
|
+
- CSS `touch-action` is set intentionally and with controlled scope; avoid full-page scrolling stealing gestures.
|
|
20
|
+
- After failure / pause / restart, restore focus and make restarted controls usable.
|
|
21
|
+
|
|
22
|
+
### Movement Composition (Desktop + Joystick)
|
|
23
|
+
|
|
24
|
+
Normalize if the sum of the key vector and joystick vector has length > 1 (scaffold pattern):
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
target.copy(keyVector).add(pointerVector);
|
|
28
|
+
if (target.lengthSq() > 1) target.normalize();
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
When mobile is in scope: the virtual joystick is in DOM (`src/ui`) and writes to the same `move` intent through `game/input`; do not bind another conflicting listener set inside Canvas.
|
|
32
|
+
|
|
33
|
+
### Input Troubleshooting
|
|
34
|
+
|
|
35
|
+
- Whether focus is on a page that can receive keyboard input
|
|
36
|
+
- Whether listeners are attached to the correct element
|
|
37
|
+
- `touch-action` / viewport meta / safe area
|
|
38
|
+
- Whether DPR makes touch hit areas too small
|
|
39
|
+
- Whether resize updates after rotation
|
|
40
|
+
- Whether desktop keyboard/mouse still works after adding mobile controls
|
|
41
|
+
- Whether UI emits intent instead of directly changing simulation root state
|
|
42
|
+
|
|
43
|
+
## Camera: Model and Responsibilities
|
|
44
|
+
|
|
45
|
+
Choose one primary model early and write it into the implementation (logic in `game/three`; rules still in simulation):
|
|
46
|
+
|
|
47
|
+
| Model | Applies To |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| Follow + fixed offset | Runners, top-down action, arcade |
|
|
50
|
+
| Orbit / inspect | Showcases, slower exploration |
|
|
51
|
+
| Target lock | Tactical, lock-on combat |
|
|
52
|
+
| Over-the-shoulder | Lightweight third-person |
|
|
53
|
+
|
|
54
|
+
Rules:
|
|
55
|
+
|
|
56
|
+
- Separate camera from game rules: the camera reads "follow target pose / event pulses" and does not rewrite win/loss state.
|
|
57
|
+
- Shake / FOV kick only serve readability and MUST NOT block the next decision area.
|
|
58
|
+
- Readability: the next decision is visible, the player is sufficiently centered, and threats are not hidden by HUD/camera clipping.
|
|
59
|
+
- Accessibility: avoid excessive shake, flashing, and uncontrollable motion; respect hooks such as `setReducedMotion`.
|
|
60
|
+
|
|
61
|
+
### Follow Lag (Exponential Smoothing)
|
|
62
|
+
|
|
63
|
+
Common scaffold form (`lag` is the time constant in seconds; it may come from `camera_follow_lag` in `config.json`):
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const desired = target.clone().add(offset);
|
|
67
|
+
const factor = 1 - Math.exp(-delta / Math.max(0.001, lag));
|
|
68
|
+
camera.position.lerp(desired, factor);
|
|
69
|
+
camera.lookAt(lookTarget);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Tunable axes (change engine parameters, not rules): follow lag, look-ahead, height, distance, FOV, near/far planes, pull-in strategy for collision/occlusion.
|
|
73
|
+
|
|
74
|
+
### Verify Camera and Controls Together
|
|
75
|
+
|
|
76
|
+
After changing speed or acceleration, MUST retest:
|
|
77
|
+
|
|
78
|
+
- Whether high speed clips through geometry or the camera loses the target
|
|
79
|
+
- Whether turning fights with look-ahead
|
|
80
|
+
- Whether pointer should freeze or unlock when pause/menu opens
|
|
81
|
+
|
|
82
|
+
## Config Contract
|
|
83
|
+
|
|
84
|
+
Tunable items such as camera lag, FOV, and whether screen shake is enabled go into flat `public/config.json` (see `file-structure.md`); copying magic numbers across multiple camera files is prohibited.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Engine: Performance
|
|
2
|
+
|
|
3
|
+
Load when addressing stutter, frame drops, generation spikes, or low mobile frame rate.
|
|
4
|
+
|
|
5
|
+
Profiling flow and acceptance evidence are in `../game-test`; AAA rendering budgets / LOD art-side guidance is in `../threejs-aaa-graphics-builder/references/technical-art.md`. This file only governs **implementation-time engine constraints**.
|
|
6
|
+
|
|
7
|
+
## First Things to Prioritize
|
|
8
|
+
|
|
9
|
+
1. **Object pools**: bullets, pickups, fragments, short-lived VFX carriers - hot paths MUST NOT aggressively `new` / `dispose` meshes
|
|
10
|
+
2. **Shared resources**: repeated pieces use `InstancedMesh` or shared geometry / material / texture
|
|
11
|
+
3. **DPR cap**: default cap `2` (see `engine-runtime.md` Canvas config); mobile may go lower
|
|
12
|
+
4. **Zero allocation on hot paths**: `useFrame` / simulation does not create `{}` / `new Vector3` every frame; reuse temporary vectors
|
|
13
|
+
5. **Reduce physics cost first**: simple colliders, sleeping, fewer dynamic bodies, narrow sensors; CCD only for bodies that need it (see `engine-physics.md`)
|
|
14
|
+
|
|
15
|
+
## Rendering Side
|
|
16
|
+
|
|
17
|
+
| Technique | When |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `InstancedMesh` | Lane markers, bolts, windows, grass, debris, repeated props |
|
|
20
|
+
| Shared geometry/material | Do not clone each material chain separately when cloning entities |
|
|
21
|
+
| Frustum / distance culling | Far scenery and offscreen dynamic bodies |
|
|
22
|
+
| `LOD` | Background pieces, dense world kits |
|
|
23
|
+
| Shadow reduction | Fewer casters, smaller shadow maps, contact shadows/blob substitutes |
|
|
24
|
+
| Postprocessing throttling | Keep only passes required for readability |
|
|
25
|
+
| Texture discipline | Controlled size, reuse, mipmap; avoid many unique large textures on screen |
|
|
26
|
+
|
|
27
|
+
Optimization order: **check DPR / post / shadow / instancing / culling first**, then reduce visual density; do not start by deleting hero-piece readability.
|
|
28
|
+
|
|
29
|
+
User-facing performance is governed by **production preview** (`pnpm build` + preview); do not use dev server frame rate as evidence.
|
|
30
|
+
|
|
31
|
+
## Object Pools (3D)
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
// Illustration: the pool holds constructed Object3D + optional physics body handles
|
|
35
|
+
function acquireBullet(): BulletView {
|
|
36
|
+
const b = pool.pop() ?? createBulletView();
|
|
37
|
+
b.root.visible = true;
|
|
38
|
+
// Enable collider / reset transform
|
|
39
|
+
return b;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function releaseBullet(b: BulletView): void {
|
|
43
|
+
b.root.visible = false;
|
|
44
|
+
// Stop mixer, disable body, remove listeners; do not dispose shared geometry
|
|
45
|
+
pool.push(b);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
On level restart: return all active pooled instances, then clean non-pooled level-specific resources.
|
|
50
|
+
|
|
51
|
+
## CPU and Throttling
|
|
52
|
+
|
|
53
|
+
- Movement / camera / mixer every frame; AI, pathfinding, and distant cleanup can run at 5-10Hz.
|
|
54
|
+
- Multiple `AnimationMixer` instances update only visible / nearby entities.
|
|
55
|
+
- DOM HUD is pushed by events/store; avoid forcing the whole React tree to rerender every frame.
|
|
56
|
+
|
|
57
|
+
## Physics Cost (Summary)
|
|
58
|
+
|
|
59
|
+
- Visual mesh != collider; use primitives / compounds.
|
|
60
|
+
- Offscreen or resting bodies can sleep; narrow sensors.
|
|
61
|
+
- Expose body / collider / CCD / sensor counts in diagnostics (see runtime hooks).
|
|
62
|
+
|
|
63
|
+
## Memory and Level Changes
|
|
64
|
+
|
|
65
|
+
- On level change, dispose: level-unique geometry, materials, textures, render targets, mixers, physics bodies.
|
|
66
|
+
- Common material libraries / shared atlases may remain.
|
|
67
|
+
- Audio resource cleanup is covered in `engine-audio.md`.
|
|
68
|
+
|
|
69
|
+
## Diagnostic Fields (Implementation Side)
|
|
70
|
+
|
|
71
|
+
Provide as much as possible in `__THREE_GAME_DIAGNOSTICS__`:
|
|
72
|
+
|
|
73
|
+
- `renderer.info`: `render.calls`, `triangles`, `memory.geometries`, `memory.textures`
|
|
74
|
+
- DPR, shadow/postprocessing toggle summary
|
|
75
|
+
- Entity count, pool size, active mixer count
|
|
76
|
+
- Physics (if any): engine, timestep, bodies, colliders, sensors, ccdBodies
|
|
77
|
+
|
|
78
|
+
## Quick Check Table
|
|
79
|
+
|
|
80
|
+
| Symptom | Common Cause | Handling |
|
|
81
|
+
| --- | --- | --- |
|
|
82
|
+
| Slower over time | Missing dispose / stacked subscriptions | Check restart and pool return |
|
|
83
|
+
| Periodic hitch | GC | Pooling, reduce `useFrame` allocation |
|
|
84
|
+
| Always low frame rate | draw call / triangles / DPR | Instancing, LOD, cap DPR, reduce shadow |
|
|
85
|
+
| Generation spike | Creating meshes on the spot | Pre-pool / preload |
|
|
86
|
+
| Physics stutter | Too many bodies/contacts | Simpler colliders, sleeping, fewer dynamic bodies |
|
|
87
|
+
| Sharp drop after import | Retopology / large textures | Reduce geometry, shrink textures (generation side + import checkup) |
|
|
88
|
+
|
|
89
|
+
## Engine Anti-Patterns
|
|
90
|
+
|
|
91
|
+
- Cutting art detail before measuring
|
|
92
|
+
- Using dev server FPS as release performance evidence
|
|
93
|
+
- Creating new geometry / material / `Audio` every frame
|
|
94
|
+
- Many unique meshes that could use `InstancedMesh`
|
|
95
|
+
- Detailed imported mesh as collider
|
|
96
|
+
- Not capping DPR on mobile
|