@hatiolab/things-scene 10.0.6 → 10.1.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.
Files changed (90) hide show
  1. package/dist-types/diagnostics/inspector.d.ts +47 -0
  2. package/dist-types/diagnostics/inspector.d.ts.map +1 -1
  3. package/dist-types/figure/figure-blueprint.d.ts +123 -0
  4. package/dist-types/figure/figure-blueprint.d.ts.map +1 -0
  5. package/dist-types/figure/figure-instance.d.ts +299 -0
  6. package/dist-types/figure/figure-instance.d.ts.map +1 -0
  7. package/dist-types/figure/figure-palette.d.ts +37 -0
  8. package/dist-types/figure/figure-palette.d.ts.map +1 -0
  9. package/dist-types/figure/figure-part-component.d.ts +324 -0
  10. package/dist-types/figure/figure-part-component.d.ts.map +1 -0
  11. package/dist-types/figure/figure-real-object.d.ts +92 -0
  12. package/dist-types/figure/figure-real-object.d.ts.map +1 -0
  13. package/dist-types/figure/figure-registry.d.ts +71 -0
  14. package/dist-types/figure/figure-registry.d.ts.map +1 -0
  15. package/dist-types/figure/index.d.ts +13 -0
  16. package/dist-types/figure/index.d.ts.map +1 -0
  17. package/dist-types/interfaces/real-object.d.ts +34 -0
  18. package/dist-types/interfaces/real-object.d.ts.map +1 -1
  19. package/dist-types/layer/model-layer.d.ts +9 -2
  20. package/dist-types/layer/model-layer.d.ts.map +1 -1
  21. package/dist-types/model/arrange.d.ts +61 -0
  22. package/dist-types/model/arrange.d.ts.map +1 -0
  23. package/dist-types/model/index.d.ts +1 -0
  24. package/dist-types/model/index.d.ts.map +1 -1
  25. package/dist-types/things-scene/index.d.ts +1 -0
  26. package/dist-types/things-scene/index.d.ts.map +1 -1
  27. package/dist-types/threed/common.d.ts +8 -0
  28. package/dist-types/threed/common.d.ts.map +1 -1
  29. package/dist-types/threed/coordinate-ground.d.ts +51 -0
  30. package/dist-types/threed/coordinate-ground.d.ts.map +1 -0
  31. package/dist-types/threed/factories/camera.d.ts +1 -1
  32. package/dist-types/threed/factories/cube.d.ts +8 -0
  33. package/dist-types/threed/factories/cube.d.ts.map +1 -1
  34. package/dist-types/threed/factories/cylinder.d.ts +17 -0
  35. package/dist-types/threed/factories/cylinder.d.ts.map +1 -1
  36. package/dist-types/threed/factories/sphere.d.ts +11 -0
  37. package/dist-types/threed/factories/sphere.d.ts.map +1 -1
  38. package/dist-types/threed/factories/wall.d.ts +8 -0
  39. package/dist-types/threed/factories/wall.d.ts.map +1 -1
  40. package/dist-types/threed/floor/floor.d.ts +22 -0
  41. package/dist-types/threed/floor/floor.d.ts.map +1 -1
  42. package/dist-types/threed/geometry-bank.d.ts +64 -0
  43. package/dist-types/threed/geometry-bank.d.ts.map +1 -0
  44. package/dist-types/threed/index.d.ts +8 -0
  45. package/dist-types/threed/index.d.ts.map +1 -1
  46. package/dist-types/threed/instanced-set.d.ts +211 -0
  47. package/dist-types/threed/instanced-set.d.ts.map +1 -0
  48. package/dist-types/threed/managers/event-manager3d.d.ts +7 -0
  49. package/dist-types/threed/managers/event-manager3d.d.ts.map +1 -1
  50. package/dist-types/threed/managers/gizmo-operation-manager.d.ts +8 -0
  51. package/dist-types/threed/managers/gizmo-operation-manager.d.ts.map +1 -1
  52. package/dist-types/threed/managers/renderer-manager.d.ts +3 -3
  53. package/dist-types/threed/managers/renderer-manager.d.ts.map +1 -1
  54. package/dist-types/threed/managers/scene-manager.d.ts +33 -9
  55. package/dist-types/threed/managers/scene-manager.d.ts.map +1 -1
  56. package/dist-types/threed/managers/types.d.ts +10 -0
  57. package/dist-types/threed/managers/types.d.ts.map +1 -1
  58. package/dist-types/threed/material-3d.d.ts +9 -0
  59. package/dist-types/threed/material-3d.d.ts.map +1 -1
  60. package/dist-types/threed/parted-real-object.d.ts +79 -0
  61. package/dist-types/threed/parted-real-object.d.ts.map +1 -0
  62. package/dist-types/threed/real-object-camera-meshed.d.ts +1 -1
  63. package/dist-types/threed/real-object-dom-texture.d.ts +2 -2
  64. package/dist-types/threed/real-object-extrude.d.ts +14 -0
  65. package/dist-types/threed/real-object-extrude.d.ts.map +1 -1
  66. package/dist-types/threed/real-object-gltf.d.ts +11 -0
  67. package/dist-types/threed/real-object-gltf.d.ts.map +1 -1
  68. package/dist-types/threed/real-object-mesh.d.ts +79 -2
  69. package/dist-types/threed/real-object-mesh.d.ts.map +1 -1
  70. package/dist-types/threed/real-object-plane-2d.d.ts +2 -2
  71. package/dist-types/threed/real-object-scene.d.ts +2 -2
  72. package/dist-types/threed/real-object-service.d.ts +2 -2
  73. package/dist-types/threed/real-object.d.ts +46 -2
  74. package/dist-types/threed/real-object.d.ts.map +1 -1
  75. package/dist-types/threed/segments.d.ts +49 -0
  76. package/dist-types/threed/segments.d.ts.map +1 -0
  77. package/dist-types/threed/three-capability.d.ts +18 -0
  78. package/dist-types/threed/three-capability.d.ts.map +1 -1
  79. package/dist-types/threed/three-container.d.ts +8 -3
  80. package/dist-types/threed/three-container.d.ts.map +1 -1
  81. package/dist-types/threed/top-outline.d.ts +37 -0
  82. package/dist-types/threed/top-outline.d.ts.map +1 -0
  83. package/dist-types/threed/utils/dispose.d.ts.map +1 -1
  84. package/dist-types/transition/transition-effect.d.ts.map +1 -1
  85. package/package.json +3 -3
  86. package/things-scene-min.js +11 -11
  87. package/things-scene-min.js.map +1 -1
  88. package/things-scene-transfer.mjs +3 -3
  89. package/things-scene.mjs +3 -3
  90. package/things-scene.mjs.map +1 -1
