diff --git a/core/calc.py b/core/calc.py index 6ccebc5..19ae513 100644 --- a/core/calc.py +++ b/core/calc.py @@ -539,7 +539,7 @@ Perform single function operations like absolute value, mean, median, mode, magn "default": (0,0,0,0), "label": ["X", "Y", "Z", "W"]}), Lexicon.FILL: (EnumFillOperation._member_names_, { - "default": EnumFillOperation.DEFAULT.name}), + "default": EnumFillOperation.DEFAULT.name}) } }) return Lexicon._parse(d) diff --git a/web/nodes/lerp.js b/web/nodes/lerp.js index 34c149c..89bd309 100644 --- a/web/nodes/lerp.js +++ b/web/nodes/lerp.js @@ -15,9 +15,9 @@ app.registerExtension({ const onNodeCreated = nodeType.prototype.onNodeCreated nodeType.prototype.onNodeCreated = async function () { const me = await onNodeCreated?.apply(this); - widgetHookControl(this, 'type', 'alpha', true); - widgetHookControl(this, 'type', 'aa'); - widgetHookControl(this, 'type', 'bb'); + await widgetHookControl(this, 'type', 'alpha', true); + await widgetHookControl(this, 'type', 'aa'); + await widgetHookControl(this, 'type', 'bb'); return me; } return nodeType; diff --git a/web/nodes/op_binary.js b/web/nodes/op_binary.js index 72b7a54..e3fb3f7 100644 --- a/web/nodes/op_binary.js +++ b/web/nodes/op_binary.js @@ -16,8 +16,8 @@ app.registerExtension({ nodeType.prototype.onNodeCreated = async function () { const me = await onNodeCreated?.apply(this); console.info(this); - widgetHookControl(this, 'type', 'aa'); - widgetHookControl(this, 'type', 'bb'); + await widgetHookControl(this, 'type', 'aa'); + await widgetHookControl(this, 'type', 'bb'); return me; } diff --git a/web/nodes/op_unary.js b/web/nodes/op_unary.js index 5adda9d..14f8d80 100644 --- a/web/nodes/op_unary.js +++ b/web/nodes/op_unary.js @@ -16,40 +16,9 @@ app.registerExtension({ const onNodeCreated = nodeType.prototype.onNodeCreated nodeType.prototype.onNodeCreated = async function () { const me = await onNodeCreated?.apply(this); - widgetHookControl(this, 'type', 'aa'); + await widgetHookControl(this, 'type', 'aa'); return me; } -/* - const onConnectionsChange = nodeType.prototype.onConnectionsChange - nodeType.prototype.onConnectionsChange = function (slotType, slot_idx, event, link_info, node_slot) { - const me = onConnectionsChange?.apply(this, arguments); - let connected = false; - const output = this.outputs[0]; - if (slotType == TypeSlot.Input && link_info && event == TypeSlotEvent.Connect) { - const fromNode = this.graph._nodes.find( - (otherNode) => otherNode.id == link_info.origin_id - ) - - if (fromNode) { - const parent_link = fromNode.outputs[link_info.origin_slot]; - if (parent_link) { - output.type = parent_link.type; - //output.name = parent_link.name; - //output.localized_name = parent_link.localized_name; - connected = true; - } - } - } - if (connected == false) { - output.type = "*"; - //output.name = "❔"; - //output.localized_name = "❔"; - } - nodeFitHeight(this); - return me; - } -*/ - return nodeType; + return nodeType; } -}) - +}) \ No newline at end of file diff --git a/web/nodes/value.js b/web/nodes/value.js index 64fd8c4..7497cc1 100644 --- a/web/nodes/value.js +++ b/web/nodes/value.js @@ -21,8 +21,8 @@ app.registerExtension({ this.outputs[3].type = "*"; this.outputs[4].type = "*"; - const ab_data = widgetHookControl(this, 'type', 'aa'); - widgetHookControl(this, 'type', 'bb'); + const ab_data = await widgetHookControl(this, 'type', 'aa'); + await widgetHookControl(this, 'type', 'bb'); const oldCallback = ab_data.callback; ab_data.callback = () => { diff --git a/web/util.js b/web/util.js index c6c3c43..685588c 100644 --- a/web/util.js +++ b/web/util.js @@ -38,111 +38,80 @@ export async function apiJovimetrix(id, cmd, data=null, route="message", ) { } } -function widgetShowVector(widget, values={}, type) { - if (["FLOAT"].includes(type)) { - type = "VEC1"; - } else if (["INT"].includes(type)) { - type = "VEC1INT"; - } else if (type == "BOOLEAN") { - type = "toggle"; - } - - if (type !== undefined) { - widget.type = type; - } - - if (widget.value === undefined) { - widget.value = widget.options?.default || {}; - } - - // convert widget.value to pure dict/object - if (Array.isArray(widget.value)) { - let new_val = {}; - for (let i = 0; i < widget.value.length; i++) { - new_val[i] = widget.value[i]; - } - widget.value = new_val; - } - - widget.options.step = 1; - widget.options.round = 1; - widget.options.precision = 0; - if (widget.type != 'toggle') { - let size = 1; - const match = /\d/.exec(widget.type); - if (match) { - size = match[0]; - } - if (!widget.type.endsWith('INT') && widget.type != 'BOOLEAN') { - widget.options.step = 0.01; - widget.options.round = 0.001; - widget.options.precision = 3; - } - - widget.value = {}; - for (let i = 0; i < size; i++) { - widget.value[i] = (widget.options.precision == 0) ? Number(values[i]) : parseFloat(values[i]).toFixed(widget.options.precision); - } - } else { - widget.value = values[0] ? true : false; - } -} - /* * matchFloatSize forces the target to be float[n] based on its type size */ -export function widgetHookControl(node, control_key, child_key, matchFloatSize=false) { - +export async function widgetHookControl(node, control_key, child_key) { + const control = node.widgets.find(w => w.name == control_key); const target = node.widgets.find(w => w.name == child_key); - const combo = node.widgets.find(w => w.name == control_key); - if (!target || !combo) { + const target_input = node.inputs.find(w => w.name == child_key); + + if (!control || !target || !target_input) { throw new Error("Required widgets not found"); } - const initializeTrack = (widget) => { - const track = {}; - for (let i = 0; i < 4; i++) { - track[i] = widget.options?.default[i]; - } - Object.assign(track, widget.value); - return track; + const track_xyzw = { + 0: target.options?.default?.[0] || 0, + 1: target.options?.default?.[1] || 0, + 2: target.options?.default?.[2] || 0, + 3: target.options?.default?.[3] || 0, }; - const { widgets } = node; + const controlCallback = control.callback; + control.callback = async () => { + const me = await controlCallback?.apply(this, arguments); + if (["VEC2", "VEC3", "VEC4", "FLOAT", "INT", "BOOLEAN"].includes(control.value)) { + target_input.type = control.value; + //target.options.step = 0.01; + //target.options.round = 0.001; + //target.options.precision = 3; - const data = { - track_xyzw: initializeTrack(target), - target, - combo - }; + if (["INT", "FLOAT", "BOOLEAN"].includes(control.value)) { + target.type = "VEC1"; + } else { + target.type = control.value; + } - const oldCallback = combo.callback; - combo.callback = () => { - const me = oldCallback?.apply(this, arguments); - if (["VEC2", "VEC3", "VEC4", "BOOLEAN", "INT", "FLOAT"].includes(combo.value)) { - let type = combo.value; - if (matchFloatSize) { - if (["BOOLEAN", "INT"].includes(combo.value)) { - type = "FLOAT"; + let size = 1; + if (control.value == "INT") { + target.options.int = true; + } else if (["VEC2", "VEC3", "VEC4"].includes(control.value)) { + const match = /\d/.exec(control.value); + size = match[0]; + } + + target.value = {}; + if (["VEC2", "VEC3", "VEC4", "FLOAT"].includes(control.value)) { + for (let i = 0; i < size; i++) { + target.value[i] = parseFloat(track_xyzw[i]).toFixed(target.options.precision); } + } else if (control.value == "INT") { + target.value[0] = Number(track_xyzw[0]); + } else if (control.value == "BOOLEAN") { + target.value[0] = track_xyzw[0] != 0 ? true : false; } - widgetShowVector(target, data.track_xyzw, type); } nodeFitHeight(node); return me; } - target.callback = () => { + const targetCallback = target.callback; + target.callback = async () => { + const me = await targetCallback?.apply(this, arguments); if (target.type == "toggle") { - data.track_xyzw[0] = target.value ? 1 : 0; + track_xyzw[0] = target.value != 0 ? 1 : 0; + } else if (["INT", "FLOAT"].includes(target.type)) { + track_xyzw[0] = target.value; } else { Object.keys(target.value).forEach((key) => { - data.track_xyzw[key] = target.value[key]; + track_xyzw[key] = target.value[key]; }); } + return me; }; - return data; + await control.callback(); + return control; } export function nodeFitHeight(node) { diff --git a/web/widget_vector.js b/web/widget_vector.js index b535909..d52b716 100644 --- a/web/widget_vector.js +++ b/web/widget_vector.js @@ -184,30 +184,24 @@ const VectorWidget = (app, inputName, options, initial) => { try { v = eval(v); } catch { - // Suppressed exception + v = old_value[index]; } + } else { + v = old_value[index]; } + if (this.value[index] != v) { setTimeout( function () { clamp(this, v, index); domInnerValueChange(node, pos, this, this.value, eUp); - }.bind(this), 20) + }.bind(this), 5) } }.bind(this), eUp); - - if (old_value != this.value) { - setTimeout( - function () { - domInnerValueChange(node, pos, this, this.value, eUp); - }.bind(this), 20); - } - - return + return; } if (!this.options?.rgb) return; - //const rgba = widget.value; const rgba = Object.values(this?.value || []); const color = colorRGB2Hex(rgba.slice(0, 3)); @@ -260,23 +254,25 @@ const VectorWidget = (app, inputName, options, initial) => { pointer.onDrag = (eMove) => { if (!eMove.deltaX || !(index > -1)) return; - let v = parseFloat(this.value[index]); v += this.options.step * Math.sign(eMove.deltaX); clamp(this, v, index); + if (widget.callback) { + widget.callback(widget.value, app.canvas, node) + } } } widget.serializeValue = async () => { const value = widget.value; - if (value === null) { + if (widget.value === null) { return null; } - if (Array.isArray(value)) { - return value.reduce((acc, tuple, index) => ({ ...acc, [index]: tuple }), {}); + if (Array.isArray(widget.value)) { + return widget.value.reduce((acc, tuple, index) => ({ ...acc, [index]: tuple }), {}); } - return value; + return widget.value; } return widget;