evomeme 0.1.7 → 0.1.9-beta.14

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 (106) hide show
  1. package/dist/canvas-public/app.js +8517 -1692
  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/color-key-worker.js +280 -0
  36. package/dist/canvas-public/image-canvas-size-editor.js +254 -0
  37. package/dist/canvas-public/index.html +226 -119
  38. package/dist/canvas-public/perfect-pixel-worker.js +499 -0
  39. package/dist/canvas-public/smart-split.js +1 -1
  40. package/dist/canvas-public/styles.css +3902 -1225
  41. package/dist/canvas-public/tile-map-editor.js +2120 -0
  42. package/dist/canvas-public/ui-controls.js +95 -0
  43. package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
  44. package/dist/canvas-public/vendor/pixi.min.js +2340 -0
  45. package/dist/index.js +32263 -4187
  46. package/dist/stage-blender/bake_materials.py +102 -0
  47. package/dist/stage-blender/export_scene.py +275 -0
  48. package/dist/stage-blender/preview_camera.py +90 -0
  49. package/dist/stage-blender/repair_mesh.py +112 -0
  50. package/dist/stage-public/app.js +759 -0
  51. package/dist/stage-public/baked/bakePilot.js +44 -0
  52. package/dist/stage-public/baked/bakedScene.js +129 -0
  53. package/dist/stage-public/baked/sceneAppearance.js +225 -0
  54. package/dist/stage-public/baked/sceneCamera.js +45 -0
  55. package/dist/stage-public/comparison-contract.js +28 -0
  56. package/dist/stage-public/delivery.html +4 -0
  57. package/dist/stage-public/delivery.js +17 -0
  58. package/dist/stage-public/godot/appearance.gd +170 -0
  59. package/dist/stage-public/godot/preview.gd +79 -0
  60. package/dist/stage-public/index.html +141 -0
  61. package/dist/stage-public/review-app.js +289 -0
  62. package/dist/stage-public/review-runtime.js +63 -0
  63. package/dist/stage-public/review.css +24 -0
  64. package/dist/stage-public/review.html +47 -0
  65. package/dist/stage-public/scene-runtime.js +212 -0
  66. package/dist/stage-public/sceneContractRuntime.js +235 -0
  67. package/dist/stage-public/styles.css +328 -0
  68. package/dist/stage-public/three-appearance.js +104 -0
  69. package/dist/stage-public/vendor/three170/LICENSE +21 -0
  70. package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
  71. package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
  72. package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
  73. package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
  74. package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
  75. package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
  76. package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  77. package/dist/tile-transition-mask.svg +40 -0
  78. package/package.json +77 -69
  79. package/skills/evomeme-canvas/SKILL.md +52 -0
  80. package/skills/evomeme-canvas/agents/openai.yaml +7 -0
  81. package/skills/evomeme-cover/SKILL.md +1 -1
  82. package/skills/evomeme-game-maker/SKILL.md +79 -8
  83. package/skills/game-asset-align/SKILL.md +45 -0
  84. package/skills/game-asset-align/agents/openai.yaml +8 -0
  85. package/skills/game-asset-align/references/alignment-contract.md +61 -0
  86. package/skills/game-asset-align/references/blender-scene-pipeline.md +45 -0
  87. package/skills/game-asset-align/references/canonical-package.md +26 -0
  88. package/skills/game-asset-align/references/engine-capabilities.md +14 -0
  89. package/skills/game-asset-align/references/lightweight-review.md +32 -0
  90. package/skills/game-asset-align/references/repair-policy.md +30 -0
  91. package/skills/game-asset-align/references/tool-contract.md +39 -0
  92. package/skills/game-asset-align/references/visual-review.md +26 -0
  93. package/skills/game-asset-image-generator/SKILL.md +1 -1
  94. package/skills/godot-3d-game/SKILL.md +39 -0
  95. package/skills/godot-3d-game/agents/openai.yaml +8 -0
  96. package/skills/godot-3d-game/references/alignment-gates.md +26 -0
  97. package/skills/godot-3d-game/references/appearance-alignment.md +52 -0
  98. package/skills/godot-3d-game/references/build-and-qa.md +22 -0
  99. package/skills/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  100. package/skills/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  101. package/skills/godot-3d-game/references/physics-colliders.md +13 -0
  102. package/skills/godot-3d-game/references/project-structure.md +22 -0
  103. package/skills/godot-3d-game/references/skeleton-animation.md +16 -0
  104. package/skills/threejs-3d-game/SKILL.md +6 -2
  105. package/skills/threejs-3d-game/references/engine-asset-pipeline.md +52 -15
  106. package/dist/canvas-public/sequence-sheet.js +0 -59
