evomeme 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/dist/canvas-public/app.js +509 -5999
  2. package/dist/canvas-public/assets/presets/catalog.json +47 -0
  3. package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
  4. package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
  5. package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
  6. package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
  7. package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
  8. package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
  9. package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
  10. package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
  11. package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
  12. package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
  13. package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
  14. package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
  15. package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
  16. package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
  17. package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
  18. package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
  19. package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
  20. package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
  21. package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
  22. package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
  23. package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
  24. package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
  25. package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
  26. package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
  27. package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
  28. package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
  29. package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
  30. package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
  31. package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
  32. package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
  33. package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
  34. package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
  35. package/dist/canvas-public/canvas/actions.js +143 -0
  36. package/dist/canvas-public/canvas/camera.js +28 -0
  37. package/dist/canvas-public/canvas/chrome.js +13 -0
  38. package/dist/canvas-public/canvas/data.js +123 -0
  39. package/dist/canvas-public/canvas/dependencies.js +19 -0
  40. package/dist/canvas-public/canvas/interactions.js +544 -0
  41. package/dist/canvas-public/canvas/panel-resize.js +5 -0
  42. package/dist/canvas-public/canvas/renderer.js +297 -0
  43. package/dist/canvas-public/canvas/selection.js +62 -0
  44. package/dist/canvas-public/canvas/serialization.js +118 -0
  45. package/dist/canvas-public/canvas/sync.js +202 -0
  46. package/dist/canvas-public/core/api.js +27 -0
  47. package/dist/canvas-public/core/feature-registry.js +29 -0
  48. package/dist/canvas-public/core/feature-state.js +228 -0
  49. package/dist/canvas-public/core/layout.js +133 -0
  50. package/dist/canvas-public/core/operations.js +38 -0
  51. package/dist/canvas-public/core/project.js +203 -0
  52. package/dist/canvas-public/core/state.js +27 -0
  53. package/dist/canvas-public/dialogs/context-menu.js +118 -0
  54. package/dist/canvas-public/elements/base.js +100 -0
  55. package/dist/canvas-public/elements/connections.js +105 -0
  56. package/dist/canvas-public/elements/drag.js +53 -0
  57. package/dist/canvas-public/elements/image.js +259 -0
  58. package/dist/canvas-public/elements/loading-recovery.js +5 -0
  59. package/dist/canvas-public/elements/loading.js +21 -0
  60. package/dist/canvas-public/elements/map.js +64 -0
  61. package/dist/canvas-public/elements/registry.js +58 -0
  62. package/dist/canvas-public/elements/replacement.js +78 -0
  63. package/dist/canvas-public/elements/resize.js +210 -0
  64. package/dist/canvas-public/elements/task-pipeline.js +234 -0
  65. package/dist/canvas-public/elements/types.js +21 -0
  66. package/dist/canvas-public/elements/ui.js +14 -0
  67. package/dist/canvas-public/elements/video.js +64 -0
  68. package/dist/canvas-public/features/assets/local-assets.js +72 -0
  69. package/dist/canvas-public/features/assets/official-assets.js +538 -0
  70. package/dist/canvas-public/features/editing/canvas-size.js +532 -0
  71. package/dist/canvas-public/features/editing/color-key.js +469 -0
  72. package/dist/canvas-public/features/editing/cutout.js +20 -0
  73. package/dist/canvas-public/features/editing/interactive-image-editing.js +981 -0
  74. package/dist/canvas-public/features/editing/layer-decomposition.js +44 -0
  75. package/dist/canvas-public/features/editing/manual-split.js +114 -0
  76. package/dist/canvas-public/features/editing/perfect-pixel.js +336 -0
  77. package/dist/canvas-public/features/editing/scroll-preview.js +129 -0
  78. package/dist/canvas-public/features/editing/scroll-seam-elimination.js +71 -0
  79. package/dist/canvas-public/features/editing/seam-elimination.js +46 -0
  80. package/dist/canvas-public/features/editing/smart-split.js +48 -0
  81. package/dist/canvas-public/features/editing/source-preview.js +43 -0
  82. package/dist/canvas-public/features/editing/video-cycle.js +49 -0
  83. package/dist/canvas-public/features/editing/video-frames.js +35 -0
  84. package/dist/canvas-public/features/frame-editor/frame-editing.js +755 -0
  85. package/dist/canvas-public/features/frame-editor/frame-model.js +63 -0
  86. package/dist/canvas-public/features/frame-editor/playback.js +83 -0
  87. package/dist/canvas-public/features/frame-editor/preview.js +149 -0
  88. package/dist/canvas-public/features/generation/animation.js +272 -0
  89. package/dist/canvas-public/features/generation/asset-batch.js +102 -0
  90. package/dist/canvas-public/features/generation/direction.js +163 -0
  91. package/dist/canvas-public/features/generation/fields.js +73 -0
  92. package/dist/canvas-public/features/generation/game-ui.js +64 -0
  93. package/dist/canvas-public/features/generation/image.js +83 -0
  94. package/dist/canvas-public/features/generation/scroll-image.js +157 -0
  95. package/dist/canvas-public/features/generation/seamless-tile.js +52 -0
  96. package/dist/canvas-public/features/generation/tile-transition-atlas.js +79 -0
  97. package/dist/canvas-public/features/generation/video.js +105 -0
  98. package/dist/canvas-public/features/map/creation.js +73 -0
  99. package/dist/canvas-public/features/map/tile-map-editor.js +2518 -0
  100. package/dist/canvas-public/features/registry.js +59 -0
  101. package/dist/canvas-public/index.html +84 -259
  102. package/dist/canvas-public/inspector/controls.js +49 -0
  103. package/dist/canvas-public/inspector/frame-preview.js +11 -0
  104. package/dist/canvas-public/inspector/inspector.js +190 -0
  105. package/dist/canvas-public/inspector/media-inspector.js +517 -0
  106. package/dist/canvas-public/inspector/media-preview.js +56 -0
  107. package/dist/canvas-public/inspector/number-stepper.js +96 -0
  108. package/dist/canvas-public/inspector/resize.js +88 -0
  109. package/dist/canvas-public/inspector/scroll-preview.js +11 -0
  110. package/dist/canvas-public/inspector/ui-inspector.js +14 -0
  111. package/dist/canvas-public/language/en-US.js +1059 -0
  112. package/dist/canvas-public/language/index.js +79 -0
  113. package/dist/canvas-public/language/zh-CN.js +1059 -0
  114. package/dist/canvas-public/map/export.js +9 -0
  115. package/dist/canvas-public/map/inspector.js +8 -0
  116. package/dist/canvas-public/map/model.js +409 -0
  117. package/dist/canvas-public/map/tile-map-editor.js +2 -0
  118. package/dist/canvas-public/media/metadata.js +183 -0
  119. package/dist/canvas-public/media/support.js +183 -0
  120. package/dist/canvas-public/styles/base.css +49 -0
  121. package/dist/canvas-public/styles/canvas.css +127 -0
  122. package/dist/canvas-public/styles/controls.css +203 -0
  123. package/dist/canvas-public/styles/dialogs.css +521 -0
  124. package/dist/canvas-public/styles/feature-form.css +409 -0
  125. package/dist/canvas-public/styles/inspector.css +441 -0
  126. package/dist/canvas-public/styles/layout.css +344 -0
  127. package/dist/canvas-public/styles/map.css +11 -0
  128. package/dist/canvas-public/styles/nodes.css +636 -0
  129. package/dist/canvas-public/styles.css +9 -2247
  130. package/dist/canvas-public/ui/controls.js +222 -0
  131. package/dist/canvas-public/ui/elements.js +9 -0
  132. package/dist/canvas-public/ui/feature-controller.js +296 -0
  133. package/dist/canvas-public/ui/feature-form.js +401 -0
  134. package/dist/canvas-public/ui/settings.js +83 -0
  135. package/dist/canvas-public/ui/toolbar.js +55 -0
  136. package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
  137. package/dist/canvas-public/vendor/pixi.min.js +2340 -0
  138. package/dist/canvas-public/workers/color-key-worker.js +289 -0
  139. package/dist/canvas-public/workers/perfect-pixel-worker.js +510 -0
  140. package/dist/index.js +42236 -13382
  141. package/dist/skills/en-US/evomeme-canvas/SKILL.md +52 -0
  142. package/dist/skills/en-US/evomeme-canvas/agents/openai.yaml +7 -0
  143. package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +176 -0
  144. package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
  145. package/dist/skills/en-US/evomeme-cover/SKILL.md +132 -0
  146. package/dist/skills/en-US/evomeme-cover/agents/openai.yaml +7 -0
  147. package/dist/skills/en-US/evomeme-game-maker/SKILL.md +288 -0
  148. package/dist/skills/en-US/evomeme-game-maker/agents/openai.yaml +4 -0
  149. package/dist/skills/en-US/evomeme-login/SKILL.md +92 -0
  150. package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
  151. package/dist/skills/en-US/evomeme-native-bridge-sdk/SKILL.md +286 -0
  152. package/dist/skills/en-US/evomeme-native-bridge-sdk/agents/openai.yaml +8 -0
  153. package/dist/skills/en-US/evomeme-tos-upload/SKILL.md +47 -0
  154. package/dist/skills/en-US/evomeme-tos-upload/agents/openai.yaml +5 -0
  155. package/dist/skills/en-US/evomeme-ui/SKILL.md +123 -0
  156. package/dist/skills/en-US/evomeme-ui/agents/openai.yaml +4 -0
  157. package/dist/skills/en-US/evomeme-ui/references/host-layout.md +69 -0
  158. package/dist/skills/en-US/game-art/SKILL.md +121 -0
  159. package/dist/skills/en-US/game-art/agents/openai.yaml +8 -0
  160. package/dist/skills/en-US/game-asset-align/SKILL.md +45 -0
  161. package/dist/skills/en-US/game-asset-align/agents/openai.yaml +8 -0
  162. package/dist/skills/en-US/game-asset-align/references/alignment-contract.md +61 -0
  163. package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +45 -0
  164. package/dist/skills/en-US/game-asset-align/references/canonical-package.md +26 -0
  165. package/dist/skills/en-US/game-asset-align/references/engine-capabilities.md +14 -0
  166. package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +32 -0
  167. package/dist/skills/en-US/game-asset-align/references/repair-policy.md +30 -0
  168. package/dist/skills/en-US/game-asset-align/references/tool-contract.md +39 -0
  169. package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
  170. package/dist/skills/en-US/game-asset-image-generator/SKILL.md +104 -0
  171. package/dist/skills/en-US/game-asset-image-generator/agents/openai.yaml +7 -0
  172. package/dist/skills/en-US/game-asset-image-generator/references/background.md +32 -0
  173. package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
  174. package/dist/skills/en-US/game-audio/SKILL.md +82 -0
  175. package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
  176. package/dist/skills/en-US/game-demo/SKILL.md +103 -0
  177. package/dist/skills/en-US/game-demo/agents/openai.yaml +7 -0
  178. package/dist/skills/en-US/game-maker/SKILL.md +111 -0
  179. package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -0
  180. package/dist/skills/en-US/game-test/SKILL.md +58 -0
  181. package/dist/skills/en-US/game-test/agents/openai.yaml +7 -0
  182. package/dist/skills/en-US/game-ui/SKILL.md +177 -0
  183. package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
  184. package/dist/skills/en-US/godot-3d-game/SKILL.md +39 -0
  185. package/dist/skills/en-US/godot-3d-game/agents/openai.yaml +8 -0
  186. package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +26 -0
  187. package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +52 -0
  188. package/dist/skills/en-US/godot-3d-game/references/build-and-qa.md +22 -0
  189. package/dist/skills/en-US/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  190. package/dist/skills/en-US/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  191. package/dist/skills/en-US/godot-3d-game/references/physics-colliders.md +13 -0
  192. package/dist/skills/en-US/godot-3d-game/references/project-structure.md +22 -0
  193. package/dist/skills/en-US/godot-3d-game/references/skeleton-animation.md +16 -0
  194. package/dist/skills/en-US/phaser-2d-game/SKILL.md +127 -0
  195. package/dist/skills/en-US/phaser-2d-game/agents/openai.yaml +8 -0
  196. package/dist/skills/en-US/phaser-2d-game/references/engine-performance.md +64 -0
  197. package/dist/skills/en-US/phaser-2d-game/references/engine-physics.md +139 -0
  198. package/dist/skills/en-US/phaser-2d-game/references/engine-runtime.md +129 -0
  199. package/dist/skills/en-US/phaser-2d-game/references/engine-spritesheets.md +99 -0
  200. package/dist/skills/en-US/phaser-2d-game/references/engine-tilemaps.md +80 -0
  201. package/dist/skills/en-US/phaser-2d-game/references/file-structure.md +94 -0
  202. package/dist/skills/en-US/phaser-2d-graphics-builder/SKILL.md +68 -0
  203. package/dist/skills/en-US/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
  204. package/dist/skills/en-US/threejs-3d-game/SKILL.md +117 -0
  205. package/dist/skills/en-US/threejs-3d-game/agents/openai.yaml +7 -0
  206. package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +153 -0
  207. package/dist/skills/en-US/threejs-3d-game/references/engine-audio.md +70 -0
  208. package/dist/skills/en-US/threejs-3d-game/references/engine-input-camera.md +84 -0
  209. package/dist/skills/en-US/threejs-3d-game/references/engine-performance.md +96 -0
  210. package/dist/skills/en-US/threejs-3d-game/references/engine-physics.md +142 -0
  211. package/dist/skills/en-US/threejs-3d-game/references/engine-runtime.md +199 -0
  212. package/dist/skills/en-US/threejs-3d-game/references/file-structure.md +353 -0
  213. package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +62 -0
  214. package/dist/skills/en-US/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
  215. package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/SKILL.md +4 -4
  216. package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +1 -1
  217. package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
  218. package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/SKILL.md +6 -5
  219. package/dist/skills/zh-CN/evomeme-ui/SKILL.md +123 -0
  220. package/dist/skills/zh-CN/evomeme-ui/agents/openai.yaml +4 -0
  221. package/dist/skills/zh-CN/evomeme-ui/references/host-layout.md +69 -0
  222. package/dist/skills/zh-CN/game-asset-align/SKILL.md +45 -0
  223. package/dist/skills/zh-CN/game-asset-align/agents/openai.yaml +8 -0
  224. package/dist/skills/zh-CN/game-asset-align/references/alignment-contract.md +61 -0
  225. package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +45 -0
  226. package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +26 -0
  227. package/dist/skills/zh-CN/game-asset-align/references/engine-capabilities.md +14 -0
  228. package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +32 -0
  229. package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +30 -0
  230. package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +39 -0
  231. package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
  232. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/SKILL.md +1 -1
  233. package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +127 -0
  234. package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +77 -0
  235. package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
  236. package/{skills → dist/skills/zh-CN}/game-ui/SKILL.md +9 -1
  237. package/dist/skills/zh-CN/game-ui/references/checklists/game-ui-quality.md +14 -0
  238. package/dist/skills/zh-CN/game-ui/references/checklists/hud-readability.md +12 -0
  239. package/dist/skills/zh-CN/game-ui/references/checklists/mobile-input.md +12 -0
  240. package/dist/skills/zh-CN/game-ui/references/checklists/responsive-ui-fit.md +12 -0
  241. package/dist/skills/zh-CN/game-ui/references/ui-patterns.md +140 -0
  242. package/dist/skills/zh-CN/game-ui/references/ui-prompt-templates.md +63 -0
  243. package/dist/skills/zh-CN/godot-3d-game/SKILL.md +39 -0
  244. package/dist/skills/zh-CN/godot-3d-game/agents/openai.yaml +8 -0
  245. package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +26 -0
  246. package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +52 -0
  247. package/dist/skills/zh-CN/godot-3d-game/references/build-and-qa.md +22 -0
  248. package/dist/skills/zh-CN/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  249. package/dist/skills/zh-CN/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  250. package/dist/skills/zh-CN/godot-3d-game/references/physics-colliders.md +13 -0
  251. package/dist/skills/zh-CN/godot-3d-game/references/project-structure.md +22 -0
  252. package/dist/skills/zh-CN/godot-3d-game/references/skeleton-animation.md +16 -0
  253. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  254. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  255. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  256. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
  257. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
  258. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
  259. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
  260. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
  261. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
  262. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
  263. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
  264. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
  265. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
  266. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/technical-art.md +67 -0
  267. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
  268. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
  269. package/{skills → dist/skills/zh-CN}/threejs-3d-game/SKILL.md +6 -2
  270. package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-asset-pipeline.md +52 -15
  271. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  272. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  273. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  274. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
  275. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
  276. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
  277. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
  278. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
  279. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
  280. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
  281. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
  282. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
  283. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
  284. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
  285. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
  286. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
  287. package/dist/stage-blender/bake_materials.py +102 -0
  288. package/dist/stage-blender/export_scene.py +275 -0
  289. package/dist/stage-blender/preview_camera.py +90 -0
  290. package/dist/stage-blender/repair_mesh.py +112 -0
  291. package/dist/stage-public/app.js +759 -0
  292. package/dist/stage-public/baked/bakePilot.js +44 -0
  293. package/dist/stage-public/baked/bakedScene.js +129 -0
  294. package/dist/stage-public/baked/sceneAppearance.js +225 -0
  295. package/dist/stage-public/baked/sceneCamera.js +45 -0
  296. package/dist/stage-public/comparison-contract.js +28 -0
  297. package/dist/stage-public/delivery.html +4 -0
  298. package/dist/stage-public/delivery.js +17 -0
  299. package/dist/stage-public/godot/appearance.gd +170 -0
  300. package/dist/stage-public/godot/preview.gd +79 -0
  301. package/dist/stage-public/index.html +141 -0
  302. package/dist/stage-public/review-app.js +289 -0
  303. package/dist/stage-public/review-runtime.js +63 -0
  304. package/dist/stage-public/review.css +24 -0
  305. package/dist/stage-public/review.html +47 -0
  306. package/dist/stage-public/scene-runtime.js +212 -0
  307. package/dist/stage-public/sceneContractRuntime.js +235 -0
  308. package/dist/stage-public/styles.css +328 -0
  309. package/dist/stage-public/three-appearance.js +104 -0
  310. package/dist/stage-public/vendor/three170/LICENSE +21 -0
  311. package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
  312. package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
  313. package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
  314. package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
  315. package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
  316. package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
  317. package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  318. package/dist/tile-transition-mask.svg +40 -0
  319. package/package.json +21 -7
  320. package/dist/canvas-public/cycle-detect.js +0 -166
  321. package/dist/canvas-public/smart-split.js +0 -185
  322. /package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +0 -0
  323. /package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +0 -0
  324. /package/{skills → dist/skills/en-US}/game-test/references/checklists/playtest-qa.md +0 -0
  325. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/game-ui-quality.md +0 -0
  326. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/hud-readability.md +0 -0
  327. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/mobile-input.md +0 -0
  328. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/responsive-ui-fit.md +0 -0
  329. /package/{skills → dist/skills/en-US}/game-ui/references/ui-patterns.md +0 -0
  330. /package/{skills → dist/skills/en-US}/game-ui/references/ui-prompt-templates.md +0 -0
  331. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  332. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  333. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  334. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/compose-quality.md +0 -0
  335. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  336. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +0 -0
  337. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +0 -0
  338. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  339. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +0 -0
  340. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md +0 -0
  341. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +0 -0
  342. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/implementation-blueprint.md +0 -0
  343. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md +0 -0
  344. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md +0 -0
  345. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/vfx-recipes.md +0 -0
  346. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md +0 -0
  347. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  348. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  349. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  350. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +0 -0
  351. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +0 -0
  352. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +0 -0
  353. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  354. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +0 -0
  355. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  356. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +0 -0
  357. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/implementation-blueprint.md +0 -0
  358. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md +0 -0
  359. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md +0 -0
  360. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md +0 -0
  361. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md +0 -0
  362. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md +0 -0
  363. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/SKILL.md +0 -0
  364. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/agents/openai.yaml +0 -0
  365. /package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/agents/openai.yaml +0 -0
  366. /package/{skills → dist/skills/zh-CN}/evomeme-cover/agents/openai.yaml +0 -0
  367. /package/{skills → dist/skills/zh-CN}/evomeme-game-maker/agents/openai.yaml +0 -0
  368. /package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +0 -0
  369. /package/{skills → dist/skills/zh-CN}/evomeme-login/agents/openai.yaml +0 -0
  370. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/SKILL.md +0 -0
  371. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/agents/openai.yaml +0 -0
  372. /package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/agents/openai.yaml +0 -0
  373. /package/{skills → dist/skills/zh-CN}/game-art/SKILL.md +0 -0
  374. /package/{skills → dist/skills/zh-CN}/game-art/agents/openai.yaml +0 -0
  375. /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/agents/openai.yaml +0 -0
  376. /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +0 -0
  377. /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +0 -0
  378. /package/{skills → dist/skills/zh-CN}/game-audio/SKILL.md +0 -0
  379. /package/{skills → dist/skills/zh-CN}/game-audio/agents/openai.yaml +0 -0
  380. /package/{skills → dist/skills/zh-CN}/game-demo/SKILL.md +0 -0
  381. /package/{skills → dist/skills/zh-CN}/game-demo/agents/openai.yaml +0 -0
  382. /package/{skills → dist/skills/zh-CN}/game-maker/SKILL.md +0 -0
  383. /package/{skills → dist/skills/zh-CN}/game-maker/agents/openai.yaml +0 -0
  384. /package/{skills → dist/skills/zh-CN}/game-test/SKILL.md +0 -0
  385. /package/{skills → dist/skills/zh-CN}/game-test/agents/openai.yaml +0 -0
  386. /package/{skills → dist/skills/zh-CN}/game-ui/agents/openai.yaml +0 -0
  387. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/SKILL.md +0 -0
  388. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/agents/openai.yaml +0 -0
  389. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-performance.md +0 -0
  390. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-physics.md +0 -0
  391. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-runtime.md +0 -0
  392. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-spritesheets.md +0 -0
  393. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-tilemaps.md +0 -0
  394. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/file-structure.md +0 -0
  395. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/SKILL.md +0 -0
  396. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/agents/openai.yaml +0 -0
  397. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/agents/openai.yaml +0 -0
  398. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-audio.md +0 -0
  399. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-input-camera.md +0 -0
  400. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-performance.md +0 -0
  401. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-physics.md +0 -0
  402. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-runtime.md +0 -0
  403. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/file-structure.md +0 -0
  404. /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +0 -0
  405. /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
