mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2024-12-25 14:36:13 +01:00
136 lines
No EOL
4.6 KiB
Text
136 lines
No EOL
4.6 KiB
Text
function Node_Scatter_Points(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
|
|
name = "Scatter Points";
|
|
color = COLORS.node_blend_number;
|
|
|
|
w = 96;
|
|
|
|
onSurfaceSize = function() { return getInputData(7, DEF_SURF); };
|
|
inputs[| 0] = nodeValue("Point area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ DEF_SURF_W / 2, DEF_SURF_H / 2, DEF_SURF_W / 2, DEF_SURF_H / 2, AREA_SHAPE.rectangle ])
|
|
.setDisplay(VALUE_DISPLAY.area, { onSurfaceSize });
|
|
|
|
inputs[| 1] = nodeValue("Point distribution", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
|
|
.setDisplay(VALUE_DISPLAY.enum_button, [ "Area", "Border", "Map" ])
|
|
.rejectArray();
|
|
|
|
inputs[| 2] = nodeValue("Scatter", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1)
|
|
.setDisplay(VALUE_DISPLAY.enum_button, [ "Uniform", "Random" ])
|
|
.rejectArray();
|
|
|
|
inputs[| 3] = nodeValue("Point amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 2, "Amount of particle spawn in that frame.")
|
|
.rejectArray();
|
|
|
|
inputs[| 4] = nodeValue("Distribution map", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0)
|
|
.rejectArray();
|
|
|
|
inputs[| 5] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999))
|
|
.rejectArray();
|
|
|
|
inputs[| 6] = nodeValue("Fixed position", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Fix point position, and only select point in the area.");
|
|
|
|
inputs[| 7] = nodeValue("Reference dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF)
|
|
.setDisplay(VALUE_DISPLAY.vector);
|
|
|
|
inputs[| 8] = nodeValue("Reference value", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
|
|
|
inputs[| 9] = nodeValue("Output 3D", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
|
|
|
|
inputs[| 10] = nodeValue("Normal", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
|
|
.setDisplay(VALUE_DISPLAY.enum_button, [ "X", "Y", "Z" ]);
|
|
|
|
inputs[| 11] = nodeValue("Plane position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0);
|
|
|
|
input_display_list = [
|
|
["Base", false], 5, 6, 7,
|
|
["Scatter", false], 0, 1, 4, 2, 3,
|
|
["3D", true], 9, 10, 11
|
|
];
|
|
|
|
outputs[| 0] = nodeValue("Points", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, [ ])
|
|
.setDisplay(VALUE_DISPLAY.vector);
|
|
|
|
static step = function() { #region
|
|
var _dist = getInputData(1);
|
|
|
|
inputs[| 2].setVisible(_dist != 2);
|
|
inputs[| 4].setVisible(_dist == 2, _dist == 2);
|
|
} #endregion
|
|
|
|
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
|
|
inputs[| 0].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
|
|
} #endregion
|
|
|
|
static getPreviewValues = function() { return inputs[| 8].getValue(); }
|
|
|
|
static update = function(frame = CURRENT_FRAME) { #region
|
|
var _area = getInputData(0);
|
|
var _dist = getInputData(1);
|
|
var _scat = getInputData(2);
|
|
var _amo = getInputData(3);
|
|
var _distMap = getInputData(4);
|
|
var _seed = getInputData(5);
|
|
var _fix = getInputData(6);
|
|
var _fixRef = getInputData(7);
|
|
|
|
var _3d = getInputData( 9);
|
|
__temp_3dNorm = getInputData(10);
|
|
__temp_3dPos = getInputData(11);
|
|
|
|
inputs[| 7].setVisible(_fix);
|
|
var pos = [];
|
|
|
|
if(_fix) {
|
|
var ref = getInputData(8);
|
|
ref = surface_verify(ref, _fixRef[0], _fixRef[1]);
|
|
inputs[| 8].setValue(ref);
|
|
}
|
|
|
|
var aBox = area_get_bbox(_area);
|
|
|
|
if(_dist != 2) {
|
|
pos = [];
|
|
for( var i = 0; i < _amo; i++ ) {
|
|
if(_fix) {
|
|
var p = area_get_random_point([_fixRef[0], _fixRef[1], _fixRef[0], _fixRef[1]], _dist, _scat, i, _amo, _seed++);
|
|
if(point_in_rectangle(p[0], p[1], aBox[0], aBox[1], aBox[2], aBox[3]))
|
|
array_push(pos, p);
|
|
} else
|
|
pos[i] = area_get_random_point(_area, _dist, _scat, i, _amo, _seed++);
|
|
}
|
|
} else {
|
|
pos = [];
|
|
var p = get_points_from_dist(_distMap, _amo, _seed, 8);
|
|
for( var i = 0, n = array_length(p); i < n; i++ ) {
|
|
if(p[i] == 0) continue;
|
|
if(_fix) {
|
|
p[i][0] *= _fixRef[0];
|
|
p[i][1] *= _fixRef[1];
|
|
} else {
|
|
p[i][0] = _area[0] + _area[2] * (p[i][0] * 2 - 1);
|
|
p[i][1] = _area[1] + _area[3] * (p[i][1] * 2 - 1);
|
|
}
|
|
|
|
array_push(pos, p[i]);
|
|
}
|
|
}
|
|
|
|
if(_3d)
|
|
pos = array_map(pos, function(value, index) {
|
|
var val = value;
|
|
|
|
switch(__temp_3dNorm) {
|
|
case 0 : val = [ __temp_3dPos, value[0], value[1] ]; break;
|
|
case 1 : val = [ value[0], __temp_3dPos, value[1] ]; break;
|
|
case 2 : val = [ value[0], value[1], __temp_3dPos ]; break;
|
|
}
|
|
|
|
return val;
|
|
});
|
|
|
|
outputs[| 0].setValue(pos);
|
|
} #endregion
|
|
|
|
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
|
|
var bbox = drawGetBbox(xx, yy, _s);
|
|
draw_sprite_fit(s_node_scatter_point, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
|
|
} #endregion
|
|
} |