addNodeObject(vfx, "Accelerate", "Node_VFX_Accelerate", [1, Node_VFX_Accelerate], "Change the speed of particle in range.").hideRecent();
addNodeObject(vfx, "Destroy", "Node_VFX_Destroy", [1, Node_VFX_Destroy], "Destroy particle in range.").hideRecent();
addNodeObject(vfx, "Attract", "Node_VFX_Attract", [1, Node_VFX_Attract], "Attract particle in range to one point.").hideRecent();
addNodeObject(vfx, "Wind", "Node_VFX_Wind", [1, Node_VFX_Wind], "Move particle in range.").hideRecent();
addNodeObject(vfx, "Vortex", "Node_VFX_Vortex", [1, Node_VFX_Vortex], "Rotate particle around a point.").hideRecent();
addNodeObject(vfx, "Turbulence", "Node_VFX_Turbulence", [1, Node_VFX_Turbulence], "Move particle in range randomly.").hideRecent();
addNodeObject(vfx, "Repel", "Node_VFX_Repel", [1, Node_VFX_Repel], "Move particle away from point.").hideRecent();
addNodeObject(vfx, "Oscillate", "Node_VFX_Oscillate", [1, Node_VFX_Oscillate], "Swing particle around its original trajectory.").hideRecent().setVersion(11560);
addNodeObject(vfx, "Boids", "Node_VFX_Boids", [1, Node_VFX_Boids], "Apply boids algorithm to create a flock behaviour.").hideRecent().setVersion(1_18_01_0);
addNodeObject(vfx, "VFX Triangulate", "Node_VFX_Triangulate", [1, Node_VFX_Triangulate], "Render line between particles.").hideRecent().setVersion(11670);
addNodeObject(vfx, "VFX Override", "Node_VFX_Override", [1, Node_VFX_Override], "Replace particle variable with a new one.").hideRecent().setVersion(1120);
addNodeObject(rigidSim, "Render", "Node_Rigid_Render", [1, Node_Rigid_Render], "Render rigidbody object to surface.").hideRecent().setVersion(1110);
addNodeObject(rigidSim, "Apply Force", "Node_Rigid_Force_Apply", [1, Node_Rigid_Force_Apply], "Apply force to objects.").hideRecent().setVersion(1110);
addNodeObject(rigidSim, "Rigidbody Override", "Node_Rigid_Override", [1, Node_Rigid_Override], "Replace rigidbody object variable with a new one.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Update Domain", "Node_Smoke_Update", [1, Node_Smoke_Update], "Run smoke by one step.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Render Domain", "Node_Smoke_Render", [1, Node_Smoke_Render], "Render smoke to surface. This node also have update function build in.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Queue Domain", "Node_Smoke_Domain_Queue", [1, Node_Smoke_Domain_Queue], "Sync multiple domains to be render at the same time.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Apply Velocity", "Node_Smoke_Apply_Velocity", [1, Node_Smoke_Apply_Velocity], "Apply velocity to smoke.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Add Collider", "Node_Smoke_Add_Collider", [1, Node_Smoke_Add_Collider], "Add solid object that smoke can collides to.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Vortex", "Node_Smoke_Vortex", [1, Node_Smoke_Vortex], "Apply rotational force around a point.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Repulse", "Node_Smoke_Repulse", [1, Node_Smoke_Repulse], "Spread smoke away from a point.").hideRecent().setVersion(1120);
addNodeObject(smokeSim, "Turbulence", "Node_Smoke_Turbulence", [1, Node_Smoke_Turbulence], "Apply random velocity map to the smoke.").hideRecent().setVersion(1120);
addNodeObject(strandSim, "Strand Create", "Node_Strand_Create", [1, Node_Strand_Create], "Create strands from point, path, or mesh.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Update", "Node_Strand_Update", [1, Node_Strand_Update], "Update strands by one step.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Render", "Node_Strand_Render", [1, Node_Strand_Render], "Render strands to surface as a single path.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Render Texture", "Node_Strand_Render_Texture", [1, Node_Strand_Render_Texture], "Render strands to surface as a textured path.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Force Apply", "Node_Strand_Force_Apply", [1, Node_Strand_Force_Apply], "Apply general force to strands.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Break", "Node_Strand_Break", [1, Node_Strand_Break], "Detach strands from its origin.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Length Adjust", "Node_Strand_Length_Adjust", [1, Node_Strand_Length_Adjust], "Adjust length of strands in area.").hideRecent().setVersion(1140);
addNodeObject(strandSim, "Strand Collision", "Node_Strand_Collision", [1, Node_Strand_Collision], "Create solid object for strands to collides to.").hideRecent().setVersion(1140);
addNodeObject(input, "Canvas", "Node_Canvas", [1, Node_Canvas], "Draw on surface using brush, eraser, etc.").setTags(["draw"]);
addNodeObject(input, "Canvas Group", "Node_Canvas_Group", [1, Node_Canvas_Group], "Create a group that combines multiple canvas nodes a layers.").setTags(["draw"]).setVersion(11740);
addNodeObject(input, "Active Canvas", "Node_Active_Canvas", [1, Node_Active_Canvas], "Draw using parameterized brush.").setTags(["draw"]).setVersion(11570);
addNodeObject(input, "Text File In", "Node_Text_File_Read", [1, Node_Text_File_Read], "Load .txt in as text.").setTags(["txt"]).setVersion(1080);
addNodeObject(input, "Text File Out", "Node_Text_File_Write", [1, Node_Text_File_Write], "Save text as a .txt file.").setTags(["txt"]).setVersion(1090);
addNodeObject(input, "CSV File In", "Node_CSV_File_Read", [1, Node_CSV_File_Read], "Load .csv as text, number array.").setTags(["comma separated value"]).setVersion(1090);
addNodeObject(input, "ASE File In", "Node_ASE_File_Read", [0, Node_create_ASE_File_Read], "Load Aseprite file with support for layers, tags.").setVersion(1100);
addNodeObject(input, "Websocket Receiver", "Node_Websocket_Receiver", [1, Node_Websocket_Receiver], "Create websocket server to receive data from the network.").setVersion(1145);
addNodeObject(input, "Websocket Sender", "Node_Websocket_Sender", [1, Node_Websocket_Sender], "Create websocket server to send data to the network.").setVersion(1145);
addNodeObject(input, "Spout Sender", "Node_Spout_Send", [1, Node_Spout_Send], "Send surface through Spout.").setVersion(11600);
addNodeObject(filter, "Blend", "Node_Blend", [0, Node_create_Blend], "Blend 2 images using different blend modes.").setTags(global.node_blend_keys);
addNodeObject(filter, "RGBA Combine", "Node_Combine_RGB", [1, Node_Combine_RGB], "Combine 4 image in to one. Each image use to control RGBA channel.").setVersion(1070);
addNodeObject(filter, "HSV Combine", "Node_Combine_HSV", [1, Node_Combine_HSV], "Combine 4 image in to one. Each image use to control HSVA channel.").setVersion(1070);
addNodeObject(filter, "Override Channel", "Node_Override_Channel", [1, Node_Override_Channel], "Replace RGBA value of one surface with another.").setVersion(11640);
addNodeObject(filter, "Non-Uniform Blur", "Node_Blur_Simple", [1, Node_Blur_Simple], "Blur image using simpler algorithm. Allowing for variable blur strength.").setVersion(1070);
addNodeObject(filter, "Contrast Blur", "Node_Blur_Contrast", [1, Node_Blur_Contrast], "Blur only pixel of a similiar color.");
addNodeObject(filter, "Shape Blur", "Node_Blur_Shape", [1, Node_Blur_Shape], "Blur image using another image as blur map.").setVersion(11650);
addNodeObject(filter, "High Pass", "Node_High_Pass", [1, Node_High_Pass], "Apply high pass filter").setTags(["sharpen"]).setVersion(1_18_01_0);
ds_list_add(filter, "/Linear");
addNodeObject(filter, "Directional Blur", "Node_Blur_Directional", [1, Node_Blur_Directional], "Blur image given a direction.").setTags(["motion blur"]);
addNodeObject(filter, "Slope Blur", "Node_Blur_Slope", [1, Node_Blur_Slope], "Blur along a gradient of a slope map.").setTags(["motion blur"]).setVersion(11640);
addNodeObject(filter, "Zoom Blur", "Node_Blur_Zoom", [1, Node_Blur_Zoom], "Blur image by zooming in/out from a mid point.");
addNodeObject(filter, "Radial Blur", "Node_Blur_Radial", [1, Node_Blur_Radial], "Blur image by rotating around a mid point.").setVersion(1110);
addNodeObject(filter, "Path Blur", "Node_Blur_Path", [1, Node_Blur_Path], "Blur pixel along path.").setVersion(11750);
addNodeObject(filter, "Smear", "Node_Smear", [1, Node_Smear], "Stretch out brighter pixel in one direction.").setVersion(11670);
ds_list_add(filter, "/Non-Linear");
addNodeObject(filter, "Lens Blur", "Node_Blur_Bokeh", [1, Node_Blur_Bokeh], "Create bokeh effect. Blur lighter color in a lens-like manner.").setTags(["bokeh"]).setVersion(1110);
addNodeObject(filter, "Average", "Node_Average", [1, Node_Average], "Average color of every pixels in the image.").setVersion(1110);
addNodeObject(filter, "Texture Remap", "Node_Texture_Remap", [1, Node_Texture_Remap], "Remap image using texture map. Where red channel control x position and green channel control y position.");
addNodeObject(filter, "Time Remap", "Node_Time_Remap", [1, Node_Time_Remap], "Remap image using texture as time map. Where brighter pixel means using pixel from an older frame.");
addNodeObject(filter, "Shape Map", "Node_Shape_Map", [1, Node_Shape_Map], "Map image into shapes.").setVersion(11660);
addNodeObject(filter, "Outline", "Node_Outline", [1, Node_Outline], "Add border to the image.").setTags(["border"]);
addNodeObject(filter, "Glow", "Node_Glow", [1, Node_Glow], "Apply glow to the border of the image.");
addNodeObject(filter, "Shadow", "Node_Shadow", [1, Node_Shadow], "Apply shadow behind the image.");
addNodeObject(filter, "Blobify", "Node_Blobify", [1, Node_Blobify], "Round off sharp corner in BW image by bluring and thresholding.").setVersion(11650);
addNodeObject(filter, "SDF", "Node_SDF", [1, Node_SDF], "Create signed distance field using jump flooding algorithm.").setVersion(1130);
addNodeObject(filter, "Replace Image", "Node_Surface_Replace", [1, Node_Surface_Replace], "Replace instances of an image with a new one.").setTags(["image replace"]).setVersion(1140);
addNodeObject(filter, "Bloom", "Node_Bloom", [1, Node_Bloom], "Apply bloom effect, blurring and brighten the bright part of the image.");
addNodeObject(filter, "Blend Edge", "Node_Blend_Edge", [1, Node_Blend_Edge], "Blend the edges of an image to create tilable patterns.").setVersion(11740);
addNodeObject(filter, "Chromatic Aberration", "Node_Chromatic_Aberration", [1, Node_Chromatic_Aberration], "Apply chromatic aberration effect to the image.");
addNodeObject(filter, "FXAA", "Node_FXAA", [1, Node_FXAA], "Apply fast approximate anti-aliasing to te image.").setTags(["anti aliasing"]);
addNodeObject(filter, "Vignette", "Node_Vignette", [1, Node_Vignette], "Apply vignette effect to the border.").setVersion(11630);
addNodeObject(filter, "JPEG", "Node_JPEG", [1, Node_JPEG], "Apply JPEG compression to the image.").setVersion(11730);
addNodeObject(filter, "Grain", "Node_Grain", [1, Node_Grain], "Add noise pattern to the image.").setVersion(11770);
addNodeObject(filter, "Convolution", "Node_Convolution", [1, Node_Convolution], "Apply convolution operation on each pixel using a custom 3x3 kernel.").setTags(["kernel"]).setVersion(1090);
addNodeObject(filter, "Edge Detect", "Node_Edge_Detect", [1, Node_Edge_Detect], "Edge detect by applying Sobel, Prewitt, or Laplacian kernel.");
addNodeObject(filter, "Local Analyze", "Node_Local_Analyze", [1, Node_Local_Analyze], "Apply non-linear operation (minimum, maximum) on each pixel locally.").setVersion(1110);
addNodeObject(filter, "Erode", "Node_Erode", [1, Node_Erode], "Remove pixel that are close to the border of the image.");
addNodeObject(filter, "Round Corner", "Node_Corner", [1, Node_Corner], "Round out sharp corner of the image.").setVersion(1110);
addNodeObject(filter, "Interlace", "Node_Interlaced", [1, Node_Interlaced], "Apply interlace effect to an image.").setVersion(11760);
addNodeObject(filter, "Trail", "Node_Trail", [1, Node_Trail], "Blend animation by filling in the pixel 'in-between' two or more frames.").setVersion(1130);
addNodeObject(filter, "Replace Palette", "Node_Color_replace", [1, Node_Color_replace], "Match image to a palette then remap it to another palette.").setTags(["isolate colors", "select colors", "palette swap", "colors replace"]);
addNodeObject(filter, "Replace Colors", "Node_Colors_Replace", [1, Node_Colors_Replace], "Replace selected colors with a new one.").setTags(["isolate colors", "select color", "palette swap"]);
addNodeObject(filter, "Remove Color", "Node_Color_Remove", [1, Node_Color_Remove], "Remove color that match a palette.").setTags(["delete color"]);
addNodeObject(filter, "BW", "Node_BW", [1, Node_BW], "Convert color image to black and white.").setTags(["black and white"]);
addNodeObject(filter, "Greyscale", "Node_Greyscale", [1, Node_Greyscale], "Convert color image to greyscale.").setTags(["grayscale"]);
addNodeObject(filter, "RGBA Extract", "Node_RGB_Channel", [1, Node_RGB_Channel], "Extract RGBA channel on an image, each channel becomes its own image.").setTags(["channel extract"]);
addNodeObject(filter, "HSV Extract", "Node_HSV_Channel", [1, Node_HSV_Channel], "Extract HSVA channel on an image, each channel becomes its own image.").setVersion(1070);
addNodeObject(filter, "Alpha to Grey", "Node_Alpha_Grey", [1, Node_Alpha_Grey], "Convert alpha value into solid greyscale.").setTags(["alpha to gray"]);
addNodeObject(filter, "Grey to Alpha", "Node_Grey_Alpha", [1, Node_Grey_Alpha], "Convert greyscale to alpha value.").setTags(["gray to alpha"]);
addNodeObject(filter, "Level", "Node_Level", [1, Node_Level], "Adjust brightness of an image by changing its brightness range.");
addNodeObject(filter, "Level Selector", "Node_Level_Selector", [1, Node_Level_Selector], "Isolate part of the image that falls in the selected brightness range.");
addNodeObject(filter, "Curve", "Node_Curve", [1, Node_Curve], "Adjust brightness of an image using curves.").setVersion(1120);
addNodeObject(filter, "HSV Curve", "Node_Curve_HSV", [1, Node_Curve_HSV], "Adjust hsv values of an image using curves.").setVersion(11720);
addNodeObject(filter, "Threshold", "Node_Threshold", [1, Node_Threshold], "Set a threshold where pixel darker will becomes black, and brighter to white. Also works with alpha.").setVersion(1080);
addNodeObject(filter, "De-Corner", "Node_De_Corner", [1, Node_De_Corner], "Attempt to remove single pixel corner from the image.").setTags(["decorner"]);
addNodeObject(filter, "De-Stray", "Node_De_Stray", [1, Node_De_Stray], "Attempt to remove orphan pixel.").setTags(["destray"]);
addNodeObject(d3d, "Transform 3D", "Node_3D_Transform_Image", [1, Node_3D_Transform_Image], "Transform image in 3D space").setTags(["3d transform"]).setVersion(11600);
addNodeObject(d3d, "Normal", "Node_Normal", [1, Node_Normal], "Create normal map using greyscale value as height.");
addNodeObject(d3d, "Normal Light", "Node_Normal_Light", [1, Node_Normal_Light], "Light up the image using normal mapping.");
addNodeObject(d3d, "Bevel", "Node_Bevel", [1, Node_Bevel], "Apply 2D bevel on the image.");
addNodeObject(d3d, "Sprite Stack", "Node_Sprite_Stack", [1, Node_Sprite_Stack], "Create sprite stack either from repeating a single image or stacking different images using array.");
addNodeObject(d3d, "Ambient Occlusion", "Node_Ambient_Occlusion", [1, Node_Ambient_Occlusion], "Apply simple 2D AO effect using height map.").setTags(["ao"]).patreonExtra();
addNodeObject(d3d, "3D Camera", "Node_3D_Camera", [1, Node_3D_Camera], "Create 3D camera that render scene to surface.").setVersion(11510);
addNodeObject(d3d, "3D Camera Set", "Node_3D_Camera_Set", [1, Node_3D_Camera_Set], "3D camera with built-in key and fill directional lights.").setVersion(11571);
addNodeObject(d3d, "3D Scene", "Node_3D_Scene", [1, Node_3D_Scene], "Combine multiple 3D objects into a single junction.").setVersion(11510);
addNodeObject(d3d, "Transform", "Node_3D_Transform", [1, Node_3D_Transform], "Transform 3D object.").setVersion(11570);
addNodeObject(d3d, "Transform Scene", "Node_3D_Transform_Scene", [1, Node_3D_Transform_Scene], "Transform 3D scene, accepts array of transformations for each objects.").setVersion(11570);
addNodeObject(d3d, "Discretize vertex", "Node_3D_Round_Vertex", [1, Node_3D_Round_Vertex], "Round out vertex position to a specified step.").setVersion(11560);
addNodeObject(d3d, "Point Affector", "Node_3D_Point_Affector", [1, Node_3D_Point_Affector], "Generate array of 3D points interpolating between two values based on the distance.").setVersion(11570);
addNodeObject(generator, "Draw Random Shape", "Node_Random_Shape", [1, Node_Random_Shape], "Generate random shape, use for testing purposes.").setVersion(1147);
addNodeObject(generator, "Draw Bar / Graph", "Node_Plot_Linear", [0, Node_create_Plot_Linear], "Plot graph or bar chart from array of number.").setTags(global.node_plot_linear_keys).setVersion(1144);
addNodeObject(generator, "Draw Path Profile", "Node_Path_Profile", [1, Node_Path_Profile], "Fill-in an area on one side of a path.").setVersion(11660);
addNodeObject(generator, "Draw Cross Section", "Node_Cross_Section", [1, Node_Cross_Section], "Map the brightness of pixels on a linear axis into a surface.").setVersion(11710);
addNodeObject(generator, "Interpret Number", "Node_Interpret_Number", [1, Node_Interpret_Number], "Convert array of number into surface.").setVersion(11530);
addNodeObject(generator, "Pixel Builder", "Node_Pixel_Builder", [1, Node_Pixel_Builder], "Will break, do not create. please. Why is it here??").setVersion(11540);
addNodeObject(generator, "Extra Perlins", "Node_Perlin_Extra", [1, Node_Perlin_Extra], "Random perlin noise made with different algorithms.").setTags(["noise"]).patreonExtra();
addNodeObject(generator, "Extra Voronoi", "Node_Voronoi_Extra", [1, Node_Voronoi_Extra], "Random voronoi noise made with different algorithms.").setTags(["noise"]).patreonExtra();
addNodeObject(generator, "Pixel Sampler", "Node_Pixel_Sampler", [1, Node_Pixel_Sampler], "Map image on to each individual pixels of another image.").setVersion(11730);
addNodeObject(generator, "Julia", "Node_Julia_Set", [1, Node_Julia_Set], "Generate Julia fractal.").setVersion(1_18_05_6);
addNodeObject(generator, "Repeat", "Node_Repeat", [0, Node_create_Repeat], "Repeat image multiple times linearly, or in grid pattern.").setTags(global.node_repeat_keys).setVersion(1100);
addNodeObject(generator, "VFX", "Node_VFX_Group_Inline", [1, Node_VFX_Group_Inline], "Create VFX group, which generate particles that can be manipulated using different force nodes.").setSpr(s_node_vfx);
addNodeObject(generator, "RigidSim", "Node_Rigid_Group_Inline", [1, Node_Rigid_Group_Inline], "Create group for rigidbody simulation.").setSpr(s_node_rigid).setVersion(1110);
addNodeObject(generator, "FLIP Fluid", "Node_FLIP_Group_Inline", [1, Node_FLIP_Group_Inline], "Create group for fluid simulation.").setSpr(s_node_flip_group).setVersion(11620);
addNodeObject(generator, "SmokeSim", "Node_Smoke_Group_Inline", [1, Node_Smoke_Group_Inline], "Create group for smoke simulation.").setSpr(s_node_smoke_group).setVersion(1120);
addNodeObject(generator, "StrandSim", "Node_Strand_Group_Inline", [1, Node_Strand_Group_Inline], "Create group for hair simulation.").setSpr(s_node_strand).setTags(["hair"]).setVersion(1140);
addNodeObject(generator, "Diffuse", "Node_Diffuse", [1, Node_Diffuse], "Simulate diffusion like simulation.").setVersion(11640);
addNodeObject(generator, "Separate Shape", "Node_Seperate_Shape", [1, Node_Seperate_Shape], "Separate disconnected pixel each into an image in an image array.");
addNodeObject(generator, "MK Delay Machine", "Node_MK_Delay_Machine", [1, Node_MK_Delay_Machine],"Combines multiple frames of animation into one.").setVersion(11680);
addNodeObject(generator, "MK Fracture", "Node_MK_Fracture", [1, Node_MK_Fracture], "Deterministically fracture and image and apply basic physics.").patreonExtra();
addNodeObject(generator, "MK Sparkle", "Node_MK_Sparkle", [1, Node_MK_Sparkle], "Generate random star animation.").patreonExtra();
addNodeObject(generator, "MK Subpixel", "Node_MK_Subpixel", [1, Node_MK_Subpixel], "Apply subpixel filter on top of a surface.").setVersion(1_17_11_0);
addNodeObject(compose, "Stack", "Node_Stack", [1, Node_Stack], "Place image next to each other linearly, or on top of each other.").setVersion(1070);
addNodeObject(compose, "Image Grid", "Node_Image_Grid", [1, Node_Image_Grid], "Place image next to each other in grid pattern.").setVersion(11640);
addNodeObject(compose, "Camera", "Node_Camera", [1, Node_Camera], "Create camera that crop image to fix dimension with control of position, zoom. Also can be use to create parallax effect.");
addNodeObject(compose, "Render Spritesheet", "Node_Render_Sprite_Sheet", [1, Node_Render_Sprite_Sheet], "Create spritesheet from image array or animation.");
addNodeObject(compose, "Pack Sprites", "Node_Pack_Sprites", [1, Node_Pack_Sprites], "Combine array of images with different dimension using different algorithms.").setVersion(1140);
addNodeObject(values, "Math", "Node_Math", [0, Node_create_Math], "Apply mathematical function to number(s).").setTags(global.node_math_keys);
addNodeObject(values, "Equation", "Node_Equation", [0, Node_create_Equation], "Evaluate string of equation. With an option for setting variables.");
addNodeObject(values, "Statistic", "Node_Statistic", [0, Node_create_Statistic], "Apply statistical operation (sum, average, median, etc.) to array of numbers.").setTags(global.node_statistic_keys);
addNodeObject(values, "Convert Base", "Node_Base_Convert", [1, Node_Base_Convert], "Convert number from one base to another.").setTags(["binary", "hexadecimal"]).setVersion(1140);
addNodeObject(values, "FFT", "Node_FFT", [1, Node_FFT], "Perform fourier transform on number array.").setTags(["frequency analysis"]).setVersion(1144);
addNodeObject(values, "Combine Texts", "Node_String_Merge", [1, Node_String_Merge], "Combine multiple strings into one long string.").setTags(["join text", "concatenate text"]);
addNodeObject(values, "Join Text Array", "Node_String_Join", [1, Node_String_Join], "Combine string array with an option to add extra string in-between.").setVersion(1120);
addNodeObject(values, "Split Text", "Node_String_Split", [1, Node_String_Split], "Split string into arrays of substring based on delimiter.");
addNodeObject(values, "Trim Text", "Node_String_Trim", [1, Node_String_Trim], "Remove first and last n character(s) from a string.").setVersion(1080);
addNodeObject(values, "RegEx Match", "Node_String_Regex_Match", [1, Node_String_Regex_Match], "Check whether regular expression pattern exist in a string.").setVersion(1140);
addNodeObject(values, "RegEx Search", "Node_String_Regex_Search", [1, Node_String_Regex_Search], "Search for instances in a string using regular expression.").setVersion(1140);
addNodeObject(values, "RegEx Replace", "Node_String_Regex_Replace", [1, Node_String_Regex_Replace], "Replace instances of a string with another using regular expression.").setVersion(1140);
addNodeObject(values, "Separate File Path", "Node_Path_Separate_Folder", [1, Node_Path_Separate_Folder], "Separate path string into a pair of directory and filename.").setVersion(1145);
addNodeObject(values, "Array Length", "Node_Array_Length", [1, Node_Array_Length], "Returns number of members in an array.");
addNodeObject(values, "Array Get", "Node_Array_Get", [1, Node_Array_Get], "Returns nth member in an array.");
addNodeObject(values, "Array Sample", "Node_Array_Sample", [1, Node_Array_Sample], "Sample member from an array to create smaller one.").setVersion(11540);
addNodeObject(values, "Array Find", "Node_Array_Find", [1, Node_Array_Find], "Returns index of an array member that match a condition.").setVersion(1120);
addNodeObject(values, "Array Set", "Node_Array_Set", [1, Node_Array_Set], "Set array member based on index.").setVersion(1120);
addNodeObject(values, "Array Add", "Node_Array_Add", [1, Node_Array_Add], "Add elements into an array.");
addNodeObject(values, "Array Split", "Node_Array_Split", [1, Node_Array_Split], "Split array members into individual outputs.");
addNodeObject(values, "Array Insert", "Node_Array_Insert", [1, Node_Array_Insert], "Insert member into an array at any position.").setVersion(1120);
addNodeObject(values, "Array Remove", "Node_Array_Remove", [1, Node_Array_Remove], "Remove member in an array.").setTags(["delete array"]).setVersion(1120);
addNodeObject(values, "Array Shift", "Node_Array_Shift", [1, Node_Array_Shift], "Shift all member in an array.").setVersion(1137);
addNodeObject(values, "Array Rearrange", "Node_Array_Rearrange", [1, Node_Array_Rearrange], "Rearrange array member manually.").setVersion(11640);
addNodeObject(values, "Array Zip", "Node_Array_Zip", [1, Node_Array_Zip], "Combine multiple arrays into higher dimension array by grouping member of the same indicies.").setVersion(1138);
addNodeObject(values, "Array Copy", "Node_Array_Copy", [1, Node_Array_Copy], "Copy array or subarray.").setVersion(1144);
addNodeObject(values, "Array Convolute", "Node_Array_Convolute", [1, Node_Array_Convolute], "Apply convolution between 2 number arrays.").setVersion(11540);
addNodeObject(values, "Array Composite", "Node_Array_Composite", [1, Node_Array_Composite], "Create 2D array by multiplying each member in the first 1D array with the second 1D array.").setVersion(11540);
addNodeObject(values, "Loop Array", "Node_Iterate_Each_Inline", [1, Node_Iterate_Each_Inline], "Create group that iterate to each member in an array.").setSpr(s_node_loop_array).setTags(["iterate each", "for each"]);
addNodeObject(values, "Filter Array", "Node_Iterate_Filter_Inline", [1, Node_Iterate_Filter_Inline], "Filter array using condition.").setSpr(s_node_filter_array).setVersion(1140);
addNodeObject(values, "Scatter Path", "Node_Path_Scatter", [1, Node_Path_Scatter], "Scatter paths along another path.").setVersion(11740);
addNodeObject(values, "Bridge Path", "Node_Path_Bridge", [1, Node_Path_Bridge], "Create new paths that connect multiple paths at the same sample positions.").setVersion(11640);
addNodeObject(values, "Blend Path", "Node_Path_Blend", [1, Node_Path_Blend], "Blend between 2 paths.");
addNodeObject(values, "Filter Segments", "Node_Segment_Filter", [1, Node_Segment_Filter], "Filter segment (vec2 array) based on a conditions.").setVersion(11780);
addNodeObject(values, "IsoSurf", "Node_IsoSurf", [1, Node_IsoSurf], "Create a dynamic surface that changes its texture based on rotation.").setVersion(11520);
addNodeObject(values, "Surface from Buffer", "Node_Surface_From_Buffer", [1, Node_Surface_From_Buffer], "Create surface from a valid buffer.").setTags(["buffer to surface"]).setVersion(1146);
addNodeObject(values, "Buffer from Surface", "Node_Surface_To_Buffer", [1, Node_Surface_To_Buffer], "Create buffer from a surface.").setTags(["surface to buffer"]).setVersion(1146);
addNodeObject(color, "Color", "Node_Color", [1, Node_Color], "Create color value.").setSpr(s_node_color_out);
addNodeObject(color, "RGB Color", "Node_Color_RGB", [1, Node_Color_RGB], "Create (rgb) color from value in RGB color space.").setSpr(s_node_color_from_rgb);
addNodeObject(color, "HSV Color", "Node_Color_HSV", [1, Node_Color_HSV], "Create (rgb) color from value in HSV color space.").setSpr(s_node_color_from_hsv);
addNodeObject(color, "OKLCH Color", "Node_Color_OKLCH", [1, Node_Color_OKLCH], "Create (rgb) color from value in OKLCH color space.").setSpr(s_node_color_from_oklch).setTags(["oklab"]);
addNodeObject(color, "Sampler", "Node_Sampler", [1, Node_Sampler], "Sample color from an image.");
addNodeObject(color, "Find pixel", "Node_Find_Pixel", [1, Node_Find_Pixel], "Get the position of the first pixel with a given color.").setVersion(1130);
addNodeObject(color, "Palette Extract", "Node_Palette_Extract", [1, Node_Palette_Extract], "Extract palette from an image.").setVersion(1100);
addNodeObject(color, "Palette Replace", "Node_Palette_Replace", [1, Node_Palette_Replace], "Replace colors in a palette with new one.").setVersion(1120);
addNodeObject(color, "Gradient Replace", "Node_Gradient_Replace_Color", [1, Node_Gradient_Replace_Color], "Replace color inside a gradient.").setVersion(1135);
addNodeObject(color, "Gradient Data", "Node_Gradient_Extract", [1, Node_Gradient_Extract], "Get palatte and array of key positions from gradient.").setVersion(1135);
addNodeObject(color, "Sample Gradient", "Node_Gradient_Sample", [1, Node_Gradient_Sample], "Sample gradient into palette.").setVersion(1_18_04_1);
addNodeObject(animation, "Audio Window", "Node_Audio_Window", [1, Node_Audio_Window], "Take a slice of an audio array based on the current frame.").setVersion(1144);
addNodeObject(animation, "Audio Volume", "Node_Audio_Loudness", [1, Node_Audio_Loudness], "Calculate volume of an audio bit array.").setVersion(11540);
addNodeObject(animation, "FFT", "Node_FFT", [1, Node_FFT], "Perform fourier transform on number array.").setTags(["frequency analysis"]).setVersion(1144);
addNodeObject(animation, "Bar / Graph", "Node_Plot_Linear", [0, Node_create_Plot_Linear], "Plot graph or bar chart from array of number.").setTags(global.node_plot_linear_keys).setVersion(1144);
addNodeObject(node, "Feedback", "Node_Feedback", [1, Node_Feedback], "Create a group that reuse output from last frame to the current one.").isDeprecated();
addNodeObject(node, "Loop", "Node_Iterate", [1, Node_Iterate], "Create group that reuse output as input repeatedly in one frame.").isDeprecated();
addNodeObject(node, "Loop Array", "Node_Iterate_Each_Inline", [1, Node_Iterate_Each_Inline], "Create group that iterate to each member in an array.").setSpr(s_node_loop_array).setTags(["iterate each", "for each", "array loop"]);
addNodeObject(node, "Filter Array","Node_Iterate_Filter_Inline", [1, Node_Iterate_Filter_Inline], "Filter array using condition.").setSpr(s_node_filter_array).setVersion(1140);
addNodeObject(node, "Lua Global", "Node_Lua_Global", [1, Node_Lua_Global], "Execute lua script in global scope without returning any data.").setVersion(1090);
addNodeObject(node, "Lua Surface", "Node_Lua_Surface", [1, Node_Lua_Surface], "Execute lua script on a surface.").setVersion(1090);
addNodeObject(node, "Lua Compute", "Node_Lua_Compute", [1, Node_Lua_Compute], "Execute lua function and returns a data.").setVersion(1090);
addNodeObject(node, "Pin", "Node_Pin", [1, Node_Pin], "Create a pin to organize your connection. Can be create by double clicking on a connection line.");
addNodeObject(node, "Array Pin", "Node_Array_Pin", [1, Node_Array_Pin], "Create a pin that can receive multiple values and return an array.").setVersion(11770);
addNodeObject(node, "Cache", "Node_Cache", [1, Node_Cache], "Store current animation. Cache persisted between save.").setVersion(1134);
addNodeObject(node, "Cache Array", "Node_Cache_Array", [1, Node_Cache_Array], "Store current animation as array. Cache persisted between save.").setVersion(1130);
addNodeObject(hid, "RigidSim", "Node_Rigid_Group", [1, Node_Rigid_Group], "Create group for rigidbody simulation.").setSpr(s_node_rigid).setVersion(1110).hideRecent();
addNodeObject(hid, "SmokeSim", "Node_Smoke_Group", [1, Node_Smoke_Group], "Create group for fluid simulation.").setSpr(s_node_smoke_group).setVersion(1120).hideRecent();
addNodeObject(hid, "StrandSim", "Node_Strand_Group", [1, Node_Strand_Group], "Create group for hair simulation.").setSpr(s_node_strand).setVersion(1140).hideRecent();