@@ -0,0 +1,40 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 8 8" shape-rendering="geometricPrecision">
3
+ <title>Two-terrain 4x4 transition mask</title>
4
+ <desc>White is terrain 0 and black is terrain 1. Every 2x2 logical region forms one tile. Rounded transitions begin halfway through a logical half-tile and use an exact quarter-circle with radius 0.5.</desc>
5
+ <defs>
6
+ <mask id="terrain-one" maskUnits="userSpaceOnUse" x="0" y="0" width="8" height="8">
7
+ <rect width="8" height="8" fill="black"/>
8
+ <!-- 00011000 / 10011111 / 10011111 / 01111110 / 01111110 / 00000110 / 00000110 / 00011000 -->
9
+ <g fill="white">
10
+ <rect x="3" y="0" width="2" height="1"/><rect x="0" y="1" width="1" height="1"/>
11
+ <rect x="3" y="1" width="5" height="1"/><rect x="0" y="2" width="1" height="1"/>
12
+ <rect x="3" y="2" width="5" height="1"/><rect x="1" y="3" width="6" height="1"/>
13
+ <rect x="1" y="4" width="6" height="1"/><rect x="5" y="5" width="2" height="1"/>
14
+ <rect x="5" y="6" width="2" height="1"/><rect x="3" y="7" width="2" height="1"/>
15
+ </g>
16
+ <g fill="black">
17
+ <rect x="0.5" y="1" width="0.5" height="0.5"/><rect x="0.5" y="2.5" width="0.5" height="0.5"/>
18
+ <rect x="1" y="3" width="0.5" height="0.5"/><rect x="1" y="4.5" width="0.5" height="0.5"/>
19
+ <rect x="3" y="7" width="0.5" height="0.5"/><rect x="5" y="6.5" width="0.5" height="0.5"/>
20
+ <rect x="4.5" y="7" width="0.5" height="0.5"/><rect x="6.5" y="6.5" width="0.5" height="0.5"/>
21
+ </g>
22
+ <g fill="white">
23
+ <circle cx="0.5" cy="1.5" r="0.5"/><circle cx="0.5" cy="2.5" r="0.5"/>
24
+ <circle cx="1.5" cy="3.5" r="0.5"/><circle cx="1.5" cy="4.5" r="0.5"/>
25
+ <circle cx="3.5" cy="7.5" r="0.5"/><circle cx="5.5" cy="6.5" r="0.5"/>
26
+ <circle cx="4.5" cy="7.5" r="0.5"/><circle cx="6.5" cy="6.5" r="0.5"/>
27
+ </g>
28
+ <g fill="white">
29
+ <rect x="5" y="0.5" width="0.5" height="0.5"/><rect x="2.5" y="2.5" width="0.5" height="0.5"/>
30
+ <rect x="7" y="3" width="0.5" height="0.5"/><rect x="4.5" y="5" width="0.5" height="0.5"/>
31
+ </g>
32
+ <g fill="black">
33
+ <circle cx="5.5" cy="0.5" r="0.5"/><circle cx="2.5" cy="2.5" r="0.5"/>
34
+ <circle cx="7.5" cy="3.5" r="0.5"/><circle cx="4.5" cy="5.5" r="0.5"/>
35
+ </g>
36
+ </mask>
37
+ </defs>
38
+ <rect width="8" height="8" fill="white"/>
39
+ <rect width="8" height="8" fill="black" mask="url(#terrain-one)"/>
40
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evomeme",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "description": "evomemeplugin_client - local stdio MCP server. Install: npx -y evomeme@latest install --ide cursor. Init: npx -y evomeme@latest init.",
6
6
  "main": "dist/index.js",
