2023-02-28 09:43:01 +01:00
|
|
|
function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
|
2022-01-13 05:24:03 +01:00
|
|
|
name = "Scatter";
|
2023-02-14 05:32:32 +01:00
|
|
|
dimension_index = 1;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 1] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2 )
|
2022-01-13 05:24:03 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.vector);
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 2] = nodeValue("Amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 8);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 3] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1, 1, 1 ] )
|
2022-01-13 05:24:03 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.vector_range);
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 4] = nodeValue("Angle", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [0, 0])
|
2022-01-13 05:24:03 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.rotation_range);
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 5] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ def_surf_size / 2, def_surf_size / 2, def_surf_size / 2, def_surf_size / 2, AREA_SHAPE.rectangle ])
|
2022-01-19 03:05:13 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.area, function() { return inputs[| 1].getValue(); });
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 6] = nodeValue("Distribution", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
|
|
|
|
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Area", "Border", "Map", "Direct Data" ]);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 7] = nodeValue("Point at center", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Rotate each copy to face the spawn center.");
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 8] = nodeValue("Uniform scaling", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 9] = nodeValue("Scatter", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1)
|
2022-01-19 03:05:13 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.enum_button, [ "Uniform", "Random" ]);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 10] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(9999999));
|
2023-01-17 08:11:55 +01:00
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
inputs[| 11] = nodeValue("Random blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, new gradientObject(c_white) )
|
2023-01-17 08:11:55 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.gradient);
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 12] = nodeValue("Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
|
2023-01-17 08:11:55 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.slider_range, [0, 1, 0.01]);
|
2023-02-14 05:32:32 +01:00
|
|
|
|
|
|
|
inputs[| 13] = nodeValue("Distribution map", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
|
|
|
|
|
|
|
inputs[| 14] = nodeValue("Distribution data", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [])
|
|
|
|
.setDisplay(VALUE_DISPLAY.vector);
|
2023-02-21 04:48:50 +01:00
|
|
|
inputs[| 14].array_depth = 1;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-19 02:13:19 +01:00
|
|
|
inputs[| 15] = nodeValue("Array", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0, @"What to do when input array of surface.
|
|
|
|
- Spread: Create Array of output each scattering single surface.
|
|
|
|
- Mixed: Create single output scattering multiple images.")
|
2023-02-14 05:32:32 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Spread output", "Mixed" ]);
|
|
|
|
|
2023-02-19 02:13:19 +01:00
|
|
|
inputs[| 16] = nodeValue("Multiply alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);
|
|
|
|
|
2023-02-21 04:48:50 +01:00
|
|
|
inputs[| 17] = nodeValue("Use value", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, [ "Scale" ])
|
|
|
|
.setDisplay(VALUE_DISPLAY.text_array, [ "Scale", "Rotation", "Color" ]);
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
input_display_list = [
|
|
|
|
["Surface", false], 0, 1, 15, 10,
|
2023-02-21 04:48:50 +01:00
|
|
|
["Scatter", false], 5, 6, 13, 14, 17, 9, 2,
|
2023-01-17 08:11:55 +01:00
|
|
|
["Transform", false], 3, 8, 7, 4,
|
2023-02-19 02:13:19 +01:00
|
|
|
["Render", false], 11, 12, 16,
|
2022-01-13 05:24:03 +01:00
|
|
|
];
|
|
|
|
|
2023-03-19 09:17:39 +01:00
|
|
|
attribute_surface_depth();
|
|
|
|
|
2022-12-19 13:35:30 +01:00
|
|
|
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
|
2023-02-21 04:48:50 +01:00
|
|
|
if(process_amount > 1) return;
|
|
|
|
|
|
|
|
var _distType = current_data[6];
|
|
|
|
if(_distType < 3)
|
|
|
|
inputs[| 5].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
static onValueUpdate = function(index) {
|
|
|
|
if(index == 15) {
|
|
|
|
var _arr = inputs[| 15].getValue();
|
2023-02-21 04:48:50 +01:00
|
|
|
inputs[| 0].array_depth = _arr;
|
2023-02-14 05:32:32 +01:00
|
|
|
|
|
|
|
doUpdate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static step = function() {
|
|
|
|
var _dis = inputs[| 6].getValue();
|
|
|
|
var _arr = inputs[| 15].getValue();
|
2023-02-21 04:48:50 +01:00
|
|
|
inputs[| 0].array_depth = _arr;
|
2023-02-14 05:32:32 +01:00
|
|
|
|
|
|
|
inputs[| 13].setVisible(_dis == 2, _dis == 2);
|
|
|
|
inputs[| 14].setVisible(_dis == 3, _dis == 3);
|
2023-02-21 04:48:50 +01:00
|
|
|
inputs[| 17].setVisible(_dis == 3);
|
2023-02-14 05:32:32 +01:00
|
|
|
inputs[| 9].setVisible(_dis != 2);
|
|
|
|
}
|
|
|
|
|
2023-01-01 02:06:02 +01:00
|
|
|
static process_data = function(_outSurf, _data, _output_index, _array_index) {
|
2023-02-14 05:32:32 +01:00
|
|
|
var _inSurf = _data[0];
|
2022-01-13 05:24:03 +01:00
|
|
|
if(_inSurf == 0)
|
|
|
|
return;
|
|
|
|
|
2022-12-22 03:09:55 +01:00
|
|
|
var _dim = _data[1];
|
|
|
|
var _amount = _data[2];
|
|
|
|
var _scale = _data[3];
|
|
|
|
var _rota = _data[4];
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2022-12-22 03:09:55 +01:00
|
|
|
var _area = _data[5];
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
var _dist = _data[ 6];
|
|
|
|
var _distMap = _data[13];
|
|
|
|
var _distData = _data[14];
|
|
|
|
var _scat = _data[ 9];
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2022-12-22 03:09:55 +01:00
|
|
|
var _pint = _data[7];
|
|
|
|
var _unis = _data[8];
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2022-12-22 03:09:55 +01:00
|
|
|
var seed = _data[10];
|
2023-01-17 08:11:55 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
var color = _data[11];
|
2023-01-17 08:11:55 +01:00
|
|
|
var alpha = _data[12];
|
2023-02-19 02:13:19 +01:00
|
|
|
var mulpA = _data[16];
|
2023-02-21 04:48:50 +01:00
|
|
|
var useV = _data[17];
|
2022-01-13 05:24:03 +01:00
|
|
|
|
|
|
|
var _in_w, _in_h;
|
|
|
|
|
2023-02-21 04:48:50 +01:00
|
|
|
var vSca = array_exists(useV, "Scale");
|
|
|
|
var vRot = array_exists(useV, "Rotation");
|
|
|
|
var vCol = array_exists(useV, "Color");
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
var _posDist = [];
|
|
|
|
if(_dist == 2 && is_surface(_distMap))
|
2023-02-23 07:02:19 +01:00
|
|
|
_posDist = get_points_from_dist(_distMap, _amount, seed);
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
surface_set_target(_outSurf);
|
2023-03-19 09:17:39 +01:00
|
|
|
DRAW_CLEAR
|
2023-02-19 02:13:19 +01:00
|
|
|
if(mulpA) BLEND_ALPHA_MULP;
|
|
|
|
else BLEND_ALPHA;
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
var _sed = seed;
|
|
|
|
var res_index = 0, bg = 0;
|
|
|
|
for(var i = 0; i < _amount; i++) {
|
|
|
|
var sp = noone, _x = 0, _y = 0;
|
2023-02-21 04:48:50 +01:00
|
|
|
var _v = noone;
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
if(_dist < 2) {
|
|
|
|
sp = area_get_random_point(_area, _dist, _scat, i, _amount, _sed); _sed += 20;
|
|
|
|
_x = sp[0];
|
|
|
|
_y = sp[1];
|
|
|
|
} else if(_dist == 2) {
|
|
|
|
sp = array_safe_get(_posDist, i);
|
|
|
|
if(!is_array(sp)) continue;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
_x = _area[0] + _area[2] * (sp[0] * 2 - 1.);
|
|
|
|
_y = _area[1] + _area[3] * (sp[1] * 2 - 1.);
|
|
|
|
} else if(_dist == 3) {
|
|
|
|
sp = array_safe_get(_distData, i);
|
|
|
|
if(!is_array(sp)) continue;
|
2023-02-19 02:13:19 +01:00
|
|
|
|
2023-02-21 04:48:50 +01:00
|
|
|
_x = array_safe_get(sp, 0);
|
|
|
|
_y = array_safe_get(sp, 1);
|
|
|
|
_v = array_safe_get(sp, 2, noone);
|
2023-02-14 05:32:32 +01:00
|
|
|
}
|
2023-02-21 04:48:50 +01:00
|
|
|
|
|
|
|
var posS = seed + _y * _dim[0] + _x;
|
|
|
|
var _scx = random_range_seed(_scale[0], _scale[1], posS); posS++;
|
|
|
|
var _scy = random_range_seed(_scale[2], _scale[3], posS); posS++;
|
2023-02-14 05:32:32 +01:00
|
|
|
if(_unis) _scy = _scx;
|
|
|
|
|
2023-02-21 04:48:50 +01:00
|
|
|
if(vSca && _v != noone) {
|
|
|
|
_scx *= _v;
|
|
|
|
_scy *= _v;
|
|
|
|
}
|
|
|
|
|
|
|
|
var _r = (_pint? point_direction(_area[0], _area[1], _x, _y) : 0) + random_range_seed(_rota[0], _rota[1], posS); posS++;
|
|
|
|
|
|
|
|
if(vRot && _v != noone)
|
|
|
|
_r *= _v;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
var surf = _inSurf;
|
|
|
|
if(is_array(_inSurf))
|
2023-02-21 04:48:50 +01:00
|
|
|
surf = _inSurf[irandom_seed(array_length(_inSurf) - 1, posS)]; posS++;
|
2022-01-13 05:24:03 +01:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
var sw = surface_get_width(surf);
|
|
|
|
var sh = surface_get_height(surf);
|
2022-05-17 14:39:12 +02:00
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
if(_dist != AREA_DISTRIBUTION.area || _scat != AREA_SCATTER.uniform) {
|
|
|
|
var p = point_rotate(-sw / 2 * _scx, -sh * _scy / 2, 0, 0, _r);
|
|
|
|
_x += p[0];
|
|
|
|
_y += p[1];
|
|
|
|
}
|
2023-02-21 04:48:50 +01:00
|
|
|
|
|
|
|
var grSamp = random_seed(1, posS); posS++;
|
|
|
|
if(vCol && _v != noone)
|
|
|
|
grSamp *= _v;
|
|
|
|
|
2023-03-02 07:59:14 +01:00
|
|
|
var clr = color.eval(grSamp);
|
2023-02-21 04:48:50 +01:00
|
|
|
var alp = random_range_seed(alpha[0], alpha[1], posS); posS++;
|
2023-02-14 05:32:32 +01:00
|
|
|
|
|
|
|
draw_surface_ext_safe(surf, _x, _y, _scx, _scy, _r, clr, alp);
|
|
|
|
}
|
|
|
|
BLEND_NORMAL;
|
2022-12-27 04:00:50 +01:00
|
|
|
surface_reset_target();
|
2022-12-22 03:09:55 +01:00
|
|
|
|
|
|
|
return _outSurf;
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|
|
|
|
|
2023-02-14 05:32:32 +01:00
|
|
|
static doApplyDeserialize = function() {
|
|
|
|
var _arr = inputs[| 15].getValue();
|
2023-02-21 04:48:50 +01:00
|
|
|
inputs[| 0].array_depth = _arr;
|
2023-02-14 05:32:32 +01:00
|
|
|
|
|
|
|
doUpdate();
|
|
|
|
}
|
2022-01-13 05:24:03 +01:00
|
|
|
}
|