Pixel-Composer/scripts/node_functions/node_functions.gml
2023-02-19 19:49:20 +07:00

132 lines
4.1 KiB
Plaintext

#macro def_surf_size PREF_MAP[? "default_surface_side"]
#macro def_surf_size2 [PREF_MAP[? "default_surface_side"], PREF_MAP[? "default_surface_side"]]
#region
function node_draw_transform_init() {
drag_type = -1;
dragging_sx = 0;
dragging_sy = 0;
dragging_mx = 0;
dragging_my = 0;
rot_anc_x = 0;
rot_anc_y = 0;
}
function node_draw_transform_box(active, _x, _y, _s, _mx, _my, _snx, _sny, _posInd, _rotInd, _scaInd) {
var _pos = inputs[| _posInd].getValue();
var _rot = inputs[| _rotInd].getValue();
var _sca = inputs[| _scaInd].getValue();
if(drag_type > -1) {
if(drag_type == 0) {
var _dx = (_mx - dragging_mx) / _s;
var _dy = (_my - dragging_my) / _s;
if(key_mod_press(SHIFT)) {
if(abs(_dx) > abs(_dy) + ui(16))
_dy = 0;
else if(abs(_dy) > abs(_dx) + ui(16))
_dx = 0;
else {
_dx = max(_dx, _dy);
_dy = _dx;
}
}
_pos[0] = value_snap(dragging_sx + _dx, _snx);
_pos[1] = value_snap(dragging_sy + _dy, _sny);
if(inputs[| _posInd].setValue(_pos))
UNDO_HOLDING = true;
if(inputs[| _posInd].unit.mode == VALUE_UNIT.reference) {
var p = [ _pos[0], _pos[1] ];
_pos = inputs[| _posInd].unit.apply(p);
}
} else if(drag_type == 1) {
var aa = point_direction(rot_anc_x, rot_anc_y, _mx, _my);
var da = angle_difference(dragging_mx, aa);
if(key_mod_press(CTRL))
_rot = round((dragging_sx - da) / 15) * 15;
else
_rot = dragging_sx - da;
if(inputs[| _rotInd].setValue(_rot))
UNDO_HOLDING = true;
} else if(drag_type == 2) {
var _p = point_rotate(_mx - dragging_mx, _my - dragging_my, 0, 0, -_rot);
_sca[0] = _p[0] / _s;
_sca[1] = _p[1] / _s;
if(key_mod_press(SHIFT)) {
_sca[0] = min(_sca[0], _sca[1]);
_sca[1] = min(_sca[0], _sca[1]);
}
if(inputs[| _scaInd].setValue(_sca))
UNDO_HOLDING = true;
}
if(mouse_release(mb_left)) {
drag_type = -1;
UNDO_HOLDING = false;
}
}
var p0 = point_rotate(-_sca[0], -_sca[1], 0, 0, _rot);
var p1 = point_rotate( _sca[0], -_sca[1], 0, 0, _rot);
var p2 = point_rotate(-_sca[0], _sca[1], 0, 0, _rot);
var p3 = point_rotate( _sca[0], _sca[1], 0, 0, _rot);
var pr = point_rotate( 0, -_sca[1] - 1, 0, 0, _rot);
var pd0x = _x + (p0[0] + _pos[0]) * _s; var pd0y = _y + (p0[1] + _pos[1]) * _s;
var pd1x = _x + (p1[0] + _pos[0]) * _s; var pd1y = _y + (p1[1] + _pos[1]) * _s;
var pd2x = _x + (p2[0] + _pos[0]) * _s; var pd2y = _y + (p2[1] + _pos[1]) * _s;
var pd3x = _x + (p3[0] + _pos[0]) * _s; var pd3y = _y + (p3[1] + _pos[1]) * _s;
var prx = _x + (pr[0] + _pos[0]) * _s; var pry = _y + (pr[1] + _pos[1]) * _s;
var hovering = -1;
if(drag_type == -1) {
if(point_in_rectangle_points(_mx, _my, pd0x, pd0y, pd1x, pd1y, pd2x, pd2y, pd3x, pd3y))
hovering = 0;
if(point_in_circle(_mx, _my, prx, pry, 12))
hovering = 1;
if(point_in_circle(_mx, _my, pd3x, pd3y, 12))
hovering = 2;
}
draw_set_color(COLORS._main_accent);
draw_line_width(pd0x, pd0y, pd1x, pd1y, hovering == 0? 2 : 1);
draw_line_width(pd0x, pd0y, pd2x, pd2y, hovering == 0? 2 : 1);
draw_line_width(pd3x, pd3y, pd1x, pd1y, hovering == 0? 2 : 1);
draw_line_width(pd3x, pd3y, pd2x, pd2y, hovering == 0? 2 : 1);
draw_sprite_ui_uniform(THEME.anchor_rotate, hovering == 1, prx, pry,,,, _rot);
draw_sprite_ui_uniform(THEME.anchor_scale, hovering == 2, pd3x, pd3y,,,, _rot);
if(hovering == -1) return;
if(drag_type > -1) return;
if(mouse_press(mb_left, active)) {
drag_type = hovering;
if(hovering == 0) {
dragging_sx = _pos[0];
dragging_sy = _pos[1];
dragging_mx = _mx;
dragging_my = _my;
} else if(hovering == 1) { //rot
dragging_sx = _rot;
rot_anc_x = _x + _pos[0] * _s;
rot_anc_y = _y + _pos[1] * _s;
dragging_mx = point_direction(rot_anc_x, rot_anc_y, _mx, _my);
} else if(hovering == 2) { //sca
dragging_sx = _sca[0];
dragging_sy = _sca[1];
dragging_mx = _x + _pos[0] * _s;
dragging_my = _y + _pos[1] * _s;
}
}
}
#endregion