|
const api = require('../api') |
|
const html_manip = require('../html_manip') |
|
const selection = require('../../selection') |
|
const note = require('../notification') |
|
const controlnet_preset = require('../presets/controlnet_preset') |
|
const preset = require('../presets/preset') |
|
const Enum = require('../../enum') |
|
const event = require('../event') |
|
|
|
|
|
let g_controlnet_presets |
|
let g_module_detail |
|
|
|
class ControlNetUnit { |
|
static {} |
|
|
|
static resetUnit(index) { |
|
const controlnet_unit_default = { |
|
module: null, |
|
model: null, |
|
weight: 1.0, |
|
resize_mode: null, |
|
lowvram: null, |
|
processor_res: null, |
|
threshold_a: null, |
|
threshold_b: null, |
|
|
|
guidance_start: 0, |
|
guidance_end: 1, |
|
guessmode: null, |
|
} |
|
this.setUnit(index, controlnet_unit_default) |
|
} |
|
|
|
static resetUnits() { |
|
for (let i = 0; i < g_controlnet_max_models; ++i) { |
|
this.resetUnit(i) |
|
} |
|
} |
|
static getUnit(index) { |
|
const controlnet_unit = { |
|
module: this.getModule(index), |
|
model: this.getModel(index), |
|
weight: this.getWeight(index), |
|
resize_mode: null, |
|
lowvram: null, |
|
processor_res: null, |
|
threshold_a: null, |
|
threshold_b: null, |
|
|
|
guidance_start: this.getGuidanceStrengthStart(index), |
|
guidance_end: this.getGuidanceStrengthEnd(index), |
|
guessmode: null, |
|
} |
|
return controlnet_unit |
|
} |
|
static setUnit(index, unit_settings) { |
|
const controlnet_unit_setters = { |
|
module: this.setModule, |
|
model: this.setModel, |
|
weight: this.setWeight, |
|
resize_mode: null, |
|
lowvram: null, |
|
processor_res: null, |
|
threshold_a: null, |
|
threshold_b: null, |
|
|
|
guidance_start: this.setGuidanceStrengthStart, |
|
guidance_end: this.setGuidanceStrengthEnd, |
|
guessmode: null, |
|
} |
|
|
|
for (const [name, value] of Object.entries(unit_settings)) { |
|
try { |
|
if ( |
|
controlnet_unit_setters.hasOwnProperty(name) |
|
|
|
) { |
|
|
|
const setter = controlnet_unit_setters[name] |
|
|
|
setter(index, value) |
|
|
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
} |
|
static getUnits() { |
|
const controlnet_units = {} |
|
|
|
for (let i = 0; i < g_controlnet_max_models; ++i) { |
|
controlnet_units[i] = this.getUnit(i) |
|
} |
|
return controlnet_units |
|
} |
|
static setUnits(controlnet_units) { |
|
for (const [index, unit] of Object.entries(controlnet_units)) { |
|
try { |
|
this.setUnit(index, unit) |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
} |
|
static doesUnitExist(index) { |
|
|
|
if (index >= 0) { |
|
} |
|
} |
|
|
|
static getModule(index) { |
|
const module = getSelectedModule(index) |
|
return module |
|
} |
|
static setModule(index, module_item) { |
|
try { |
|
const module_menu_element = controlnetElement( |
|
index, |
|
'.mModulesMenuControlNet_' |
|
) |
|
|
|
html_manip.selectMenuItemByElement(module_menu_element, module_item) |
|
|
|
|
|
changeModule(module_item, index) |
|
} catch (e) { |
|
html_manip.unselectMenuItemByElement(module_menu_element) |
|
console.warn(e) |
|
} |
|
} |
|
static getModel(index) { |
|
const model = getSelectedModel(index) |
|
return model |
|
} |
|
static setModel(index, model_item) { |
|
try { |
|
const model_menu_element = controlnetElement( |
|
index, |
|
'.mModelsMenuControlNet_' |
|
) |
|
html_manip.selectMenuItemByElement(model_menu_element, model_item) |
|
} catch (e) { |
|
html_manip.unselectMenuItemByElement(model_menu_element) |
|
console.warn(e) |
|
} |
|
} |
|
static getWeight(index = 0) { |
|
const weight = getWeight(index) |
|
return weight |
|
} |
|
static setWeight(index, weight) { |
|
setWeight(index, weight) |
|
} |
|
static getGuidanceStrengthStart(index) { |
|
const guidance_strength = getControlNetGuidanceStrengthStart(index) |
|
return guidance_strength |
|
} |
|
|
|
static setGuidanceStrengthStart(index, sd_value) { |
|
setControlNetGuidanceStrengthStart(index, sd_value) |
|
} |
|
static getGuidanceStrengthEnd(index) { |
|
const guidance_strength = getControlNetGuidanceStrengthEnd(index) |
|
return guidance_strength |
|
} |
|
static setGuidanceStrengthEnd(index, sd_value) { |
|
setControlNetGuidanceStrengthEnd(index, sd_value) |
|
} |
|
static getProcessorRes(index) { |
|
const slider = controlnetElement(index, '.slControlNetProcessorRes_') |
|
|
|
return slider.value |
|
} |
|
static setProcessorRes(index, sd_value) { |
|
const slider = controlnetElement(index, '.slControlNetProcessorRes_') |
|
slider.value = sd_value |
|
} |
|
static getThreshold(index, a_or_b) { |
|
let slider |
|
if (a_or_b === 'a') { |
|
slider = controlnetElement(index, '.slControlNetThreshold_A_') |
|
} else if (a_or_b === 'b') { |
|
slider = controlnetElement(index, '.slControlNetThreshold_B_') |
|
} |
|
|
|
const sd_value = general.mapRange( |
|
slider.value, |
|
slider.min, |
|
slider.max, |
|
slider.dataset['sd_min'], |
|
slider.dataset['sd_max'] |
|
) |
|
return sd_value |
|
} |
|
static setThreshold(index, a_or_b, sd_value) { |
|
let slider |
|
let label |
|
if (a_or_b === 'a') { |
|
slider = controlnetElement(index, '.slControlNetThreshold_A_') |
|
label = controlnetElement(index, '.lControlNetThreshold_A_') |
|
} else if (a_or_b === 'b') { |
|
slider = controlnetElement(index, '.slControlNetThreshold_B_') |
|
label = controlnetElement(index, '.lControlNetThreshold_B_') |
|
} |
|
|
|
const slider_value = general.mapRange( |
|
sd_value, |
|
slider.dataset['sd_min'], |
|
slider.dataset['sd_max'], |
|
slider.min, |
|
slider.max |
|
) |
|
slider.value = String(slider_value) |
|
label.innerText = String(sd_value) |
|
} |
|
|
|
static getControlNetUnitJson(index = 0) {} |
|
} |
|
|
|
async function checkIfControlNetInstalled() {} |
|
|
|
async function requestControlNetDetectMap( |
|
controlnet_init_image, |
|
_module, |
|
processor_res, |
|
threshold_a, |
|
threshold_b |
|
) { |
|
try { |
|
const payload = { |
|
controlnet_module: _module, |
|
controlnet_input_images: [controlnet_init_image], |
|
controlnet_processor_res: processor_res, |
|
controlnet_threshold_a: threshold_a, |
|
controlnet_threshold_b: threshold_b, |
|
} |
|
const full_url = `${g_sd_url}/controlnet/detect` |
|
|
|
|
|
|
|
const response_data = await api.requestPost(full_url, payload) |
|
|
|
|
|
if (response_data['images'].length === 0) { |
|
app.showAlert(response_data['info']) |
|
} |
|
return response_data['images'][0] |
|
} catch (e) { |
|
console.warn('requestControlNetDetectMap(): ', _module, e) |
|
} |
|
} |
|
|
|
async function requestControlNetModelList() { |
|
const control_net_json = await api.requestGet( |
|
`${g_sd_url}/controlnet/model_list` |
|
) |
|
|
|
const model_list = control_net_json?.model_list |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return model_list |
|
} |
|
|
|
async function requestControlNetModuleList() { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const result = await api.requestGet( |
|
`${g_sd_url}/controlnet/module_list?alias_names=1` |
|
) |
|
|
|
return result?.module_list |
|
} |
|
async function populateModelMenu() { |
|
try { |
|
const models = await requestControlNetModelList() |
|
for (let index = 0; index < g_controlnet_max_models; index++) { |
|
const menu_element = controlnetElement( |
|
index, |
|
'.mModelsMenuControlNet_' |
|
) |
|
html_manip.populateMenuByElement( |
|
menu_element, |
|
'mModelsMenuItemControlNet_', |
|
models, |
|
(item, item_html_element) => { |
|
item_html_element.innerHTML = item |
|
item_html_element.dataset['index'] = index |
|
}, |
|
false, |
|
'Select Model' |
|
) |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
|
|
function changeModule(_module, index) { |
|
|
|
|
|
const preprocessor_res_element = controlnetElement( |
|
index, |
|
'.slControlNetProcessorRes_' |
|
) |
|
|
|
const threshold_a_element = controlnetElement( |
|
index, |
|
'.slControlNetThreshold_A_' |
|
) |
|
const threshold_b_element = controlnetElement( |
|
index, |
|
'.slControlNetThreshold_B_' |
|
) |
|
|
|
const detail = g_module_detail[_module] |
|
|
|
function remapArray(arr) { |
|
let obj = { |
|
preprocessor_res: arr[0] || null, |
|
threshold_a: arr[1] || null, |
|
threshold_b: arr[2] || null, |
|
} |
|
return obj |
|
} |
|
const params = remapArray(detail['sliders']) |
|
const model_free = detail.model_free |
|
|
|
|
|
|
|
|
|
if (model_free) |
|
controlnetElement( |
|
index, |
|
'.mModelsMenuControlNet_' |
|
).parentElement.style.display = 'none' |
|
|
|
else |
|
controlnetElement( |
|
index, |
|
'.mModelsMenuControlNet_' |
|
).parentElement.style.display = 'block' |
|
|
|
|
|
if (params?.preprocessor_res) { |
|
const preprocessor_res_label_element = controlnetElement( |
|
index, |
|
'.labelControlNetProcessorRes_' |
|
) |
|
preprocessor_res_element.style.display = 'block' |
|
preprocessor_res_label_element.innerText = params.preprocessor_res.name |
|
} else { |
|
preprocessor_res_element.style.display = 'none' |
|
} |
|
if (params?.threshold_a) { |
|
const threshold_a_label_element = controlnetElement( |
|
index, |
|
'.labelControlNetThreshold_A_' |
|
) |
|
|
|
threshold_a_element.dataset['sd_min'] = params.threshold_a.min |
|
threshold_a_element.dataset['sd_max'] = params.threshold_a.max |
|
ControlNetUnit.setThreshold(index, 'a', params.threshold_a.value) |
|
threshold_a_element.style.display = 'block' |
|
threshold_a_label_element.innerText = params.threshold_a.name + ":" |
|
} else { |
|
ControlNetUnit.setThreshold(index, 'a', 32) |
|
threshold_a_element.style.display = 'none' |
|
} |
|
|
|
if (params?.threshold_b) { |
|
const threshold_b_label_element = controlnetElement( |
|
index, |
|
'.labelControlNetThreshold_B_' |
|
) |
|
|
|
threshold_b_element.dataset['sd_min'] = params.threshold_b.min |
|
threshold_b_element.dataset['sd_max'] = params.threshold_b.max |
|
ControlNetUnit.setThreshold(index, 'b', params.threshold_b.value) |
|
threshold_b_element.style.display = 'block' |
|
threshold_b_label_element.innerText = params.threshold_b.name + ":" |
|
} else { |
|
ControlNetUnit.setThreshold(index, 'b', 32) |
|
threshold_b_element.style.display = 'none' |
|
} |
|
} |
|
async function populatePreprocessorMenu() { |
|
try { |
|
|
|
const modules = await requestControlNetModuleList() |
|
for (let index = 0; index < g_controlnet_max_models; index++) { |
|
const menu_element = controlnetElement( |
|
index, |
|
'.mModulesMenuControlNet_' |
|
) |
|
|
|
menu_element.dataset['index'] = String(index) |
|
html_manip.populateMenuByElement( |
|
menu_element, |
|
'mModuleMenuItemControlNet_', |
|
modules, |
|
(item, item_html_element) => { |
|
item_html_element.innerHTML = item |
|
item_html_element.dataset['index'] = index |
|
}, |
|
false, |
|
'Select Module' |
|
) |
|
|
|
menu_element.addEventListener('click', (event) => { |
|
changeModule( |
|
event.target.innerText, |
|
event.target.dataset['index'] |
|
) |
|
}) |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
function controlnetElement(index, class_) { |
|
const element = document.querySelector( |
|
`#controlnet_settings_${index} ${class_}` |
|
) |
|
return element |
|
} |
|
function getControlNetGuidanceStrengthStart(index) { |
|
const slider_element = document.querySelector( |
|
`#controlnet_settings_${index} .slControlNetGuidanceStrengthStart_` |
|
) |
|
const sd_value = html_manip.getSliderSdValueByElement( |
|
slider_element, |
|
0, |
|
100, |
|
0, |
|
1 |
|
) |
|
return sd_value |
|
} |
|
function setControlNetGuidanceStrengthStart(index, sd_value) { |
|
const slider_element = controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthStart_' |
|
) |
|
|
|
const label_element = controlnetElement( |
|
index, |
|
'.lControlNetGuidanceStrengthStart_' |
|
) |
|
html_manip.setSliderSdValueByElements( |
|
slider_element, |
|
label_element, |
|
sd_value, |
|
0, |
|
100, |
|
0, |
|
1 |
|
) |
|
} |
|
|
|
function getControlNetGuidanceStrengthEnd(index) { |
|
const slider_element = controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthEnd_' |
|
) |
|
const sd_value = html_manip.getSliderSdValueByElement( |
|
slider_element, |
|
0, |
|
100, |
|
0, |
|
1 |
|
) |
|
return sd_value |
|
} |
|
function setControlNetGuidanceStrengthEnd(index, sd_value) { |
|
const slider_element = controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthEnd_' |
|
) |
|
|
|
const label_element = controlnetElement( |
|
index, |
|
'.lControlNetGuidanceStrengthEnd_' |
|
) |
|
html_manip.setSliderSdValueByElements( |
|
slider_element, |
|
label_element, |
|
sd_value, |
|
0, |
|
100, |
|
0, |
|
1 |
|
) |
|
} |
|
|
|
|
|
function getControlNetWeightGuidanceStrengthStart(index = 0) { |
|
const slider_element = controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthStart_' |
|
) |
|
const slider_value = slider_element.value |
|
const sd_value = general.mapRange(slider_value, 0, 100, 0, 1) |
|
return sd_value |
|
} |
|
|
|
function getControlNetWeightGuidanceStrengthEnd(index = 0) { |
|
const slider_value = controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthEnd_' |
|
).value |
|
|
|
const sd_value = general.mapRange(slider_value, 0, 100, 0, 1) |
|
return sd_value |
|
} |
|
|
|
function getWeight(index = 0) { |
|
const slider_value = document.querySelector( |
|
`#controlnet_settings_${index} .slControlNetWeight_` |
|
).value |
|
|
|
const sd_value = general.mapRange(slider_value, 0, 100, 0, 2) |
|
return sd_value |
|
} |
|
function setWeight(index = 0, sd_weight) { |
|
const slider_element = document.querySelector( |
|
`#controlnet_settings_${index} .slControlNetWeight_` |
|
) |
|
const label_element = document.querySelector( |
|
`#controlnet_settings_${index} .lControlNetWeight_` |
|
) |
|
|
|
html_manip.setSliderSdValueByElements( |
|
slider_element, |
|
label_element, |
|
sd_weight, |
|
0, |
|
100, |
|
0, |
|
2 |
|
) |
|
} |
|
function getUseLowVram(index = 0) { |
|
const b_result = document.querySelector( |
|
`#controlnet_settings_${index} .chlowVram_` |
|
).checked |
|
return b_result |
|
} |
|
function getEnableControlNet(index = 0) { |
|
const is_enable = document.querySelector( |
|
`#controlnet_settings_${index} .chEnableControlNet_` |
|
).checked |
|
return is_enable |
|
} |
|
function setEnable(index) { |
|
document.querySelector( |
|
`#controlnet_settings_${index} .chEnableControlNet_` |
|
).checked = b_live_update |
|
} |
|
function getSelectedModule(index = 0) { |
|
const menu_element = controlnetElement(index, '.mModulesMenuControlNet_') |
|
|
|
const module_name = |
|
html_manip.getSelectedMenuItemTextContentByElement(menu_element) |
|
|
|
return module_name |
|
} |
|
function getSelectedModel(index = 0) { |
|
const menu_element = controlnetElement(index, '.mModelsMenuControlNet_') |
|
const model_name = |
|
html_manip.getSelectedMenuItemTextContentByElement(menu_element) |
|
return model_name |
|
} |
|
function getUseGuessMode(index = 0) { |
|
const is_guess_mode = document.querySelector( |
|
`#controlnet_settings_${index} .chGuessMode_` |
|
).checked |
|
|
|
return is_guess_mode |
|
} |
|
function isControlNetModeEnable() { |
|
let is_tab_enabled = !document.getElementById('chDisableControlNetTab') |
|
.checked |
|
|
|
let numOfEnabled = 0 |
|
if (g_controlnet_max_models <= 0) { |
|
return false |
|
} |
|
|
|
if (is_tab_enabled) { |
|
for (let index = 0; index < g_controlnet_max_models; index++) { |
|
if (getEnableControlNet(index)) { |
|
numOfEnabled += 1 |
|
} |
|
} |
|
} |
|
let is_mode_enabled = is_tab_enabled |
|
if (is_tab_enabled === false || numOfEnabled === 0) { |
|
is_mode_enabled = false |
|
} |
|
return is_mode_enabled |
|
} |
|
|
|
|
|
|
|
|
|
function preprocessorData( |
|
processor_res = 512, |
|
threshold_a = 64, |
|
threshold_b = 64, |
|
a_min = 64, |
|
a_max = 1024, |
|
b_min = 64, |
|
b_max = 1024, |
|
processor_res_label = 'Annotator resolution', |
|
threshold_a_label = 'threshold a', |
|
threshold_b_label = 'threshold b' |
|
) { |
|
return { |
|
processor_res, |
|
threshold_a, |
|
threshold_b, |
|
a_min, |
|
a_max, |
|
b_min, |
|
b_max, |
|
processor_res_label, |
|
threshold_a_label, |
|
threshold_b_label, |
|
} |
|
} |
|
|
|
function mapPluginSettingsToControlNet(plugin_settings) { |
|
const ps = plugin_settings |
|
let controlnet_units = [] |
|
|
|
|
|
let active_index = 0 |
|
for (let index = 0; index < g_controlnet_max_models; index++) { |
|
const preprocessor_name = getSelectedModule(index) |
|
|
|
controlnet_units[active_index] = { |
|
enabled: getEnableControlNet(index), |
|
input_image: g_generation_session.controlNetImage[index], |
|
mask: '', |
|
module: getSelectedModule(index), |
|
model: getSelectedModel(index), |
|
weight: getWeight(index), |
|
resize_mode: 'Scale to Fit (Inner Fit)', |
|
lowvram: getUseLowVram(index), |
|
processor_res: ControlNetUnit.getProcessorRes(index), |
|
threshold_a: ControlNetUnit.getThreshold(index, 'a'), |
|
threshold_b: ControlNetUnit.getThreshold(index, 'b'), |
|
|
|
guidance_start: getControlNetWeightGuidanceStrengthStart(index), |
|
guidance_end: getControlNetWeightGuidanceStrengthEnd(index), |
|
guessmode: false, |
|
} |
|
active_index++ |
|
} |
|
|
|
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, |
|
alwayson_scripts: { |
|
controlnet: { |
|
args: controlnet_units, |
|
}, |
|
}, |
|
} |
|
|
|
return controlnet_payload |
|
} |
|
function refreshControlNetTab() {} |
|
|
|
async function populateControlNetPresetMenu() { |
|
|
|
|
|
|
|
const custom_presets = await preset.getAllCustomPresetsSettings( |
|
Enum.PresetTypeEnum['ControlNetPreset'] |
|
) |
|
g_controlnet_presets = { |
|
'Select CtrlNet Preset': {}, |
|
...controlnet_preset.ControlNetNativePresets, |
|
...custom_presets, |
|
} |
|
|
|
const presets_names = Object.keys(g_controlnet_presets) |
|
|
|
html_manip.populateMenu( |
|
'mControlNetPresetMenu', |
|
'mControlNetPresetMenuItem', |
|
presets_names, |
|
(preset_name, item_html_element) => { |
|
item_html_element.innerHTML = preset_name |
|
} |
|
) |
|
html_manip.selectMenuItem('mControlNetPresetMenu', 'Select CtrlNet Preset') |
|
} |
|
|
|
document |
|
.getElementById('mControlNetPresetMenu') |
|
.addEventListener('change', async (evt) => { |
|
try { |
|
ControlNetUnit.resetUnits() |
|
const preset_index = evt.target.selectedIndex |
|
const preset_name = evt.target.options[preset_index].textContent |
|
units_settings = g_controlnet_presets[preset_name] |
|
|
|
ControlNetUnit.setUnits(units_settings) |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
}) |
|
|
|
document |
|
.getElementById('bSetAllControlImage') |
|
.addEventListener('click', async () => { |
|
const selectionInfo = await selection.Selection.getSelectionInfoExe() |
|
if (selectionInfo) { |
|
const base64_image = |
|
await g_generation_session.setControlNetImageHelper() |
|
|
|
for (index = 0; index < g_controlnet_max_models; index++) { |
|
await g_generation_session.setControlNetImage( |
|
index, |
|
base64_image |
|
) |
|
} |
|
} else { |
|
await note.Notification.inactiveSelectionArea() |
|
} |
|
}) |
|
|
|
function initControlNetUnitsEventListeners(controlnet_max_models) { |
|
for (let index = 0; index < controlnet_max_models; index++) { |
|
|
|
controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthStart_' |
|
).addEventListener('input', (evt) => { |
|
|
|
const sd_value = general.mapRange(evt.target.value, 0, 100, 0, 1) |
|
controlnetElement( |
|
index, |
|
'.lControlNetGuidanceStrengthStart_' |
|
).textContent = Number(sd_value).toFixed(2) |
|
}) |
|
|
|
controlnetElement( |
|
index, |
|
'.slControlNetGuidanceStrengthEnd_' |
|
).addEventListener('input', (evt) => { |
|
|
|
const sd_value = general.mapRange(evt.target.value, 0, 100, 0, 1) |
|
controlnetElement( |
|
index, |
|
'.lControlNetGuidanceStrengthEnd_' |
|
).textContent = Number(sd_value).toFixed(2) |
|
}) |
|
|
|
document |
|
.querySelector(`#controlnet_settings_${index} .slControlNetWeight_`) |
|
.addEventListener('input', (evt) => { |
|
|
|
const sd_value = general.mapRange( |
|
evt.target.value, |
|
0, |
|
100, |
|
0, |
|
2 |
|
) |
|
document.querySelector( |
|
`#controlnet_settings_${index} .lControlNetWeight_` |
|
).textContent = Number(sd_value).toFixed(2) |
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
controlnetElement(index, '.slControlNetThreshold_A_').addEventListener( |
|
'input', |
|
(event) => { |
|
const slider = event.target |
|
const sd_value = Number( |
|
general |
|
.mapRange( |
|
slider.value, |
|
slider.min, |
|
slider.max, |
|
slider.dataset['sd_min'], |
|
slider.dataset['sd_max'] |
|
) |
|
.toFixed(2) |
|
) |
|
controlnetElement(index, '.lControlNetThreshold_A_').innerText = |
|
String(sd_value) |
|
|
|
|
|
|
|
} |
|
) |
|
controlnetElement(index, '.slControlNetThreshold_B_').addEventListener( |
|
'input', |
|
(event) => { |
|
const slider = event.target |
|
const sd_value = Number( |
|
general |
|
.mapRange( |
|
slider.value, |
|
slider.min, |
|
slider.max, |
|
slider.dataset['sd_min'], |
|
slider.dataset['sd_max'] |
|
) |
|
.toFixed(2) |
|
) |
|
controlnetElement(index, '.lControlNetThreshold_B_').innerText = |
|
String(sd_value) |
|
|
|
|
|
|
|
} |
|
) |
|
document |
|
.querySelector(`#controlnet_settings_${index} .bSetControlImage_`) |
|
.addEventListener('click', async () => { |
|
const selectionInfo = |
|
await selection.Selection.getSelectionInfoExe() |
|
if (selectionInfo) { |
|
|
|
const base64_image = |
|
await g_generation_session.setControlNetImageHelper() |
|
await g_generation_session.setControlNetImage( |
|
index, |
|
base64_image |
|
) |
|
} else { |
|
await note.Notification.inactiveSelectionArea() |
|
} |
|
}) |
|
|
|
document |
|
.querySelector(`#controlnet_settings_${index} .bControlMask_`) |
|
.addEventListener('click', async () => { |
|
await previewAnnotator(index) |
|
}) |
|
} |
|
} |
|
document |
|
.getElementById('mControlNetPresetMenu') |
|
.addEventListener('updatePresetMenuEvent', async (event) => { |
|
|
|
await populateControlNetPresetMenu() |
|
}) |
|
|
|
async function previewAnnotator(index) { |
|
try { |
|
const controlnet_init_image = |
|
g_generation_session.controlNetImage[index] |
|
const _module = ControlNetUnit.getModule(index) |
|
const processor_res = ControlNetUnit.getProcessorRes(index) |
|
const threshold_a = ControlNetUnit.getThreshold(index, 'a') |
|
const threshold_b = ControlNetUnit.getThreshold(index, 'b') |
|
if (!controlnet_init_image) { |
|
const error = 'ControlNet initial image is empty' |
|
app.showAlert(error) |
|
throw error |
|
} |
|
if (!_module || _module === 'none') { |
|
const error = 'select a valid controlnet module (preprocessor)' |
|
app.showAlert(error) |
|
throw error |
|
} |
|
|
|
const detect_map = await requestControlNetDetectMap( |
|
controlnet_init_image, |
|
_module, |
|
processor_res, |
|
threshold_a, |
|
threshold_b |
|
) |
|
|
|
const rgb_detect_map_url = |
|
await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) |
|
const rgb_detect_map = general.base64UrlToBase64(rgb_detect_map_url) |
|
g_generation_session.controlNetMask[index] = rgb_detect_map |
|
|
|
html_manip.setControlMaskSrc(rgb_detect_map_url, index) |
|
} catch (e) { |
|
console.warn('PreviewAnnotator click(): index: ', index, e) |
|
} |
|
} |
|
async function previewAnnotatorFromCanvas(index) { |
|
try { |
|
const _module = ControlNetUnit.getModule(index) |
|
|
|
const width = html_manip.getWidth() |
|
const height = html_manip.getHeight() |
|
const selectionInfo = await psapi.getSelectionInfoExe() |
|
g_generation_session.control_net_preview_selection_info = selectionInfo |
|
const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( |
|
width, |
|
height, |
|
selectionInfo, |
|
true |
|
) |
|
|
|
if (!_module || _module === 'none') { |
|
const error = 'select a valid controlnet module (preprocessor)' |
|
app.showAlert(error) |
|
throw error |
|
} |
|
|
|
const processor_res = ControlNetUnit.getProcessorRes(index) |
|
const threshold_a = ControlNetUnit.getThreshold(index, 'a') |
|
const threshold_b = ControlNetUnit.getThreshold(index, 'b') |
|
|
|
const detect_map = await requestControlNetDetectMap( |
|
base64, |
|
_module, |
|
processor_res, |
|
threshold_a, |
|
threshold_b |
|
) |
|
|
|
const rgb_detect_map_url = |
|
await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) |
|
g_generation_session.controlNetMask[index] = detect_map |
|
html_manip.setControlMaskSrc(rgb_detect_map_url, index) |
|
} catch (e) { |
|
console.warn('PreviewAnnotator click(): index: ', index, e) |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function initPreviewElement(index) { |
|
|
|
|
|
|
|
|
|
|
|
const mask_image_html = controlnetElement(index, '.control_net_mask_') |
|
const mask_parent_element = mask_image_html.parentElement |
|
|
|
this.thumbnail_container = thumbnail.Thumbnail.wrapImgInContainer( |
|
mask_image_html, |
|
'viewer-image-container' |
|
) |
|
|
|
mask_parent_element.appendChild(thumbnail_container) |
|
|
|
async function toCanvas(index) { |
|
|
|
if ( |
|
g_generation_session.control_net_preview_selection_info && |
|
g_generation_session.controlNetMask[index] |
|
) { |
|
const selection_info = |
|
g_generation_session.control_net_preview_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 { |
|
|
|
app.showAlert('Mask Image is not available') |
|
} |
|
} |
|
async function toControlNetInitImage(index) { |
|
const preview_result_base64 = g_generation_session.controlNetMask[index] |
|
g_generation_session.controlNetImage[index] = preview_result_base64 |
|
g_generation_session.control_net_selection_info = |
|
g_generation_session.control_net_preview_selection_info |
|
|
|
const rgb_detect_map_url = |
|
await io.convertBlackAndWhiteImageToRGBChannels3( |
|
preview_result_base64 |
|
) |
|
|
|
|
|
|
|
html_manip.setControlImageSrc(rgb_detect_map_url, index) |
|
} |
|
thumbnail.Thumbnail.addSPButtonToContainer( |
|
this.thumbnail_container, |
|
'svg_sp_btn', |
|
'use as ControlNet init image', |
|
|
|
toControlNetInitImage, |
|
index |
|
) |
|
thumbnail.Thumbnail.addSPButtonToContainer( |
|
this.thumbnail_container, |
|
'svg_sp_btn_canvas', |
|
'move to the canvas', |
|
|
|
toCanvas, |
|
index |
|
) |
|
thumbnail.Thumbnail.addSPButtonToContainer( |
|
this.thumbnail_container, |
|
'svg_sp_btn_preview', |
|
'preview selection from canvas', |
|
|
|
previewAnnotatorFromCanvas, |
|
index |
|
) |
|
} |
|
|
|
function initControlNetUnit(index) { |
|
document.querySelector( |
|
`#controlnet_settings_${index} .controlnet_unit_label_` |
|
).textContent = `Control Net Settings Slot ${index}` |
|
} |
|
async function initializeControlNetTab(controlnet_max_models) { |
|
try { |
|
if (controlnet_max_models <= 0) { |
|
document.getElementById('controlnetMissingError').style.display = |
|
'block' |
|
|
|
return |
|
} |
|
document.getElementById('controlnetMissingError').style.display = 'none' |
|
|
|
|
|
|
|
await populateControlNetPresetMenu() |
|
const parent_container = document.getElementById( |
|
'controlnet_parent_container' |
|
) |
|
parent_container.innerHTML = '' |
|
const controlnet_unit_template = document.getElementById( |
|
'controlnet_settings_template' |
|
) |
|
|
|
for (let index = 0; index < controlnet_max_models; index++) { |
|
const controlnet_unit = controlnet_unit_template.cloneNode(true) |
|
controlnet_unit.id = 'controlnet_settings_' + index |
|
controlnet_unit.dataset['index'] = String(index) |
|
parent_container.appendChild(controlnet_unit) |
|
} |
|
|
|
const full_url = `${g_sd_url}/controlnet/module_list?alias_names=1` |
|
let result_json = await api.requestGet(full_url) |
|
g_module_detail = result_json['module_detail'] |
|
|
|
initControlNetUnitsEventListeners(controlnet_max_models) |
|
|
|
for (let index = 0; index < controlnet_max_models; index++) { |
|
await populateModelMenu(index) |
|
await populatePreprocessorMenu(index) |
|
document.getElementById( |
|
'controlnet_settings_' + index |
|
).style.display = 'block' |
|
initPreviewElement(index) |
|
|
|
initControlNetUnit(index) |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
|
|
module.exports = { |
|
requestControlNetModelList, |
|
populateModelMenu, |
|
initializeControlNetTab, |
|
getWeight, |
|
mapPluginSettingsToControlNet, |
|
getEnableControlNet, |
|
getSelectedModule, |
|
getSelectedModel, |
|
|
|
getControlNetGuidanceStrengthStart, |
|
setControlNetGuidanceStrengthStart, |
|
getControlNetGuidanceStrengthEnd, |
|
setControlNetGuidanceStrengthEnd, |
|
ControlNetUnit, |
|
populateControlNetPresetMenu, |
|
isControlNetModeEnable, |
|
getModuleDetail() { |
|
return g_module_detail |
|
} |
|
} |
|
|