@@ -38,19 +38,48 @@
38
38
  <button type="button" class="ghost-btn" id="inspector-close" title="取消选中">×</button>
39
39
  </header>
40
40
  <div class="inspector-body" id="inspector-body"></div>
41
+ <div
42
+ class="inspector-resize-handle"
43
+ id="inspector-resize-handle"
44
+ role="separator"
45
+ aria-label="调整左侧栏宽度"
46
+ aria-orientation="vertical"
47
+ tabindex="0"
48
+ ></div>
41
49
  </aside>
42
50
  <div class="canvas-main">
43
51
  <div class="canvas-shell">
44
52
  <div class="canvas-toolbar">
53
+ <span class="product-brand">EVOMEME</span>
45
54
  <div class="project-bar">
46
55
  <span class="project-name" id="project-name" title="">未打开工程</span>
47
56
  <button type="button" class="ghost-btn" id="switch-project-btn">切换工程</button>
48
57
  </div>
49
58
  <div class="toolbar-actions" id="toolbar-actions">
50
- <button type="button" class="tool-btn" id="tool-add-assets">添加素材</button>
51
- <button type="button" class="tool-btn" id="tool-image-gen" title="拖到画布指定位置创建图片生成元素">图片生成</button>
52
- <button type="button" class="tool-btn" id="tool-video-gen" title="拖到画布指定位置创建视频生成元素">视频生成</button>
53
- <button type="button" class="ghost-btn" id="reset-view">重置视图</button>
59
+ <div class="toolbar-primary" role="tablist" aria-label="画布功能分类">
60
+ <button type="button" class="toolbar-primary-button toolbar-category-tab" id="tool-add-assets" role="tab" aria-selected="false" aria-expanded="false" aria-controls="toolbar-asset-tools"><span>添加素材</span><i class="toolbar-category-indicator" aria-hidden="true"></i></button>
61
+ <button type="button" class="toolbar-primary-button toolbar-category-tab" id="toolbar-image-tab" role="tab" aria-selected="false" aria-expanded="false" aria-controls="toolbar-image-tools"><span>图片生成</span><i class="toolbar-category-indicator" aria-hidden="true"></i></button>
62
+ <button type="button" class="toolbar-primary-button toolbar-category-tab" id="toolbar-video-tab" role="tab" aria-selected="false" aria-expanded="false" aria-controls="toolbar-video-tools"><span>视频生成</span><i class="toolbar-category-indicator" aria-hidden="true"></i></button>
63
+ </div>
64
+ <div class="toolbar-ribbon" id="toolbar-ribbon" hidden>
65
+ <div class="toolbar-ribbon-panel" id="toolbar-asset-tools" role="tabpanel" hidden>
66
+ <button type="button" class="toolbar-ribbon-tool toolbar-ribbon-action" id="tool-local-assets" title="从本地选择图片或视频"><span>本地导入</span></button>
67
+ <button type="button" class="toolbar-ribbon-tool" id="tool-official-assets" title="拖到画布指定位置打开官方素材库"><span>官方素材</span></button>
68
+ </div>
69
+ <div class="toolbar-ribbon-panel" id="toolbar-image-tools" role="tabpanel" hidden>
70
+ <button type="button" class="toolbar-ribbon-tool" id="tool-image-gen" title="拖到画布指定位置创建图片生成元素"><span>图片生成</span></button>
71
+ <button type="button" class="toolbar-ribbon-tool" id="tool-game-ui-gen" title="拖到画布指定位置创建游戏 UI 组件生成元素"><span>游戏 UI 组件生成</span></button>
72
+ <button type="button" class="toolbar-ribbon-tool" id="tool-four-view" title="拖到画布指定位置创建空白四视图生成元素"><span>角色四视图生成</span></button>
73
+ <button type="button" class="toolbar-ribbon-tool" id="tool-eight-direction" title="拖到画布指定位置创建空白八方图生成元素"><span>角色八方图生成</span></button>
74
+ <button type="button" class="toolbar-ribbon-tool" id="tool-seamless-tile-gen" title="拖到画布指定位置创建无缝地块生成元素"><span>无缝地块生成</span></button>
75
+ <button type="button" class="toolbar-ribbon-tool" id="tool-tile-transition-atlas" title="拖到画布指定位置创建无缝地块集生成元素"><span>无缝地块集生成</span></button>
76
+ <button type="button" class="toolbar-ribbon-tool" id="tool-tile-map" title="先设置文件夹和瓦片分辨率,再创建地图"><span>地图绘制</span></button>
77
+ </div>
78
+ <div class="toolbar-ribbon-panel" id="toolbar-video-tools" role="tabpanel" hidden>
79
+ <button type="button" class="toolbar-ribbon-tool" id="tool-video-gen" title="拖到画布指定位置创建视频生成元素"><span>视频生成</span></button>
80
+ <button type="button" class="toolbar-ribbon-tool" id="tool-animation-gen" title="拖到画布指定位置创建序列帧动画生成管线"><span>序列帧动画生成</span></button>
81
+ </div>
82
+ </div>
54
83
  </div>
