Pixel-Composer/scripts/node_custom/node_custom.gml
2025-01-11 10:31:00 +07:00

91 lines
No EOL
3.4 KiB
Text

function Node_Custom(_x, _y, _group = noone, _param = {}) : Node_Processor(_x, _y, _group) constructor {
itype = _param[$ "iname"] ?? noone;
sourceDir = _param[$ "sourceDir"] ?? "";
dataPath = _param[$ "data"] ?? "";
node_info = json_load_struct(sourceDir + "/" + dataPath);
node_overlay = [];
static parseInfo = function() {
inputs = [];
outputs = [];
for( var i = 0, n = array_length(node_info.inputs); i < n; i++ ) {
var _input = node_info.inputs[i];
var _name = _input.name;
var _type = _input.type;
var _valu = _input.value;
var _tooltip = _input[$ "tooltip"] ?? "";
var _showIns = _input[$ "show_in_inspector"] ?? true;
var _showGra = _input[$ "show_in_graph"] ?? false;
var _overl = _input[$ "overlay"];
var _n = noone;
switch(_type) {
case "surface" : _n = nodeValue_Surface( _name, self, _valu); break;
case "float" : _n = nodeValue_Float( _name, self, _valu); break;
case "int" : _n = nodeValue_Int( _name, self, _valu); break;
case "color" : _n = nodeValue_Color( _name, self, _valu); break;
case "dimension" : _n = nodeValue_Dimension(self); break;
case "vec2" : _n = nodeValue_Vec2( _name, self, _valu); break;
case "vec3" : _n = nodeValue_Vec3( _name, self, _valu); break;
case "vec4" : _n = nodeValue_Vec4( _name, self, _valu); break;
case "mat2" : _n = nodeValue_Float( _name, self, _valu).setDisplay(VALUE_DISPLAY.matrix, { size: 2 }); break;
case "mat3" : _n = nodeValue_Float( _name, self, _valu).setDisplay(VALUE_DISPLAY.matrix, { size: 3 }); break;
case "mat4" : _n = nodeValue_Float( _name, self, _valu).setDisplay(VALUE_DISPLAY.matrix, { size: 4 }); break;
}
var _disp = _input[$ "display"];
if(_disp != undefined) {
switch(_disp.type) {
case "enum_button": _n.setDisplay(VALUE_DISPLAY.enum_button, _disp.data); break;
case "enum_scroll": _n.setDisplay(VALUE_DISPLAY.enum_scroll, _disp.data); break;
case "slider": _n.setDisplay(VALUE_DISPLAY.slider, { range: [_disp[$ "min"], _disp[$ "max"], _disp[$ "step"]] }); break;
}
}
newInput(i, _n)
.setTooltip(_tooltip)
.setVisible(_showIns, _showGra);
if(_overl != undefined) {
array_push(node_overlay, _n);
}
}
for( var i = 0, n = array_length(node_info.outputs); i < n; i++ ) {
var _output = node_info.outputs[i];
var _name = _output.name;
var _type = _output.type;
var _valu = _output.value;
var _showGra = _output[$ "show_in_graph"] ?? true;
newOutput(i, nodeValue_Output(_name, self, value_type_from_string(_type), _valu)).setVisible(_showGra);
}
if(struct_has(node_info, "input_display")) input_display_list = node_info.input_display;
if(struct_has(node_info, "output_display")) output_display_list = node_info.output_display;
onParseInfo();
}
static onParseInfo = function() {}
static postBuild = function() { parseInfo(); }
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
var _hov = false;
for( var i = 0, n = array_length(node_overlay); i < n; i++ ) {
var _n = node_overlay[i];
var hv = _n.drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny);
_hov |= hv;
hover &= !hv;
}
return _hov;
}
}