@@ -9,9 +9,12 @@
9
9
  },
10
10
  "files": [
11
11
  "dist/index.js",
12
+ "dist/tile-transition-mask.svg",
12
13
  "dist/canvas-public",
14
+ "dist/stage-public",
15
+ "dist/stage-blender",
13
16
  "bin/evomeme",
14
- "skills"
17
+ "dist/skills"
15
18
  ],
16
19
  "engines": {
17
20
  "node": ">=18.14.1"
@@ -20,21 +23,27 @@
20
23
  "version:sync": "node scripts/sync-version.mjs",
21
24
  "prepare:prod": "node scripts/prepare-channel.mjs --channel prod",
22
25
  "prepare:dev": "node scripts/prepare-channel.mjs --channel dev",
26
+ "skills:render": "node scripts/render-skills.mjs",
27
+ "skills:validate": "npm run skills:render && node scripts/validate-skills.mjs --skills-dir dist/skills",
23
28
  "prebuild": "npm run version:sync",
24
29
  "build": "node scripts/bundle.mjs",
25
30
  "start": "node bin/evomeme",
26
31
  "dev": "tsx src/index.ts",
27
32
  "canvas:dev": "tsx watch src/index.ts canvas --no-open",
33
+ "stage:dev": "tsx watch src/index.ts stage --no-open",
28
34
  "mcp:list": "node scripts/call-mcp.mjs --list",
29
35
  "mcp:call": "node scripts/call-mcp.mjs",
30
36
  "mcp:image:demo": "node scripts/call-mcp.mjs --demo-image",
31
37
  "typecheck": "tsc -p tsconfig.json --noEmit",
32
38
  "test": "jest",
33
- "prepublishOnly": "npm run build",
34
- "pack:local": "npm run prepare:prod && npm run build && npm pack",
35
- "pack:dev": "npm run prepare:dev && npm run build && npm pack && npm run prepare:prod",
36
- "publish:prod": "npm run prepare:prod && npm run build && npm publish --access public && npm run prepare:prod",
37
- "publish:dev": "npm run prepare:dev && npm run build && npm publish --access public && npm run prepare:prod"
39
+ "test:publish": "node --test __tests__/scripts/renderSkills.test.mjs",
40
+ "test:canvas": "jest --runInBand __tests__/canvas",
41
+ "test:canvas:browser": "node scripts/canvas-feature-smoke.mjs",
42
+ "prepack": "npm run build",
43
+ "pack:local": "npm run prepare:prod && npm pack",
44
+ "pack:dev": "npm run prepare:dev && npm pack && npm run prepare:prod",
45
+ "publish:prod": "npm run prepare:prod && npm publish --access public && npm run prepare:prod",
46
+ "publish:dev": "npm run prepare:dev && npm publish --access public && npm run prepare:prod"
38
47
  },
