sa2kit 1.6.9 → 1.6.11

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 (149) hide show
  1. package/dist/ConfigService-BxK06xP6.d.mts +262 -0
  2. package/dist/ConfigService-BxK06xP6.d.ts +262 -0
  3. package/dist/UniversalFileService-BuHN-jrR.d.ts +515 -0
  4. package/dist/UniversalFileService-CGGzYeeF.d.mts +515 -0
  5. package/dist/analytics/index.d.mts +1084 -0
  6. package/dist/analytics/index.d.ts +1084 -0
  7. package/dist/analytics/server/index.d.mts +499 -0
  8. package/dist/analytics/server/index.d.ts +499 -0
  9. package/dist/api/index.d.mts +248 -0
  10. package/dist/api/index.d.ts +248 -0
  11. package/dist/audioDetection/index.d.mts +449 -0
  12. package/dist/audioDetection/index.d.ts +449 -0
  13. package/dist/auth/client/index.d.mts +32 -0
  14. package/dist/auth/client/index.d.ts +32 -0
  15. package/dist/auth/client/index.js +4 -4
  16. package/dist/auth/client/index.mjs +1 -1
  17. package/dist/auth/components/index.d.mts +227 -0
  18. package/dist/auth/components/index.d.ts +227 -0
  19. package/dist/auth/components/index.js +4 -4
  20. package/dist/auth/components/index.mjs +1 -1
  21. package/dist/auth/hooks/index.d.mts +31 -0
  22. package/dist/auth/hooks/index.d.ts +31 -0
  23. package/dist/auth/hooks/index.js +3 -3
  24. package/dist/auth/hooks/index.mjs +1 -1
  25. package/dist/auth/index.d.mts +41 -0
  26. package/dist/auth/index.d.ts +41 -0
  27. package/dist/auth/index.js +17 -36
  28. package/dist/auth/index.js.map +1 -1
  29. package/dist/auth/index.mjs +3 -33
  30. package/dist/auth/index.mjs.map +1 -1
  31. package/dist/auth/middleware/index.d.mts +75 -0
  32. package/dist/auth/middleware/index.d.ts +75 -0
  33. package/dist/auth/routes/index.d.mts +261 -0
  34. package/dist/auth/routes/index.d.ts +261 -0
  35. package/dist/auth/schema/index.d.mts +789 -0
  36. package/dist/auth/schema/index.d.ts +789 -0
  37. package/dist/auth/services/index.d.mts +48 -0
  38. package/dist/auth/services/index.d.ts +48 -0
  39. package/dist/base-api-client-B-yUCal3.d.ts +103 -0
  40. package/dist/base-api-client-BQ8ZPZjk.d.mts +103 -0
  41. package/dist/calendar/index.d.mts +1197 -0
  42. package/dist/calendar/index.d.ts +1197 -0
  43. package/dist/calendar/index.js +8 -8
  44. package/dist/calendar/index.js.map +1 -1
  45. package/dist/calendar/index.mjs +1 -1
  46. package/dist/calendar/index.mjs.map +1 -1
  47. package/dist/calendar/routes/index.d.mts +118 -0
  48. package/dist/calendar/routes/index.d.ts +118 -0
  49. package/dist/calendar/server.d.mts +1184 -0
  50. package/dist/calendar/server.d.ts +1184 -0
  51. package/dist/{chunk-ROEYW4A7.js → chunk-5QMBZP7S.js} +2 -2
  52. package/dist/chunk-5QMBZP7S.js.map +1 -0
  53. package/dist/chunk-6BZ3QFA5.mjs +33 -0
  54. package/dist/chunk-6BZ3QFA5.mjs.map +1 -0
  55. package/dist/{chunk-HEMA7SWK.mjs → chunk-6YKMCPQI.mjs} +2 -2
  56. package/dist/chunk-6YKMCPQI.mjs.map +1 -0
  57. package/dist/chunk-BH5TLVS5.mjs +1593 -0
  58. package/dist/chunk-BH5TLVS5.mjs.map +1 -0
  59. package/dist/chunk-E72D5KHY.js +1723 -0
  60. package/dist/chunk-E72D5KHY.js.map +1 -0
  61. package/dist/chunk-FAHLZIYQ.js +36 -0
  62. package/dist/chunk-FAHLZIYQ.js.map +1 -0
  63. package/dist/{chunk-KGRQNEIR.mjs → chunk-KW5JH6V6.mjs} +2 -2
  64. package/dist/chunk-KW5JH6V6.mjs.map +1 -0
  65. package/dist/{chunk-O26VCNS3.js → chunk-UOFTHYIH.js} +2 -2
  66. package/dist/chunk-UOFTHYIH.js.map +1 -0
  67. package/dist/config/index.d.mts +64 -0
  68. package/dist/config/index.d.ts +64 -0
  69. package/dist/config/server/index.d.mts +1533 -0
  70. package/dist/config/server/index.d.ts +1533 -0
  71. package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
  72. package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
  73. package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
  74. package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
  75. package/dist/enums-Dume-V5Y.d.mts +16 -0
  76. package/dist/enums-Dume-V5Y.d.ts +16 -0
  77. package/dist/i18n/index.d.mts +417 -0
  78. package/dist/i18n/index.d.ts +417 -0
  79. package/dist/imageCrop/index.d.mts +165 -0
  80. package/dist/imageCrop/index.d.ts +165 -0
  81. package/dist/index-DSel44Ke.d.mts +93 -0
  82. package/dist/index-DSel44Ke.d.ts +93 -0
  83. package/dist/index.d.mts +933 -0
  84. package/dist/index.d.ts +933 -0
  85. package/dist/index.js +1626 -2184
  86. package/dist/index.js.map +1 -1
  87. package/dist/index.mjs +708 -1543
  88. package/dist/index.mjs.map +1 -1
  89. package/dist/logger/index.d.mts +125 -0
  90. package/dist/logger/index.d.ts +125 -0
  91. package/dist/mmd/admin/index.d.mts +487 -0
  92. package/dist/mmd/admin/index.d.ts +487 -0
  93. package/dist/mmd/index.d.mts +1412 -0
  94. package/dist/mmd/index.d.ts +1412 -0
  95. package/dist/mmd/index.js +2695 -625
  96. package/dist/mmd/index.js.map +1 -1
  97. package/dist/mmd/index.mjs +2501 -448
  98. package/dist/mmd/index.mjs.map +1 -1
  99. package/dist/mmd/server/index.d.mts +138 -0
  100. package/dist/mmd/server/index.d.ts +138 -0
  101. package/dist/music/index.d.mts +74 -0
  102. package/dist/music/index.d.ts +74 -0
  103. package/dist/music/server/index.d.mts +1 -0
  104. package/dist/music/server/index.d.ts +1 -0
  105. package/dist/request/index.d.mts +51 -0
  106. package/dist/request/index.d.ts +51 -0
  107. package/dist/storage/index.d.mts +75 -0
  108. package/dist/storage/index.d.ts +75 -0
  109. package/dist/testYourself/admin/index.d.mts +58 -0
  110. package/dist/testYourself/admin/index.d.ts +58 -0
  111. package/dist/testYourself/index.d.mts +53 -0
  112. package/dist/testYourself/index.d.ts +53 -0
  113. package/dist/testYourself/server/index.d.mts +1029 -0
  114. package/dist/testYourself/server/index.d.ts +1029 -0
  115. package/dist/types-BB-7_WtE.d.mts +253 -0
  116. package/dist/types-BB-7_WtE.d.ts +253 -0
  117. package/dist/types-BINlP9MK.d.mts +286 -0
  118. package/dist/types-BINlP9MK.d.ts +286 -0
  119. package/dist/types-BaZccpvk.d.mts +48 -0
  120. package/dist/types-BaZccpvk.d.ts +48 -0
  121. package/dist/types-CK4We_aI.d.mts +270 -0
  122. package/dist/types-CK4We_aI.d.ts +270 -0
  123. package/dist/types-CbTsi9CZ.d.mts +31 -0
  124. package/dist/types-CbTsi9CZ.d.ts +31 -0
  125. package/dist/types-CiYK5Klf.d.mts +99 -0
  126. package/dist/types-D3R6GzOw.d.mts +70 -0
  127. package/dist/types-Dlu52uDy.d.ts +99 -0
  128. package/dist/types-iFeyR443.d.ts +70 -0
  129. package/dist/universalExport/index.d.mts +235 -0
  130. package/dist/universalExport/index.d.ts +235 -0
  131. package/dist/universalExport/server/index.d.mts +1270 -0
  132. package/dist/universalExport/server/index.d.ts +1270 -0
  133. package/dist/universalFile/index.d.mts +480 -0
  134. package/dist/universalFile/index.d.ts +480 -0
  135. package/dist/universalFile/server/index.d.mts +4516 -0
  136. package/dist/universalFile/server/index.d.ts +4516 -0
  137. package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
  138. package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
  139. package/dist/utils/index.d.mts +192 -0
  140. package/dist/utils/index.d.ts +192 -0
  141. package/package.json +2 -1
  142. package/dist/chunk-4FOBBWXW.mjs +0 -179
  143. package/dist/chunk-4FOBBWXW.mjs.map +0 -1
  144. package/dist/chunk-G6WRJ2H2.js +0 -187
  145. package/dist/chunk-G6WRJ2H2.js.map +0 -1
  146. package/dist/chunk-HEMA7SWK.mjs.map +0 -1
  147. package/dist/chunk-KGRQNEIR.mjs.map +0 -1
  148. package/dist/chunk-O26VCNS3.js.map +0 -1
  149. package/dist/chunk-ROEYW4A7.js.map +0 -1