55
84
  </div>
56
85
  <div class="canvas-viewport" id="viewport">
@@ -65,28 +94,110 @@
65
94
  <div class="ctx-menu" id="ctx-menu" hidden>
66
95
  <button type="button" data-action="copy">复制</button>
67
96
  <button type="button" data-action="paste" hidden>粘贴</button>
68
- <button type="button" data-action="cutout" hidden>智能抠图</button>
97
+ <button type="button" data-action="export-tile-map" hidden>导出 PNG</button>
98
+ <button type="button" data-action="image-canvas-size" hidden>图片大小编辑</button>
69
99
  <button type="button" data-action="interactive-edit" hidden>交互编辑</button>
70
- <button type="button" data-action="layer-decomposition" hidden>大模型图层分离</button>
71
- <button type="button" data-action="video-trim" hidden>裁剪视频</button>
100
+ <button type="button" data-action="perfect-pixel" hidden>完美像素化</button>
101
+ <div class="ctx-submenu" data-submenu="cutout" hidden>
102
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
103
+ <span>抠图</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
104
+ </button>
105
+ <div class="ctx-submenu-panel" role="menu">
106
+ <button type="button" role="menuitem" data-action="cutout" hidden>智能抠图</button>
107
+ <button type="button" role="menuitem" data-action="color-key" hidden>颜色剔除</button>
108
+ </div>
109
+ </div>
72
110
  <button type="button" data-action="video-cycle" hidden>智能周期提取</button>
73
- <button type="button" data-action="video-to-sequence" hidden>序列帧化</button>
74
- <button type="button" data-action="smart-split">智能切分</button>
75
- <button type="button" data-action="manual-split">手动切分</button>
76
- <button type="button" data-action="edit-sequence" hidden>在左侧编辑序列</button>
77
- <button type="button" data-action="sequence-to-sheet" hidden>拼成单图</button>
78
- <button type="button" data-action="ungroup-sequence" hidden>拆散为单图</button>
79
- <button type="button" data-action="combine-sequence" hidden>组合为序列帧</button>
111
+ <button type="button" data-action="video-to-frame-sheet" hidden>视频转序列帧图</button>
112
+ <div class="ctx-submenu" data-submenu="image-split" hidden>
113
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
114
+ <span>图片切分</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
115
+ </button>
116
+ <div class="ctx-submenu-panel" role="menu">
117
+ <button type="button" role="menuitem" data-action="smart-split">智能切分</button>
118
+ <button type="button" role="menuitem" data-action="manual-split">手动切分</button>
119
+ <button type="button" role="menuitem" data-action="layer-decomposition" hidden>大模型图层分离</button>
120
+ </div>
121
+ </div>
122
+ <div class="ctx-submenu" data-submenu="frame-sheet" hidden>
123
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
124
+ <span>序列帧</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
125
+ </button>
126
+ <div class="ctx-submenu-panel" role="menu">
127
+ <button type="button" role="menuitem" data-action="frame-sheet-preview" hidden>序列帧预览</button>
128
+ <button type="button" role="menuitem" data-action="frame-sheet-edit" hidden>序列帧编辑</button>
129
+ </div>
130
+ </div>
131
+ <div class="ctx-submenu" data-submenu="character-views" hidden>
132
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
133
+ <span>角色多视角生成</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
134
+ </button>
135
+ <div class="ctx-submenu-panel" role="menu">
136
+ <button type="button" role="menuitem" data-action="four-view" hidden>四视图生成</button>
137
+ <button type="button" role="menuitem" data-action="eight-direction" hidden>八方图生成</button>
138
+ </div>
139
+ </div>
140
+ <div class="ctx-submenu" data-submenu="map-tiles" hidden>
141
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
142
+ <span>地图瓦片</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
143
+ </button>
144
+ <div class="ctx-submenu-panel" role="menu">
145
+ <button type="button" role="menuitem" data-action="seam-elimination" hidden>瓦片缝隙消除</button>
146
+ <button type="button" role="menuitem" data-action="tile-transition-atlas" hidden>地图集生成</button>
147
+ </div>
148
+ </div>
80
149
  <button type="button" data-action="delete" class="ctx-danger">删除</button>
