- [Line] Fix line not drawing with polygon shape.

This commit is contained in:
Tanasart 2024-03-24 16:02:54 +07:00
parent 6891a8743a
commit 285d996f2b
53 changed files with 334 additions and 109 deletions

View file

@ -732,6 +732,7 @@
{"name":"sh_blur_zoom","order":5,"path":"shaders/sh_blur_zoom/sh_blur_zoom.yy",},
{"name":"node_isosurf","order":3,"path":"scripts/node_isosurf/node_isosurf.yy",},
{"name":"__add_node_item","order":13,"path":"scripts/__add_node_item/__add_node_item.yy",},
{"name":"s_node_shape_poly_type","order":22,"path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},
{"name":"node_VFX_renderer","order":2,"path":"scripts/node_VFX_renderer/node_VFX_renderer.yy",},
{"name":"s_node_pb_fx_stack","order":2,"path":"sprites/s_node_pb_fx_stack/s_node_pb_fx_stack.yy",},
{"name":"fd_draw_sprite_to_collision_mask_surface","order":1,"path":"scripts/fd_draw_sprite_to_collision_mask_surface/fd_draw_sprite_to_collision_mask_surface.yy",},

View file

@ -981,6 +981,7 @@
{"id":{"name":"sh_blur_zoom","path":"shaders/sh_blur_zoom/sh_blur_zoom.yy",},},
{"id":{"name":"node_isosurf","path":"scripts/node_isosurf/node_isosurf.yy",},},
{"id":{"name":"__add_node_item","path":"scripts/__add_node_item/__add_node_item.yy",},},
{"id":{"name":"s_node_shape_poly_type","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},
{"id":{"name":"node_VFX_renderer","path":"scripts/node_VFX_renderer/node_VFX_renderer.yy",},},
{"id":{"name":"s_node_pb_fx_stack","path":"sprites/s_node_pb_fx_stack/s_node_pb_fx_stack.yy",},},
{"id":{"name":"fd_draw_sprite_to_collision_mask_surface","path":"scripts/fd_draw_sprite_to_collision_mask_surface/fd_draw_sprite_to_collision_mask_surface.yy",},},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -27,8 +27,9 @@ if(tb.slide_range != noone)
cur_val = clamp(cur_val, tb.curr_range[0], tb.curr_range[1]);
var _val = value_snap(cur_val, _s);
if(tb.slide_int)
_val = round(_val);
if(tb.slide_int) _val = round(_val);
if(abs(_val) < _s * 4) _val = 0;
tb._input_text = string_real(_val);
if(tb.apply()) UNDO_HOLDING = true;

View file

@ -1,7 +1,8 @@
function Mesh() constructor {
triangles = [];
center = [ 0, 0 ];
static getRandomPoint = function(seed) {
static getRandomPoint = function(seed) { #region
random_set_seed(seed);
if(array_length(triangles) == 0) return [ 0, 0 ];
@ -17,9 +18,9 @@ function Mesh() constructor {
var _y = (1 - sqrt(a1)) * p0.y + (sqrt(a1) * (1 - a2)) * p1.y + (sqrt(a1) * a2) * p2.y;
return new __vec2( _x, _y );
}
} #endregion
static draw = function(_x, _y, _s) {
static draw = function(_x, _y, _s) { #region
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
var t = triangles[i];
@ -27,9 +28,9 @@ function Mesh() constructor {
draw_line(_x + t[1].x * _s, _y + t[1].y * _s, _x + t[2].x * _s, _y + t[2].y * _s);
draw_line(_x + t[0].x * _s, _y + t[0].y * _s, _x + t[2].x * _s, _y + t[2].y * _s);
}
}
} #endregion
static pointIn = function(_x, _y) {
static pointIn = function(_x, _y) { #region
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
var t = triangles[i];
@ -38,9 +39,9 @@ function Mesh() constructor {
}
return false;
}
} #endregion
static mergePath = function() {
static mergePath = function() { #region
if(array_length(triangles) == 0) return [];
var segments = [];
@ -95,9 +96,9 @@ function Mesh() constructor {
ds_map_destroy(pointsPairs);
return path;
}
} #endregion
static clone = function() {
static clone = function() { #region
var msh = new Mesh();
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
@ -108,8 +109,30 @@ function Mesh() constructor {
];
}
msh.center = [ center[0], center[1] ];
return msh;
} #endregion
static calcCoM = function() { #region
var _ax = 0, _ay = 0;
var _p = 0;
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
var _tr = triangles[i];
for( var j = 0; j < 3; j++ ) {
_ax += _tr[j].x;
_ay += _tr[j].y;
_p++;
}
}
center = [ 0, 0 ];
if(_p == 0) return;
center = [ _ax / _p, _ay / _p ];
} #endregion
static serialize = function() { return ""; }
static deserialize = function(s) { return self; }

View file

@ -25,7 +25,7 @@ function Node_VFX_effector(_x, _y, _group = noone) : Node(_x, _y, _group) constr
inputs[| 0] = nodeValue("Particles", self, JUNCTION_CONNECT.input, VALUE_TYPE.particle, -1 )
.setVisible(true, true);
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ])
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area)
.rejectArray();

View file

@ -23,7 +23,7 @@ function Path() constructor {
function PathSegment() : Path() constructor {
segments = [];
static getBoundary = function() {
static getBoundary = function() { #region
if(getSegmentCount() == 0) return new BoundingBox( 0, 0, 0, 0 );
var minx = segments[0].x, maxx = segments[0].x;
@ -38,11 +38,12 @@ function PathSegment() : Path() constructor {
maxy = max(maxy, s.y);
}
return new BoundingBox( minx, miny, maxx, maxy );
}
} #endregion
static getSegmentCount = function() { return array_length(segments); }
static getLineCount = function() { return 1; }
static setSegment = function(segment) {
static setSegment = function(segment) { #region
self.segments = segment;
lengths = [];
lengthAccs = [];
@ -53,33 +54,40 @@ function PathSegment() : Path() constructor {
np = segment[i];
if(i) {
lengths[i] = point_distance(op.x, op.y, np.x, np.y);
lengthTotal += lengths[i];
lengthAccs[i] = lengthTotal;
lengths[i - 1] = point_distance(op.x, op.y, np.x, np.y);
lengthTotal += lengths[i - 1];
lengthAccs[i - 1] = lengthTotal;
}
op = np;
}
}
} #endregion
static getPointDistance = function(_dist) {
for( var i = 1; i < array_length(lengths); i += 1 ) {
static getPointDistance = function(_dist, _ind = 0, out = undefined) { #region
if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; }
for( var i = 0; i < array_length(lengths); i++ ) {
if(_dist <= lengths[i]) {
var rat = _dist / lengths[i];
return segments[i - 1].lerpTo(segments[i], rat);
out.x = lerp(segments[i].x, segments[i + 1].x, rat);
out.y = lerp(segments[i].y, segments[i + 1].y, rat);
return out;
}
_dist -= lengths[i];
}
return new __vec2(0, 0);
}
out.x = segments[i].x;
out.y = segments[i].y;
static getPointRatio = function(_rat) {
return getPointDistance(frac(_rat) * lengthTotal);
}
return out;
} #endregion
static getTangentRatio = function(_rat) {
static getPointRatio = function(_rat, _ind = 0, out = undefined) { return getPointDistance(frac(_rat) * lengthTotal, _ind, out); }
static getTangentRatio = function(_rat) { #region
_rat = frac(_rat);
var l = _rat * lengthTotal;
@ -93,5 +101,19 @@ function PathSegment() : Path() constructor {
}
return 0;
} #endregion
static draw = function(_x, _y, _s) { #region
var ox, oy, nx, ny;
for( var i = 0, n = array_length(segments); i < n; i++ ) {
nx = _x + segments[i].x * _s;
ny = _y + segments[i].y * _s;
if(i) draw_line(ox, oy, nx, ny);
ox = nx;
oy = ny;
}
} #endregion
}

View file

@ -6,7 +6,7 @@
triangles,
}
function SHAPE_rectangle(_sca) {
function SHAPE_rectangle(_sca) { #region
var triangles = [
[ new __vec2(-_sca[0], -_sca[1]), new __vec2( _sca[0], -_sca[1]), new __vec2(-_sca[0], _sca[1]) ],
[ new __vec2( _sca[0], -_sca[1]), new __vec2(-_sca[0], _sca[1]), new __vec2( _sca[0], _sca[1]) ],
@ -19,9 +19,9 @@
[ { type: SHAPE_TYPE.triangles, triangles: triangles } ],
segment
];
}
} #endregion
function SHAPE_circle(_sca, data = {}) {
function SHAPE_circle(_sca, data = {}) { #region
var prec = max(3, data.side);
var triangles = [];
var ang = 360 / prec;
@ -43,9 +43,9 @@
[{ type: SHAPE_TYPE.triangles, triangles: triangles }],
segment
];
}
} #endregion
function SHAPE_star(_sca, data = {}) {
function SHAPE_star(_sca, data = {}) { #region
var prec = max(3, data.side);
var inner = data.inner;
var triangles = [];
@ -74,9 +74,9 @@
[{ type: SHAPE_TYPE.triangles, triangles: triangles }],
segment
];
}
} #endregion
function SHAPE_capsule(_sca, data = {}) {
function SHAPE_capsule(_sca, data = {}) { #region
var rad = data.radius;
var prec = max(2, data.side);
var hh = _sca[1] * rad;
@ -143,9 +143,9 @@
shapes,
segment
];
}
} #endregion
function SHAPE_ring(_sca, data = {}) {
function SHAPE_ring(_sca, data = {}) { #region
var prec = max(3, data.side);
var inner = data.inner;
var triangles = [];
@ -176,9 +176,9 @@
[{ type: SHAPE_TYPE.triangles, triangles: triangles }],
segment
];
}
} #endregion
function SHAPE_gear(_sca, data = {}) {
function SHAPE_gear(_sca, data = {}) { #region
var teeth = max(3, data.teeth);
var teethH = data.teethH;
var teethT = data.teethT;
@ -229,9 +229,9 @@
[{ type: SHAPE_TYPE.triangles, triangles: triangles }],
segment
];
}
} #endregion
function SHAPE_cross(_sca, data = {}) {
function SHAPE_cross(_sca, data = {}) { #region
var inner = data.inner;
var triangles = [];
var segment = [];
@ -271,9 +271,9 @@
[{ type: SHAPE_TYPE.triangles, triangles: triangles }],
segment
];
}
} #endregion
function SHAPE_arc(_sca, data = {}) {
function SHAPE_arc(_sca, data = {}) { #region
var prec = max(3, data.side);
var inner = data.inner;
var radRan = data.radRan;
@ -364,6 +364,6 @@
[{ type: SHAPE_TYPE.triangles, triangles: triangles }],
segment
];
}
} #endregion
#endregion

