@hatiolab/figure-model 0.1.11 → 0.1.13

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/sizing.js ADDED
@@ -0,0 +1,475 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ /**
5
+ * 인스턴스 크기가 바뀔 때 부품이 어떻게 반응하나.
6
+ *
7
+ * ## 왜 따로 떼어 두나
8
+ *
9
+ * 같은 답을 세 곳이 낸다 — 3D(`figure-real-object`), 2D 톱뷰(`figure-instance`),
10
+ * 그리고 속성 편집기. 저마다 계산하면 화면마다 다른 모양이 나오고, 그때는 어느 쪽이
11
+ * 맞는지 알 방법이 없다.
12
+ *
13
+ * ## 규칙 넷
14
+ *
15
+ * scale 비례 확대. 인스턴스 배율을 그대로 받는다 — 아무것도 하지 않아도 된다
16
+ * fixed 크기는 그대로. **붙잡은 자리에서 잰 거리**를 지킨다
17
+ * stretch 가장 길게 뻗은 축이 **양쪽 면 사이를 채운다**
18
+ * repeat 크기는 그대로 두고 **개수**가 늘어난다
19
+ *
20
+ * ## 자리도 규칙의 일부다
21
+ *
22
+ * 한동안 이 파일은 **크기**만 다뤘고 자리는 언제나 비례였다. 그래서 시그널 타워를
23
+ * 3 배로 세우면 기둥은 늘어나는데 램프들은 기둥 위 공중으로 흩어졌다.
24
+ *
25
+ * 1× foot 0..90 · pole 85..705 · bracket 703..747 · cap 1037..1087
26
+ * 3× foot 90..180 · pole 255..2115 · bracket 2153..2197 · cap 3161..3211
27
+ *
28
+ * 램프는 상자 안 어디쯤이 아니라 **기둥 꼭대기**에 붙어 있다. 그 말을 하는 것이
29
+ * 앵커다 — 부품이 어느 면에서 잰 거리를 지키는가.
30
+ *
31
+ * 세 가지가 한 규칙의 세 경우다. 축마다
32
+ *
33
+ * 아무 데도 안 붙잡는다 비례로 따라간다 `scale`
34
+ * 한 자리를 붙잡는다 거기서 잰 거리 유지 `fixed` · `repeat` 의 옆 축
35
+ * 두 면을 다 붙잡는다 가운데가 늘어나 채운다 `stretch` 의 긴 축
36
+ *
37
+ * 붙잡는 자리는 아래 면(`min`) · 가운데(`center`) · 위 면(`max`) 셋이다. 셋이 같은
38
+ * 규칙이다 — 기준이 어디냐만 다르다. 한동안 `center` 만 「비례로 밀린다」였는데, 그러면
39
+ * 가운데 가까이 저작한 것이 상자가 커질 때마다 밖으로 밀려 이웃과 갈라진다. 크레들의
40
+ * V 홈 패드 둘이 ±80 에서 ±240 으로 벌어져 축을 놓친 것이 그것이었다.
41
+ *
42
+ * 3D 도구의 나인슬라이스가 하는 일과 같고, 여기서는 그것이 세 축으로 있다.
43
+ *
44
+ * ## 어떻게 되돌리나
45
+ *
46
+ * 부모(`object3d`)가 인스턴스 배율 `S` 를 이미 걸고 있다. 그래서 크기를 그대로 두려면
47
+ * 자식이 `1/S` 로 되돌리면 된다. 자리는 부모의 배율을 그대로 받으므로 따라간다.
48
+ *
49
+ * 월드 = S · (자리 + (1/S) ⊙ 형상) = S·자리 + 형상
50
+ *
51
+ * 회전은 **형상에 미리 구워** 둔다. 그래야 위 식이 정확히 성립한다 — 회전을 mesh 에
52
+ * 걸면 비균등 배율이 회전 뒤에 곱해져 형상이 기울어진다.
53
+ *
54
+ * 이 방식의 값은 **geometry 를 그대로 나눠 쓴다**는 것이다. 인스턴스가 몇이든 정점
55
+ * 버퍼는 늘지 않는다. 대신 합칠 수 없어 draw call 이 부품 수만큼 는다 — 그 비용은
56
+ * 청사진의 묶음 수에 그대로 잡히고 성숙도가 잰다.
57
+ */
58
+ /**
59
+ * 이 축에서 이 부품이 어떻게 서나. **크기와 자리를 함께 정하는 한 값이다.**
60
+ *
61
+ * 저작자가 적었으면 그것이 이기고, 없으면 `sizing` 이 정한다.
62
+ *
63
+ * fixed 가까운 면
64
+ * stretch 가장 긴 축은 `span`, 나머지는 가까운 면
65
+ * repeat 늘어나는 축은 `center`(줄이 제자리에 남는다), 나머지는 가까운 면
66
+ *
67
+ * **가까운 면**은 상자의 위 절반에 저작한 것은 위를, 아래 절반은 아래를 붙잡는 것이다.
68
+ * 사람이 램프를 꼭대기 근처에 놓을 때 뜻하는 것이 그것이다. 정확히 가운데면 `center` 이고,
69
+ * 그때는 비례로 따라가는 것이 맞다 — 어느 쪽도 더 가깝지 않기 때문이다.
70
+ *
71
+ * 세는 것은 **부품의 면에서 상자의 면까지**이지 중심에서가 아니다. 중심으로 재면
72
+ * 굵은 부품과 얇은 부품이 같은 자리에서 다른 답을 낸다.
73
+ */
74
+ export function anchorOf(member, base, axis) {
75
+ const said = member.anchor?.[axis];
76
+ if (said)
77
+ return said;
78
+ if (member.sizing === 'scale')
79
+ return 'scale';
80
+ if (member.sizing === 'stretch' && axis === stretchAxis(member))
81
+ return 'span';
82
+ if (member.sizing === 'repeat' && axis === member.repeat?.axis)
83
+ return 'center';
84
+ const gaps = clearance(member, base, axis);
85
+ if (gaps.min < gaps.max)
86
+ return 'min';
87
+ if (gaps.max < gaps.min)
88
+ return 'max';
89
+ return 'center';
90
+ }
91
+ /** 부품의 면에서 상자의 면까지 — 지켜야 할 거리 둘. */
92
+ function clearance(member, base, axis) {
93
+ const half = (Number.isFinite(base[axis]) ? base[axis] : 0) / 2;
94
+ const at = member.transform.position[axis];
95
+ const reach = rotatedExtent(member)[axis] / 2;
96
+ return { min: at - reach + half, max: half - (at + reach) };
97
+ }
98
+ /** 0 이나 음수 배율을 그대로 쓰지 않는다 — 막 놓은 인스턴스가 실제로 0 이다. */
99
+ function safeScale(value) {
100
+ return Number.isFinite(value) && value > 0 ? value : 1;
101
+ }
102
+ /**
103
+ * 늘어나는 축이 실제로 차지할 길이.
104
+ *
105
+ * 양쪽 여유를 지키고 가운데가 남는 만큼을 먹는다. 저작할 때의 여유가 그대로 남으므로
106
+ * 기둥이 발판과 브래킷 **사이**를 정확히 잇는다.
107
+ *
108
+ * 상자가 여유 둘을 합친 것보다 작아지면 남는 것이 없다. 그때는 0 이 아니라 실오라기를
109
+ * 남긴다 — 배율 0 인 mesh 는 법선 행렬이 특이해져 조명이 NaN 이 된다.
110
+ */
111
+ function spanLength(member, scale, base, axis) {
112
+ const gaps = clearance(member, base, axis);
113
+ const room = (Number.isFinite(base[axis]) ? base[axis] : 0) * safeScale(scale[axis]);
114
+ return Math.max(room - gaps.min - gaps.max, SLIVER);
115
+ }
116
+ /** 사라지지 않을 만큼. 위 주석 참고. */
117
+ const SLIVER = 1e-3;
118
+ /**
119
+ * 되돌릴 것이 있는 부품인가.
120
+ *
121
+ * `scale` 은 부모 배율을 그대로 받으면 되므로 합쳐 둔 채로 그린다. 나머지 셋은 따로
122
+ * 세운다.
123
+ *
124
+ * **곡면은 `scale` 이어도 따로 선다.** 합친 형상은 변환을 하나만 받는데, 인스턴스가
125
+ * 축마다 다른 배율이면 그 하나가 원기둥을 타원 기둥으로 만든다. 원기둥이라고 적어
126
+ * 놓고 원기둥이 아닌 것을 그리게 된다.
127
+ *
128
+ * 값이 있는 만큼 값을 치른다 — 곡면 부품 하나가 draw call 하나다. figure-model 의
129
+ * `standsAlone` 이 **같은 답**을 내야 한다. 갈리면 성숙도가 세는 수와 화면이 그리는
130
+ * 수가 달라진다.
131
+ */
132
+ export function needsOwnMesh(member) {
133
+ return member.sizing !== 'scale' || isCurved(member);
134
+ }
135
+ /**
136
+ * 단면을 원으로 지키는 부품인가.
137
+ *
138
+ * 곡면만 지킬 수 있고, 저작자가 끄지 않는 한 지킨다. 끄면 합친 묶음에 들어가 draw call
139
+ * 을 아끼는 대신 인스턴스 배율대로 찌그러진다 — 볼트 머리처럼 아무도 안 볼 것에 쓴다.
140
+ *
141
+ * figure-model 의 `keepsRound` 와 **같은 답**을 내야 한다.
142
+ */
143
+ function isCurved(member) {
144
+ if (member.primitive !== 'cylinder' && member.primitive !== 'sphere')
145
+ return false;
146
+ return member.keepRound !== false;
147
+ }
148
+ /**
149
+ * 회전까지 반영한 부품의 축별 크기.
150
+ *
151
+ * 회전한 상자의 여덟 꼭짓점을 각 축에 내린 것 — 축에 맞춘 경계다. 회전 행렬은
152
+ * `Rx·Ry·Rz` 이고 three 의 기본 Euler 순서('XYZ')와 같다. `memberGeometry` 가 같은
153
+ * 순서로 돌리므로 여기만 다르면 답이 갈린다.
154
+ *
155
+ * figure-model 의 `rotatedExtentOf` 와 같은 식이다. 그쪽이 정본이고 여기는 읽는 쪽의
156
+ * 사본이다 — 이 패키지는 figure-model 에 의존하지 않는다(`figure-blueprint.ts` 참고).
157
+ */
158
+ export function rotatedExtent(member) {
159
+ const { size, rotation } = member.transform;
160
+ if (!rotation)
161
+ return { ...size };
162
+ const rad = Math.PI / 180;
163
+ const cx = Math.cos((rotation.x ?? 0) * rad);
164
+ const sx = Math.sin((rotation.x ?? 0) * rad);
165
+ const cy = Math.cos((rotation.y ?? 0) * rad);
166
+ const sy = Math.sin((rotation.y ?? 0) * rad);
167
+ const cz = Math.cos((rotation.z ?? 0) * rad);
168
+ const sz = Math.sin((rotation.z ?? 0) * rad);
169
+ const rows = [
170
+ [cy * cz, -cy * sz, sy],
171
+ [sx * sy * cz + cx * sz, -sx * sy * sz + cx * cz, -sx * cy],
172
+ [-cx * sy * cz + sx * sz, cx * sy * sz + sx * cz, cx * cy]
173
+ ];
174
+ const along = (row) => Math.abs(row[0]) * size.x + Math.abs(row[1]) * size.y + Math.abs(row[2]) * size.z;
175
+ return { x: along(rows[0]), y: along(rows[1]), z: along(rows[2]) };
176
+ }
177
+ /**
178
+ * `stretch` 일 때 늘어나는 축 — **가장 길게 뻗은 축**이다.
179
+ *
180
+ * 형식에 축을 적는 자리가 없어서 크기에서 읽는다. 프레임 · 벨트 · 레일이 전부 "길어서
181
+ * 그 물건인 것"이라 이 규칙과 맞는다. 같으면 x → z → y 순으로 정한다.
182
+ */
183
+ export function stretchAxis(member) {
184
+ const { x, y, z } = rotatedExtent(member);
185
+ if (x >= z && x >= y)
186
+ return 'x';
187
+ if (z >= y)
188
+ return 'z';
189
+ return 'y';
190
+ }
191
+ /**
192
+ * 부품 mesh 에 걸 배율 — 부모가 건 인스턴스 배율을 **어디까지 되돌릴까**.
193
+ *
194
+ * `1` 은 인스턴스를 그대로 따라간다는 뜻이고, `1/S` 는 저작한 크기를 지킨다는 뜻이다.
195
+ *
196
+ * `repeat` 는 부품 자체의 크기를 지킨다 — 늘어나는 것은 개수다.
197
+ */
198
+ export function sizingScale(member, scale, base) {
199
+ /*
200
+ **규칙은 축마다 정해진다.** 그것을 먼저 받아 둔다.
201
+
202
+ 한동안 이 자리에 `if (member.sizing === 'scale') return flat` 이 있었다. `sizing` 이 없으면
203
+ 컴파일이 그 값을 `'scale'` 로 채우므로, **`anchor` 만 적은 부품은 여기서 통째로 빠져나가
204
+ 앵커가 조용히 무시되었다** — 크기도 자리도 비례로만 움직였다. 표본들이 `sizing` 을 쓰고
205
+ 있어서 여태 드러나지 않았고, 발행 게이트를 만들며 `anchor` 만 쓴 시험이 그것을 잡았다.
206
+
207
+ `anchorOf` 가 이미 우선순위를 안다 — 저작자가 적은 `anchor` 가 이기고, 없으면 `sizing` 이
208
+ 정한다. 그러니 판정은 그 함수에만 두고, 빠른 길은 **셋 다 `scale` 로 판정된 때**만 탄다.
209
+ */
210
+ const rules = { x: anchorOf(member, base, 'x'), y: anchorOf(member, base, 'y'), z: anchorOf(member, base, 'z') };
211
+ if (AXES.every(axis => rules[axis] === 'scale')) {
212
+ /*
213
+ 비례 확대는 되돌릴 것이 없다 — **곡면이 아니면.** 곡면은 축마다 다른 배율을 받으면
214
+ 단면이 타원이 되므로 그때는 되돌린다.
215
+
216
+ 3D 는 이 함수를 비-`scale` 부품에만 부르지만 2D 는 **모든 부품에** 부른다. 여기서
217
+ 걸러 두지 않으면 평범한 부품까지 1/S 로 되돌아가 인스턴스를 키워도 그대로였다 —
218
+ 시험이 그것을 잡았다.
219
+ */
220
+ const flat = { x: 1, y: 1, z: 1 };
221
+ keepRound(member, scale, flat);
222
+ return flat;
223
+ }
224
+ const undo = { x: safeUndo(scale.x), y: safeUndo(scale.y), z: safeUndo(scale.z) };
225
+ for (const axis of AXES) {
226
+ const rule = rules[axis];
227
+ // 아무 면도 안 붙잡는 축은 부모가 건 배율을 그대로 받는다 — 되돌릴 것이 없다.
228
+ if (rule === 'scale')
229
+ undo[axis] = 1;
230
+ if (rule !== 'span')
231
+ continue;
232
+ /*
233
+ 양쪽을 다 붙잡은 축은 **여유를 지키고 남는 만큼**을 먹는다. 인스턴스 배율을 그대로
234
+ 받게 두면(전에 `stretch` 가 그랬다) 기둥이 상자와 같은 비율로만 자라서, 끝에 붙여
235
+ 둔 부품과의 사이에 틈이 벌어진다.
236
+
237
+ 부모가 이미 `S` 를 걸고 있으므로 여기서는 원하는 총 배율을 `S` 로 나눠 넘긴다.
238
+ */
239
+ const own = rotatedExtent(member)[axis];
240
+ undo[axis] = own > 0 ? spanLength(member, scale, base, axis) / own / safeScale(scale[axis]) : 1;
241
+ }
242
+ keepRound(member, scale, undo);
243
+ followAspect(member, base, scale, undo);
244
+ return undo;
245
+ }
246
+ /**
247
+ * 다른 축의 배율을 따라간다 — **비율을 지킨다.**
248
+ *
249
+ * 드라이룸의 출입구가 그렇다. 방을 키우면 문도 커지지만 문은 문이라 폭이 높이에
250
+ * 비례해야 한다. `scale` 로 두면 폭이 제 축을 따라가므로, 방을 폭으로만 늘리면 문이
251
+ * 넓어지기만 하고 높아지지 않는다.
252
+ *
253
+ * 가리킨 축이 **끝난 뒤의** 배율을 따른다 — 그 축이 `span` 이면 채운 만큼, `fixed` 면 1,
254
+ * `scale` 이면 인스턴스 배율이다. 그래서 이 함수는 다른 규칙이 다 정해진 다음에 돈다.
255
+ * 형식이 `aspect-` 가 또 다른 `aspect-` 를 가리키는 것을 막으므로 한 번만 돌면 된다.
256
+ *
257
+ * ## 상자로 자르지 않는다
258
+ *
259
+ * 한동안 저작할 때의 여유를 넘지 않게 잘랐다. 문이 방보다 넓어지는 것을 막으려던 것인데,
260
+ * 그러면 **롤이 막힌다** — 크레들이 길어질 때 롤 지름이 폭을 따라 커지는 것이 이 규칙을
261
+ * 쓰는 다른 절반이고, 지름은 기준 상자의 높이를 넘어서 자란다.
262
+ *
263
+ * 자르지 않는 이유는 기준 상자가 담장이 아니기 때문이다. 배치 비율의 분모이고, 넘는
264
+ * 부품은 이미 있다(컨베이어의 발판이 상자보다 넓다).
265
+ *
266
+ * 대신 값이 있다. 이미 벽을 꽉 채운 문은 높이만 커진 방에서 벽보다 넓어진다 — 그것은
267
+ * 규칙의 흠이 아니라 「벽을 꽉 채운 것이 비율을 지킬 수는 없다」는 기하다. 그런 부품은
268
+ * 여유를 두고 저작하거나 `span` 으로 채운다.
269
+ */
270
+ function followAspect(member, base, scale, undo) {
271
+ const settled = { x: safeScale(scale.x) * undo.x, y: safeScale(scale.y) * undo.y, z: safeScale(scale.z) * undo.z };
272
+ for (const axis of AXES) {
273
+ const named = aspectOf(anchorOf(member, base, axis));
274
+ if (!named)
275
+ continue;
276
+ undo[axis] = settled[named] / safeScale(scale[axis]);
277
+ }
278
+ }
279
+ /** `aspect-y` 처럼 적혀 있으면 가리킨 축, 아니면 null. */
280
+ function aspectOf(rule) {
281
+ if (rule === 'aspect-x')
282
+ return 'x';
283
+ if (rule === 'aspect-y')
284
+ return 'y';
285
+ if (rule === 'aspect-z')
286
+ return 'z';
287
+ return null;
288
+ }
289
+ /**
290
+ * 곡면 프리미티브의 단면은 **원이다.**
291
+ *
292
+ * 축마다 다른 배율을 받으면 원기둥이 타원 기둥이 된다. 크레들을 3 배로 세웠더니 롤의
293
+ * 지름이 세로로만 3 배가 되어 납작한 타원이 나왔다 — 원기둥이라고 적어 놓고 원기둥이
294
+ * 아닌 것을 그린 것이다.
295
+ *
296
+ * 그래서 단면의 두 축은 **같은 배율**을 받는다. 두 배율의 **기하평균**이다.
297
+ *
298
+ * 작은 쪽을 쓰면 크기까지 얼어붙는다 — 한 축만 늘인 인스턴스에서 지름이 1 배로 묶여,
299
+ * 형태가 아니라 크기를 지키게 된다. 큰 쪽을 쓰면 반대로 좁은 축에서 크게 뚫고 나간다.
300
+ * 기하평균은 둘 다 따라가면서 원을 지키고, `effectiveDepth` 가 높이를 정할 때 쓰는 것과
301
+ * 같은 셈이다 — 한 축만 늘여도 덜 왜곡된다.
302
+ *
303
+ * 좁은 축의 상자를 얼마간 넘을 수 있다. 기준 상자는 배치 비율의 분모이지 담장이 아니고,
304
+ * 넘는 부품은 이미 있다(컨베이어의 발판이 상자보다 넓다).
305
+ *
306
+ * 축이 어느 쪽인지는 회전을 반영해 정한다. `CylinderGeometry` 의 축은 돌리기 전 y 이고,
307
+ * 그것을 부품의 회전으로 옮긴 뒤 가장 큰 성분이 있는 축이 그 부품의 축이다. 구는 축이
308
+ * 없으므로 세 축이 다 단면이다.
309
+ *
310
+ * `polygon` · `rect` 는 저작자가 점을 찍은 단면이라 건드리지 않는다. 타원으로 만들고
311
+ * 싶으면 그것으로 만든다.
312
+ */
313
+ function keepRound(member, scale, undo) {
314
+ if (!isCurved(member))
315
+ return;
316
+ const spin = member.primitive === 'sphere' ? null : longAxis(member);
317
+ const across = AXES.filter(axis => axis !== spin);
318
+ let product = 1;
319
+ for (const axis of across)
320
+ product *= safeScale(scale[axis]) * undo[axis];
321
+ if (!(product > 0) || !Number.isFinite(product))
322
+ return;
323
+ const even = Math.pow(product, 1 / across.length);
324
+ for (const axis of across)
325
+ undo[axis] = even / safeScale(scale[axis]);
326
+ }
327
+ /** 원기둥의 축 — 돌리기 전 y 를 부품의 회전으로 옮겨 가장 크게 놓인 축. */
328
+ function longAxis(member) {
329
+ const rotation = member.transform.rotation;
330
+ if (!rotation)
331
+ return 'y';
332
+ const rad = Math.PI / 180;
333
+ const cx = Math.cos((rotation.x ?? 0) * rad);
334
+ const sx = Math.sin((rotation.x ?? 0) * rad);
335
+ const cy = Math.cos((rotation.y ?? 0) * rad);
336
+ const cz = Math.cos((rotation.z ?? 0) * rad);
337
+ const sz = Math.sin((rotation.z ?? 0) * rad);
338
+ const sy = Math.sin((rotation.y ?? 0) * rad);
339
+ // Rx·Ry·Rz 의 둘째 열 — (0, 1, 0) 이 어디로 가나.
340
+ const moved = {
341
+ x: -cy * sz,
342
+ y: -sx * sy * sz + cx * cz,
343
+ z: cx * sy * sz + sx * cz
344
+ };
345
+ const size = { x: Math.abs(moved.x), y: Math.abs(moved.y), z: Math.abs(moved.z) };
346
+ if (size.x >= size.y && size.x >= size.z)
347
+ return 'x';
348
+ return size.z >= size.y ? 'z' : 'y';
349
+ }
350
+ /**
351
+ * 부품을 놓을 자리 — **부모가 배율을 걸기 전의 자리**다.
352
+ *
353
+ * 부모(`object3d`)가 인스턴스 배율 `S` 를 걸므로, 월드에서 원하는 자리를 `S` 로 나눠
354
+ * 돌려준다. 그래서 `S = 1` 이면 언제나 저작한 자리 그대로다 — 저작 화면에서 보던 것이
355
+ * 인스턴스 배율 1 에서 그대로 선다.
356
+ *
357
+ * center 저작한 자리. 상자와 함께 비례로 밀린다
358
+ * min 아래 면에서 잰 거리를 지킨다
359
+ * max 위 면에서 잰 거리를 지킨다
360
+ * stretch 양쪽을 다 지키므로 자리는 두 끝의 가운데다
361
+ */
362
+ export function sizingPosition(member, scale, base) {
363
+ const { position } = member.transform;
364
+ /*
365
+ 같은 이유로 `sizing` 을 직접 보지 않는다(§`sizingScale`) — `anchor` 만 적은 부품이 여기서
366
+ 빠져나가면 자리가 비례로만 밀려, 크기는 지켜지는데 자리는 안 지켜지는 반쪽이 된다.
367
+ */
368
+ const rules = { x: anchorOf(member, base, 'x'), y: anchorOf(member, base, 'y'), z: anchorOf(member, base, 'z') };
369
+ if (AXES.every(axis => rules[axis] === 'scale'))
370
+ return { ...position };
371
+ const out = { ...position };
372
+ // 비율을 따라가는 축이 있으면 그 축이 **끝낸** 배율이 필요하다.
373
+ const sized = sizingScale(member, scale, base);
374
+ const worldFactor = (axis) => safeScale(scale[axis]) * sized[axis];
375
+ for (const axis of AXES) {
376
+ const rule = rules[axis];
377
+ // 붙잡지 않는 축만 부모의 배율에 자리를 맡긴다.
378
+ if (rule === 'scale')
379
+ continue;
380
+ /*
381
+ 비율을 따라가는 축은 자리도 따라간다. 문에 붙은 표시등이 문과 함께 커지면서 문의
382
+ 같은 자리에 남아야 하고, 그것은 자리에도 같은 배율이 걸려야 성립한다.
383
+ */
384
+ const named = aspectOf(rule);
385
+ if (named) {
386
+ out[axis] = (position[axis] * worldFactor(named)) / safeScale(scale[axis]);
387
+ continue;
388
+ }
389
+ const factor = safeScale(scale[axis]);
390
+ const half = (Number.isFinite(base[axis]) ? base[axis] : 0) / 2;
391
+ const gaps = clearance(member, base, axis);
392
+ const reach = rotatedExtent(member)[axis] / 2;
393
+ if (rule === 'span')
394
+ out[axis] = (-half * factor + gaps.min + spanLength(member, scale, base, axis) / 2) / factor;
395
+ else if (rule === 'min')
396
+ out[axis] = (-half * factor + gaps.min + reach) / factor;
397
+ else if (rule === 'max')
398
+ out[axis] = (half * factor - gaps.max - reach) / factor;
399
+ // center — 가운데에서 잰 거리를 지킨다. 부모가 배율을 걸므로 나눠서 넘긴다.
400
+ else
401
+ out[axis] = position[axis] / factor;
402
+ }
403
+ return out;
404
+ }
405
+ const AXES = ['x', 'y', 'z'];
406
+ /** 0 이나 음수로 나누지 않는다 — 인스턴스 크기가 0 인 순간이 실제로 있다(막 놓았을 때). */
407
+ function safeUndo(value) {
408
+ return Number.isFinite(value) && value > 0 ? 1 / value : 1;
409
+ }
410
+ /**
411
+ * `repeat` 를 몇 개로 펼치나.
412
+ *
413
+ * **기준 상자를 한 칸씩 채운다.** 저작자는 **단위 하나**를 그리고, 런타임이 그 축의
414
+ * 길이를 채운다. 3D 도구의 배열 변형이 "길이에 맞추기" 로 하는 일과 같다.
415
+ *
416
+ * 개수 = floor(기준 상자의 그 축 길이 × 인스턴스 배율 ÷ 한 칸)
417
+ *
418
+ * ## 한 칸은 **중심에서 다음 중심까지**다
419
+ *
420
+ * 부품 크기와 무관하다. 전에는 `부품 크기 + 틈` 으로 셌는데, 그러면 부품을 굵게 하거나
421
+ * 돌릴 때마다 줄 전체가 다시 깔린다. 롤러를 30° 기울였더니 축 방향 경계상자가 96 에서
422
+ * 343 으로 늘어 개수가 16 에서 6 으로 무너졌다. 기울어진 롤러 둘은 빗살처럼 나란히
423
+ * 놓이므로 그렇게 벌릴 이유가 없는데도 그랬다.
424
+ *
425
+ * 이제 기울여도 개수가 그대로다. **기울인 채로 바짝 붙여 까는 것**이 표현된다.
426
+ *
427
+ * ## 왜 부품 크기가 아니라 기준 상자를 채우나
428
+ *
429
+ * 전에는 "그 부품이 `scale` 이었다면 차지했을 만큼" 을 채웠다. 지름 96 짜리 롤러는
430
+ * 컨베이어를 3 배로 늘려도 288 밖에 안 되어 롤러가 한두 개 나온다. 2400 짜리 컨베이어에
431
+ * 롤러 하나는 컨베이어가 아니다.
432
+ *
433
+ * 롤러는 일정한 간격으로 전 구간에 깔린다. 길이가 두 배면 롤러도 두 배다.
434
+ */
435
+ export function repeatPlan(member, scale, base) {
436
+ if (member.sizing !== 'repeat' || !member.repeat)
437
+ return null;
438
+ const axis = member.repeat.axis;
439
+ const pitch = member.repeat.pitch;
440
+ if (!(Number.isFinite(pitch) && pitch > 0))
441
+ return null;
442
+ /*
443
+ **줄이 늘어나나 커지나.**
444
+
445
+ 같은 「반복」이 두 가지다. 컨베이어의 롤러는 길어지면 개수가 늘고 한 칸 간격은
446
+ 그대로다. 셀트레이의 셀은 커지면 셀이 커지고 개수는 그대로다 — 개수는 그 트레이가
447
+ 몇 셀짜리냐이지 화면에 얼마나 크게 그렸느냐가 아니다.
448
+
449
+ 그 갈림을 이 축의 앵커가 말한다. `scale` 이면 저작한 상자만으로 세고, 늘어나는
450
+ 일은 부모의 배율이 한다(그릇이 배율을 되돌리지 않으므로 간격도 크기도 함께 큰다).
451
+ */
452
+ const spreads = anchorOf(member, base, axis) !== 'scale';
453
+ const factor = spreads && Number.isFinite(scale[axis]) && scale[axis] > 0 ? scale[axis] : 1;
454
+ const room = (Number.isFinite(base[axis]) && base[axis] > 0 ? base[axis] : pitch) * factor;
455
+ const count = Math.max(1, Math.min(REPEAT_LIMIT, Math.floor(room / pitch)));
456
+ return { axis, count, pitch };
457
+ }
458
+ /**
459
+ * 한 부품이 펼쳐질 수 있는 최대 개수.
460
+ *
461
+ * 복제본 하나가 draw call 하나다. 인스턴스를 아주 크게 늘리면 개수가 끝없이 늘어 한
462
+ * 자산이 프레임을 다 먹는다. 그 지점에서는 이미 낱개를 셀 수 없으므로 더 늘려도 보이는
463
+ * 것이 달라지지 않는다.
464
+ */
465
+ export const REPEAT_LIMIT = 100;
466
+ /**
467
+ * 복제본 하나의 자리 — 저작한 자리를 가운데 두고 양쪽으로 벌린다.
468
+ *
469
+ * 한쪽으로만 늘어놓으면 부품이 커질 때마다 한 방향으로 밀려서, 저작할 때 맞춰 둔 자리가
470
+ * 어긋난다. 가운데를 지키면 대칭으로 놓은 것들이 계속 대칭이다.
471
+ */
472
+ export function repeatOffset(index, count, pitch) {
473
+ return (index - (count - 1) / 2) * pitch;
474
+ }
475
+ //# sourceMappingURL=sizing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sizing.js","sourceRoot":"","sources":["../src/sizing.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -7,6 +7,13 @@ export declare const EXTRUDE_PRIMITIVES: readonly PrimitiveKind[];
7
7
  export declare const MESH_PRIMITIVES: readonly PrimitiveKind[];
