- [Bake Path] Fix baking looped path not loop properly.

This commit is contained in:
Tanasart 2024-07-16 10:08:51 +07:00
parent c8a8c944d1
commit 22d44588f0
9 changed files with 180 additions and 13 deletions

View file

@ -2043,6 +2043,7 @@
{"name":"s_node_scatter_point","order":9,"path":"sprites/s_node_scatter_point/s_node_scatter_point.yy",},
{"name":"s_node_scatter","order":19,"path":"sprites/s_node_scatter/s_node_scatter.yy",},
{"name":"s_node_sdf","order":47,"path":"sprites/s_node_sdf/s_node_sdf.yy",},
{"name":"s_node_segment_filter","order":21,"path":"sprites/s_node_segment_filter/s_node_segment_filter.yy",},
{"name":"s_node_separate_file_path","order":14,"path":"sprites/s_node_separate_file_path/s_node_separate_file_path.yy",},
{"name":"s_node_sepearte_shape","order":48,"path":"sprites/s_node_sepearte_shape/s_node_sepearte_shape.yy",},
{"name":"s_node_shadow_cast","order":50,"path":"sprites/s_node_shadow_cast/s_node_shadow_cast.yy",},

View file

@ -2589,6 +2589,7 @@
{"id":{"name":"s_node_scatter_point","path":"sprites/s_node_scatter_point/s_node_scatter_point.yy",},},
{"id":{"name":"s_node_scatter","path":"sprites/s_node_scatter/s_node_scatter.yy",},},
{"id":{"name":"s_node_sdf","path":"sprites/s_node_sdf/s_node_sdf.yy",},},
{"id":{"name":"s_node_segment_filter","path":"sprites/s_node_segment_filter/s_node_segment_filter.yy",},},
{"id":{"name":"s_node_separate_file_path","path":"sprites/s_node_separate_file_path/s_node_separate_file_path.yy",},},
{"id":{"name":"s_node_sepearte_shape","path":"sprites/s_node_sepearte_shape/s_node_sepearte_shape.yy",},},
{"id":{"name":"s_node_shadow_cast","path":"sprites/s_node_shadow_cast/s_node_shadow_cast.yy",},},

View file

@ -72,7 +72,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
inputs[| 28] = nodeValue("Segments", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [[]])
.setDisplay(VALUE_DISPLAY.vector)
.setArrayDepth(1);
.setArrayDepth(2);
input_display_list = [
["Output", true], 0, 1,
@ -191,7 +191,6 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
if(_dtype == 1 && _pat == noone) return _outData;
if(_dtype == 2 && (array_invalid(_segs) || array_invalid(_segs[0]))) return _outData;
if(IS_FIRST_FRAME || inputs[| 11].is_anim)
ds_map_clear(widthMap);

View file

@ -11,7 +11,7 @@ function Node_Path_Bake(_x, _y, _group = noone) : Node(_x, _y, _group) construct
outputs[| 0] = nodeValue("Segments", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, [[]])
.setDisplay(VALUE_DISPLAY.vector)
.setArrayDepth(1);
.setArrayDepth(2);
path_amount = 1;
@ -50,6 +50,7 @@ function Node_Path_Bake(_x, _y, _group = noone) : Node(_x, _y, _group) construct
if(_path == noone) return;
if(_dist <= 0) return;
var _loop = struct_try_get(_path, "path_loop", false);
var _amo = _path.getLineCount();
path_amount = _amo;
var _segs = array_create(_amo);
@ -67,6 +68,8 @@ function Node_Path_Bake(_x, _y, _group = noone) : Node(_x, _y, _group) construct
_p = _path.getPointDistance(j, i, _p);
array_push(_seg, [ _p.x, _p.y, j / _len ]);
}
if(_loop) array_push(_seg, [ _seg[0][0], _seg[0][1], 1 ]);
}
if(_sped && _amo == 1) _segs = _segs[0];
@ -75,6 +78,6 @@ function Node_Path_Bake(_x, _y, _group = noone) : Node(_x, _y, _group) construct
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_fit(THEME.node_draw_path, 0, bbox.xc, bbox.yc, bbox.w, bbox.h);
draw_sprite_bbox_uniform(THEME.node_draw_path, 0, bbox);
}
}