81
150
  </div>
82
151
 
152
+ <div class="modal-backdrop modal-backdrop-dark" id="image-canvas-size-modal" hidden>
153
+ <div class="modal-dialog modal-dialog-image-canvas-size" role="group" aria-labelledby="image-canvas-size-title">
154
+ <div class="seq-panel-head">
155
+ <strong id="image-canvas-size-title">图片大小编辑</strong>
156
+ <button type="button" class="ghost-btn" id="image-canvas-size-close">关闭</button>
157
+ </div>
158
+ <div class="image-canvas-size-stage" id="image-canvas-size-stage">
159
+ <canvas id="image-canvas-size-preview"></canvas>
160
+ <div class="image-canvas-size-frame" id="image-canvas-size-frame">
161
+ <button type="button" class="image-canvas-size-edge is-top" data-edge="top" aria-label="拖动上边缘"></button>
162
+ <button type="button" class="image-canvas-size-edge is-right" data-edge="right" aria-label="拖动右边缘"></button>
163
+ <button type="button" class="image-canvas-size-edge is-bottom" data-edge="bottom" aria-label="拖动下边缘"></button>
164
+ <button type="button" class="image-canvas-size-edge is-left" data-edge="left" aria-label="拖动左边缘"></button>
165
+ </div>
166
+ </div>
167
+ <div class="image-canvas-size-fields">
168
+ <label class="seq-field">
169
+ 宽度
170
+ <input type="number" id="image-canvas-size-width" min="1" max="16384" step="1" />
171
+ <span>px</span>
172
+ </label>
173
+ <label class="seq-field">
174
+ 高度
175
+ <input type="number" id="image-canvas-size-height" min="1" max="16384" step="1" />
176
+ <span>px</span>
177
+ </label>
178
+ </div>
179
+ <div class="modal-actions">
180
+ <button type="button" class="ghost-btn" id="image-canvas-size-reset">重置</button>
181
+ <button type="button" class="ghost-btn" id="image-canvas-size-cancel">取消</button>
182
+ <button type="button" class="tool-btn" id="image-canvas-size-confirm">应用</button>
183
+ </div>
184
+ </div>
185
+ </div>
186
+
83
187
  <div class="modal-backdrop modal-backdrop-dark" id="interactive-edit-modal" hidden>
84
- <div class="modal-dialog modal-dialog-interactive-edit" role="dialog" aria-modal="true" aria-labelledby="interactive-edit-title">
188
+ <div class="modal-dialog modal-dialog-interactive-edit" role="group" aria-labelledby="interactive-edit-title">
85
189
  <div class="seq-panel-head">
86
190
  <strong id="interactive-edit-title">交互编辑</strong>
87
191
  <button type="button" class="ghost-btn" id="interactive-edit-close">关闭</button>
88
192
  </div>