8
8
  /** 분할 수를 갖는 프리미티브 — 곡면이 있는 것만. */
9
9
  export declare const SEGMENTED_PRIMITIVES: readonly PrimitiveKind[];
10
+ /**
11
+ * 단면이 **원**인 프리미티브.
12
+ *
13
+ * 축마다 다른 배율을 받으면 타원이 된다. 그래서 이것들은 합친 묶음에 들지 못한다 —
14
+ * 합친 형상은 변환을 하나만 받는다. 곡면 부품 하나가 draw call 하나다.
15
+ */
16
+ export declare const CURVED_PRIMITIVES: readonly PrimitiveKind[];
10
17
  /**
11
18
  * 재질 슬롯. extrude 계열의 재질 인덱스가 둘로 정해져 있다.
12
19
  * `threed/real-object-extrude.ts:105-111` — 0 = cap(fillStyle), 1 = side(strokeStyle)
@@ -84,7 +91,7 @@ export type SizingRule = (typeof SIZING_RULES)[number];
84
91
  *
85
92
  * `sizing` 이 `'scale'` 인 부품에는 뜻이 없다 — 그 부품은 상자와 함께 커진다.
86
93
  */
87
- export declare const ANCHOR_RULES: readonly ["scale", "min", "center", "max", "span"];
94
+ export declare const ANCHOR_RULES: readonly ["scale", "min", "center", "max", "span", "aspect-x", "aspect-y", "aspect-z"];
88
95
  export type AnchorRule = (typeof ANCHOR_RULES)[number];
