three-editor-ai 0.0.0-stage → 0.0.1
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/declare/addons.d.ts +88 -0
- package/declare/component.d.ts +158 -0
- package/declare/events.d.ts +102 -0
- package/declare/index.d.ts +17 -0
- package/declare/main.d.ts +287 -0
- package/declare/modules.d.ts +577 -0
- package/dist/index.js +10698 -0
- package/index.d.ts +31 -0
- package/package.json +41 -5
- package/README.md +0 -3
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type * as THREE from "three";
|
|
2
|
+
|
|
3
|
+
/* ------------------------------------------------------------------ *
|
|
4
|
+
* 内置核心 id
|
|
5
|
+
* ------------------------------------------------------------------ */
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 内置组件(核心)id。
|
|
9
|
+
* 其中仅 `model` 提供了 `install` 级服务,其余安装后为 `{}`。
|
|
10
|
+
*/
|
|
11
|
+
export type BuiltinCoreId =
|
|
12
|
+
| "inner"
|
|
13
|
+
| "light"
|
|
14
|
+
| "model"
|
|
15
|
+
| "mirror"
|
|
16
|
+
| "lightColumn";
|
|
17
|
+
|
|
18
|
+
/* ------------------------------------------------------------------ *
|
|
19
|
+
* 内置特效
|
|
20
|
+
* ------------------------------------------------------------------ */
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 内置后期特效 id(随包注册的子集)。
|
|
24
|
+
* `outlinePass` / `outputPass` 默认启用。
|
|
25
|
+
*/
|
|
26
|
+
export type BuiltinEffectId = "outlinePass" | "outputPass";
|
|
27
|
+
|
|
28
|
+
/* ------------------------------------------------------------------ *
|
|
29
|
+
* 模型核心(cores.model)
|
|
30
|
+
* ------------------------------------------------------------------ */
|
|
31
|
+
|
|
32
|
+
/** 模型信息,用于 `cores.model.loadModel` */
|
|
33
|
+
export interface ModelInfo {
|
|
34
|
+
url: string;
|
|
35
|
+
|
|
36
|
+
/** 传字符串给 `loadModel` 时按扩展名推断;传对象时需自带 */
|
|
37
|
+
type?: "FBX" | "GLB" | "GLTF" | "OBJ";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** 加载进度回调集合 */
|
|
41
|
+
export interface LoaderService {
|
|
42
|
+
/** `ratio` 为 `loaded / total` */
|
|
43
|
+
progress?: (ratio: number, xhr: { loaded: number; total: number }) => void;
|
|
44
|
+
|
|
45
|
+
complete?: (object: THREE.Object3D) => void;
|
|
46
|
+
|
|
47
|
+
error?: (error: unknown) => void;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** 动画播放参数(`modelAnimationPlay` 运行时会读取 `actionIndexs`) */
|
|
51
|
+
export interface AnimationPlayQuery {
|
|
52
|
+
/** 是否立即播放(存档还原时用) */
|
|
53
|
+
initPlay?: boolean;
|
|
54
|
+
|
|
55
|
+
/** 播放速度 */
|
|
56
|
+
speed?: number;
|
|
57
|
+
|
|
58
|
+
/** 起始时间 */
|
|
59
|
+
startTime?: number;
|
|
60
|
+
|
|
61
|
+
/** 是否循环 */
|
|
62
|
+
loop?: boolean;
|
|
63
|
+
|
|
64
|
+
/** 按索引指定要播放的动画;缺省或非数组时运行时会抛错 */
|
|
65
|
+
actionIndexs: boolean[];
|
|
66
|
+
|
|
67
|
+
/** 逐帧回调(无参,在 mixer 更新前调用) */
|
|
68
|
+
frameCallback?: () => void;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** `cores.model` 提供的编辑器级服务 */
|
|
72
|
+
export interface ModelCore {
|
|
73
|
+
/** 缺省模型地址 */
|
|
74
|
+
url: string;
|
|
75
|
+
|
|
76
|
+
progressList: unknown[];
|
|
77
|
+
|
|
78
|
+
/** 加载模型,返回模型信息与加载器服务 */
|
|
79
|
+
loadModel(
|
|
80
|
+
val: string | ModelInfo,
|
|
81
|
+
): { modelInfo: ModelInfo; loaderService: LoaderService } | undefined;
|
|
82
|
+
|
|
83
|
+
/** 播放模型内置动画;`query.actionIndexs` 必填 */
|
|
84
|
+
modelAnimationPlay(
|
|
85
|
+
group: THREE.Object3D,
|
|
86
|
+
query: AnimationPlayQuery,
|
|
87
|
+
): { actions: THREE.AnimationAction[]; mixer: THREE.AnimationMixer };
|
|
88
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type * as THREE from "three";
|
|
2
|
+
import type { GUI } from "lil-gui";
|
|
3
|
+
import type { EditorContext } from "./main";
|
|
4
|
+
|
|
5
|
+
/** 带编辑器类型标记的场景物体(创建完成后由内核写入 `editorType`) */
|
|
6
|
+
export interface ComponentRoot extends EditorObject3D {
|
|
7
|
+
editorType: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 编辑器在 `Object3D` 上挂载的运行时字段(克隆关系、组件类型)。
|
|
12
|
+
* 加入 / 移出场景请订阅 `scene-add` / `scene-remove`;
|
|
13
|
+
* 组件根节点移除另见 `component-remove`。
|
|
14
|
+
*/
|
|
15
|
+
export interface EditorObject3D extends THREE.Object3D {
|
|
16
|
+
editorType?: string;
|
|
17
|
+
|
|
18
|
+
/** 由本物体克隆出的实例列表 */
|
|
19
|
+
clones?: EditorObject3D[];
|
|
20
|
+
|
|
21
|
+
/** 若自身为克隆体,指向源物体 */
|
|
22
|
+
ORIGINAL?: EditorObject3D;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* `Component.meta` 的配置类型。`function` 调用实例方法,不写入存档。
|
|
27
|
+
* `texture` 对应图片 URL 字符串或 `null`;面板显示图片预览和 URL 编辑框,清空时写入 `null`。
|
|
28
|
+
* 纹理加载、替换和释放由组件属性 setter 处理。
|
|
29
|
+
*/
|
|
30
|
+
export type ComponentMetaType =
|
|
31
|
+
| "number"
|
|
32
|
+
| "boolean"
|
|
33
|
+
| "string"
|
|
34
|
+
| "vec2"
|
|
35
|
+
| "vec3"
|
|
36
|
+
| "vec4"
|
|
37
|
+
| "euler"
|
|
38
|
+
| "color"
|
|
39
|
+
| "texture"
|
|
40
|
+
| "select"
|
|
41
|
+
| "function";
|
|
42
|
+
|
|
43
|
+
export interface ComponentMetaOption {
|
|
44
|
+
label: string;
|
|
45
|
+
|
|
46
|
+
value: unknown;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 组件可配置字段约定,由宿主依据 `meta` 生成控件。
|
|
51
|
+
* `key` 支持 `position`、`children.0.material.color` 等路径,必须指向真实属性或方法。
|
|
52
|
+
* `meta.init` 的路径相对于组件的 `initParams`,省略 `initParams.` 前缀;
|
|
53
|
+
* `meta.props` 的路径相对于 `create` 返回的实例根节点。
|
|
54
|
+
* 宿主直接写入属性;需要重建几何等副作用时,由实例属性的 setter 处理。
|
|
55
|
+
*/
|
|
56
|
+
export interface ComponentMeta {
|
|
57
|
+
key: string;
|
|
58
|
+
|
|
59
|
+
type: ComponentMetaType;
|
|
60
|
+
|
|
61
|
+
label?: string;
|
|
62
|
+
|
|
63
|
+
min?: number;
|
|
64
|
+
|
|
65
|
+
max?: number;
|
|
66
|
+
|
|
67
|
+
step?: number;
|
|
68
|
+
|
|
69
|
+
/** `euler` 可用,例如 `"deg"`;Three.js 内部单位仍是弧度 */
|
|
70
|
+
unit?: string;
|
|
71
|
+
|
|
72
|
+
options?: ComponentMetaOption[];
|
|
73
|
+
|
|
74
|
+
default?: unknown;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** 可配置项声明;声明数据不要求组件实现面板。 */
|
|
78
|
+
export interface ComponentMetadata {
|
|
79
|
+
/**
|
|
80
|
+
* 创建前的参数,固定映射到组件的 `initParams`;宿主临时赋值后调用 `create`。
|
|
81
|
+
* `key: "count"` 对应 `initParams.count`,无需 `initParams.` 前缀,支持嵌套路径。
|
|
82
|
+
* 实例创建后不通过这些字段修改该实例。
|
|
83
|
+
*/
|
|
84
|
+
init?: ComponentMeta[];
|
|
85
|
+
|
|
86
|
+
/** 实例可配置属性,路径相对于 create 返回的根节点 */
|
|
87
|
+
props?: ComponentMeta[];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 自定义组件(核心)描述符。
|
|
92
|
+
* `id`、`description` 与 `create` 必填;`id` 已存在时 `installComponent` / `register('component', …)` 会被忽略。
|
|
93
|
+
* 面板接口均为可选;组件可以仅实现创建与存档逻辑。
|
|
94
|
+
*/
|
|
95
|
+
export interface Component {
|
|
96
|
+
/** 必填,唯一标识,同时作为 `cores[id]` 与 `object3D.editorType` */
|
|
97
|
+
id: string;
|
|
98
|
+
|
|
99
|
+
/** 面板显示名 */
|
|
100
|
+
name?: string;
|
|
101
|
+
|
|
102
|
+
/** 必填,组件描述,说明用途、可配置内容及行为 */
|
|
103
|
+
description: string;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 初始化默认参数;提供 `meta.init` 时应定义其字段对应的默认值。
|
|
107
|
+
* 宿主通过 `meta.init` 配置此对象,`create` 通过 `this.initParams` 读取。
|
|
108
|
+
* 创建时用存档覆盖默认值,例如 `{ ...this.initParams, ...storage }`。
|
|
109
|
+
*/
|
|
110
|
+
initParams?: Record<string, unknown>;
|
|
111
|
+
|
|
112
|
+
/** 编辑器级服务,返回值挂到 `cores[id]` */
|
|
113
|
+
install?: (ctx: EditorContext) => object;
|
|
114
|
+
|
|
115
|
+
/** 卸载时调用(`unInstallComponent`) */
|
|
116
|
+
unInstall?: (ctx: EditorContext) => void;
|
|
117
|
+
|
|
118
|
+
/** 初始参数面板(添加前) */
|
|
119
|
+
initPanel?: (folder: GUI, ctx: EditorContext) => void;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 必填,依据存档创建物体,可返回 Promise。
|
|
123
|
+
* `storage` 可能为 `null` / `undefined`;返回根对象,由内核设置 `editorType` 并加入场景。
|
|
124
|
+
* `storage` 为 `any`:各核心可收窄为自身存档结构(参数位置逆变,不宜用 unknown)。
|
|
125
|
+
*/
|
|
126
|
+
create: (
|
|
127
|
+
storage: any,
|
|
128
|
+
ctx: EditorContext,
|
|
129
|
+
) => THREE.Object3D | Promise<THREE.Object3D | null | undefined> | null | undefined;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 可选,渲染前更新场景中的每个组件实例。
|
|
133
|
+
* `root` 为 `create` 返回的实例根节点,可直接访问其数据和子对象,无需缓存实例引用。
|
|
134
|
+
* `delta` 为相邻渲染帧的间隔(秒);
|
|
135
|
+
* `elapsed` 为编辑器渲染循环启动后的累计时间(秒),所有实例共享。
|
|
136
|
+
* 实例移出场景或组件卸载后停止调用,无需自行注册 RAF 或场景帧回调。
|
|
137
|
+
*/
|
|
138
|
+
update?: (root: THREE.Object3D, delta: number, elapsed: number) => void;
|
|
139
|
+
|
|
140
|
+
/** 存档附加数据(与 `getMeshStorage` 合并),应为可序列化的自定义配置 */
|
|
141
|
+
getStorage?: (root: ComponentRoot, ctx: EditorContext) => Record<string, unknown>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* 还原附加数据(基础 mesh 字段由内核先还原);支持空存档及重复调用。
|
|
145
|
+
* `storage` 为 `any`:各核心可收窄为自身存档结构。
|
|
146
|
+
*/
|
|
147
|
+
setStorage?: (
|
|
148
|
+
root: ComponentRoot,
|
|
149
|
+
storage: any,
|
|
150
|
+
ctx: EditorContext,
|
|
151
|
+
) => void;
|
|
152
|
+
|
|
153
|
+
/** 单个物体的控制面板 */
|
|
154
|
+
setPanel?: (root: ComponentRoot, folder: GUI, ctx: EditorContext) => void;
|
|
155
|
+
|
|
156
|
+
/** 标识组件可配置的内容,见 `ComponentMetadata`;有可配置属性时应提供 */
|
|
157
|
+
meta?: ComponentMetadata;
|
|
158
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { Component, ComponentRoot, EditorObject3D } from "./component";
|
|
2
|
+
|
|
3
|
+
/* ------------------------------------------------------------------ *
|
|
4
|
+
* 已知事件数据
|
|
5
|
+
* ------------------------------------------------------------------ */
|
|
6
|
+
|
|
7
|
+
/** `component-register`:组件注册成功 */
|
|
8
|
+
export interface ComponentRegisterEventData {
|
|
9
|
+
component: Component;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** `component-create`:组件实例创建完成 */
|
|
13
|
+
export interface ComponentCreateEventData {
|
|
14
|
+
component: Component;
|
|
15
|
+
|
|
16
|
+
/** 创建完成并已加入场景的组件根节点 */
|
|
17
|
+
instance: ComponentRoot;
|
|
18
|
+
|
|
19
|
+
/** 创建时传入的存档;面板「添加」路径为 `null` */
|
|
20
|
+
storage: unknown;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** `component-remove`:组件根节点从场景移除 */
|
|
24
|
+
export interface ComponentRemoveEventData {
|
|
25
|
+
/** 对应的组件原型(`cores.SHEET[editorType]`) */
|
|
26
|
+
component: Component;
|
|
27
|
+
|
|
28
|
+
instance: ComponentRoot;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** `scene-add` / `scene-remove`:场景增删物体 */
|
|
32
|
+
export interface SceneObjectEventData {
|
|
33
|
+
object: EditorObject3D;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 编辑器内置事件表。
|
|
38
|
+
* 键为事件名,值为该事件回调收到的唯一数据参数。
|
|
39
|
+
* `scene.emit` 与编辑器 `emit` 是同一个函数。
|
|
40
|
+
*/
|
|
41
|
+
export interface EditorEventMap {
|
|
42
|
+
"component-register": ComponentRegisterEventData;
|
|
43
|
+
|
|
44
|
+
"component-create": ComponentCreateEventData;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 组件根节点移除完成时触发。
|
|
48
|
+
* 在 `scene-remove` 同步阶段由 cores 发出(`editorType` 能命中 `SHEET`)。
|
|
49
|
+
*/
|
|
50
|
+
"component-remove": ComponentRemoveEventData;
|
|
51
|
+
|
|
52
|
+
/** `scene.add` 完成后触发 */
|
|
53
|
+
"scene-add": SceneObjectEventData;
|
|
54
|
+
|
|
55
|
+
/** `scene.remove` 完成后触发 */
|
|
56
|
+
"scene-remove": SceneObjectEventData;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ------------------------------------------------------------------ *
|
|
60
|
+
* on / off / emit
|
|
61
|
+
* ------------------------------------------------------------------ */
|
|
62
|
+
|
|
63
|
+
/** 已知事件的监听回调 */
|
|
64
|
+
export type EditorEventListener<K extends keyof EditorEventMap> = (
|
|
65
|
+
data: EditorEventMap[K],
|
|
66
|
+
) => void;
|
|
67
|
+
|
|
68
|
+
/** 自定义(未知)事件的监听回调 */
|
|
69
|
+
export type EditorUnknownEventListener = (...payload: unknown[]) => void;
|
|
70
|
+
|
|
71
|
+
/** 挂在 `args` / `ThreeEditor` 上的事件操作(不暴露内部监听表) */
|
|
72
|
+
export interface EditorEventApi {
|
|
73
|
+
/** 订阅已知事件 */
|
|
74
|
+
on<K extends keyof EditorEventMap>(
|
|
75
|
+
type: K,
|
|
76
|
+
fn: EditorEventListener<K>,
|
|
77
|
+
): void;
|
|
78
|
+
|
|
79
|
+
/** 订阅自定义事件 */
|
|
80
|
+
on(type: string, fn: EditorUnknownEventListener): void;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 解除已知事件订阅。
|
|
84
|
+
* 省略 `fn` 时清空该 type 下全部监听。
|
|
85
|
+
*/
|
|
86
|
+
off<K extends keyof EditorEventMap>(
|
|
87
|
+
type: K,
|
|
88
|
+
fn?: EditorEventListener<K>,
|
|
89
|
+
): void;
|
|
90
|
+
|
|
91
|
+
/** 解除自定义事件订阅;省略 `fn` 时清空该 type 下全部监听 */
|
|
92
|
+
off(type: string, fn?: EditorUnknownEventListener): void;
|
|
93
|
+
|
|
94
|
+
/** 触发已知事件 */
|
|
95
|
+
emit<K extends keyof EditorEventMap>(
|
|
96
|
+
type: K,
|
|
97
|
+
data: EditorEventMap[K],
|
|
98
|
+
): void;
|
|
99
|
+
|
|
100
|
+
/** 触发自定义事件 */
|
|
101
|
+
emit(type: string, ...payload: unknown[]): void;
|
|
102
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 类型声明汇总。
|
|
3
|
+
* - `component`:组件协议、根对象与可选面板字段
|
|
4
|
+
* - `main`:编辑器上下文、组件管理器、存档与面板 API
|
|
5
|
+
* - `events`:事件名与载荷(组件注册/创建/移除,场景添加/移除)
|
|
6
|
+
* - `modules`:scene / camera / renderer / controls / effectComposer / handler 等运行时模块
|
|
7
|
+
* - `addons`:内置核心与内置后期特效
|
|
8
|
+
* - 主类 `ThreeEditor`:仅从 `lib/main` / 包根 `index.d.ts` 导出(保证值侧)
|
|
9
|
+
*/
|
|
10
|
+
export * from "./main";
|
|
11
|
+
export * from "./component";
|
|
12
|
+
export * from "./events";
|
|
13
|
+
export * from "./modules";
|
|
14
|
+
export * from "./addons";
|
|
15
|
+
|
|
16
|
+
export * as THREE from "three";
|
|
17
|
+
export { default as gsap } from "gsap";
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import type * as THREE from "three";
|
|
2
|
+
import type { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
3
|
+
import type { Controller, GUI } from "lil-gui";
|
|
4
|
+
import type { ModelCore } from "./addons";
|
|
5
|
+
import type { EditorEventApi } from "./events";
|
|
6
|
+
import type { Component, ComponentRoot } from "./component";
|
|
7
|
+
import type {
|
|
8
|
+
EditorScene,
|
|
9
|
+
EditorCamera,
|
|
10
|
+
EditorRenderer,
|
|
11
|
+
EditorTransformControls,
|
|
12
|
+
EditorEffectComposer,
|
|
13
|
+
EditorCSS2DRenderer,
|
|
14
|
+
EditorCSS3DRenderer,
|
|
15
|
+
EditorStats,
|
|
16
|
+
EditorHandler,
|
|
17
|
+
EditorHelpers,
|
|
18
|
+
EditorPass,
|
|
19
|
+
EffectPassStorage,
|
|
20
|
+
LoopRenderFn,
|
|
21
|
+
SceneStorage,
|
|
22
|
+
CameraStorage,
|
|
23
|
+
RendererStorage,
|
|
24
|
+
ControlsStorage,
|
|
25
|
+
TransformControlsStorage,
|
|
26
|
+
EffectComposerStorage,
|
|
27
|
+
HandlerStorage,
|
|
28
|
+
} from "./modules";
|
|
29
|
+
|
|
30
|
+
/** 兼容原有组件类型导入路径,声明统一维护在 component.d.ts。 */
|
|
31
|
+
export type * from "./component";
|
|
32
|
+
|
|
33
|
+
/** `new ThreeEditor(DOM, parameters)` 的第二个参数 */
|
|
34
|
+
export interface EditorParameters {
|
|
35
|
+
/** 渲染像素比,缺省取 `window.devicePixelRatio` */
|
|
36
|
+
pixelRatio?: number;
|
|
37
|
+
|
|
38
|
+
/** 透传给 `THREE.WebGLRenderer` 的参数,覆盖默认的 antialias / alpha / logarithmicDepthBuffer */
|
|
39
|
+
webglRenderParams?: THREE.WebGLRendererParameters;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 传入核心 / 面板 / 特效等扩展点的运行时上下文。
|
|
44
|
+
* 与内部 `args` 同形;组件 `create` / `install` 等收到的即此对象(含 `cores` / `handler`)。
|
|
45
|
+
*/
|
|
46
|
+
export interface EditorContext extends EditorEventApi {
|
|
47
|
+
scene: EditorScene;
|
|
48
|
+
|
|
49
|
+
camera: EditorCamera;
|
|
50
|
+
|
|
51
|
+
renderer: EditorRenderer;
|
|
52
|
+
|
|
53
|
+
controls: OrbitControls;
|
|
54
|
+
|
|
55
|
+
transformControls: EditorTransformControls;
|
|
56
|
+
|
|
57
|
+
effectComposer: EditorEffectComposer;
|
|
58
|
+
|
|
59
|
+
css3DRender: EditorCSS3DRenderer;
|
|
60
|
+
|
|
61
|
+
css2DRender: EditorCSS2DRenderer;
|
|
62
|
+
|
|
63
|
+
stats: EditorStats;
|
|
64
|
+
|
|
65
|
+
/** 挂载编辑器的容器 DOM */
|
|
66
|
+
DOM: HTMLElement;
|
|
67
|
+
|
|
68
|
+
/** 交互 / 按键 / 辅助工具管理 */
|
|
69
|
+
handler: EditorHandler;
|
|
70
|
+
|
|
71
|
+
/** 组件管理器 */
|
|
72
|
+
cores: Cores;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** 编辑器启动后挂到 `lil-gui` 原型上的方法(`lib/Van/Panel.js`) */
|
|
76
|
+
declare module "lil-gui" {
|
|
77
|
+
interface GUI {
|
|
78
|
+
/** 返回新建并打开的子文件夹,不是调用方自身 */
|
|
79
|
+
addOpenFolder(name: string): GUI;
|
|
80
|
+
|
|
81
|
+
addDateFolder(name: string): GUI;
|
|
82
|
+
|
|
83
|
+
/** 悬浮文件夹。缺省宽 `220`、高 `'auto'`。返回新建的子文件夹 */
|
|
84
|
+
addDragFolder(
|
|
85
|
+
name: string,
|
|
86
|
+
params?: { width?: number; height?: number | string },
|
|
87
|
+
): GUI;
|
|
88
|
+
|
|
89
|
+
addFn(fn: () => unknown, ...args: unknown[]): Controller;
|
|
90
|
+
|
|
91
|
+
addHexColor(color: THREE.Color): Controller;
|
|
92
|
+
|
|
93
|
+
destroyPanel(): void;
|
|
94
|
+
|
|
95
|
+
message(text: string, duration?: number): void;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 组件管理器(`editor.cores`)。
|
|
101
|
+
* 内置核心为 `inner` / `light` / `model` / `mirror` / `lightColumn`,
|
|
102
|
+
* 其中仅 `model` 提供了 `install` 级服务,其余为 `{}`。
|
|
103
|
+
*/
|
|
104
|
+
export interface Cores {
|
|
105
|
+
/** 已注册的描述符表 */
|
|
106
|
+
SHEET: Record<string, Component>;
|
|
107
|
+
|
|
108
|
+
/** 实例根到其 `update` 帧回调;移出场景或卸载时移除 */
|
|
109
|
+
UPDATEMAP: WeakMap<ComponentRoot, LoopRenderFn>;
|
|
110
|
+
|
|
111
|
+
/** 运行时缓存位(当前实现初始化为 `null`) */
|
|
112
|
+
storage: CoresStorage | null;
|
|
113
|
+
|
|
114
|
+
/** 注册组件,返回该核心的服务对象;`id` 已存在时返回 `undefined`(不重复 install) */
|
|
115
|
+
installComponent(descriptor: Component): object | undefined;
|
|
116
|
+
|
|
117
|
+
/** 按 id 与存档创建实例并加入场景 */
|
|
118
|
+
createComponent(
|
|
119
|
+
id: string,
|
|
120
|
+
storage?: unknown,
|
|
121
|
+
): Promise<ComponentRoot | undefined>;
|
|
122
|
+
|
|
123
|
+
/** 卸载组件:移除场景实例、调用 `unInstall`、清除注册表 */
|
|
124
|
+
unInstallComponent(id: string): void;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 存档还原时遇到未注册 id 的回调。
|
|
128
|
+
* 由 `ThreeEditor.needRegister` 注入。
|
|
129
|
+
*/
|
|
130
|
+
needRegisterComponentCallBack?: (id: string, storage: MeshStorage[]) => void;
|
|
131
|
+
|
|
132
|
+
/** 内置模型服务。构造时已安装;`unRegister('component', 'model')` 之后没有该字段 */
|
|
133
|
+
model?: ModelCore;
|
|
134
|
+
|
|
135
|
+
/** 各核心 `install` 返回值挂在对应 id 下 */
|
|
136
|
+
[id: string]: unknown;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* ------------------------------------------------------------------ *
|
|
140
|
+
* 存档结构
|
|
141
|
+
* ------------------------------------------------------------------ */
|
|
142
|
+
|
|
143
|
+
/** 序列化后的三维向量 */
|
|
144
|
+
export interface Vector3Like {
|
|
145
|
+
x: number;
|
|
146
|
+
y: number;
|
|
147
|
+
z: number;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** 序列化后的欧拉角(含 order) */
|
|
151
|
+
export interface EulerLike {
|
|
152
|
+
x: number;
|
|
153
|
+
y: number;
|
|
154
|
+
z: number;
|
|
155
|
+
order?: THREE.EulerOrder;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** 物体通用存档字段(Common/Mesh.js 序列化结果) */
|
|
159
|
+
export interface MeshStorage {
|
|
160
|
+
name?: string;
|
|
161
|
+
|
|
162
|
+
visible?: boolean;
|
|
163
|
+
|
|
164
|
+
renderOrder?: number;
|
|
165
|
+
|
|
166
|
+
castShadow?: boolean;
|
|
167
|
+
|
|
168
|
+
receiveShadow?: boolean;
|
|
169
|
+
|
|
170
|
+
frustumCulled?: boolean;
|
|
171
|
+
|
|
172
|
+
position?: Vector3Like;
|
|
173
|
+
|
|
174
|
+
rotation?: EulerLike;
|
|
175
|
+
|
|
176
|
+
scale?: Vector3Like;
|
|
177
|
+
|
|
178
|
+
/** 层遮罩,取 `layers.mask` */
|
|
179
|
+
layers?: number;
|
|
180
|
+
|
|
181
|
+
/** 克隆体存档 */
|
|
182
|
+
clones?: MeshStorage[];
|
|
183
|
+
|
|
184
|
+
/** 核心自定义字段由各自的 getStorage 追加(`editorType` 不在基础序列化里,由 cores 分组键体现) */
|
|
185
|
+
[key: string]: unknown;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** 键为核心 id,值为该核心下的物体存档。场景里没有实例的核心不会写入 */
|
|
189
|
+
export type CoresStorage = Record<string, MeshStorage[]>;
|
|
190
|
+
|
|
191
|
+
/** `getEditorStorage()` 的返回值,也是 `setEditorStorage()` 的入参 */
|
|
192
|
+
export interface EditorStorage {
|
|
193
|
+
scene: SceneStorage;
|
|
194
|
+
|
|
195
|
+
camera: CameraStorage;
|
|
196
|
+
|
|
197
|
+
renderer: RendererStorage;
|
|
198
|
+
|
|
199
|
+
controls: ControlsStorage;
|
|
200
|
+
|
|
201
|
+
transformControls: TransformControlsStorage;
|
|
202
|
+
|
|
203
|
+
effectComposer: EffectComposerStorage;
|
|
204
|
+
|
|
205
|
+
handler: HandlerStorage;
|
|
206
|
+
|
|
207
|
+
cores: CoresStorage;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* ------------------------------------------------------------------ *
|
|
211
|
+
* 面板 API
|
|
212
|
+
* ------------------------------------------------------------------ */
|
|
213
|
+
|
|
214
|
+
/** 直接构建各分组面板的底层接口,`openEditorPanel` 内部即调用它们 */
|
|
215
|
+
export interface PanelApi {
|
|
216
|
+
basicPanelApi: {
|
|
217
|
+
setRendererPanel(
|
|
218
|
+
renderer: EditorRenderer,
|
|
219
|
+
folder: GUI,
|
|
220
|
+
scene: EditorScene,
|
|
221
|
+
): void;
|
|
222
|
+
|
|
223
|
+
setScenePanel(scene: EditorScene, folder: GUI): void;
|
|
224
|
+
|
|
225
|
+
setCameraPanel(camera: EditorCamera, folder: GUI): void;
|
|
226
|
+
|
|
227
|
+
setControlsPanel(controls: OrbitControls, folder: GUI): void;
|
|
228
|
+
|
|
229
|
+
setTransformControlsPanel(
|
|
230
|
+
transformControls: EditorTransformControls,
|
|
231
|
+
folder: GUI,
|
|
232
|
+
): void;
|
|
233
|
+
|
|
234
|
+
setEffectComposerPanel(
|
|
235
|
+
effectComposer: EditorEffectComposer,
|
|
236
|
+
folder: GUI,
|
|
237
|
+
): void;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
handlerPanelApi: {
|
|
241
|
+
setStatsPanel(stats: EditorStats, folder: GUI): void;
|
|
242
|
+
|
|
243
|
+
setHelpersPanel(
|
|
244
|
+
scene: EditorScene,
|
|
245
|
+
transformControls: EditorTransformControls,
|
|
246
|
+
helpers: EditorHelpers,
|
|
247
|
+
folder: GUI,
|
|
248
|
+
): void;
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* ------------------------------------------------------------------ *
|
|
253
|
+
* 注册 / 依赖注入
|
|
254
|
+
* ------------------------------------------------------------------ */
|
|
255
|
+
|
|
256
|
+
/** `register` / `needRegister` 使用的模块类型 */
|
|
257
|
+
export type RegisterModuleType = "component" | "effect";
|
|
258
|
+
|
|
259
|
+
/** 构造结束时内置组件与特效注册表的快照(`editor.INNER_SHEETS`) */
|
|
260
|
+
export interface InnerSheets {
|
|
261
|
+
component: Record<string, Component>;
|
|
262
|
+
|
|
263
|
+
effect: Record<string, EditorPass>;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* `getSheetsByStorage` 的返回值。
|
|
268
|
+
* 只保留存档里出现、且不属于 `INNER_SHEETS` 的 id;当前未注册时值为 `undefined`。
|
|
269
|
+
*/
|
|
270
|
+
export interface StorageSheets {
|
|
271
|
+
component: Record<string, Component | undefined>;
|
|
272
|
+
|
|
273
|
+
effect: Record<string, EditorPass | undefined>;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 存档还原遇到未注册模块时的回调。
|
|
278
|
+
* 组件的 `storage` 是该 id 下的物体存档数组;特效的 `storage` 是单条 pass 存档。
|
|
279
|
+
*/
|
|
280
|
+
export interface NeedRegisterCallback {
|
|
281
|
+
(type: "component", id: string, storage: MeshStorage[]): void;
|
|
282
|
+
|
|
283
|
+
(type: "effect", id: string, storage: EffectPassStorage): void;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** `ThreeEditor.inject` 的依赖表:值为模块对象或 import map URL */
|
|
287
|
+
export type InjectDeps = Record<string, string | object>;
|