89
- <div class="interactive-editor-host" id="interactive-editor-host"></div>
193
+ <div class="interactive-editor-stage">
194
+ <div class="interactive-editor-host" id="interactive-editor-host"></div>
195
+ <label class="interactive-edit-zoom" for="interactive-edit-zoom">
196
+ <span>缩放</span>
197
+ <input type="range" id="interactive-edit-zoom" min="1" max="400" step="1" value="100" />
198
+ <output id="interactive-edit-zoom-value" for="interactive-edit-zoom">100%</output>
199
+ </label>
200
+ </div>
90
201
  <div class="interactive-edit-compose">
91
202
  <label class="layer-decomposition-prompt" for="interactive-edit-prompt">
92
203
  编辑要求
@@ -96,7 +207,14 @@
96
207
  placeholder="例如:将框选区域替换为木质宝箱,并保持其他内容不变"
97
208
  ></textarea>
98
209
  </label>
99
- <p class="modal-hint">画面标记和文字会合并到参考图中,并使用 Pro 模型生成。</p>
210
+ <label class="interactive-edit-model" for="interactive-edit-model">
211
+ <span>模型</span>
212
+ <select id="interactive-edit-model">
213
+ <option value="asset-pro">Pro</option>
214
+ <option value="asset-max">Max</option>
215
+ </select>
216
+ </label>
217
+ <p class="modal-hint">画面标记和文字会合并到参考图中,再使用所选模型生成。</p>
100
218
  <p class="modal-hint" id="interactive-edit-status" hidden></p>
101
219
  <div class="modal-actions">
102
220
  <button type="button" class="ghost-btn" id="interactive-edit-cancel">取消</button>
@@ -107,8 +225,42 @@
107
225
  </div>
108
226
  </div>
109
227
 
228
+ <div class="modal-backdrop modal-backdrop-dark" id="seam-elimination-modal" hidden>
229
+ <div class="modal-dialog modal-dialog-seam-elimination" role="group" aria-labelledby="seam-elimination-title">
230
+ <div class="seq-panel-head">
231
+ <strong id="seam-elimination-title">缝隙消除</strong>
232
+ <button type="button" class="ghost-btn" id="seam-elimination-close">关闭</button>
233
+ </div>
234
+ <div class="seam-elimination-preview">
235
+ <img id="seam-elimination-image" alt="待处理地砖预览" />
236
+ </div>
237
+ <label class="layer-decomposition-prompt" for="seam-elimination-prompt">
238
+ 地砖描述
239
+ <textarea
240
+ id="seam-elimination-prompt"
241
+ rows="4"
242
+ placeholder="描述地砖的内容、材质和美术风格"
243
+ ></textarea>
244
+ </label>
245
+ <label class="interactive-edit-model" for="seam-elimination-model">
246
+ <span>模型</span>
247
+ <select id="seam-elimination-model"></select>
248
+ </label>
249
+ <div class="seam-elimination-size-row">
250
+ <span>输出尺寸</span>
251
+ <output id="seam-elimination-size">读取中…</output>
252
+ </div>
253
+ <p class="modal-hint">输出尺寸锁定为输入图片的像素尺寸。</p>
254
+ <p class="modal-hint" id="seam-elimination-status" hidden></p>
255
+ <div class="modal-actions">
256
+ <button type="button" class="ghost-btn" id="seam-elimination-cancel">取消</button>
257
+ <button type="button" class="tool-btn" id="seam-elimination-confirm">开始处理</button>
258
+ </div>
259
+ </div>
260
+ </div>
261
+
110
262
  <div class="modal-backdrop modal-backdrop-dark" id="layer-decomposition-modal" hidden>
111
- <div class="modal-dialog modal-dialog-layer-decomposition" role="dialog" aria-modal="true" aria-labelledby="layer-decomposition-title">
263
+ <div class="modal-dialog modal-dialog-layer-decomposition" role="group" aria-labelledby="layer-decomposition-title">
112
264
  <div class="seq-panel-head">
113
265
  <strong id="layer-decomposition-title">大模型图层分离</strong>
114
266
  <button type="button" class="ghost-btn" id="layer-decomposition-close">关闭</button>
@@ -134,7 +286,7 @@
134
286
  </div>
135
287
 
136
288
  <div class="modal-backdrop modal-backdrop-dark" id="video-cycle-modal" hidden>