@@ -0,0 +1,1412 @@
1
+ import { e as MMDPlayerBaseProps, f as MMDPlayerBaseRef, g as MMDPlayerEnhancedProps, h as MMDPlaylistProps, b as MMDPlaylistNode, d as MMDResources, i as MMDStage, j as MobileOptimization } from '../types-BB-7_WtE.mjs';
2
+ export { M as MMDPlaylistConfig, a as MMDResourceItem, c as MMDResourceOptions, O as OutlineOptions, R as ResourceOption } from '../types-BB-7_WtE.mjs';
3
+ import React__default from 'react';
4
+ import * as THREE from 'three';
5
+
6
+ declare const MMDPlayerBase: React__default.ForwardRefExoticComponent<MMDPlayerBaseProps & React__default.RefAttributes<MMDPlayerBaseRef>>;
7
+
8
+ declare const MMDPlayerEnhanced: React__default.FC<MMDPlayerEnhancedProps>;
9
+
10
+ /**
11
+ * MMDPlaylist - 播放列表管理器
12
+ *
13
+ * 核心功能:
14
+ * - 管理多个播放节点
15
+ * - 实现无缝切换(通过 key 变化触发组件重新挂载)
16
+ * - 预加载策略 (none / next / all)
17
+ * - 智能内存回收
18
+ * - 播放列表 UI
19
+ */
20
+ declare const MMDPlaylist: React__default.FC<MMDPlaylistProps>;
21
+
22
+ interface MMDPlayerEnhancedDebugInfoProps {
23
+ isPlaying: boolean;
24
+ isLooping: boolean;
25
+ isFullscreen: boolean;
26
+ showAxes: boolean;
27
+ isLoading: boolean;
28
+ currentResourceId?: string;
29
+ currentResourceName?: string;
30
+ mode: 'single' | 'list' | 'options';
31
+ totalResources: number;
32
+ }
33
+ declare const MMDPlayerEnhancedDebugInfo: React__default.FC<MMDPlayerEnhancedDebugInfoProps>;
34
+
35
+ interface MMDPlaylistDebugInfoProps {
36
+ playlistName: string;
37
+ currentIndex: number;
38
+ currentNode: MMDPlaylistNode;
39
+ totalNodes: number;
40
+ isPlaying: boolean;
41
+ isListLooping: boolean;
42
+ isNodeLooping: boolean;
43
+ preloadStrategy: 'none' | 'next' | 'all';
44
+ isLoading: boolean;
45
+ isFullscreen: boolean;
46
+ showAxes: boolean;
47
+ preloadedNodes: number[];
48
+ }
49
+ declare const MMDPlaylistDebugInfo: React__default.FC<MMDPlaylistDebugInfoProps>;
50
+
51
+ /**
52
+ * Ammo.js 加载器
53
+ * 用于异步加载 Ammo.js 物理引擎 (WASM 版本)
54
+ */
55
+ declare global {
56
+ interface Window {
57
+ Ammo: any;
58
+ }
59
+ }
60
+ /**
61
+ * 加载 Ammo.js
62
+ * @param path Ammo.js (WASM wrapper) 的路径,默认为 '/libs/ammo.wasm.js'
63
+ */
64
+ declare const loadAmmo: (path?: string) => Promise<any>;
65
+
66
+ /**
67
+ * MMD Visual Novel (Galgame 风格) 类型定义
68
+ */
69
+
70
+ /** 单条对话/文案 */
71
+ interface DialogueLine {
72
+ /** 唯一标识 */
73
+ id: string;
74
+ /** 说话者名称(可选,不填则不显示名称栏) */
75
+ speaker?: string;
76
+ /** 说话者名称颜色 */
77
+ speakerColor?: string;
78
+ /** 对话文本内容 */
79
+ text: string;
80
+ /** 文字显示速度(毫秒/字符),默认 50 */
81
+ typeSpeed?: number;
82
+ /** 是否等待用户点击才显示下一条(默认 true) */
83
+ waitForClick?: boolean;
84
+ /** 自动等待时间(毫秒),仅在 waitForClick 为 false 时生效 */
85
+ autoDelay?: number;
86
+ /** 对话时的表情/动作切换(可选) */
87
+ expression?: string;
88
+ /** 对话时播放的音效(可选) */
89
+ voicePath?: string;
90
+ /** 对话中插入的分支选项(可选,若有则显示选项) */
91
+ choices?: DialogueChoice[];
92
+ /** 视觉特效(可选) */
93
+ effect?: VisualEffect;
94
+ }
95
+ /** 视觉特效配置 */
96
+ interface VisualEffect {
97
+ /** 特效类型 */
98
+ type: 'flash' | 'gif' | 'shake';
99
+ /** 闪屏颜色,如 'white', 'red' */
100
+ color?: string;
101
+ /** 持续时间(毫秒) */
102
+ duration?: number;
103
+ /** GIF 动画地址 */
104
+ url?: string;
105
+ /** GIF 显示位置 */
106
+ position?: 'center' | 'full';
107
+ }
108
+ /** 分支判定逻辑 */
109
+ interface BranchCondition {
110
+ /** 变量名 */
111
+ key: string;
112
+ /** 变量值与节点索引的映射 */
113
+ map: Record<string | number, number>;
114
+ /** 默认跳转的节点索引 */
115
+ defaultIndex: number;
116
+ }
117
+ /** 对话分支选项 */
118
+ interface DialogueChoice {
119
+ /** 选项文字 */
120
+ text: string;
121
+ /** 跳转到的节点索引(可选,若不填则继续当前剧情) */
122
+ nextNodeIndex?: number;
123
+ /** 跳转到的对话索引(可选,默认 0) */
124
+ nextDialogueIndex?: number;
125
+ /** 设置变量(可选,用于后续剧情判定) */
126
+ setVariable?: {
127
+ key: string;
128
+ value: string | number | boolean;
129
+ };
130
+ /** 选项点击后的回调(可选) */
131
+ onSelect?: () => void;
132
+ /** 点击选项后触发的特效(可选) */
133
+ effect?: VisualEffect;
134
+ }
135
+ /** 视觉小说播放节点 */
136
+ interface VisualNovelNode {
137
+ /** 唯一标识 */
138
+ id: string;
139
+ /** 节点名称(用于调试) */
140
+ name?: string;
141
+ /** MMD 资源配置(模型、动作等) */
142
+ resources: MMDResources;
143
+ /** 该节点的对话数组(按顺序播放) */
144
+ dialogues: DialogueLine[];
145
+ /** 节点特定的舞台配置(可选,覆盖全局配置) */
146
+ stage?: MMDStage;
147
+ /** 节点结束时的分支选项(可选,已废弃,建议使用 DialogueLine.choices) */
148
+ choices?: DialogueChoice[];
149
+ /** 节点结束时的分支判定逻辑(可选,根据变量跳转不同节点) */
150
+ nextCondition?: BranchCondition;
151
+ /** 节点开始时播放的背景音乐(可选) */
152
+ bgmPath?: string;
153
+ /** 背景音乐音量 0-1(默认 0.5) */
154
+ bgmVolume?: number;
155
+ /** 节点是否循环 MMD 动画(对话期间循环,默认 true) */
156
+ loopAnimation?: boolean;
157
+ }
158
+ /** 视觉小说剧本配置 */
159
+ interface VisualNovelScript {
160
+ /** 剧本唯一标识 */
161
+ id: string;
162
+ /** 剧本名称 */
163
+ name: string;
164
+ /** 播放节点列表 */
165
+ nodes: VisualNovelNode[];
166
+ /** 是否在剧本结束后循环(默认 false) */
167
+ loop?: boolean;
168
+ }
169
+ /** 对话框主题配置 */
170
+ interface DialogueBoxTheme {
171
+ /** 对话框背景颜色 */
172
+ backgroundColor?: string;
173
+ /** 对话框边框颜色 */
174
+ borderColor?: string;
175
+ /** 对话框文字颜色 */
176
+ textColor?: string;
177
+ /** 说话者名称背景颜色 */
178
+ speakerBgColor?: string;
179
+ /** 说话者名称文字颜色 */
180
+ speakerTextColor?: string;
181
+ /** 对话框透明度 0-1(默认 0.85) */
182
+ opacity?: number;
183
+ /** 对话框模糊度(backdrop-blur,默认 8px) */
184
+ blur?: string;
185
+ /** 点击继续提示文字 */
186
+ continueHint?: string;
187
+ /** 是否显示点击继续提示(默认 true) */
188
+ showContinueHint?: boolean;
189
+ }
190
+ /** 视觉小说组件属性 */
191
+ interface MMDVisualNovelProps {
192
+ /** 剧本配置 */
193
+ script: VisualNovelScript;
194
+ /** 舞台配置 */
195
+ stage?: MMDStage;
196
+ /** 移动端优化配置 */
197
+ mobileOptimization?: MobileOptimization;
198
+ /** 对话框主题 */
199
+ dialogueTheme?: DialogueBoxTheme;
200
+ /** 是否自动开始(默认 true) */
201
+ autoStart?: boolean;
202
+ /** 开始按钮文本 */
203
+ startText?: string;
204
+ /** 设置按钮文本 */
205
+ settingsText?: string;
206
+ /** 关于按钮文本 */
207
+ aboutText?: string;
208
+ /** 初始节点索引(默认 0) */
209
+ initialNodeIndex?: number;
210
+ /** 初始对话索引(默认 0) */
211
+ initialDialogueIndex?: number;
212
+ /** 事件回调 */
213
+ onNodeChange?: (node: VisualNovelNode, index: number) => void;
214
+ onDialogueChange?: (dialogue: DialogueLine, index: number, nodeIndex: number) => void;
215
+ onScriptComplete?: () => void;
216
+ onError?: (error: Error) => void;
217
+ /** 是否显示调试信息 */
218
+ showDebugInfo?: boolean;
219
+ /** 是否显示快进按钮 */
220
+ showSkipButton?: boolean;
221
+ /** 是否显示自动播放按钮 */
222
+ showAutoButton?: boolean;
223
+ /** 是否显示历史记录按钮 */
224
+ showHistoryButton?: boolean;
225
+ /** 样式 */
226
+ className?: string;
227
+ style?: React.CSSProperties;
228
+ }
229
+ /** 对话框组件属性 */
230
+ interface DialogueBoxProps {
231
+ /** 当前对话 */
232
+ dialogue: DialogueLine | null;
233
+ /** 主题配置 */
234
+ theme?: DialogueBoxTheme;
235
+ /** 是否正在打字中 */
236
+ isTyping?: boolean;
237
+ /** 是否自动播放模式 */
238
+ isAutoMode?: boolean;
239
+ /** 点击事件 */
240
+ onClick?: () => void;
241
+ /** 跳过打字动画 */
242
+ onSkipTyping?: () => void;
243
+ /** 切换自动模式 */
244
+ onToggleAuto?: () => void;
245
+ /** 打开历史记录 */
246
+ onOpenHistory?: () => void;
247
+ /** 快进 */
248
+ onSkip?: () => void;
249
+ /** 重置相机 */
250
+ onResetCamera?: () => void;
251
+ /** 相机是否处于手动调整状态 */
252
+ isCameraManual?: boolean;
253
+ /** 是否显示控制按钮 */
254
+ showControls?: boolean;
255
+ /** 是否显示快进按钮 */
256
+ showSkipButton?: boolean;
257
+ /** 是否显示自动按钮 */
258
+ showAutoButton?: boolean;
259
+ /** 是否显示历史按钮 */
260
+ showHistoryButton?: boolean;
261
+ /** 样式 */
262
+ className?: string;
263
+ }
264
+ /** 历史记录项 */
265
+ interface DialogueHistoryItem {
266
+ nodeIndex: number;
267
+ dialogueIndex: number;
268
+ speaker?: string;
269
+ text: string;
270
+ timestamp: number;
271
+ }
272
+ /** 视觉小说组件 Ref 接口 */
273
+ interface MMDVisualNovelRef {
274
+ /** 跳转到指定节点 */
275
+ goToNode: (nodeIndex: number, force?: boolean) => void;
276
+ /** 跳转到指定对话 */
277
+ goToDialogue: (dialogueIndex: number) => void;
278
+ /** 获取当前节点索引 */
279
+ getCurrentNodeIndex: () => number;
280
+ /** 获取当前对话索引 */
281
+ getCurrentDialogueIndex: () => number;
282
+ /** 获取对话历史 */
283
+ getHistory: () => DialogueHistoryItem[];
284
+ /** 获取当前剧情变量 */
285
+ getVariables: () => Record<string, string | number | boolean>;
286
+ /** 设置剧情变量 */
287
+ setVariable: (key: string, value: string | number | boolean) => void;
288
+ /** 设置自动播放模式 */
289
+ setAutoMode: (enabled: boolean) => void;
290
+ /** 跳过当前打字动画 */
291
+ skipTyping: () => void;
292
+ }
293
+
294
+ /**
295
+ * MMDVisualNovel - Galgame 风格视觉小说组件
296
+ *
297
+ * 核心功能:
298
+ * - 将 MMDPlaylist 封装为 Galgame 风格
299
+ * - 每个节点包含:模型、动作、对话数组
300
+ * - 用户阅读完对话后自动切换节点
301
+ * - 打字机效果显示文本
302
+ * - 支持自动播放、快进、历史记录
303
+ */
304
+ declare const MMDVisualNovel: React__default.ForwardRefExoticComponent<MMDVisualNovelProps & React__default.RefAttributes<MMDVisualNovelRef>>;
305
+
306
+ /**
307
+ * DialogueBox - Galgame 风格对话框组件
308
+ *
309
+ * 功能:
310
+ * - 打字机效果显示文本
311
+ * - 说话者名称栏
312
+ * - 点击继续提示
313
+ * - 控制按钮(自动、快进、历史)
314
+ */
315
+ declare const DialogueBox: React__default.FC<DialogueBoxProps>;
316
+
317
+ interface HistoryPanelProps {
318
+ /** 历史记录列表 */
319
+ history: DialogueHistoryItem[];
320
+ /** 主题配置 */
321
+ theme?: DialogueBoxTheme;
322
+ /** 关闭面板 */
323
+ onClose: () => void;
324
+ /** 样式 */
325
+ className?: string;
326
+ }
327
+ /**
328
+ * HistoryPanel - 对话历史记录面板
329
+ *
330
+ * 显示玩家已经阅读过的所有对话
331
+ */
332
+ declare const HistoryPanel: React__default.FC<HistoryPanelProps>;
333
+
334
+ interface LoadingOverlayProps {
335
+ /** 是否显示加载状态 */
336
+ isLoading?: boolean;
337
+ /** 是否显示开始界面 */
338
+ showStartScreen?: boolean;
339
+ /** 脚本名称(用于开始界面) */
340
+ scriptName?: string;
341
+ /** 加载文本 */
342
+ loadingText?: string;
343
+ /** 开始按钮文本 */
344
+ startText?: string;
345
+ /** 设置按钮文本 */
346
+ settingsText?: string;
347
+ /** 关于按钮文本 */
348
+ aboutText?: string;
349
+ /** 点击开始回调 */
350
+ onStart?: () => void;
351
+ /** 自定义类名 */
352
+ className?: string;
353
+ }
354
+ /**
355
+ * LoadingOverlay - 加载遮罩和开始界面组件容器
356
+ *
357
+ * 用于 MMD Visual Novel 的加载状态和开始界面显示
358
+ * 组合了 LoadingScreen 和 StartScreen 两个独立组件
359
+ */
360
+ declare const LoadingOverlay: React__default.FC<LoadingOverlayProps>;
361
+
362
+ interface LoadingScreenProps {
363
+ /** 是否显示加载状态 */
364
+ isLoading?: boolean;
365
+ /** 加载文本 */
366
+ loadingText?: string;
367
+ /** 自定义类名 */
368
+ className?: string;
369
+ }
370
+ /**
371
+ * LoadingScreen - 加载界面组件
372
+ *
373
+ * 用于 MMD Visual Novel 的加载状态显示
374
+ */
375
+ declare const LoadingScreen: React__default.FC<LoadingScreenProps>;
376
+
377
+ interface StartScreenProps {
378
+ /** 是否显示开始界面 */
379
+ showStartScreen?: boolean;
380
+ /** 脚本名称 */
381
+ scriptName?: string;
382
+ /** 开始按钮文本 */
383
+ startText?: string;
384
+ /** 设置按钮文本 */
385
+ settingsText?: string;
386
+ /** 关于按钮文本 */
387
+ aboutText?: string;
388
+ /** 点击开始回调 */
389
+ onStart?: () => void;
390
+ /** 自定义类名 */
391
+ className?: string;
392
+ }
393
+ /**
394
+ * StartScreen - 开始界面组件
395
+ *
396
+ * 用于 MMD Visual Novel 的开始界面显示
397
+ */
398
+ declare const StartScreen: React__default.FC<StartScreenProps>;
399
+
400
+ interface ChoiceMenuProps {
401
+ choices: DialogueChoice[];
402
+ onSelect: (choice: DialogueChoice) => void;
403
+ theme?: DialogueBoxTheme;
404
+ }
405
+ declare const ChoiceMenu: React__default.FC<ChoiceMenuProps>;
406
+
407
+ /** 音乐曲目配置 */
408
+ interface MusicTrack {
409
+ /** 唯一标识 */
410
+ id: string;
411
+ /** 歌曲名称 */
412
+ title: string;
413
+ /** 艺术家/歌手 */
414
+ artist?: string;
415
+ /** 封面图 URL */
416
+ coverUrl?: string;
417
+ /** MMD 资源(模型、动作、音频等) */
418
+ resources: MMDResources;
419
+ /** 曲目特定的舞台配置(可选,覆盖全局配置) */
420
+ stage?: MMDStage;
421
+ /** 预计时长(秒) */
422
+ duration?: number;
423
+ }
424
+ /** 音乐播放器配置 */
425
+ interface MMDMusicPlayerConfig {
426
+ /** 播放列表名称 */
427
+ name: string;
428
+ /** 曲目列表 */
429
+ tracks: MusicTrack[];
430
+ /** 是否自动播放 */
431
+ autoPlay?: boolean;
432
+ /** 默认循环模式 */
433
+ defaultLoopMode?: 'list' | 'single' | 'shuffle';
434
+ }
435
+ /** 音乐播放器组件属性 */
436
+ interface MMDMusicPlayerProps {
437
+ /** 播放配置 */
438
+ config: MMDMusicPlayerConfig;
439
+ /** 舞台配置 */
440
+ stage?: MMDStage;
441
+ /** 移动端优化配置 */
442
+ mobileOptimization?: MobileOptimization;
443
+ /** 初始曲目索引 */
444
+ initialTrackIndex?: number;
445
+ /**
446
+ * 固定资源配置
447
+ * 如果提供,所有曲目将使用这些指定的模型和动作,仅切换音频
448
+ */
449
+ fixedResources?: {
450
+ modelPath: string;
451
+ motionPath?: string;
452
+ stageModelPath?: string | string[];
453
+ cameraPath?: string;
454
+ };
455
+ /** 是否开启 Miku 搜索模式 */
456
+ mikuMode?: boolean;
457
+ /** 事件回调 */
458
+ onTrackChange?: (track: MusicTrack, index: number) => void;
459
+ onPlayPause?: (isPlaying: boolean) => void;
460
+ onProgress?: (currentTime: number, duration: number) => void;
461
+ onError?: (error: Error) => void;
462
+ /** 样式 */
463
+ className?: string;
464
+ style?: React.CSSProperties;
465
+ }
466
+ /** 音乐播放器 Ref 接口 */
467
+ interface MMDMusicPlayerRef {
468
+ /** 播放 */
469
+ play: () => void;
470
+ /** 暂停 */
471
+ pause: () => void;
472
+ /** 跳转到下一曲 */
473
+ next: () => void;
474
+ /** 跳转到上一曲 */
475
+ previous: () => void;
476
+ /** 跳转到指定曲目 */
477
+ goToTrack: (index: number) => void;
478
+ /** 设置循环模式 */
479
+ setLoopMode: (mode: 'list' | 'single' | 'shuffle') => void;
480
+ /** 获取当前状态 */
481
+ getState: () => {
482
+ currentIndex: number;
483
+ isPlaying: boolean;
484
+ currentTime: number;
485
+ duration: number;
486
+ loopMode: 'list' | 'single' | 'shuffle';
487
+ };
488
+ }
489
+
490
+ /**
491
+ * MMDMusicPlayer - MMD 音乐播放器组件 (Study with Miku 风格)
492
+ *
493
+ * 核心功能:
494
+ * - 多曲目无缝切换
495
+ * - 完整的媒体控制 (播放/暂停/进度/音量)
496
+ * - 沉浸式 3D 舞台
497
+ * - 自动清理内存与物理引擎
498
+ */
499
+ declare const MMDMusicPlayer: React__default.ForwardRefExoticComponent<MMDMusicPlayerProps & React__default.RefAttributes<MMDMusicPlayerRef>>;
500
+
501
+ interface MusicControlsProps {
502
+ isPlaying: boolean;
503
+ currentTime: number;
504
+ duration: number;
505
+ loopMode: 'list' | 'single' | 'shuffle';
506
+ isCameraManual?: boolean;
507
+ onPlayPause: () => void;
508
+ onNext: () => void;
509
+ onPrevious: () => void;
510
+ onSeek: (time: number) => void;
511
+ onToggleLoop: () => void;
512
+ onTogglePlaylist: () => void;
513
+ onResetCamera?: () => void;
514
+ className?: string;
515
+ }
516
+ declare const MusicControls: React__default.FC<MusicControlsProps>;
517
+
518
+ interface PlaylistPanelProps {
519
+ tracks: MusicTrack[];
520
+ currentIndex: number;
521
+ isOpen: boolean;
522
+ onClose: () => void;
523
+ onSelectTrack: (index: number) => void;
524
+ className?: string;
525
+ mikuMode?: boolean;
526
+ onSearch?: (keyword: string) => void;
527
+ isSearching?: boolean;
528
+ }
529
+ declare const PlaylistPanel: React__default.FC<PlaylistPanelProps>;
530
+
531
+ interface TrackInfoProps {
532
+ track: MusicTrack;
533
+ className?: string;
534
+ }
535
+ declare const TrackInfo: React__default.FC<TrackInfoProps>;
536
+
537
+ interface MMDARPlayerProps {
538
+ /** MMD 资源配置 */
539
+ resources: MMDResources;
540
+ /** 舞台配置 */
541
+ stage?: MMDStage;
542
+ /** 移动端优化配置 */
543
+ mobileOptimization?: MobileOptimization;
544
+ /** 摄像头配置 */
545
+ cameraConfig?: {
546
+ /** 偏好使用的摄像头 ('user' 为前置, 'environment' 为后置) */
547
+ facingMode?: 'user' | 'environment';
548
+ /** 视频分辨率 */
549
+ width?: number | {
550
+ min?: number;
551
+ ideal?: number;
552
+ max?: number;
553
+ };
554
+ height?: number | {
555
+ min?: number;
556
+ ideal?: number;
557
+ max?: number;
558
+ };
559
+ };
560
+ /** 是否开启镜像显示 (通常前置摄像头需要开启) */
561
+ mirrored?: boolean;
562
+ /** 是否显示设置按钮 (允许手动输入模型和动作路径) */
563
+ showSettings?: boolean;
564
+ /** 播放控制 */
565
+ autoPlay?: boolean;
566
+ loop?: boolean;
567
+ /** 事件回调 */
568
+ onCameraReady?: (stream: MediaStream) => void;
569
+ onCameraError?: (error: Error) => void;
570
+ onResourcesChange?: (resources: MMDResources) => void;
571
+ onLoad?: () => void;
572
+ onError?: (error: Error) => void;
573
+ /** 样式 */
574
+ className?: string;
575
+ style?: React.CSSProperties;
576
+ }
577
+ interface MMDARPlayerRef {
578
+ /** 开启摄像头 */
579
+ startCamera: () => Promise<void>;
580
+ /** 关闭摄像头 */
581
+ stopCamera: () => void;
582
+ /** 切换摄像头 */
583
+ switchCamera: () => Promise<void>;
584
+ /** 截图 (包含视频背景和模型) */
585
+ snapshot: () => Promise<string>;
586
+ }
587
+
588
+ /**
589
+ * MMDARPlayer - 基于实时摄像头的 MMD 增强现实播放器
590
+ *
591
+ * 功能:
592
+ * - 调用设备摄像头作为背景
593
+ * - 叠加透明背景的 MMD 模型渲染
594
+ * - 支持前后摄像头切换
595
+ * - 针对 AR 场景优化模型光照与定位
596
+ */
597
+ declare const MMDARPlayer: React__default.ForwardRefExoticComponent<MMDARPlayerProps & React__default.RefAttributes<MMDARPlayerRef>>;
598
+
599
+ /**
600
+ * FX文件解析器类型定义
601
+ * 用于解析MME (MikuMikuEffect) 的.fx效果文件
602
+ */
603
+ /**
604
+ * FX文件解析结果
605
+ */
606
+ interface FXEffect {
607
+ /** 文件名 */
608
+ fileName: string;
609
+ /** 原始内容 */
610
+ rawContent: string;
611
+ /** 宏定义 */
612
+ defines: FXDefine[];
613
+ /** 参数声明 */
614
+ parameters: FXParameter[];
615
+ /** 静态变量 */
616
+ staticVariables: FXStaticVariable[];
617
+ /** 纹理引用 */
618
+ textures: FXTexture[];
619
+ /** 控制器引用 */
620
+ controllers: FXController[];
621
+ /** 包含文件 */
622
+ includes: string[];
623
+ /** Technique定义 */
624
+ techniques: FXTechnique[];
625
+ /** 着色器函数 */
626
+ shaderFunctions: FXShaderFunction[];
627
+ /** 注释块 */
628
+ comments: FXComment[];
629
+ /** 转换后的GLSL shaders(可选) */
630
+ glslShaders?: GLSLShaders;
631
+ }
632
+ /**
633
+ * 宏定义
634
+ */
635
+ interface FXDefine {
636
+ /** 宏名称 */
637
+ name: string;
638
+ /** 宏值 */
639
+ value?: string;
640
+ /** 是否被注释掉 */
641
+ isCommented: boolean;
642
+ /** 行号 */
643
+ lineNumber: number;
644
+ /** 注释说明 */
645
+ comment?: string;
646
+ }
647
+ /**
648
+ * 参数声明
649
+ */
650
+ interface FXParameter {
651
+ /** 参数类型 (float, float2, float3, float4, texture, etc.) */
652
+ type: string;
653
+ /** 参数名称 */
654
+ name: string;
655
+ /** 语义 (POSITION, TEXCOORD, DIFFUSE, etc.) */
656
+ semantic?: string;
657
+ /** 默认值 */
658
+ defaultValue?: string;
659
+ /** 注解 (annotations) */
660
+ annotations?: Record<string, any>;
661
+ /** 行号 */
662
+ lineNumber: number;
663
+ /** 注释说明 */
664
+ comment?: string;
665
+ }
666
+ /**
667
+ * 静态变量
668
+ */
669
+ interface FXStaticVariable {
670
+ /** 变量类型 */
671
+ type: string;
672
+ /** 变量名称 */
673
+ name: string;
674
+ /** 初始化表达式 */
675
+ expression: string;
676
+ /** 行号 */
677
+ lineNumber: number;
678
+ }
679
+ /**
680
+ * 纹理引用
681
+ */
682
+ interface FXTexture {
683
+ /** 纹理名称 */
684
+ name: string;
685
+ /** 纹理路径 */
686
+ path: string;
687
+ /** 宽度 */
688
+ width?: number;
689
+ /** 高度 */
690
+ height?: number;
691
+ /** 纹理用途 (diffuse, normal, shadow, etc.) */
692
+ purpose?: string;
693
+ }
694
+ /**
695
+ * 控制器引用
696
+ */
697
+ interface FXController {
698
+ /** 控制器名称 */
699
+ name: string;
700
+ /** 控制器对象 */
701
+ objectName: string;
702
+ /** 控制项 */
703
+ itemName: string;
704
+ /** 绑定到的参数 */
705
+ boundParameter: string;
706
+ }
707
+ /**
708
+ * Technique定义
709
+ */
710
+ interface FXTechnique {
711
+ /** Technique名称 */
712
+ name: string;
713
+ /** Pass列表 */
714
+ passes: FXPass[];
715
+ /** 行号 */
716
+ lineNumber: number;
717
+ }
718
+ /**
719
+ * Pass定义
720
+ */
721
+ interface FXPass {
722
+ /** Pass名称 */
723
+ name?: string;
724
+ /** 顶点着色器 */
725
+ vertexShader?: {
726
+ profile: string;
727
+ function: string;
728
+ };
729
+ /** 像素着色器 */
730
+ pixelShader?: {
731
+ profile: string;
732
+ function: string;
733
+ };
734
+ /** 渲染状态 */
735
+ renderStates: Record<string, any>;
736
+ }
737
+ /**
738
+ * 着色器函数
739
+ */
740
+ interface FXShaderFunction {
741
+ /** 函数名 */
742
+ name: string;
743
+ /** 返回类型 */
744
+ returnType: string;
745
+ /** 参数列表 */
746
+ parameters: string;
747
+ /** 函数体 */
748
+ body: string;
749
+ /** 输出语义 */
750
+ outputSemantic?: string;
751
+ /** 行号 */
752
+ lineNumber: number;
753
+ }
754
+ /**
755
+ * 注释块
756
+ */
757
+ interface FXComment {
758
+ /** 注释内容 */
759
+ content: string;
760
+ /** 注释类型 (line: 单行注释 //, block: 块注释) */
761
+ type: 'line' | 'block';
762
+ /** 行号 */
763
+ lineNumber: number;
764
+ }
765
+ /**
766
+ * 转换后的GLSL shaders
767
+ */
768
+ interface GLSLShaders {
769
+ /** 顶点着色器 */
770
+ vertexShader?: GLSLShader;
771
+ /** 片段着色器 */
772
+ fragmentShader?: GLSLShader;
773
+ /** 转换警告 */
774
+ warnings: string[];
775
+ }
776
+ /**
777
+ * GLSL shader信息
778
+ */
779
+ interface GLSLShader {
780
+ /** 转换后的GLSL代码 */
781
+ code: string;
782
+ /** Uniforms */
783
+ uniforms: Map<string, {
784
+ type: string;
785
+ glslType: string;
786
+ semantic?: string;
787
+ }>;
788
+ /** Attributes(仅顶点着色器) */
789
+ attributes: Map<string, {
790
+ type: string;
791
+ glslType: string;
792
+ semantic: string;
793
+ }>;
794
+ /** Varyings */
795
+ varyings: Map<string, {
796
+ type: string;
797
+ glslType: string;
798
+ }>;
799
+ }
800
+ /**
801
+ * FX解析配置
802
+ */
803
+ interface FXParserOptions {
804
+ /** 是否保留注释 */
805
+ keepComments?: boolean;
806
+ /** 是否解析Technique */
807
+ parseTechniques?: boolean;
808
+ /** 是否解析着色器函数 */
809
+ parseShaderFunctions?: boolean;
810
+ /** 是否解析纹理引用 */
811
+ parseTextures?: boolean;
812
+ /** 是否解析控制器引用 */
813
+ parseControllers?: boolean;
814
+ /** 是否转换HLSL到GLSL */
815
+ convertToGLSL?: boolean;
816
+ /** 顶点着色器函数名(用于GLSL转换) */
817
+ vertexShaderFunction?: string;
818
+ /** 片段着色器函数名(用于GLSL转换) */
819
+ fragmentShaderFunction?: string;
820
+ }
821
+ /**
822
+ * FX文件摘要信息(用于快速预览)
823
+ */
824
+ interface FXSummary {
825
+ fileName: string;
826
+ defineCount: number;
827
+ parameterCount: number;
828
+ textureCount: number;
829
+ techniqueCount: number;
830
+ hasLocalShadow: boolean;
831
+ hasExcellentShadow: boolean;
832
+ hasHgShadow: boolean;
833
+ enabledDefines: string[];
834
+ disabledDefines: string[];
835
+ }
836
+
837
+ /**
838
+ * FX文件解析器
839
+ * 用于解析MME (MikuMikuEffect) 的.fx效果文件
840
+ */
841
+
842
+ declare class FXParser {
843
+ private options;
844
+ private hlslConverter;
845
+ constructor(options?: FXParserOptions);
846
+ /**
847
+ * 从URL加载并解析FX文件
848
+ */
849
+ loadAndParse(url: string): Promise<FXEffect>;
850
+ /**
851
+ * 解析FX文件内容
852
+ */
853
+ parse(content: string, fileName?: string): FXEffect;
854
+ /**
855
+ * 转换shader到GLSL
856
+ */
857
+ private convertShadersToGLSL;
858
+ /**
859
+ * 解析宏定义 (#define)
860
+ */
861
+ private parseDefines;
862
+ /**
863
+ * 解析参数声明
864
+ */
865
+ private parseParameters;
866
+ /**
867
+ * 解析注解 (annotations)
868
+ */
869
+ private parseAnnotations;
870
+ /**
871
+ * 解析静态变量
872
+ */
873
+ private parseStaticVariables;
874
+ /**
875
+ * 解析纹理引用
876
+ */
877
+ private parseTextures;
878
+ /**
879
+ * 解析控制器引用 (CONTROLOBJECT)
880
+ */
881
+ private parseControllers;
882
+ /**
883
+ * 解析include指令
884
+ */
885
+ private parseIncludes;
886
+ /**
887
+ * 解析Technique定义
888
+ */
889
+ private parseTechniques;
890
+ /**
891
+ * 解析Pass定义
892
+ */
893
+ private parsePasses;
894
+ /**
895
+ * 解析着色器函数
896
+ */
897
+ private parseShaderFunctions;
898
+ /**
899
+ * 解析注释
900
+ */
901
+ private parseComments;
902
+ /**
903
+ * 生成FX文件摘要
904
+ */
905
+ generateSummary(effect: FXEffect): FXSummary;
906
+ /**
907
+ * 提取特定着色器函数的代码
908
+ */
909
+ extractShaderFunction(effect: FXEffect, functionName: string): string | null;
910
+ /**
911
+ * 获取所有启用的功能标志
912
+ */
913
+ getEnabledFeatures(effect: FXEffect): string[];
914
+ /**
915
+ * 获取配置参数
916
+ */
917
+ getConfigParameters(effect: FXEffect): FXParameter[];
918
+ }
919
+
920
+ /**
921
+ * FX到Three.js适配器
922
+ * 将解析的FX文件参数应用到Three.js渲染中
923
+ */
924
+
925
+ /**
926
+ * Three.js材质配置
927
+ */
928
+ interface ThreeMaterialConfig {
929
+ /** 基础颜色 */
930
+ color?: THREE.Color;
931
+ /** 发光颜色 */
932
+ emissive?: THREE.Color;
933
+ /** 高光颜色 */
934
+ specular?: THREE.Color;
935
+ /** 光泽度 */
936
+ shininess?: number;
937
+ /** 透明度 */
938
+ opacity?: number;
939
+ /** 是否透明 */
940
+ transparent?: boolean;
941
+ /** 纹理贴图 */
942
+ map?: THREE.Texture | null;
943
+ /** 法线贴图 */
944
+ normalMap?: THREE.Texture | null;
945
+ /** 环境贴图 */
946
+ envMap?: THREE.Texture | null;
947
+ /** 自定义uniforms */
948
+ uniforms?: Record<string, {
949
+ value: any;
950
+ }>;
951
+ }
952
+ /**
953
+ * Three.js渲染配置
954
+ */
955
+ interface ThreeRenderConfig {
956
+ /** 是否启用阴影 */
957
+ enableShadow?: boolean;
958
+ /** 阴影贴图尺寸 */
959
+ shadowMapSize?: number;
960
+ /** 环境光强度 */
961
+ ambientLightIntensity?: number;
962
+ /** 方向光强度 */
963
+ directionalLightIntensity?: number;
964
+ /** 方向光方向 */
965
+ lightDirection?: THREE.Vector3;
966
+ /** 色调映射 */
967
+ toneMapping?: THREE.ToneMapping;
968
+ /** 曝光度 */
969
+ toneMappingExposure?: number;
970
+ }
971
+ /**
972
+ * FX到Three.js适配器
973
+ */
974
+ declare class FXToThreeAdapter {
975
+ private effect;
976
+ private textureLoader;
977
+ private loadedTextures;
978
+ private basePath;
979
+ constructor(effect: FXEffect, basePath?: string);
980
+ /**
981
+ * 创建ShaderMaterial(如果有GLSL shader)
982
+ */
983
+ createShaderMaterial(): THREE.ShaderMaterial | null;
984
+ /**
985
+ * 获取uniform的默认值
986
+ */
987
+ private getDefaultUniformValue;
988
+ /**
989
+ * 提取材质配置
990
+ */
991
+ extractMaterialConfig(): ThreeMaterialConfig;
992
+ /**
993
+ * 提取渲染配置
994
+ */
995
+ extractRenderConfig(): ThreeRenderConfig;
996
+ /**
997
+ * 加载纹理
998
+ */
999
+ loadTextures(): Promise<Map<string, THREE.Texture>>;
1000
+ /**
1001
+ * 加载单个纹理
1002
+ */
1003
+ private loadTexture;
1004
+ /**
1005
+ * 创建Three.js材质
1006
+ */
1007
+ createMaterial(): THREE.MeshPhongMaterial;
1008
+ /**
1009
+ * 配置Three.js场景
1010
+ * 仅应用渲染器配置,不添加光源
1011
+ */
1012
+ configureScene(scene: THREE.Scene, renderer: THREE.WebGLRenderer): void;
1013
+ /**
1014
+ * 获取指定用途的纹理
1015
+ */
1016
+ private getTextureByPurpose;
1017
+ /**
1018
+ * 解析float3值
1019
+ */
1020
+ private parseFloat3;
1021
+ /**
1022
+ * 解析float值
1023
+ */
1024
+ private parseFloat;
1025
+ /**
1026
+ * 解析参数值
1027
+ */
1028
+ private parseParameterValue;
1029
+ /**
1030
+ * 获取所有自定义uniforms
1031
+ */
1032
+ getUniforms(): Record<string, {
1033
+ value: any;
1034
+ }>;
1035
+ /**
1036
+ * 生成配置摘要
1037
+ */
1038
+ getSummary(): {
1039
+ materialParams: string[];
1040
+ textures: string[];
1041
+ renderFeatures: string[];
1042
+ };
1043
+ }
1044
+
1045
+ /**
1046
+ * HLSL到GLSL转换器
1047
+ * 将MME的HLSL shader代码转换为Three.js可用的GLSL代码
1048
+ */
1049
+ interface ConversionResult {
1050
+ /** 转换后的GLSL代码 */
1051
+ glslCode: string;
1052
+ /** 检测到的uniforms */
1053
+ uniforms: Map<string, UniformInfo>;
1054
+ /** 检测到的attributes */
1055
+ attributes: Map<string, AttributeInfo>;
1056
+ /** 检测到的varyings */
1057
+ varyings: Map<string, VaryingInfo>;
1058
+ /** 转换警告 */
1059
+ warnings: string[];
1060
+ }
1061
+ interface UniformInfo {
1062
+ type: string;
1063
+ glslType: string;
1064
+ semantic?: string;
1065
+ }
1066
+ interface AttributeInfo {
1067
+ type: string;
1068
+ glslType: string;
1069
+ semantic: string;
1070
+ }
1071
+ interface VaryingInfo {
1072
+ type: string;
1073
+ glslType: string;
1074
+ }
1075
+ declare class HLSLToGLSLConverter {
1076
+ private warnings;
1077
+ private uniforms;
1078
+ private attributes;
1079
+ private varyings;
1080
+ /**
1081
+ * HLSL类型到GLSL类型的映射
1082
+ */
1083
+ private typeMap;
1084
+ /**
1085
+ * HLSL函数到GLSL函数的映射
1086
+ */
1087
+ private functionMap;
1088
+ /**
1089
+ * HLSL语义到GLSL的映射
1090
+ */
1091
+ private semanticMap;
1092
+ /**
1093
+ * 转换HLSL shader代码为GLSL
1094
+ */
1095
+ convert(hlslCode: string, shaderType: 'vertex' | 'fragment'): ConversionResult;
1096
+ /**
1097
+ * 预处理代码
1098
+ */
1099
+ private preprocessCode;
1100
+ /**
1101
+ * 转换类型声明
1102
+ */
1103
+ private convertTypes;
1104
+ /**
1105
+ * 转换函数调用
1106
+ */
1107
+ private convertFunctions;
1108
+ /**
1109
+ * 转换mul()函数
1110
+ * HLSL: mul(matrix, vector) 或 mul(vector, matrix)
1111
+ * GLSL: matrix * vector 或 vector * matrix
1112
+ */
1113
+ private convertMulFunction;
1114
+ /**
1115
+ * 转换语义
1116
+ */
1117
+ private convertSemantics;
1118
+ /**
1119
+ * 转换输入/输出结构
1120
+ */
1121
+ private convertIOStructs;
1122
+ /**
1123
+ * 解析结构体成员
1124
+ */
1125
+ private parseStructMembers;
1126
+ /**
1127
+ * 添加GLSL头部和辅助函数
1128
+ */
1129
+ private addGLSLHeader;
1130
+ /**
1131
+ * 修复语法差异
1132
+ */
1133
+ private fixSyntaxDifferences;
1134
+ /**
1135
+ * 从FX效果中提取并转换shader
1136
+ */
1137
+ convertFromFXEffect(effect: any, vertexShaderName: string, fragmentShaderName: string): {
1138
+ vertexShader: ConversionResult;
1139
+ fragmentShader: ConversionResult;
1140
+ } | null;
1141
+ }
1142
+
1143
+ /**
1144
+ * 多FX文件适配器
1145
+ * 支持同时应用多个FX效果文件
1146
+ */
1147
+
1148
+ /**
1149
+ * 效果文件类型
1150
+ */
1151
+ type EffectFileType = 'fx' | 'x' | 'auto';
1152
+ /**
1153
+ * FX文件配置
1154
+ */
1155
+ interface FXFileConfig {
1156
+ /** FX/X文件路径 */
1157
+ path: string;
1158
+ /** 纹理基础路径 */
1159
+ texturePath?: string;
1160
+ /** 文件类型 */
1161
+ type?: EffectFileType;
1162
+ /**
1163
+ * 优先级 (数字越大优先级越高,默认0)
1164
+ * - .x文件建议设置为低优先级(如-10),作为基础效果
1165
+ * - .fx文件建议设置为高优先级(如10),作为细节效果
1166
+ */
1167
+ priority?: number;
1168
+ /**
1169
+ * 应用目标
1170
+ * - 'all': 应用到所有对象
1171
+ * - 'model': 仅应用到模型
1172
+ * - 'stage': 仅应用到舞台
1173
+ * - 'scene': 仅应用场景配置(光照、阴影等)
1174
+ * - string[]: 应用到指定名称的对象
1175
+ */
1176
+ target?: 'all' | 'model' | 'stage' | 'scene' | string[];
1177
+ /** 是否启用 */
1178
+ enabled?: boolean;
1179
+ /** 描述(用于调试) */
1180
+ description?: string;
1181
+ /** 是否转换为GLSL并使用ShaderMaterial */
1182
+ useShaderMaterial?: boolean;
1183
+ /** 顶点着色器函数名(用于GLSL转换) */
1184
+ vertexShaderFunction?: string;
1185
+ /** 片段着色器函数名(用于GLSL转换) */
1186
+ fragmentShaderFunction?: string;
1187
+ }
1188
+ /**
1189
+ * 多FX合并策略
1190
+ */
1191
+ type FXMergeStrategy = 'override' | 'merge' | 'additive';
1192
+ /**
1193
+ * 多FX适配器配置
1194
+ */
1195
+ interface MultiFXAdapterOptions {
1196
+ /** 合并策略 */
1197
+ mergeStrategy?: FXMergeStrategy;
1198
+ /** 是否自动加载纹理 */
1199
+ autoLoadTextures?: boolean;
1200
+ }
1201
+ /**
1202
+ * 多FX文件适配器
1203
+ * 支持同时加载和应用多个FX效果文件
1204
+ */
1205
+ declare class MultiFXAdapter {
1206
+ private effects;
1207
+ private adapters;
1208
+ private configs;
1209
+ private options;
1210
+ private parser;
1211
+ constructor(options?: MultiFXAdapterOptions);
1212
+ /**
1213
+ * 识别文件类型
1214
+ */
1215
+ private detectFileType;
1216
+ /**
1217
+ * 添加效果文件(支持.fx和.x)
1218
+ */
1219
+ addFX(config: FXFileConfig): Promise<void>;
1220
+ /**
1221
+ * 批量添加FX文件
1222
+ */
1223
+ addMultipleFX(configs: FXFileConfig[]): Promise<void>;
1224
+ /**
1225
+ * 移除FX文件
1226
+ */
1227
+ removeFX(path: string): void;
1228
+ /**
1229
+ * 清空所有FX
1230
+ */
1231
+ clear(): void;
1232
+ /**
1233
+ * 合并材质配置
1234
+ */
1235
+ extractMergedMaterialConfig(target?: string): ThreeMaterialConfig;
1236
+ /**
1237
+ * 合并渲染配置
1238
+ */
1239
+ extractMergedRenderConfig(): ThreeRenderConfig;
1240
+ /**
1241
+ * 应用到Three.js材质
1242
+ * 支持MeshPhongMaterial和MeshToonMaterial(MMD常用)
1243
+ */
1244
+ applyToMaterial(material: THREE.Material, target?: string): void;
1245
+ /**
1246
+ * 创建ShaderMaterial(如果配置了useShaderMaterial)
1247
+ * 返回第一个匹配target的ShaderMaterial,如果没有则返回null
1248
+ */
1249
+ createShaderMaterial(target?: string): THREE.ShaderMaterial | null;
1250
+ /**
1251
+ * 应用到Three.js场景
1252
+ */
1253
+ applyToScene(scene: THREE.Scene, renderer: THREE.WebGLRenderer): void;
1254
+ /**
1255
+ * 获取所有已加载的FX效果
1256
+ */
1257
+ getLoadedEffects(): FXEffect[];
1258
+ /**
1259
+ * 获取配置摘要
1260
+ */
1261
+ getSummary(): {
1262
+ totalFX: number;
1263
+ enabledFX: number;
1264
+ xFiles: number;
1265
+ fxFiles: number;
1266
+ configs: Array<{
1267
+ path: string;
1268
+ type: EffectFileType;
1269
+ priority: number;
1270
+ target: string | string[];
1271
+ features: string[];
1272
+ description?: string;
1273
+ }>;
1274
+ };
1275
+ /**
1276
+ * 获取指定类型的配置
1277
+ */
1278
+ getConfigsByType(type: EffectFileType): FXFileConfig[];
1279
+ /**
1280
+ * 获取场景级效果(.x文件)
1281
+ */
1282
+ getSceneEffects(): FXFileConfig[];
1283
+ /**
1284
+ * 获取模型级效果(.fx文件)
1285
+ */
1286
+ getModelEffects(): FXFileConfig[];
1287
+ /**
1288
+ * 获取合并后的Uniforms
1289
+ */
1290
+ getMergedUniforms(target?: string): Record<string, {
1291
+ value: any;
1292
+ }>;
1293
+ /**
1294
+ * 分层应用到场景对象
1295
+ * @param scene Three.js场景
1296
+ * @param renderer Three.js渲染器
1297
+ * @param modelMeshes 模型网格数组(可选,用于精确控制)
1298
+ * @param stageMeshes 舞台网格数组(可选,用于精确控制)
1299
+ */
1300
+ applyLayered(scene: THREE.Scene, renderer: THREE.WebGLRenderer, modelMeshes?: THREE.Object3D[], stageMeshes?: THREE.Object3D[]): void;
1301
+ /**
1302
+ * 打印当前配置(调试用)
1303
+ */
1304
+ printConfig(): void;
1305
+ }
1306
+
1307
+ /**
1308
+ * FX解析器工具函数
1309
+ */
1310
+
1311
+ /**
1312
+ * 将FX效果导出为JSON
1313
+ */
1314
+ declare function exportFXToJSON(effect: FXEffect): string;
1315
+ /**
1316
+ * 将FX效果导出为Markdown文档
1317
+ */
1318
+ declare function exportFXToMarkdown(effect: FXEffect): string;
1319
+ /**
1320
+ * 比较两个FX文件的差异
1321
+ */
1322
+ declare function compareFXEffects(effect1: FXEffect, effect2: FXEffect): {
1323
+ addedDefines: string[];
1324
+ removedDefines: string[];
1325
+ changedDefines: {
1326
+ name: string;
1327
+ oldValue?: string;
1328
+ newValue?: string;
1329
+ }[];
1330
+ addedTextures: string[];
1331
+ removedTextures: string[];
1332
+ addedParameters: string[];
1333
+ removedParameters: string[];
1334
+ };
1335
+ /**
1336
+ * 过滤特定类型的宏定义
1337
+ */
1338
+ declare function filterDefinesByPrefix(defines: FXDefine[], prefix: string): FXDefine[];
1339
+ /**
1340
+ * 获取所有纹理宏定义
1341
+ */
1342
+ declare function getTextureDefines(defines: FXDefine[]): FXDefine[];
1343
+ /**
1344
+ * 获取所有功能标志
1345
+ */
1346
+ declare function getFeatureFlags(defines: FXDefine[]): FXDefine[];
1347
+ /**
1348
+ * 获取所有颜色相关的参数
1349
+ */
1350
+ declare function getColorParameters(parameters: FXParameter[]): FXParameter[];
1351
+ /**
1352
+ * 检查是否包含特定功能
1353
+ */
1354
+ declare function hasFeature(effect: FXEffect, featureName: string): boolean;
1355
+ /**
1356
+ * 获取配置摘要文本
1357
+ */
1358
+ declare function getConfigSummaryText(effect: FXEffect): string;
1359
+ /**
1360
+ * 提取纹理文件路径列表(用于预加载)
1361
+ */
1362
+ declare function extractTexturePaths(effect: FXEffect): string[];
1363
+ /**
1364
+ * 验证FX文件的完整性
1365
+ */
1366
+ declare function validateFXEffect(effect: FXEffect): {
1367
+ isValid: boolean;
1368
+ errors: string[];
1369
+ warnings: string[];
1370
+ };
1371
+
1372
+ /**
1373
+ * FX文件查看器组件
1374
+ * 用于可视化展示FX文件的解析结果
1375
+ */
1376
+
1377
+ interface FXViewerProps {
1378
+ /** FX文件URL或内容 */
1379
+ source: string;
1380
+ /** 是否是文件内容(true)还是URL(false) */
1381
+ isContent?: boolean;
1382
+ /** 文件名 */
1383
+ fileName?: string;
1384
+ /** 解析完成回调 */
1385
+ onParsed?: (effect: FXEffect) => void;
1386
+ /** 错误回调 */
1387
+ onError?: (error: Error) => void;
1388
+ /** 自定义样式 */
1389
+ className?: string;
1390
+ }
1391
+ declare const FXViewer: React__default.FC<FXViewerProps>;
1392
+
1393
+ /**
1394
+ * FX效果Three.js预览组件
1395
+ * 展示如何将FX解析结果应用到Three.js渲染中
1396
+ */
1397
+
1398
+ interface FXThreePreviewProps {
1399
+ /** FX效果 */
1400
+ effect: FXEffect;
1401
+ /** 纹理基础路径 */
1402
+ texturePath?: string;
1403
+ /** 预览对象类型 */
1404
+ objectType?: 'sphere' | 'box' | 'torus' | 'plane';
1405
+ /** 自定义样式 */
1406
+ className?: string;
1407
+ /** 是否显示信息面板 */
1408
+ showInfo?: boolean;
1409
+ }
1410
+ declare const FXThreePreview: React__default.FC<FXThreePreviewProps>;
1411
+
1412
+ export { type BranchCondition, ChoiceMenu, type ChoiceMenuProps, DialogueBox, type DialogueBoxProps, type DialogueBoxTheme, type DialogueChoice, type DialogueHistoryItem, type DialogueLine, type EffectFileType, type FXComment, type FXController, type FXDefine, type FXEffect, type FXFileConfig, type FXMergeStrategy, type FXParameter, FXParser, type FXParserOptions, type FXPass, type FXShaderFunction, type FXStaticVariable, type FXSummary, type FXTechnique, type FXTexture, FXThreePreview, type FXThreePreviewProps, FXToThreeAdapter, FXViewer, type FXViewerProps, type GLSLShader, type GLSLShaders, HLSLToGLSLConverter, HistoryPanel, LoadingOverlay, type LoadingOverlayProps, LoadingScreen, type LoadingScreenProps, MMDARPlayer, type MMDARPlayerProps, type MMDARPlayerRef, MMDMusicPlayer, type MMDMusicPlayerConfig, type MMDMusicPlayerProps, type MMDMusicPlayerRef, MMDPlayerBase, MMDPlayerBaseProps, MMDPlayerBaseRef, MMDPlayerEnhanced, MMDPlayerEnhancedDebugInfo, MMDPlayerEnhancedProps, MMDPlaylist, MMDPlaylistDebugInfo, MMDPlaylistNode, MMDPlaylistProps, MMDResources, MMDStage, MMDVisualNovel, type MMDVisualNovelProps, type MMDVisualNovelRef, MobileOptimization, MultiFXAdapter, type MultiFXAdapterOptions, MusicControls, type MusicControlsProps, type MusicTrack, PlaylistPanel, type PlaylistPanelProps, StartScreen, type StartScreenProps, type ThreeMaterialConfig, type ThreeRenderConfig, TrackInfo, type TrackInfoProps, type VisualEffect, type VisualNovelNode, type VisualNovelScript, compareFXEffects, exportFXToJSON, exportFXToMarkdown, extractTexturePaths, filterDefinesByPrefix, getColorParameters, getConfigSummaryText, getFeatureFlags, getTextureDefines, hasFeature, loadAmmo, validateFXEffect };