@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.
- package/dist/blueprint.d.ts +17 -5
- package/dist/blueprint.d.ts.map +1 -1
- package/dist/blueprint.js +62 -27
- package/dist/blueprint.js.map +1 -1
- package/dist/cost.d.ts +2 -0
- package/dist/cost.d.ts.map +1 -1
- package/dist/cost.js +22 -5
- package/dist/cost.js.map +1 -1
- package/dist/grouping.d.ts +44 -0
- package/dist/grouping.d.ts.map +1 -0
- package/dist/grouping.js +117 -0
- package/dist/grouping.js.map +1 -0
- 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 +205 -31
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +92 -9
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +196 -31
- package/dist/validate.js.map +1 -1
- package/docs/design.md +5 -3
- package/docs/format.md +152 -18
- package/docs/validation.md +41 -11
- package/package.json +1 -1
package/dist/blueprint.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
17
|
-
*
|
|
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
|
*
|
package/dist/blueprint.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
*
|
|
49
|
-
*
|
|
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
|
|
71
|
-
|
|
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
|
|
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.
|
|
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.
|
|
180
|
-
group.
|
|
214
|
+
if (part.materialSlot !== undefined)
|
|
215
|
+
group.materialSlot = part.materialSlot;
|
|
181
216
|
groups.push(group);
|
|
182
217
|
continue;
|
|
183
218
|
}
|
|
184
|
-
if ((part
|
|
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.
|
|
193
|
-
group.
|
|
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.
|
|
210
|
-
group.
|
|
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
|
-
|
|
256
|
+
animations,
|
|
222
257
|
labels,
|
|
223
258
|
violations
|
|
224
259
|
};
|
package/dist/blueprint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"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"}
|
package/dist/cost.d.ts
CHANGED
package/dist/cost.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
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:
|
|
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.
|
|
130
|
+
used: cost.drawCalls,
|
|
114
131
|
limit: LIMITS.materialGroups,
|
|
115
|
-
ratio: cost.
|
|
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.
|
|
123
|
-
ratio: animations / LIMITS.
|
|
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;
|
|
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"}
|
package/dist/grouping.js
ADDED
|
@@ -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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"}
|
package/dist/keys.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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.
|
|
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":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD,mCAAmC;AACnC,MAAM,UAAU,CAAC,CAAC,CAAS;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AACpC,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,YAAY,CAAC,SAAwB;IACnD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAA;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACxF,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,OAAO,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
|