Just finished my supper :) Now I'm ready to explain how to write nodes for the last version of nodeeditor.
this is an example. check the comments
code:
function Star() // let's make a new node
{
this.addInput("Center","pointarray"); // input 0, type: pointarray
this.addInput("Radius","numarray"); // input 1, type: numarray. In fact it's just a common numeric array like [1,2,3,4,5]
this.addInput("Ratio","numarray"); // input 2, type: numarray
this.addInput("Sides","numarray"); // input 3, type: numarray
this.addOutput("Out","objectlist"); // output 0, type: objectlist
this.properties = { mode:["Long","Long","Short"], radius:[1], ratio:[0.4], sides:[5] };
// each node has two types of properties. both of them will stored when you save a .nod file, or clone a node
// there are only one difference: .properties is shown in nodeinfo panel and .internal is hidden
// string arrays like mode:["Long","Long","Short"] will be processed as a droplist. First value "Long" points to selected value. Other ones is available values: "Long", "Short".
// numeric arrays will be processed as numarrays
}
Star.title = "Star"; // default title
Star.desc = "Star"; // legacy litegraph parameter. At the moment I don't use it.
Star.prototype.onExecute = function() // this function will run on node execution command
{
var data = this.processInOut(this.properties.mode[0], this.multiProcess, null, this.properties.radius, this.properties.ratio, this.properties.sides);
// .processInOut function processes input arrays and creates output arrays
// first parameter: (string) array processing mode.
// modes supported:
// Short, Long as described above in my post
// Short+, Long+ same as Short, Long, but objectarray will be processed as one element
// Long# same as Long, but pointarray will be processed as one element
// second parameter: callback function which will be called for processing of each value set (important!)
// other parameters is optional. it's a default values for each input, which will be used if the input is not connected
// you may skip it or set it to null. in this case processInOut function will generate default value automatically.
// autovalue for numarray: [0]
// autovalue for pointarray: (0,0,0)
// autovalue for objectlist: empty objectlist
// if you want to use another values, you need to set them directly like in this example:
// null - autovalue(0,0,0), this.properties.radius - [1], this.properties.ratio - [0.4], this.properties.sides - [5]
// this function returns structure { inputs:[ input0, input1, ... input n], outputs:[output0, output1, ... output n]}
// input0, input1, ... input n - if the input connected, it wil return connected node data
// output0, output1, ... output n - returns concated output data generated by callback function for each output
this.properties.radius = data.inputs[1]; // you can update properties values if input data is changed
this.properties.ratio = data.inputs[2];
this.properties.sides = data.inputs[3];
this.setOutputData(0, data.outputs[0]); // set node output data
}
Star.prototype.multiProcess = function(center, r, rt, s) // callback function which will be called for processing of each value set (center = input0, r = input1, rt = input2, s = input3)
{
// object array data will be sent as objectarray with one object (except Long+ Short+ modes)
// point array data will be sent as pointarray with one object (except Long# mode)
// numarray data will be sent as number
var frame = center.getFrame(); // center.getFrame() = center.getFrame(0);
return [factory( 'polygonstar', frame, frame.evaluate( 0, r, 0 ), s, frame.evaluate( 0, r*rt, 0 ))];
// this function should return array [ output0, output1, ... output n ]
// return [factory( 'polygonstar', frame, frame.evaluate( 0, r, 0 ), s, frame.evaluate( 0, r*rt, 0 ))]
// is the same as
// var outputs = [];
// outputs[0] = factory( 'polygonstar', frame, frame.evaluate( 0, r, 0 ), s, frame.evaluate( 0, r*rt, 0 ));
// return outputs;
// if node has more than one output you nned to set outputs[1], outputs[2] .. etc
// correct output[n] data is objectlist / pointarray / number
}
LiteGraph.registerNodeType("Curves/Star", Star);