@ikijs/editor 0.25.0 → 0.26.0
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/index.js +70 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +70 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2287,15 +2287,16 @@ function gridMesh(cols, rows) {
|
|
|
2287
2287
|
return { vertices, uvs, indices };
|
|
2288
2288
|
}
|
|
2289
2289
|
function columnMesh(b, grid) {
|
|
2290
|
-
const { xs } = grid;
|
|
2291
|
-
const rows =
|
|
2290
|
+
const { xs, ys } = grid;
|
|
2291
|
+
const rows = ys.length - 1;
|
|
2292
2292
|
const vertices = [];
|
|
2293
2293
|
const uvs = [];
|
|
2294
2294
|
for (let r = 0; r <= rows; r++) {
|
|
2295
|
+
const v = (ys[0] - ys[r]) / (ys[0] - ys[rows]);
|
|
2295
2296
|
for (const x of xs) {
|
|
2296
2297
|
const u = (x - b.x0) / bw(b);
|
|
2297
|
-
vertices.push(roundTo(u - 0.5, 1e-5), roundTo(0.5 -
|
|
2298
|
-
uvs.push(roundTo(u, 1e-5), roundTo(
|
|
2298
|
+
vertices.push(roundTo(u - 0.5, 1e-5), roundTo(0.5 - v, 1e-5));
|
|
2299
|
+
uvs.push(roundTo(u, 1e-5), roundTo(v, 1e-5));
|
|
2299
2300
|
}
|
|
2300
2301
|
}
|
|
2301
2302
|
const n = xs.length;
|
|
@@ -4557,7 +4558,17 @@ function hairFrontField(m) {
|
|
|
4557
4558
|
);
|
|
4558
4559
|
return core + (m.hairOuter - core) * out;
|
|
4559
4560
|
};
|
|
4560
|
-
const ride = outerRide(
|
|
4561
|
+
const ride = outerRide(
|
|
4562
|
+
m,
|
|
4563
|
+
inner,
|
|
4564
|
+
coreAt,
|
|
4565
|
+
followAt,
|
|
4566
|
+
eyeY + 1.5 * eyeH,
|
|
4567
|
+
eyeY + eyeH / 2,
|
|
4568
|
+
Math.max(
|
|
4569
|
+
...[m.boxes.iris_L, m.boxes.iris_R].map((b) => b?.y1 ?? -Infinity)
|
|
4570
|
+
)
|
|
4571
|
+
);
|
|
4561
4572
|
const followOf = (x, y, s) => followAt(x, y, s) + (ride === void 0 ? 0 : ride.lift(x, y, s));
|
|
4562
4573
|
const drift = Math.abs(m.hairBack);
|
|
4563
4574
|
const crown = crownRide(m, cap, (x, y, s) => followOf(x, y, s) + drift);
|
|
@@ -4584,9 +4595,12 @@ function crownBlend(m, y) {
|
|
|
4584
4595
|
}
|
|
4585
4596
|
function gridRow(ys, y, snap = false) {
|
|
4586
4597
|
const n = ys.length;
|
|
4587
|
-
|
|
4598
|
+
const yc = clamp(y, ys[n - 1], ys[0]);
|
|
4599
|
+
let r = 0;
|
|
4600
|
+
while (r < n - 2 && ys[r + 1] >= yc) r++;
|
|
4601
|
+
let v = r + (ys[r] - yc) / (ys[r] - ys[r + 1]);
|
|
4588
4602
|
if (snap && Math.abs(v - Math.round(v)) < 1e-3) v = Math.round(v);
|
|
4589
|
-
|
|
4603
|
+
r = Math.min(n - 2, Math.floor(v));
|
|
4590
4604
|
return { r, t: v - r };
|
|
4591
4605
|
}
|
|
4592
4606
|
function gridCol(xs, x) {
|
|
@@ -4676,7 +4690,7 @@ function paints(runs, px) {
|
|
|
4676
4690
|
}
|
|
4677
4691
|
return false;
|
|
4678
4692
|
}
|
|
4679
|
-
function outerRide(m, inner, coreAt, followAt, capLimit) {
|
|
4693
|
+
function outerRide(m, inner, coreAt, followAt, capLimit, eyeTop, irisTop) {
|
|
4680
4694
|
const f = m.frame;
|
|
4681
4695
|
const grid = m.hairFrontGrid;
|
|
4682
4696
|
if (grid === void 0) return void 0;
|
|
@@ -4863,10 +4877,25 @@ function outerRide(m, inner, coreAt, followAt, capLimit) {
|
|
|
4863
4877
|
}
|
|
4864
4878
|
for (let j = 0; j < 2; j++) {
|
|
4865
4879
|
for (let r = n - 2; r >= 0; r--) {
|
|
4866
|
-
if (wr[r] < 1)
|
|
4880
|
+
if (r <= last || wr[r] < 1)
|
|
4867
4881
|
blend[r * 2 + j] = Math.max(blend[r * 2 + j], blend[(r + 1) * 2 + j]);
|
|
4868
4882
|
}
|
|
4869
4883
|
}
|
|
4884
|
+
let zero = last + 1;
|
|
4885
|
+
while (zero < n && ys[zero] > eyeTop) zero++;
|
|
4886
|
+
while (zero > last + 1 && zero < n && ys[zero] < irisTop - 0.5) zero--;
|
|
4887
|
+
const endY = zero < n ? ys[zero] : Math.min(Math.max(eyeTop, irisTop - 0.5), ys[n - 1] - 1);
|
|
4888
|
+
for (let j = 0; j < 2 && last < n - 1; j++) {
|
|
4889
|
+
for (let r = 1; r < zero; r++) {
|
|
4890
|
+
for (let q = 0; q < r && q <= last; q++) {
|
|
4891
|
+
if (wr[q] < 1) continue;
|
|
4892
|
+
blend[r * 2 + j] = Math.max(
|
|
4893
|
+
blend[r * 2 + j],
|
|
4894
|
+
blend[q * 2 + j] * (ys[r] - endY) / (ys[q] - endY)
|
|
4895
|
+
);
|
|
4896
|
+
}
|
|
4897
|
+
}
|
|
4898
|
+
}
|
|
4870
4899
|
const cutRow = (r, j, x) => r > last ? 0 : along(cuts.subarray((r * 2 + j) * nc, (r * 2 + j + 1) * nc), x);
|
|
4871
4900
|
return {
|
|
4872
4901
|
lift: liftAt,
|
|
@@ -6147,7 +6176,7 @@ function generateIkiFromLayerSet(layers, canvas, options = {}) {
|
|
|
6147
6176
|
const solveFrame = buildHeadFrame(layers, frameOptions);
|
|
6148
6177
|
const ctx = solveContext(solveFrame, byRole, turnOptions, hasNose);
|
|
6149
6178
|
const boxes = Object.fromEntries(
|
|
6150
|
-
["eye_L", "eye_R", "brow_L", "brow_R"].filter(has).map((r) => [r, box(r)])
|
|
6179
|
+
["eye_L", "eye_R", "iris_L", "iris_R", "brow_L", "brow_R"].filter(has).map((r) => [r, box(r)])
|
|
6151
6180
|
);
|
|
6152
6181
|
const landmarks = {
|
|
6153
6182
|
boxes,
|
|
@@ -6507,6 +6536,8 @@ function buildPart(spec, b, order, frame, byRole, style, frontGrid, lips) {
|
|
|
6507
6536
|
headStart
|
|
6508
6537
|
};
|
|
6509
6538
|
}
|
|
6539
|
+
var RAMP_ROWS = 3;
|
|
6540
|
+
var MIN_RAMP_CELL = 4;
|
|
6510
6541
|
function hairFrontGrid(b, frame, boxes) {
|
|
6511
6542
|
const cells = MESH_CELLS.hair_front;
|
|
6512
6543
|
const px = Math.min(cells.px, meshScale("hair_front", frame));
|
|
@@ -6531,6 +6562,24 @@ function hairFrontGrid(b, frame, boxes) {
|
|
|
6531
6562
|
{ length: rows + 1 },
|
|
6532
6563
|
(_, r) => b.y1 - bh(b) * r / rows
|
|
6533
6564
|
);
|
|
6565
|
+
const eyes = [boxes.eye_L, boxes.eye_R].filter((e) => e !== void 0);
|
|
6566
|
+
const irises = [boxes.iris_L, boxes.iris_R].filter((e) => e !== void 0);
|
|
6567
|
+
if (eyes.length > 0 && irises.length > 0) {
|
|
6568
|
+
const eyeY = eyes.reduce((t, e) => t + (e.y0 + e.y1) / 2, 0) / eyes.length;
|
|
6569
|
+
const eyeH = eyes.reduce((t, e) => t + (e.y1 - e.y0), 0) / eyes.length;
|
|
6570
|
+
const hi = Math.min(eyeY + 1.5 * eyeH, b.y1);
|
|
6571
|
+
const lo = Math.max(Math.max(...irises.map((e) => e.y1)) - 0.5, b.y0);
|
|
6572
|
+
for (; ; ) {
|
|
6573
|
+
const edges = [hi, ...ys.filter((y) => y < hi && y > lo), lo];
|
|
6574
|
+
if (edges.length - 2 >= RAMP_ROWS) break;
|
|
6575
|
+
let gap = 0;
|
|
6576
|
+
for (let i = 1; i + 1 < edges.length; i++)
|
|
6577
|
+
if (edges[i] - edges[i + 1] > edges[gap] - edges[gap + 1]) gap = i;
|
|
6578
|
+
if (edges[gap] - edges[gap + 1] < 2 * MIN_RAMP_CELL) break;
|
|
6579
|
+
ys.push((edges[gap] + edges[gap + 1]) / 2);
|
|
6580
|
+
ys.sort((p, q) => q - p);
|
|
6581
|
+
}
|
|
6582
|
+
}
|
|
6534
6583
|
return { xs, ys };
|
|
6535
6584
|
}
|
|
6536
6585
|
function meshScale(role, frame) {
|
|
@@ -6589,22 +6638,22 @@ function deformers(frame, grids, bodyWarp, arms, byRole) {
|
|
|
6589
6638
|
return out;
|
|
6590
6639
|
}
|
|
6591
6640
|
function hairPhysics() {
|
|
6641
|
+
const spring = { mass: 1, stiffness: 77, damping: 4.4 };
|
|
6592
6642
|
return [
|
|
6593
6643
|
{
|
|
6594
6644
|
id: "hairSway",
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6645
|
+
inputs: [
|
|
6646
|
+
{ parameter: import_format12.StandardParameter.AngleX, weight: 1, mode: "lag" },
|
|
6647
|
+
{ parameter: import_format12.StandardParameter.AmbientSway, weight: 0.25 }
|
|
6648
|
+
],
|
|
6649
|
+
output: { parameter: import_format12.StandardParameter.HairSwayX, scale: 14 },
|
|
6650
|
+
...spring
|
|
6600
6651
|
},
|
|
6601
6652
|
{
|
|
6602
6653
|
id: "hairTilt",
|
|
6603
|
-
input: { parameter: import_format12.StandardParameter.AngleZ, weight: 1 },
|
|
6604
|
-
output: { parameter: import_format12.StandardParameter.HairSwayZ, scale:
|
|
6605
|
-
|
|
6606
|
-
stiffness: 25,
|
|
6607
|
-
damping: 2.5
|
|
6654
|
+
input: { parameter: import_format12.StandardParameter.AngleZ, weight: 1, mode: "lag" },
|
|
6655
|
+
output: { parameter: import_format12.StandardParameter.HairSwayZ, scale: 9 },
|
|
6656
|
+
...spring
|
|
6608
6657
|
}
|
|
6609
6658
|
];
|
|
6610
6659
|
}
|
|
@@ -6660,6 +6709,7 @@ function declareParameters(roles) {
|
|
|
6660
6709
|
if (roles.has("hair_front")) {
|
|
6661
6710
|
add(import_format12.StandardParameter.HairSwayX, "Hair Sway X", -SWAY_RANGE, SWAY_RANGE, 0);
|
|
6662
6711
|
add(import_format12.StandardParameter.HairSwayZ, "Hair Sway Z", -SWAY_RANGE, SWAY_RANGE, 0);
|
|
6712
|
+
add(import_format12.StandardParameter.AmbientSway, "Ambient Sway", -1, 1, 0);
|
|
6663
6713
|
}
|
|
6664
6714
|
return out;
|
|
6665
6715
|
}
|