function __Dust(x, y, size = 8) constructor { self.x = x; self.y = y; self.size = size; rad = size * 2; ang = 270; px = array_create(5, x); py = array_create(5, y); ps = array_create(5, size); pr = array_create(5, rad); pa = array_create(5, ang); vx = 2.8; vy = -0.2; av = 64; afr = 0.9; vfr = 0.9; static step = function() { for( var i = array_length(px) - 1; i >= 1; i-- ) { px[i] = px[i - 1]; py[i] = py[i - 1]; ps[i] = ps[i - 1]; pr[i] = pr[i - 1]; pa[i] = pa[i - 1]; } x += vx; y += vy; var dist = point_distance(0, 0, vx, vy); var dirr = point_direction(0, 0, vx, vy); dist *= vfr; av *= afr; ang += av / dist; rad = lerp(rad, clamp(dist * 6, 1, 8), 0.5); size *= 0.9; vx = lengthdir_x(dist, dirr); vy = lengthdir_y(dist, dirr); px[0] = x; py[0] = y; ps[0] = size; pr[0] = rad; pa[0] = ang; } static draw = function() { draw_set_color(c_grey); for( var i = 0, n = array_length(px) - 1; i < n; i++ ) { var dist = ceil(point_distance(px[i], py[i], px[i + 1], px[i + 1])); for( var j = 0; j < dist; j++ ) { var _x = lerp(px[i], px[i + 1], j / dist); var _y = lerp(py[i], py[i + 1], j / dist); var _s = lerp(ps[i], ps[i + 1], j / dist); var _r = lerp(pr[i], pr[i + 1], j / dist); var _a = lerp(pa[i], pa[i + 1], j / dist); var _px = _x + lengthdir_x(_r, _a); var _py = _y + lengthdir_y(_r, _a); if(size <= 1) draw_point(_px, _py); else draw_circle(_px, _py, _s / 2, false); } //draw_circle(px[i], py[i], pr[i], true); } } } function Node_Dust(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { name = "Dust"; newInput(0, nodeValue_Dimension(self)); newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone)); input_display_list = [ ["Output", false], 0, ["Solid", false], ]; attribute_surface_depth(); dusts = [ ]; static update = function() { var _dim = getInputData(0); var _outSurf = outputs[0].getValue(); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); outputs[0].setValue(_outSurf); if(IS_FIRST_FRAME) { dusts = [ new __Dust( 0, _dim[1] / 2 ) ]; } else { for( var i = 0, n = array_length(dusts); i < n; i++ ) dusts[i].step(); } surface_set_target(_outSurf); DRAW_CLEAR for( var i = 0, n = array_length(dusts); i < n; i++ ) dusts[i].draw(); surface_reset_target(); } }