137
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="video-cycle-title">
289
+ <div class="modal-dialog" role="group" aria-labelledby="video-cycle-title">
138
290
  <div class="seq-panel-head">
139
291
  <strong id="video-cycle-title">智能周期提取</strong>
140
292
  <button type="button" class="ghost-btn" id="video-cycle-close">关闭</button>
@@ -175,15 +327,23 @@
175
327
  </div>
176
328
 
177
329
  <div class="modal-backdrop modal-backdrop-dark" id="smart-split-modal" hidden>
178
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="smart-split-title">
330
+ <div class="modal-dialog" role="group" aria-labelledby="smart-split-title">
179
331
  <div class="seq-panel-head">
180
332
  <strong id="smart-split-title">智能切分</strong>
181
333
  <button type="button" class="ghost-btn" id="smart-split-close">关闭</button>
182
334
  </div>
183
335
  <p class="modal-hint">
184
- 切分结果统一为最大主体的宽度和高度。选择主体在扩展区域中的固定基准点;主体不会缩放。
336
+ 自动识别并裁出彼此分离的主体;主体不会缩放。
185
337
  </p>
186
- <div class="split-anchor-grid" id="smart-split-anchor-grid" role="radiogroup" aria-label="扩展基准点">
338
+ <label class="smart-split-size-toggle">
339
+ <input type="checkbox" id="smart-split-pad-to-same-size" checked />
340
+ <span>
341
+ <strong>补全为相同图片大小</strong>
342
+ <small>只在裁切结果周围填充透明像素,不扩大原图裁切范围。</small>
343
+ </span>
344
+ </label>
345
+ <p class="modal-hint">透明补全时主体的对齐位置:</p>
346
+ <div class="split-anchor-grid" id="smart-split-anchor-grid" role="radiogroup" aria-label="透明补全对齐位置">
187
347
  <button type="button" class="split-anchor-btn" data-anchor="top-left" role="radio" aria-checked="false"><span></span>左上</button>
188
348
  <button type="button" class="split-anchor-btn" data-anchor="top" role="radio" aria-checked="false"><span></span>上</button>
189
349
  <button type="button" class="split-anchor-btn" data-anchor="top-right" role="radio" aria-checked="false"><span></span>右上</button>
@@ -203,7 +363,7 @@
203
363
  </div>
204
364
 
205
365
  <div class="modal-backdrop modal-backdrop-dark" id="manual-split-modal" hidden>
206
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="manual-split-title">
366
+ <div class="modal-dialog" role="group" aria-labelledby="manual-split-title">
207
367
  <div class="seq-panel-head">
208
368
  <strong id="manual-split-title">手动切分</strong>
209
369
  <button type="button" class="ghost-btn" id="manual-split-close">关闭</button>
@@ -232,137 +392,84 @@
232
392
  </div>
233
393
 
234
394
  <div class="modal-backdrop modal-backdrop-dark" id="frame-extract-modal" hidden>
235
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="frame-extract-title">
395
+ <div class="modal-dialog" role="group" aria-labelledby="frame-extract-title">
236
396
  <div class="seq-panel-head">
237
- <strong id="frame-extract-title">序列帧化</strong>
397
+ <strong id="frame-extract-title">视频转序列帧图</strong>
238
398
  <button type="button" class="ghost-btn" id="frame-extract-close">关闭</button>
239
399
  </div>
240
400
  <p class="modal-hint">
241
- 按总帧数计算步长均匀取帧:首帧与尾帧必含,中间为 1 + n×⌊T/(C-1)⌋。
401
+ 均匀抽取视频帧后,自动按从左到右、从上到下的顺序拼成一张 PNG 图片。
242
402
  </p>
243
403
  <label class="seq-field frame-extract-field">
244
- 序列帧长度
245
- <input type="number" id="frame-extract-count" min="2" max="30" step="1" value="10" />
246
- <span class="frame-extract-range">2 – 30</span>
404
+ FPS
405
+ <input type="number" id="frame-extract-fps" min="0.1" max="60" step="0.1" value="8" />
406
+ <span class="frame-extract-range">0.1 – 60</span>
247
407
  </label>
248
408
  <p class="modal-hint" id="frame-extract-status" hidden></p>