View file

@ -914,6 +914,7 @@ function __initNodes() {
addNodeObject(values, "Map Path", s_node_path_mapp, "Node_Path_Map", [1, Node_Path_Map]).setVersion(11640);
addNodeObject(values, "Scatter Path", s_node_path_scatter, "Node_Path_Scatter", [1, Node_Path_Scatter]).setVersion(11740);
addNodeObject(values, "3D Path", s_node_path_3d, "Node_Path_3D", [1, Node_Path_3D], [ "path 3d" ]).setVersion(11750);
addNodeObject(values, "Filter Segments",s_node_segment_filter, "Node_Segment_Filter", [1, Node_Segment_Filter]).setVersion(11780);
ds_list_add(values, "Boolean");
addNodeObject(values, "Boolean", s_node_boolean, "Node_Boolean", [1, Node_Boolean]);

View file

@ -1,42 +1,114 @@
function Node_Segment_Filter(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Segment Filter";
name = "Filter Segment";
setDimension(96, 48);
inputs[| 0] = nodeValue("Segments", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [[]])
.setDisplay(VALUE_DISPLAY.vector)
.setVisible(true, true)
.setArrayDepth(1);
inputs[| 1] = nodeValue("Loop", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
inputs[| 1] = nodeValue("Angle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.rotation);
inputs[| 2] = nodeValue("Spread", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 15);
inputs[| 3] = nodeValue("Both side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);
outputs[| 0] = nodeValue("Segments", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, [[]])
.setVisible(false)
.setArrayDepth(1);
.setDisplay(VALUE_DISPLAY.vector)
.setArrayDepth(2);
input_display_list = [
["Segments", false], 0,
["Filter", false], 1,
["Filter", false], 1, 2, 3,
];
path_preview_surface = noone;
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
var _segs = outputs[| 0].getValue();
var ox, oy, nx, ny;
if(array_invalid(_segs) || array_invalid(_segs[0])) return;
if(!is_array(_segs[0][0])) _segs = [ _segs ];
draw_set_color(COLORS._main_icon);
for( var i = 0, n = array_length(_segs); i < n; i++ ) {
var _seg = _segs[i];
var ox = _x + _seg[0][0] * _s;
var oy = _y + _seg[0][1] * _s;
for( var j = 1, m = array_length(_seg); j < m; j++ ) {
nx = _x + _seg[j][0] * _s;
ny = _y + _seg[j][1] * _s;
draw_line_width(ox, oy, nx, ny, 3);
ox = nx;
oy = ny;
}
}
}
static update = function(frame = CURRENT_FRAME) {
var _segments = getInputData(0);
if(!is_array(_segments) || array_empty(_segments) || !is_array(_segments[0])) return;
var _segments = getInputData(0);
var _angle = getInputData(1);
var _spread = getInputData(2);
var _both = getInputData(3);
if(array_invalid(_segments) || array_invalid(_segments[0])) return;
if(!is_array(_segments[0][0])) //spreaded single path
_segments = [ _segments ];
var _amo = array_length(_segments);
var _segOut = [];
for(var i = 0; i < _amo; i++) {
var _segIn = _segments[i];
if(array_empty(_segIn)) continue;
var _ox = _segIn[0][0], _oy = _segIn[0][1], _nx, _ny;
var _inc = false;
var _dir, _drv;
var _seg = [];
for (var j = 1, n = array_length(_segIn); j < n; j++) {
_nx = _segIn[j][0];
_ny = _segIn[j][1];
_dir = point_direction(_ox, _oy, _nx, _ny);
_drv = abs(angle_difference(_dir, _angle));
if(_both) _drv = min(_drv, abs(angle_difference(_dir, _angle + 180)));
if(_drv < _spread) {
if(!_inc) array_push(_seg, [ _ox, _oy ]);
array_push(_seg, [ _nx, _ny ]);
_inc = true;
} else {
if(!array_empty(_seg)) {
array_push(_segOut, _seg);
_seg = [];
}
_inc = false;
}
_ox = _nx;
_oy = _ny;
}
if(!array_empty(_seg)) array_push(_segOut, _seg);
}
outputs[| 0].setValue(_segOut);
}
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
var bbox = drawGetBbox(xx, yy, _s);
draw_sprite_bbox_uniform(s_node_segment_filter, 0, bbox);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,90 @@
{
"$GMSprite":"",
"%Name":"s_node_segment_filter",
"bboxMode":0,
"bbox_bottom":59,
"bbox_left":6,
"bbox_right":57,
"bbox_top":5,
"collisionKind":1,
"collisionTolerance":0,
"DynamicTexturePage":false,
"edgeFiltering":false,
"For3D":false,
"frames":[
{"$GMSpriteFrame":"","%Name":"c1b657e5-c3da-43e5-b1e1-c9faa02ff38d","name":"c1b657e5-c3da-43e5-b1e1-c9faa02ff38d","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
],
"gridX":0,
"gridY":0,
"height":64,
"HTile":false,
"layers":[
{"$GMImageLayer":"","%Name":"10094d74-f749-4689-86f0-27a6c21d9e46","blendMode":0,"displayName":"default","isLocked":false,"name":"10094d74-f749-4689-86f0-27a6c21d9e46","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,},
],
"name":"s_node_segment_filter",
"nineSlice":null,
"origin":4,
"parent":{
"name":"path",
"path":"folders/nodes/icons/value/path.yy",
},
"preMultiplyAlpha":false,
"resourceType":"GMSprite",
"resourceVersion":"2.0",
"sequence":{
"$GMSequence":"",
"%Name":"s_node_segment_filter",
"autoRecord":true,
"backdropHeight":768,
"backdropImageOpacity":0.5,
"backdropImagePath":"",
"backdropWidth":1366,
"backdropXOffset":0.0,
"backdropYOffset":0.0,
"events":{
"$KeyframeStore<MessageEventKeyframe>":"",
"Keyframes":[],
"resourceType":"KeyframeStore<MessageEventKeyframe>",
"resourceVersion":"2.0",
},
"eventStubScript":null,
"eventToFunction":{},
"length":1.0,
"lockOrigin":false,
"moments":{
"$KeyframeStore<MomentsEventKeyframe>":"",
"Keyframes":[],
"resourceType":"KeyframeStore<MomentsEventKeyframe>",
"resourceVersion":"2.0",
},
"name":"s_node_segment_filter",
"playback":1,
"playbackSpeed":30.0,
"playbackSpeedType":0,
"resourceType":"GMSequence",
"resourceVersion":"2.0",
"showBackdrop":true,
"showBackdropImage":false,
"timeUnits":1,
"tracks":[
{"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore<SpriteFrameKeyframe>":"","Keyframes":[
{"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
"0":{"$SpriteFrameKeyframe":"","Id":{"name":"c1b657e5-c3da-43e5-b1e1-c9faa02ff38d","path":"sprites/s_node_segment_filter/s_node_segment_filter.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
},"Disabled":false,"id":"7040ce2f-17fc-4079-8d86-f936121cdeab","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
],"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
],
"visibleRange":null,
"volume":1.0,
"xorigin":32,
"yorigin":32,
},
"swatchColours":null,
"swfPrecision":0.5,
"textureGroupId":{
"name":"Default",
"path":"texturegroups/Default",
},
"type":0,
"VTile":false,
"width":64,
}