View file

@ -10,7 +10,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co
inputs[| 2] = nodeValue("Spawn amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 2, 2 ], "Amount of particle spawn in that frame." )
.setDisplay(VALUE_DISPLAY.range, { linked : true });
inputs[| 3] = nodeValue("Spawn 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 ] )
inputs[| 3] = nodeValue("Spawn area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA )
.setDisplay(VALUE_DISPLAY.area);
inputs[| 4] = nodeValue("Spawn distribution", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0 )

View file

@ -17,6 +17,8 @@ enum AREA_INDEX {
shape
}
#macro DEF_AREA [ DEF_SURF_W / 2, DEF_SURF_H / 2, DEF_SURF_W / 2, DEF_SURF_H / 2, AREA_SHAPE.rectangle, AREA_MODE.area ]
function areaBox(_onModify, _unit = noone) : widget() constructor {
onModify = _onModify;
unit = _unit;
@ -125,7 +127,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor {
y = _y;
w = 0;
h = ui(204);
mode = _display_data.area_type;
mode = array_safe_get(_data, 5);
var _bx = _x - ui(48);
var _by = _y + ui(64 - 48);
@ -219,7 +221,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor {
break;
}
_display_data.area_type = (mode + 1) % 3;
onModify(5, (mode + 1) % 3);
} #endregion
}

View file

@ -1,5 +1,3 @@
#macro AREA_DEF [ 16, 16, 4, 4, AREA_SHAPE.rectangle ]
enum AREA_DISTRIBUTION {
area,
border

View file

@ -51,7 +51,8 @@ function array_resize_fill(arr, size, fill = 0) { #region
enum ARRAY_OVERFLOW {
_default,
loop
loop,
pingpong
}
function array_safe_get(arr, index, def = 0, overflow = ARRAY_OVERFLOW._default) { #region
@ -59,15 +60,26 @@ function array_safe_get(arr, index, def = 0, overflow = ARRAY_OVERFLOW._default)
if(!is_array(arr)) return def;
if(is_array(index)) return def;
if(overflow == ARRAY_OVERFLOW.loop) {
var len = array_length(arr);
if(len == 0) return def;
if(overflow == ARRAY_OVERFLOW.loop) {
if(index < 0)
index = len - safe_mod(abs(index), len);
index = safe_mod(index, len);
index = index % len;
} else if(overflow == ARRAY_OVERFLOW.pingpong) {
if(index < 0) index = len - safe_mod(abs(index), len);
var _plen = len * 2 - 1;
index = index % _plen;
if(index >= len)
index = _plen - index;
}
if(index < 0) return def;
if(index >= array_length(arr)) return def;
if(index >= len) return def;
return arr[index] == undefined? def : arr[index];
} #endregion

View file

@ -15,28 +15,51 @@ function Node_MK_Delay_Machine(_x, _y, _group = noone) : Node(_x, _y, _group) co
inputs[| 4] = nodeValue("Alpha over Delay", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11);
inputs[| 5] = nodeValue("Palette Select", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Loop", "Pingpong", "Random" ]);
inputs[| 6] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, seed_random())
outputs[| 0] = nodeValue("Surface", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
input_display_list = [ 0,
["Delay", false], 1, 2,
["Render", false], 3, 4,
["Render", false], 3, 5, 6, 4,
];
insp2UpdateTooltip = "Clear cache";
insp2UpdateIcon = [ THEME.cache, 0, COLORS._main_icon ];
static onInspector2Update = function() { clearCache(); }
static step = function() {
var _psel = getInputData(5);
inputs[| 6].setVisible(_psel == 2);
}
static update = function() {
var _surf = getInputData(0);
var _amo = getInputData(1);
var _frm = getInputData(2);
var _pal = getInputData(3);
var _alpC = getInputData(4);
var _psel = getInputData(5);
var _seed = getInputData(6);
cacheCurrentFrame(_surf);
random_set_seed(_seed);
var _sw = surface_get_width_safe(_surf);
var _sh = surface_get_height_safe(_surf);
var _outSurf = outputs[| 0].getValue();
_outSurf = surface_verify(_outSurf, _sw, _sh);
var cc, aa;
var _psiz = array_length(_pal) - 1;
surface_set_target(_outSurf);
DRAW_CLEAR
@ -45,8 +68,13 @@ function Node_MK_Delay_Machine(_x, _y, _group = noone) : Node(_x, _y, _group) co
var _s = array_safe_get(cached_output, _ff);
if(!is_surface(_s)) continue;
var cc = array_safe_get(_pal, i, c_white, ARRAY_OVERFLOW.loop);
var aa = eval_curve_x(_alpC, 1 - i / _amo);
switch(_psel) {
case 0 : cc = array_safe_get(_pal, i, c_white, ARRAY_OVERFLOW.loop); break;
case 1 : cc = array_safe_get(_pal, i, c_white, ARRAY_OVERFLOW.pingpong); break;
case 2 : cc = array_safe_get(_pal, irandom(_psiz), c_white); break;
}
aa = eval_curve_x(_alpC, 1 - i / _amo);
draw_surface_ext(_s, 0, 0, 1, 1, 0, cc, aa);
}

View file

@ -10,7 +10,7 @@ function Node_FLIP_Wall(_x, _y, _group = noone) : Node(_x, _y, _group) construct
inputs[| 0] = nodeValue("Domain", self, JUNCTION_CONNECT.input, VALUE_TYPE.fdomain, noone )
.setVisible(true, true);
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ])
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA )
.setDisplay(VALUE_DISPLAY.area);
input_display_list = [ 0,

View file

@ -5,7 +5,7 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co
inputs[| 0] = nodeValue("Background", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
onSurfaceSize = function() { return surface_get_dimension(getInputData(0)); };
inputs[| 1] = nodeValue("Focus area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0, 0, 16, 16, AREA_SHAPE.rectangle ])
inputs[| 1] = nodeValue("Focus area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area, { onSurfaceSize });
inputs[| 2] = nodeValue("Zoom", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)

View file

@ -20,22 +20,34 @@ function Node_Diffuse(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
inputs[| 7] = nodeValue("External", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone );
inputs[| 8] = nodeValue("External strength", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.3)
.setDisplay(VALUE_DISPLAY.slider, { range: [ -1, 1, 0.01] });
inputs[| 8] = nodeValue("External Strength", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1)
.setDisplay(VALUE_DISPLAY.slider, { range: [ -0.25, 0.25, 0.01] });
inputs[| 9] = nodeValue("Detail", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1)
inputs[| 10] = nodeValue("External Type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Point", "Vector" ]);
inputs[| 11] = nodeValue("External Direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.rotation);
outputs[| 0] = nodeValue("Result", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
input_display_list = [ 0, 6,
["Diffuse", false], 1,
["Flow", false], 2, 9, 3, 4,
["Forces", false], 8,
["Forces", false], 10, 8, 11,
["Rendering", false], 5,
]
temp_surface = [ surface_create(1, 1), surface_create(1, 1) ];
static step = function() {
var _ftyp = getInputData(10);
inputs[| 11].setVisible(_ftyp == 1);
}
static update = function() {
var _surf = getInputData(0);
var _diss = getInputData(1);
@ -46,6 +58,8 @@ function Node_Diffuse(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
var _seed = getInputData(6);
var _fstr = getInputData(8);
var _detl = getInputData(9);
var _ftyp = getInputData(10);
var _fdir = getInputData(11);
if(!is_surface(_surf)) return;
@ -71,7 +85,9 @@ function Node_Diffuse(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
shader_set_i("iteration", _detl);
shader_set_f("flowRate", _flow);
shader_set_f("seed", _seed + CURRENT_FRAME * _rand / 100);
shader_set_i("externalForceType", _ftyp);
shader_set_f("externalForce", _fstr);
shader_set_f("externalForceDir", degtorad(_fdir));
draw_surface_safe(temp_surface[0]);
surface_reset_shader();

View file

@ -217,7 +217,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru
case "Area" :
if(!is_array(_val) || array_length(_val) != 5)
inParent.animator = new valueAnimator([0, 0, 0, 0, 5], inParent);
inParent.animator = new valueAnimator(DEF_AREA, inParent);
inParent.setDisplay(VALUE_DISPLAY.area);
break;

View file

@ -250,6 +250,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
var _segLength = struct_has(_pat, "getAccuLength")? _pat.getAccuLength(i) : [];
var _segLengthAmo = array_length(_segLength);
var _segIndex = 0;
var _segIndexPrev = 0;
if(_segLengthAmo)
while(_prog_curr > _segLength[_segIndex]) {
@ -260,9 +261,11 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
}
}
//print($"===== {_prog_curr}/{_segLength} : {_segIndex} =====");
//print($"===== {_prog_curr} / {_segLength} : {_segIndex} - {_pathLength} =====");
while(_total >= 0) {
wght = 1;
_segIndexPrev = _segIndex;
if(_useDistance) {
var segmentLength = array_safe_get(_segLength, _segIndex, _pathLength);
@ -273,10 +276,11 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
//print($"{segmentLength}/{_pathLength} = {_prog_next}");
if(_prog_next == segmentLength) _segIndex++;
var _pp = _clamp? clamp(_pathPng, 0, _pathLength) : _pathPng
var _pp = _clamp? clamp(_pathPng, 0, _pathLength) : _pathPng;
//print($"_pp = {_pp}");
p = _pat.getPointDistance(_pp, i, p);
if(struct_has(_pat, "getWeightDistance"))
wght = _pat.getWeightDistance(_pp, i);
} else {
@ -322,7 +326,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
pointAmo++;
}
if(_prog_next == _prog_curr) break;
if(_prog_next == _prog_curr && _segIndexPrev == _segIndex) break;
else if(_prog_next > _prog_curr) {
_prog_total += _prog_next - _prog_curr;
_total -= _prog_next - _prog_curr;
@ -333,7 +337,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
_ox = _nx;
_oy = _ny;
if(_total_prev == _total && ++_freeze > 16) break;
if(_total_prev == _total && _segIndexPrev == _segIndex && ++_freeze > 16) { print("Terminate line not moving"); break; }
_total_prev = _total;
}

View file

@ -1,6 +1,5 @@
function Node_Mesh_Transform(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Mesh Transform";
w = 96;
inputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.input, VALUE_TYPE.mesh, noone)
@ -21,20 +20,24 @@ function Node_Mesh_Transform(_x, _y, _group = noone) : Node(_x, _y, _group) cons
outputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.output, VALUE_TYPE.mesh, noone);
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
var imesh = getInputData(0);
var omesh = outputs[| 0].getValue();
if(imesh == noone) return;
var _cm = imesh.center;
var pos = getInputData(1);
var px = _x + pos[0] * _s;
var py = _y + pos[1] * _s;
var ax = _x + _cm[0] * _s;
var ay = _y + _cm[1] * _s;
active &= !inputs[| 1].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny);
var px = ax + pos[0] * _s;
var py = ay + pos[1] * _s;
active &= !inputs[| 1].drawOverlay(hover, active, ax, ay, _s, _mx, _my, _snx, _sny);
active &= !inputs[| 2].drawOverlay(hover, active, px, py, _s, _mx, _my, _snx, _sny);
active &= !inputs[| 4].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny, THEME.anchor );
var mesh = outputs[| 0].getValue();
if(mesh == noone) return;
draw_set_color(COLORS._main_accent);
mesh.draw(_x, _y, _s);
omesh.draw(_x, _y, _s);
}
function pointTransform(p, _pos, _rot, _sca, _anc) {
@ -56,6 +59,9 @@ function Node_Mesh_Transform(_x, _y, _group = noone) : Node(_x, _y, _group) cons
if(_msh == noone) return;
var mesh = _msh.clone();
var _cm = _msh.center;
_anc = [ _cm[0] + _anc[0], _cm[1] + _anc[1] ];
for( var i = 0, n = array_length(mesh.triangles); i < n; i++ ) {
var t = mesh.triangles[i];
@ -65,6 +71,8 @@ function Node_Mesh_Transform(_x, _y, _group = noone) : Node(_x, _y, _group) cons
pointTransform(t[2], _pos, _rot, _sca, _anc);
}
mesh.calcCoM();
outputs[| 0].setValue(mesh);
}

View file

@ -8,7 +8,7 @@ function Node_MK_Brownian(_x, _y, _group = noone) : Node(_x, _y, _group) constru
inputs[| 2] = nodeValue("Amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 10);
inputs[| 3] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, AREA_DEF)
inputs[| 3] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area);
inputs[| 4] = nodeValue("Direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 45, 135, 0, 0 ] )

View file

@ -9,7 +9,7 @@ function Node_MK_Fall(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
inputs[| 2] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, seed_random());
inputs[| 3] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, AREA_DEF)
inputs[| 3] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area);
inputs[| 4] = nodeValue("Amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 10);

View file

@ -5,7 +5,7 @@ function Node_Path_Map_Area(_x, _y, _group = noone) : Node(_x, _y, _group) const
inputs[| 0] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone)
.setVisible(true, true);
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [16, 16, 16, 16])
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area);
inputs[| 1].editWidget.adjust_shape = false;

View file

@ -12,7 +12,7 @@ function Node_Rigid_Object_Spawner(_x, _y, _group = noone) : Node(_x, _y, _group
inputs[| 0] = nodeValue("Object", self, JUNCTION_CONNECT.input, VALUE_TYPE.rigid, noone)
.setVisible(true, true);
inputs[| 1] = nodeValue("Spawn area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, AREA_DEF)
inputs[| 1] = nodeValue("Spawn area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area)
.rejectArray();

View file

@ -25,7 +25,7 @@ function Node_Scatter(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c
.setDisplay(VALUE_DISPLAY.rotation_random);
onSurfaceSize = function() { return getInputData(1, DEF_SURF); };
inputs[| 5] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ DEF_SURF_W / 2, DEF_SURF_H / 2, DEF_SURF_W / 2, DEF_SURF_H / 2, AREA_SHAPE.rectangle ])
inputs[| 5] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area, { onSurfaceSize });
inputs[| 6] = nodeValue("Distribution", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 5)

View file

@ -5,7 +5,7 @@ function Node_Scatter_Points(_x, _y, _group = noone) : Node(_x, _y, _group) cons
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 ])
inputs[| 0] = nodeValue("Point area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA )
.setDisplay(VALUE_DISPLAY.area, { onSurfaceSize });
inputs[| 1] = nodeValue("Point distribution", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)

View file

@ -43,7 +43,7 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
.setDisplay(VALUE_DISPLAY.enum_scroll, _types);
onSurfaceSize = function() { return getInputData(0, DEF_SURF); };
inputs[| 3] = nodeValue("Position", 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 ])
inputs[| 3] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area, { onSurfaceSize });
inputs[| 4] = nodeValue("Sides", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 3)

View file

@ -2,6 +2,8 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
name = "Polygon Shape";
shapesArray = [ "Rectangle", "Ellipse", "Star", "Capsule", "Ring", "Arc", "Gear", "Cross" ];
for( var i = 0, n = array_length(shapesArray); i < n; i++ )
shapesArray[i] = new scrollItem(shapesArray[i], s_node_shape_poly_type, i);
inputs[| 0] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF )
.setDisplay(VALUE_DISPLAY.vector);
@ -22,7 +24,7 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
inputs[| 6] = nodeValue("Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.rotation);
inputs[| 7] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0.5, 0.5 ])
inputs[| 7] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0.5, 0.5 ])
.setDisplay(VALUE_DISPLAY.vector)
.setUnitRef(function(index) { return getDimension(index); }, VALUE_UNIT.reference);
@ -77,6 +79,9 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
draw_set_color(c_grey);
mesh.draw(_x, _y, _s);
node_draw_transform_box(active, _x, _y, _s, _mx, _my, _snx, _sny, 5, 6, 7, true);
draw_set_color(COLORS._main_accent);
path.draw(_x, _y, _s);
}
static vertex_transform = function(_p, _pos, _rot) {
@ -141,6 +146,8 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
draw_set_color(_shc);
draw_primitive_begin(pr_trianglelist);
outputs[| 2].setVisible(_mesh == noone);
if(_mesh != noone) {
for( var j = 0; j < array_length(_mesh.triangles); j++ ) {
var tri = _mesh.triangles[j];
@ -153,13 +160,11 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
draw_vertex(p2.x, p2.y);
}
outputs[| 2].setVisible(false, false);
} else {
outputs[| 2].setVisible(true, true);
var shapeData = [];
switch(array_safe_get(shapesArray, _shp)) {
switch(array_safe_get(shapesArray, _shp).name) {
case "Rectangle" : shapeData = SHAPE_rectangle(_sca); break;
case "Ellipse" : shapeData = SHAPE_circle(_sca, data); break;
case "Star" : shapeData = SHAPE_star(_sca, data); break;
@ -168,6 +173,12 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
case "Arc" : shapeData = SHAPE_arc(_sca, data); break;
case "Gear" : shapeData = SHAPE_gear(_sca, data); break;
case "Cross" : shapeData = SHAPE_cross(_sca, data); break;
default:
draw_primitive_end();
draw_set_alpha(1);
surface_reset_target();
return _outSurf;
}
var points = shapeData[0];
@ -185,6 +196,7 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
for( var i = 0, n = array_length(points); i < n; i++ ) {
if(points[i].type == SHAPE_TYPE.points)
shapes[i] = polygon_triangulate(points[i].points);
else if(points[i].type == SHAPE_TYPE.triangles)
shapes[i] = points[i].triangles;
}
@ -203,6 +215,8 @@ function Node_Shape_Polygon(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr
array_push(mesh.triangles, tri);
}
}
mesh.calcCoM();
}
draw_primitive_end();
draw_set_alpha(1);

View file

@ -10,7 +10,7 @@ function Node_Smoke_Add_Collider(_x, _y, _group = noone) : Node_Smoke(_x, _y, _g
inputs[| 1] = nodeValue("Collider", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
inputs[| 2] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ])
inputs[| 2] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA )
.setDisplay(VALUE_DISPLAY.area);
input_display_list = [

View file

@ -8,7 +8,7 @@ function Node_Smoke_Turbulence(_x, _y, _group = noone) : Node_Smoke(_x, _y, _gro
inputs[| 0] = nodeValue("Domain", self, JUNCTION_CONNECT.input, VALUE_TYPE.sdomain, noone)
.setVisible(true, true);
inputs[| 1] = nodeValue("Effect area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, AREA_DEF)
inputs[| 1] = nodeValue("Effect area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA)
.setDisplay(VALUE_DISPLAY.area);
inputs[| 2] = nodeValue("Strength", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.10)

View file

@ -519,7 +519,7 @@ function nodeValueMap(_name, _node, _junc = noone) { return new NodeValue(
function nodeValueGradientRange(_name, _node, _junc = noone) { return new NodeValue(_name, _node, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 1, 0 ]).setDisplay(VALUE_DISPLAY.gradient_range).setVisible(false, false).setMapped(_junc); }
function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constructor {
static DISPLAY_DATA_KEYS = [ "linked", "angle_display", "bone_id", "area_type", "unit", "atlas_crop" ];
static DISPLAY_DATA_KEYS = [ "linked", "angle_display", "bone_id", "unit", "atlas_crop" ];
#region ---- main ----
active = true;
@ -1028,7 +1028,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
for( var i = 0, n = array_length(animators); i < n; i++ )
animators[i].suffix = " " + array_safe_get(global.displaySuffix_Area, i, "");
display_data.area_type = AREA_MODE.area;
extract_node = "Node_Area";
break; #endregion
case VALUE_DISPLAY.padding : #region
@ -1487,8 +1486,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
#endregion
if(display_type == VALUE_DISPLAY.area) { #region
var dispType = nodeFrom.display_data.area_type;
var surfGet = nodeFrom.display_data.onSurfaceSize;
var surfGet = struct_try_get(nodeFrom.display_data, "onSurfaceSize", -1);
if(!applyUnit) return value;
if(!is_callable(surfGet)) return value;
@ -1498,6 +1496,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
var ww = surf[0];
var hh = surf[1];
var dispType = array_safe_get(value, 5, AREA_MODE.area);
switch(dispType) {
case AREA_MODE.area :
return value;

View file

@ -14,7 +14,7 @@ function Node_Widget_Test(_x, _y, _group = noone) : Node(_x, _y, _group) constru
inputs[| 6] = nodeValue("rotatorRandom", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [0, 0, 0, 0, 0]) .setDisplay(VALUE_DISPLAY.rotation_random)
inputs[| 7] = nodeValue("slider", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) .setDisplay(VALUE_DISPLAY.slider)
inputs[| 8] = nodeValue("sliderRange", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [0, 0]) .setDisplay(VALUE_DISPLAY.slider_range)
inputs[| 9] = nodeValue("areaBox", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0, 0, 0 ]) .setDisplay(VALUE_DISPLAY.area)
inputs[| 9] = nodeValue("areaBox", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA) .setDisplay(VALUE_DISPLAY.area)
inputs[| 10] = nodeValue("paddingBox", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0, 0 ]) .setDisplay(VALUE_DISPLAY.padding)
inputs[| 11] = nodeValue("cornerBox", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0, 0 ]) .setDisplay(VALUE_DISPLAY.corner)
inputs[| 12] = nodeValue("controlPointBox", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0, 0, 0, 0, 0 ]) .setDisplay(VALUE_DISPLAY.puppet_control)

View file

@ -4,7 +4,7 @@ function Node_Wrap_Area(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
onSurfaceSize = function() { return surface_get_dimension(getInputData(0)); };
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ])
inputs[| 1] = nodeValue("Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, DEF_AREA )
.setDisplay(VALUE_DISPLAY.area, { onSurfaceSize });
inputs[| 2] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true);

View file

@ -7,9 +7,11 @@ uniform float scale;
uniform int iteration;
uniform float flowRate;
uniform int externalForceType;
uniform float externalForce;
uniform float externalForceDir;
///////////////////// PERLIN START /////////////////////
#region ///////////////////// PERLIN START /////////////////////
float random (in vec2 st) { return smoothstep(0., 1., abs(fract(sin(dot(st.xy + vec2(21.456, 46.856), vec2(12.989, 78.233))) * (43758.545 + seed)) * 2. - 1.)); }
vec2 random2 (in vec2 st) { float a = random(st) * 6.28319; return vec2(cos(a), sin(a)); }
@ -57,7 +59,7 @@ float perlin ( vec2 st ) {
return n;
}
///////////////////// PERLIN END /////////////////////
#endregion ///////////////////// PERLIN END /////////////////////
void main() {
vec2 tx = 1. / dimension;
@ -67,7 +69,12 @@ void main() {
float y0 = perlin((v_vTexcoord + vec2(0., -tx.y)) * scale);
float y1 = perlin((v_vTexcoord + vec2(0., tx.y)) * scale);
vec2 flow = vec2(x1 - x0, y1 - y0) + externalForce * (v_vTexcoord - 0.5);
vec2 flow = vec2(x1 - x0, y1 - y0);
if(externalForceType == 0)
flow += externalForce * (v_vTexcoord - 0.5);
if(externalForceType == 1)
flow += externalForce * vec2(cos(externalForceDir), sin(externalForceDir));
gl_FragColor = texture2D( gm_BaseTexture, v_vTexcoord - flow * flowRate );
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

View file

@ -0,0 +1,88 @@
{
"resourceType": "GMSprite",
"resourceVersion": "1.0",
"name": "s_node_shape_poly_type",
"bbox_bottom": 21,
"bbox_left": 2,
"bbox_right": 21,
"bbox_top": 2,
"bboxMode": 0,
"collisionKind": 1,
"collisionTolerance": 0,
"DynamicTexturePage": false,
"edgeFiltering": false,
"For3D": false,
"frames": [
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"c062d35a-662c-46c4-9898-cf687121115d",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"cf030556-92eb-437b-80ed-1fbaec3ab825",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"36c0e241-654d-449a-bdce-eae92c78e585",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"e38974be-d29b-448b-abd5-314672c45348",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"93f9eeec-4d25-46a1-a737-87461d798a1a",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"e6a7b907-9f2c-4296-bc7a-6a36993f07bc",},
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"0688681e-9e32-4046-9fb9-c28411414622",},
],
"gridX": 0,
"gridY": 0,
"height": 24,
"HTile": false,
"layers": [
{"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,},
],
"nineSlice": null,
"origin": 4,
"parent": {
"name": "nodes",
"path": "folders/sprites/nodes.yy",
},
"preMultiplyAlpha": false,
"sequence": {
"resourceType": "GMSequence",
"resourceVersion": "1.4",
"name": "s_node_shape_poly_type",
"autoRecord": true,
"backdropHeight": 768,
"backdropImageOpacity": 0.5,
"backdropImagePath": "",
"backdropWidth": 1366,
"backdropXOffset": 0.0,
"backdropYOffset": 0.0,
"events": {"resourceType":"KeyframeStore<MessageEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"eventStubScript": null,
"eventToFunction": {},
"length": 8.0,
"lockOrigin": false,
"moments": {"resourceType":"KeyframeStore<MomentsEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"playback": 1,
"playbackSpeed": 30.0,
"playbackSpeedType": 0,
"showBackdrop": true,
"showBackdropImage": false,
"timeUnits": 1,
"tracks": [
{"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"1.0","Keyframes":[
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"c062d35a-662c-46c4-9898-cf687121115d","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"0f523f3d-7e20-4e72-b9ee-526dba4a192e","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"cf030556-92eb-437b-80ed-1fbaec3ab825","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"52176aad-60cc-4bb8-a0ea-04ba50d60741","IsCreationKey":false,"Key":1.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"36c0e241-654d-449a-bdce-eae92c78e585","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"ebd74768-c03f-4c26-9237-dffe7f34055d","IsCreationKey":false,"Key":2.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"e38974be-d29b-448b-abd5-314672c45348","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"6263dbe0-79da-47dc-8fa9-14feb4f26b65","IsCreationKey":false,"Key":3.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"867db5cb-a02e-4788-9af9-88378e7f0681","IsCreationKey":false,"Key":4.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"93f9eeec-4d25-46a1-a737-87461d798a1a","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"0fadce67-c866-4605-9c97-edf2ef587835","IsCreationKey":false,"Key":5.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"e6a7b907-9f2c-4296-bc7a-6a36993f07bc","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"233508fd-5c70-4f24-9a3a-da5f1badca4e","IsCreationKey":false,"Key":6.0,"Length":1.0,"Stretch":false,},
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"0688681e-9e32-4046-9fb9-c28411414622","path":"sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy",},},},"Disabled":false,"id":"04e1457a-ced5-44dd-92ae-523f18bb4959","IsCreationKey":false,"Key":7.0,"Length":1.0,"Stretch":false,},
],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
],
"visibleRange": null,
"volume": 1.0,
"xorigin": 12,
"yorigin": 12,
},
"swatchColours": null,
"swfPrecision": 2.525,
"textureGroupId": {
"name": "Default",
"path": "texturegroups/Default",
},
"type": 0,
"VTile": false,
"width": 24,
}