249
409
  <div class="modal-actions">
250
410
  <button type="button" class="ghost-btn" id="frame-extract-cancel">取消</button>
251
- <button type="button" class="tool-btn" id="frame-extract-confirm">开始抽帧</button>
411
+ <button type="button" class="tool-btn" id="frame-extract-confirm">生成序列帧图</button>
252
412
  </div>
253
413
  </div>
254
414
  </div>
255
415
 
256
- <div class="modal-backdrop modal-backdrop-dark" id="video-trim-modal" hidden>
257
- <div class="modal-dialog modal-dialog-wide" role="dialog" aria-modal="true" aria-labelledby="video-trim-title">
416
+ <div class="modal-backdrop modal-backdrop-dark" id="frame-preview-modal" hidden>
417
+ <div class="modal-dialog" role="group" aria-labelledby="frame-preview-title">
258
418
  <div class="seq-panel-head">
259
- <strong id="video-trim-title">裁剪视频</strong>
260
- <button type="button" class="ghost-btn" id="video-trim-close">关闭</button>
419
+ <strong id="frame-preview-title">序列帧预览</strong>
420
+ <button type="button" class="ghost-btn" id="frame-preview-close">关闭</button>
261
421
  </div>
262
- <p class="modal-hint">一条时间轴:拖白点定位画面,拖青绿柄设入/出点;滚轮可微调(Shift=1ms)。</p>
263
- <div class="trim-player">
264
- <div class="trim-stage">
265
- <video id="video-trim-preview" muted playsinline preload="auto"></video>
266
- </div>
267
- <div class="trim-bar">
268
- <button type="button" class="trim-play-btn" id="video-trim-play" title="播放/暂停">▶</button>
269
- <span class="trim-clock">
270
- <strong id="video-trim-now-label">0:00.000</strong>
271
- <span>/</span>
272
- <span id="video-trim-total-label">0:00.000</span>
273
- </span>
274
- </div>
275
- <div class="trim-timeline" id="video-trim-timeline">
276
- <div class="trim-track" id="video-trim-track">
277
- <div class="trim-range" id="video-trim-range"></div>
278
- <input
279
- type="range"
280
- class="trim-scrub-input"
281
- id="video-trim-scrub"
282
- min="0"
283
- max="0"
284
- step="0.001"
285
- value="0"
286
- aria-label="播放进度"
287
- />
288
- <div
289
- class="trim-handle trim-handle-start"
290
- id="video-trim-handle-start"
291
- title="入点"
292
- role="slider"
293
- tabindex="0"
294
- ></div>
295
- <div
296
- class="trim-handle trim-handle-end"
297
- id="video-trim-handle-end"
298
- title="出点"
299
- role="slider"
300
- tabindex="0"
301
- ></div>
302
- </div>
303
- </div>
304
- <div class="trim-times">
305
- <span>入点 <strong id="video-trim-start-label">0:00.000</strong></span>
306
- <span>选区 <strong id="video-trim-dur-label">0:00.000</strong></span>
307
- <span>出点 <strong id="video-trim-end-label">0:00.000</strong></span>
308
- </div>
422
+ <p class="modal-hint">
423
+ 将当前图片等分为网格,并按照从左到右、从上到下的顺序在画布内循环播放。不会修改图片文件。
424
+ </p>
425
+ <div class="seq-sheet-fields">
426
+ <label class="seq-field frame-extract-field">
427
+ 行数
428
+ <input type="number" id="frame-preview-rows" min="1" max="64" step="1" value="2" />
429
+ </label>
430
+ <label class="seq-field frame-extract-field">
431
+ 列数
432
+ <input type="number" id="frame-preview-columns" min="1" max="64" step="1" value="2" />
433
+ </label>
309
434
  </div>
310
- <p class="modal-hint" id="video-trim-status" hidden></p>
435
+ <p class="modal-hint" id="frame-preview-info"></p>
436
+ <div class="seq-sheet-preview" id="frame-preview-grid" aria-hidden="true"></div>
437
+ <label class="seq-field frame-extract-field">
438
+ FPS
439
+ <input type="number" id="frame-preview-fps" min="0.000001" step="any" value="8" />
440
+ </label>
441
+ <p class="modal-hint" id="frame-preview-status" hidden></p>
311
442
  <div class="modal-actions">
