@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.mjs
CHANGED
|
@@ -2205,15 +2205,16 @@ function gridMesh(cols, rows) {
|
|
|
2205
2205
|
return { vertices, uvs, indices };
|
|
2206
2206
|
}
|
|
2207
2207
|
function columnMesh(b, grid) {
|
|
2208
|
-
const { xs } = grid;
|
|
2209
|
-
const rows =
|
|
2208
|
+
const { xs, ys } = grid;
|
|
2209
|
+
const rows = ys.length - 1;
|
|
2210
2210
|
const vertices = [];
|
|
2211
2211
|
const uvs = [];
|
|
2212
2212
|
for (let r = 0; r <= rows; r++) {
|
|
2213
|
+
const v = (ys[0] - ys[r]) / (ys[0] - ys[rows]);
|
|
2213
2214
|
for (const x of xs) {
|
|
2214
2215
|
const u = (x - b.x0) / bw(b);
|
|
2215
|
-
vertices.push(roundTo(u - 0.5, 1e-5), roundTo(0.5 -
|
|
2216
|
-
uvs.push(roundTo(u, 1e-5), roundTo(
|
|
2216
|
+
vertices.push(roundTo(u - 0.5, 1e-5), roundTo(0.5 - v, 1e-5));
|
|
2217
|
+
uvs.push(roundTo(u, 1e-5), roundTo(v, 1e-5));
|
|
2217
2218
|
}
|
|
2218
2219
|
}
|
|
2219
2220
|
const n = xs.length;
|
|
@@ -4487,7 +4488,17 @@ function hairFrontField(m) {
|
|
|
4487
4488
|
);
|
|
4488
4489
|
return core + (m.hairOuter - core) * out;
|
|
4489
4490
|
};
|
|
4490
|
-
const ride = outerRide(
|
|
4491
|
+
const ride = outerRide(
|
|
4492
|
+
m,
|
|
4493
|
+
inner,
|
|
4494
|
+
coreAt,
|
|
4495
|
+
followAt,
|
|
4496
|
+
eyeY + 1.5 * eyeH,
|
|
4497
|
+
eyeY + eyeH / 2,
|
|
4498
|
+
Math.max(
|
|
4499
|
+
...[m.boxes.iris_L, m.boxes.iris_R].map((b) => b?.y1 ?? -Infinity)
|
|
4500
|
+
)
|
|
4501
|
+
);
|
|
4491
4502
|
const followOf = (x, y, s) => followAt(x, y, s) + (ride === void 0 ? 0 : ride.lift(x, y, s));
|
|
4492
4503
|
const drift = Math.abs(m.hairBack);
|
|
4493
4504
|
const crown = crownRide(m, cap, (x, y, s) => followOf(x, y, s) + drift);
|
|
@@ -4514,9 +4525,12 @@ function crownBlend(m, y) {
|
|
|
4514
4525
|
}
|
|
4515
4526
|
function gridRow(ys, y, snap = false) {
|
|
4516
4527
|
const n = ys.length;
|
|
4517
|
-
|
|
4528
|
+
const yc = clamp(y, ys[n - 1], ys[0]);
|
|
4529
|
+
let r = 0;
|
|
4530
|
+
while (r < n - 2 && ys[r + 1] >= yc) r++;
|
|
4531
|
+
let v = r + (ys[r] - yc) / (ys[r] - ys[r + 1]);
|
|
4518
4532
|
if (snap && Math.abs(v - Math.round(v)) < 1e-3) v = Math.round(v);
|
|
4519
|
-
|
|
4533
|
+
r = Math.min(n - 2, Math.floor(v));
|
|
4520
4534
|
return { r, t: v - r };
|
|
4521
4535
|
}
|
|
4522
4536
|
function gridCol(xs, x) {
|
|
@@ -4606,7 +4620,7 @@ function paints(runs, px) {
|
|
|
4606
4620
|
}
|
|
4607
4621
|
return false;
|
|
4608
4622
|
}
|
|
4609
|
-
function outerRide(m, inner, coreAt, followAt, capLimit) {
|
|
4623
|
+
function outerRide(m, inner, coreAt, followAt, capLimit, eyeTop, irisTop) {
|
|
4610
4624
|
const f = m.frame;
|
|
4611
4625
|
const grid = m.hairFrontGrid;
|
|
4612
4626
|
if (grid === void 0) return void 0;
|
|
@@ -4793,10 +4807,25 @@ function outerRide(m, inner, coreAt, followAt, capLimit) {
|
|
|
4793
4807
|
}
|
|
4794
4808
|
for (let j = 0; j < 2; j++) {
|
|
4795
4809
|
for (let r = n - 2; r >= 0; r--) {
|
|
4796
|
-
if (wr[r] < 1)
|
|
4810
|
+
if (r <= last || wr[r] < 1)
|
|
4797
4811
|
blend[r * 2 + j] = Math.max(blend[r * 2 + j], blend[(r + 1) * 2 + j]);
|
|
4798
4812
|
}
|
|
4799
4813
|
}
|
|
4814
|
+
let zero = last + 1;
|
|
4815
|
+
while (zero < n && ys[zero] > eyeTop) zero++;
|
|
4816
|
+
while (zero > last + 1 && zero < n && ys[zero] < irisTop - 0.5) zero--;
|
|
4817
|
+
const endY = zero < n ? ys[zero] : Math.min(Math.max(eyeTop, irisTop - 0.5), ys[n - 1] - 1);
|
|
4818
|
+
for (let j = 0; j < 2 && last < n - 1; j++) {
|
|
4819
|
+
for (let r = 1; r < zero; r++) {
|
|
4820
|
+
for (let q = 0; q < r && q <= last; q++) {
|
|
4821
|
+
if (wr[q] < 1) continue;
|
|
4822
|
+
blend[r * 2 + j] = Math.max(
|
|
4823
|
+
blend[r * 2 + j],
|
|
4824
|
+
blend[q * 2 + j] * (ys[r] - endY) / (ys[q] - endY)
|
|
4825
|
+
);
|
|
4826
|
+
}
|
|
4827
|
+
}
|
|
4828
|
+
}
|
|
4800
4829
|
const cutRow = (r, j, x) => r > last ? 0 : along(cuts.subarray((r * 2 + j) * nc, (r * 2 + j + 1) * nc), x);
|
|
4801
4830
|
return {
|
|
4802
4831
|
lift: liftAt,
|
|
@@ -6079,7 +6108,7 @@ function generateIkiFromLayerSet(layers, canvas, options = {}) {
|
|
|
6079
6108
|
const solveFrame = buildHeadFrame(layers, frameOptions);
|
|
6080
6109
|
const ctx = solveContext(solveFrame, byRole, turnOptions, hasNose);
|
|
6081
6110
|
const boxes = Object.fromEntries(
|
|
6082
|
-
["eye_L", "eye_R", "brow_L", "brow_R"].filter(has).map((r) => [r, box(r)])
|
|
6111
|
+
["eye_L", "eye_R", "iris_L", "iris_R", "brow_L", "brow_R"].filter(has).map((r) => [r, box(r)])
|
|
6083
6112
|
);
|
|
6084
6113
|
const landmarks = {
|
|
6085
6114
|
boxes,
|
|
@@ -6439,6 +6468,8 @@ function buildPart(spec, b, order, frame, byRole, style, frontGrid, lips) {
|
|
|
6439
6468
|
headStart
|
|
6440
6469
|
};
|
|
6441
6470
|
}
|
|
6471
|
+
var RAMP_ROWS = 3;
|
|
6472
|
+
var MIN_RAMP_CELL = 4;
|
|
6442
6473
|
function hairFrontGrid(b, frame, boxes) {
|
|
6443
6474
|
const cells = MESH_CELLS.hair_front;
|
|
6444
6475
|
const px = Math.min(cells.px, meshScale("hair_front", frame));
|
|
@@ -6463,6 +6494,24 @@ function hairFrontGrid(b, frame, boxes) {
|
|
|
6463
6494
|
{ length: rows + 1 },
|
|
6464
6495
|
(_, r) => b.y1 - bh(b) * r / rows
|
|
6465
6496
|
);
|
|
6497
|
+
const eyes = [boxes.eye_L, boxes.eye_R].filter((e) => e !== void 0);
|
|
6498
|
+
const irises = [boxes.iris_L, boxes.iris_R].filter((e) => e !== void 0);
|
|
6499
|
+
if (eyes.length > 0 && irises.length > 0) {
|
|
6500
|
+
const eyeY = eyes.reduce((t, e) => t + (e.y0 + e.y1) / 2, 0) / eyes.length;
|
|
6501
|
+
const eyeH = eyes.reduce((t, e) => t + (e.y1 - e.y0), 0) / eyes.length;
|
|
6502
|
+
const hi = Math.min(eyeY + 1.5 * eyeH, b.y1);
|
|
6503
|
+
const lo = Math.max(Math.max(...irises.map((e) => e.y1)) - 0.5, b.y0);
|
|
6504
|
+
for (; ; ) {
|
|
6505
|
+
const edges = [hi, ...ys.filter((y) => y < hi && y > lo), lo];
|
|
6506
|
+
if (edges.length - 2 >= RAMP_ROWS) break;
|
|
6507
|
+
let gap = 0;
|
|
6508
|
+
for (let i = 1; i + 1 < edges.length; i++)
|
|
6509
|
+
if (edges[i] - edges[i + 1] > edges[gap] - edges[gap + 1]) gap = i;
|
|
6510
|
+
if (edges[gap] - edges[gap + 1] < 2 * MIN_RAMP_CELL) break;
|
|
6511
|
+
ys.push((edges[gap] + edges[gap + 1]) / 2);
|
|
6512
|
+
ys.sort((p, q) => q - p);
|
|
6513
|
+
}
|
|
6514
|
+
}
|
|
6466
6515
|
return { xs, ys };
|
|
6467
6516
|
}
|
|
6468
6517
|
function meshScale(role, frame) {
|
|
@@ -6521,22 +6570,22 @@ function deformers(frame, grids, bodyWarp, arms, byRole) {
|
|
|
6521
6570
|
return out;
|
|
6522
6571
|
}
|
|
6523
6572
|
function hairPhysics() {
|
|
6573
|
+
const spring = { mass: 1, stiffness: 77, damping: 4.4 };
|
|
6524
6574
|
return [
|
|
6525
6575
|
{
|
|
6526
6576
|
id: "hairSway",
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6577
|
+
inputs: [
|
|
6578
|
+
{ parameter: P10.AngleX, weight: 1, mode: "lag" },
|
|
6579
|
+
{ parameter: P10.AmbientSway, weight: 0.25 }
|
|
6580
|
+
],
|
|
6581
|
+
output: { parameter: P10.HairSwayX, scale: 14 },
|
|
6582
|
+
...spring
|
|
6532
6583
|
},
|
|
6533
6584
|
{
|
|
6534
6585
|
id: "hairTilt",
|
|
6535
|
-
input: { parameter: P10.AngleZ, weight: 1 },
|
|
6536
|
-
output: { parameter: P10.HairSwayZ, scale:
|
|
6537
|
-
|
|
6538
|
-
stiffness: 25,
|
|
6539
|
-
damping: 2.5
|
|
6586
|
+
input: { parameter: P10.AngleZ, weight: 1, mode: "lag" },
|
|
6587
|
+
output: { parameter: P10.HairSwayZ, scale: 9 },
|
|
6588
|
+
...spring
|
|
6540
6589
|
}
|
|
6541
6590
|
];
|
|
6542
6591
|
}
|
|
@@ -6592,6 +6641,7 @@ function declareParameters(roles) {
|
|
|
6592
6641
|
if (roles.has("hair_front")) {
|
|
6593
6642
|
add(P10.HairSwayX, "Hair Sway X", -SWAY_RANGE, SWAY_RANGE, 0);
|
|
6594
6643
|
add(P10.HairSwayZ, "Hair Sway Z", -SWAY_RANGE, SWAY_RANGE, 0);
|
|
6644
|
+
add(P10.AmbientSway, "Ambient Sway", -1, 1, 0);
|
|
6595
6645
|
}
|
|
6596
6646
|
return out;
|
|
6597
6647
|
}
|