diff options
Diffstat (limited to 'public/bluebey-studio/src/panel.js')
| -rw-r--r-- | public/bluebey-studio/src/panel.js | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/public/bluebey-studio/src/panel.js b/public/bluebey-studio/src/panel.js index babeb59..bad4059 100644 --- a/public/bluebey-studio/src/panel.js +++ b/public/bluebey-studio/src/panel.js @@ -927,6 +927,41 @@ export function buildPanel(app, root) { + '「ツートン」は頭を左右2色に分けます(2色目を使います)。' + '決まったキャラクターの髪ではなく、よくあるマンガの記号として用意しました。')); + // --- 鼻ちょうちん: the snot bubble of a sleeping face. + faceSection = section(tabFace, '鼻ちょうちん'); + const snotToggle = check({ + label: '鼻ちょうちんを出す', + value: false, + onChange: (value) => { state.face.eyes.snot.enabled = value; app.actions.refresh('face'); }, + }); + faceSection.add(controlRow(null, snotToggle.el, { wide: true })); + const snotSize = slider({ + label: '大きさ', min: 0.4, max: 2.2, step: 0.01, value: 1, format: (v) => v.toFixed(2), + onInput: (v) => { state.face.eyes.snot.size = v; app.actions.refresh('face'); }, + }); + faceSection.add(snotSize.el); + const snotBox = details(faceSection.body, 'こまかい設定(位置・色)'); + const snotSliders = { + offsetX: slider({ + label: 'よこの位置', min: -160, max: 160, step: 1, value: 0, format: (v) => `${Math.round(v)}`, + onInput: (v) => { state.face.eyes.snot.offsetX = v; app.actions.refresh('face'); }, + }), + offsetY: slider({ + label: 'たかさ', min: -160, max: 160, step: 1, value: 0, format: (v) => `${Math.round(v)}`, + onInput: (v) => { state.face.eyes.snot.offsetY = v; app.actions.refresh('face'); }, + }), + }; + for (const widget of Object.values(snotSliders)) snotBox.add(widget.el); + const snotColor = colorField({ + label: '泡の色', value: '#e3ecff', + swatches: ['#e3ecff', '#ffffff', '#cfe0ff', '#bfe8d0'], + onChange: (v) => { state.face.eyes.snot.color = v; app.actions.refresh('face'); }, + }); + snotBox.add(snotColor.el); + snotBox.add(hint('寝ている顔の横に、鼻から出る泡を描きます。' + + '「ねている」ポーズと組み合わせると、いねむりしているように見えます。' + + '泡は鼻の横に出るので、位置は「よこの位置」「たかさ」で調整できます。')); + // --- mouth faceSection = section(tabFace, '口'); @@ -2355,6 +2390,10 @@ export function buildPanel(app, root) { for (const [key, widget] of Object.entries(headMarkSliders)) widget.set(state.face.eyes.headMark[key]); headMarkColor.set(state.face.eyes.headMark.color); headMarkColor2.set(state.face.eyes.headMark.color2 ?? '#ffffff'); + snotToggle.set(state.face.eyes.snot.enabled === true); + snotSize.set(state.face.eyes.snot.size); + for (const [key, widget] of Object.entries(snotSliders)) widget.set(state.face.eyes.snot[key]); + snotColor.set(state.face.eyes.snot.color); }); syncers.push(() => { |
