274 lines
8.6 KiB
JavaScript
274 lines
8.6 KiB
JavaScript
const api = require('../api')
|
|
const html_manip = require('../html_manip')
|
|
const selection = require('../../selection')
|
|
const note = require('../notification')
|
|
const g_controlnet_max_supported_models = 3
|
|
|
|
async function checkIfControlNetInstalled() {}
|
|
async function requestControlNetModelList() {
|
|
const control_net_json = await api.requestGet(
|
|
`${g_sd_url}/controlnet/model_list`
|
|
)
|
|
|
|
const model_list = control_net_json?.model_list
|
|
|
|
// const model_list = [
|
|
// 'none',
|
|
// 'control_sd15_depth [fef5e48e]',
|
|
// 'control_sd15_openpose [fef5e48e]',
|
|
// 'control_sd15_scribble [fef5e48e]',
|
|
// ]
|
|
return model_list
|
|
}
|
|
|
|
async function requestControlNetModuleList() {
|
|
// const control_net_json = await api.requestGet(
|
|
// `${g_sd_url}/controlnet/model_list`
|
|
// )
|
|
// const module_list = [
|
|
// // 'none',
|
|
// 'canny',
|
|
// 'depth',
|
|
// 'depth_leres',
|
|
// 'hed',
|
|
// 'mlsd',
|
|
// 'normal_map',
|
|
// 'openpose',
|
|
// // "openpose_hand",
|
|
// 'pidinet',
|
|
// 'scribble',
|
|
// 'fake_scribble',
|
|
// 'segmentation',
|
|
// ]
|
|
const module_list = g_sd_config_obj.getControlNetPreprocessors()
|
|
// const module_list = g_controlnet_preprocessors
|
|
return module_list
|
|
}
|
|
async function populateModelMenu() {
|
|
try {
|
|
const models = await requestControlNetModelList()
|
|
for (
|
|
let index = 0;
|
|
index < g_controlnet_max_supported_models;
|
|
index++
|
|
) {
|
|
html_manip.populateMenu(
|
|
'mModelsMenuControlNet_' + index,
|
|
'mModelsMenuItemControlNet_' + index,
|
|
models,
|
|
(item, item_html_element) => {
|
|
item_html_element.innerHTML = item
|
|
}
|
|
)
|
|
}
|
|
} catch (e) {
|
|
console.warn(e)
|
|
}
|
|
}
|
|
|
|
async function populatePreprocessorMenu() {
|
|
try {
|
|
const modules = await requestControlNetModuleList()
|
|
for (
|
|
let index = 0;
|
|
index < g_controlnet_max_supported_models;
|
|
index++
|
|
) {
|
|
html_manip.populateMenu(
|
|
'mModuleMenuControlNet_' + index,
|
|
'mModuleMenuItemControlNet_' + index,
|
|
modules,
|
|
(item, item_html_element) => {
|
|
item_html_element.innerHTML = item
|
|
}
|
|
)
|
|
}
|
|
} catch (e) {
|
|
console.warn(e)
|
|
}
|
|
}
|
|
async function initializeControlNetTab(controlnet_max_models) {
|
|
try {
|
|
if (controlnet_max_models > g_controlnet_max_supported_models)
|
|
controlnet_max_models = g_controlnet_max_supported_models
|
|
|
|
for (let index = 0; index < controlnet_max_models; index++) {
|
|
await populateModelMenu(index)
|
|
await populatePreprocessorMenu(index)
|
|
document.getElementById(
|
|
'controlnet_settings_' + index
|
|
).style.display = 'block'
|
|
}
|
|
} catch (e) {
|
|
console.warn(e)
|
|
}
|
|
}
|
|
// controlnet settings getters
|
|
function getControlNetWeightGuidanceStrength(controlnet_index = 0) {
|
|
const slider_value = document.getElementById(
|
|
'slControlNetGuidanceStrength_' + controlnet_index
|
|
).value
|
|
const sd_value = general.mapRange(slider_value, 0, 100, 0, 1) // convert slider value to SD ready value
|
|
return sd_value
|
|
}
|
|
|
|
function getControlNetWeight(controlnet_index = 0) {
|
|
const slider_value = document.getElementById(
|
|
'slControlNetWeight_' + controlnet_index
|
|
).value
|
|
|
|
const sd_value = general.mapRange(slider_value, 0, 100, 0, 2) // convert slider value to SD ready value
|
|
return sd_value
|
|
}
|
|
function getUseLowVram(controlnet_index = 0) {
|
|
const b_result = document.getElementById(
|
|
'chlowVram_' + controlnet_index
|
|
).checked
|
|
return b_result
|
|
}
|
|
function getEnableControlNet(controlnet_index = 0) {
|
|
const is_enable = document.getElementById(
|
|
'chEnableControlNet_' + controlnet_index
|
|
).checked
|
|
return is_enable
|
|
}
|
|
|
|
function getSelectedModule(controlnet_index = 0) {
|
|
const module_name = html_manip.getSelectedMenuItemTextContent(
|
|
'mModuleMenuControlNet_' + controlnet_index
|
|
)
|
|
|
|
return module_name
|
|
}
|
|
function getSelectedModel(controlnet_index = 0) {
|
|
const model_name = html_manip.getSelectedMenuItemTextContent(
|
|
'mModelsMenuControlNet_' + controlnet_index
|
|
)
|
|
return model_name
|
|
}
|
|
function getUseGuessMode(controlnet_index = 0) {
|
|
const is_guess_mode = document.getElementById(
|
|
'chGuessMode_' + controlnet_index
|
|
).checked
|
|
return is_guess_mode
|
|
}
|
|
|
|
function getControlNetMaxModelsNumber() {
|
|
return g_controlnet_max_supported_models
|
|
}
|
|
|
|
function mapPluginSettingsToControlNet(plugin_settings) {
|
|
const ps = plugin_settings // for shortness
|
|
let controlnet_units = []
|
|
|
|
for (let index = 0; index < g_controlnet_max_supported_models; index++) {
|
|
if (!getEnableControlNet(index)) break
|
|
controlnet_units[index] = {
|
|
input_image: g_generation_session.controlNetImage[index],
|
|
mask: '',
|
|
module: getSelectedModule(index),
|
|
model: getSelectedModel(index),
|
|
weight: getControlNetWeight(index),
|
|
resize_mode: 'Scale to Fit (Inner Fit)',
|
|
lowvram: getUseLowVram(index),
|
|
processor_res: 512,
|
|
threshold_a: 64,
|
|
threshold_b: 64,
|
|
guidance: getControlNetWeightGuidanceStrength(index),
|
|
guidance_start: 0,
|
|
guidance_end: 1,
|
|
guessmode: false,
|
|
}
|
|
}
|
|
|
|
if (
|
|
plugin_settings['mode'] === Enum.generationModeEnum['Img2Img'] ||
|
|
plugin_settings['mode'] === Enum.generationModeEnum['Inpaint'] ||
|
|
plugin_settings['mode'] === Enum.generationModeEnum['Outpaint']
|
|
) {
|
|
const b_use_guess_mode = getUseGuessMode()
|
|
controlnet_units[0]['guessmode'] = b_use_guess_mode
|
|
}
|
|
|
|
const controlnet_payload = {
|
|
...ps,
|
|
controlnet_units,
|
|
subseed: -1,
|
|
override_settings: {},
|
|
override_settings_restore_afterwards: true,
|
|
}
|
|
|
|
return controlnet_payload
|
|
}
|
|
function refreshControlNetTab() {}
|
|
|
|
for (let index = 0; index < g_controlnet_max_supported_models; index++) {
|
|
//event listeners
|
|
document
|
|
.getElementById('slControlNetGuidanceStrength_' + index)
|
|
.addEventListener('input', (evt) => {
|
|
// debugger
|
|
const sd_value = general.mapRange(evt.target.value, 0, 100, 0, 1) // convert slider value to SD ready value
|
|
document.getElementById(
|
|
'lControlNetGuidanceStrength_' + index
|
|
).textContent = Number(sd_value).toFixed(2)
|
|
})
|
|
|
|
document
|
|
.getElementById('slControlNetWeight_' + index)
|
|
.addEventListener('input', (evt) => {
|
|
// debugger
|
|
const sd_value = general.mapRange(evt.target.value, 0, 100, 0, 2) // convert slider value to SD ready value
|
|
document.getElementById('lControlNetWeight_' + index).textContent =
|
|
Number(sd_value).toFixed(2)
|
|
})
|
|
document
|
|
.getElementById('bSetControlImage_' + index)
|
|
.addEventListener('click', async () => {
|
|
const selectionInfo =
|
|
await selection.Selection.getSelectionInfoExe()
|
|
if (selectionInfo) {
|
|
await g_generation_session.setControlNetImage(index)
|
|
} else {
|
|
await note.Notification.inactiveSelectionArea()
|
|
}
|
|
})
|
|
|
|
document
|
|
.getElementById('bControlMask_' + index)
|
|
.addEventListener('click', async () => {
|
|
// const selectionInfo = await selection.Selection.getSelectionInfoExe()
|
|
|
|
if (
|
|
g_generation_session.control_net_selection_info &&
|
|
g_generation_session.controlNetMask[index]
|
|
) {
|
|
const selection_info =
|
|
g_generation_session.control_net_selection_info
|
|
const layer = await io.IO.base64ToLayer(
|
|
g_generation_session.controlNetMask[index],
|
|
'ControlNet Mask.png',
|
|
selection_info.left,
|
|
selection_info.top,
|
|
selection_info.width,
|
|
selection_info.height
|
|
)
|
|
} else {
|
|
// await note.Notification.inactiveSelectionArea()
|
|
app.showAlert('Mask Image is not available')
|
|
}
|
|
})
|
|
}
|
|
|
|
module.exports = {
|
|
requestControlNetModelList,
|
|
populateModelMenu,
|
|
initializeControlNetTab,
|
|
getControlNetWeight,
|
|
mapPluginSettingsToControlNet,
|
|
getEnableControlNet,
|
|
getSelectedModule,
|
|
getSelectedModel,
|
|
getControlNetMaxModelsNumber,
|
|
}
|