Pixel-Composer/scripts/node_VFX_triangulate/node_VFX_triangulate.gml
2024-12-02 08:45:17 +07:00

131 lines
No EOL
4.1 KiB
Text

function Node_VFX_Triangulate(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "VFX Triangulate";
color = COLORS.node_blend_vfx;
icon = THEME.vfx;
use_cache = CACHE_USE.auto;
function _Point(part) constructor {
self.part = part;
x = part.x;
y = part.y;
static equal = function(point) { INLINE return x == point.x && y == point.y; }
}
manual_ungroupable = false;
newInput(0, nodeValue_Vec2("Output dimension", self, DEF_SURF ));
newInput(1, nodeValue_Particle("Particles", self, -1 ))
.setVisible(true, true);
newInput(2, nodeValue_Float("Thickness", self, 1 ));
newInput(3, nodeValue_Color("Color", self, cola(c_white) ));
newInput(4, nodeValue_Bool("Inherit Thickness", self, false ));
newInput(5, nodeValue_Bool("Inherit Color", self, false ));
newOutput(0, nodeValue_Output("Triangles", self, VALUE_TYPE.surface, noone));
input_display_list = [ 0,
[ "Particles", false], 1,
[ "Rendering", false], 4, 2, 5, 3,
]
setTrigger(2, "Clear cache", [ THEME.cache, 0, COLORS._main_icon ]);
static onInspector2Update = function() { clearCache(); }
static step = function() {
var _ith = getInputData(4);
var _icl = getInputData(5);
inputs[2].setVisible(!_ith);
inputs[3].setVisible(!_icl);
}
static update = function() {
var _dim = getInputData(0);
var _par = getInputData(1);
var _th = getInputData(2);
var _cl = getInputData(3);
var _ith = getInputData(4);
var _icl = getInputData(5);
var _surf = outputs[0].getValue();
_surf = surface_verify(_surf, _dim[0], _dim[1]);
outputs[0].setValue(_surf);
var _vrx = array_create(array_length(_par));
var _ind = 0;
for( var i = 0, n = array_length(_par); i < n; i++ ) {
var p = _par[i];
if(!p.active) continue;
_vrx[_ind++] = new _Point(p);
}
array_resize(_vrx, _ind);
var tri = delaunay_triangulation(_vrx);
var c0, c1, c2;
surface_set_shader(_surf, noone);
draw_set_color(c_white);
for( var i = 0, n = array_length(tri); i < n; i++ ) {
var t = tri[i];
var p0 = t[0].part;
var p1 = t[1].part;
var p2 = t[2].part;
if(_ith) {
if(_icl) {
draw_line_width2(p0.x, p0.y, p1.x, p1.y, min(p0.scx, p0.scy), min(p1.scx, p1.scy), false, p0.currColor, p1.currColor);
draw_line_width2(p0.x, p0.y, p2.x, p2.y, min(p0.scx, p0.scy), min(p2.scx, p2.scy), false, p0.currColor, p2.currColor);
draw_line_width2(p1.x, p1.y, p2.x, p2.y, min(p1.scx, p1.scy), min(p2.scx, p2.scy), false, p1.currColor, p2.currColor);
} else {
draw_set_color(_cl);
draw_line_width2(p0.x, p0.y, p1.x, p1.y, min(p0.scx, p0.scy), min(p1.scx, p1.scy));
draw_line_width2(p0.x, p0.y, p2.x, p2.y, min(p0.scx, p0.scy), min(p2.scx, p2.scy));
draw_line_width2(p1.x, p1.y, p2.x, p2.y, min(p1.scx, p1.scy), min(p2.scx, p2.scy));
}
} else if(_th == 1) {
if(_icl) {
draw_line_color(p0.x, p0.y, p1.x, p1.y, p0.currColor, p1.currColor);
draw_line_color(p0.x, p0.y, p2.x, p2.y, p0.currColor, p2.currColor);
draw_line_color(p1.x, p1.y, p2.x, p2.y, p1.currColor, p2.currColor);
} else {
draw_set_color(_cl);
draw_line(p0.x, p0.y, p1.x, p1.y);
draw_line(p0.x, p0.y, p2.x, p2.y);
draw_line(p1.x, p1.y, p2.x, p2.y);
}
} else {
if(_icl) {
draw_line_width_color(p0.x, p0.y, p1.x, p1.y, _th, p0.currColor, p1.currColor);
draw_line_width_color(p0.x, p0.y, p2.x, p2.y, _th, p0.currColor, p2.currColor);
draw_line_width_color(p1.x, p1.y, p2.x, p2.y, _th, p1.currColor, p2.currColor);
} else {
draw_set_color(_cl);
draw_line_width(p0.x, p0.y, p1.x, p1.y, _th);
draw_line_width(p0.x, p0.y, p2.x, p2.y, _th);
draw_line_width(p1.x, p1.y, p2.x, p2.y, _th);
}
}
}
surface_reset_shader();
cacheCurrentFrame(_surf);
}
static getPreviewingNode = function() { return is(inline_context, Node_VFX_Group_Inline)? inline_context.getPreviewingNode() : self; }
static getPreviewValues = function() { return is(inline_context, Node_VFX_Group_Inline)? inline_context.getPreviewValues() : self; }
}