function Node_MK_Subpixel(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
	name = "MK Subpixel";
	
	newInput(0, nodeValue_Dimension(self));
	
	newInput(1, nodeValue_Enum_Scroll("Type", self, 0, [ "Hex Disc", "Strip", "Linear Block", "Linear Block offset", "Chevron", "Square", "Square Non-Uniform" ]));
	
	newInput(2, nodeValue_Int("Density", self, 8));
	
	newInput(3, nodeValue_Float("Size", self, .6))
	    .setDisplay(VALUE_DISPLAY.slider);
	
	newInput(4, nodeValue_Float("Blur", self, .1))
	    .setDisplay(VALUE_DISPLAY.slider);
	
	newInput(5, nodeValue_Float("Noise", self, .1))
	    .setDisplay(VALUE_DISPLAY.slider);
	
	newInput(6, nodeValue_Float("Intensity", self, 1))
	    .setDisplay(VALUE_DISPLAY.slider);
	
	newInput(7, nodeValue_Surface("Surface", self));
	
	newInput(8, nodeValueSeed(self));
	
	newInput(9, nodeValue_Float("Ridge amount", self, 8));
	
	newInput(10, nodeValue_Float("Ridge Intensity", self, 1))
	    .setDisplay(VALUE_DISPLAY.slider);
	
	newInput(11, nodeValue_Bool("Ridge", self, false));
	
	newInput(12, nodeValue_Float("Scene Scale", self, 1));
	
	newInput(13, nodeValue_Bool("Flicker", self, false));
	
	newInput(14, nodeValue_Float("Flicker Intensity", self, .2))
		.setDisplay(VALUE_DISPLAY.slider);
	
	newInput(15, nodeValue_Float("Flicker Frequency", self, 4))
	
	newInput(16, nodeValue_Float("Flicker Cut", self, .5))
		.setDisplay(VALUE_DISPLAY.slider);
	
	input_display_list = [ new Inspector_Sprite(s_MKFX), 7, 
		["Subpixel", false],      1,  2, 12, 
		["Effect",   false],      3,  4,  8, 
		["Ridge",    false, 11],  9, 10, 
		["Render",   false],      6,  5, 
		["Flicker",  false, 13], 14, 15, 16, 
	];
	
	newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone));
	
	static processData = function(_outSurf, _data, _output_index, _array_index) {
		var _type = _data[1];
		var _scal = _data[2];
		var _size = _data[3];
		var _blur = _data[4];
		var _nise = _data[5];
		var _ints = _data[6];
		var _surf = _data[7];
		var _seed = _data[8];
		var _rgcn = _data[9];
		var _rgin = _data[10];
		var _ruse = _data[11];
		var _scns = _data[12];
		var _flku = _data[13];
		var _flki = _data[14];
		var _flkf = _data[15];
		var _flkc = _data[16];
		
		update_on_frame = _flku;
		
		if(!is_surface(_surf)) return _outSurf;
		
		var _dim = surface_get_dimension(_surf);
		var sh   = sh_mk_subpixel_hex_disc;
		_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
		
		switch(_type) {
    	    case 0 : sh = sh_mk_subpixel_hex_disc;				break;
    	    case 1 : sh = sh_mk_subpixel_linear;				break;
    	    case 2 : sh = sh_mk_subpixel_linear_block;  		break;
    	    case 3 : sh = sh_mk_subpixel_linear_block_offset;  	break;
    	    case 4 : sh = sh_mk_subpixel_chevron;  				break;
    	    case 5 : sh = sh_mk_subpixel_square;  				break;
    	    case 6 : sh = sh_mk_subpixel_square_non;			break;
    	    case 7 : sh = sh_mk_subpixel_diagonal;				break;
    	}
		
		surface_set_shader(_outSurf, sh);
			shader_set_surface("texture", _surf);
			shader_set_f("dimension",     _dim);
			shader_set_f("seed",          _seed / 10000);
			shader_set_f("scale",         _scal);
			shader_set_f("size",          _size);
			shader_set_f("blur",          _blur);
			shader_set_f("noise",         _nise);
			shader_set_f("intensity",     _ints);
			
			shader_set_i("ridgeUse",      _ruse);
			shader_set_f("ridgeCount",    _rgcn);
			shader_set_f("ridgeIntens",   _rgin);
			
			shader_set_i("flickerUse",      _flku);
			shader_set_f("flickerIntens",   _flki);
			shader_set_f("flickerCut",      _flkc);
			shader_set_f("flickerTime",     (CURRENT_FRAME / TOTAL_FRAMES) * pi * _flkf);
			
			var _cx = _dim[0] / 2;
			var _cy = _dim[1] / 2;
			var _px = _cx - _dim[0] * _scns / 2;
			var _py = _cy - _dim[1] * _scns / 2;
			
			draw_surface_ext(_surf, _px, _py, _scns, _scns, 0, c_white, 1);
		surface_reset_shader();
		
		return _outSurf;
	}
}