@ikijs/editor 0.25.0 → 0.25.1

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.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 = grid.ys.length - 1;
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 - r / rows, 1e-5));
2216
- uvs.push(roundTo(u, 1e-5), roundTo(r / rows, 1e-5));
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(m, inner, coreAt, followAt, eyeY + 1.5 * eyeH);
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
- let v = clamp((ys[0] - y) / (ys[0] - ys[n - 1]) * (n - 1), 0, n - 1);
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
- const r = Math.min(n - 2, Math.floor(v));
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) {