diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 9db4f2cf6..166c3414a 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -1036,6 +1036,7 @@ {"name":"Steamworks","order":2,"path":"extensions/Steamworks/Steamworks.yy",}, {"name":"sh_vertex_pnt_light","order":4,"path":"shaders/sh_vertex_pnt_light/sh_vertex_pnt_light.yy",}, {"name":"surfaceBox","order":22,"path":"scripts/surfaceBox/surfaceBox.yy",}, + {"name":"s_node_array_composite","order":17,"path":"sprites/s_node_array_composite/s_node_array_composite.yy",}, {"name":"node_gradient_palette","order":11,"path":"scripts/node_gradient_palette/node_gradient_palette.yy",}, {"name":"s_node_csv_file_read","order":9,"path":"sprites/s_node_csv_file_read/s_node_csv_file_read.yy",}, {"name":"node_fluid_domain","order":1,"path":"scripts/node_fluid_domain/node_fluid_domain.yy",}, @@ -1265,6 +1266,7 @@ {"name":"s_discord","order":7,"path":"sprites/s_discord/s_discord.yy",}, {"name":"panel_nodes","order":2,"path":"scripts/panel_nodes/panel_nodes.yy",}, {"name":"sh_gradient_points","order":19,"path":"shaders/sh_gradient_points/sh_gradient_points.yy",}, + {"name":"node_array_composite","order":17,"path":"scripts/node_array_composite/node_array_composite.yy",}, {"name":"s_node_vfx_turb","order":5,"path":"sprites/s_node_vfx_turb/s_node_vfx_turb.yy",}, {"name":"o_dialog_l_system","order":1,"path":"objects/o_dialog_l_system/o_dialog_l_system.yy",}, {"name":"node_surface_to_color","order":2,"path":"scripts/node_surface_to_color/node_surface_to_color.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index cfe15a149..4116bebfa 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1684,6 +1684,7 @@ {"id":{"name":"Steamworks","path":"extensions/Steamworks/Steamworks.yy",},}, {"id":{"name":"sh_vertex_pnt_light","path":"shaders/sh_vertex_pnt_light/sh_vertex_pnt_light.yy",},}, {"id":{"name":"surfaceBox","path":"scripts/surfaceBox/surfaceBox.yy",},}, + {"id":{"name":"s_node_array_composite","path":"sprites/s_node_array_composite/s_node_array_composite.yy",},}, {"id":{"name":"node_gradient_palette","path":"scripts/node_gradient_palette/node_gradient_palette.yy",},}, {"id":{"name":"s_node_csv_file_read","path":"sprites/s_node_csv_file_read/s_node_csv_file_read.yy",},}, {"id":{"name":"node_fluid_domain","path":"scripts/node_fluid_domain/node_fluid_domain.yy",},}, @@ -1951,6 +1952,7 @@ {"id":{"name":"s_discord","path":"sprites/s_discord/s_discord.yy",},}, {"id":{"name":"panel_nodes","path":"scripts/panel_nodes/panel_nodes.yy",},}, {"id":{"name":"sh_gradient_points","path":"shaders/sh_gradient_points/sh_gradient_points.yy",},}, + {"id":{"name":"node_array_composite","path":"scripts/node_array_composite/node_array_composite.yy",},}, {"id":{"name":"s_node_vfx_turb","path":"sprites/s_node_vfx_turb/s_node_vfx_turb.yy",},}, {"id":{"name":"o_dialog_l_system","path":"objects/o_dialog_l_system/o_dialog_l_system.yy",},}, {"id":{"name":"GmlLua","path":"scripts/GmlLua/GmlLua.yy",},}, diff --git a/scripts/__node_3d_object/__node_3d_object.gml b/scripts/__node_3d_object/__node_3d_object.gml index d4254c09e..38ac411d2 100644 --- a/scripts/__node_3d_object/__node_3d_object.gml +++ b/scripts/__node_3d_object/__node_3d_object.gml @@ -35,6 +35,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr drag_py = 0; drag_cx = 0; drag_cy = 0; + drag_rot_axis = new BBMOD_Quaternion(); drag_original = 0; @@ -341,18 +342,20 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr if(drag_axis != noone) { #region var mAng = point_direction(cx, cy, _mx, _my); - var _n = BBMOD_VEC3_FORWARD; + + if(drag_rot_axis == undefined) { + drag_rot_axis = BBMOD_VEC3_FORWARD; - switch(drag_axis) { - case 0 : _n = new BBMOD_Vec3(-1, 0, 0); break; - case 1 : _n = new BBMOD_Vec3( 0, 0, -1); break; - case 2 : _n = new BBMOD_Vec3( 0, -1, 0); break; + switch(drag_axis) { + case 0 : drag_rot_axis = new BBMOD_Vec3(-1, 0, 0); break; + case 1 : drag_rot_axis = new BBMOD_Vec3( 0, 0, -1); break; + case 2 : drag_rot_axis = new BBMOD_Vec3( 0, -1, 0); break; + } + + if(_axis == 0) drag_rot_axis = _qrot.Rotate(drag_rot_axis).Normalize(); } - if(_axis == 0) - _n = _qrot.Rotate(_n).Normalize(); - - var _nv = _qview.Rotate(_qinv.Rotate(_n)); + var _nv = _qview.Rotate(_qinv.Rotate(drag_rot_axis)); draw_line_round(cx, cy, cx + _nv.X * 100, cy + _nv.Y * 100, 2); if(drag_prev != undefined) { @@ -360,10 +363,10 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr drag_dist += _rd; var _dist = value_snap(drag_dist, _sny); - var _currR = new BBMOD_Quaternion().FromAxisAngle(_n, _dist); + var _currR = new BBMOD_Quaternion().FromAxisAngle(drag_rot_axis, _dist); var _val = _currR.Mul(drag_val); var _Nrot = _val.ToArray(); - + if(inputs[| index].setValue(_Nrot)) UNDO_HOLDING = true; } @@ -377,9 +380,10 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr if(_hover != noone && mouse_press(mb_left, active)) { #region drag_axis = _hover; drag_prev = undefined; - drag_val = _qrot.Clone(); drag_dist = 0; + + drag_rot_axis = undefined; } #endregion } #endregion diff --git a/scripts/node_array_composite/node_array_composite.gml b/scripts/node_array_composite/node_array_composite.gml new file mode 100644 index 000000000..73e108575 --- /dev/null +++ b/scripts/node_array_composite/node_array_composite.gml @@ -0,0 +1,55 @@ +function Node_Array_Composite(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { + name = "Array Composite"; + previewable = false; + + w = 96; + h = 32 + 24; + min_h = h; + + inputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) + .setArrayDepth(1) + .setVisible(true, true); + + inputs[| 1] = nodeValue("Compose", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) + .setArrayDepth(1) + .setVisible(true, true); + + outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0) + .setArrayDepth(1); + + static composite = function(arr, com) { + __tmp_com = com; + __tmp_len = array_length(com); + + return array_map(arr, function(val, ind) { + var ret = array_create(__tmp_len); + + for( var i = 0; i < __tmp_len; i++ ) + ret[i] = __tmp_com[i] * val; + + return ret; + }); + } + + static update = function(frame = PROJECT.animator.current_frame) { + var _arr = getInputData(0); + var _ker = getInputData(1); + + if(array_empty(_arr) || array_empty(_ker)) return; + + var res; + + if(is_array(_arr[0])) { + for( var i = 0, n = array_length(_arr); i < n; i++ ) + res[i] = composite(_arr[i], _ker); + } else + res = composite(_arr, _ker); + + outputs[| 0].setValue(res); + } + + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + var bbox = drawGetBbox(xx, yy, _s); + draw_sprite_fit(s_node_array_composite, 0, bbox.xc, bbox.yc, bbox.w, bbox.h); + } +} \ No newline at end of file diff --git a/scripts/node_array_composite/node_array_composite.yy b/scripts/node_array_composite/node_array_composite.yy new file mode 100644 index 000000000..722a0894e --- /dev/null +++ b/scripts/node_array_composite/node_array_composite.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_array_composite", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "array", + "path": "folders/nodes/data/value/array.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_array_composite/node_counter.yy b/scripts/node_array_composite/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_array_composite/node_counter.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "variable", + "path": "folders/nodes/data/variable.yy", + }, + "resourceVersion": "1.0", + "name": "node_counter", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_array_convolute/node_array_convolute.gml b/scripts/node_array_convolute/node_array_convolute.gml index 2e95d40a9..f2a601853 100644 --- a/scripts/node_array_convolute/node_array_convolute.gml +++ b/scripts/node_array_convolute/node_array_convolute.gml @@ -1,5 +1,5 @@ function Node_Array_Convolute(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { - name = "Array Convulute"; + name = "Array Convolute"; previewable = false; w = 96; diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 6f6ffc45f..55c42a41d 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -555,6 +555,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio addNodeObject(values, "Array Zip", s_node_array_zip, "Node_Array_Zip", [1, Node_Array_Zip]).setVersion(1138); addNodeObject(values, "Array Copy", s_node_array_copy, "Node_Array_Copy", [1, Node_Array_Copy]).setVersion(1144); addNodeObject(values, "Array Convolute",s_node_array_convolute, "Node_Array_Convolute", [1, Node_Array_Convolute]).setVersion(11540); + addNodeObject(values, "Array Composite",s_node_array_composite, "Node_Array_Composite", [1, Node_Array_Composite]).setVersion(11540); addNodeObject(values, "Sort Number", s_node_array_sort, "Node_Array_Sort", [1, Node_Array_Sort], ["array sort"]).setVersion(1120); addNodeObject(values, "Shuffle Array", s_node_array_shuffle, "Node_Array_Shuffle", [1, Node_Array_Shuffle], ["array shuffle"]).setVersion(1120); addNodeObject(values, "Loop Array", s_node_loop_array, "Node_Iterate_Each", [1, Node_Iterate_Each], ["iterate each", "for each", "array loop"], "Create group that iterate to each member in an array."); diff --git a/sprites/s_node_array_composite/c1e32408-dacc-44fe-8390-c5f18908faa2.png b/sprites/s_node_array_composite/c1e32408-dacc-44fe-8390-c5f18908faa2.png new file mode 100644 index 000000000..cad0ecbc8 Binary files /dev/null and b/sprites/s_node_array_composite/c1e32408-dacc-44fe-8390-c5f18908faa2.png differ diff --git a/sprites/s_node_array_composite/layers/c1e32408-dacc-44fe-8390-c5f18908faa2/40e42c52-1820-48c6-8bc4-61e7472c8235.png b/sprites/s_node_array_composite/layers/c1e32408-dacc-44fe-8390-c5f18908faa2/40e42c52-1820-48c6-8bc4-61e7472c8235.png new file mode 100644 index 000000000..cad0ecbc8 Binary files /dev/null and b/sprites/s_node_array_composite/layers/c1e32408-dacc-44fe-8390-c5f18908faa2/40e42c52-1820-48c6-8bc4-61e7472c8235.png differ diff --git a/sprites/s_node_array_composite/s_node_array_composite.yy b/sprites/s_node_array_composite/s_node_array_composite.yy new file mode 100644 index 000000000..670a7edd4 --- /dev/null +++ b/sprites/s_node_array_composite/s_node_array_composite.yy @@ -0,0 +1,74 @@ +{ + "resourceType": "GMSprite", + "resourceVersion": "1.0", + "name": "s_node_array_composite", + "bbox_bottom": 54, + "bbox_left": 0, + "bbox_right": 63, + "bbox_top": 8, + "bboxMode": 0, + "collisionKind": 1, + "collisionTolerance": 0, + "DynamicTexturePage": false, + "edgeFiltering": false, + "For3D": false, + "frames": [ + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"c1e32408-dacc-44fe-8390-c5f18908faa2",}, + ], + "gridX": 0, + "gridY": 0, + "height": 64, + "HTile": false, + "layers": [ + {"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"40e42c52-1820-48c6-8bc4-61e7472c8235","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,}, + ], + "nineSlice": null, + "origin": 4, + "parent": { + "name": "array", + "path": "folders/nodes/icons/value/array.yy", + }, + "preMultiplyAlpha": false, + "sequence": { + "resourceType": "GMSequence", + "resourceVersion": "1.4", + "name": "s_node_array_composite", + "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": 1.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":"c1e32408-dacc-44fe-8390-c5f18908faa2","path":"sprites/s_node_array_composite/s_node_array_composite.yy",},},},"Disabled":false,"id":"9d9b1791-593c-49f6-b7dd-58470a49a413","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,}, + ],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange": null, + "volume": 1.0, + "xorigin": 32, + "yorigin": 32, + }, + "swatchColours": null, + "swfPrecision": 2.525, + "textureGroupId": { + "name": "Default", + "path": "texturegroups/Default", + }, + "type": 0, + "VTile": false, + "width": 64, +} \ No newline at end of file