function Node_DynaSurf(_x, _y, _group = noone) : Node_Collection(_x, _y, _group) constructor {
	name  = "Dynamic Surface";
	color = COLORS.node_blend_dynaSurf;
	
	reset_all_child = true;
	draw_input_overlay = false;
	
	newOutput(0, nodeValue_Output("dynaSurf", self, VALUE_TYPE.dynaSurface, noone));
	
	custom_input_index  = array_length(inputs);
	custom_output_index = array_length(outputs);
	
	if(NODE_NEW_MANUAL) { #region
		var _input  = nodeBuild("Node_DynaSurf_In",  -256, -32, self);
		var _output = nodeBuild("Node_DynaSurf_Out",  256, -32, self);
		
		_output.inputs[0].setFrom(_input.outputs[0]);
		
		var _yy   = -32 + 24;
		var _nx   = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("x");		_output.inputs[1].setFrom(_nx  .outputs[0]);  _yy += 24;
		var _ny   = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("y");		_output.inputs[2].setFrom(_ny  .outputs[0]);  _yy += 24;
		var _nsx  = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("sx");		_output.inputs[3].setFrom(_nsx .outputs[0]);  _yy += 24;
		var _nsy  = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("sy");		_output.inputs[4].setFrom(_nsy .outputs[0]);  _yy += 24;
		var _nang = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("angle");	_output.inputs[5].setFrom(_nang.outputs[0]);  _yy += 24;
		var _nclr = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("color");	_output.inputs[6].setFrom(_nclr.outputs[0]);  _yy += 24;
		var _nalp = nodeBuild("Node_PCX_fn_var",  128, _yy, self).setDisplayName("alpha");	_output.inputs[7].setFrom(_nalp.outputs[0]);  _yy += 24;
		
		_nsx.inputs[0].setValue(1);
		_nsy.inputs[0].setValue(1);
		_nclr.inputs[0].setValue(c_white);
		_nalp.inputs[0].setValue(1);
		
		_yy += 64;
		var _outW   = nodeBuild("Node_DynaSurf_Out_Width",   256, _yy, self) 
		var _surW   = nodeBuild("Node_PCX_fn_Surface_Width", 128, _yy, self) 
		
		_surW.inputs[0].setFrom(_input.outputs[0]);
		_outW.inputs[0].setFrom(_surW.outputs[0]);
		
		_yy += 64;
		var _outH   = nodeBuild("Node_DynaSurf_Out_Height",   256, _yy, self) 
		var _surH   = nodeBuild("Node_PCX_fn_Surface_Height", 128, _yy, self) 
		
		_surH.inputs[0].setFrom(_input.outputs[0]);
		_outH.inputs[0].setFrom(_surH.outputs[0]);
		
		RENDER_ALL 
	} #endregion
	
	static setRenderStatus = function(result) { #region
		rendered = result;
		
		if(result)
		for( var i = 0, n = array_length(nodes); i < n; i++ ) {
			var _n = nodes[i];
			
			if(!is_instanceof(_n, Node_DynaSurf_Out) && 
			   !is_instanceof(_n, Node_DynaSurf_Out_Width) &&
			   !is_instanceof(_n, Node_DynaSurf_Out_Height))
				continue;
				
			if(_n.rendered) continue;
			rendered = false;
			break;
		}
		
		if(rendered) exitGroup();
		
		if(!result && group != noone) 
			group.setRenderStatus(result);
	} #endregion
	
	static setDynamicSurface = function() { #region
		var _dyna = new compute_dynaSurf();
		
		for( var i = 0, n = array_length(nodes); i < n; i++ ) {
			var _n = nodes[i];
			
			if(is_instanceof(_n, Node_DynaSurf_Out))
				_dyna.drawFn   = _n.outputs[0].getValue();
			if(is_instanceof(_n, Node_DynaSurf_Out_Width))
				_dyna.widthFn  = _n.outputs[0].getValue();
			if(is_instanceof(_n, Node_DynaSurf_Out_Height))
				_dyna.heightFn = _n.outputs[0].getValue();
		}
		
		outputs[0].setValue(_dyna);
	} #endregion
	
	static update = function() {}
}

function dynaSurf_output_getNextNode() { #region
	if(!is_instanceof(group, Node_DynaSurf)) return [];
		
	var junc  = group.outputs[0];
	var nodes = [];
	for(var j = 0; j < array_length(junc.value_to); j++) {
		var _to = junc.value_to[j];
		if(!_to.node.isRenderActive()) continue;
			
		if(!_to.node.active || _to.value_from == noone) 
			continue; 
		if(_to.value_from.node != group)
			continue; 
			
		array_push(nodes, _to.node);
	}
		
	return nodes;
} #endregion