39
48
  "publishConfig": {
40
49
  "access": "public"
@@ -51,6 +60,9 @@
51
60
  "@ffmpeg-installer/ffmpeg": "^1.1.0",
52
61
  "@ffprobe-installer/ffprobe": "^2.1.2",
53
62
  "@modelcontextprotocol/sdk": "^1.27.1",
63
+ "@pixi/tilemap": "^5.0.2",
64
+ "gltf-validator": "2.0.0-dev.3.10",
65
+ "pixi.js": "^8.20.1",
54
66
  "semver": "^7.8.5",
55
67
  "update-notifier": "^7.3.1"
56
68
  },
@@ -61,7 +73,9 @@
61
73
  "@types/update-notifier": "^6.0.8",
62
74
  "esbuild": "^0.27.0",
63
75
  "jest": "^29.7.0",
76
+ "jsdom": "26.1.0",
64
77
  "painterro": "^1.2.92",
78
+ "playwright": "1.63.0",
65
79
  "ts-jest": "^29.2.5",
66
80
  "tsx": "^4.20.6",
67
81
  "typescript": "^5.6.3"
@@ -1,166 +0,0 @@
1
- /**
2
- * 浏览器端:缩略灰度 + z-score + 点积,从前向后找最早高相似帧。
3
- */
4
-
5
- function zscoreInPlace(vec) {
6
- let sum = 0
7
- for (let i = 0; i < vec.length; i++) sum += vec[i]
8
- const mean = sum / vec.length
9
- let varSum = 0
10
- for (let i = 0; i < vec.length; i++) {
11
- const d = vec[i] - mean
12
- varSum += d * d
13
- }
14
- const std = Math.sqrt(varSum / vec.length) + 1e-8
15
- for (let i = 0; i < vec.length; i++) vec[i] = (vec[i] - mean) / std
16
- return vec
17
- }
18
-
19
- function featureFromImageData(imageData) {
20
- const { data, width, height } = imageData
21
- const n = width * height
22
- const vec = new Float32Array(n)
23
- for (let i = 0, p = 0; i < n; i++, p += 4) {
24
- // ITU-R BT.601 亮度
25
- vec[i] = data[p] * 0.299 + data[p + 1] * 0.587 + data[p + 2] * 0.114
26
- }
27
- return zscoreInPlace(vec)
28
- }
29
-
30
- function nccScore(a, b) {
31
- const n = Math.min(a.length, b.length)
32
- if (!n) return 0
33
- let sum = 0
34
- for (let i = 0; i < n; i++) sum += a[i] * b[i]
35
- return sum / n
36
- }
37
-
38
- function waitEvent(target, event, { signal } = {}) {
39
- return new Promise((resolve, reject) => {
40
- if (signal?.aborted) {
41
- reject(new DOMException('Aborted', 'AbortError'))
42
- return
43
- }
44
- const onAbort = () => {
45
- cleanup()
46
- reject(new DOMException('Aborted', 'AbortError'))
47
- }
48
- const onOk = () => {
49
- cleanup()
50
- resolve()
51
- }
52
- const cleanup = () => {
53
- target.removeEventListener(event, onOk)
54
- signal?.removeEventListener('abort', onAbort)
55
- }
56
- target.addEventListener(event, onOk, { once: true })
57
- signal?.addEventListener('abort', onAbort, { once: true })
58
- })
59
- }
60
-
61
- async function seekVideo(video, time, signal) {
62
- const duration = Number(video.duration)
63
- const maxT = Number.isFinite(duration) && duration > 0 ? Math.max(0, duration - 1e-4) : time
64
- const t = Math.min(Math.max(0, time), maxT)
65
- if (Math.abs((video.currentTime || 0) - t) < 1e-4) return
66
- const p = waitEvent(video, 'seeked', { signal })
67
- video.currentTime = t
68
- await p
69
- }
70
-
71
- function drawFeature(video, canvas, ctx, thumbWidth) {
72
- const vw = video.videoWidth || 1
73
- const vh = video.videoHeight || 1
74
- const w = Math.max(8, Math.round(thumbWidth))
75
- const h = Math.max(8, Math.round((vh / vw) * w))
76
- if (canvas.width !== w) canvas.width = w
77
- if (canvas.height !== h) canvas.height = h
78
- ctx.drawImage(video, 0, 0, w, h)
79
- return featureFromImageData(ctx.getImageData(0, 0, w, h))
80
- }
81
-
82
- /**
83
- * @param {string} videoUrl
84
- * @param {{
85
- * threshold?: number,
86
- * minGapSec?: number,
87
- * thumbWidth?: number,
88
- * onProgress?: (info: object) => void,
89
- * signal?: AbortSignal,
90
- * }} [options]
91
- * @returns {Promise<{ start: number, end: number, score: number, fps: number, scanned: number }>}
92
- */
93
- export async function detectFirstCycle(videoUrl, options = {}) {
94
- const threshold = Math.min(0.999, Math.max(0.5, Number(options.threshold) || 0.98))
95
- const minGapSec = Math.max(0.05, Number(options.minGapSec) || 0.4)
96
- const thumbWidth = Math.max(16, Math.round(Number(options.thumbWidth) || 96))
97
- const onProgress = typeof options.onProgress === 'function' ? options.onProgress : null
98
- const signal = options.signal
99
-
100
- const video = document.createElement('video')
101
- video.muted = true
102
- video.playsInline = true
103
- video.preload = 'auto'
104
- video.crossOrigin = 'anonymous'
105
-
106
- const canvas = document.createElement('canvas')
107
- const ctx = canvas.getContext('2d', { willReadFrequently: true })
108
- if (!ctx) throw new Error('无法创建 canvas')
109
-
110
- try {
111
- const loaded = waitEvent(video, 'loadedmetadata', { signal })
112
- video.src = videoUrl
113
- video.load()
114
- await loaded
115
- if (!video.videoWidth || !Number.isFinite(video.duration) || video.duration <= 0) {
116
- throw new Error('无法读取视频元数据')
117
- }
118
-
119
- const duration = video.duration
120
- const step = 1 / 24
121
- const minT = Math.min(duration - step, minGapSec)
122
- if (!(minT > step)) {
123
- throw new Error('视频太短,无法提取周期')
124
- }
125
-
126
- await seekVideo(video, 0, signal)
127
- // 部分浏览器 seek(0) 后需一帧稳定
128
- await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r)))
129
- const ref = drawFeature(video, canvas, ctx, thumbWidth)
130
-
131
- let scanned = 0
132
- for (let t = minT; t < duration - 1e-4; t += step) {
133
- if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')
134
- await seekVideo(video, t, signal)
135
- const feat = drawFeature(video, canvas, ctx, thumbWidth)
136
- const score = nccScore(ref, feat)
137
- scanned += 1
138
- onProgress?.({
139
- time: t,
140
- score,
141
- scanned,
142
- duration,
143
- threshold,
144
- })
145
- if (score >= threshold) {
146
- return {
147
- start: 0,
148
- end: Math.min(t, duration),
149
- score,
150
- fps: 24,
151
- scanned,
152
- threshold,
153
- minGapSec,
154
- }
155
- }
156
- }
157
-
158
- throw new Error(
159
- `未找到相似度 ≥ ${(threshold * 100).toFixed(0)}% 的周期终点(已扫 ${scanned} 帧,最短间隔 ${minGapSec}s)`,
160
- )
161
- } finally {
162
- video.pause()
163
- video.removeAttribute('src')
164
- video.load()
165
- }
166
- }
@@ -1,185 +0,0 @@
1
- /**
2
- * 智能切分:从一张含多主体的图中提取连通区域,按阅读顺序返回裁切 dataURL。
3
- * 纯浏览器 Canvas,无外部依赖。
4
- */
5
-
6
- function isForeground(r, g, b, a, bg) {
7
- if (a < 24) return false
8
- // 相对背景色差够大才算前景(兼容白底 / 棋盘格近似色)
9
- const dr = r - bg.r
10
- const dg = g - bg.g
11
- const db = b - bg.b
12
- const dist = Math.sqrt(dr * dr + dg * dg + db * db)
13
- return dist > 28 || a < 250 && a > 24
14
- }
15
-
16
- function sampleBackground(data, w, h) {
17
- // 取四角均值作为背景估计
18
- const pts = [
19
- [0, 0],
20
- [w - 1, 0],
21
- [0, h - 1],
22
- [w - 1, h - 1],
23
- [Math.floor(w / 2), 0],
24
- [0, Math.floor(h / 2)],
25
- ]
26
- let r = 0
27
- let g = 0
28
- let b = 0
29
- let n = 0
30
- for (const [x, y] of pts) {
31
- const i = (y * w + x) * 4
32
- r += data[i]
33
- g += data[i + 1]
34
- b += data[i + 2]
35
- n += 1
36
- }
37
- return { r: r / n, g: g / n, b: b / n }
38
- }
39
-
40
- function loadImageElement(url) {
41
- return new Promise((resolve, reject) => {
42
- const img = new Image()
43
- img.crossOrigin = 'anonymous'
44
- img.onload = () => resolve(img)
45
- img.onerror = () => reject(new Error('图片加载失败'))
46
- img.src = url
47
- })
48
- }
49
-
50
- /**
51
- * @param {string} imageUrl
52
- * @returns {Promise<string[]>} PNG dataURL 列表(至少 2 张才有意义;找不到则空数组)
53
- */
54
- export async function smartSplitImage(imageUrl) {
55
- const img = await loadImageElement(imageUrl)
56
- const maxSide = 1600
57
- const scale = Math.min(1, maxSide / Math.max(img.naturalWidth, img.naturalHeight))
58
- const w = Math.max(1, Math.round(img.naturalWidth * scale))
59
- const h = Math.max(1, Math.round(img.naturalHeight * scale))
60
-
61
- const canvas = document.createElement('canvas')
62
- canvas.width = w
63
- canvas.height = h
64
- const ctx = canvas.getContext('2d', { willReadFrequently: true })
65
- ctx.drawImage(img, 0, 0, w, h)
66
- const { data } = ctx.getImageData(0, 0, w, h)
67
- const bg = sampleBackground(data, w, h)
68
-
69
- const visited = new Uint8Array(w * h)
70
- const boxes = []
71
- const minArea = Math.max(64, Math.floor((w * h) / 800))
72
- const queue = new Int32Array(w * h)
73
-
74
- for (let y = 0; y < h; y += 1) {
75
- for (let x = 0; x < w; x += 1) {
76
- const start = y * w + x
77
- if (visited[start]) continue
78
- const i0 = start * 4
79
- if (!isForeground(data[i0], data[i0 + 1], data[i0 + 2], data[i0 + 3], bg)) {
80
- visited[start] = 1
81
- continue
82
- }
83
-
84
- let qh = 0
85
- let qt = 0
86
- queue[qt++] = start
87
- visited[start] = 1
88
- let minX = x
89
- let maxX = x
90
- let minY = y
91
- let maxY = y
92
- let area = 0
93
-
94
- while (qh < qt) {
95
- const p = queue[qh++]
96
- const px = p % w
97
- const py = (p / w) | 0
98
- area += 1
99
- if (px < minX) minX = px
100
- if (px > maxX) maxX = px
101
- if (py < minY) minY = py
102
- if (py > maxY) maxY = py
103
-
104
- const neighbors = [p - 1, p + 1, p - w, p + w]
105
- for (const n of neighbors) {
106
- if (n < 0 || n >= w * h) continue
107
- if (visited[n]) continue
108
- const nx = n % w
109
- const ny = (n / w) | 0
110
- // 防跨行左右邻居
111
- if (Math.abs(nx - px) + Math.abs(ny - py) !== 1) continue
112
- const ni = n * 4
113
- if (!isForeground(data[ni], data[ni + 1], data[ni + 2], data[ni + 3], bg)) {
114
- visited[n] = 1
115
- continue
116
- }
117
- visited[n] = 1
118
- queue[qt++] = n
119
- }
120
- }
121
-
122
- const bw = maxX - minX + 1
123
- const bh = maxY - minY + 1
124
- if (area >= minArea && bw >= 8 && bh >= 8) {
125
- // 过滤几乎铺满整图的单一大块(切不出多图)
126
- if (bw * bh < w * h * 0.92) {
127
- boxes.push({ minX, minY, maxX, maxY, area })
128
- }
129
- }
130
- }
131
- }
132
-
133
- if (boxes.length < 2) return []
134
-
135
- // 阅读顺序:先上后下,同行按左到右
136
- const rowTol = Math.max(12, Math.floor(h * 0.03))
137
- boxes.sort((a, b) => {
138
- if (Math.abs(a.minY - b.minY) > rowTol) return a.minY - b.minY
139
- return a.minX - b.minX
140
- })
141
-
142
- // 原图尺寸裁切(更高清),并统一到完全相同的画布尺寸,保证序列播放不抖动
143
- const inv = 1 / scale
144
- const crops = []
145
- for (const box of boxes) {
146
- const sx = Math.max(0, Math.floor(box.minX * inv))
147
- const sy = Math.max(0, Math.floor(box.minY * inv))
148
- const sw = Math.min(img.naturalWidth - sx, Math.ceil((box.maxX - box.minX + 1) * inv))
149
- const sh = Math.min(img.naturalHeight - sy, Math.ceil((box.maxY - box.minY + 1) * inv))
150
- if (sw < 4 || sh < 4) continue
151
- crops.push({ sx, sy, sw, sh })
152
- }
153
- if (crops.length < 2) return []
154
-
155
- // 统一尺寸:先按最高补上方白边,再按最宽左右均匀补白边
156
- const frameW = Math.max(...crops.map((c) => c.sw))
157
- const frameH = Math.max(...crops.map((c) => c.sh))
158
- const full = document.createElement('canvas')
159
- full.width = frameW
160
- full.height = frameH
161
- const fctx = full.getContext('2d')
162
-
163
- const out = []
164
- for (const crop of crops) {
165
- fctx.fillStyle = '#ffffff'
166
- fctx.fillRect(0, 0, frameW, frameH)
167
- const padTop = frameH - crop.sh
168
- const padX = frameW - crop.sw
169
- const dx = Math.floor(padX / 2)
170
- const dy = padTop
171
- fctx.drawImage(
172
- img,
173
- crop.sx,
174
- crop.sy,
175
- crop.sw,
176
- crop.sh,
177
- dx,
178
- dy,
179
- crop.sw,
180
- crop.sh,
181
- )
182
- out.push(full.toDataURL('image/png'))
183
- }
184
- return out
185
- }
File without changes