diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index e3302bf18..d305811b2 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -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",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 876ad7bb5..56e48511a 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -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",},}, diff --git a/fonts/_f_sdf/_f_sdf.old.png b/fonts/_f_sdf/_f_sdf.old.png index 3b77f12d6..ea62b56ae 100644 Binary files a/fonts/_f_sdf/_f_sdf.old.png and b/fonts/_f_sdf/_f_sdf.old.png differ diff --git a/fonts/_f_sdf/_f_sdf.png b/fonts/_f_sdf/_f_sdf.png index ea62b56ae..473e0d5f4 100644 Binary files a/fonts/_f_sdf/_f_sdf.png and b/fonts/_f_sdf/_f_sdf.png differ diff --git a/fonts/_f_sdf_medium/_f_sdf_medium.old.png b/fonts/_f_sdf_medium/_f_sdf_medium.old.png index 9044032b0..89ca6a387 100644 Binary files a/fonts/_f_sdf_medium/_f_sdf_medium.old.png and b/fonts/_f_sdf_medium/_f_sdf_medium.old.png differ diff --git a/fonts/_f_sdf_medium/_f_sdf_medium.png b/fonts/_f_sdf_medium/_f_sdf_medium.png index 89ca6a387..1672eb2cb 100644 Binary files a/fonts/_f_sdf_medium/_f_sdf_medium.png and b/fonts/_f_sdf_medium/_f_sdf_medium.png differ diff --git a/objects/textBox_slider/Draw_64.gml b/objects/textBox_slider/Draw_64.gml index af381321a..24c3bcc62 100644 --- a/objects/textBox_slider/Draw_64.gml +++ b/objects/textBox_slider/Draw_64.gml @@ -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; diff --git a/scripts/__mesh/__mesh.gml b/scripts/__mesh/__mesh.gml index f9097ce81..588e0c3c1 100644 --- a/scripts/__mesh/__mesh.gml +++ b/scripts/__mesh/__mesh.gml @@ -1,7 +1,8 @@ function Mesh() constructor { - triangles = []; + 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; } diff --git a/scripts/__node_VFX_effector/__node_VFX_effector.gml b/scripts/__node_VFX_effector/__node_VFX_effector.gml index 1b03bcdd1..5fa337ea5 100644 --- a/scripts/__node_VFX_effector/__node_VFX_effector.gml +++ b/scripts/__node_VFX_effector/__node_VFX_effector.gml @@ -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(); diff --git a/scripts/__path/__path.gml b/scripts/__path/__path.gml index 0df9914ec..81b7afba5 100644 --- a/scripts/__path/__path.gml +++ b/scripts/__path/__path.gml @@ -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,48 +38,56 @@ 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 = []; - lengthTotal = 0; + lengths = []; + lengthAccs = []; + lengthTotal = 0; var op, np; for( var i = 0, n = array_length(segment); i < n; i++ ) { 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); - } - - static getPointRatio = function(_rat) { - return getPointDistance(frac(_rat) * lengthTotal); - } + out.x = segments[i].x; + out.y = segments[i].y; - static getTangentRatio = function(_rat) { + return out; + } #endregion + + 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 } \ No newline at end of file diff --git a/scripts/__shapes/__shapes.gml b/scripts/__shapes/__shapes.gml index 25f0ef24a..f5e77e5c0 100644 --- a/scripts/__shapes/__shapes.gml +++ b/scripts/__shapes/__shapes.gml @@ -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]) ], @@ -16,12 +16,12 @@ new __vec2(-_sca[0], -_sca[1]) ]; return [ - [{ type: SHAPE_TYPE.triangles, triangles: triangles }], + [ { 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 \ No newline at end of file diff --git a/scripts/_node_VFX_spawner/_node_VFX_spawner.gml b/scripts/_node_VFX_spawner/_node_VFX_spawner.gml index 8e7b37648..75853a790 100644 --- a/scripts/_node_VFX_spawner/_node_VFX_spawner.gml +++ b/scripts/_node_VFX_spawner/_node_VFX_spawner.gml @@ -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 ) diff --git a/scripts/areaBox/areaBox.gml b/scripts/areaBox/areaBox.gml index 41308a422..d3941a6a3 100644 --- a/scripts/areaBox/areaBox.gml +++ b/scripts/areaBox/areaBox.gml @@ -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 } diff --git a/scripts/area_function/area_function.gml b/scripts/area_function/area_function.gml index 512f8d07b..12f1f924f 100644 --- a/scripts/area_function/area_function.gml +++ b/scripts/area_function/area_function.gml @@ -1,5 +1,3 @@ -#macro AREA_DEF [ 16, 16, 4, 4, AREA_SHAPE.rectangle ] - enum AREA_DISTRIBUTION { area, border diff --git a/scripts/array_functions/array_functions.gml b/scripts/array_functions/array_functions.gml index a362c9e31..38a64e66f 100644 --- a/scripts/array_functions/array_functions.gml +++ b/scripts/array_functions/array_functions.gml @@ -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; + var len = array_length(arr); + if(len == 0) return def; + if(overflow == ARRAY_OVERFLOW.loop) { - var len = array_length(arr); 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 diff --git a/scripts/nodd_mk_delay_machine/nodd_mk_delay_machine.gml b/scripts/nodd_mk_delay_machine/nodd_mk_delay_machine.gml index 738330233..d0d36a194 100644 --- a/scripts/nodd_mk_delay_machine/nodd_mk_delay_machine.gml +++ b/scripts/nodd_mk_delay_machine/nodd_mk_delay_machine.gml @@ -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); } diff --git a/scripts/node_FLIP_wall/node_FLIP_wall.gml b/scripts/node_FLIP_wall/node_FLIP_wall.gml index 8163c1ef9..bfec41355 100644 --- a/scripts/node_FLIP_wall/node_FLIP_wall.gml +++ b/scripts/node_FLIP_wall/node_FLIP_wall.gml @@ -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, diff --git a/scripts/node_camera/node_camera.gml b/scripts/node_camera/node_camera.gml index 0cf72edd6..e2c06a14e 100644 --- a/scripts/node_camera/node_camera.gml +++ b/scripts/node_camera/node_camera.gml @@ -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) diff --git a/scripts/node_diffuse/node_diffuse.gml b/scripts/node_diffuse/node_diffuse.gml index c83fcf277..70ad3c2ea 100644 --- a/scripts/node_diffuse/node_diffuse.gml +++ b/scripts/node_diffuse/node_diffuse.gml @@ -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_f("externalForce", _fstr); + 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(); diff --git a/scripts/node_group_input/node_group_input.gml b/scripts/node_group_input/node_group_input.gml index 75a996b00..94af20f83 100644 --- a/scripts/node_group_input/node_group_input.gml +++ b/scripts/node_group_input/node_group_input.gml @@ -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; diff --git a/scripts/node_line/node_line.gml b/scripts/node_line/node_line.gml index f539f5c6f..0e72c9d9c 100644 --- a/scripts/node_line/node_line.gml +++ b/scripts/node_line/node_line.gml @@ -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; } diff --git a/scripts/node_mesh_transform/node_mesh_transform.gml b/scripts/node_mesh_transform/node_mesh_transform.gml index 337d4510e..93ff84277 100644 --- a/scripts/node_mesh_transform/node_mesh_transform.gml +++ b/scripts/node_mesh_transform/node_mesh_transform.gml @@ -1,7 +1,6 @@ function Node_Mesh_Transform(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { - name = "Mesh Transform"; - - w = 96; + name = "Mesh Transform"; + w = 96; inputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.input, VALUE_TYPE.mesh, noone) .setVisible(true, true); @@ -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); } diff --git a/scripts/node_mk_brownian/node_mk_brownian.gml b/scripts/node_mk_brownian/node_mk_brownian.gml index 091f38220..c884ef714 100644 --- a/scripts/node_mk_brownian/node_mk_brownian.gml +++ b/scripts/node_mk_brownian/node_mk_brownian.gml @@ -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 ] ) diff --git a/scripts/node_mk_fall/node_mk_fall.gml b/scripts/node_mk_fall/node_mk_fall.gml index fea1a16dc..f6dd8a290 100644 --- a/scripts/node_mk_fall/node_mk_fall.gml +++ b/scripts/node_mk_fall/node_mk_fall.gml @@ -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); diff --git a/scripts/node_path_map_area/node_path_map_area.gml b/scripts/node_path_map_area/node_path_map_area.gml index 26a9c4ac6..314a5922d 100644 --- a/scripts/node_path_map_area/node_path_map_area.gml +++ b/scripts/node_path_map_area/node_path_map_area.gml @@ -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; diff --git a/scripts/node_rigid_object_spawner/node_rigid_object_spawner.gml b/scripts/node_rigid_object_spawner/node_rigid_object_spawner.gml index d20d51263..80a9135f2 100644 --- a/scripts/node_rigid_object_spawner/node_rigid_object_spawner.gml +++ b/scripts/node_rigid_object_spawner/node_rigid_object_spawner.gml @@ -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(); diff --git a/scripts/node_scatter/node_scatter.gml b/scripts/node_scatter/node_scatter.gml index 6609d2338..6c4c13af4 100644 --- a/scripts/node_scatter/node_scatter.gml +++ b/scripts/node_scatter/node_scatter.gml @@ -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) diff --git a/scripts/node_scatter_points/node_scatter_points.gml b/scripts/node_scatter_points/node_scatter_points.gml index 69f0702d1..af55e32bf 100644 --- a/scripts/node_scatter_points/node_scatter_points.gml +++ b/scripts/node_scatter_points/node_scatter_points.gml @@ -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) diff --git a/scripts/node_shape/node_shape.gml b/scripts/node_shape/node_shape.gml index 1ae0e9fae..e140f04c3 100644 --- a/scripts/node_shape/node_shape.gml +++ b/scripts/node_shape/node_shape.gml @@ -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) diff --git a/scripts/node_shape_polygon/node_shape_polygon.gml b/scripts/node_shape_polygon/node_shape_polygon.gml index 4f184685d..fcf062f3c 100644 --- a/scripts/node_shape_polygon/node_shape_polygon.gml +++ b/scripts/node_shape_polygon/node_shape_polygon.gml @@ -2,7 +2,9 @@ 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); diff --git a/scripts/node_smoke_add_collider/node_smoke_add_collider.gml b/scripts/node_smoke_add_collider/node_smoke_add_collider.gml index a03679a68..c0ae04180 100644 --- a/scripts/node_smoke_add_collider/node_smoke_add_collider.gml +++ b/scripts/node_smoke_add_collider/node_smoke_add_collider.gml @@ -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 = [ diff --git a/scripts/node_smoke_turbulence/node_smoke_turbulence.gml b/scripts/node_smoke_turbulence/node_smoke_turbulence.gml index 90758d12a..ceb694644 100644 --- a/scripts/node_smoke_turbulence/node_smoke_turbulence.gml +++ b/scripts/node_smoke_turbulence/node_smoke_turbulence.gml @@ -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) diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index 3d4b06848..71f0257d0 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -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; diff --git a/scripts/node_widget_test/node_widget_test.gml b/scripts/node_widget_test/node_widget_test.gml index 26628d36b..b598e81f4 100644 --- a/scripts/node_widget_test/node_widget_test.gml +++ b/scripts/node_widget_test/node_widget_test.gml @@ -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) diff --git a/scripts/node_wrap_area/node_wrap_area.gml b/scripts/node_wrap_area/node_wrap_area.gml index 573f4632b..d1aa176ac 100644 --- a/scripts/node_wrap_area/node_wrap_area.gml +++ b/scripts/node_wrap_area/node_wrap_area.gml @@ -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); diff --git a/shaders/sh_diffuse_flow/sh_diffuse_flow.fsh b/shaders/sh_diffuse_flow/sh_diffuse_flow.fsh index 16bd9e8f5..290281f97 100644 --- a/shaders/sh_diffuse_flow/sh_diffuse_flow.fsh +++ b/shaders/sh_diffuse_flow/sh_diffuse_flow.fsh @@ -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 ); } diff --git a/sprites/s_node_shape_poly_type/0688681e-9e32-4046-9fb9-c28411414622.png b/sprites/s_node_shape_poly_type/0688681e-9e32-4046-9fb9-c28411414622.png new file mode 100644 index 000000000..ab8865ec6 Binary files /dev/null and b/sprites/s_node_shape_poly_type/0688681e-9e32-4046-9fb9-c28411414622.png differ diff --git a/sprites/s_node_shape_poly_type/36c0e241-654d-449a-bdce-eae92c78e585.png b/sprites/s_node_shape_poly_type/36c0e241-654d-449a-bdce-eae92c78e585.png new file mode 100644 index 000000000..fd83616a9 Binary files /dev/null and b/sprites/s_node_shape_poly_type/36c0e241-654d-449a-bdce-eae92c78e585.png differ diff --git a/sprites/s_node_shape_poly_type/66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8.png b/sprites/s_node_shape_poly_type/66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8.png new file mode 100644 index 000000000..8b75c98af Binary files /dev/null and b/sprites/s_node_shape_poly_type/66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8.png differ diff --git a/sprites/s_node_shape_poly_type/93f9eeec-4d25-46a1-a737-87461d798a1a.png b/sprites/s_node_shape_poly_type/93f9eeec-4d25-46a1-a737-87461d798a1a.png new file mode 100644 index 000000000..a5f09a52f Binary files /dev/null and b/sprites/s_node_shape_poly_type/93f9eeec-4d25-46a1-a737-87461d798a1a.png differ diff --git a/sprites/s_node_shape_poly_type/c062d35a-662c-46c4-9898-cf687121115d.png b/sprites/s_node_shape_poly_type/c062d35a-662c-46c4-9898-cf687121115d.png new file mode 100644 index 000000000..25745dc6f Binary files /dev/null and b/sprites/s_node_shape_poly_type/c062d35a-662c-46c4-9898-cf687121115d.png differ diff --git a/sprites/s_node_shape_poly_type/cf030556-92eb-437b-80ed-1fbaec3ab825.png b/sprites/s_node_shape_poly_type/cf030556-92eb-437b-80ed-1fbaec3ab825.png new file mode 100644 index 000000000..09b17bcff Binary files /dev/null and b/sprites/s_node_shape_poly_type/cf030556-92eb-437b-80ed-1fbaec3ab825.png differ diff --git a/sprites/s_node_shape_poly_type/e38974be-d29b-448b-abd5-314672c45348.png b/sprites/s_node_shape_poly_type/e38974be-d29b-448b-abd5-314672c45348.png new file mode 100644 index 000000000..c31ba7932 Binary files /dev/null and b/sprites/s_node_shape_poly_type/e38974be-d29b-448b-abd5-314672c45348.png differ diff --git a/sprites/s_node_shape_poly_type/e6a7b907-9f2c-4296-bc7a-6a36993f07bc.png b/sprites/s_node_shape_poly_type/e6a7b907-9f2c-4296-bc7a-6a36993f07bc.png new file mode 100644 index 000000000..56da4f0c5 Binary files /dev/null and b/sprites/s_node_shape_poly_type/e6a7b907-9f2c-4296-bc7a-6a36993f07bc.png differ diff --git a/sprites/s_node_shape_poly_type/layers/0688681e-9e32-4046-9fb9-c28411414622/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/0688681e-9e32-4046-9fb9-c28411414622/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..ab8865ec6 Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/0688681e-9e32-4046-9fb9-c28411414622/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/36c0e241-654d-449a-bdce-eae92c78e585/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/36c0e241-654d-449a-bdce-eae92c78e585/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..fd83616a9 Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/36c0e241-654d-449a-bdce-eae92c78e585/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..8b75c98af Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/66c44ad0-2d4d-4a6f-a9e2-bcc3fdaa7ef8/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/93f9eeec-4d25-46a1-a737-87461d798a1a/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/93f9eeec-4d25-46a1-a737-87461d798a1a/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..a5f09a52f Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/93f9eeec-4d25-46a1-a737-87461d798a1a/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/c062d35a-662c-46c4-9898-cf687121115d/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/c062d35a-662c-46c4-9898-cf687121115d/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..25745dc6f Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/c062d35a-662c-46c4-9898-cf687121115d/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/cf030556-92eb-437b-80ed-1fbaec3ab825/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/cf030556-92eb-437b-80ed-1fbaec3ab825/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..09b17bcff Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/cf030556-92eb-437b-80ed-1fbaec3ab825/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/e38974be-d29b-448b-abd5-314672c45348/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/e38974be-d29b-448b-abd5-314672c45348/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..c31ba7932 Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/e38974be-d29b-448b-abd5-314672c45348/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/layers/e6a7b907-9f2c-4296-bc7a-6a36993f07bc/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png b/sprites/s_node_shape_poly_type/layers/e6a7b907-9f2c-4296-bc7a-6a36993f07bc/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png new file mode 100644 index 000000000..56da4f0c5 Binary files /dev/null and b/sprites/s_node_shape_poly_type/layers/e6a7b907-9f2c-4296-bc7a-6a36993f07bc/2cf10068-76aa-4aa4-8fdc-cf8df2b3f52f.png differ diff --git a/sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy b/sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy new file mode 100644 index 000000000..0e9adde2c --- /dev/null +++ b/sprites/s_node_shape_poly_type/s_node_shape_poly_type.yy @@ -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","resourceVersion":"1.0","Keyframes":[],}, + "eventStubScript": null, + "eventToFunction": {}, + "length": 8.0, + "lockOrigin": false, + "moments": {"resourceType":"KeyframeStore","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","resourceVersion":"1.0","Keyframes":[ + {"resourceType":"Keyframe","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","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","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","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","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","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","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","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, +} \ No newline at end of file