From eed94d378af577171e24fe78b4b159be5ca50317 Mon Sep 17 00:00:00 2001 From: Yasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com> Date: Sun, 4 Oct 2026 23:24:51 +0900 Subject: bluebey-studio: 下まぶたと目線の左右別設定、Oの口の拡大、白目/ハート/振れ幅の整理 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 下まぶた・目線を左右べつに設定可能に。丸く開く口を顔半分ほどまで拡大。白目を消すを一般化し「ハートのとき白目を消す」を削除。ハートの大きさは瞳の大きさに統合し、目線の振れ幅のスライダーを廃止(既定1.2)。 --- public/bluebey-studio/src/faceArt.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'public/bluebey-studio/src/faceArt.js') diff --git a/public/bluebey-studio/src/faceArt.js b/public/bluebey-studio/src/faceArt.js index 48ffd67..ba748f5 100644 --- a/public/bluebey-studio/src/faceArt.js +++ b/public/bluebey-studio/src/faceArt.js @@ -1361,12 +1361,11 @@ export function drawEyes(ctx, p) { const irisScale = style.irisScale ?? 1; const lookMax = style.lookMax ?? 1; const highlightOn = style.highlight !== false; - const heartScale = style.heartScale ?? 0.85; + const heartScale = 2; const heartColor = style.heartColor ?? '#e0344f'; const irisRadius = EYE_LAYOUT.irisRadius * irisScale; const travel = Math.max(0, EYE_LAYOUT.radius - irisRadius); const heartTravel = EYE_LAYOUT.radius * 0.9; - const lowerLid = clamp(style.lowerLid ?? 0, 0, 1); const lidFlat = (style.lidShape ?? 'curve') === 'flat'; // How much the whole narrowed eye is tilted (e.g. an angry or gentle squint). const lidTilt = clamp(style.lidTilt ?? 0, -45, 45); @@ -1387,6 +1386,8 @@ export function drawEyes(ctx, p) { }; const lineStyle = { line: lineColor, width: lidWidth }; const isHeart = (spec.irisShape ?? 'circle') === 'heart'; + // The lower lid is per eye (falling back to the shared value). + const lowerLid = clamp(spec.lowerLid ?? style.lowerLid ?? 0, 0, 1); drawBrow(ctx, eye, spec, style, limits); @@ -1600,12 +1601,11 @@ export function drawMouth(ctx, p) { // --- a round "O" mouth (surprised, singing) --------------------------- const roundAmount = clamp(p.round ?? 0, 0, 1); if (roundAmount > 0.004) { - let ry = L.sag * 0.42 * roundAmount * clamp(p.thickness ?? 1, 0.5, 2); - // The nose hides the middle of the upper face, so keep the whole oval below - // it and inside the plate. (`L.safeBottom` is only the round mouth's own size - // limit; it no longer has to stay clear of the canvas edge.) - ry = Math.min(ry, (L.safeBottom - thickness / 2 - L.noseClear) / 2.1); - const rx = Math.min(ry * 1.15 * clamp(p.width ?? 1, 0.2, 1.6), L.halfChord * 0.8); + let ry = L.sag * 1.05 * roundAmount * clamp(p.thickness ?? 1, 0.5, 2); + // Keep the oval below the nose and inside the plate, but allow it to grow to + // roughly half the head. + ry = Math.min(ry, (edgeBottom - thickness / 2 - L.noseClear) / 2.1); + const rx = Math.min(ry * 1.15 * clamp(p.width ?? 1, 0.2, 1.6), L.halfChord * 1.4); const centreY = clamp(y0 + sag * 0.5, L.noseClear + ry * 1.02, edgeBottom - thickness / 2 - ry * 1.02); if (ry > 5) { ctx.save(); -- cgit v1.3.1