89
96
  /**
90
97
  * 축별 앵커. 적지 않은 축은 `sizing` 이 정한 것을 따른다.
@@ -444,6 +451,21 @@ export interface FigurePart {
444
451
  * 「자재가 앉는 자리」 둘을 뜻하게 된다. 여기는 재질 쪽이므로 그렇게 부른다.
445
452
  */
446
453
  materialSlot?: MaterialSlot;
454
+ /**
455
+ * 단면을 **원으로 지킬 것인가.** 곡면 프리미티브만 뜻이 있고, 기본은 지키는 것이다.
456
+ *
457
+ * 인스턴스가 축마다 다른 배율이면 원기둥이 타원 기둥이 된다. AGV 를 길게 늘이면
458
+ * 바퀴가 찌그러지고, 크레들을 높이면 롤이 납작해진다. 원기둥이라고 적어 놓고 원기둥이
459
+ * 아닌 것을 그리는 것이므로 기본을 「지킨다」로 둔다.
460
+ *
461
+ * **값을 치른다.** 지키려면 제 변환이 있어야 하고, 합친 묶음은 변환을 하나만 받는다 —
462
+ * 그래서 지키는 곡면 부품은 **하나가 draw call 하나**다. 표본 열넷에서 139 가 168 이
463
+ * 되었다.
464
+ *
465
+ * 끄면 합쳐진다. 끌 만한 것들이 있다 — 볼트 머리 · 작은 스터드처럼 찌그러져도 아무도
466
+ * 모를 것들이다. 화면의 주역이 되는 롤 · 바퀴 · 탱크는 켜 둔다.
467
+ */
468
+ keepRound?: boolean;
447
469
  sizing?: SizingRule;
