@hatiolab/figure-model 0.1.9 → 0.1.12
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/blueprint.d.ts +16 -5
- package/dist/blueprint.d.ts.map +1 -1
- package/dist/blueprint.js +64 -29
- package/dist/blueprint.js.map +1 -1
- package/dist/cost.js +2 -2
- package/dist/cost.js.map +1 -1
- package/dist/grouping.d.ts +30 -5
- package/dist/grouping.d.ts.map +1 -1
- package/dist/grouping.js +55 -10
- package/dist/grouping.js.map +1 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +5 -2
- package/dist/keys.js.map +1 -1
- package/dist/types.d.ts +213 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +107 -9
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +205 -37
- package/dist/validate.js.map +1 -1
- package/docs/format.md +190 -25
- package/docs/sizing.md +183 -0
- package/docs/validation.md +20 -7
- package/package.json +1 -1
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)
|
|
@@ -40,6 +47,66 @@ export declare const DEFAULT_SIZING: "scale";
|
|
|
40
47
|
export declare const REPEAT_LIMIT = 100;
|
|
41
48
|
export declare const SIZING_RULES: readonly ["scale", "fixed", "stretch", "repeat"];
|
|
42
49
|
export type SizingRule = (typeof SIZING_RULES)[number];
|
|
50
|
+
/**
|
|
51
|
+
* 부품이 한 축에서 기준 상자의 **어느 면을 붙잡나**. 축마다 따로 정한다.
|
|
52
|
+
*
|
|
53
|
+
* scale **아무 면도 안 붙잡는다.** 상자와 함께 비례로 커진다
|
|
54
|
+
* min 아래(또는 왼쪽·뒤) 면에서 잰 거리를 지킨다
|
|
55
|
+
* center 자리는 비례로 따라가고 **크기는 지킨다**
|
|
56
|
+
* max 위(또는 오른쪽·앞) 면에서 잰 거리를 지킨다
|
|
57
|
+
* span **양쪽을 다 붙잡는다.** 가운데가 늘어나 사이를 채운다
|
|
58
|
+
*
|
|
59
|
+
* 붙잡는 면의 수로 읽으면 하나다 — 0 개면 상자와 함께 커지고, 1 개면 그 면에서 잰
|
|
60
|
+
* 거리를 지키고, 2 개면 사이를 채운다. 3D 도구의 나인슬라이스가 하는 일이고 여기서는
|
|
61
|
+
* 그것이 세 축으로 있다.
|
|
62
|
+
*
|
|
63
|
+
* ## `repeat` 의 축에서는 **줄이 어떻게 되는가**를 말한다
|
|
64
|
+
*
|
|
65
|
+
* 같은 「반복」이 두 가지다.
|
|
66
|
+
*
|
|
67
|
+
* 컨베이어의 롤러 길어지면 롤러가 **는다.** 한 칸 간격은 그대로다
|
|
68
|
+
* 셀트레이의 셀 커지면 셀이 **커진다.** 개수는 그 트레이가 몇 셀짜리냐이지
|
|
69
|
+
* 화면에 얼마나 크게 그렸느냐가 아니다
|
|
70
|
+
*
|
|
71
|
+
* 앞의 것이 `center`(줄이 상자를 채운다), 뒤의 것이 `scale`(줄이 상자와 함께 큰다)이다.
|
|
72
|
+
*
|
|
73
|
+
* ## 없던 것을 왜 더하나
|
|
74
|
+
*
|
|
75
|
+
* `sizing` 은 부품의 **크기**가 인스턴스를 어떻게 따라가는지만 말했다. **자리**는
|
|
76
|
+
* 언제나 비례였다. 그래서 시그널 타워를 3 배로 세우면 기둥은 늘어나는데 램프들은
|
|
77
|
+
* 기둥 위 공중으로 흩어졌다 — 저작한 자리 512 가 1536 이 되고, 그 사이의 틈 100 이
|
|
78
|
+
* 300 이 되기 때문이다.
|
|
79
|
+
*
|
|
80
|
+
* 1× foot 0..90 · pole 85..705 · bracket 703..747 · … · cap 1037..1087
|
|
81
|
+
* 3× foot 90..180 · pole 255..2115 · bracket 2153..2197 · … · cap 3161..3211
|
|
82
|
+
*
|
|
83
|
+
* 램프는 상자 안 어디쯤이 아니라 **기둥 꼭대기**에 붙어 있다. 형식에 그 말을 적을
|
|
84
|
+
* 자리가 없었다.
|
|
85
|
+
*
|
|
86
|
+
* ## 적지 않으면 **가까운 면**을 붙잡는다
|
|
87
|
+
*
|
|
88
|
+
* 상자의 위 절반에 저작한 것은 위를, 아래 절반에 저작한 것은 아래를 붙잡는다.
|
|
89
|
+
* 정확히 가운데면 `center` 다. 사람이 램프를 꼭대기 근처에 놓을 때 뜻하는 것이
|
|
90
|
+
* 그것이고, 그래서 표본 열넷 중 어느 것도 이 값을 적지 않고 제대로 선다.
|
|
91
|
+
*
|
|
92
|
+
* `sizing` 이 `'scale'` 인 부품에는 뜻이 없다 — 그 부품은 상자와 함께 커진다.
|
|
93
|
+
*/
|
|
94
|
+
export declare const ANCHOR_RULES: readonly ["scale", "min", "center", "max", "span", "aspect-x", "aspect-y", "aspect-z"];
|
|
95
|
+
export type AnchorRule = (typeof ANCHOR_RULES)[number];
|
|
96
|
+
/**
|
|
97
|
+
* 축별 앵커. 적지 않은 축은 `sizing` 이 정한 것을 따른다.
|
|
98
|
+
*
|
|
99
|
+
* **`sizing` 하나로는 못 하는 말이 있어서 있다.** 컨베이어의 데크가 그렇다 —
|
|
100
|
+
* 길이(x)와 폭(z)은 상자를 채우고 두께(y)는 24 mm 그대로여야 한다. `sizing` 은
|
|
101
|
+
* 부품당 하나라 「x 는 채우고 y 는 붙잡는다」를 적을 자리가 없었다.
|
|
102
|
+
*
|
|
103
|
+
* sizing: 'fixed', anchor: { x: 'span', y: 'max', z: 'span' }
|
|
104
|
+
*/
|
|
105
|
+
export interface PartAnchor {
|
|
106
|
+
x?: AnchorRule;
|
|
107
|
+
y?: AnchorRule;
|
|
108
|
+
z?: AnchorRule;
|
|
109
|
+
}
|
|
43
110
|
/**
|
|
44
111
|
* 디테일 등급 — 이 형상을 얼마나 상세하게 만들 것인지 저작자가 밝히는 값.
|
|
45
112
|
*
|
|
@@ -57,11 +124,30 @@ export declare const DETAIL_LEVELS: readonly ["S", "M", "L"];
|
|
|
57
124
|
export type DetailLevel = (typeof DETAIL_LEVELS)[number];
|
|
58
125
|
/** 등급별 부품 수 상한. */
|
|
59
126
|
export declare const PART_LIMIT: Record<DetailLevel, number>;
|
|
60
|
-
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
127
|
+
/**
|
|
128
|
+
* 채널이 무엇을 움직이나. **glTF 의 `target.path` 그대로다.**
|
|
129
|
+
*
|
|
130
|
+
* `weights` 는 없다 — 모프 타깃이 없는 형식이다.
|
|
131
|
+
*/
|
|
132
|
+
export declare const CHANNEL_PATHS: readonly ["translation", "rotation", "scale"];
|
|
133
|
+
export type ChannelPath = (typeof CHANNEL_PATHS)[number];
|
|
134
|
+
/** 키프레임 사이를 어떻게 잇나. glTF 의 `CUBICSPLINE` 은 없다 — 접선을 손으로 적을 형식이 아니다. */
|
|
135
|
+
export declare const INTERPOLATIONS: readonly ["linear", "step"];
|
|
136
|
+
export type Interpolation = (typeof INTERPOLATIONS)[number];
|
|
137
|
+
/**
|
|
138
|
+
* clip 이 어떻게 구동되나.
|
|
139
|
+
*
|
|
140
|
+
* **glTF 에는 없는 항목이다.** glTF 는 재생을 런타임에 맡긴다. 여기서 형식이 말하는
|
|
141
|
+
* 이유는 트윈이 타임라인을 재생하지 않기 때문이다 — 「문 열기 클립을 재생하라」가 아니라
|
|
142
|
+
* 「지금 40% 열려 있다」다.
|
|
143
|
+
*
|
|
144
|
+
* loop 시각이 흐른다. 인스턴스가 주는 값은 **배속**이다. 도는 롤러가 그렇다
|
|
145
|
+
* hold 시각이 멈춰 있다. 인스턴스가 주는 값은 **0~1 위치**다. 열린 정도가 그렇다
|
|
146
|
+
*
|
|
147
|
+
* 같은 clip 이 둘 다 될 수 있지만, 그 자산이 무엇인지는 저작 시점에 정해진다.
|
|
148
|
+
*/
|
|
149
|
+
export declare const CLIP_DRIVES: readonly ["loop", "hold"];
|
|
150
|
+
export type ClipDrive = (typeof CLIP_DRIVES)[number];
|
|
65
151
|
export declare const AXES: readonly ["x", "y", "z"];
|
|
66
152
|
export type Axis = (typeof AXES)[number];
|
|
67
153
|
/** 텍스트를 언제 보이나. 표현 수단(sprite·overlay)은 런타임이 고른다. */
|
|
@@ -252,28 +338,53 @@ export interface RepeatSpec {
|
|
|
252
338
|
*/
|
|
253
339
|
pitch: number;
|
|
254
340
|
}
|
|
341
|
+
/** 한 시각의 값. glTF sampler 의 input 한 칸과 output 한 칸이다. */
|
|
342
|
+
export interface Keyframe {
|
|
343
|
+
/** 시각(초). 0 이상이고 **오름차순**이어야 한다. */
|
|
344
|
+
at: number;
|
|
345
|
+
/**
|
|
346
|
+
* 그 시각의 값. 경로마다 뜻이 다르다.
|
|
347
|
+
*
|
|
348
|
+
* translation 부품 기준 옮김
|
|
349
|
+
* rotation **오일러 도(°)** — `transform.rotation` 과 같은 약속
|
|
350
|
+
* scale 배율. 1 이 제 크기
|
|
351
|
+
*/
|
|
352
|
+
value: Vec3;
|
|
353
|
+
}
|
|
255
354
|
/**
|
|
256
|
-
*
|
|
355
|
+
* 한 부품의 한 속성을 시간에 따라 움직인다. **glTF 의 channel + sampler 를 합친 것.**
|
|
257
356
|
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* 몸체 가운데를 돌아야 하면 피봇을 명시해야 한다.
|
|
357
|
+
* glTF 는 채널과 샘플러를 나누어 여러 채널이 한 샘플러를 나눠 쓸 수 있게 한다. 그건
|
|
358
|
+
* 정점 데이터를 아끼려는 장치고, 손으로 적는 형식에서는 한 겹 더 들어갈 뿐이라 합쳤다.
|
|
261
359
|
*/
|
|
262
|
-
export interface
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
pivot?: Vec3;
|
|
360
|
+
export interface AnimationChannel {
|
|
361
|
+
/** 어느 부품인가. `FigurePart.name`. **노드 인덱스가 아니다** — 이 형식은 이름으로 가리킨다. */
|
|
362
|
+
target: string;
|
|
363
|
+
path: ChannelPath;
|
|
267
364
|
/**
|
|
268
|
-
*
|
|
365
|
+
* 회전 중심. `rotation` 에서만 뜻이 있고, 부품 기준 로컬이다.
|
|
269
366
|
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* `0` 은 **멈춘 채로 저작했다**는 뜻이다. 형식이 정하는 것은 여기까지고, 지금 도는지는
|
|
274
|
-
* 인스턴스가 정한다 — 램프의 `on` 과 `state.lamps` 가 갈리는 것과 같다.
|
|
367
|
+
* **glTF 에는 없다.** 거기서는 부모 노드를 하나 끼워서 중심을 옮긴다. 이 형식의 부품은
|
|
368
|
+
* 겹치지 않으므로 끼울 노드가 없어 여기 둔다. 안 적으면 부품 제 중심이다.
|
|
275
369
|
*/
|
|
276
|
-
|
|
370
|
+
pivot?: Vec3;
|
|
371
|
+
/** 안 적으면 `linear`. */
|
|
372
|
+
interpolation?: Interpolation;
|
|
373
|
+
/** **둘 이상**이어야 한다. 하나뿐이면 움직이는 것이 아니라 자세 하나다. */
|
|
374
|
+
keys: Keyframe[];
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* 움직임 한 벌. **glTF 의 `animations[]` 한 칸이다.**
|
|
378
|
+
*
|
|
379
|
+
* 길이는 적지 않는다 — 마지막 키의 시각이 곧 길이다. 따로 적으면 어긋날 수 있고,
|
|
380
|
+
* 어긋나면 어느 쪽이 맞는지 알 방법이 없다.
|
|
381
|
+
*/
|
|
382
|
+
export interface AnimationClip {
|
|
383
|
+
/** **저장되는 식별자다.** 인스턴스가 이 이름으로 구동한다. */
|
|
384
|
+
name: string;
|
|
385
|
+
/** 안 적으면 `loop`. */
|
|
386
|
+
drive?: ClipDrive;
|
|
387
|
+
channels: AnimationChannel[];
|
|
277
388
|
}
|
|
278
389
|
/** 텍스트 표현 자리. 무엇을·언제만 정하고 수단은 런타임이 고른다. */
|
|
279
390
|
export interface LabelSpec {
|
|
@@ -288,6 +399,35 @@ export interface PartShape {
|
|
|
288
399
|
path?: Point2[];
|
|
289
400
|
/** 코너 라운드. `rect` · `polygon` 공통. */
|
|
290
401
|
round?: number;
|
|
402
|
+
/** 속을 판다. `HollowSpec` 참고. */
|
|
403
|
+
hollow?: HollowSpec;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* 민 단면의 **속을 판다** — 트레이 · 토트 · 통 · 케이스 · 프레임이 전부 이 모양이다.
|
|
407
|
+
*
|
|
408
|
+
* 없을 때는 바닥판 하나에 벽 넷을 세워 만들었다. 다섯 부품이 드는 것도 문제지만 더
|
|
409
|
+
* 나쁜 것은 **모양이 안 맞는다**는 것이다. 셀트레이의 바닥판은 모서리를 둥글게 깎았는데
|
|
410
|
+
* 벽 넷은 각진 상자라, 네 귀퉁이에서 둥근 것과 각진 것이 만난다.
|
|
411
|
+
*
|
|
412
|
+
* 한 덩어리로 밀면 바깥 테가 한 바퀴 이어지고, 안쪽 테도 같은 반경에서 두께만큼 줄어든
|
|
413
|
+
* 채 따라온다. 벽과 바닥이 맞닿는 자리가 없어져 z-fighting 이 날 자리도 하나 준다.
|
|
414
|
+
*
|
|
415
|
+
* `size` 는 **바깥 치수**다. 판 자리는 그 안쪽이다.
|
|
416
|
+
*
|
|
417
|
+
* ## 왜 프리미티브를 새로 만들지 않았나
|
|
418
|
+
*
|
|
419
|
+
* 「속을 판다」는 상자만의 성질이 아니다. `polygon` 을 파면 U 자 가드 · ㄷ 자 프레임이
|
|
420
|
+
* 같은 규칙으로 나온다. 새 프리미티브를 두면 그 둘이 서로 모르는 두 벌이 된다.
|
|
421
|
+
*/
|
|
422
|
+
export interface HollowSpec {
|
|
423
|
+
/** 벽 두께. 안쪽 테는 바깥 테에서 이만큼 들어온다. */
|
|
424
|
+
wall: number;
|
|
425
|
+
/**
|
|
426
|
+
* 바닥 두께. 없으면 벽과 같다.
|
|
427
|
+
*
|
|
428
|
+
* `0` 이면 **위아래가 다 뚫린다** — 통이 아니라 테두리다. 프레임 · 덕트가 그렇다.
|
|
429
|
+
*/
|
|
430
|
+
floor?: number;
|
|
291
431
|
}
|
|
292
432
|
export interface FigurePart {
|
|
293
433
|
/**
|
|
@@ -302,11 +442,39 @@ export interface FigurePart {
|
|
|
302
442
|
/** extrude 계열의 단면. */
|
|
303
443
|
shape?: PartShape;
|
|
304
444
|
material: PartMaterial;
|
|
305
|
-
/**
|
|
306
|
-
|
|
445
|
+
/**
|
|
446
|
+
* 상태 색이 연동될 재질 슬롯. 없으면 상태를 표현하지 않는다.
|
|
447
|
+
*
|
|
448
|
+
* **`slot` 이 아니라 `materialSlot` 이다.** 이 낱말은 스택에서 이미 임자가 있다 —
|
|
449
|
+
* operato-scene 의 `SlotDef` 는 **보유물이 앉는 자리**이고, 그것이 언젠가 이 형식에도
|
|
450
|
+
* 들어온다(`Capacity.get slots()`). 그때 한 형식 안에서 `slot` 이 「재질 인덱스」와
|
|
451
|
+
* 「자재가 앉는 자리」 둘을 뜻하게 된다. 여기는 재질 쪽이므로 그렇게 부른다.
|
|
452
|
+
*/
|
|
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;
|
|
307
469
|
sizing?: SizingRule;
|
|
470
|
+
/**
|
|
471
|
+
* 어느 면을 붙잡나. 적지 않은 축은 **가까운 면**이다(`ANCHOR_ENDS` 참고).
|
|
472
|
+
*
|
|
473
|
+
* `sizing` 이 정한 것을 축마다 덮어쓴다. `sizing: 'stretch'` 는 가장 긴 축에
|
|
474
|
+
* `'span'` 을 넣는 짧은 표기이고, 여기 적으면 그것이 이긴다.
|
|
475
|
+
*/
|
|
476
|
+
anchor?: PartAnchor;
|
|
308
477
|
repeat?: RepeatSpec;
|
|
309
|
-
animation?: AnimationPoint;
|
|
310
478
|
label?: LabelSpec;
|
|
311
479
|
}
|
|
312
480
|
/** 저작 결과. 편집 가능한 원본 데이터. */
|
|
@@ -325,6 +493,13 @@ export interface FigureSource {
|
|
|
325
493
|
/** StyleKit 참조. 팔레트·분할 수·그리드·등급을 한 번에 받는다. */
|
|
326
494
|
styleKit?: string;
|
|
327
495
|
parts: FigurePart[];
|
|
496
|
+
/**
|
|
497
|
+
* 움직임. **glTF 처럼 부품 바깥에 둔다.**
|
|
498
|
+
*
|
|
499
|
+
* 한 clip 이 부품 여럿을 같이 움직이기 때문이다 — 문 두 짝이 같이 열리는 것이 clip
|
|
500
|
+
* 하나다. 부품 안에 넣으면 그 「같이」를 적을 자리가 없다.
|
|
501
|
+
*/
|
|
502
|
+
animations?: AnimationClip[];
|
|
328
503
|
}
|
|
329
504
|
/** 청사진 스키마 버전. 형식이 바뀌면 올린다. */
|
|
330
505
|
export declare const BLUEPRINT_VERSION = 1;
|
|
@@ -341,7 +516,11 @@ export interface BlueprintMember {
|
|
|
341
516
|
* 2D 톱뷰를 3D 와 **같은 분할 수**로 근사하려면 이 값이 필요하므로 따로 제공한다.
|
|
342
517
|
*/
|
|
343
518
|
segments?: number;
|
|
519
|
+
/** 단면을 원으로 지킬 것인가. 곡면만 뜻이 있고 기본은 지키는 것이다. */
|
|
520
|
+
keepRound?: boolean;
|
|
344
521
|
sizing: SizingRule;
|
|
522
|
+
/** 어느 면을 붙잡나. 원본에 적힌 것만 실린다 — 적지 않은 축은 그리는 쪽이 센다. */
|
|
523
|
+
anchor?: PartAnchor;
|
|
345
524
|
repeat?: RepeatSpec;
|
|
346
525
|
shape?: PartShape;
|
|
347
526
|
/** 이 부품의 삼각형 수 추정. */
|
|
@@ -357,20 +536,13 @@ export interface BlueprintGroup {
|
|
|
357
536
|
/** MaterialBank 키. */
|
|
358
537
|
materialKey: string;
|
|
359
538
|
material: PartMaterial;
|
|
360
|
-
|
|
361
|
-
/**
|
|
539
|
+
materialSlot?: MaterialSlot;
|
|
540
|
+
/** 움직이는 부품이 든 그룹인지. 그런 그룹은 부품을 하나만 갖는다. */
|
|
362
541
|
animated: boolean;
|
|
363
542
|
members: BlueprintMember[];
|
|
364
543
|
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
name: string;
|
|
368
|
-
kind: AnimationKind;
|
|
369
|
-
axis?: Axis;
|
|
370
|
-
pivot?: Vec3;
|
|
371
|
-
/** 초당 회전 수. 안 적으면 런타임 기본값. */
|
|
372
|
-
turnsPerSecond?: number;
|
|
373
|
-
}
|
|
544
|
+
/** 청사진의 clip. 원본에 적은 것 그대로다. */
|
|
545
|
+
export type BlueprintClip = AnimationClip;
|
|
374
546
|
export interface BlueprintLabel extends LabelSpec {
|
|
375
547
|
/** 어느 부품에 붙나. `FigurePart.name`. */
|
|
376
548
|
at: string;
|
|
@@ -391,13 +563,13 @@ export interface Violation {
|
|
|
391
563
|
* 처리를 정해야 하는데, 코드가 늘어난 것이 알려지지 않으면 그 대응이 빠진다. 뜻은
|
|
392
564
|
* `docs/validation.md` 에 있고, 문서와 이 목록이 어긋나면 테스트가 실패한다.
|
|
393
565
|
*/
|
|
394
|
-
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", "missing-material", "material-unresolvable", "missing-repeat", "missing-
|
|
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"];
|
|
395
567
|
export type ErrorCode = (typeof ERROR_CODES)[number];
|
|
396
568
|
/**
|
|
397
569
|
* 위반 코드 전부. 위반은 컴파일을 막지 않는다 — 저작 화면이 알려 주는 데 쓴다.
|
|
398
570
|
* 뜻과 한도는 `docs/validation.md` 에 있다.
|
|
399
571
|
*/
|
|
400
|
-
export declare const VIOLATION_CODES: readonly ["segments-off-preset", "segments-ignored", "repeat-ignored", "detail-level-missing", "too-many-parts", "too-many-
|
|
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"];
|
|
401
573
|
export type ViolationCode = (typeof VIOLATION_CODES)[number];
|
|
402
574
|
/** 형식·정합성 오류. 이것이 있으면 컴파일할 수 없다. */
|
|
403
575
|
export interface FigureError {
|
|
@@ -418,11 +590,11 @@ export interface FigureBlueprint {
|
|
|
418
590
|
detailLevel?: DetailLevel;
|
|
419
591
|
budget: {
|
|
420
592
|
triangles: number;
|
|
421
|
-
/** 묶음 수 = 재질·슬롯 조합 수 +
|
|
593
|
+
/** 묶음 수 = 재질·슬롯 조합 수 + 움직이는 부품 수. **재는 것은 이것이다.** */
|
|
422
594
|
groups: number;
|
|
423
595
|
};
|
|
424
596
|
groups: BlueprintGroup[];
|
|
425
|
-
|
|
597
|
+
animations: BlueprintClip[];
|
|
426
598
|
labels: BlueprintLabel[];
|
|
427
599
|
violations: Violation[];
|
|
428
600
|
}
|
|
@@ -470,8 +642,8 @@ export interface FigureInstanceModel {
|
|
|
470
642
|
export declare const LIMITS: {
|
|
471
643
|
/** 재질·슬롯 조합 수. */
|
|
472
644
|
readonly materialGroups: 3;
|
|
473
|
-
/**
|
|
474
|
-
readonly
|
|
645
|
+
/** 움직이는 부품 수. 프레임마다 매트릭스를 갱신하고, 저마다 단독 묶음이다. */
|
|
646
|
+
readonly animatedParts: 2;
|
|
475
647
|
/** 투명 재질. 정렬 비용이 크다. */
|
|
476
648
|
readonly transparentMaterials: 1;
|
|
477
649
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqBA,8CAA8C;AAC9C,eAAO,MAAM,eAAe,oEAAqE,CAAA;AACjG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,+BAA+B;AAC/B,eAAO,MAAM,kBAAkB,EAAE,SAAS,aAAa,EAAwB,CAAA;AAE/E,oCAAoC;AACpC,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA2C,CAAA;AAE/F,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,EAAE,SAAS,aAAa,EAA2B,CAAA;AAEpF;;;GAGG;AACH,eAAO,MAAM,cAAc,0BAA2B,CAAA;AACtD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,gFAAiF,CAAA;AAC9G,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D;;;;;;;GAOG;AACH,oDAAoD;AACpD,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAA;AAE9C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,MAAM,CAAA;AAE/B,eAAO,MAAM,YAAY,kDAAmD,CAAA;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,0BAA2B,CAAA;AACrD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,mBAAmB;AACnB,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAyB,CAAA;AAE5E,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqBA,8CAA8C;AAC9C,eAAO,MAAM,eAAe,oEAAqE,CAAA;AACjG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,+BAA+B;AAC/B,eAAO,MAAM,kBAAkB,EAAE,SAAS,aAAa,EAAwB,CAAA;AAE/E,oCAAoC;AACpC,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA2C,CAAA;AAE/F,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,EAAE,SAAS,aAAa,EAA2B,CAAA;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,aAAa,EAA2B,CAAA;AAEjF;;;GAGG;AACH,eAAO,MAAM,cAAc,0BAA2B,CAAA;AACtD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,gFAAiF,CAAA;AAC9G,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D;;;;;;;GAOG;AACH,oDAAoD;AACpD,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAA;AAE9C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,MAAM,CAAA;AAE/B,eAAO,MAAM,YAAY,kDAAmD,CAAA;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,YAAY,wFAoBf,CAAA;AACV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,CAAC,EAAE,UAAU,CAAA;IACd,CAAC,CAAC,EAAE,UAAU,CAAA;IACd,CAAC,CAAC,EAAE,UAAU,CAAA;CACf;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,0BAA2B,CAAA;AACrD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,mBAAmB;AACnB,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAyB,CAAA;AAE5E;;;;GAIG;AACH,eAAO,MAAM,aAAa,+CAAgD,CAAA;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,uEAAuE;AACvE,eAAO,MAAM,cAAc,6BAA8B,CAAA;AACzD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE3D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,2BAA4B,CAAA;AACpD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,eAAO,MAAM,IAAI,0BAA2B,CAAA;AAC5C,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;AAExC,oDAAoD;AACpD,eAAO,MAAM,WAAW,uDAAwD,CAAA;AAChF,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,QAAQ,EAAE,IAAI,CAAA;IACd,sDAAsD;IACtD,IAAI,EAAE,IAAI,CAAA;IACV,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAED;;;;;GAKG;AACH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,kCAAmC,CAAA;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAA;IACjB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,EAAE,CAAC,EAAE,OAAO,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAA;IACV;;;;;;;;;;;;;OAaG;IACH,KAAK,EAAE,MAAM,CAAA;CACd;AAED,uDAAuD;AACvD,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAA;IACV;;;;;;OAMG;IACH,KAAK,EAAE,IAAI,CAAA;CACZ;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,WAAW,CAAA;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,sBAAsB;IACtB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,gDAAgD;IAChD,IAAI,EAAE,QAAQ,EAAE,CAAA;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,oBAAoB;IACpB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,yBAAyB;AACzB,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,aAAa,CAAA;IACxB,SAAS,EAAE,aAAa,CAAA;IACxB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,YAAY,CAAA;IACtB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,4BAA4B;AAC5B,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;CAC7B;AAID,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAElC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,aAAa,CAAA;IACxB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,aAAa,CAAA;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,YAAY,CAAA;IACtB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,eAAe,EAAE,CAAA;CAC3B;AAED,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG,aAAa,CAAA;AAEzC,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAA;CACX;AAED,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,imBA2Cd,CAAA;AACV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD;;;GAGG;AACH,eAAO,MAAM,eAAe,mUAelB,CAAA;AACV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAA;IACf,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,IAAI,CAAA;IACb;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAA;QACjB,qDAAqD;QACrD,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,EAAE,SAAS,EAAE,CAAA;CACxB;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM;IACjB,kBAAkB;;IAElB,gDAAgD;;IAEhD,wBAAwB;;IAExB;;;;;;;OAOG;;IAEH,iCAAiC;;CAEzB,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAA4B,CAAA"}
|
package/dist/types.js
CHANGED
|
@@ -26,6 +26,13 @@ export const EXTRUDE_PRIMITIVES = ['rect', 'polygon'];
|
|
|
26
26
|
export const MESH_PRIMITIVES = ['cube', 'wall', 'cylinder', 'sphere'];
|
|
27
27
|
/** 분할 수를 갖는 프리미티브 — 곡면이 있는 것만. */
|
|
28
28
|
export const SEGMENTED_PRIMITIVES = ['cylinder', 'sphere'];
|
|
29
|
+
/**
|
|
30
|
+
* 단면이 **원**인 프리미티브.
|
|
31
|
+
*
|
|
32
|
+
* 축마다 다른 배율을 받으면 타원이 된다. 그래서 이것들은 합친 묶음에 들지 못한다 —
|
|
33
|
+
* 합친 형상은 변환을 하나만 받는다. 곡면 부품 하나가 draw call 하나다.
|
|
34
|
+
*/
|
|
35
|
+
export const CURVED_PRIMITIVES = ['cylinder', 'sphere'];
|
|
29
36
|
/**
|
|
30
37
|
* 재질 슬롯. extrude 계열의 재질 인덱스가 둘로 정해져 있다.
|
|
31
38
|
* `threed/real-object-extrude.ts:105-111` — 0 = cap(fillStyle), 1 = side(strokeStyle)
|
|
@@ -56,6 +63,71 @@ export const DEFAULT_SIZING = 'scale';
|
|
|
56
63
|
*/
|
|
57
64
|
export const REPEAT_LIMIT = 100;
|
|
58
65
|
export const SIZING_RULES = ['scale', 'fixed', 'stretch', 'repeat'];
|
|
66
|
+
/**
|
|
67
|
+
* 부품이 한 축에서 기준 상자의 **어느 면을 붙잡나**. 축마다 따로 정한다.
|
|
68
|
+
*
|
|
69
|
+
* scale **아무 면도 안 붙잡는다.** 상자와 함께 비례로 커진다
|
|
70
|
+
* min 아래(또는 왼쪽·뒤) 면에서 잰 거리를 지킨다
|
|
71
|
+
* center 자리는 비례로 따라가고 **크기는 지킨다**
|
|
72
|
+
* max 위(또는 오른쪽·앞) 면에서 잰 거리를 지킨다
|
|
73
|
+
* span **양쪽을 다 붙잡는다.** 가운데가 늘어나 사이를 채운다
|
|
74
|
+
*
|
|
75
|
+
* 붙잡는 면의 수로 읽으면 하나다 — 0 개면 상자와 함께 커지고, 1 개면 그 면에서 잰
|
|
76
|
+
* 거리를 지키고, 2 개면 사이를 채운다. 3D 도구의 나인슬라이스가 하는 일이고 여기서는
|
|
77
|
+
* 그것이 세 축으로 있다.
|
|
78
|
+
*
|
|
79
|
+
* ## `repeat` 의 축에서는 **줄이 어떻게 되는가**를 말한다
|
|
80
|
+
*
|
|
81
|
+
* 같은 「반복」이 두 가지다.
|
|
82
|
+
*
|
|
83
|
+
* 컨베이어의 롤러 길어지면 롤러가 **는다.** 한 칸 간격은 그대로다
|
|
84
|
+
* 셀트레이의 셀 커지면 셀이 **커진다.** 개수는 그 트레이가 몇 셀짜리냐이지
|
|
85
|
+
* 화면에 얼마나 크게 그렸느냐가 아니다
|
|
86
|
+
*
|
|
87
|
+
* 앞의 것이 `center`(줄이 상자를 채운다), 뒤의 것이 `scale`(줄이 상자와 함께 큰다)이다.
|
|
88
|
+
*
|
|
89
|
+
* ## 없던 것을 왜 더하나
|
|
90
|
+
*
|
|
91
|
+
* `sizing` 은 부품의 **크기**가 인스턴스를 어떻게 따라가는지만 말했다. **자리**는
|
|
92
|
+
* 언제나 비례였다. 그래서 시그널 타워를 3 배로 세우면 기둥은 늘어나는데 램프들은
|
|
93
|
+
* 기둥 위 공중으로 흩어졌다 — 저작한 자리 512 가 1536 이 되고, 그 사이의 틈 100 이
|
|
94
|
+
* 300 이 되기 때문이다.
|
|
95
|
+
*
|
|
96
|
+
* 1× foot 0..90 · pole 85..705 · bracket 703..747 · … · cap 1037..1087
|
|
97
|
+
* 3× foot 90..180 · pole 255..2115 · bracket 2153..2197 · … · cap 3161..3211
|
|
98
|
+
*
|
|
99
|
+
* 램프는 상자 안 어디쯤이 아니라 **기둥 꼭대기**에 붙어 있다. 형식에 그 말을 적을
|
|
100
|
+
* 자리가 없었다.
|
|
101
|
+
*
|
|
102
|
+
* ## 적지 않으면 **가까운 면**을 붙잡는다
|
|
103
|
+
*
|
|
104
|
+
* 상자의 위 절반에 저작한 것은 위를, 아래 절반에 저작한 것은 아래를 붙잡는다.
|
|
105
|
+
* 정확히 가운데면 `center` 다. 사람이 램프를 꼭대기 근처에 놓을 때 뜻하는 것이
|
|
106
|
+
* 그것이고, 그래서 표본 열넷 중 어느 것도 이 값을 적지 않고 제대로 선다.
|
|
107
|
+
*
|
|
108
|
+
* `sizing` 이 `'scale'` 인 부품에는 뜻이 없다 — 그 부품은 상자와 함께 커진다.
|
|
109
|
+
*/
|
|
110
|
+
export const ANCHOR_RULES = [
|
|
111
|
+
'scale',
|
|
112
|
+
'min',
|
|
113
|
+
'center',
|
|
114
|
+
'max',
|
|
115
|
+
'span',
|
|
116
|
+
/*
|
|
117
|
+
다른 축의 배율을 따라간다 — **비율을 지킨다.**
|
|
118
|
+
|
|
119
|
+
드라이룸의 출입구가 그렇다. 방을 키우면 문도 커져야 하지만 문은 문이라 **폭이
|
|
120
|
+
높이에 비례**해야 한다. `scale` 로 두면 폭이 제 축(x)을 따라가므로, 방을 폭으로만
|
|
121
|
+
늘리면 문이 넓어지기만 하고 높아지지 않는다.
|
|
122
|
+
|
|
123
|
+
anchor: { x: 'aspect-y', y: 'scale', z: 'max' }
|
|
124
|
+
|
|
125
|
+
자기 자신이나 또 다른 `aspect-` 축을 가리킬 수는 없다.
|
|
126
|
+
*/
|
|
127
|
+
'aspect-x',
|
|
128
|
+
'aspect-y',
|
|
129
|
+
'aspect-z'
|
|
130
|
+
];
|
|
59
131
|
/**
|
|
60
132
|
* 디테일 등급 — 이 형상을 얼마나 상세하게 만들 것인지 저작자가 밝히는 값.
|
|
61
133
|
*
|
|
@@ -72,10 +144,27 @@ export const SIZING_RULES = ['scale', 'fixed', 'stretch', 'repeat'];
|
|
|
72
144
|
export const DETAIL_LEVELS = ['S', 'M', 'L'];
|
|
73
145
|
/** 등급별 부품 수 상한. */
|
|
74
146
|
export const PART_LIMIT = { S: 3, M: 8, L: 20 };
|
|
75
|
-
/**
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
147
|
+
/**
|
|
148
|
+
* 채널이 무엇을 움직이나. **glTF 의 `target.path` 그대로다.**
|
|
149
|
+
*
|
|
150
|
+
* `weights` 는 없다 — 모프 타깃이 없는 형식이다.
|
|
151
|
+
*/
|
|
152
|
+
export const CHANNEL_PATHS = ['translation', 'rotation', 'scale'];
|
|
153
|
+
/** 키프레임 사이를 어떻게 잇나. glTF 의 `CUBICSPLINE` 은 없다 — 접선을 손으로 적을 형식이 아니다. */
|
|
154
|
+
export const INTERPOLATIONS = ['linear', 'step'];
|
|
155
|
+
/**
|
|
156
|
+
* clip 이 어떻게 구동되나.
|
|
157
|
+
*
|
|
158
|
+
* **glTF 에는 없는 항목이다.** glTF 는 재생을 런타임에 맡긴다. 여기서 형식이 말하는
|
|
159
|
+
* 이유는 트윈이 타임라인을 재생하지 않기 때문이다 — 「문 열기 클립을 재생하라」가 아니라
|
|
160
|
+
* 「지금 40% 열려 있다」다.
|
|
161
|
+
*
|
|
162
|
+
* loop 시각이 흐른다. 인스턴스가 주는 값은 **배속**이다. 도는 롤러가 그렇다
|
|
163
|
+
* hold 시각이 멈춰 있다. 인스턴스가 주는 값은 **0~1 위치**다. 열린 정도가 그렇다
|
|
164
|
+
*
|
|
165
|
+
* 같은 clip 이 둘 다 될 수 있지만, 그 자산이 무엇인지는 저작 시점에 정해진다.
|
|
166
|
+
*/
|
|
167
|
+
export const CLIP_DRIVES = ['loop', 'hold'];
|
|
79
168
|
export const AXES = ['x', 'y', 'z'];
|
|
80
169
|
/** 텍스트를 언제 보이나. 표현 수단(sprite·overlay)은 런타임이 고른다. */
|
|
81
170
|
export const LABEL_WHENS = ['always', 'zoomed', 'selected', 'abnormal'];
|
|
@@ -128,14 +217,19 @@ export const ERROR_CODES = [
|
|
|
128
217
|
// 단면
|
|
129
218
|
'missing-shape-path',
|
|
130
219
|
'bad-shape-point',
|
|
220
|
+
'hollow-too-thick',
|
|
221
|
+
'hollow-not-convex',
|
|
222
|
+
'bad-aspect-axis',
|
|
131
223
|
// 재질
|
|
132
224
|
'missing-material',
|
|
133
225
|
'material-unresolvable',
|
|
134
226
|
// 크기 반응
|
|
135
227
|
'missing-repeat',
|
|
136
228
|
// 애니메이션
|
|
137
|
-
'missing-
|
|
138
|
-
'
|
|
229
|
+
'missing-channels',
|
|
230
|
+
'unknown-channel-target',
|
|
231
|
+
'too-few-keys',
|
|
232
|
+
'keys-out-of-order',
|
|
139
233
|
// 예외 표면
|
|
140
234
|
'missing-surface-ref',
|
|
141
235
|
// 라벨
|
|
@@ -150,9 +244,13 @@ export const VIOLATION_CODES = [
|
|
|
150
244
|
'segments-off-preset',
|
|
151
245
|
'segments-ignored',
|
|
152
246
|
'repeat-ignored',
|
|
247
|
+
'anchor-ignored',
|
|
248
|
+
'keep-round-ignored',
|
|
249
|
+
'hollow-ignored',
|
|
250
|
+
'pivot-ignored',
|
|
153
251
|
'detail-level-missing',
|
|
154
252
|
'too-many-parts',
|
|
155
|
-
'too-many-
|
|
253
|
+
'too-many-animated-parts',
|
|
156
254
|
'too-many-material-groups',
|
|
157
255
|
'too-many-transparent',
|
|
158
256
|
'too-many-surface-textures',
|
|
@@ -170,8 +268,8 @@ export const VIOLATION_CODES = [
|
|
|
170
268
|
export const LIMITS = {
|
|
171
269
|
/** 재질·슬롯 조합 수. */
|
|
172
270
|
materialGroups: 3,
|
|
173
|
-
/**
|
|
174
|
-
|
|
271
|
+
/** 움직이는 부품 수. 프레임마다 매트릭스를 갱신하고, 저마다 단독 묶음이다. */
|
|
272
|
+
animatedParts: 2,
|
|
175
273
|
/** 투명 재질. 정렬 비용이 크다. */
|
|
176
274
|
transparentMaterials: 1,
|
|
177
275
|
/**
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAU,CAAA;AAGjG,+BAA+B;AAC/B,MAAM,CAAC,MAAM,kBAAkB,GAA6B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAE/E,oCAAoC;AACpC,MAAM,CAAC,MAAM,eAAe,GAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;AAE/F,kCAAkC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;AAEpF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAA;AAGtD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAG9G;;;;;;;GAOG;AACH,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAA;AAE9C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAA;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAG5E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAGrD,mBAAmB;AACnB,MAAM,CAAC,MAAM,UAAU,GAAgC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;AAE5E
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAqBA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAqBA,OAAO,EAqBL,KAAK,WAAW,EAGhB,KAAK,SAAS,EAEf,MAAM,YAAY,CAAA;AAOnB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,UAAU,EAAE,SAAS,EAAE,CAAA;CACxB;AAqiBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CA2CxD"}
|