@hatiolab/figure-model 0.1.8 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,14 +13,26 @@ export declare class FigureCompileError extends Error {
13
13
  *
14
14
  * cube · wall BoxGeometry 면 6 × 2 = 12
15
15
  * cylinder CylinderGeometry(seg) 측면 2·seg + 캡 2·seg = 4·seg
16
- * sphere SphereGeometry(w, h) 2·w·(h−1) 극점 줄은 삼각형 하나씩
17
- * rect ExtrudeGeometry 캡 2×2 + 측면 4×2 = 12
18
- * polygon(n 점) ExtrudeGeometry 캡 2·(n−2) + 측면 2·n
16
+ * 민 것(n 점) ExtrudeGeometry 캡 2·(n−2) + 측면 2·n = 4n − 4
17
+ * 속 판 것 ExtrudeGeometry+구멍 4·(n + m) m 은 안쪽 테의 점 수
19
18
  *
20
- * 추정이다. 베벨과 라운드 코너는 세지 않는다 — 예산의 자릿수를 보는 값이므로
21
- * 정확도보다 일관성이 중요하다.
19
+ * ## 라운드를 안 세다가 12 배를 놓쳤다
20
+ *
21
+ * 한동안 `rect` 를 라운드와 무관하게 12 로 셌다. 「베벨과 라운드는 세지 않는다」고
22
+ * 적어 두기까지 했다. three 로 실제로 만들어 세어 보면
23
+ *
24
+ * rect 각짐 12 cube 와 같다 — 민다고 비싸지지 않는다
25
+ * rect round=24 140 모서리마다 8 점으로 뽑으므로 테가 36 점이 된다
26
+ * 속 판 rect round=24 160 구멍은 +20 이다. 고리의 캡이 통짜 캡보다 싸다
27
+ *
28
+ * **비싼 것은 미는 것이 아니라 라운드다.** 그리고 라운드는 저작자가 무심코 넣는
29
+ * 값이라, 예산이 12 배 적게 세고 있으면 그 선택의 대가가 화면에 안 나타난다.
30
+ *
31
+ * 그리는 쪽이 테를 몇 점으로 뽑는지(`SEGMENT_PRESETS[0]`)와 **같은 수**를 쓴다.
32
+ * 다르면 재는 값과 그려지는 것이 갈린다.
22
33
  */
23
34
  export declare function trianglesOf(part: FigurePart): number;
35
+ /** `sizing` 이 없으면 무엇으로 보나 — 비례 확대가 가장 예측 가능하다. */
24
36
  /**
25
37
  * 회전까지 반영한 부품의 축별 크기.
26
38
  *
@@ -1 +1 @@
1
- {"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAI7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrF,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,UAAU,EAGf,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,KAAK,IAAI,EACV,MAAM,YAAY,CAAA;AAEnB,+CAA+C;AAC/C,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;gBAE7B,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;CAS7C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoBpD;AAKD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAuBxE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAKtE;AAiBD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAmFxD"}
1
+ {"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAK7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrF,OAAO,EAQL,KAAK,eAAe,EACpB,KAAK,UAAU,EAGf,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,KAAK,IAAI,EACV,MAAM,YAAY,CAAA;AAEnB,+CAA+C;AAC/C,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;gBAE7B,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;CAS7C;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA0BpD;AAuBD,kDAAkD;AAElD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAuBxE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAKtE;AAkBD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAgFxD"}
package/dist/blueprint.js CHANGED
@@ -22,9 +22,10 @@
22
22
  */
23
23
  import { validate } from "./validate.js";
24
24
  import { geometryKeyOf, groupKeyOf, materialKeyOf, usesSegments } from "./keys.js";
25
+ import { animatedNames, standsAlone } from "./grouping.js";
25
26
  // 키는 keys.ts 가 기준이 되는 원본이다. 소비처가 쓰던 이름 그대로 다시 내보낸다.
26
27
  export { geometryKeyOf, emissiveKeyOf, materialKeyOf, usesSegments } from "./keys.js";
27
- import { BLUEPRINT_VERSION } from "./types.js";
28
+ import { BLUEPRINT_VERSION, DEFAULT_SIZING, SEGMENT_PRESETS } from "./types.js";
28
29
  /** 컴파일할 수 없을 때 던진다. 오류보고없이 빈 청사진을 돌려주지 않는다. */
29
30
  export class FigureCompileError extends Error {
30
31
  errors;
@@ -45,12 +46,23 @@ export class FigureCompileError extends Error {
45
46
  *
46
47
  * cube · wall BoxGeometry 면 6 × 2 = 12
47
48
  * cylinder CylinderGeometry(seg) 측면 2·seg + 캡 2·seg = 4·seg
48
- * sphere SphereGeometry(w, h) 2·w·(h−1) 극점 줄은 삼각형 하나씩
49
- * rect ExtrudeGeometry 캡 2×2 + 측면 4×2 = 12
50
- * polygon(n 점) ExtrudeGeometry 캡 2·(n−2) + 측면 2·n
49
+ * 민 것(n 점) ExtrudeGeometry 캡 2·(n−2) + 측면 2·n = 4n − 4
50
+ * 속 판 것 ExtrudeGeometry+구멍 4·(n + m) m 은 안쪽 테의 점 수
51
51
  *
52
- * 추정이다. 베벨과 라운드 코너는 세지 않는다 — 예산의 자릿수를 보는 값이므로
53
- * 정확도보다 일관성이 중요하다.
52
+ * ## 라운드를 안 세다가 12 배를 놓쳤다
53
+ *
54
+ * 한동안 `rect` 를 라운드와 무관하게 12 로 셌다. 「베벨과 라운드는 세지 않는다」고
55
+ * 적어 두기까지 했다. three 로 실제로 만들어 세어 보면
56
+ *
57
+ * rect 각짐 12 cube 와 같다 — 민다고 비싸지지 않는다
58
+ * rect round=24 140 모서리마다 8 점으로 뽑으므로 테가 36 점이 된다
59
+ * 속 판 rect round=24 160 구멍은 +20 이다. 고리의 캡이 통짜 캡보다 싸다
60
+ *
61
+ * **비싼 것은 미는 것이 아니라 라운드다.** 그리고 라운드는 저작자가 무심코 넣는
62
+ * 값이라, 예산이 12 배 적게 세고 있으면 그 선택의 대가가 화면에 안 나타난다.
63
+ *
64
+ * 그리는 쪽이 테를 몇 점으로 뽑는지(`SEGMENT_PRESETS[0]`)와 **같은 수**를 쓴다.
65
+ * 다르면 재는 값과 그려지는 것이 갈린다.
54
66
  */
55
67
  export function trianglesOf(part) {
56
68
  const seg = part.segments ?? 12;
@@ -65,15 +77,40 @@ export function trianglesOf(part) {
65
77
  return 2 * seg * (h - 1);
66
78
  }
67
79
  case 'rect':
68
- return 12;
69
80
  case 'polygon': {
70
- const n = part.shape?.path?.length ?? 3;
71
- return 2 * (n - 2) + 2 * n;
81
+ const n = outlinePointsOf(part);
82
+ const hollow = part.shape?.hollow;
83
+ if (!hollow)
84
+ return 4 * n - 4;
85
+ const m = innerPointsOf(part);
86
+ const ring = 4 * (n + m);
87
+ // 바닥이 0 이면 위아래가 다 뚫린 테두리다 — 덮는 판이 없다.
88
+ const floor = (hollow.floor ?? hollow.wall) > 0 ? 4 * n - 4 : 0;
89
+ return ring + floor;
72
90
  }
73
91
  }
74
92
  }
93
+ /**
94
+ * 민 단면의 테가 몇 점인가.
95
+ *
96
+ * 라운드가 있으면 모서리 넷이 저마다 곡선이 되고, 그리는 쪽이 곡선 하나를
97
+ * `SEGMENT_PRESETS[0]` 점으로 뽑는다. 곡선 사이를 잇는 직선의 끝점 넷이 더 붙는다.
98
+ *
99
+ * `polygon` 은 라운드를 쓰지 않는다 — 그리는 쪽이 적힌 점을 그대로 잇는다.
100
+ */
101
+ function outlinePointsOf(part) {
102
+ if (part.primitive === 'polygon')
103
+ return part.shape?.path?.length ?? 3;
104
+ return part.shape?.round ? 4 * SEGMENT_PRESETS[0] + 4 : 4;
105
+ }
106
+ /** 안쪽 테. 벽 두께만큼 들어오므로 라운드가 그만큼 줄고, 0 이 되면 각진 모서리가 된다. */
107
+ function innerPointsOf(part) {
108
+ if (part.primitive === 'polygon')
109
+ return part.shape?.path?.length ?? 3;
110
+ const round = (part.shape?.round ?? 0) - (part.shape?.hollow?.wall ?? 0);
111
+ return round > 0 ? 4 * SEGMENT_PRESETS[0] + 4 : 4;
112
+ }
75
113
  /** `sizing` 이 없으면 무엇으로 보나 — 비례 확대가 가장 예측 가능하다. */
76
- const DEFAULT_SIZING = 'scale';
77
114
  /**
78
115
  * 회전까지 반영한 부품의 축별 크기.
79
116
  *
@@ -136,6 +173,8 @@ function memberOf(part) {
136
173
  };
137
174
  if (usesSegments(part.primitive) && part.segments !== undefined)
138
175
  member.segments = part.segments;
176
+ if (part.anchor !== undefined)
177
+ member.anchor = part.anchor;
139
178
  if (part.repeat !== undefined)
140
179
  member.repeat = part.repeat;
141
180
  if (part.shape !== undefined)
@@ -155,33 +194,29 @@ export function compile(source) {
155
194
  throw new FigureCompileError(errors);
156
195
  const src = source;
157
196
  const groups = [];
158
- const points = [];
197
+ const animations = (src.animations ?? []);
198
+ // 어느 부품을 clip 이 움직이나. 묶음을 가르는 판단이 이걸 먼저 알아야 한다.
199
+ const moving = animatedNames(animations);
159
200
  const labels = [];
160
201
  const byKey = new Map();
161
202
  for (const part of src.parts) {
162
203
  if (part.label !== undefined) {
163
204
  labels.push({ ...part.label, at: part.name });
164
205
  }
165
- if (part.animation !== undefined) {
166
- // 애니메이션이 걸린 부품은 단독 묶음이다 — 합치면 따로 움직일 수 없다
167
- const point = { name: part.name, kind: part.animation.kind };
168
- if (part.animation.axis !== undefined)
169
- point.axis = part.animation.axis;
170
- if (part.animation.pivot !== undefined)
171
- point.pivot = part.animation.pivot;
172
- points.push(point);
206
+ if (moving.has(part.name)) {
207
+ // clip 이 움직이는 부품은 단독 묶음이다 — 합치면 따로 움직일 수 없다
173
208
  const group = {
174
209
  materialKey: materialKeyOf(part),
175
210
  material: part.material,
176
211
  animated: true,
177
212
  members: [memberOf(part)]
178
213
  };
179
- if (part.slot !== undefined)
180
- group.slot = part.slot;
214
+ if (part.materialSlot !== undefined)
215
+ group.materialSlot = part.materialSlot;
181
216
  groups.push(group);
182
217
  continue;
183
218
  }
184
- if ((part.sizing ?? DEFAULT_SIZING) !== 'scale') {
219
+ if (standsAlone(part, moving)) {
185
220
  // 크기 반응이 다른 부품도 단독 묶음이다 — 합친 geometry 는 변환을 하나만 받는다
186
221
  const group = {
187
222
  materialKey: materialKeyOf(part),
@@ -189,8 +224,8 @@ export function compile(source) {
189
224
  animated: false,
190
225
  members: [memberOf(part)]
191
226
  };
192
- if (part.slot !== undefined)
193
- group.slot = part.slot;
227
+ if (part.materialSlot !== undefined)
228
+ group.materialSlot = part.materialSlot;
194
229
  groups.push(group);
195
230
  continue;
196
231
  }
@@ -206,8 +241,8 @@ export function compile(source) {
206
241
  animated: false,
207
242
  members: [memberOf(part)]
208
243
  };
209
- if (part.slot !== undefined)
210
- group.slot = part.slot;
244
+ if (part.materialSlot !== undefined)
245
+ group.materialSlot = part.materialSlot;
211
246
  byKey.set(key, group);
212
247
  groups.push(group);
213
248
  }
@@ -218,7 +253,7 @@ export function compile(source) {
218
253
  base: src.base,
219
254
  budget: { triangles, groups: groups.length },
220
255
  groups,
221
- points,
256
+ animations,
222
257
  labels,
223
258
  violations
224
259
  };
@@ -1 +1 @@
1
- {"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts CHANGED
@@ -56,6 +56,8 @@ export interface FigureCost {
56
56
  triangles: number;
57
57
  /** 묶음 수 = 인스턴스 하나당 draw call. */
58
58
  groups: number;
59
+ /** Draw calls one instance costs. Repeat copies count one each. */
60
+ drawCalls: number;
59
61
  /**
60
62
  * 서로 다른 **형상**의 수(`geometryKeyOf` 기준).
61
63
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IAEZ,eAAe;IACf,KAAK,EAAE,MAAM,CAAA;IAEb,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IAEjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAA;IAEd;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAA;IAEtB,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAA;IAEvB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB,yBAAyB;IACzB,EAAE,EAAE,YAAY,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,SAAM,GAAG,UAAU,CA0C9E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAwBvD;AAID;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAAA;IAClE,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAE/C,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;;OAIG;IACH,KAAK,EAAE,WAAW,CAAA;IAElB,sCAAsC;IACtC,QAAQ,EAAE,eAAe,CAAA;IAEzB,OAAO,EAAE,eAAe,EAAE,CAAA;IAE1B;;;;;OAKG;IACH,KAAK,EAAE;QACL,kBAAkB;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,eAAe;QACf,KAAK,EAAE,MAAM,CAAA;QACb,uCAAuC;QACvC,KAAK,EAAE,MAAM,CAAA;QACb,mBAAmB;QACnB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAaD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,eAAe,GAAG,WAAW,CAoE/D"}
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAA;AAE7D,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IAEZ,eAAe;IACf,KAAK,EAAE,MAAM,CAAA;IAEb,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IAEjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAA;IAEtB,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAA;IAEvB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB,yBAAyB;IACzB,EAAE,EAAE,YAAY,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,SAAM,GAAG,UAAU,CA+D9E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAwBvD;AAID;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAAA;IAClE,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAE/C,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;;OAIG;IACH,KAAK,EAAE,WAAW,CAAA;IAElB,sCAAsC;IACtC,QAAQ,EAAE,eAAe,CAAA;IAEzB,OAAO,EAAE,eAAe,EAAE,CAAA;IAE1B;;;;;OAKG;IACH,KAAK,EAAE;QACL,kBAAkB;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,eAAe;QACf,KAAK,EAAE,MAAM,CAAA;QACb,uCAAuC;QACvC,KAAK,EAAE,MAAM,CAAA;QACb,mBAAmB;QACnB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAaD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,eAAe,GAAG,WAAW,CAoE/D"}
package/dist/cost.js CHANGED
@@ -9,6 +9,7 @@
9
9
  * 수와 무관하다. 반면 삼각형과 draw call 은 인스턴스에 비례한다. 이 둘을 갈라 보여
10
10
  * 주면, 저작자가 「부품을 하나 더 넣을까」를 근거를 갖고 정할 수 있다.
11
11
  */
12
+ import { repeatCountOf } from "./grouping.js";
12
13
  import { LIMITS, PART_LIMIT } from "./types.js";
13
14
  /**
14
15
  * 청사진 하나의 원가를 낸다.
@@ -39,11 +40,27 @@ export function costOf(blueprint, instances = 100) {
39
40
  }
40
41
  }
41
42
  const groups = blueprint.groups.length;
43
+ /*
44
+ Draw calls per instance. **Not the same as the group count.**
45
+
46
+ A repeat part is one group but many meshes -- the cell tray has two groups
47
+ and draws nine times. Reporting groups here made the capacity number 2.3x
48
+ too generous, and the author sizing a drawing by it would find the board
49
+ slow anyway.
50
+
51
+ Counted as authored, at scale 1. The row fills whatever box the instance
52
+ is given, so a stretched instance draws more.
53
+ */
54
+ const drawCalls = blueprint.groups.reduce((total, group) => total +
55
+ (group.members.length === 1
56
+ ? repeatCountOf(group.members[0], blueprint.base)
57
+ : 1), 0);
42
58
  return {
43
59
  type: blueprint.type,
44
60
  parts,
45
61
  triangles,
46
62
  groups,
63
+ drawCalls,
47
64
  distinctShapes: shapes.size,
48
65
  distinctMaterials: materials.size,
49
66
  surfaceTextures: surfaces.size,
@@ -51,7 +68,7 @@ export function costOf(blueprint, instances = 100) {
51
68
  at: {
52
69
  instances: n,
53
70
  triangles: triangles * n,
54
- drawCalls: groups * n,
71
+ drawCalls: drawCalls * n,
55
72
  // 병합된 geometry 는 (타입, 묶음)당 하나다 — 인스턴스가 몇이든 늘지 않는다.
56
73
  geometries: groups,
57
74
  materials: materials.size,
@@ -110,17 +127,17 @@ export function scoreOf(blueprint) {
110
127
  {
111
128
  key: 'groups',
112
129
  label: '묶음',
113
- used: cost.groups,
130
+ used: cost.drawCalls,
114
131
  limit: LIMITS.materialGroups,
115
- ratio: cost.groups / LIMITS.materialGroups,
132
+ ratio: cost.drawCalls / LIMITS.materialGroups,
116
133
  why: '인스턴스 하나마다 이만큼 draw call 이 필요하다'
117
134
  },
118
135
  {
119
136
  key: 'animations',
120
137
  label: '애니메이션',
121
138
  used: animations,
122
- limit: LIMITS.animationPoints,
123
- ratio: animations / LIMITS.animationPoints,
139
+ limit: LIMITS.animatedParts,
140
+ ratio: animations / LIMITS.animatedParts,
124
141
  why: '포인트마다 묶음이 하나 늘고, 프레임마다 갱신이 는다'
125
142
  },
126
143
  {
package/dist/cost.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AA2F/C;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,SAA0B,EAAE,SAAS,GAAG,GAAG;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;IAE5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACrC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAA;QACvC,IAAI,OAAO;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3D,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,KAAK,EAAE,CAAA;YACP,SAAS,IAAI,MAAM,CAAC,SAAS,CAAA;YAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAA;IAEtC,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK;QACL,SAAS;QACT,MAAM;QACN,cAAc,EAAE,MAAM,CAAC,IAAI;QAC3B,iBAAiB,EAAE,SAAS,CAAC,IAAI;QACjC,eAAe,EAAE,QAAQ,CAAC,IAAI;QAC9B,UAAU,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK;QACjD,EAAE,EAAE;YACF,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,SAAS,GAAG,CAAC;YACxB,SAAS,EAAE,MAAM,GAAG,CAAC;YACrB,mDAAmD;YACnD,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,SAAS,CAAC,IAAI;YACzB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,oBAAoB,EAAE,MAAM;SAC7B;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;IACnB,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,MAAM,EAAE;QAC7E,MAAM,IAAI,CAAC,cAAc,UAAU,IAAI,CAAC,iBAAiB,GAAG;KAC7D,CAAA;IAED,IAAI,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,cAAc,oBAAoB,CAAC,CAAA;IAChF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,gBAAgB,EAAE,CAAC,SAAS,gBAAgB,EAAE,CAAC,SAAS,EAAE,CAAC,CAAA;IAErF,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,UAAU,UAAU,EAAE,CAAC,SAAS,QAAQ,CAAC,CAAA;IAErE,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,eAAe,+BAA+B,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,EAAE,CAAC,oBAAoB,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,oBAAoB,SAAS,CAAC,CAAA;IAChF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AA8DD,MAAM,YAAY,GAA4B;IAC5C,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,CAAC,CAAC;CACT,CAAA;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAY;QAAE,IAAI,KAAK,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IAC3E,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,SAA0B;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAEjC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAA;IAClE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9G,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAErG,MAAM,OAAO,GAAsB;QACjC;YACE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,KAAK,EAAE,MAAM,CAAC,cAAc;YAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc;YAC1C,GAAG,EAAE,gCAAgC;SACtC;QACD;YACE,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,MAAM,CAAC,eAAe;YAC7B,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,eAAe;YAC1C,GAAG,EAAE,+BAA+B;SACrC;QACD;YACE,GAAG,EAAE,aAAa;YAClB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,MAAM,CAAC,oBAAoB;YAClC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,oBAAoB;YAChD,GAAG,EAAE,kBAAkB;SACxB;QACD;YACE,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,IAAI,CAAC,eAAe;YAC1B,KAAK,EAAE,MAAM,CAAC,eAAe;YAC7B,KAAK,EAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;YACpD,GAAG,EAAE,oCAAoC;SAC1C;KACF,CAAA;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS;YAC7B,GAAG,EAAE,UAAU,SAAS,CAAC,WAAW,YAAY;SACjD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK;YAAE,QAAQ,GAAG,CAAC,CAAA;IAEnE,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9B,QAAQ;QACR,OAAO;QACP,KAAK,EAAE;YACL,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc;SACxC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { AnimationClip, FigurePart, Vec3 } from './types.ts';
2
+ /**
3
+ * The parts any clip moves.
4
+ *
5
+ * Merging is decided per part, and a clip names its parts from the outside, so
6
+ * the two have to be brought together before grouping can answer anything.
7
+ */
8
+ export declare function animatedNames(clips: readonly AnimationClip[] | undefined): ReadonlySet<string>;
9
+ /** A part draws on its own when it cannot be merged with its neighbours. */
10
+ export declare function standsAlone(part: FigurePart, animated?: ReadonlySet<string>): boolean;
11
+ /**
12
+ * The merge groups a set of parts produces.
13
+ *
14
+ * Each entry is the parts that end up in one merged geometry. Parts that stand
15
+ * alone get an entry of their own.
16
+ */
17
+ export declare function groupsOf(parts: readonly FigurePart[], animated?: ReadonlySet<string>): FigurePart[][];
18
+ /**
19
+ * How many meshes one repeat part draws **as authored**.
20
+ *
21
+ * The count grows with the instance, since the row fills the box it is given.
22
+ * This is the count at scale 1 -- the asset's own size, which is what the
23
+ * author is looking at and the only number that does not depend on where it
24
+ * ends up.
25
+ *
26
+ * Must match `repeatPlan` in things-scene. If they drift, the screen and the
27
+ * report disagree about the same tray.
28
+ */
29
+ export declare function repeatCountOf(part: FigurePart, base: Vec3): number;
30
+ /**
31
+ * Draw calls one instance costs. **This is what the limit is about.**
32
+ *
33
+ * A merged group is one call. A repeat part is one call per copy.
34
+ */
35
+ export declare function drawCallsOf(parts: readonly FigurePart[], base: Vec3, animated?: ReadonlySet<string>): number;
36
+ /**
37
+ * Draw calls for one merged group.
38
+ *
39
+ * **A merged group is one call however many parts went into it** -- that is
40
+ * what merging is for. Only repeat multiplies, and a repeat part always stands
41
+ * alone, so a group either holds one repeat part or is a single call.
42
+ */
43
+ export declare function callsForGroup(group: readonly FigurePart[], base: Vec3): number;
44
+ //# sourceMappingURL=grouping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping.d.ts","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjE;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAQ9F;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAS,GAAG,OAAO,CAE5F;AAID;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAS,GAAG,UAAU,EAAE,EAAE,CAwB5G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CASlE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAS,GACpC,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAI9E"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * How parts turn into draw calls. **One answer, used by compile and by the
3
+ * policy check.**
4
+ *
5
+ * ## Why this file exists
6
+ *
7
+ * The policy counted `groupKeyOf` -- distinct colour and slot combinations --
8
+ * while `compile` split further and the runtime split further still. Three
9
+ * places had three answers, and the one shown to the author was the smallest.
10
+ *
11
+ * conveyor policy said 3 compile made 17 the screen drew 17
12
+ * cell tray policy said 2 compile made 2 the screen drew 9
13
+ *
14
+ * A cell tray that draws nine times passed a limit of three with room to
15
+ * spare. Raising the limit would not have touched that -- the number being
16
+ * compared was the wrong one.
17
+ *
18
+ * ## The three splits
19
+ *
20
+ * animation a part some clip moves goes on its own, since it cannot share a
21
+ * merged geometry with parts that stay put
22
+ * sizing a part that does not scale with the instance takes its own
23
+ * transform, and a merged geometry only takes one
24
+ * repeat one authored part, many meshes -- each copy is a draw call
25
+ *
26
+ * The first two make groups. The third multiplies inside a group, which is why
27
+ * `drawCallsOf` is not simply `groupsOf().length`.
28
+ */
29
+ import { groupKeyOf } from "./keys.js";
30
+ import { DEFAULT_SIZING, REPEAT_LIMIT } from "./types.js";
31
+ /**
32
+ * The parts any clip moves.
33
+ *
34
+ * Merging is decided per part, and a clip names its parts from the outside, so
35
+ * the two have to be brought together before grouping can answer anything.
36
+ */
37
+ export function animatedNames(clips) {
38
+ const names = new Set();
39
+ for (const clip of clips ?? []) {
40
+ for (const channel of clip.channels ?? []) {
41
+ if (typeof channel?.target === 'string')
42
+ names.add(channel.target);
43
+ }
44
+ }
45
+ return names;
46
+ }
47
+ /** A part draws on its own when it cannot be merged with its neighbours. */
48
+ export function standsAlone(part, animated = EMPTY) {
49
+ return animated.has(part.name) || (part.sizing ?? DEFAULT_SIZING) !== 'scale';
50
+ }
51
+ const EMPTY = new Set();
52
+ /**
53
+ * The merge groups a set of parts produces.
54
+ *
55
+ * Each entry is the parts that end up in one merged geometry. Parts that stand
56
+ * alone get an entry of their own.
57
+ */
58
+ export function groupsOf(parts, animated = EMPTY) {
59
+ const groups = [];
60
+ const byKey = new Map();
61
+ for (const part of parts) {
62
+ if (standsAlone(part, animated)) {
63
+ groups.push([part]);
64
+ continue;
65
+ }
66
+ const key = groupKeyOf(part);
67
+ const merged = byKey.get(key);
68
+ if (merged) {
69
+ merged.push(part);
70
+ continue;
71
+ }
72
+ const started = [part];
73
+ byKey.set(key, started);
74
+ groups.push(started);
75
+ }
76
+ return groups;
77
+ }
78
+ /**
79
+ * How many meshes one repeat part draws **as authored**.
80
+ *
81
+ * The count grows with the instance, since the row fills the box it is given.
82
+ * This is the count at scale 1 -- the asset's own size, which is what the
83
+ * author is looking at and the only number that does not depend on where it
84
+ * ends up.
85
+ *
86
+ * Must match `repeatPlan` in things-scene. If they drift, the screen and the
87
+ * report disagree about the same tray.
88
+ */
89
+ export function repeatCountOf(part, base) {
90
+ if (part.sizing !== 'repeat' || !part.repeat)
91
+ return 1;
92
+ const { axis, pitch } = part.repeat;
93
+ if (!(Number.isFinite(pitch) && pitch > 0))
94
+ return 1;
95
+ const room = Number.isFinite(base[axis]) && base[axis] > 0 ? base[axis] : pitch;
96
+ return Math.max(1, Math.min(REPEAT_LIMIT, Math.floor(room / pitch)));
97
+ }
98
+ /**
99
+ * Draw calls one instance costs. **This is what the limit is about.**
100
+ *
101
+ * A merged group is one call. A repeat part is one call per copy.
102
+ */
103
+ export function drawCallsOf(parts, base, animated = EMPTY) {
104
+ return groupsOf(parts, animated).reduce((total, group) => total + callsForGroup(group, base), 0);
105
+ }
106
+ /**
107
+ * Draw calls for one merged group.
108
+ *
109
+ * **A merged group is one call however many parts went into it** -- that is
110
+ * what merging is for. Only repeat multiplies, and a repeat part always stands
111
+ * alone, so a group either holds one repeat part or is a single call.
112
+ */
113
+ export function callsForGroup(group, base) {
114
+ const only = group.length === 1 ? group[0] : undefined;
115
+ return only ? repeatCountOf(only, base) : 1;
116
+ }
117
+ //# sourceMappingURL=grouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping.js","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG3D,mCAAmC;AACnC,wBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnC;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAOtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAqBtD;AAED;;;;;;;GAOG;AACH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEnD"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG3D,mCAAmC;AACnC,wBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnC;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAUtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAqBtD;AAED;;;;;;;GAOG;AACH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEnD"}
package/dist/keys.js CHANGED
@@ -29,7 +29,10 @@ export function geometryKeyOf(part) {
29
29
  const seg = part.segments === undefined ? '' : `|s${part.segments}`;
30
30
  const round = part.shape?.round ? `|r${q(part.shape.round)}` : '';
31
31
  const pathLen = part.primitive === 'polygon' ? `|p${part.shape?.path?.length ?? 0}` : '';
32
- return `${part.primitive}|${dims}${seg}${round}${pathLen}`;
32
+ // 두께가 형상을 정한다 — 빼면 두께만 고친 통이 옛 형상을 그대로 받는다.
33
+ const h = part.shape?.hollow;
34
+ const hollow = h ? `|h${q(h.wall)},${q(h.floor ?? h.wall)}` : '';
35
+ return `${part.primitive}|${dims}${seg}${round}${pathLen}${hollow}`;
33
36
  }
34
37
  /**
35
38
  * MaterialBank 키. 색은 토큰 이름으로 둔다 — 값을 구우면 테마를 바꿔도 안 따라온다.
@@ -76,6 +79,6 @@ export function emissiveKeyOf(part) {
76
79
  return part.material.emissive ? `${materialKeyOf(part)}||emissive` : null;
77
80
  }
78
81
  export function groupKeyOf(part) {
79
- return `${materialKeyOf(part)}||${part.slot ?? '-'}`;
82
+ return `${materialKeyOf(part)}||${part.materialSlot ?? '-'}`;
80
83
  }
81
84
  //# sourceMappingURL=keys.js.map
package/dist/keys.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}