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,142 @@
|
|
|
1
|
+
# Engine: Physics and Collision
|
|
2
|
+
|
|
3
|
+
Three.js / R3F **is only responsible for rendering**; physics is a parallel world. After advancing with a fixed timestep, synchronize body transforms to `Object3D` in one place.
|
|
4
|
+
|
|
5
|
+
Load this file when adding/replacing physics, vehicles, pinball, rigid bodies, sensors, or high-speed collisions. Gameplay-facing guidance can be compared with `../game-designer/references/physics-engine-selection.md`; **implementation is governed by this file + the layering in `file-structure.md`**.
|
|
6
|
+
|
|
7
|
+
## Selection Ladder
|
|
8
|
+
|
|
9
|
+
1. **Custom collision**: arcade triggers, pickups, lanes, bullets, simple overlaps, deterministic tracks; game feel is authored, not simulated.
|
|
10
|
+
2. **Rapier** (`@dimforge/rapier3d-compat`): the default for serious 3D physics - rigid bodies, sensors, multiple contacts, high speed, balls, slopes, moving platforms, reliable browser/mobile behavior.
|
|
11
|
+
3. **cannon-es**: small-scale rigid bodies, lightweight JS fallback when you want to avoid WASM.
|
|
12
|
+
4. **Jolt**: consider only when its features are explicitly needed and the integration cost is acceptable.
|
|
13
|
+
5. **Ammo.js**: only for existing projects or strong dependencies; do not default to it for new projects.
|
|
14
|
+
6. **Matter.js**: only for 2D gameplay (even if rendered with Three).
|
|
15
|
+
|
|
16
|
+
Most new 3D projects that need "real physics" choose Rapier.
|
|
17
|
+
|
|
18
|
+
## Quick Lookup by Type
|
|
19
|
+
|
|
20
|
+
| Use Custom | Use Rapier |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| Endless runners, lane dodging, simple shooting, pickup gates | Mini golf, billiards, pinball, pachinko, physics puzzles |
|
|
23
|
+
| Scripted obstacles, simple sphere/box overlap | Platforms, moving platforms, slopes, character controllers |
|
|
24
|
+
| Racing guardrails with authored feel | Debris piles, boxes, high-speed objects that need CCD |
|
|
25
|
+
| | Many sensors / collision events |
|
|
26
|
+
|
|
27
|
+
Avoid using detailed visual meshes for collision: use primitives, compound shapes, or convex hulls; only simplified triangle meshes should be considered for static level geometry. Generated GLB MUST have a separate **collision proxy**.
|
|
28
|
+
|
|
29
|
+
## Ownership in This Project
|
|
30
|
+
|
|
31
|
+
| Item | Location |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| World / body / collider creation and destruction | Physics module under `game/simulation`, or an explicit `PhysicsWorld` facade |
|
|
34
|
+
| Fixed-timestep `step` | Simulation update (called into simulation by `useFrame`) |
|
|
35
|
+
| Visual sync | The **only** place inside `useFrame`: body -> `Object3D` |
|
|
36
|
+
| Debug collider drawing | `game/three` or diagnostics layer; off in release |
|
|
37
|
+
|
|
38
|
+
Prohibited: calling `createRigidBody` inside render components; writing `mesh.position` in multiple places and competing with body ownership; leaving body residue after restart.
|
|
39
|
+
|
|
40
|
+
## Update Order (Including Physics)
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
input intents -> fixed physics step -> game state / collision events -> VFX / camera / UI -> render
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Rapier Integration Pattern
|
|
47
|
+
|
|
48
|
+
Install (this repository's package manager is pnpm):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pnpm add @dimforge/rapier3d-compat
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Initialize once before starting gameplay:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import RAPIER from '@dimforge/rapier3d-compat';
|
|
58
|
+
|
|
59
|
+
await RAPIER.init();
|
|
60
|
+
const world = new RAPIER.World({ x: 0, y: -9.81, z: 0 });
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Fixed-timestep accumulator:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const fixedDt = 1 / 60;
|
|
67
|
+
let accumulator = 0;
|
|
68
|
+
|
|
69
|
+
function stepPhysics(deltaSeconds: number) {
|
|
70
|
+
accumulator += Math.min(deltaSeconds, 0.1);
|
|
71
|
+
while (accumulator >= fixedDt) {
|
|
72
|
+
world.timestep = fixedDt;
|
|
73
|
+
world.step();
|
|
74
|
+
accumulator -= fixedDt;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Rigid body + collider + sync:
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
const body = world.createRigidBody(
|
|
83
|
+
RAPIER.RigidBodyDesc.dynamic()
|
|
84
|
+
.setTranslation(0, 2, 0)
|
|
85
|
+
.setLinearDamping(0.25)
|
|
86
|
+
.setAngularDamping(0.5),
|
|
87
|
+
);
|
|
88
|
+
world.createCollider(
|
|
89
|
+
RAPIER.ColliderDesc.ball(0.5).setRestitution(0.6).setFriction(0.4),
|
|
90
|
+
body,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// The only sync point
|
|
94
|
+
const t = body.translation();
|
|
95
|
+
const r = body.rotation();
|
|
96
|
+
mesh.position.set(t.x, t.y, t.z);
|
|
97
|
+
mesh.quaternion.set(r.x, r.y, r.z, r.w);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Enable CCD for high speed (has cost; only for bodies that need it):
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
RAPIER.RigidBodyDesc.dynamic().setCcdEnabled(true);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Sensors / triggers:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
RAPIER.ColliderDesc.ball(1)
|
|
110
|
+
.setSensor(true)
|
|
111
|
+
.setActiveEvents(RAPIER.ActiveEvents.COLLISION_EVENTS);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Implementation Rules
|
|
115
|
+
|
|
116
|
+
- Moving platforms / scripted obstacles use **kinematic** bodies, and visual and physics move together.
|
|
117
|
+
- Pickups, finish lines, checkpoints, and damage zones use **sensor**.
|
|
118
|
+
- Character controllers prefer capsules, locked rotation, and kinematic movement (unless ragdoll is required).
|
|
119
|
+
- Arcade vehicles: do not rely only on a bare rigid body; combine control logic + collision response.
|
|
120
|
+
- Use sleeping, and remove/dispose bodies on restart to avoid stale simulation.
|
|
121
|
+
- Tuning units must match scene scale; explicitly set friction, restitution, damping, mass/density, gravity scale, and collision groups.
|
|
122
|
+
- Debug: body/collider counts, contact pairs, velocity; off in release builds.
|
|
123
|
+
|
|
124
|
+
## Verification (Physics Changes)
|
|
125
|
+
|
|
126
|
+
- `pnpm build` / type check
|
|
127
|
+
- Real input changes body state
|
|
128
|
+
- Collision / trigger paths work
|
|
129
|
+
- No body residue after restart
|
|
130
|
+
- High speed does not tunnel through geometry
|
|
131
|
+
- Simulation does not collapse under low-frame spikes
|
|
132
|
+
- Diagnostics record: engine, timestep, body/collider count, CCD, sensor, risky collider
|
|
133
|
+
|
|
134
|
+
## Common Failures
|
|
135
|
+
|
|
136
|
+
- Variable-timestep physics -> drifting feel
|
|
137
|
+
- Visual and physics sync in multiple places -> drift
|
|
138
|
+
- Body residue after restart
|
|
139
|
+
- Imported mesh used for collision -> slow and wrong
|
|
140
|
+
- High speed without CCD -> penetration
|
|
141
|
+
- Sensor active events not enabled
|
|
142
|
+
- Kinematic platform only moves the mesh and not physics
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Engine Runtime (R3F / Three.js)
|
|
2
|
+
|
|
3
|
+
This file defines R3F / Three.js **engine-layer** conventions (see `file-structure.md`). It does not include design, levels, or game-feel juice recipes.
|
|
4
|
+
|
|
5
|
+
Load this file when writing/modifying runtime, Canvas/gl defaults, loops, lifecycle, blank-screen/double-loop issues, dispose, diagnostic hooks, or R3F loading boundaries.
|
|
6
|
+
|
|
7
|
+
## Directory and Ownership Mapping
|
|
8
|
+
|
|
9
|
+
| Responsibility | Location in This Project |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| DOM startup, CSS | `main.tsx` / `App.tsx` / `index.css` |
|
|
12
|
+
| Renderer, Canvas, pixel ratio | `ui/components/GameCanvas.tsx` (R3F `<Canvas>`) |
|
|
13
|
+
| Frame-loop orchestration | `useFrame` in `GameCanvas` (do not start another `requestAnimationFrame`) |
|
|
14
|
+
| Input collection -> semantic actions | `game/input` |
|
|
15
|
+
| Rules / state / fixed-step physics | `game/simulation` (no Three / React) |
|
|
16
|
+
| Camera, world meshes, mixer | `game/three/*` (no React) + `useFrame` sync |
|
|
17
|
+
| UI bridge | `game/bridge` + `src/ui` |
|
|
18
|
+
| Asset keys / loading | `game/assets` + `game/three` loading helpers |
|
|
19
|
+
| Diagnostics / test hooks | Installed when `GameCanvas` mounts, cleaned up on unmount |
|
|
20
|
+
|
|
21
|
+
## Canvas / Renderer Defaults
|
|
22
|
+
|
|
23
|
+
**MUST NOT** create another `new THREE.WebGLRenderer` outside `GameCanvas`. The only WebGL entry point is R3F `<Canvas>`.
|
|
24
|
+
|
|
25
|
+
Recommended defaults (can be tuned per project, but must be set explicitly; do not rely on implicit defaults):
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
import { Canvas } from '@react-three/fiber';
|
|
29
|
+
import * as THREE from 'three';
|
|
30
|
+
|
|
31
|
+
<Canvas
|
|
32
|
+
shadows
|
|
33
|
+
dpr={[1, 2]} // Pixel ratio cap 2
|
|
34
|
+
gl={{
|
|
35
|
+
antialias: true,
|
|
36
|
+
alpha: false,
|
|
37
|
+
powerPreference: 'high-performance',
|
|
38
|
+
outputColorSpace: THREE.SRGBColorSpace,
|
|
39
|
+
toneMapping: THREE.ACESFilmicToneMapping,
|
|
40
|
+
toneMappingExposure: 1.05,
|
|
41
|
+
}}
|
|
42
|
+
camera={{ fov: 50, near: 0.1, far: 500, position: [0, 5, 10] }}
|
|
43
|
+
>
|
|
44
|
+
{/* World + useFrame orchestration */}
|
|
45
|
+
</Canvas>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Rules:
|
|
49
|
+
|
|
50
|
+
- Leave resize / aspect to R3F; do not use CSS `transform: scale` to pretend the canvas was resized.
|
|
51
|
+
- Shadows: `shadows` + light `castShadow`; mobile may turn off or reduce cascades (see `engine-performance.md`).
|
|
52
|
+
- Color space and tone mapping must be consistent with imported PBR; if too dark/bright, check here and ambient light first, then change assets.
|
|
53
|
+
- Deeper lighting/postprocessing recipes belong to `threejs-aaa-graphics-builder`; this file only sets startup defaults.
|
|
54
|
+
|
|
55
|
+
## Frame Update Order
|
|
56
|
+
|
|
57
|
+
Keep an explicit order every frame (under R3F, orchestrated by `useFrame`; rendering is left to R3F):
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
input intents
|
|
61
|
+
-> fixed physics (if any, accumulator)
|
|
62
|
+
-> gameplay / simulation systems
|
|
63
|
+
-> animation / mixer / VFX sockets
|
|
64
|
+
-> camera
|
|
65
|
+
-> UI bridge (emit facts / write store)
|
|
66
|
+
-> (R3F automatically renders; unless offscreen, do not manually call renderer.render)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Rules:
|
|
70
|
+
|
|
71
|
+
- `useFrame` only orchestrates; it does not write core win/loss/combat rules.
|
|
72
|
+
- A second active `requestAnimationFrame` game loop MUST NOT compete with R3F rendering.
|
|
73
|
+
- Use frame intervals in seconds; clamp sleep/stutter (common scaffold upper bound around `0.05`-`0.1` seconds).
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
// Inside useFrame: delta is already seconds; clamp is still recommended
|
|
77
|
+
const dt = Math.min(state.clock.getDelta(), 0.05);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### `useFrame` Priority (Recommended)
|
|
81
|
+
|
|
82
|
+
R3F: in `useFrame(fn, priority)`, **higher priority runs earlier**; default is `0`; **negative numbers run after the default render**.
|
|
83
|
+
|
|
84
|
+
| priority | Content |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
| `> 0` (such as `1`) | Input sampling -> fixed-step physics -> simulation |
|
|
87
|
+
| `0` (default) | `Object3D` sync, mixer, VFX socket, camera follow |
|
|
88
|
+
| `< 0` | Diagnostic sampling only / hooks that need to read finished frame results (optional) |
|
|
89
|
+
|
|
90
|
+
Do not register multiple competing `useFrame` writers for the same responsibility. Fixed-step physics details are in `engine-physics.md`.
|
|
91
|
+
|
|
92
|
+
## R3F Policy
|
|
93
|
+
|
|
94
|
+
### Loading Boundaries
|
|
95
|
+
|
|
96
|
+
- **Formal game assets** (GLB/texture keys, failure placeholders, manifest): place in `game/assets` + `game/three` loading helpers; triggered once by `GameCanvas` / world root.
|
|
97
|
+
- `useLoader` / `<Suspense>`: only for explicit mount-boundary prototypes or local helpers; **do not** have every entity component separately `useLoader` the same URL without a unified cache/dispose strategy.
|
|
98
|
+
- Business code does not hardcode glTF URLs; it goes through manifest / `config.json`.
|
|
99
|
+
|
|
100
|
+
### `@react-three/drei` Allowlist
|
|
101
|
+
|
|
102
|
+
| Usable (Carefully) | Prohibited as Formal Solution |
|
|
103
|
+
| --- | --- |
|
|
104
|
+
| Development-oriented Helpers, lightweight environment/HDR helpers (toggleable) | Piling formal HUD / menus / settings into `<Html>` |
|
|
105
|
+
| Explicitly needed `OrbitControls` (edit/inspect mode; gameplay mode must be toggleable) | Using drei controls to bypass `game/input` semantic actions |
|
|
106
|
+
| | Replacing `src/ui` with in-Canvas DOM |
|
|
107
|
+
|
|
108
|
+
Formal HUD, virtual joystick, settings panels -> React DOM (`src/ui`).
|
|
109
|
+
|
|
110
|
+
### Other
|
|
111
|
+
|
|
112
|
+
- `game/three/*` **MUST NOT** `import` React / R3F hooks.
|
|
113
|
+
- StrictMode double-mount: subscriptions and WebGL resource creation MUST be idempotent and cleanable.
|
|
114
|
+
|
|
115
|
+
## First Runnable Slice (Engine Minimum)
|
|
116
|
+
|
|
117
|
+
Have these engine-side pieces first, then discuss content density:
|
|
118
|
+
|
|
119
|
+
1. Canvas + scene root + resize / camera aspect (including the gl/dpr defaults above)
|
|
120
|
+
2. Single update path (`useFrame`)
|
|
121
|
+
3. Input -> semantic action -> one simulation step
|
|
122
|
+
4. `Object3D` sync for at least one movable entity
|
|
123
|
+
5. Minimal collision or trigger detection (custom or physics)
|
|
124
|
+
6. Resource and listener cleanup on failure/restart
|
|
125
|
+
7. Diagnostic hooks (see below)
|
|
126
|
+
|
|
127
|
+
Reject: view-only without control; leftover entities/listeners/physics bodies after restart; competing multiple loops.
|
|
128
|
+
|
|
129
|
+
## Lifecycle and dispose
|
|
130
|
+
|
|
131
|
+
StrictMode will double-mount; unmount must be repeatable and idempotent.
|
|
132
|
+
|
|
133
|
+
MUST clean up:
|
|
134
|
+
|
|
135
|
+
- Geometry, materials, textures (including maps attached to materials)
|
|
136
|
+
- `AnimationMixer` and clip actions
|
|
137
|
+
- Physics world / body / collider
|
|
138
|
+
- `gameBus` subscriptions, DOM / window listeners
|
|
139
|
+
- Diagnostics and test hooks (`window.__THREE_GAME_*`)
|
|
140
|
+
- In-game audio loops / short SFX (see `engine-audio.md`)
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
import * as THREE from 'three';
|
|
144
|
+
|
|
145
|
+
export function disposeObject3D(root: THREE.Object3D): void {
|
|
146
|
+
root.traverse((object) => {
|
|
147
|
+
const mesh = object as THREE.Mesh;
|
|
148
|
+
if (mesh.geometry) mesh.geometry.dispose();
|
|
149
|
+
const materials = Array.isArray(mesh.material)
|
|
150
|
+
? mesh.material
|
|
151
|
+
: mesh.material
|
|
152
|
+
? [mesh.material]
|
|
153
|
+
: [];
|
|
154
|
+
for (const material of materials) {
|
|
155
|
+
for (const value of Object.values(material as unknown as Record<string, unknown>)) {
|
|
156
|
+
if (value && typeof value === 'object' && (value as { isTexture?: boolean }).isTexture) {
|
|
157
|
+
(value as THREE.Texture).dispose();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
material.dispose();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Diagnostic Hooks
|
|
167
|
+
|
|
168
|
+
Install when `GameCanvas` mounts and clean up on unmount (types written in `vite-env.d.ts`):
|
|
169
|
+
|
|
170
|
+
- `window.__THREE_GAME_DIAGNOSTICS__`: renderer info, simulation snapshot, input state, entity count, physics body/collider counts (if any), DPR/shadow summary
|
|
171
|
+
- `window.__THREE_GAME_TEST_HOOKS__`: `seed` / `setState` / `setPausedForScreenshot` / `setReducedMotion` / `hideDebugUi`
|
|
172
|
+
|
|
173
|
+
Put deterministic random in `simulation` or `lib/random`; bare `Math.random` is prohibited in business paths.
|
|
174
|
+
|
|
175
|
+
## Engine Failure Triage (Runtime)
|
|
176
|
+
|
|
177
|
+
| Symptom | Check First |
|
|
178
|
+
| --- | --- |
|
|
179
|
+
| Blank screen / empty canvas | Canvas DOM and CSS dimensions; WebGL context; whether there is only one loop; camera near/far/orientation; whether the scene has visible objects and lights; whether overlay covers Canvas; whether resize updates aspect; whether color space/exposure "hides" objects |
|
|
180
|
+
| Enters but cannot move | Whether input produces intent; whether simulation steps; whether `Object3D` syncs from simulation; whether code is in the wrong layer |
|
|
181
|
+
| Slower over time / leak | dispose; whether geometry/material/audio sources are created every frame; whether bus subscriptions stack -> `engine-performance.md` |
|
|
182
|
+
| Restart anomalies | Whether entities, timers, mixers, physics bodies, listeners, and audio are cleaned up on restart paths |
|
|
183
|
+
| Low-frame jitter | delta clamp; whether physics incorrectly uses variable timestep; whether DPR is too high |
|
|
184
|
+
| No sound | Whether AudioContext was not unlocked -> `engine-audio.md` |
|
|
185
|
+
|
|
186
|
+
More detailed asset/audio/performance acceptance checklists are in `../game-test`; this file only retains engine ownership decisions.
|
|
187
|
+
|
|
188
|
+
## Engine Anti-Patterns
|
|
189
|
+
|
|
190
|
+
- Writing rules source of truth in `useFrame` or HUD
|
|
191
|
+
- A second rAF loop + double rendering with R3F; or an extra `new WebGLRenderer`
|
|
192
|
+
- `game/three` imports React
|
|
193
|
+
- Using `<Html>` as a replacement for formal DOM HUD
|
|
194
|
+
- Entity components each use `useLoader` without unified dispose
|
|
195
|
+
- Visual mesh as collider
|
|
196
|
+
- Syncing physics -> visual transforms in multiple places
|
|
197
|
+
- Restart without dispose / listener removal
|
|
198
|
+
- Hardcoded tunable parameters instead of `public/config.json`
|
|
199
|
+
- Business code hardcodes glTF/texture URLs (should go through manifest / config)
|