448
470
  /**
449
471
  * 어느 면을 붙잡나. 적지 않은 축은 **가까운 면**이다(`ANCHOR_ENDS` 참고).
@@ -494,6 +516,8 @@ export interface BlueprintMember {
494
516
  * 2D 톱뷰를 3D 와 **같은 분할 수**로 근사하려면 이 값이 필요하므로 따로 제공한다.
495
517
  */
496
518
  segments?: number;
519
+ /** 단면을 원으로 지킬 것인가. 곡면만 뜻이 있고 기본은 지키는 것이다. */
520
+ keepRound?: boolean;
497
521
  sizing: SizingRule;
498
522
  /** 어느 면을 붙잡나. 원본에 적힌 것만 실린다 — 적지 않은 축은 그리는 쪽이 센다. */
499
523
  anchor?: PartAnchor;
@@ -539,13 +563,13 @@ export interface Violation {
539
563
  * 처리를 정해야 하는데, 코드가 늘어난 것이 알려지지 않으면 그 대응이 빠진다. 뜻은
540
564
  * `docs/validation.md` 에 있고, 문서와 이 목록이 어긋나면 테스트가 실패한다.
541
565
  */
542
- export declare const ERROR_CODES: readonly ["not-object", "not-finite", "not-positive", "out-of-range", "not-integer", "not-boolean", "not-allowed", "missing-type", "missing-base", "missing-parts", "bad-style-kit", "missing-name", "duplicate-name", "missing-transform", "missing-position", "missing-size", "too-few-segments", "missing-shape-path", "bad-shape-point", "hollow-too-thick", "hollow-not-convex", "missing-material", "material-unresolvable", "missing-repeat", "missing-channels", "unknown-channel-target", "too-few-keys", "keys-out-of-order", "missing-surface-ref", "missing-label-name", "missing-label-source"];
566
+ export declare const ERROR_CODES: readonly ["not-object", "not-finite", "not-positive", "out-of-range", "not-integer", "not-boolean", "not-allowed", "missing-type", "missing-base", "missing-parts", "bad-style-kit", "missing-name", "duplicate-name", "missing-transform", "missing-position", "missing-size", "too-few-segments", "missing-shape-path", "bad-shape-point", "hollow-too-thick", "hollow-not-convex", "bad-aspect-axis", "missing-material", "material-unresolvable", "missing-repeat", "missing-channels", "unknown-channel-target", "too-few-keys", "keys-out-of-order", "missing-surface-ref", "missing-label-name", "missing-label-source"];
543
567
  export type ErrorCode = (typeof ERROR_CODES)[number];
544
568
  /**
545
569
  * 위반 코드 전부. 위반은 컴파일을 막지 않는다 — 저작 화면이 알려 주는 데 쓴다.
546
570
  * 뜻과 한도는 `docs/validation.md` 에 있다.
547
571
  */
548
- export declare const VIOLATION_CODES: readonly ["segments-off-preset", "segments-ignored", "repeat-ignored", "anchor-ignored", "hollow-ignored", "pivot-ignored", "detail-level-missing", "too-many-parts", "too-many-animated-parts", "too-many-material-groups", "too-many-transparent", "too-many-surface-textures", "too-many-always-labels"];
572
+ export declare const VIOLATION_CODES: readonly ["segments-off-preset", "segments-ignored", "repeat-ignored", "anchor-ignored", "keep-round-ignored", "hollow-ignored", "pivot-ignored", "detail-level-missing", "too-many-parts", "too-many-animated-parts", "too-many-material-groups", "too-many-transparent", "too-many-surface-textures", "too-many-always-labels"];
549
573
  export type ViolationCode = (typeof VIOLATION_CODES)[number];
550
574
  /** 형식·정합성 오류. 이것이 있으면 컴파일할 수 없다. */
551
575
  export interface FigureError {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}