customforge 0.1.0-alpha.0
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/CHANGELOG.md +27 -0
- package/LICENSE +201 -0
- package/README.md +299 -0
- package/README.zh-CN.md +299 -0
- package/dist/bridge/TextureBridge.d.ts +31 -0
- package/dist/bridge/TextureBridge.d.ts.map +1 -0
- package/dist/core/config.d.ts +26 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/design.d.ts +12 -0
- package/dist/core/design.d.ts.map +1 -0
- package/dist/core/dom.d.ts +11 -0
- package/dist/core/dom.d.ts.map +1 -0
- package/dist/core/types.d.ts +167 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/customizer/ProductCustomizer.d.ts +106 -0
- package/dist/customizer/ProductCustomizer.d.ts.map +1 -0
- package/dist/editor/DesignEditor.d.ts +130 -0
- package/dist/editor/DesignEditor.d.ts.map +1 -0
- package/dist/editor/imageSource.d.ts +11 -0
- package/dist/editor/imageSource.d.ts.map +1 -0
- package/dist/editor/objectBounds.d.ts +39 -0
- package/dist/editor/objectBounds.d.ts.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1139 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +12 -0
- package/dist/viewer/ProductViewer.d.ts +64 -0
- package/dist/viewer/ProductViewer.d.ts.map +1 -0
- package/package.json +74 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# CustomForge
|
|
4
|
+
|
|
5
|
+
**让二维纹理画布实时呈现在三维产品上**
|
|
6
|
+
|
|
7
|
+
一个轻量、与前端框架无关的产品定制原型,基于 Fabric.js 和 Three.js 构建浏览器端 2D 到 3D 定制体验
|
|
8
|
+
|
|
9
|
+
<p>
|
|
10
|
+
<img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white">
|
|
11
|
+
<img alt="Vite" src="https://img.shields.io/badge/Vite-8-646CFF?logo=vite&logoColor=white">
|
|
12
|
+
<img alt="Three.js" src="https://img.shields.io/badge/Three.js-r185-111111?logo=threedotjs&logoColor=white">
|
|
13
|
+
<img alt="Fabric.js" src="https://img.shields.io/badge/Fabric.js-7-DB4D6D">
|
|
14
|
+
<img alt="License" src="https://img.shields.io/badge/License-Apache%202.0-2F6F9F">
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p>
|
|
18
|
+
<a href="./README.md">English</a> |
|
|
19
|
+
<strong>中文简体</strong>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 项目能力
|
|
27
|
+
|
|
28
|
+
CustomForge 将常见的二维设计界面与带 UV 的三维模型连接起来:
|
|
29
|
+
|
|
30
|
+
- 在二维纹理画布上添加和编辑文字
|
|
31
|
+
- 上传、移动、缩放和旋转图片
|
|
32
|
+
- 将画布的每次变化实时呈现在三维产品上
|
|
33
|
+
- 加载远程 GLB/GLTF 模型和可选的基础纹理
|
|
34
|
+
- 通过 Mesh 名称指定可定制表面
|
|
35
|
+
- 使用 OrbitControls 旋转和缩放三维预览
|
|
36
|
+
- 将合成后的纹理导出为 PNG
|
|
37
|
+
- 通过版本化 Design JSON 保存和恢复可编辑对象
|
|
38
|
+
|
|
39
|
+
工作台内置了一个程序生成的杯子,无需准备外部资源即可直接运行
|
|
40
|
+
|
|
41
|
+
## 仓库开发
|
|
42
|
+
|
|
43
|
+
环境要求:Node.js 22+ 和 pnpm 11+
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pnpm install
|
|
47
|
+
pnpm dev
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
打开 Vite 输出的地址
|
|
51
|
+
|
|
52
|
+
内置演示的左侧是 UV 编辑区,右侧是实时三维预览
|
|
53
|
+
|
|
54
|
+
## npm Alpha 制品
|
|
55
|
+
|
|
56
|
+
CustomForge 已准备通过 `alpha` dist-tag 公开发布。不同 alpha 版本之间的 API 和 Design JSON Schema 可能发生变化
|
|
57
|
+
|
|
58
|
+
首次发布完成后,使用以下命令安装当前 alpha 及其 peer dependencies:
|
|
59
|
+
|
|
60
|
+
```powershell
|
|
61
|
+
pnpm add customforge@alpha
|
|
62
|
+
pnpm add fabric three
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
发布前如需进行独立于仓库源码的验证,可在仓库根目录构建并生成本地包:
|
|
66
|
+
|
|
67
|
+
```powershell
|
|
68
|
+
pnpm pack:local
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
命令依次生成 JavaScript、TypeScript 声明、核心样式,检查 npm 文件清单,并创建:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
customforge-0.1.0-alpha.0.tgz
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
在独立 Vite TypeScript 项目中安装该本地制品及其 peer dependencies:
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
pnpm add D:\project\CustomForge\CustomForge\customforge-0.1.0-alpha.0.tgz
|
|
81
|
+
pnpm add fabric three
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
仓库中的 `examples/npm-consumer` 提供了一个只通过该 `.tgz` 导入的消费示例。在该目录中使用 `pnpm install --ignore-workspace`,确保 pnpm 将其作为独立于父级 workspace 的项目安装
|
|
85
|
+
|
|
86
|
+
## 加载你的产品
|
|
87
|
+
|
|
88
|
+
在演示页面中选择 **Load remote**,然后填写:
|
|
89
|
+
|
|
90
|
+
| 字段 | 用途 |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| GLB / GLTF URL | 带 UV 的三维产品模型地址 |
|
|
93
|
+
| Base texture URL | 显示在可编辑对象下方的可选基础纹理 |
|
|
94
|
+
| Customizable mesh | 接收实时画布纹理的 Mesh 名称 |
|
|
95
|
+
| Flip texture vertically | 在模型需要时修正纹理的垂直方向 |
|
|
96
|
+
|
|
97
|
+
UV 坐标应当保存在三维模型中
|
|
98
|
+
|
|
99
|
+
可选的纹理图片只是二维编辑器的基础图层,不能替代模型中的 UV 数据
|
|
100
|
+
|
|
101
|
+
> [!IMPORTANT]
|
|
102
|
+
> 远程模型、纹理、贴图和字体必须提供允许当前页面来源访问的 CORS 响应头
|
|
103
|
+
>
|
|
104
|
+
> 被浏览器阻止或污染 Canvas 的资源可能无法加载,也会导致 PNG 导出失败
|
|
105
|
+
|
|
106
|
+
## 基本用法
|
|
107
|
+
|
|
108
|
+
与框架无关的 Library 入口可以挂载到任意两个 DOM 容器中:
|
|
109
|
+
|
|
110
|
+
CustomForge 仅支持浏览器环境,应在 DOM 挂载容器可用后创建实例
|
|
111
|
+
|
|
112
|
+
编辑器和查看器必须使用两个不同的容器;页面卸载、组件卸载或不再使用实例时必须调用 `destroy()` 释放 Fabric、WebGL、观察器和事件资源
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<div id="texture-editor"></div>
|
|
116
|
+
<div id="product-viewer"></div>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { createCustomizer } from 'customforge'
|
|
121
|
+
import 'customforge/style.css'
|
|
122
|
+
|
|
123
|
+
const customizer = await createCustomizer({
|
|
124
|
+
editor: '#texture-editor',
|
|
125
|
+
viewer: '#product-viewer',
|
|
126
|
+
editorWidth: 1024,
|
|
127
|
+
editorHeight: 512,
|
|
128
|
+
product: {
|
|
129
|
+
modelUrl: 'https://example.com/product.glb',
|
|
130
|
+
textureUrl: 'https://example.com/base-texture.png',
|
|
131
|
+
surfaceMesh: 'PrintArea',
|
|
132
|
+
textureFlipY: false,
|
|
133
|
+
},
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
customizer.addText({
|
|
137
|
+
text: 'Hello world',
|
|
138
|
+
x: 120,
|
|
139
|
+
y: 180,
|
|
140
|
+
fontSize: 64,
|
|
141
|
+
color: '#172126',
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
await customizer.addImage({
|
|
145
|
+
src: 'https://example.com/logo.png',
|
|
146
|
+
x: 720,
|
|
147
|
+
y: 240,
|
|
148
|
+
width: 220,
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
window.addEventListener('beforeunload', () => customizer.destroy(), {
|
|
152
|
+
once: true,
|
|
153
|
+
})
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
公开包与本地 `.tgz` 使用相同的根入口和样式入口;需要可重复安装时应固定具体 alpha 版本
|
|
157
|
+
|
|
158
|
+
## Design JSON
|
|
159
|
+
|
|
160
|
+
`saveDesign()` 返回由 Library 自身定义、可安全写入 JSON 的文档,不暴露 Fabric.js 序列化格式。`loadDesign()` 校验未知输入,并异步恢复可编辑对象栈:
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
const design = customizer.saveDesign()
|
|
164
|
+
localStorage.setItem('customforge-design', JSON.stringify(design))
|
|
165
|
+
|
|
166
|
+
const savedDesign = localStorage.getItem('customforge-design')
|
|
167
|
+
if (savedDesign) {
|
|
168
|
+
await customizer.loadDesign(JSON.parse(savedDesign))
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
当前 Schema 版本为 `1`。文档保存逻辑画布尺寸,并按从后到前的渲染顺序保存文字和图片对象,包括稳定对象 ID 与基于中心点的变换
|
|
173
|
+
|
|
174
|
+
Design JSON 有意排除产品模型、目标 Mesh 和基础纹理。文档只能加载到逻辑宽高完全相同的编辑器中
|
|
175
|
+
|
|
176
|
+
加载具有事务性:只有文档校验通过且全部引用图片成功加载后,当前设计才会被替换。Blob URL 图片会在添加时转换为 Data URL;远程图片仍保留 URL,恢复时必须继续满足浏览器 CORS 要求
|
|
177
|
+
|
|
178
|
+
该 Schema 目前仍属于 alpha 契约,后续 alpha 版本可能调整
|
|
179
|
+
|
|
180
|
+
## 实例 API
|
|
181
|
+
|
|
182
|
+
| 方法 | 说明 |
|
|
183
|
+
| --- | --- |
|
|
184
|
+
| `addText(options)` | 添加并选中文字,自动约束在画布内 |
|
|
185
|
+
| `addImage(options)` | 加载并选中图片,自动约束在画布内 |
|
|
186
|
+
| `deleteSelected()` | 删除当前对象或选区 |
|
|
187
|
+
| `saveDesign()` | 返回当前版本化 Design JSON 文档 |
|
|
188
|
+
| `loadDesign(value)` | 校验并以事务方式恢复 Design JSON |
|
|
189
|
+
| `loadProduct(product)` | 更换模型、基础纹理和目标 Mesh |
|
|
190
|
+
| `exportTexture(filename?)` | 将合成纹理下载为 PNG |
|
|
191
|
+
| `resetView()` | 恢复默认三维相机位置 |
|
|
192
|
+
| `on(event, listener)` | 订阅实例事件,并返回取消订阅函数 |
|
|
193
|
+
| `destroy()` | 释放 DOM 事件、Fabric 状态和 WebGL 资源 |
|
|
194
|
+
|
|
195
|
+
当前事件包括 `ready`、`change`、`selectionchange`、`status` 和 `error`
|
|
196
|
+
|
|
197
|
+
首个 alpha 的稳定候选边界只包括上表方法、`createCustomizer`、`ProductCustomizer` 以及从根入口导出的配置、事件和 Design JSON 类型
|
|
198
|
+
|
|
199
|
+
`ProductCustomizer` 不公开 Fabric.js 编辑器和 Three.js 查看器实例,使用方只通过门面 API 操作定制器
|
|
200
|
+
|
|
201
|
+
不支持从 `core`、`editor`、`viewer`、`bridge` 或其他未声明的包子路径导入模块
|
|
202
|
+
|
|
203
|
+
## 架构
|
|
204
|
+
|
|
205
|
+
```mermaid
|
|
206
|
+
flowchart LR
|
|
207
|
+
A[文字和图片] --> B[DesignEditor]
|
|
208
|
+
C[基础纹理] --> B
|
|
209
|
+
B --> D[HTML Canvas]
|
|
210
|
+
D --> E[TextureBridge]
|
|
211
|
+
E --> F[Three.js CanvasTexture]
|
|
212
|
+
G[GLB / GLTF 模型] --> H[ProductViewer]
|
|
213
|
+
F --> H
|
|
214
|
+
H --> I[可定制 Mesh]
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
```text
|
|
218
|
+
ProductCustomizer
|
|
219
|
+
|-- DesignEditor Fabric.js 渲染和对象交互
|
|
220
|
+
|-- ProductViewer Three.js 场景、模型、材质和相机
|
|
221
|
+
`-- TextureBridge Canvas 到材质的同步
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
`ProductCustomizer` 负责协调各模块,并将 Fabric.js 和 Three.js 的实现细节隐藏在小型实例 API 后面
|
|
225
|
+
|
|
226
|
+
演示界面使用原生 TypeScript,核心不依赖 Vue、React 或其他 UI 框架
|
|
227
|
+
|
|
228
|
+
## 模型约定
|
|
229
|
+
|
|
230
|
+
当前原型要求:
|
|
231
|
+
|
|
232
|
+
- GLB 或 GLTF 模型包含有效的 UV 坐标
|
|
233
|
+
- 模型未经压缩,能够由标准 Three.js `GLTFLoader` 直接加载
|
|
234
|
+
- 模型具有一个用于定制表面的命名 Mesh,例如 `PrintArea`
|
|
235
|
+
- 目标纹理位于该 Mesh 的第一个材质槽中
|
|
236
|
+
- 浏览器可以在 CORS 策略下访问远程资源地址
|
|
237
|
+
|
|
238
|
+
内置演示同样遵循 `PrintArea` Mesh 命名约定
|
|
239
|
+
|
|
240
|
+
## 项目结构
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
src/
|
|
244
|
+
|-- bridge/ Canvas 与 Three.js 纹理同步
|
|
245
|
+
|-- core/ 公共类型、配置和 DOM 工具
|
|
246
|
+
|-- customizer/ 公共实例编排
|
|
247
|
+
|-- demo/ 可运行的工作台界面
|
|
248
|
+
|-- editor/ Fabric.js 设计画布
|
|
249
|
+
|-- style.css Library 公开样式入口
|
|
250
|
+
|-- styles/ Library 核心样式
|
|
251
|
+
|-- viewer/ Three.js 产品预览
|
|
252
|
+
`-- index.ts 与框架无关的源码入口
|
|
253
|
+
|
|
254
|
+
examples/
|
|
255
|
+
`-- npm-consumer/ 本地 .tgz 独立消费示例
|
|
256
|
+
|
|
257
|
+
scripts/
|
|
258
|
+
`-- verify-package.mjs npm 文件和制品边界检查
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## 开发命令
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
pnpm check # TypeScript 项目检查
|
|
265
|
+
pnpm test # 单元测试
|
|
266
|
+
pnpm build # 类型检查和生产构建
|
|
267
|
+
pnpm build:lib # 构建 ESM、类型声明和核心样式
|
|
268
|
+
pnpm verify:package # 检查 dist 和 npm 文件清单
|
|
269
|
+
pnpm pack:local # 构建、检查并生成本地 .tgz
|
|
270
|
+
pnpm release:check # 执行检查、测试、制品构建、校验和本地打包
|
|
271
|
+
pnpm preview # 预览生产构建
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## 当前范围
|
|
275
|
+
|
|
276
|
+
这是一个早期技术原型
|
|
277
|
+
|
|
278
|
+
公共 API 和设计文档格式尚未稳定
|
|
279
|
+
|
|
280
|
+
当前里程碑有意聚焦于一张纹理和一个可定制 Mesh
|
|
281
|
+
|
|
282
|
+
在 API 和 Design JSON 契约进入更稳定阶段前,公开 npm 版本统一使用 `alpha` dist-tag
|
|
283
|
+
|
|
284
|
+
多定制面、撤销与重做和框架适配器仍未实现。撤销与重做是下一阶段计划,并将复用 Design JSON 快照契约
|
|
285
|
+
|
|
286
|
+
## 技术栈
|
|
287
|
+
|
|
288
|
+
- [Fabric.js](https://fabricjs.com/):二维编辑画布
|
|
289
|
+
- [Three.js](https://threejs.org/):模型加载和实时三维渲染
|
|
290
|
+
- [Vite](https://vite.dev/):开发环境和应用构建
|
|
291
|
+
- [TypeScript](https://www.typescriptlang.org/):启用严格类型检查
|
|
292
|
+
|
|
293
|
+
## 开源协议
|
|
294
|
+
|
|
295
|
+
CustomForge 依据 Apache License 2.0 开源
|
|
296
|
+
|
|
297
|
+
完整协议内容请参阅 [LICENSE](./LICENSE)
|
|
298
|
+
|
|
299
|
+
第三方依赖和资产仍遵循各自的许可条款
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CanvasTexture } from 'three';
|
|
2
|
+
import type { DesignEditor } from '../editor/DesignEditor';
|
|
3
|
+
import type { ProductViewer } from '../viewer/ProductViewer';
|
|
4
|
+
/**
|
|
5
|
+
* 将二维编辑画布转换为 Three.js 实时纹理
|
|
6
|
+
*
|
|
7
|
+
* 多次画布渲染会合并到下一个动画帧,避免重复标记纹理更新
|
|
8
|
+
*/
|
|
9
|
+
export declare class TextureBridge {
|
|
10
|
+
/** 绑定到三维产品材质的实时 CanvasTexture */
|
|
11
|
+
readonly texture: CanvasTexture;
|
|
12
|
+
private readonly stopListening;
|
|
13
|
+
private updateFrame;
|
|
14
|
+
/**
|
|
15
|
+
* @param editor 提供底层 HTML Canvas 和渲染事件的二维编辑器
|
|
16
|
+
* @param viewer 接收实时纹理的三维查看器
|
|
17
|
+
* @param flipY 是否垂直翻转纹理
|
|
18
|
+
*/
|
|
19
|
+
constructor(editor: DesignEditor, viewer: ProductViewer, flipY: boolean);
|
|
20
|
+
/**
|
|
21
|
+
* 更新纹理垂直翻转状态并立即标记刷新
|
|
22
|
+
*
|
|
23
|
+
* @param flipY 是否垂直翻转纹理
|
|
24
|
+
*/
|
|
25
|
+
setFlipY(flipY: boolean): void;
|
|
26
|
+
/** 取消编辑器订阅、动画帧并释放 CanvasTexture */
|
|
27
|
+
destroy(): void;
|
|
28
|
+
/** 将同一帧内的多次画布渲染合并为一次纹理更新 */
|
|
29
|
+
private scheduleUpdate;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=TextureBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextureBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TextureBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,OAAO,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE5D;;;;GAIG;AACH,qBAAa,aAAa;IACxB,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,WAAW,CAAI;IAEvB;;;;OAIG;IACH,YAAY,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAStE;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAG7B;IAED,mCAAmC;IACnC,OAAO,IAAI,IAAI,CAId;IAED,4BAA4B;IAC5B,OAAO,CAAC,cAAc;CAUvB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ProductConfiguration } from './types';
|
|
2
|
+
/** 默认接收实时纹理的 Mesh 名称 */
|
|
3
|
+
export declare const DEFAULT_SURFACE_MESH = "PrintArea";
|
|
4
|
+
/**
|
|
5
|
+
* 完成默认值补全后的内部产品配置
|
|
6
|
+
*/
|
|
7
|
+
export interface NormalizedProductConfiguration {
|
|
8
|
+
/** 清理空白后的模型地址 */
|
|
9
|
+
modelUrl?: string;
|
|
10
|
+
/** 清理空白后的基础纹理地址 */
|
|
11
|
+
textureUrl?: string;
|
|
12
|
+
/** 接收实时纹理的 Mesh 名称 */
|
|
13
|
+
surfaceMesh: string;
|
|
14
|
+
/** 是否垂直翻转 CanvasTexture */
|
|
15
|
+
textureFlipY: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 清理产品配置并补全运行所需的默认值
|
|
19
|
+
*
|
|
20
|
+
* 远程模型默认不翻转纹理,内置演示模型默认翻转纹理
|
|
21
|
+
*
|
|
22
|
+
* @param product 外部传入的产品配置
|
|
23
|
+
* @returns 可以直接交给编辑器和查看器使用的完整配置
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeProductConfiguration(product?: ProductConfiguration): NormalizedProductConfiguration;
|
|
26
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,wBAAwB;AACxB,eAAO,MAAM,oBAAoB,cAAc,CAAA;AAE/C;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,mBAAmB;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAA;IAEnB,2BAA2B;IAC3B,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,oBAAyB,GACjC,8BAA8B,CAWhC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DesignDocument } from './types';
|
|
2
|
+
/** 当前支持的 Design JSON Schema 版本 */
|
|
3
|
+
export declare const DESIGN_SCHEMA_VERSION = 1;
|
|
4
|
+
/**
|
|
5
|
+
* 校验并净化外部 Design JSON
|
|
6
|
+
*
|
|
7
|
+
* @param value JSON.parse 结果或其他未知输入
|
|
8
|
+
* @returns 只包含当前 Schema 字段的新设计文档
|
|
9
|
+
* @throws 文档版本、字段类型、对象 ID 或图片来源不符合契约时抛出 TypeError
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseDesignDocument(value: unknown): DesignDocument;
|
|
12
|
+
//# sourceMappingURL=design.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/core/design.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,SAAS,CAAA;AAEhB,kCAAkC;AAClC,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAyFtC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CA4BlE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ElementTarget } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 将 HTMLElement 或 CSS 选择器解析为挂载容器
|
|
4
|
+
*
|
|
5
|
+
* @param target DOM 元素或 CSS 选择器
|
|
6
|
+
* @param label 错误消息中使用的容器名称
|
|
7
|
+
* @returns 解析得到的 DOM 元素
|
|
8
|
+
* @throws CSS 选择器无法找到对应元素时抛出错误
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveElement(target: ElementTarget, label: string): HTMLElement;
|
|
11
|
+
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/core/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAWhF"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM 元素或用于查找元素的 CSS 选择器
|
|
3
|
+
*/
|
|
4
|
+
export type ElementTarget = HTMLElement | string;
|
|
5
|
+
/**
|
|
6
|
+
* 产品配置
|
|
7
|
+
*/
|
|
8
|
+
export interface ProductConfiguration {
|
|
9
|
+
/** GLB 或 GLTF 模型的远程地址,不传时使用内置演示模型 */
|
|
10
|
+
modelUrl?: string;
|
|
11
|
+
/** 二维编辑器使用的可选基础纹理地址 */
|
|
12
|
+
textureUrl?: string;
|
|
13
|
+
/** 接收实时纹理的模型 Mesh 名称,默认为 PrintArea */
|
|
14
|
+
surfaceMesh?: string;
|
|
15
|
+
/** 是否在映射到三维模型前垂直翻转纹理 */
|
|
16
|
+
textureFlipY?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 产品定制器初始化配置
|
|
20
|
+
*/
|
|
21
|
+
export interface CustomizerOptions {
|
|
22
|
+
/** 二维编辑器的挂载元素或 CSS 选择器 */
|
|
23
|
+
editor: ElementTarget;
|
|
24
|
+
/** 三维查看器的挂载元素或 CSS 选择器 */
|
|
25
|
+
viewer: ElementTarget;
|
|
26
|
+
/** 二维编辑画布的逻辑宽度,单位为像素,默认为 1024 */
|
|
27
|
+
editorWidth?: number;
|
|
28
|
+
/** 二维编辑画布的逻辑高度,单位为像素,默认为 512 */
|
|
29
|
+
editorHeight?: number;
|
|
30
|
+
/** 初始化时加载的产品配置 */
|
|
31
|
+
product?: ProductConfiguration;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 添加文字时使用的配置
|
|
35
|
+
*
|
|
36
|
+
* 创建后和用户变换期间,文字包围盒会自动约束在编辑画布内
|
|
37
|
+
*/
|
|
38
|
+
export interface AddTextOptions {
|
|
39
|
+
/** 文字内容 */
|
|
40
|
+
text?: string;
|
|
41
|
+
/** 文字左上角在画布中的横坐标,单位为像素,越界时自动修正 */
|
|
42
|
+
x?: number;
|
|
43
|
+
/** 文字左上角在画布中的纵坐标,单位为像素,越界时自动修正 */
|
|
44
|
+
y?: number;
|
|
45
|
+
/** 文字编辑框宽度,单位为像素,包围盒过大时会等比缩小 */
|
|
46
|
+
width?: number;
|
|
47
|
+
/** 字体名称 */
|
|
48
|
+
fontFamily?: string;
|
|
49
|
+
/** 字体大小,单位为像素 */
|
|
50
|
+
fontSize?: number;
|
|
51
|
+
/** 文字颜色,支持 CSS 颜色值 */
|
|
52
|
+
color?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 添加图片时使用的配置
|
|
56
|
+
*
|
|
57
|
+
* 创建后和用户变换期间,图片包围盒会自动约束在编辑画布内
|
|
58
|
+
*/
|
|
59
|
+
export interface AddImageOptions {
|
|
60
|
+
/** 图片地址,支持远程地址、Data URL 和 Blob URL */
|
|
61
|
+
src: string;
|
|
62
|
+
/** 图片中心在画布中的横坐标,单位为像素,越界时自动修正 */
|
|
63
|
+
x?: number;
|
|
64
|
+
/** 图片中心在画布中的纵坐标,单位为像素,越界时自动修正 */
|
|
65
|
+
y?: number;
|
|
66
|
+
/** 图片添加到画布后的显示宽度,单位为像素,包围盒过大时会等比缩小 */
|
|
67
|
+
width?: number;
|
|
68
|
+
}
|
|
69
|
+
/** Design JSON 使用的画布逻辑尺寸 */
|
|
70
|
+
export interface DesignCanvas {
|
|
71
|
+
/** 画布逻辑宽度,单位为像素 */
|
|
72
|
+
width: number;
|
|
73
|
+
/** 画布逻辑高度,单位为像素 */
|
|
74
|
+
height: number;
|
|
75
|
+
}
|
|
76
|
+
/** Design JSON 中所有可编辑对象共用的变换 */
|
|
77
|
+
export interface DesignObjectTransform {
|
|
78
|
+
/** 对象中心在画布中的横坐标,单位为像素 */
|
|
79
|
+
x: number;
|
|
80
|
+
/** 对象中心在画布中的纵坐标,单位为像素 */
|
|
81
|
+
y: number;
|
|
82
|
+
/** 对象相对于原始尺寸的横向缩放倍数 */
|
|
83
|
+
scaleX: number;
|
|
84
|
+
/** 对象相对于原始尺寸的纵向缩放倍数 */
|
|
85
|
+
scaleY: number;
|
|
86
|
+
/** 对象顺时针旋转角度,单位为度 */
|
|
87
|
+
rotation: number;
|
|
88
|
+
/** 是否沿对象自身横轴翻转 */
|
|
89
|
+
flipX: boolean;
|
|
90
|
+
/** 是否沿对象自身纵轴翻转 */
|
|
91
|
+
flipY: boolean;
|
|
92
|
+
}
|
|
93
|
+
/** Design JSON 中的文字对象 */
|
|
94
|
+
export interface TextDesignObject {
|
|
95
|
+
/** 文档内稳定且唯一的对象标识 */
|
|
96
|
+
id: string;
|
|
97
|
+
/** 用于区分联合类型的对象种类 */
|
|
98
|
+
type: 'text';
|
|
99
|
+
/** 对象位置和变换 */
|
|
100
|
+
transform: DesignObjectTransform;
|
|
101
|
+
/** 文字内容,可以为空字符串 */
|
|
102
|
+
text: string;
|
|
103
|
+
/** 未应用缩放前的文字编辑框宽度,单位为像素 */
|
|
104
|
+
width: number;
|
|
105
|
+
/** 字体名称,恢复时依赖消费页面提供对应字体 */
|
|
106
|
+
fontFamily: string;
|
|
107
|
+
/** 未应用缩放前的字体大小,单位为像素 */
|
|
108
|
+
fontSize: number;
|
|
109
|
+
/** 文字颜色,仅保存 CSS 字符串颜色 */
|
|
110
|
+
color: string;
|
|
111
|
+
}
|
|
112
|
+
/** Design JSON 中的图片对象 */
|
|
113
|
+
export interface ImageDesignObject {
|
|
114
|
+
/** 文档内稳定且唯一的对象标识 */
|
|
115
|
+
id: string;
|
|
116
|
+
/** 用于区分联合类型的对象种类 */
|
|
117
|
+
type: 'image';
|
|
118
|
+
/** 对象位置和变换 */
|
|
119
|
+
transform: DesignObjectTransform;
|
|
120
|
+
/** 可重新加载的远程 URL 或 Data URL,不允许短生命周期 Blob URL */
|
|
121
|
+
src: string;
|
|
122
|
+
}
|
|
123
|
+
/** Design JSON 当前支持的可编辑对象 */
|
|
124
|
+
export type DesignObject = TextDesignObject | ImageDesignObject;
|
|
125
|
+
/**
|
|
126
|
+
* 可持久化并恢复的单画布设计文档
|
|
127
|
+
*
|
|
128
|
+
* 只包含二维可编辑对象,不包含产品模型、目标 Mesh 或基础纹理配置
|
|
129
|
+
*/
|
|
130
|
+
export interface DesignDocument {
|
|
131
|
+
/** Schema 版本,当前固定为 1 */
|
|
132
|
+
version: 1;
|
|
133
|
+
/** 保存设计时使用的逻辑画布尺寸 */
|
|
134
|
+
canvas: DesignCanvas;
|
|
135
|
+
/** 按渲染层级从后到前排列的可编辑对象 */
|
|
136
|
+
objects: DesignObject[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 产品定制器事件及其载荷
|
|
140
|
+
*/
|
|
141
|
+
export interface CustomizerEventMap {
|
|
142
|
+
/** 二维设计发生变化 */
|
|
143
|
+
change: {
|
|
144
|
+
objectCount: number;
|
|
145
|
+
};
|
|
146
|
+
/** 模型、纹理或图片处理失败 */
|
|
147
|
+
error: {
|
|
148
|
+
error: Error;
|
|
149
|
+
};
|
|
150
|
+
/** 产品模型和纹理完成加载 */
|
|
151
|
+
ready: {
|
|
152
|
+
product: ProductConfiguration;
|
|
153
|
+
};
|
|
154
|
+
/** 二维编辑器的选中状态发生变化 */
|
|
155
|
+
selectionchange: {
|
|
156
|
+
hasSelection: boolean;
|
|
157
|
+
};
|
|
158
|
+
/** 加载或运行状态发生变化 */
|
|
159
|
+
status: {
|
|
160
|
+
message: string;
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 产品定制器支持的事件名称
|
|
165
|
+
*/
|
|
166
|
+
export type CustomizerEventName = keyof CustomizerEventMap;
|
|
167
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { AddImageOptions, AddTextOptions, CustomizerEventMap, CustomizerEventName, CustomizerOptions, DesignDocument, ProductConfiguration } from '../core/types';
|
|
2
|
+
type EventListener<K extends CustomizerEventName> = (detail: CustomizerEventMap[K]) => void;
|
|
3
|
+
/**
|
|
4
|
+
* 统一管理二维编辑器、三维查看器和实时纹理同步
|
|
5
|
+
*
|
|
6
|
+
* 仅支持具有 DOM、Canvas、WebGL 和 ResizeObserver 的浏览器环境
|
|
7
|
+
* 每个实例独立持有 DOM 事件、Fabric 状态和 WebGL 资源
|
|
8
|
+
* 不再使用实例时必须调用 `destroy()`
|
|
9
|
+
*/
|
|
10
|
+
export declare class ProductCustomizer {
|
|
11
|
+
private readonly events;
|
|
12
|
+
private readonly textureBridge;
|
|
13
|
+
private readonly editor;
|
|
14
|
+
private readonly viewer;
|
|
15
|
+
private product;
|
|
16
|
+
private readonly stopSelectionListener;
|
|
17
|
+
private readonly stopRenderListener;
|
|
18
|
+
private destroyed;
|
|
19
|
+
private constructor();
|
|
20
|
+
/**
|
|
21
|
+
* 创建实例并完成初始产品加载
|
|
22
|
+
*
|
|
23
|
+
* @param options 产品定制器初始化配置
|
|
24
|
+
* @returns 初始化完成的产品定制器实例
|
|
25
|
+
* @throws DOM 容器无效或初始化失败时释放已创建资源并继续抛出原始错误
|
|
26
|
+
*/
|
|
27
|
+
static create(options: CustomizerOptions): Promise<ProductCustomizer>;
|
|
28
|
+
/**
|
|
29
|
+
* 订阅产品定制器事件
|
|
30
|
+
*
|
|
31
|
+
* @param event 事件名称
|
|
32
|
+
* @param listener 接收对应事件载荷的监听函数
|
|
33
|
+
* @returns 用于取消本次订阅的函数
|
|
34
|
+
*/
|
|
35
|
+
on<K extends CustomizerEventName>(event: K, listener: EventListener<K>): () => void;
|
|
36
|
+
/**
|
|
37
|
+
* 在二维画布中添加并选中一个文字对象
|
|
38
|
+
*
|
|
39
|
+
* 创建后和用户变换期间,对象会自动缩放或平移以保持完整可见
|
|
40
|
+
*
|
|
41
|
+
* @param options 文字内容、位置和样式配置
|
|
42
|
+
*/
|
|
43
|
+
addText(options?: AddTextOptions): void;
|
|
44
|
+
/**
|
|
45
|
+
* 加载图片并将其添加到二维画布
|
|
46
|
+
*
|
|
47
|
+
* 创建后和用户变换期间,对象会自动缩放或平移以保持完整可见
|
|
48
|
+
*
|
|
49
|
+
* @param options 图片地址、位置和显示宽度
|
|
50
|
+
* @throws 图片无法访问、加载失败或被 CORS 策略阻止时抛出错误
|
|
51
|
+
*/
|
|
52
|
+
addImage(options: AddImageOptions): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* 删除二维编辑器中的当前对象或选区
|
|
55
|
+
*
|
|
56
|
+
* @returns 是否删除了至少一个对象
|
|
57
|
+
*/
|
|
58
|
+
deleteSelected(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* 创建当前二维设计的版本化 JSON 快照
|
|
61
|
+
*
|
|
62
|
+
* 快照不包含产品模型、目标 Mesh 或基础纹理配置
|
|
63
|
+
* Blob URL 图片会在添加时转换为 Data URL,因此返回值可以跨页面会话保存
|
|
64
|
+
*
|
|
65
|
+
* @returns 可以安全传给 JSON.stringify 的 DesignDocument
|
|
66
|
+
* @throws 设计中存在不支持的对象或文字填充时抛出错误
|
|
67
|
+
*/
|
|
68
|
+
saveDesign(): DesignDocument;
|
|
69
|
+
/**
|
|
70
|
+
* 校验并恢复版本化 Design JSON
|
|
71
|
+
*
|
|
72
|
+
* 图片全部加载成功后才替换当前二维对象,产品和基础纹理保持不变
|
|
73
|
+
* 输入画布尺寸必须与当前编辑器的逻辑尺寸完全一致
|
|
74
|
+
*
|
|
75
|
+
* @param value JSON.parse 结果或符合 DesignDocument 的对象
|
|
76
|
+
* @throws Schema 无效、画布尺寸不匹配或图片加载失败时抛出错误
|
|
77
|
+
*/
|
|
78
|
+
loadDesign(value: unknown): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* 将当前二维设计合成为 PNG 并触发浏览器下载
|
|
81
|
+
*
|
|
82
|
+
* @param filename 下载文件名,默认为 `custom-texture.png`
|
|
83
|
+
* @throws 远程图片污染 Canvas 时可能抛出安全错误
|
|
84
|
+
*/
|
|
85
|
+
exportTexture(filename?: string): void;
|
|
86
|
+
/** 恢复三维产品的默认相机位置 */
|
|
87
|
+
resetView(): void;
|
|
88
|
+
/**
|
|
89
|
+
* 更换模型、基础纹理和接收纹理的目标 Mesh
|
|
90
|
+
*
|
|
91
|
+
* @param product 新的产品配置
|
|
92
|
+
* @throws 模型或纹理加载失败、目标 Mesh 不存在时抛出错误
|
|
93
|
+
*/
|
|
94
|
+
loadProduct(product: ProductConfiguration): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* 释放事件监听、Fabric Canvas、纹理和 WebGL 资源
|
|
97
|
+
*
|
|
98
|
+
* 重复调用不会再次释放资源,首次调用后不得继续使用其他实例方法
|
|
99
|
+
*/
|
|
100
|
+
destroy(): void;
|
|
101
|
+
private initialize;
|
|
102
|
+
private emit;
|
|
103
|
+
private reportError;
|
|
104
|
+
}
|
|
105
|
+
export {};
|
|
106
|
+
//# sourceMappingURL=ProductCustomizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductCustomizer.d.ts","sourceRoot":"","sources":["../../src/customizer/ProductCustomizer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACrB,MAAM,eAAe,CAAA;AAKtB,KAAK,aAAa,CAAC,CAAC,SAAS,mBAAmB,IAAI,CAClD,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAC1B,IAAI,CAAA;AAET;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,OAAO,CAAkD;IACjE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAY;IAC/C,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,eA0BN;IAED;;;;;;OAMG;IACH,OAAa,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAS1E;IAED;;;;;;OAMG;IACH,EAAE,CAAC,CAAC,SAAS,mBAAmB,EAC9B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,MAAM,IAAI,CAMZ;IAED;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAEtC;IAED;;;;;;;OAOG;IACG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtD;IAED;;;;OAIG;IACH,cAAc,IAAI,OAAO,CAExB;IAED;;;;;;;;OAQG;IACH,UAAU,IAAI,cAAc,CAE3B;IAED;;;;;;;;OAQG;IACG,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9C;IAED;;;;;OAKG;IACH,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAErC;IAED,oBAAoB;IACpB,SAAS,IAAI,IAAI,CAEhB;IAED;;;;;OAKG;IACG,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9D;IAED;;;;OAIG;IACH,OAAO,IAAI,IAAI,CAWd;YAEa,UAAU;IAOxB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,WAAW;CAKpB"}
|