312
- <button type="button" class="ghost-btn" id="video-trim-cancel">取消</button>
313
- <button type="button" class="tool-btn" id="video-trim-confirm">裁剪并生成</button>
443
+ <button type="button" class="ghost-btn" id="frame-preview-cancel">取消</button>
444
+ <button type="button" class="tool-btn" id="frame-preview-confirm">开始预览</button>
314
445
  </div>
315
446
  </div>
316
447
  </div>
317
448
 
318
- <div class="modal-backdrop modal-backdrop-dark" id="seq-sheet-modal" hidden>
319
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="seq-sheet-title">
449
+ <div class="modal-backdrop modal-backdrop-dark" id="frame-editor-split-modal" hidden>
450
+ <div class="modal-dialog" role="group" aria-labelledby="frame-editor-split-title">
320
451
  <div class="seq-panel-head">
321
- <strong id="seq-sheet-title">拼成单图</strong>
322
- <button type="button" class="ghost-btn" id="seq-sheet-close">关闭</button>
452
+ <strong id="frame-editor-split-title">创建序列帧编辑器</strong>
453
+ <button type="button" class="ghost-btn" id="frame-editor-split-close">关闭</button>
323
454
  </div>
324
455
  <p class="modal-hint">
325
- 按行列排布序列帧:先从左到右填满一行,再换到下一行;多出的格子保持透明。
456
+ 请设置当前图片包含的行数和列数。已有序列帧预览时会自动填入相同配置;这里允许 1×1。
326
457
  </p>
327
- <p class="modal-hint" id="seq-sheet-frame-info">共 0 帧</p>
328
458
  <div class="seq-sheet-fields">
329
459
  <label class="seq-field frame-extract-field">
330
460
  行数
331
- <input type="number" id="seq-sheet-rows" min="1" max="64" step="1" value="1" />
461
+ <input type="number" id="frame-editor-split-rows" min="1" max="64" step="1" value="2" />
332
462
  </label>
333
463
  <label class="seq-field frame-extract-field">
334
464
  列数
335
- <input type="number" id="seq-sheet-cols" min="1" max="64" step="1" value="1" />
465
+ <input type="number" id="frame-editor-split-columns" min="1" max="64" step="1" value="2" />
336
466
  </label>
337
467
  </div>
338
- <div class="seq-sheet-preview" id="seq-sheet-preview" aria-hidden="true"></div>
339
- <p class="modal-hint" id="seq-sheet-status" hidden></p>
340
- <div class="modal-actions">
341
- <button type="button" class="ghost-btn" id="seq-sheet-cancel">取消</button>
342
- <button type="button" class="tool-btn" id="seq-sheet-confirm">生成单图</button>
343
- </div>
344
- </div>
345
- </div>
346
-
347
- <div class="modal-backdrop" id="seq-modal" hidden>
348
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="seq-panel-title">
349
- <div class="seq-panel-head">
350
- <strong id="seq-panel-title">编辑序列</strong>
351
- <button type="button" class="ghost-btn" id="seq-panel-close">关闭</button>
352
- </div>
353
- <p class="modal-hint">调整播放速度、循环,以及帧顺序。</p>
354
- <label class="seq-field">
355
- 播放速度 (FPS)
356
- <input type="range" id="seq-fps" min="1" max="24" value="8" />
357
- <span id="seq-fps-val">8</span>
358
- </label>
359
- <label class="seq-field seq-check">
360
- <input type="checkbox" id="seq-loop" checked />
361
- 循环播放
362
- </label>
363
- <div class="seq-frames" id="seq-frames"></div>
468
+ <p class="modal-hint" id="frame-editor-split-info"></p>
469
+ <p class="modal-hint" id="frame-editor-split-status" hidden></p>
364
470
  <div class="modal-actions">
365
- <button type="button" class="ghost-btn" id="seq-panel-done">完成</button>
471
+ <button type="button" class="ghost-btn" id="frame-editor-split-cancel">取消</button>
472
+ <button type="button" class="tool-btn" id="frame-editor-split-confirm">创建编辑器</button>
366
473
  </div>
367
474
  </div>
368
475
  </div>