2023-03-05 07:16:44 +01:00
|
|
|
function Node_Crop_Content(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
|
|
|
|
name = "Crop Content";
|
|
|
|
|
|
|
|
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
|
|
|
|
|
|
|
inputs[| 1] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);
|
|
|
|
|
2024-01-16 09:56:20 +01:00
|
|
|
inputs[| 2] = nodeValue("Array Sizing", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1, "Cropping mode for dealing with image array.")
|
2023-03-05 07:16:44 +01:00
|
|
|
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Largest, same size", "Independent" ]);
|
2023-03-19 09:17:39 +01:00
|
|
|
|
|
|
|
inputs[| 3] = nodeValue("Padding", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0, 0, 0, 0 ], "Add padding back after crop.")
|
|
|
|
.setDisplay(VALUE_DISPLAY.padding);
|
2023-03-05 07:16:44 +01:00
|
|
|
|
|
|
|
outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
|
|
|
|
|
|
|
|
input_display_list = [ 1,
|
2023-11-08 14:37:51 +01:00
|
|
|
["Surfaces", false], 0, 2,
|
2023-03-19 09:17:39 +01:00
|
|
|
["Padding", false], 3,
|
2023-03-05 07:16:44 +01:00
|
|
|
]
|
|
|
|
|
2023-03-19 09:17:39 +01:00
|
|
|
attribute_surface_depth();
|
|
|
|
|
2023-03-05 07:16:44 +01:00
|
|
|
drag_side = -1;
|
|
|
|
drag_mx = 0;
|
|
|
|
drag_my = 0;
|
|
|
|
drag_sv = 0;
|
|
|
|
|
2023-11-23 13:39:35 +01:00
|
|
|
temp_surface = [ surface_create(1, 1, surface_r32float), surface_create(1, 1, surface_r32float) ];
|
2023-03-05 07:16:44 +01:00
|
|
|
|
|
|
|
static update = function() {
|
2023-10-02 08:57:44 +02:00
|
|
|
var _inSurf = getInputData(0);
|
|
|
|
var _active = getInputData(1);
|
|
|
|
var _array = getInputData(2);
|
|
|
|
var _padd = getInputData(3);
|
2023-03-05 07:16:44 +01:00
|
|
|
|
|
|
|
var _outSurf = outputs[| 0].getValue();
|
|
|
|
surface_array_free(_outSurf);
|
|
|
|
|
|
|
|
if(!_active) {
|
|
|
|
_outSurf = surface_array_clone(_inSurf);
|
|
|
|
outputs[| 0].setValue(_outSurf);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var _arr = is_array(_inSurf);
|
2023-11-23 13:39:35 +01:00
|
|
|
_array &= _arr;
|
|
|
|
|
|
|
|
if(!is_array(_inSurf) && !is_surface(_inSurf)) return;
|
|
|
|
if( is_array(_inSurf) && array_empty(_inSurf)) return;
|
|
|
|
|
2023-03-05 07:16:44 +01:00
|
|
|
if(!_arr) _inSurf = [ _inSurf ];
|
2023-09-19 20:43:02 +02:00
|
|
|
var _amo = array_length(_inSurf);
|
|
|
|
|
|
|
|
var minx = _array? array_create(_amo) : 999999;
|
|
|
|
var miny = _array? array_create(_amo) : 999999;
|
|
|
|
var maxx = _array? array_create(_amo) : 0;
|
|
|
|
var maxy = _array? array_create(_amo) : 0;
|
2023-03-19 09:17:39 +01:00
|
|
|
var cDep = attrDepth();
|
2023-03-05 07:16:44 +01:00
|
|
|
|
2023-09-19 20:43:02 +02:00
|
|
|
for( var j = 0; j < _amo; j++ ) {
|
2023-03-05 07:16:44 +01:00
|
|
|
var _surf = _inSurf[j];
|
|
|
|
|
2023-09-19 20:43:02 +02:00
|
|
|
var _dim = [ surface_get_width_safe(_surf), surface_get_height_safe(_surf) ];
|
2023-11-23 13:39:35 +01:00
|
|
|
var _minx = 0, _miny = 0, _maxx = _dim[0] - 1, _maxy = _dim[1] - 1;
|
2023-06-13 14:42:06 +02:00
|
|
|
|
2023-11-23 13:39:35 +01:00
|
|
|
temp_surface[0] = surface_verify(temp_surface[0], _dim[0], _dim[1], surface_r32float);
|
|
|
|
temp_surface[1] = surface_verify(temp_surface[1], _dim[0], _dim[1], surface_r32float);
|
|
|
|
|
|
|
|
surface_set_shader(temp_surface[0], sh_find_boundary_stretch_x);
|
|
|
|
shader_set_f("dimension", _dim);
|
|
|
|
draw_surface_safe(_surf);
|
|
|
|
surface_reset_shader();
|
|
|
|
|
|
|
|
surface_set_shader(temp_surface[1], sh_find_boundary_stretch_y);
|
|
|
|
shader_set_f("dimension", _dim);
|
|
|
|
draw_surface_safe(_surf);
|
|
|
|
surface_reset_shader();
|
|
|
|
|
|
|
|
for( ; _minx < _dim[0]; _minx++ ) if(surface_get_pixel(temp_surface[0], _minx, 0) > 0) break;
|
|
|
|
for( ; _maxx >= 0; _maxx-- ) if(surface_get_pixel(temp_surface[0], _maxx, 0) > 0) break;
|
|
|
|
for( ; _miny < _dim[1]; _miny++ ) if(surface_get_pixel(temp_surface[1], 0, _miny) > 0) break;
|
|
|
|
for( ; _maxy >= 0; _maxy-- ) if(surface_get_pixel(temp_surface[1], 0, _maxy) > 0) break;
|
2023-03-05 07:16:44 +01:00
|
|
|
|
2023-09-19 20:43:02 +02:00
|
|
|
if(_array) {
|
2023-03-05 07:16:44 +01:00
|
|
|
minx[j] = _minx;
|
|
|
|
miny[j] = _miny;
|
|
|
|
|
|
|
|
maxx[j] = _maxx;
|
|
|
|
maxy[j] = _maxy;
|
2023-09-19 20:43:02 +02:00
|
|
|
} else {
|
|
|
|
minx = min(minx, _minx);
|
|
|
|
miny = min(miny, _miny);
|
|
|
|
|
|
|
|
maxx = max(maxx, _maxx);
|
|
|
|
maxy = max(maxy, _maxy);
|
2023-03-05 07:16:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-09-19 20:43:02 +02:00
|
|
|
var res = [];
|
2023-03-05 07:16:44 +01:00
|
|
|
|
2023-09-19 20:43:02 +02:00
|
|
|
for( var i = 0, n = _amo; i < n; i++ ) {
|
2023-03-05 07:16:44 +01:00
|
|
|
var _surf = _inSurf[i];
|
|
|
|
|
|
|
|
if(_array == 0) {
|
2023-08-15 19:35:31 +02:00
|
|
|
var resDim = [maxx - minx + 1, maxy - miny + 1];
|
2023-03-19 09:17:39 +01:00
|
|
|
resDim[DIMENSION.width] += _padd[PADDING.left] + _padd[PADDING.right];
|
|
|
|
resDim[DIMENSION.height] += _padd[PADDING.top] + _padd[PADDING.bottom];
|
|
|
|
|
|
|
|
res[i] = surface_create_valid(resDim[DIMENSION.width], resDim[DIMENSION.height], cDep);
|
|
|
|
|
2023-11-23 13:39:35 +01:00
|
|
|
surface_set_shader(res[i], noone);
|
2023-03-19 09:17:39 +01:00
|
|
|
draw_surface_safe(_surf, -minx + _padd[PADDING.left], -miny + _padd[PADDING.top]);
|
2023-11-23 13:39:35 +01:00
|
|
|
surface_reset_shader();
|
|
|
|
|
2023-03-05 07:16:44 +01:00
|
|
|
} else if(_array == 1) {
|
2023-08-15 19:35:31 +02:00
|
|
|
var resDim = [maxx[i] - minx[i] + 1, maxy[i] - miny[i] + 1];
|
2023-03-19 09:17:39 +01:00
|
|
|
resDim[DIMENSION.width] += _padd[PADDING.left] + _padd[PADDING.right];
|
|
|
|
resDim[DIMENSION.height] += _padd[PADDING.top] + _padd[PADDING.bottom];
|
|
|
|
|
|
|
|
res[i] = surface_create_valid(resDim[DIMENSION.width], resDim[DIMENSION.height], cDep);
|
2023-03-05 07:16:44 +01:00
|
|
|
|
2023-11-23 13:39:35 +01:00
|
|
|
surface_set_shader(res[i], noone);
|
2023-03-19 09:17:39 +01:00
|
|
|
draw_surface_safe(_surf, -minx[i] + _padd[PADDING.left], -miny[i] + _padd[PADDING.top]);
|
2023-11-23 13:39:35 +01:00
|
|
|
surface_reset_shader();
|
2023-03-05 07:16:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!_arr) res = res[0];
|
|
|
|
outputs[| 0].setValue(res);
|
|
|
|
}
|
|
|
|
}
|