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