@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.
- package/dist-types/diagnostics/inspector.d.ts +47 -0
- package/dist-types/diagnostics/inspector.d.ts.map +1 -1
- package/dist-types/figure/figure-blueprint.d.ts +123 -0
- package/dist-types/figure/figure-blueprint.d.ts.map +1 -0
- package/dist-types/figure/figure-instance.d.ts +299 -0
- package/dist-types/figure/figure-instance.d.ts.map +1 -0
- package/dist-types/figure/figure-palette.d.ts +37 -0
- package/dist-types/figure/figure-palette.d.ts.map +1 -0
- package/dist-types/figure/figure-part-component.d.ts +324 -0
- package/dist-types/figure/figure-part-component.d.ts.map +1 -0
- package/dist-types/figure/figure-real-object.d.ts +92 -0
- package/dist-types/figure/figure-real-object.d.ts.map +1 -0
- package/dist-types/figure/figure-registry.d.ts +71 -0
- package/dist-types/figure/figure-registry.d.ts.map +1 -0
- package/dist-types/figure/index.d.ts +13 -0
- package/dist-types/figure/index.d.ts.map +1 -0
- package/dist-types/interfaces/real-object.d.ts +34 -0
- package/dist-types/interfaces/real-object.d.ts.map +1 -1
- package/dist-types/layer/model-layer.d.ts +9 -2
- package/dist-types/layer/model-layer.d.ts.map +1 -1
- package/dist-types/model/arrange.d.ts +61 -0
- package/dist-types/model/arrange.d.ts.map +1 -0
- package/dist-types/model/index.d.ts +1 -0
- package/dist-types/model/index.d.ts.map +1 -1
- package/dist-types/things-scene/index.d.ts +1 -0
- package/dist-types/things-scene/index.d.ts.map +1 -1
- package/dist-types/threed/common.d.ts +8 -0
- package/dist-types/threed/common.d.ts.map +1 -1
- package/dist-types/threed/coordinate-ground.d.ts +51 -0
- package/dist-types/threed/coordinate-ground.d.ts.map +1 -0
- package/dist-types/threed/factories/camera.d.ts +1 -1
- package/dist-types/threed/factories/cube.d.ts +8 -0
- package/dist-types/threed/factories/cube.d.ts.map +1 -1
- package/dist-types/threed/factories/cylinder.d.ts +17 -0
- package/dist-types/threed/factories/cylinder.d.ts.map +1 -1
- package/dist-types/threed/factories/sphere.d.ts +11 -0
- package/dist-types/threed/factories/sphere.d.ts.map +1 -1
- package/dist-types/threed/factories/wall.d.ts +8 -0
- package/dist-types/threed/factories/wall.d.ts.map +1 -1
- package/dist-types/threed/floor/floor.d.ts +22 -0
- package/dist-types/threed/floor/floor.d.ts.map +1 -1
- package/dist-types/threed/geometry-bank.d.ts +64 -0
- package/dist-types/threed/geometry-bank.d.ts.map +1 -0
- package/dist-types/threed/index.d.ts +8 -0
- package/dist-types/threed/index.d.ts.map +1 -1
- package/dist-types/threed/instanced-set.d.ts +211 -0
- package/dist-types/threed/instanced-set.d.ts.map +1 -0
- package/dist-types/threed/managers/event-manager3d.d.ts +7 -0
- package/dist-types/threed/managers/event-manager3d.d.ts.map +1 -1
- package/dist-types/threed/managers/gizmo-operation-manager.d.ts +8 -0
- package/dist-types/threed/managers/gizmo-operation-manager.d.ts.map +1 -1
- package/dist-types/threed/managers/renderer-manager.d.ts +3 -3
- package/dist-types/threed/managers/renderer-manager.d.ts.map +1 -1
- package/dist-types/threed/managers/scene-manager.d.ts +33 -9
- package/dist-types/threed/managers/scene-manager.d.ts.map +1 -1
- package/dist-types/threed/managers/types.d.ts +10 -0
- package/dist-types/threed/managers/types.d.ts.map +1 -1
- package/dist-types/threed/material-3d.d.ts +9 -0
- package/dist-types/threed/material-3d.d.ts.map +1 -1
- package/dist-types/threed/parted-real-object.d.ts +79 -0
- package/dist-types/threed/parted-real-object.d.ts.map +1 -0
- package/dist-types/threed/real-object-camera-meshed.d.ts +1 -1
- package/dist-types/threed/real-object-dom-texture.d.ts +2 -2
- package/dist-types/threed/real-object-extrude.d.ts +14 -0
- package/dist-types/threed/real-object-extrude.d.ts.map +1 -1
- package/dist-types/threed/real-object-gltf.d.ts +11 -0
- package/dist-types/threed/real-object-gltf.d.ts.map +1 -1
- package/dist-types/threed/real-object-mesh.d.ts +79 -2
- package/dist-types/threed/real-object-mesh.d.ts.map +1 -1
- package/dist-types/threed/real-object-plane-2d.d.ts +2 -2
- package/dist-types/threed/real-object-scene.d.ts +2 -2
- package/dist-types/threed/real-object-service.d.ts +2 -2
- package/dist-types/threed/real-object.d.ts +46 -2
- package/dist-types/threed/real-object.d.ts.map +1 -1
- package/dist-types/threed/segments.d.ts +49 -0
- package/dist-types/threed/segments.d.ts.map +1 -0
- package/dist-types/threed/three-capability.d.ts +18 -0
- package/dist-types/threed/three-capability.d.ts.map +1 -1
- package/dist-types/threed/three-container.d.ts +8 -3
- package/dist-types/threed/three-container.d.ts.map +1 -1
- package/dist-types/threed/top-outline.d.ts +37 -0
- package/dist-types/threed/top-outline.d.ts.map +1 -0
- package/dist-types/threed/utils/dispose.d.ts.map +1 -1
- package/dist-types/transition/transition-effect.d.ts.map +1 -1
- package/package.json +3 -3
- package/things-scene-min.js +11 -11
- package/things-scene-min.js.map +1 -1
- package/things-scene-transfer.mjs +3 -3
- package/things-scene.mjs +3 -3
- package/things-scene.mjs.map +1 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* 같은 형상을 여러 자리에 그리는 묶음 — `THREE.InstancedMesh` 를 감싼다.
|
|
4
|
+
*
|
|
5
|
+
* ## 어디에 쓰나
|
|
6
|
+
*
|
|
7
|
+
* **한 컴포넌트가 같은 것을 여러 번 그리는 자리.** 스토커의 선반 칸과 기둥, 컨베이어의
|
|
8
|
+
* 롤러, 랙의 단. 이런 것들은 애초에 개별 컴포넌트가 아니라 **한 컴포넌트가 그리는 반복
|
|
9
|
+
* 구조**라서, 소유자가 분명하고 things-scene 의 「컴포넌트 하나 = RealObject 하나」를
|
|
10
|
+
* 깨지 않는다.
|
|
11
|
+
*
|
|
12
|
+
* figure-model 의 `sizing: 'repeat'` — 「개수가 늘어난다. 새 geometry 가 생기지 않는다」
|
|
13
|
+
* — 가 가리키는 런타임이 이것이다.
|
|
14
|
+
*
|
|
15
|
+
* ## 무엇을 얻고 무엇을 잃나
|
|
16
|
+
*
|
|
17
|
+
* 얻는 것 — draw call 이 개수와 무관하게 **하나**가 되고, Object3D 가 하나뿐이라 프레임
|
|
18
|
+
* 마다 도는 씬 그래프 순회도 하나로 준다.
|
|
19
|
+
*
|
|
20
|
+
* 잃는 것 — **컬링이 묶음 단위다.** 인스턴스 하나하나를 잘라내지 못하므로 화면 밖까지
|
|
21
|
+
* 정점 처리를 태운다. 그리고 색 말고 다른 재질 속성은 인스턴스별로 줄 수 없다.
|
|
22
|
+
*
|
|
23
|
+
* ## 흩어져 있으면 손해인가 — 실기에서 재보니 아니었다
|
|
24
|
+
*
|
|
25
|
+
* 롤러 5000개를 넓게 흩어 놓고(상당수 화면 밖) 견준 값. `test/browser/check-spinning.mjs`
|
|
26
|
+
*
|
|
27
|
+
* 실기 GPU (Apple M5) 그리기 프레임 draw call 삼각형
|
|
28
|
+
* 낱개 3.95ms 18.5ms 3122 99904
|
|
29
|
+
* 묶음 0.61ms 16.7ms 1 160000
|
|
30
|
+
*
|
|
31
|
+
* 소프트웨어 (swiftshader)
|
|
32
|
+
* 낱개 1.57ms 32.3ms 3122 99904
|
|
33
|
+
* 묶음 0.14ms 43.8ms 1 160000
|
|
34
|
+
*
|
|
35
|
+
* **같은 장면인데 결론이 반대다.** 소프트웨어에서는 삼각형을 60% 더 그리는 것이 곧 CPU
|
|
36
|
+
* 시간이라 묶음이 졌다. 실기 GPU 에서 16만 삼각형은 거의 공짜이고, 3122 번의 draw call
|
|
37
|
+
* 제출이 3.95ms 를 먹는다.
|
|
38
|
+
*
|
|
39
|
+
* 그래서 「뭉쳐 있어야 한다」는 조건은 실기에서는 성립하지 않는다. 컬링을 잃는 대신
|
|
40
|
+
* draw call 을 얻는 거래이고, 실기에서는 그 거래가 남는다.
|
|
41
|
+
*
|
|
42
|
+
* ## 무엇이 실제로 비싼가
|
|
43
|
+
*
|
|
44
|
+
* 프레임마다 **전부** 다시 쓰면 그 비용이 개수에 비례한다. 2만 개에서는 낱개보다
|
|
45
|
+
* 커진다(갱신 2.2ms 대 0.9ms) — 그래도 그리기 절감(5.6ms → 0.33ms)이 그것을 덮는다.
|
|
46
|
+
*
|
|
47
|
+
* 움직이는 것만 고치면(`setRotation` + `commitMatrices`) 갱신이 20~85배 싸다.
|
|
48
|
+
* 행렬 버퍼는 통째로 올라가지만 그 비용은 작다(2만 개에서 0.33ms).
|
|
49
|
+
*
|
|
50
|
+
* ## 안정된 참조
|
|
51
|
+
*
|
|
52
|
+
*
|
|
53
|
+
* `object3d` 는 `THREE.Group` 이고 그 안에 `InstancedMesh` 가 하나 있다. 개수가 용량을
|
|
54
|
+
* 넘으면 안쪽 mesh 를 다시 만드는데, 바깥 Group 이 그대로라 소유자가 붙여 둔 참조가
|
|
55
|
+
* 끊기지 않는다.
|
|
56
|
+
*/
|
|
57
|
+
export interface InstancedPlacement {
|
|
58
|
+
/** 묶음 로컬 좌표(three 축: x 오른쪽 · y 위 · z 앞). */
|
|
59
|
+
position: {
|
|
60
|
+
x: number;
|
|
61
|
+
y: number;
|
|
62
|
+
z: number;
|
|
63
|
+
};
|
|
64
|
+
/** 크기. 수 하나면 세 축 모두. 없으면 1. */
|
|
65
|
+
scale?: number | {
|
|
66
|
+
x?: number;
|
|
67
|
+
y?: number;
|
|
68
|
+
z?: number;
|
|
69
|
+
};
|
|
70
|
+
/** 축별 회전(라디안). 없으면 0. */
|
|
71
|
+
rotation?: {
|
|
72
|
+
x?: number;
|
|
73
|
+
y?: number;
|
|
74
|
+
z?: number;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 이 인스턴스의 색. 없으면 재질의 색 그대로.
|
|
78
|
+
*
|
|
79
|
+
* **인스턴스별로 줄 수 있는 것은 색뿐이다** — metalness·roughness·투명도는 재질에
|
|
80
|
+
* 있고 묶음 전체가 나눠 쓴다. 상태를 색으로 표현하는 것은 되고, 상태에 따라 재질을
|
|
81
|
+
* 바꾸는 것은 안 된다.
|
|
82
|
+
*/
|
|
83
|
+
color?: string | number;
|
|
84
|
+
}
|
|
85
|
+
export interface InstancedSetOptions {
|
|
86
|
+
geometry: THREE.BufferGeometry;
|
|
87
|
+
material: THREE.Material;
|
|
88
|
+
/** 처음 잡아 둘 자리 수. 넘으면 다시 만든다. 기본 16 */
|
|
89
|
+
capacity?: number;
|
|
90
|
+
name?: string;
|
|
91
|
+
castShadow?: boolean;
|
|
92
|
+
receiveShadow?: boolean;
|
|
93
|
+
}
|
|
94
|
+
export declare class InstancedSet {
|
|
95
|
+
/** 소유자가 붙여 두는 안정된 노드. 안쪽 mesh 가 바뀌어도 이것은 그대로다. */
|
|
96
|
+
readonly object3d: THREE.Group;
|
|
97
|
+
private _mesh;
|
|
98
|
+
private _geometry;
|
|
99
|
+
private _material;
|
|
100
|
+
private _capacity;
|
|
101
|
+
private _count;
|
|
102
|
+
/**
|
|
103
|
+
* 놓은 배치를 들고 있는다.
|
|
104
|
+
*
|
|
105
|
+
* 회전만 바꿀 때 자리와 크기를 알아야 행렬을 다시 쓸 수 있다. 행렬에서 되읽어
|
|
106
|
+
* 분해할 수도 있지만, 프레임마다 도는 자리(롤러)에서는 그 분해가 그대로 비용이 된다.
|
|
107
|
+
*/
|
|
108
|
+
private _placements;
|
|
109
|
+
private _name;
|
|
110
|
+
private _castShadow;
|
|
111
|
+
private _receiveShadow;
|
|
112
|
+
/** 행렬을 만들 때 쓰는 임시값 — 인스턴스마다 새로 만들지 않는다. */
|
|
113
|
+
private static readonly _m;
|
|
114
|
+
private static readonly _p;
|
|
115
|
+
private static readonly _q;
|
|
116
|
+
private static readonly _e;
|
|
117
|
+
private static readonly _s;
|
|
118
|
+
private static readonly _c;
|
|
119
|
+
constructor(options: InstancedSetOptions);
|
|
120
|
+
private _makeMesh;
|
|
121
|
+
/** 안쪽 mesh. 레이캐스트 대상으로 쓴다. */
|
|
122
|
+
get mesh(): THREE.InstancedMesh;
|
|
123
|
+
/** 지금 그려지는 개수. */
|
|
124
|
+
get count(): number;
|
|
125
|
+
/** 잡아 둔 자리 수. 개수가 이것을 넘으면 mesh 를 다시 만든다. */
|
|
126
|
+
get capacity(): number;
|
|
127
|
+
/**
|
|
128
|
+
* 배치를 통째로 갈아 끼운다.
|
|
129
|
+
*
|
|
130
|
+
* 용량이 모자라면 안쪽 mesh 를 다시 만든다 — geometry 와 material 은 그대로 나눠
|
|
131
|
+
* 쓰므로 다시 만드는 비용은 행렬 버퍼뿐이다.
|
|
132
|
+
*/
|
|
133
|
+
place(placements: readonly InstancedPlacement[]): void;
|
|
134
|
+
/** 인스턴스 하나의 자리·크기·회전·색을 고친다. 범위를 벗어나면 아무것도 하지 않는다. */
|
|
135
|
+
update(index: number, placement: InstancedPlacement): void;
|
|
136
|
+
/**
|
|
137
|
+
* 회전만 바꾼다 — 자리와 크기는 그대로다.
|
|
138
|
+
*
|
|
139
|
+
* 프레임마다 도는 것(컨베이어 롤러, 회전 설비)을 위한 자리다. 여러 개를 고친 뒤
|
|
140
|
+
* `commitMatrices()` 를 **한 번** 부른다.
|
|
141
|
+
*
|
|
142
|
+
* **경계구를 다시 재지 않는다.** 제 축으로 도는 것은 인스턴스의 반지름을 바꾸지
|
|
143
|
+
* 않으므로 다시 잴 이유가 없고, 매 프레임 다시 재면 인스턴스를 전부 훑어 그것이
|
|
144
|
+
* 회전 비용의 대부분이 된다.
|
|
145
|
+
*/
|
|
146
|
+
setRotation(index: number, rotation: {
|
|
147
|
+
x?: number;
|
|
148
|
+
y?: number;
|
|
149
|
+
z?: number;
|
|
150
|
+
}): void;
|
|
151
|
+
/**
|
|
152
|
+
* 고친 행렬을 GPU 로 올린다. **경계구는 건드리지 않는다.**
|
|
153
|
+
*
|
|
154
|
+
* `setRotation` 처럼 자리·크기를 바꾸지 않은 변경에 쓴다. 자리가 바뀌었으면
|
|
155
|
+
* `commit()` 을 써야 컬링이 어긋나지 않는다.
|
|
156
|
+
*/
|
|
157
|
+
commitMatrices(): void;
|
|
158
|
+
/**
|
|
159
|
+
* 색만 고친다 — 상태 표현이 가장 자주 바뀌는 자리다.
|
|
160
|
+
*
|
|
161
|
+
* 행렬은 건드리지 않으므로 자리를 다시 계산하지 않는다.
|
|
162
|
+
*/
|
|
163
|
+
setColor(index: number, color: string | number): void;
|
|
164
|
+
/**
|
|
165
|
+
* 레이캐스트가 준 `instanceId` 를 논리 색인으로 옮긴다.
|
|
166
|
+
*
|
|
167
|
+
* 지금은 같은 수지만 계약으로 둔다 — 나중에 빈 칸을 건너뛰며 채우게 되면 둘이
|
|
168
|
+
* 갈린다. 부르는 쪽이 `instanceId` 를 그대로 쓰면 그때 조용히 어긋난다.
|
|
169
|
+
*/
|
|
170
|
+
indexOf(instanceId: number): number;
|
|
171
|
+
/**
|
|
172
|
+
* 바뀐 것을 GPU 로 올린다.
|
|
173
|
+
*
|
|
174
|
+
* 경계구를 다시 잰다 — `InstancedMesh` 의 그것은 인스턴스 행렬까지 보므로, 이걸
|
|
175
|
+
* 빠뜨리면 묶음이 화면 안에 있는데도 잘려 사라진다.
|
|
176
|
+
*/
|
|
177
|
+
commit(): void;
|
|
178
|
+
/**
|
|
179
|
+
* 행렬 버퍼를 해제한다.
|
|
180
|
+
*
|
|
181
|
+
* **geometry 와 material 은 해제하지 않는다** — 창고(GeometryBank·MaterialBank)가
|
|
182
|
+
* 여러 곳과 나눠 쓰는 것이라 여기서 지우면 남은 쪽이 함께 죽는다.
|
|
183
|
+
*/
|
|
184
|
+
dispose(): void;
|
|
185
|
+
private _writeMatrix;
|
|
186
|
+
private _writeColor;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 격자로 자리를 만든다 — 선반 칸·기둥처럼 규칙적으로 늘어선 것.
|
|
190
|
+
*
|
|
191
|
+
* 개수만 바뀌고 형상은 그대로인 구조가 이 모양이다. `sizing: 'repeat'` 이 뜻하는 것도
|
|
192
|
+
* 이것이다.
|
|
193
|
+
*
|
|
194
|
+
* @param counts 축별 개수. 0 이면 그 축은 한 줄로 친다
|
|
195
|
+
* @param pitch 축별 간격
|
|
196
|
+
* @param origin 첫 자리. 없으면 원점
|
|
197
|
+
*/
|
|
198
|
+
export declare function gridPlacements(counts: {
|
|
199
|
+
x?: number;
|
|
200
|
+
y?: number;
|
|
201
|
+
z?: number;
|
|
202
|
+
}, pitch: {
|
|
203
|
+
x?: number;
|
|
204
|
+
y?: number;
|
|
205
|
+
z?: number;
|
|
206
|
+
}, origin?: {
|
|
207
|
+
x?: number;
|
|
208
|
+
y?: number;
|
|
209
|
+
z?: number;
|
|
210
|
+
}): InstancedPlacement[];
|
|
211
|
+
//# sourceMappingURL=instanced-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanced-set.d.ts","sourceRoot":"","sources":["../../src/threed/instanced-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,13 @@ export declare class EventManager3D {
|
|
|
12
12
|
get lastHovered(): IThreeRealObject | undefined;
|
|
13
13
|
set lastHovered(value: IThreeRealObject | undefined);
|
|
14
14
|
updateMouseNDC(px: number, py: number, left: number, top: number, width: number, height: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* 마지막 집기에서 **실제로 맞은** Object3D.
|
|
17
|
+
*
|
|
18
|
+
* `getObjectByRaycast` 는 맞은 것에서 위로 걸어 올라가 컴포넌트를 찾아 돌려주므로,
|
|
19
|
+
* 맞은 자리 자체는 버려진다. 안쪽이 조각으로 나뉘는 컴포넌트가 그것을 알아야 한다.
|
|
20
|
+
*/
|
|
21
|
+
private _lastHit?;
|
|
15
22
|
getObjectByRaycast(camera: THREE.Camera, scene: THREE.Scene): THREE.Object3D | undefined;
|
|
16
23
|
/**
|
|
17
24
|
* Object3D의 전체 조상 체인이 visible인지 확인한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-manager3d.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/event-manager3d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"event-manager3d.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/event-manager3d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAC,CAAkB;;IAIvC,IAAI,KAAK,kBAER;IAED,IAAI,WAAW,IAIQ,gBAAgB,GAAG,SAAS,CAFlD;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EAElD;IAED,IAAI,WAAW,IAIQ,gBAAgB,GAAG,SAAS,CAFlD;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EAElD;IAED,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK/F;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,CAAgB;IAEjC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS;IAoCxF;;;OAGG;IACH,OAAO,CAAC,eAAe;IASvB,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE;IAMnF,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAc;IAEjC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;IAK/C,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS;IAmCtG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU;IAyBvE;;;;OAIG;IACH,sBAAsB,IAAI,IAAI;IAQ9B,OAAO;CAMR"}
|
|
@@ -67,6 +67,14 @@ export declare class GizmoOperationManager {
|
|
|
67
67
|
/**
|
|
68
68
|
* 기즈모 드래그 결과를 컴포넌트 속성에 역변환하여 반영한다.
|
|
69
69
|
*/
|
|
70
|
+
/**
|
|
71
|
+
* 조각을 끌었을 때 그 결과를 컴포넌트에 되쓴다.
|
|
72
|
+
*
|
|
73
|
+
* 씬은 조각을 옮겨 놓기만 하고, 무엇으로 옮겨 적을지는 컴포넌트가 안다.
|
|
74
|
+
* 되쓰는 자리가 없는 컴포넌트라면 아무 일도 하지 않는다 — 그런 컴포넌트는
|
|
75
|
+
* 애초에 `partObject` 가 `undefined` 를 내어 기즈모가 붙지 않는다.
|
|
76
|
+
*/
|
|
77
|
+
private _syncPartFromGizmo;
|
|
70
78
|
private _syncFromGizmo;
|
|
71
79
|
/**
|
|
72
80
|
* 오브젝트 바닥면이 Y=0(바닥)에 가까우면 스냅한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gizmo-operation-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/gizmo-operation-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gizmo-operation-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/gizmo-operation-manager.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAA;IAClB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;IAClC,UAAU,IAAI,IAAI,CAAA;CACnB;AAcD;;;;;GAKG;AACH,qBAAa,qBAAqB;IAEhC,OAAO,CAAC,iBAAiB,CAAC,CAAkB;IAC5C,OAAO,CAAC,aAAa,CAAC,CAAqC;IAE3D,OAAO,CAAC,sBAAsB,CAAC,CAAQ;IAGvC,OAAO,CAAC,gBAAgB,CAAC,CAAqC;IAE9D,OAAO,CAAC,wBAAwB,CAAC,CAAe;IAGhD,OAAO,CAAC,kBAAkB,CAAC,CAAoD;IAC/E,OAAO,CAAC,gBAAgB,CAAQ;IAGhC,OAAO,CAAC,mBAAmB,CAAC,CAAgC;IAC5D,OAAO,CAAC,qBAAqB,CAAC,CAAa;IAC3C,OAAO,CAAC,4BAA4B,CAAC,CAA8B;IACnE,OAAO,CAAC,6BAA6B,CAAC,CAAqC;IAE3E,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAC,CAAe;IAE1C;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIpC;;;;OAIG;IACH,cAAc,CACZ,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE;QAAE,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,EACvD,OAAO,EAAE,MAAM,kBAAkB,GAAG,SAAS,EAC7C,SAAS,CAAC,EAAE;QACV,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;QAC/C,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;KAClD,GACA,IAAI;IAuCP,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,wBAAwB;IA2ChC,OAAO,CAAC,oBAAoB;IAiB5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,UAAU;IA4ElB;;OAEG;IACH;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,cAAc;IA6DtB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAmC/B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;;;;OAKG;IACH,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,kBAAkB;IA2C1B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,gBAAgB;CAMzB"}
|
|
@@ -21,12 +21,12 @@ export declare class RendererManager {
|
|
|
21
21
|
*/
|
|
22
22
|
setExposure(value: number): void;
|
|
23
23
|
get css3DRenderer(): CSS3DRenderer;
|
|
24
|
-
get css3DScene(): THREE.Scene
|
|
24
|
+
get css3DScene(): THREE.Scene<THREE.Object3DEventMap>;
|
|
25
25
|
get composer(): EffectComposer | undefined;
|
|
26
26
|
get noSupportWebgl(): boolean;
|
|
27
27
|
get domElement(): HTMLCanvasElement | undefined;
|
|
28
|
-
get hudScene(): THREE.Scene
|
|
29
|
-
get hudCSS3DScene(): THREE.Scene
|
|
28
|
+
get hudScene(): THREE.Scene<THREE.Object3DEventMap>;
|
|
29
|
+
get hudCSS3DScene(): THREE.Scene<THREE.Object3DEventMap>;
|
|
30
30
|
get hudCamera(): THREE.OrthographicCamera | undefined;
|
|
31
31
|
/**
|
|
32
32
|
* HUD 직교 카메라를 초기화한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/renderer-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAA;AAKpF,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,eAAe,CAAQ;IAG/B,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAA0B;IAE7C,OAAO,CAAC,iBAAiB,CAAC,CAAe;IACzC,OAAO,CAAC,cAAc,CAAC,CAAa;IACpC,OAAO,CAAC,eAAe,CAAC,CAA0B;IAElD,IAAI,QAAQ,oCAEX;IAED;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,IAAI,aAAa,kBAKhB;IAED,IAAI,UAAU,
|
|
1
|
+
{"version":3,"file":"renderer-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/renderer-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAA;AAKpF,OAAO,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,eAAe,CAAQ;IAG/B,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAA0B;IAE7C,OAAO,CAAC,iBAAiB,CAAC,CAAe;IACzC,OAAO,CAAC,cAAc,CAAC,CAAa;IACpC,OAAO,CAAC,eAAe,CAAC,CAA0B;IAElD,IAAI,QAAQ,oCAEX;IAED;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,IAAI,aAAa,kBAKhB;IAED,IAAI,UAAU,wCAKb;IAED,IAAI,QAAQ,+BAEX;IAED,IAAI,cAAc,YAEjB;IAED,IAAI,UAAU,kCAEb;IAED,IAAI,QAAQ,wCAKX;IAED,IAAI,aAAa,wCAKhB;IAED,IAAI,SAAS,yCAEZ;IAED;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA4CtC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAQvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO;IA6D1E,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM;IAmBlD,OAAO,CAAC,mBAAmB;IAI3B,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,QAAQ;IA4CnH,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAsB1F,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM;IAa3C;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;IAM3C;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM;IAO7B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAkBpC,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAc;IAE9B;;OAEG;IACH,qBAAqB;IAQrB;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;IAK/D,MAAM;IAsBN,OAAO,CAAC,SAAS;IAcjB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM;IAchC,IAAI,gBAAgB,8BAEnB;IAED,OAAO,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAM5C,OAAO;IAYP,UAAU;IAkCV,iBAAiB;CAMlB"}
|
|
@@ -10,27 +10,51 @@ export declare class SceneManager {
|
|
|
10
10
|
private _scene?;
|
|
11
11
|
private _mixer?;
|
|
12
12
|
private _timer?;
|
|
13
|
+
/** IBL(scene.environment)용 텍스처. */
|
|
13
14
|
private _envTexture?;
|
|
15
|
+
/** 배경(scene.background)용 텍스처. IBL 과 다른 프리셋일 때만 따로 만든다. */
|
|
16
|
+
private _bgTexture?;
|
|
14
17
|
private _renderer?;
|
|
15
|
-
get scene(): THREE.Scene | undefined;
|
|
16
|
-
get mixer(): THREE.AnimationMixer | undefined;
|
|
17
|
-
setup(): THREE.Scene
|
|
18
|
-
setupMixer(): THREE.AnimationMixer
|
|
18
|
+
get scene(): THREE.Scene<THREE.Object3DEventMap> | undefined;
|
|
19
|
+
get mixer(): THREE.AnimationMixer<THREE.AnimationMixerEventMap> | undefined;
|
|
20
|
+
setup(): THREE.Scene<THREE.Object3DEventMap>;
|
|
21
|
+
setupMixer(): THREE.AnimationMixer<THREE.AnimationMixerEventMap>;
|
|
19
22
|
setupEnvironment(renderer: THREE.WebGLRenderer): void;
|
|
23
|
+
/** 프리셋 하나로 PMREM 텍스처를 만든다. 호출자가 dispose 를 책임진다. */
|
|
24
|
+
private _makeEnvTexture;
|
|
20
25
|
/**
|
|
21
|
-
* 환경맵 프리셋을 적용한다.
|
|
26
|
+
* 환경맵 프리셋을 IBL 로 적용한다.
|
|
22
27
|
*/
|
|
23
28
|
private _applyEnvironment;
|
|
24
29
|
/**
|
|
25
30
|
* 환경맵을 해제한다. (IBL 기여 제거)
|
|
26
31
|
*/
|
|
27
32
|
private _clearEnvironment;
|
|
33
|
+
/** 배경용 텍스처를 해제한다. */
|
|
34
|
+
private _clearBackgroundTexture;
|
|
35
|
+
/** 지금 IBL 이 걸려 있나 — 진단이 쓴다. metalness 가 높은 재질은 이것이 없으면 검다. */
|
|
36
|
+
get hasEnvironment(): boolean;
|
|
28
37
|
/**
|
|
29
|
-
* 3D 씬 배경(sky)
|
|
30
|
-
*
|
|
31
|
-
*
|
|
38
|
+
* 3D 씬 배경(sky)과 반사·조명(environment, IBL)을 설정한다.
|
|
39
|
+
*
|
|
40
|
+
* ## 둘은 따로다
|
|
41
|
+
*
|
|
42
|
+
* three.js 의 `scene.background` 와 `scene.environment` 는 별개다. 전에는 이 둘이
|
|
43
|
+
* 붙어 있어서 **배경 없이 반사만** 두는 것이 불가능했다. 그래서 `sky` 를 정하지 않은
|
|
44
|
+
* 보드에서 `metalness` 가 높은 재질(예: `material3d.preset = 'metal'`)이 **반사할
|
|
45
|
+
* 것이 없어 검게** 나왔다. 저작자는 자기가 고른 색이 안 나온 것으로 본다.
|
|
46
|
+
*
|
|
47
|
+
* PBR 에서 완전한 금속은 확산 성분이 없다 — 보이는 것이 전부 반사다. 그래서 이것은
|
|
48
|
+
* 프리셋 값이 틀린 것이 아니라 **반사할 환경을 줄 방법이 없던 것**이 문제였다.
|
|
49
|
+
*
|
|
50
|
+
* @param sky 배경. 프리셋 이름 | `'color'` | `''`(없음)
|
|
51
|
+
* @param skyColor `sky === 'color'` 일 때의 색
|
|
52
|
+
* @param environment IBL 을 배경과 따로 정한다.
|
|
53
|
+
* - 주지 않으면 **`sky` 를 따른다** — 이전과 완전히 같게 동작한다
|
|
54
|
+
* - 프리셋 이름이면 배경과 무관하게 그 반사를 쓴다 (배경 없이 반사만 가능)
|
|
55
|
+
* - `'none'` 이면 `sky` 가 프리셋이어도 IBL 을 끈다
|
|
32
56
|
*/
|
|
33
|
-
setSky(sky?: string, skyColor?: string): void;
|
|
57
|
+
setSky(sky?: string, skyColor?: string, environment?: string): void;
|
|
34
58
|
addFloor(component: Component): void;
|
|
35
59
|
/**
|
|
36
60
|
* 기존 floor를 제거하고 새로 생성하여 교체한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/scene-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AA2B1D;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAItE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAe;IACnC,OAAO,CAAC,SAAS,CAAC,CAAqB;IAEvC,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"scene-manager.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/scene-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AA2B1D;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAItE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,mCAAmC;IACnC,OAAO,CAAC,WAAW,CAAC,CAAe;IACnC,0DAA0D;IAC1D,OAAO,CAAC,UAAU,CAAC,CAAe;IAClC,OAAO,CAAC,SAAS,CAAC,CAAqB;IAEvC,IAAI,KAAK,oDAER;IAED,IAAI,KAAK,mEAER;IAED,KAAK;IAKL,UAAU;IAOV,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa;IAO9C,mDAAmD;IACnD,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB,qBAAqB;IACrB,OAAO,CAAC,uBAAuB;IAO/B,8DAA8D;IAC9D,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IA4C5D,QAAQ,CAAC,SAAS,EAAE,SAAS;IAO7B;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,SAAS;IAYhC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ;IAI/B,eAAe;IAOf,OAAO;CAgCR"}
|
|
@@ -13,6 +13,16 @@ export interface RendererConfig {
|
|
|
13
13
|
postprocessing?: boolean;
|
|
14
14
|
shadowMap?: boolean;
|
|
15
15
|
logarithmicDepthBuffer?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 화면 한 점을 몇 점으로 그리나. 없으면 화면의 값(`devicePixelRatio`)을 쓴다.
|
|
18
|
+
*
|
|
19
|
+
* MSAA 만으로는 부족한 자리가 있다 — 저작면처럼 **작은 화면에 자산 하나**를 크게
|
|
20
|
+
* 띄우면 실루엣의 계단이 그대로 보인다. 그런 화면은 그릴 것이 적으므로 표본을 더
|
|
21
|
+
* 써도 된다. 보드처럼 수백 개를 세우는 화면에서는 올리지 않는다.
|
|
22
|
+
*
|
|
23
|
+
* 화면 값보다 낮게도 줄 수 있다 — 큰 보드를 가볍게 굴릴 때 쓴다.
|
|
24
|
+
*/
|
|
25
|
+
pixelRatio?: number;
|
|
16
26
|
}
|
|
17
27
|
export interface LightingConfig {
|
|
18
28
|
hemisphere: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/threed/managers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IACxE,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACnC,UAAU,CAAC,EAAE,OAAO,CAAA;QACpB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,UAAU,EAAE,OAAO,CAAA;QACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF"}
|
|
@@ -8,6 +8,14 @@ export interface Material3D {
|
|
|
8
8
|
opacity?: number;
|
|
9
9
|
envMapIntensity?: number;
|
|
10
10
|
side?: 'double' | 'front' | 'back';
|
|
11
|
+
/**
|
|
12
|
+
* 면마다 하나의 법선을 쓴다 — 각진 면이 그대로 보인다. default: false(부드럽게).
|
|
13
|
+
*
|
|
14
|
+
* 로우폴리 표현의 핵심 스위치다. 분할 수를 낮춘 원기둥은 smooth shading 에서
|
|
15
|
+
* 「덜 그린 원기둥」으로 보이고, flat shading 에서 「의도한 각기둥」으로 보인다.
|
|
16
|
+
* MaterialBank 의 `MaterialSpec.flatShading` 과 같은 값이며 spec 시그니처에 든다.
|
|
17
|
+
*/
|
|
18
|
+
flatShading?: boolean;
|
|
11
19
|
castShadow?: boolean;
|
|
12
20
|
receiveShadow?: boolean;
|
|
13
21
|
}
|
|
@@ -19,6 +27,7 @@ export interface ResolvedMaterial3D {
|
|
|
19
27
|
opacity: number;
|
|
20
28
|
envMapIntensity: number;
|
|
21
29
|
side: 'double' | 'front' | 'back';
|
|
30
|
+
flatShading: boolean;
|
|
22
31
|
castShadow: boolean;
|
|
23
32
|
receiveShadow: boolean;
|
|
24
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-3d.d.ts","sourceRoot":"","sources":["../../src/threed/material-3d.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,WAAW,UAAU;IAEzB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IAGlC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IACjC,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAQ3D,CAAA;AAED,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,kBAAkB,
|
|
1
|
+
{"version":3,"file":"material-3d.d.ts","sourceRoot":"","sources":["../../src/threed/material-3d.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,WAAW,UAAU;IAEzB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IAGlC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAGrB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IACjC,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAQ3D,CAAA;AAED,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,kBAAkB,CA8B7E;AAQD,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAExE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,oBAAoB,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAgB7G"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* **안쪽이 조각으로 나뉘는 컴포넌트.**
|
|
4
|
+
*
|
|
5
|
+
* 씬에게 선택이란 컴포넌트다. 그런데 어떤 컴포넌트는 안쪽에 **이름이 붙은 조각**을
|
|
6
|
+
* 갖는다 — 반입한 glTF 의 노드가 그렇다. 그런 컴포넌트에서 「컴포넌트가 골라졌다」는
|
|
7
|
+
* 말은 정보를 거의 주지 못한다. 문짝 하나를 눌렀는데 설비 전체에 테가 둘리고,
|
|
8
|
+
* 기즈모도 전체를 끈다.
|
|
9
|
+
*
|
|
10
|
+
* 이 계약이 그 사이를 메운다. 씬은 **조각을 이름으로 가리키는 법**만 알면 되고, 조각을
|
|
11
|
+
* 어떻게 만들고 무엇이라 부르는지는 컴포넌트가 정한다.
|
|
12
|
+
*
|
|
13
|
+
* ## 지금 누가 쓰나
|
|
14
|
+
*
|
|
15
|
+
* 반입한 glTF 컴포넌트가 쓴다(`real-object-gltf.ts`). 그 컴포넌트는 노드마다 상태를
|
|
16
|
+
* 걸 수 있는데(`state.nodes`), 3D 에서 노드를 집을 수 없어 편집기가 이름 목록에서
|
|
17
|
+
* 고르게 해야 했다.
|
|
18
|
+
*
|
|
19
|
+
* **보드에 놓인 Figure 도 언젠가 쓸 수 있다.** 다만 그때는 재질 묶음당 메시 하나로
|
|
20
|
+
* 합쳐져 있어 한 메시가 여러 부품이다. 부품별 정점 구간을 따로 적어 두지 않으면 맞은
|
|
21
|
+
* 삼각형이 어느 부품인지 답할 방법이 없다.
|
|
22
|
+
*
|
|
23
|
+
* 지금은 그 수요가 없다고 보고 **적어만 둔다.** 필요해지면 그때 정점 구간을 기록할지
|
|
24
|
+
* 정한다.
|
|
25
|
+
*
|
|
26
|
+
* (저작면은 이 계약을 쓰지 않는다. 거기서는 부품 하나가 **컴포넌트 하나**라 씬의 기본
|
|
27
|
+
* 선택으로 충분하다.)
|
|
28
|
+
*
|
|
29
|
+
* ## 가릴 수 없으면 가릴 수 없다고 말한다
|
|
30
|
+
*
|
|
31
|
+
* `partAt` 과 `partObject` 는 `undefined` 를 낼 수 있다. 위의 병합된 Figure 가 그런
|
|
32
|
+
* 경우다. 그 자리에서 「첫 부품이겠거니」로 채우면 화면이 엉뚱한 것을 골라 준다.
|
|
33
|
+
* 씬은 `undefined` 를 받으면 종전대로 컴포넌트 전체를 다룬다.
|
|
34
|
+
*
|
|
35
|
+
* ## 왜 조각을 만드는 방법은 계약에 없나
|
|
36
|
+
*
|
|
37
|
+
* 조각이 따로 선 객체인지(glTF), 저작 중에만 갈라지는지(Figure)는 컴포넌트의 사정이다.
|
|
38
|
+
* 계약에 넣으면 씬이 그 사정을 알아야 하고, 그러면 컴포넌트마다 예외가 하나씩 는다.
|
|
39
|
+
*/
|
|
40
|
+
export interface PartedRealObject {
|
|
41
|
+
/** 조각의 이름들. 순서는 컴포넌트가 정한다. */
|
|
42
|
+
partNames(): string[];
|
|
43
|
+
/** 이름으로 조각을 찾는다. 지금 가릴 수 없으면 `undefined`. */
|
|
44
|
+
partObject(name: string): THREE.Object3D | undefined;
|
|
45
|
+
/** 이 Object3D 가 어느 조각인가. 가릴 수 없으면 `undefined`. */
|
|
46
|
+
partAt(hit: THREE.Object3D): string | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* 지금 골라 둔 조각. 씬이 집을 때 채우고, 화면이 목록에서 고를 때도 채운다.
|
|
49
|
+
*
|
|
50
|
+
* 컴포넌트를 골랐지만 조각을 못 가렸으면 `undefined` 다.
|
|
51
|
+
*/
|
|
52
|
+
pickedPart: string | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* 조각을 기즈모로 끌었다. 그 결과를 컴포넌트가 되쓴다.
|
|
55
|
+
*
|
|
56
|
+
* 씬은 조각을 **옮겨만 놓는다** — `Object3D` 의 자리·회전·배율이 이미 바뀐 채로
|
|
57
|
+
* 넘어온다. 그것을 무엇으로 옮겨 적을지는 컴포넌트가 안다. 씬이 형식을 알면
|
|
58
|
+
* 컴포넌트마다 예외가 하나씩 는다.
|
|
59
|
+
*
|
|
60
|
+
* 없으면 조각은 끌리지 않는다 — **조용히 되지 않는 것보다** 낫다. 기즈모가 붙지
|
|
61
|
+
* 않게 하려면 `partObject` 가 `undefined` 를 내면 된다.
|
|
62
|
+
*/
|
|
63
|
+
partMoved?(name: string, object: THREE.Object3D): void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 이 객체가 조각 계약을 지키나.
|
|
67
|
+
*
|
|
68
|
+
* 함수 넷과 값 하나가 다 있어야 한다. 하나라도 빠진 것을 통과시키면 씬이 뒤에서
|
|
69
|
+
* 던진다 — 그때는 어느 컴포넌트가 원인인지 알기 어렵다.
|
|
70
|
+
*/
|
|
71
|
+
export declare function isParted(target: unknown): target is PartedRealObject;
|
|
72
|
+
/**
|
|
73
|
+
* 맞은 자리에서 위로 걸어 올라가며 조각을 찾는다.
|
|
74
|
+
*
|
|
75
|
+
* 조각 하나가 mesh 여럿으로 되어 있을 수 있다 — glTF 노드가 그렇다. 맞은 것은 그
|
|
76
|
+
* 안쪽 mesh 이므로, 조각으로 등록된 조상을 만날 때까지 올라가야 한다.
|
|
77
|
+
*/
|
|
78
|
+
export declare function partAtByIndex(hit: THREE.Object3D, index: Map<string, THREE.Object3D>): string | undefined;
|
|
79
|
+
//# sourceMappingURL=parted-real-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parted-real-object.d.ts","sourceRoot":"","sources":["../../src/threed/parted-real-object.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,SAAS,IAAI,MAAM,EAAE,CAAA;IAErB,6CAA6C;IAC7C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAA;IAEpD,kDAAkD;IAClD,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;IAE/C;;;;OAIG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAE9B;;;;;;;;;OASG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,gBAAgB,CAKpE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,KAAK,CAAC,QAAQ,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GACjC,MAAM,GAAG,SAAS,CAMpB"}
|
|
@@ -7,7 +7,7 @@ export declare class RealObjectCameraMeshed extends RealObjectMesh {
|
|
|
7
7
|
createCamera(): THREE.PerspectiveCamera;
|
|
8
8
|
updateCamera(): void;
|
|
9
9
|
build(): void;
|
|
10
|
-
clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
|
|
10
|
+
clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap> | THREE.Material<THREE.MaterialEventMap>[], THREE.Object3DEventMap>;
|
|
11
11
|
buildGeometry(): void;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=real-object-camera-meshed.d.ts.map
|
|
@@ -7,7 +7,7 @@ export declare class RealObjectDomTexture extends RealObject<THREE.Mesh> {
|
|
|
7
7
|
private _debounceTimer?;
|
|
8
8
|
private _origInvalidate?;
|
|
9
9
|
constructor(component: any);
|
|
10
|
-
protected getObject3dInstance(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
|
|
10
|
+
protected getObject3dInstance(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap> | THREE.Material<THREE.MaterialEventMap>[], THREE.Object3DEventMap>;
|
|
11
11
|
build(): void;
|
|
12
12
|
updateDimension(): void;
|
|
13
13
|
updateAlpha(): void;
|
|
@@ -23,7 +23,7 @@ export declare class RealObjectDomTexture extends RealObject<THREE.Mesh> {
|
|
|
23
23
|
updateText(): void;
|
|
24
24
|
onchange(after: Record<string, any>, before: Record<string, any>): void;
|
|
25
25
|
updateMaterial3d(): void;
|
|
26
|
-
clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
|
|
26
|
+
clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap> | THREE.Material<THREE.MaterialEventMap>[], THREE.Object3DEventMap>;
|
|
27
27
|
dispose(): void;
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=real-object-dom-texture.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
import { RealObject } from './real-object.js';
|
|
3
3
|
import { BoundUVGenerator } from './utils/bound-uv-generator.js';
|
|
4
|
+
import type { TopOutline } from '../interfaces/real-object.js';
|
|
4
5
|
/**
|
|
5
6
|
* ExtrudeGeometry 기반 3D 오브젝트.
|
|
6
7
|
*
|
|
@@ -17,6 +18,19 @@ export declare class RealObjectExtrude extends RealObject {
|
|
|
17
18
|
protected _mesh?: THREE.Mesh;
|
|
18
19
|
clear(): THREE.Object3D<THREE.Object3DEventMap>;
|
|
19
20
|
get shape(): any;
|
|
21
|
+
/**
|
|
22
|
+
* 압출 계열의 톱뷰 윤곽 — **2D 경로가 곧 윤곽이다.** 압출은 2D 형상을 위로 밀어
|
|
23
|
+
* 올린 것이므로 위에서 내려다본 모습이 원래 경로와 같다. 그래서 여섯 서브클래스
|
|
24
|
+
* (rect·ellipse·triangle·star·polygon·donut) 가 이 한 구현을 함께 쓴다.
|
|
25
|
+
*
|
|
26
|
+
* 구멍(donut 의 안쪽)은 담지 않는다 — 윤곽은 실루엣이다.
|
|
27
|
+
*
|
|
28
|
+
* `outlineDivisions` 로 곡선 근사를 조절한다. 3D 쪽 분할과 같은 값을 써야 2D 와
|
|
29
|
+
* 3D 가 같은 모양으로 보인다.
|
|
30
|
+
*/
|
|
31
|
+
topOutline(): TopOutline | null;
|
|
32
|
+
/** 곡선을 다각형으로 근사할 때의 분할 수. 곡선이 있는 서브클래스가 올려 잡는다. */
|
|
33
|
+
get outlineDivisions(): number;
|
|
20
34
|
get boundUVGenerator(): BoundUVGenerator;
|
|
21
35
|
build(): void;
|
|
22
36
|
createGeometry(shape: THREE.Shape): THREE.BufferGeometry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"real-object-extrude.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-extrude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAOhE;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,CAAA;IACpC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAA;IAE5B,KAAK;IAKL,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,gBAAgB,qBAInB;IAED,KAAK;IAoCL,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAoBxD,eAAe,IAAI,KAAK,CAAC,QAAQ,EAAE;IAcnC,aAAa;IAqBb,OAAO,CAAC,YAAY;IAMpB,gBAAgB;IAYhB,WAAW;IAUX,iBAAiB;IAQjB,eAAe;IAIf,UAAU;IAIV;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+DxB,eAAe;IAMf;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;CAajC"}
|
|
1
|
+
{"version":3,"file":"real-object-extrude.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-extrude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAOhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,CAAA;IACpC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAA;IAE5B,KAAK;IAKL,IAAI,KAAK,IAAI,GAAG,CAEf;IAED;;;;;;;;;OASG;IACH,UAAU,IAAI,UAAU,GAAG,IAAI;IAiB/B,mDAAmD;IACnD,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,gBAAgB,qBAInB;IAED,KAAK;IAoCL,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAoBxD,eAAe,IAAI,KAAK,CAAC,QAAQ,EAAE;IAcnC,aAAa;IAqBb,OAAO,CAAC,YAAY;IAMpB,gBAAgB;IAYhB,WAAW;IAUX,iBAAiB;IAQjB,eAAe;IAIf,UAAU;IAIV;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+DxB,eAAe;IAMf;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;CAajC"}
|
|
@@ -73,6 +73,17 @@ export declare class RealObjectGLTF extends RealObjectExternalModel<GLTF> {
|
|
|
73
73
|
private _buildNodeIndex;
|
|
74
74
|
getNode(name: string): THREE.Object3D | undefined;
|
|
75
75
|
get nodeNames(): string[];
|
|
76
|
+
/** 지금 골라 둔 노드. 편집기가 이 값으로 어느 노드의 상태를 고칠지 정할 수 있다. */
|
|
77
|
+
pickedPart: string | undefined;
|
|
78
|
+
partNames(): string[];
|
|
79
|
+
partObject(name: string): THREE.Object3D | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* 맞은 것이 어느 노드인가.
|
|
82
|
+
*
|
|
83
|
+
* 노드 하나가 mesh 여럿으로 되어 있을 수 있으므로, 색인에 등록된 조상을 만날 때까지
|
|
84
|
+
* 위로 걸어 올라간다.
|
|
85
|
+
*/
|
|
86
|
+
partAt(hit: THREE.Object3D): string | undefined;
|
|
76
87
|
private _applyNodeStates;
|
|
77
88
|
/**
|
|
78
89
|
* 단일 노드를 원본 상태로 복원한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"real-object-gltf.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"real-object-gltf.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-gltf.ts"],"names":[],"mappings":"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"}
|