@@ -0,0 +1,324 @@
1
+ import Component from '../components/component.js';
2
+ import Shape from '../components/shape.js';
3
+ import type { SceneRenderContext } from '../interfaces/rendering.js';
4
+ import type { IRealObject } from '../interfaces/real-object.js';
5
+ import type { ComponentNature } from '../interfaces/types.js';
6
+ import { RealObject } from '../threed/real-object.js';
7
+ import { MATERIAL_PRESETS } from '../threed/material-3d.js';
8
+ /** 이 컴포넌트가 3D 로 세울 수 있는 도형. `PRIMITIVE_KINDS` 와 같은 집합이다. */
9
+ export type FigurePartPrimitive = 'cube' | 'wall' | 'cylinder' | 'sphere' | 'rect' | 'polygon';
10
+ /** 부품 컴포넌트가 갖는, 씬 공통 상태 밖의 값들. */
11
+ export interface FigurePartState {
12
+ primitive?: FigurePartPrimitive;
13
+ segments?: number;
14
+ /** `rect` 의 모서리 굴림, `polygon` 의 단면 경로. */
15
+ round?: number;
16
+ path?: {
17
+ x: number;
18
+ y: number;
19
+ }[];
20
+ /** 팔레트 토큰. 값이 아니라 이름을 둔다 — 테마를 바꾸면 따라온다. */
21
+ token?: string;
22
+ preset?: keyof typeof MATERIAL_PRESETS;
23
+ flatShading?: boolean;
24
+ transparent?: boolean;
25
+ }
26
+ /**
27
+ * 부품의 3D 표현.
28
+ *
29
+ * 치수를 형상에 굽지 않는다 — 단위 형상을 창고에서 꺼내 `dimensionScale` 로 키운다.
30
+ * 그래야 크기가 다른 부품끼리도 형상 하나를 나눠 쓴다. 단면을 미는 것(`rect` ·
31
+ * `polygon`)만 예외인데, 단위로 정규화하면 모서리 굴림 비율이 망가지기 때문이다.
32
+ */
33
+ export declare class FigurePartRealObject extends RealObject {
34
+ build(): void;
35
+ /** 단위 형상. 치수는 배율로 준다. */
36
+ private unitGeometry;
37
+ /**
38
+ * 단면을 밀어 만든 형상. **치수가 구워지므로 열쇠에 치수가 든다.**
39
+ *
40
+ * 단면은 평면도다 — 가로가 `width`, 세로가 `height` 이고 밀리는 두께가 `depth` 다.
41
+ * 여기서는 두께 1 로 만들고 배율로 키운다. 굴림은 평면 안의 값이라 배율에 안 눌린다.
42
+ */
43
+ private extrudedGeometry;
44
+ private crossSection;
45
+ /**
46
+ * 재질. **팔레트 토큰과 프리셋으로만 정한다** — 배포된 Figure 와 같은 규칙이다.
47
+ *
48
+ * 창고가 값으로 공유하므로 같은 토큰·프리셋을 쓰는 부품끼리 재질 하나를 나눠 쓴다.
49
+ * 접었을 때 세어지는 「재질 묶음」이 저작 중에도 그대로 눈에 보인다.
50
+ */
51
+ private material;
52
+ /**
53
+ * 치수를 배율로 준다.
54
+ *
55
+ * 단면을 민 것은 평면 치수가 이미 형상에 구워져 있으므로 두께만 키운다 — 평면까지
56
+ * 배율을 걸면 두 번 곱해진다.
57
+ */
58
+ updateDimension(): void;
59
+ }
60
+ declare const FigurePart_base: {
61
+ new (...args: any[]): {
62
+ contains(x: number, y: number): boolean;
63
+ get path(): {
64
+ x: any;
65
+ y: any;
66
+ }[];
67
+ set path(path: {
68
+ x: any;
69
+ y: any;
70
+ }[]);
71
+ get anchors(): {
72
+ name: string;
73
+ position: {
74
+ x: any;
75
+ y: any;
76
+ };
77
+ }[];
78
+ get bounds(): any;
79
+ set bounds(bounds: any);
80
+ render(ctx: CanvasRenderingContext2D): void;
81
+ _app: any;
82
+ _model: any;
83
+ _state: any;
84
+ _delta: any;
85
+ _animation: any;
86
+ _animate: any;
87
+ _parent: any;
88
+ _disposed: any;
89
+ _textHidden: any;
90
+ _text_substitutor: any;
91
+ _value_substitutor: any;
92
+ _mappings: any;
93
+ _realObject: IRealObject | undefined;
94
+ _cachedState: any;
95
+ updatedAt: any;
96
+ fontSize: any;
97
+ __cache__: any;
98
+ created(): void;
99
+ added(parent: import("../types/component.js").Container): void;
100
+ removed(parent: import("../types/component.js").Container): void;
101
+ ready(): Promise<void>;
102
+ _readyInvoked: boolean;
103
+ invokeReady(): void | Promise<void>;
104
+ touch(): void;
105
+ clearCache(...attrs: string[]): void;
106
+ removeSelf(completely?: boolean): void;
107
+ resetAnimation(): void;
108
+ dispose(): void;
109
+ get nature(): ComponentNature;
110
+ get disposed(): boolean;
111
+ isLayer(): boolean;
112
+ isGroup(): boolean;
113
+ isContainer(): this is import("../types/component.js").Container;
114
+ isLine(): boolean;
115
+ isRoot(): boolean;
116
+ isRootModel(): boolean;
117
+ is3dish(): boolean;
118
+ get is3dMode(): boolean;
119
+ isIn3DSpace(): boolean;
120
+ isTemplate(): boolean;
121
+ isHTMLElement(): boolean;
122
+ isConnectable(): boolean;
123
+ isIdentifiable(): boolean;
124
+ isPositionable(): boolean;
125
+ replaceRefids(replaceMap: Record<string, string>): void;
126
+ get(property: string): any;
127
+ set(props: any, propval?: any): any;
128
+ getState(property: string): any;
129
+ setState(props: Partial<import("../index.js").State> | string, propval?: any): any;
130
+ get model(): any;
131
+ get state(): import("../index.js").State;
132
+ get refid(): any;
133
+ get hierarchy(): any;
134
+ get volatile(): string[];
135
+ _applyProps(target: Record<string, any>, props: Record<string, any>, options: import("../components/component.js").ApplyPropsOptions): /*elided*/ any;
136
+ move(offset: {
137
+ x: number;
138
+ y: number;
139
+ }, ...args: boolean[]): void;
140
+ symmetryX(x?: number): void;
141
+ symmetryY(y: number): void;
142
+ adjustResize(bounds: import("../index.js").BOUNDS, origin_bounds: import("../index.js").BOUNDS, diagonal: boolean): {
143
+ left: any;
144
+ top: any;
145
+ width: any;
146
+ height: any;
147
+ };
148
+ adjustRotation(rotation: number, step: boolean): number;
149
+ outline(progress: number): any;
150
+ get center(): import("../index.js").POINT;
151
+ set center(p: import("../index.js").POINT);
152
+ get location(): import("../index.js").POINT;
153
+ set location(l: import("../index.js").POINT);
154
+ get rotate(): import("../index.js").POINT;
155
+ set rotate(r: import("../index.js").POINT);
156
+ get dimension(): import("../index.js").DIMENSION;
157
+ set dimension(d: import("../index.js").DIMENSION);
158
+ get drawPath(): import("../index.js").POINT[];
159
+ get rotatePoint(): import("../index.js").POINT;
160
+ get mutable(): boolean;
161
+ get resizable(): boolean;
162
+ get rotatable(): boolean;
163
+ buildRealObject(): IRealObject | undefined;
164
+ get realObject(): IRealObject | undefined;
165
+ draw(context?: SceneRenderContext): void;
166
+ prerender(context: SceneRenderContext): void;
167
+ postrender(context: SceneRenderContext): void;
168
+ prepare(resolve: (component: Component) => void, reject: (reason: any) => void): void;
169
+ prepareIf(condition: boolean): void;
170
+ drawText(context: SceneRenderContext): void;
171
+ drawStroke(context: SceneRenderContext, override?: Record<string, unknown>): void;
172
+ drawFill(context: SceneRenderContext, override?: Record<string, unknown>): void;
173
+ get strokeStyle(): any;
174
+ set strokeStyle(v: any);
175
+ get fillStyle(): any;
176
+ set fillStyle(v: any);
177
+ get fontColor(): string;
178
+ set fontColor(v: string);
179
+ get rotation(): number;
180
+ set rotation(v: number);
181
+ get decorators(): string[];
182
+ get decotag(): string;
183
+ get hidden(): boolean;
184
+ set hidden(v: boolean);
185
+ get tag(): string;
186
+ set tag(v: string);
187
+ get appendum(): any;
188
+ set appendum(v: any);
189
+ defaultTextSubstitutor(): string;
190
+ textLines(context?: SceneRenderContext): any[][];
191
+ get font(): string;
192
+ get lineHeight(): number;
193
+ get textSubstitutor(): () => string;
194
+ get text(): string;
195
+ set text(v: string);
196
+ get textBounds(): import("../index.js").BOUNDS;
197
+ get textRotation(): number;
198
+ get textHidden(): boolean;
199
+ set textHidden(v: boolean);
200
+ get hasTextProperty(): boolean;
201
+ animate(opts: import("../index.js").AnimationConfig): any;
202
+ effect(context: SceneRenderContext, model: any): void;
203
+ serialize(...others: any[]): string;
204
+ trim(): void;
205
+ closeScene(data: any): void;
206
+ delta(attr?: string | object, value?: any): any;
207
+ invalidate(): void;
208
+ get value(): any;
209
+ set value(v: any);
210
+ get data(): any;
211
+ set data(v: any);
212
+ set tap(v: any);
213
+ get mappings(): any[];
214
+ get retention(): number;
215
+ get animation(): import("../index.js").AnimationController | undefined;
216
+ get started(): boolean;
217
+ set started(v: boolean);
218
+ get controls(): import("../index.js").Control[] | undefined;
219
+ findFirst(finder: string | ((c: Component) => boolean), ...others: any[]): Component | undefined;
220
+ findAll(s: string | ((c: Component) => boolean), ...others: any[]): any[] | undefined;
221
+ capture(x: number, y: number, except?: (c: Component) => boolean): any;
222
+ findAnchor(name: string): any;
223
+ isDescendible(container: Component | any): boolean;
224
+ getContext(component?: unknown): any;
225
+ get root(): Component;
226
+ get rootModel(): Component;
227
+ get parent(): Component;
228
+ set parent(v: Component);
229
+ get scalable(): boolean;
230
+ get stuck(): boolean;
231
+ get capturable(): boolean;
232
+ get position(): string;
233
+ get origin(): string;
234
+ get offset(): import("../index.js").POINT;
235
+ get app(): import("../index.js").ApplicationContext;
236
+ drawEffect(context: SceneRenderContext): void;
237
+ prepareFill(resolve: Function, reject: Function): void;
238
+ prepareFillIf(condition: boolean): void;
239
+ onchangeFill(after: Record<string, any>, before: Record<string, any>): void;
240
+ drawImage(context: SceneRenderContext, image: HTMLImageElement, left: number, top: number, width: number, height: number): void;
241
+ mutateBounds(logic: ((bounds: import("../index.js").BOUNDS) => import("../index.js").BOUNDS | void) | null, context?: any): void;
242
+ mutatePath(beforeLogic: ((path: import("../index.js").POINT[]) => import("../index.js").POINT[] | void) | null, afterLogic: ((path: import("../index.js").POINT[]) => import("../index.js").POINT[] | void) | null, context?: any): void;
243
+ access(accessor: string): any;
244
+ substitute(template: string, data: any): string | undefined;
245
+ onchangeMappings(after: Record<string, any>, before: Record<string, any>): void;
246
+ onchangeData(after: Record<string, any>, before: Record<string, any>): void;
247
+ buildMappings(): void;
248
+ executeMappings(force?: boolean): void;
249
+ disposeMappings(): void;
250
+ ondropfile(transfered: FileList, files: string[]): void;
251
+ transcoordS2P(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
252
+ transcoordP2S(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
253
+ transcoordS2T(x: number, y: number, top?: Component): import("../index.js").POINT;
254
+ transcoordT2P(x: number, y: number, top?: Component): import("../index.js").POINT;
255
+ transcoordT2S(x: number, y: number, top?: Component): import("../index.js").POINT;
256
+ transcoordS2TR(x: number, y: number, top?: Component): import("../index.js").POINT;
257
+ transcoordS2O(x: number, y: number, target: Component): import("../index.js").POINT;
258
+ transcoordC2S(x: number, y: number, top?: Component): import("../index.js").POINT;
259
+ transcoordS2C(x: number, y: number, top?: Component): import("../index.js").POINT;
260
+ toParent(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
261
+ fromParent(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
262
+ toScene(x: number, y: number, top?: Component): import("../index.js").POINT;
263
+ fromScene(x: number, y: number, top?: Component): import("../index.js").POINT;
264
+ toLocal(x: number, y: number, top?: Component): import("../index.js").POINT;
265
+ toGlobal(x: number, y: number, top?: Component): import("../index.js").POINT;
266
+ toOther(x: number, y: number, target: Component): import("../index.js").POINT;
267
+ on<K extends keyof import("../index.js").ComponentEventMap>(name: K, callback: (...args: import("../index.js").ComponentEventMap[K]) => void, context?: any): /*elided*/ any;
268
+ on(name: string | object, callback: Function, context?: any): /*elided*/ any;
269
+ off<K extends keyof import("../index.js").ComponentEventMap>(name: K, callback?: ((...args: import("../index.js").ComponentEventMap[K]) => void) | undefined, context?: any): /*elided*/ any;
270
+ off(name?: string | object, callback?: Function, context?: any): /*elided*/ any;
271
+ once<K extends keyof import("../index.js").ComponentEventMap>(name: K, callback: (...args: import("../index.js").ComponentEventMap[K]) => void, context?: any): /*elided*/ any;
272
+ once(name: string | object, callback: Function, context?: any): /*elided*/ any;
273
+ trigger<K extends keyof import("../index.js").ComponentEventMap>(name: K, ...args: import("../index.js").ComponentEventMap[K]): /*elided*/ any;
274
+ trigger(name: string, ...args: any[]): /*elided*/ any;
275
+ delegate_on(delegator: any): /*elided*/ any;
276
+ delegate_off(delegator: any): /*elided*/ any;
277
+ onchange(after: Record<string, any>, before: Record<string, any>): void;
278
+ calculateBounds?(): void;
279
+ oncreate_element?(element: HTMLElement): void;
280
+ removeComponent(component: Component, ghost?: boolean): void;
281
+ addComponent(component: Component, ghost?: boolean): void;
282
+ insertComponentAt(component: Component, index: number, ghost?: boolean): void;
283
+ getOverlay(component: Component): HTMLElement | undefined;
284
+ findById(id: string): Component | undefined;
285
+ findByRefid(ref: string | number): Component | undefined;
286
+ findAllById(id: string): Component[];
287
+ resize(): void;
288
+ fit(type?: string): void;
289
+ get components(): Component[] | undefined;
290
+ get layout(): any;
291
+ get auxOverlay(): HTMLElement | undefined;
292
+ get isReady(): boolean;
293
+ get unitScale(): number;
294
+ get selected(): Component[];
295
+ set selected(_v: Component[]);
296
+ get focused(): Component | null;
297
+ set focused(_v: Component | null);
298
+ get hasSameParentForAllSelected(): boolean;
299
+ set hasSameParentForAllSelected(_v: boolean);
300
+ get fitMode(): string | undefined;
301
+ set fitMode(_v: string | undefined);
302
+ get element(): HTMLElement | null;
303
+ set element(_v: HTMLElement | null);
304
+ };
305
+ } & typeof Shape;
306
+ /**
307
+ * 저작 중인 부품. 판 위에 놓이는 여느 컴포넌트다.
308
+ *
309
+ * 2D 는 위에서 내려다본 발자국을 그린다. 저작면의 2D 뷰와 배포된 Figure 의 2D 표현이
310
+ * 같은 규칙으로 그려져야, 접기 전후로 그림이 달라지지 않는다.
311
+ */
312
+ export declare class FigurePart extends FigurePart_base {
313
+ /** 이름이 `register` 면 밑바탕 클래스의 것과 부딪힌다 — `FigureInstance` 와 같은 이름을 쓴다. */
314
+ static registerType(): void;
315
+ get hasTextProperty(): boolean;
316
+ is3dish(): boolean;
317
+ get nature(): ComponentNature;
318
+ buildRealObject(): IRealObject | undefined;
319
+ render(ctx: SceneRenderContext): void;
320
+ /** 위에서 내려다본 발자국. 3D 와 **같은 분할 수**로 근사한다. */
321
+ private traceFootprint;
322
+ }
323
+ export {};
324
+ //# sourceMappingURL=figure-part-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure-part-component.d.ts","sourceRoot":"","sources":["../../src/figure/figure-part-component.ts"],"names":[],"mappings":"AAMA,OAAO,SAAS,MAAM,4BAA4B,CAAA;AAClD,OAAO,KAAK,MAAM,wBAAwB,CAAA;AAE1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAyC3D,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAQ9F,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACjC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,OAAO,gBAAgB,CAAA;IACtC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAMD;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,KAAK;IAgBL,yBAAyB;IACzB,OAAO,CAAC,YAAY;IAapB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IA4CpB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAsBhB;;;;;OAKG;IACH,eAAe,IAAI,IAAI;CAWxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,eAAe;IAC7C,wEAAwE;IACxE,MAAM,CAAC,YAAY,IAAI,IAAI;IAI3B,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,OAAO,IAAI,OAAO;IAIlB,IAAI,MAAM,IAAI,eAAe,CAE5B;IAED,eAAe,IAAI,WAAW,GAAG,SAAS;IAI1C,MAAM,CAAC,GAAG,EAAE,kBAAkB;IAU9B,4CAA4C;IAC5C,OAAO,CAAC,cAAc;CA2CvB"}
@@ -0,0 +1,92 @@
1
+ import * as THREE from 'three';
2
+ import { RealObject } from '../threed/real-object.js';
3
+ import type { TopOutline } from '../interfaces/real-object.js';
4
+ import type { PreparedFigure } from './figure-registry.js';
5
+ import type { FigureBlueprintMember } from './figure-blueprint.js';
6
+ /**
7
+ * 저작한 Figure 의 3D 표현.
8
+ *
9
+ * ## 어떻게 서나
10
+ *
11
+ * object3d 묶음마다 mesh 하나를 자식으로 둔다
12
+ * 배율 = state.scale × dimensionScale(bounds ÷ base)
13
+ * ├ mesh(묶음 0) 공유 병합 geometry + 공유 material
14
+ * └ mesh(묶음 1)
15
+ *
16
+ * 치수는 `RealObject.dimensionScale` 에 실는다. 엔진이 state.scale·애니메이션과
17
+ * **곱해서** 반영하므로 서로 덮지 않는다. Figure 만 다른 구조를 쓸 이유가 없다.
18
+ *
19
+ * ## 무엇이 공유되고 무엇이 인스턴스마다 생기나
20
+ *
21
+ * **geometry 는 타입·묶음당 하나다.** 부품들을 base 좌표계에서 미리 합쳐 두고
22
+ * GeometryBank 에 넣는다. 인스턴스가 500개든 5,000개든 정점 버퍼는 묶음 수만큼만
23
+ * 있다. **material 도 마찬가지로 MaterialBank 가 공유한다.**
24
+ *
25
+ * **Mesh 객체는 인스턴스마다 생긴다.** three.js 에서 한 객체는 부모가 하나뿐이고 자기
26
+ * 행렬을 가지므로 같은 Mesh 를 여러 자리에 놓을 수 없다. 다만 Mesh 는 껍데기다 —
27
+ * geometry·material 참조와 행렬만 든다. 진짜로 객체까지 하나가 되는 길은
28
+ * `InstancedMesh` 이고, 그것은 인스턴스별 선택·컬링·재질을 다르게 다뤄야 해서 별개
29
+ * 결정이다.
30
+ */
31
+ /**
32
+ * 청사진 좌표가 곧 three 좌표다 — 둘 다 x 오른쪽, y 위, z 앞이고, 둘 다 원점이
33
+ * 중심이다. **갈아끼울 것이 없다.**
34
+ *
35
+ * 컴포넌트 state 와의 환산은 `updateDimension` 한 곳에만 있다.
36
+ */
37
+ export declare function memberGeometry(member: FigureBlueprintMember): THREE.BufferGeometry | null;
38
+ /**
39
+ * 부품 하나의 형상을 **제 중심을 원점에 두고** 만든다.
40
+ *
41
+ * 자리를 굽지 않는다. 그러면 크기·종류가 같은 부품끼리는 자리가 달라도 같은 형상을
42
+ * 나눠 쓸 수 있고, 저작면에서는 `mesh.position` 이 곧 부품의 자리가 되어 기즈모로 끈
43
+ * 결과를 그대로 되읽을 수 있다.
44
+ */
45
+ export declare function memberGeometryAtOrigin(member: FigureBlueprintMember): THREE.BufferGeometry | null;
46
+ /**
47
+ * 한 묶음의 부품들을 하나로 합친다. **모양당 한 번만** 만들고 창고에 둔다 — 모양이
48
+ * 같으면 몇 번을 불러도 **같은 객체**가 나온다. 공유가 실제로 일어나는지 시험이
49
+ * 확인할 수 있게 내보낸다.
50
+ *
51
+ * 합친 결과는 청사진 좌표 그대로다. 청사진의 원점이 이미 base 상자의 중심이라, 다른
52
+ * 컴포넌트들이 `geometry.center()` 로 맞추는 기준과 같은 자리에 있다.
53
+ */
54
+ export declare function mergedGeometryOf(figure: PreparedFigure, index: number): THREE.BufferGeometry | null;
55
+ export declare class FigureRealObject extends RealObject {
56
+ /** 부품 이름 → mesh. 애니메이션·바인딩이 부품을 찾는 자리다. */
57
+ private _meshByName;
58
+ get figure(): PreparedFigure | null;
59
+ build(): void;
60
+ /**
61
+ * 인스턴스의 높이.
62
+ *
63
+ * 보드는 `left`·`top`·`width`·`height` 만 적는 것이 보통이고 `depth` 는 잘 적지
64
+ * 않는다. 그때 기본 높이(≈1)를 쓰면 `base.y` 로 나뉘어 형상이 납작하게 눌린다.
65
+ *
66
+ * **저작한 비례를 지킨다** — 평면 두 축이 커진 만큼 높이도 커진다. 배치 크기가
67
+ * 템플릿의 비율로 처리된다는 것이 이 뜻이다. 두 축의 기하평균을 쓰므로 한 축만 늘여도
68
+ * 덜 왜곡된다. `state.depth` 를 적었으면 그것이 이긴다.
69
+ */
70
+ get effectiveDepth(): number;
71
+ /**
72
+ * 인스턴스 치수를 **배율로만** 준다 — geometry 는 건드리지 않으므로 인스턴스가
73
+ * 늘어도 정점 버퍼가 늘지 않는다.
74
+ *
75
+ * **낱말이 갈리는 유일한 자리다.** 청사진은 3D 도구들의 축(`x` 오른쪽, `y` 위,
76
+ * `z` 앞)을 쓰고, 컴포넌트 state 는 2D 캔버스에서 온 낱말(`width`·`height` 가
77
+ * 평면, `depth` 가 높이)을 쓴다. 환산은 여기서 한 번만 한다.
78
+ *
79
+ * state.width ↔ base.x 평면 가로
80
+ * state.height ↔ base.z 평면 세로
81
+ * state.depth ↔ base.y 높이
82
+ */
83
+ updateDimension(): void;
84
+ /**
85
+ * Figure 는 부품이 여럿이라 **하나의 폐다각형이 아니다.** 2D 표현은 컴포넌트가
86
+ * 부품마다 그리므로(`FigureInstance.render`) 여기서 윤곽을 지어내지 않는다.
87
+ * 경계상자를 돌려주면 부르는 쪽이 그것을 실제 윤곽으로 오해한다.
88
+ */
89
+ topOutline(): TopOutline | null;
90
+ clear(): THREE.Object3D<THREE.Object3DEventMap>;
91
+ }
92
+ //# sourceMappingURL=figure-real-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure-real-object.d.ts","sourceRoot":"","sources":["../../src/figure/figure-real-object.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAKrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAElE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CAuBzF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CAiCjG;AAmFD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CA0CnG;AAkBD,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,2CAA2C;IAC3C,OAAO,CAAC,WAAW,CAAgC;IAEnD,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAElC;IAED,KAAK;IAwBL;;;;;;;;;OASG;IACH,IAAa,cAAc,IAAI,MAAM,CAepC;IAED;;;;;;;;;;;OAWG;IACH,eAAe,IAAI,IAAI;IAevB;;;;OAIG;IACM,UAAU,IAAI,UAAU,GAAG,IAAI;IAIxC,KAAK;CAIN"}
@@ -0,0 +1,71 @@
1
+ import type { FigureBlueprint, FigureBlueprintGroup, FigureBlueprintMember, FigureBlueprintPoint } from './figure-blueprint.js';
2
+ /**
3
+ * 저작한 Figure 를 컴포넌트 타입에 매어 두는 곳.
4
+ *
5
+ * `Component.register(type, clazz)` 는 「이 타입은 이 클래스가 그린다」를 말한다. 여기는
6
+ * 그 옆에서 「이 타입은 이 청사진을 그린다」를 말한다. 둘이 짝이므로 `registerFigure()`
7
+ * 하나가 양쪽을 같이 한다 — 보드 모델은 `{ type: 'EQ_MIXER', left, top, width, height }`
8
+ * 만 적으면 되고, 청사진도 정본도 보드에 들어가지 않는다.
9
+ *
10
+ * 청사진은 보드와 **수명이 다르다.** 보드는 사람이 고치니 자주 바뀌고, Figure 는
11
+ * 타입 이름으로 불변하게 주소가 잡히니 오래 캐시된다. 한 문서에 섞으면 둘 다 짧은
12
+ * 쪽을 따라간다.
13
+ */
14
+ /** 그리기 전에 한 번 풀어 둔 부품. 인스턴스마다 다시 풀지 않는다. */
15
+ export interface PreparedPart {
16
+ member: FigureBlueprintMember;
17
+ group: FigureBlueprintGroup;
18
+ /** 팔레트에서 해석한 색. */
19
+ color: string;
20
+ /** 이 부품에 걸린 애니메이션 포인트. 없으면 undefined. */
21
+ point?: FigureBlueprintPoint;
22
+ }
23
+ export interface PreparedGroup {
24
+ group: FigureBlueprintGroup;
25
+ color: string;
26
+ /** 이 묶음의 부품에 걸린 애니메이션 포인트. 묶음이 animated 면 하나 있다. */
27
+ point?: FigureBlueprintPoint;
28
+ }
29
+ export interface PreparedFigure {
30
+ blueprint: FigureBlueprint;
31
+ /**
32
+ * 2D 로 그리는 순서 — **z 오름차순이며 묶음 순서가 아니다.**
33
+ *
34
+ * 묶음은 3D 의 것이다. 3D 는 깊이 버퍼가 앞뒤를 가려 주므로 재질별로 합쳐도 되지만,
35
+ * 2D 캔버스는 나중에 칠한 것이 위로 온다. 묶음 순서로 칠하면 아래에 있어야 할
36
+ * 부품이 위를 덮는다. 그래서 2D 는 z 순서를 따로 갖는다.
37
+ *
38
+ * 이 순서는 타입마다 한 번만 만든다 — 인스턴스가 몇이든 다시 정렬하지 않는다.
39
+ */
40
+ paintOrder: PreparedPart[];
41
+ /** 3D 로 세울 묶음 — 재질별. */
42
+ groups: PreparedGroup[];
43
+ /** 이 값이 팔레트와 어긋나면 색을 다시 푼다. */
44
+ paletteVersion: number;
45
+ }
46
+ /** `figure-instance.ts` 가 부른다. 응용이 다른 클래스를 쓰고 싶으면 갈아 끼울 수 있다. */
47
+ export declare function useFigureComponent(clazz: unknown): void;
48
+ /**
49
+ * Figure 를 등록한다 — 청사진을 매어 두고 컴포넌트 타입도 함께 등록한다.
50
+ *
51
+ * 읽을 수 없는 청사진이면 **던진다.** 프레임마다 조용히 실패하는 대신 등록에서 한 번
52
+ * 크게 실패하는 편이, 무엇이 잘못됐는지 알기에 낫다.
53
+ */
54
+ export declare function registerFigure(blueprint: FigureBlueprint): PreparedFigure;
55
+ /**
56
+ * 등록된 Figure 를 찾는다. 없으면 `null` — 빈 청사진으로 갈음하지 않는다.
57
+ *
58
+ * 팔레트가 바뀌었으면 색을 다시 푼 것을 돌려준다.
59
+ */
60
+ export declare function getFigure(type: string): PreparedFigure | null;
61
+ /** 등록된 Figure 타입 이름들. */
62
+ export declare function figureTypes(): string[];
63
+ export declare function hasFigure(type: string): boolean;
64
+ /**
65
+ * 등록을 지운다. 컴포넌트 타입 등록은 건드리지 않는다 — 지우면 보드에 이미 놓인
66
+ * 인스턴스가 세워지지 못한다. 청사진이 없으면 인스턴스가 자리 표시를 그린다.
67
+ */
68
+ export declare function unregisterFigure(type: string): boolean;
69
+ /** 시험을 위해 전부 지운다. */
70
+ export declare function resetFigures(): void;
71
+ //# sourceMappingURL=figure-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure-registry.d.ts","sourceRoot":"","sources":["../../src/figure/figure-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,uBAAuB,CAAA;AAI9B;;;;;;;;;;;GAWG;AAEH,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,qBAAqB,CAAA;IAC7B,KAAK,EAAE,oBAAoB,CAAA;IAC3B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,KAAK,CAAC,EAAE,oBAAoB,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,oBAAoB,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,KAAK,CAAC,EAAE,oBAAoB,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,eAAe,CAAA;IAC1B;;;;;;;;OAQG;IACH,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,wBAAwB;IACxB,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAA;CACvB;AAUD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEvD;AAkCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,GAAG,cAAc,CAiBzE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAW7D;AAED,yBAAyB;AACzB,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,qBAAqB;AACrB,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 저작한 Figure 를 things-scene 에서 다루는 부분.
3
+ *
4
+ * 이 묶음을 읽으면 `registerFigure()` 가 쓸 수 있게 이어진다 — `figure-instance.ts` 가
5
+ * 적재되며 컴포넌트 클래스를 registry 에 넣기 때문이다. 그래서 instance 를 먼저 읽는다.
6
+ */
7
+ export * from './figure-instance.js';
8
+ export * from './figure-part-component.js';
9
+ export * from './figure-blueprint.js';
10
+ export * from './figure-palette.js';
11
+ export * from './figure-registry.js';
12
+ export * from './figure-real-object.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/figure/index.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,cAAc,sBAAsB,CAAA;AAKpC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA"}
@@ -8,6 +8,32 @@ import type { Properties } from './types.js';
8
8
  * object3d 를 갖기 때문에 인터페이스에도 노출. 타입은 any — 명시 타입이 필요한
9
9
  * 곳은 IThreeRealObject(src/threed/interfaces.ts) 또는 구체 구현 클래스로 좁혀 사용.
10
10
  */
11
+ /**
12
+ * 톱뷰 윤곽 — 3D 형상을 위에서 내려다본 폐다각형.
13
+ *
14
+ * 3D 로만 저작한 형상의 2D 표현을 **계산**하기 위한 것이다. 2D 를 따로 그리지 않으니,
15
+ * 2D 와 3D 가 다른 물건으로 보이는 일이 생기지 않는다.
16
+ *
17
+ * 좌표 규약 — 원점은 컴포넌트 중심, x 는 오른쪽, y 는 아래. 2D 캔버스와 같은 방향이라
18
+ * 변환 없이 쓸 수 있다. 컴포넌트 자신의 회전은 **적용되지 않은** 상태다(회전은 2D 쪽이
19
+ * 얹는다).
20
+ */
21
+ export interface TopOutline {
22
+ /**
23
+ * 폐다각형의 점들. 첫 점과 끝 점을 이어 닫힌 것으로 읽는다 — 마지막에 첫 점을
24
+ * 되풀어 넣지 않는다.
25
+ */
26
+ points: {
27
+ x: number;
28
+ y: number;
29
+ }[];
30
+ /**
31
+ * 곡선을 그 수로 근사했다는 뜻. 없으면 **직선 형상이거나 알 수 없다** — 둘을
32
+ * 구별하지 않는다. 압출 계열은 경로가 이미 점으로 바뀐 뒤에 오므로 원래 분할 수를
33
+ * 알 수 없어 비워 둔다.
34
+ */
35
+ segments?: number;
36
+ }
11
37
  export interface IRealObject {
12
38
  /**
13
39
  * THREE.Object3D 인스턴스. THREE 의존성 회피를 위해 any 로 노출.
@@ -36,6 +62,14 @@ export interface IRealObject {
36
62
  updateText(): void;
37
63
  /** Component 속성 변경 시 호출 */
38
64
  onchange(after: Properties, before: Properties): void;
65
+ /**
66
+ * 톱뷰 윤곽을 계산해 돌려준다. **계산할 수 없으면 `null`** — 빈 배열이나 경계상자로
67
+ * 갈음하지 않는다. 부르는 쪽이 「윤곽이 없다」와 「윤곽이 비었다」를 구별해야 한다.
68
+ *
69
+ * 계산할 수 없는 예 — 외부 모델(glTF)처럼 형상이 파일에서 오는 것, 텍스트·DOM
70
+ * 오버레이처럼 두께가 없는 것.
71
+ */
72
+ topOutline(): TopOutline | null;
39
73
  /** 포커스 여부 (getter/setter) */
40
74
  focused: boolean;
41
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"real-object.d.ts","sourceRoot":"","sources":["../../src/interfaces/real-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAA;IAGd,wDAAwD;IACxD,MAAM,IAAI,IAAI,CAAA;IACd,aAAa;IACb,OAAO,IAAI,IAAI,CAAA;IAGf,0CAA0C;IAC1C,eAAe,IAAI,IAAI,CAAA;IACvB,oDAAoD;IACpD,eAAe,IAAI,IAAI,CAAA;IACvB,eAAe;IACf,cAAc,IAAI,IAAI,CAAA;IAGtB,gBAAgB;IAChB,WAAW,IAAI,IAAI,CAAA;IACnB,eAAe;IACf,YAAY,IAAI,IAAI,CAAA;IACpB,iBAAiB;IACjB,eAAe,IAAI,IAAI,CAAA;IACvB,eAAe;IACf,iBAAiB,IAAI,IAAI,CAAA;IACzB,gBAAgB;IAChB,UAAU,IAAI,IAAI,CAAA;IAGlB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IAGrD,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAA;CACjB"}
1
+ {"version":3,"file":"real-object.d.ts","sourceRoot":"","sources":["../../src/interfaces/real-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;;;GAQG;AACH;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAClC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAA;IAGd,wDAAwD;IACxD,MAAM,IAAI,IAAI,CAAA;IACd,aAAa;IACb,OAAO,IAAI,IAAI,CAAA;IAGf,0CAA0C;IAC1C,eAAe,IAAI,IAAI,CAAA;IACvB,oDAAoD;IACpD,eAAe,IAAI,IAAI,CAAA;IACvB,eAAe;IACf,cAAc,IAAI,IAAI,CAAA;IAGtB,gBAAgB;IAChB,WAAW,IAAI,IAAI,CAAA;IACnB,eAAe;IACf,YAAY,IAAI,IAAI,CAAA;IACpB,iBAAiB;IACjB,eAAe,IAAI,IAAI,CAAA;IACvB,eAAe;IACf,iBAAiB,IAAI,IAAI,CAAA;IACzB,gBAAgB;IAChB,UAAU,IAAI,IAAI,CAAA;IAGlB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IAGrD;;;;;;OAMG;IACH,UAAU,IAAI,UAAU,GAAG,IAAI,CAAA;IAG/B,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAA;CACjB"}
@@ -56,6 +56,13 @@ export default class ModelLayer extends DualCanvasLayer implements ThreeDimensio
56
56
  */
57
57
  private get _threedEnabled();
58
58
  is3dContainer(): boolean;
59
+ /**
60
+ * 반사할 환경(IBL)이 걸려 있나. 진단이 묻는 공개 질문이다.
61
+ *
62
+ * `metalness` 가 높은 재질은 이것이 없으면 고른 색과 무관하게 어둡게 나온다 —
63
+ * PBR 에서 완전한 금속은 확산 성분이 없어 보이는 것이 전부 반사이기 때문이다.
64
+ */
65
+ get hasEnvironment(): boolean;
59
66
  get gizmoMode(): 'translate' | 'rotate' | 'scale' | undefined;
60
67
  setGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void;
61
68
  /** 도움말 패널 열기/닫기 — 단축키 `H` 와 같은 동작. */
@@ -73,10 +80,10 @@ export default class ModelLayer extends DualCanvasLayer implements ThreeDimensio
73
80
  * 단축키가 하는 일과 공개 API 가 하는 일은 같아야 한다.
74
81
  */
75
82
  setCameraView(view: CameraViewName): void;
76
- get scene3d(): THREE.Scene | undefined;
83
+ get scene3d(): THREE.Scene<THREE.Object3DEventMap> | undefined;
77
84
  get renderer3d(): THREE.WebGLRenderer | undefined;
78
85
  get activeCamera3d(): THREE.Camera | undefined;
79
- get mixer(): THREE.AnimationMixer | undefined;
86
+ get mixer(): THREE.AnimationMixer<THREE.AnimationMixerEventMap> | undefined;
80
87
  addArrow3D(id: string, from: Component, to: Component, style?: ArrowStyle3D): void;
81
88
  removeArrow3D(id: string): void;
82
89
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"model-layer.d.ts","sourceRoot":"","sources":["../../src/layer/model-layer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-layer.d.ts","sourceRoot":"","sources":["../../src/layer/model-layer.ts"],"names":[],"mappings":"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"}