diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index c1e531c13..54f83ccac 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -722,6 +722,7 @@ {"name":"s_node_stack","order":37,"path":"sprites/s_node_stack/s_node_stack.yy",}, {"name":"s_fade_up","order":3,"path":"sprites/s_fade_up/s_fade_up.yy",}, {"name":"panel_globalvar","order":2,"path":"scripts/panel_globalvar/panel_globalvar.yy",}, + {"name":"node_3d_render","order":20,"path":"scripts/node_3d_render/node_3d_render.yy",}, {"name":"node_guide","order":18,"path":"scripts/node_guide/node_guide.yy",}, {"name":"fd_rectangle_get_velocity_surface","order":24,"path":"scripts/fd_rectangle_get_velocity_surface/fd_rectangle_get_velocity_surface.yy",}, {"name":"s_node_text_char_get","order":2,"path":"sprites/s_node_text_char_get/s_node_text_char_get.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index e0b87b216..4969d1371 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -494,6 +494,7 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_label_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_active.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_fg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_panel_tab.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_scroll_bar.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ui_selection.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",}, @@ -1252,6 +1253,7 @@ {"id":{"name":"s_node_stack","path":"sprites/s_node_stack/s_node_stack.yy",},}, {"id":{"name":"s_fade_up","path":"sprites/s_fade_up/s_fade_up.yy",},}, {"id":{"name":"panel_globalvar","path":"scripts/panel_globalvar/panel_globalvar.yy",},}, + {"id":{"name":"node_3d_render","path":"scripts/node_3d_render/node_3d_render.yy",},}, {"id":{"name":"node_guide","path":"scripts/node_guide/node_guide.yy",},}, {"id":{"name":"fd_rectangle_get_velocity_surface","path":"scripts/fd_rectangle_get_velocity_surface/fd_rectangle_get_velocity_surface.yy",},}, {"id":{"name":"s_node_text_char_get","path":"sprites/s_node_text_char_get/s_node_text_char_get.yy",},}, diff --git a/datafiles/data/locale/en.zip b/datafiles/data/locale/en.zip index 662f45e23..d6f0861b5 100644 Binary files a/datafiles/data/locale/en.zip and b/datafiles/data/locale/en.zip differ diff --git a/datafiles/data/locale/en/nodes.json b/datafiles/data/locale/en/nodes.json index 8ee24b389..9e07df7fa 100644 --- a/datafiles/data/locale/en/nodes.json +++ b/datafiles/data/locale/en/nodes.json @@ -1,11118 +1,11126 @@ { - "Node_Unicode": { - "name": "Unicode", - "tooltip": "", + "Node_Normal": { + "tooltip": "Create normal map using greyscale value as height.", + "name": "Normal", "outputs": [ { - "name": "Character", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Unicode", - "tooltip": "" + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Height" + }, + { + "tooltip": "Include diagonal pixel in normal calculation, which leads to smoother output.", + "name": "Smooth" + }, + { + "tooltip": "", + "name": "Active" } ] }, - "Node_Array_Reverse": { - "name": "Array Reverse", + "Node_Rigid_Variable": { "tooltip": "", + "name": "Rigidbody Variable", "outputs": [ { - "name": "Array", - "tooltip": "" + "tooltip": "", + "name": "Positions" + }, + { + "tooltip": "", + "name": "Scales" + }, + { + "tooltip": "", + "name": "Rotations" + }, + { + "tooltip": "", + "name": "Blends" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Velocity" + }, + { + "tooltip": "", + "name": "Center of mass" } ], "inputs": [ { - "name": "Array", - "tooltip": "" + "tooltip": "", + "name": "Object" } ] }, - "Node_Image_Sheet": { - "name": "Splice Spritesheet", - "tooltip": "Cut up spritesheet into animation or image array.", + "Node_Array_Copy": { + "tooltip": "", + "name": "Array Copy", "outputs": [ { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Atlas Data", - "tooltip": "" + "tooltip": "", + "name": "Array" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Array" }, { - "name": "Sprite size", - "tooltip": "" + "tooltip": "", + "name": "Starting Index" }, { - "name": "Row", - "tooltip": "" + "tooltip": "", + "name": "Size" + } + ] + }, + "Node_Repeat": { + "tooltip": "Repeat image multiple times linearly, or in grid pattern.", + "name": "Repeat", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" }, { - "name": "Amount", - "tooltip": "" + "tooltip": "", + "name": "Dimension" }, { - "name": "Offset", - "tooltip": "" + "tooltip": "", + "name": "Amount" }, { - "name": "Spacing", - "tooltip": "" + "tooltip": "", + "name": "Pattern" }, { - "name": "Padding", - "tooltip": "" + "tooltip": "", + "name": "Repeat position" }, { - "name": "Output", - "tooltip": "" + "tooltip": "", + "name": "Repeat rotation" }, { - "name": "Animation speed", - "tooltip": "" + "tooltip": "", + "name": "Scale multiply" }, { - "name": "Orientation", - "tooltip": "" + "tooltip": "", + "name": "Angle range" }, { - "name": "Auto fill", - "tooltip": "Automatically set amount based on sprite size." + "tooltip": "", + "name": "Radius" }, { - "name": "Sync animation", - "tooltip": "" + "tooltip": "", + "name": "Start position" }, { - "name": "Filter empty output", - "tooltip": "" + "tooltip": "", + "name": "Scale over copy" }, { - "name": "Filtered Pixel", - "tooltip": "" + "tooltip": "Make each copy follow along path.", + "name": "Path" }, { - "name": "Filtered Color", - "tooltip": "" + "tooltip": "Range of the path to follow.", + "name": "Path range" + }, + { + "tooltip": "", + "name": "Path shift" + }, + { + "tooltip": "", + "name": "Color over copy" + }, + { + "tooltip": "", + "name": "Alpha over copy" + }, + { + "tooltip": "Whether to select image from an array in order, at random, pr spread or each image to one output.", + "name": "Array select" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Column" + }, + { + "tooltip": "", + "name": "Column shift" + }, + { + "tooltip": "", + "name": "Animator midpoint" + }, + { + "tooltip": "", + "name": "Animator range" + }, + { + "tooltip": "", + "name": "Animator position" + }, + { + "tooltip": "", + "name": "Animator rotation" + }, + { + "tooltip": "", + "name": "Animator scale" + }, + { + "tooltip": "", + "name": "Animator falloff" + }, + { + "tooltip": "Place each copy next to each other, taking surface dimension into account.", + "name": "Stack" + }, + { + "tooltip": "", + "name": "Animator blend" + }, + { + "tooltip": "", + "name": "Animator alpha" + } + ] + }, + "Node_String_Trim": { + "tooltip": "", + "name": "Trim Text", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Head" + }, + { + "tooltip": "", + "name": "Tail" + }, + { + "tooltip": "", + "name": "Trim" + }, + { + "tooltip": "Set to progress to use ratio, where 0 means no change and 1 means the entire length of the text.", + "name": "Mode" + } + ] + }, + "Node_Vector3": { + "tooltip": "", + "name": "Vector3", + "outputs": [ + { + "tooltip": "", + "name": "Vector" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "x" + }, + { + "tooltip": "", + "name": "y" + }, + { + "tooltip": "", + "name": "z" + }, + { + "tooltip": "", + "name": "Integer" + } + ] + }, + "Node_VFX_Turbulence": { + "tooltip": "", + "name": "Turbulence", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Falloff distance" + }, + { + "tooltip": "", + "name": "Effect Vector" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Rotate particle" + }, + { + "tooltip": "", + "name": "Scale particle" + }, + { + "tooltip": "", + "name": "Turbulence scale" + } + ] + }, + "Node_Tunnel_In": { + "tooltip": "Create tunnel for sending value based on key matching.", + "name": "Tunnel In", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Name" + }, + { + "tooltip": "", + "name": "Value in" + } + ] + }, + "Node_Array_Range": { + "tooltip": "Create array of numbers by setting start, end and step length.", + "name": "Array Range", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Start" + }, + { + "tooltip": "", + "name": "End" + }, + { + "tooltip": "", + "name": "Step" + } + ] + }, + "Node_Edge_Detect": { + "tooltip": "Edge detect by applying Sobel, Prewitt, or Laplacian kernel.", + "name": "Edge Detect", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Algorithm" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Palette_Extract": { + "tooltip": "Extract palette from an image.", + "name": "Palette Extract", + "outputs": [ + { + "tooltip": "", + "name": "Palette" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Amount of color in a palette.", + "name": "Max colors" + }, + { + "tooltip": "Random seed to be used to initialize K-mean algorithm.", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Algorithm" + } + ] + }, + "Node_VFX_Variable": { + "tooltip": "", + "name": "VFX Variable", + "outputs": [ + { + "tooltip": "", + "name": "Positions" + }, + { + "tooltip": "", + "name": "Scales" + }, + { + "tooltip": "", + "name": "Rotations" + }, + { + "tooltip": "", + "name": "Blending" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Life" + }, + { + "tooltip": "", + "name": "Max life" + }, + { + "tooltip": "", + "name": "Surface" + }, + { + "tooltip": "", + "name": "Velocity" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + } + ] + }, + "Node_Checker": { + "tooltip": "Genearte checkerboard pattern.", + "name": "Checker", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Color 1" + }, + { + "tooltip": "", + "name": "Color 2" + } + ] + }, + "Node_Path": { + "tooltip": "", + "name": "Path", + "outputs": [ + { + "tooltip": "", + "name": "Position out" + }, + { + "tooltip": "", + "name": "Path data" + }, + { + "tooltip": "", + "name": "Anchors" + } + ], + "inputs": [ + { + "tooltip": "Sample position from path.", + "name": "Path progress" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "", + "name": "Progress mode" + }, + { + "tooltip": "", + "name": "Round anchor" + } + ] + }, + "Node_Iterate_Filter": { + "tooltip": "Filter array using condition.", + "name": "Filter Array", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + } + ] + }, + "Node_Rigid_Object": { + "tooltip": "", + "name": "Object", + "outputs": [ + { + "tooltip": "", + "name": "Object" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Affect by force" + }, + { + "tooltip": "", + "name": "Weight" + }, + { + "tooltip": "", + "name": "Contact friction" + }, + { + "tooltip": "", + "name": "Air resistance" + }, + { + "tooltip": "", + "name": "Rotation resistance" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Texture" + }, + { + "tooltip": "", + "name": "Start shape" + }, + { + "tooltip": "Make object spawn when start.", + "name": "Spawn" + }, + { + "tooltip": "", + "name": "Generate mesh" + }, + { + "tooltip": "", + "name": "Mesh expansion" + } + ] + }, + "Node_Image_gif": { + "tooltip": "Load animated .gif from your computer.", + "name": "Image GIF", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Set animation length to gif" + } + ] + }, + "Node_Print": { + "tooltip": "Display text to notification.", + "name": "Print", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Text" + } + ] + }, + "Node_6radient_Out": { + "tooltip": "", + "name": "Gradient", + "outputs": [ + { + "tooltip": "", + "name": "Gradient" + }, + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Gradient" + }, + { + "tooltip": "Position to sample a color from the gradient.", + "name": "Sample" + } + ] + }, + "Node_Gradient_Shift": { + "tooltip": "Move gradients keys.", + "name": "Gradient Shift", + "outputs": [ + { + "tooltip": "", + "name": "Gradient" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Gradient" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Wrap" + }, + { + "tooltip": "", + "name": "Scale" + } + ] + }, + "Node_Shadow": { + "tooltip": "Apply shadow behind the image.", + "name": "Shadow", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Grow" + }, + { + "tooltip": "", + "name": "Blur" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Normal_Light": { + "tooltip": "Light up the image using normal mapping.", + "name": "Normal Light", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Normal map" + }, + { + "tooltip": "", + "name": "Normal intensity" + }, + { + "tooltip": "", + "name": "Ambient" + }, + { + "tooltip": "", + "name": "Light position" + }, + { + "tooltip": "", + "name": "Light range" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Light type" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Iterate": { + "tooltip": "Create group that reuse output as input repeatedly in one frame.", + "name": "Loop", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Repeat" + } + ] + }, + "Node_Greyscale": { + "tooltip": "Convert color image to greyscale.", + "name": "Greyscale", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Brightness" + }, + { + "tooltip": "", + "name": "Contrast" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Cache": { + "tooltip": "Store current animation. Cache persisted between save.", + "name": "Cache", + "outputs": [ + { + "tooltip": "", + "name": "Cache surface" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + } + ] + }, + "Node_3D_Combine": { + "tooltip": "Combine multiple 3D object to a single scene,", + "name": "3D Combine", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D objects" + }, + { + "tooltip": "", + "name": "Normal pass" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + }, + { + "tooltip": "", + "name": "3D object" + } + ] + }, + "Node_Scatter": { + "tooltip": "Scatter image randomly multiple times.", + "name": "Scatter", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Atlas data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Distribution" + }, + { + "tooltip": "Rotate each copy to face the spawn center.", + "name": "Point at center" + }, + { + "tooltip": "", + "name": "Uniform scaling" + }, + { + "tooltip": "", + "name": "Scatter" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Random blend" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Distribution map" + }, + { + "tooltip": "", + "name": "Distribution data" + }, + { + "tooltip": "What to do when input array of surface.\r\n- Spread: Create Array of output each scattering single surface.\r\n- Mixed: Create single output scattering multiple images.", + "name": "Array" + }, + { + "tooltip": "", + "name": "Multiply alpha" + }, + { + "tooltip": "Apply the third value in each data point (if exist) on given properties.", + "name": "Use value" + }, + { + "tooltip": "", + "name": "Blend mode" + }, + { + "tooltip": "", + "name": "Path" + } + ] + }, + "Node_Warp": { + "tooltip": "Warp image by freely moving the corners.", + "name": "Warp", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Top left" + }, + { + "tooltip": "", + "name": "Top right" + }, + { + "tooltip": "", + "name": "Bottom left" + }, + { + "tooltip": "", + "name": "Bottom right" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Array_Shuffle": { + "tooltip": "", + "name": "Shuffle Array", + "outputs": [ + { + "tooltip": "", + "name": "Shuffled array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array in" + }, + { + "tooltip": "", + "name": "Seed" + } + ] + }, + "Node_Mesh_Transform": { + "tooltip": "", + "name": "Mesh Transform", + "outputs": [ + { + "tooltip": "", + "name": "Mesh" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Mesh" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Anchor" + } + ] + }, + "Node_Fluid_Group": { + "tooltip": "Create group for fluid simulation.", + "name": "FluidSim", + "outputs": [], + "inputs": [] + }, + "Node_Base_Convert": { + "tooltip": "", + "name": "Convert Base", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Base from" + }, + { + "tooltip": "", + "name": "Base to" + } + ] + }, + "Node_Vector_Cross_2D": { + "tooltip": "", + "name": "Cross product 2D", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Point 1" + }, + { + "tooltip": "", + "name": "Point 2" + } + ] + }, + "Node_CSV_File_Read": { + "tooltip": "Load .csv as text, number array.", + "name": "CSV File In", + "outputs": [ + { + "tooltip": "", + "name": "Content" + }, + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Convert to number" + } + ] + }, + "Node_3D_Displace": { + "tooltip": "", + "name": "3D Displace", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "3D vertex" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + }, + { + "tooltip": "", + "name": "Displacement map" + }, + { + "tooltip": "", + "name": "Strength" + } + ] + }, + "Node_3D_Export": { + "tooltip": "", + "name": "3D Export", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Vertex data" + }, + { + "tooltip": "Export location without '.obj' extension.", + "name": "Path" + }, + { + "tooltip": "", + "name": "Export texture" + } + ] + }, + "Node_Area": { + "tooltip": "", + "name": "Area", + "outputs": [ + { + "tooltip": "", + "name": "Area" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Postion" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "", + "name": "Shape" + } + ] + }, + "Node_Blur_Zoom": { + "tooltip": "Blur image by zooming in\/out from a mid point.", + "name": "Zoom Blur", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Zoom mode" + }, + { + "tooltip": "", + "name": "Blur mask" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Skew": { + "tooltip": "Skew image horizontally, or vertically.", + "name": "Skew", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Axis" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Wrap" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_De_Corner": { + "tooltip": "Attempt to remove single pixel corner from the image.", + "name": "De-Corner", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Tolerance" + } + ] + }, + "Node_3D_Obj": { + "tooltip": "Load .obj file from your computer as a 3D object.", + "name": "3D Object", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Generate" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "Flip UV axis, can be use to fix some texture mapping error.", + "name": "Flip UV" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Atlas": { + "tooltip": "Replace transparent pixel with the closet non-transparent pixel.", + "name": "Pixel Expand", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_3D_Cylinder": { + "tooltip": "", + "name": "3D Cylinder", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Sides" + }, + { + "tooltip": "", + "name": "Thickness" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Textures top" + }, + { + "tooltip": "", + "name": "Textures bottom" + }, + { + "tooltip": "", + "name": "Textures side" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Taper" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Alpha_Cutoff": { + "tooltip": "Remove pixel with low alpha value.", + "name": "Alpha Cutoff", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Any pixel with less alpha (more transparent) than this will be removed.", + "name": "Minimum" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_BW": { + "tooltip": "Convert color image to black and white.", + "name": "BW", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Brightness" + }, + { + "tooltip": "", + "name": "Contrast" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_FFT": { + "tooltip": "Perform fourier transform on number array.", + "name": "FFT", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Data" + }, + { + "tooltip": "", + "name": "Preprocess Function" + } + ] + }, + "Node_String_Regex_Search": { + "tooltip": "", + "name": "RegEx Search", + "outputs": [ + { + "tooltip": "", + "name": "Results" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Regex" + } + ] + }, + "Node_Gradient": { + "tooltip": "Create image from gradient.", + "name": "Draw Gradient", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Gradient" + }, + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Scale" + } + ] + }, + "Node_Rigid_Group": { + "tooltip": "Create group for rigidbody simulation.", + "name": "RigidSim", + "outputs": [], + "inputs": [] + }, + "Node_Rigid_Force_Apply": { + "tooltip": "", + "name": "Apply Force", + "outputs": [ + { + "tooltip": "", + "name": "Object" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Object" + }, + { + "tooltip": "", + "name": "Force type" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Torque" + }, + { + "tooltip": "Frame index to apply force.", + "name": "Apply frame" + }, + { + "tooltip": "", + "name": "Force" + }, + { + "tooltip": "", + "name": "Scope" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Range" + } + ] + }, + "Node_Texture_Remap": { + "tooltip": "Remap image using texture map. Where red channel control x position and green channel control y position.", + "name": "Texture Remap", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Displacement map where red retermine the X position, and green determine the Y position.", + "name": "RG Map" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Grid_Tri": { + "tooltip": "Generate triangular grid pattern.", + "name": "Triangular Grid", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Gap" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Tile color" + }, + { + "tooltip": "", + "name": "Gap color" + }, + { + "tooltip": "", + "name": "Texture" + }, + { + "tooltip": "", + "name": "Render type" + }, + { + "tooltip": "", + "name": "Seed" + } + ] + }, + "Node_Bevel": { + "tooltip": "Apply 2D bevel on the image.", + "name": "Bevel", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Height" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Slope" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + } + ] + }, + "Node_Shadow_Cast": { + "tooltip": "Apply light that create shadow using shadow mask.", + "name": "Cast Shadow", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Light mask" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Solid" + }, + { + "tooltip": "", + "name": "Light Position" + }, + { + "tooltip": "", + "name": "Soft light radius" + }, + { + "tooltip": "", + "name": "Light density" + }, + { + "tooltip": "", + "name": "Light type" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Light radius" + }, + { + "tooltip": "", + "name": "Render solid" + }, + { + "tooltip": "If checked, background color will be used as shadow caster.", + "name": "Use BG color" + }, + { + "tooltip": "", + "name": "BG threshold" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Banding" + }, + { + "tooltip": "Control how light fade out over distance.", + "name": "Attenuation" + }, + { + "tooltip": "", + "name": "Ambient occlusion" + }, + { + "tooltip": "", + "name": "Ambient occlusion strength" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Sequence_Anim": { + "tooltip": "Convert array of images into animation.", + "name": "Array to Anim", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Speed" + }, + { + "tooltip": "", + "name": "Sequence" + }, + { + "tooltip": "", + "name": "Overflow" + } + ] + }, + "Node_Array": { + "tooltip": "", + "name": "Array", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Spread array" + }, + { + "tooltip": "", + "name": "Input" + } + ] + }, + "Node_Vector2": { + "tooltip": "", + "name": "Vector2", + "outputs": [ + { + "tooltip": "", + "name": "Vector" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "x" + }, + { + "tooltip": "", + "name": "y" + }, + { + "tooltip": "", + "name": "Integer" + }, + { + "tooltip": "", + "name": "Display" + }, + { + "tooltip": "", + "name": "Reset to center" + } + ] + }, + "Node_SDF": { + "tooltip": "Create signed distance field using jump flooding algorithm.", + "name": "SDF", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Side" + }, + { + "tooltip": "", + "name": "Max distance" + } + ] + }, + "Node_Particle": { + "tooltip": "Generate particle effect.", + "name": "Particle", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particle sprite" + }, + { + "tooltip": "Frames delay between each particle spawn.", + "name": "Spawn delay" + }, + { + "tooltip": "Amount of particle spawn in that frame.", + "name": "Spawn amount" + }, + { + "tooltip": "", + "name": "Spawn area" + }, + { + "tooltip": "", + "name": "Spawn distribution" + }, + { + "tooltip": "", + "name": "Lifespan" + }, + { + "tooltip": "", + "name": "Spawn direction" + }, + { + "tooltip": "", + "name": "Acceleration" + }, + { + "tooltip": "", + "name": "Orientation" + }, + { + "tooltip": "", + "name": "Rotational speed" + }, + { + "tooltip": "", + "name": "Spawn scale" + }, + { + "tooltip": "", + "name": "Scale over time" + }, + { + "tooltip": "", + "name": "Color over lifetime" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Alpha over time" + }, + { + "tooltip": "Make the particle rotates to follow its movement.", + "name": "Rotate by direction" + }, + { + "tooltip": "", + "name": "Spawn type" + }, + { + "tooltip": "", + "name": "Spawn size" + }, + { + "tooltip": "", + "name": "Spawn velocity" + }, + { + "tooltip": "", + "name": "Gravity" + }, + { + "tooltip": "", + "name": "Wiggle" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "Whether to select image from an array in order, at random, or treat array as animation.", + "name": "Surface array" + }, + { + "tooltip": "", + "name": "Animation speed" + }, + { + "tooltip": "", + "name": "Scatter" + }, + { + "tooltip": "", + "name": "Boundary data" + }, + { + "tooltip": "", + "name": "On animation end" + }, + { + "tooltip": "", + "name": "Spawn" + }, + { + "tooltip": "", + "name": "Random blend" + }, + { + "tooltip": "Make particle move away from the spawn center.", + "name": "Directed from center" + }, + { + "tooltip": "", + "name": "Distribution map" + }, + { + "tooltip": "", + "name": "Distribution data" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Gravity direction" + }, + { + "tooltip": "", + "name": "Turning" + }, + { + "tooltip": "Apply randomized 1, -1 multiplier to the turning speed.", + "name": "Turn both directions" + }, + { + "tooltip": "", + "name": "Turn scale with speed" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "Round position to the closest integer value to avoid jittering.", + "name": "Round position" + }, + { + "tooltip": "", + "name": "Blend mode" + } + ] + }, + "Node_Switch": { + "tooltip": "Given an index, output value base on index matching.", + "name": "Switch", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Index" + }, + { + "tooltip": "", + "name": "Default value" + }, + { + "tooltip": "", + "name": "Case" + }, + { + "tooltip": "", + "name": "value" + } + ] + }, + "Node_Feedback_Output": { + "tooltip": "", + "name": "Output", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Order" + }, + { + "tooltip": "", + "name": "Feedback loop" + } + ] + }, + "Node_Rigid_Override": { + "tooltip": "", + "name": "Rigidbody Override", + "outputs": [ + { + "tooltip": "", + "name": "Object" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Object" + }, + { + "tooltip": "", + "name": "Positions" + }, + { + "tooltip": "", + "name": "Scales" + }, + { + "tooltip": "", + "name": "Rotations" + }, + { + "tooltip": "", + "name": "Blends" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Velocity" + } + ] + }, + "Node_Iterator_Input": { + "tooltip": "", + "name": "Input", + "outputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Loop entrance" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Display type" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Input type" + }, + { + "tooltip": "", + "name": "Enum label" + }, + { + "tooltip": "", + "name": "Vector size" + }, + { + "tooltip": "", + "name": "Order" + }, + { + "tooltip": "", + "name": "Display preview gizmo" + }, + { + "tooltip": "", + "name": "Step" + } + ] + }, + "Node_Blur_Simple": { + "tooltip": "Blur image using simpler algorithm. Allowing for variable blur strength.", + "name": "Simple Blur", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Blur mask" + }, + { + "tooltip": "Replace all color while keeping the alpha. Used to\nfix grey outline when bluring transparent pixel.", + "name": "Override color" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Text": { + "tooltip": "Draw text on an image.", + "name": "Draw Text", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Font" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "", + "name": "Anti-Aliasing " + }, + { + "tooltip": "", + "name": "Character range" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Fixed dimension" + }, + { + "tooltip": "", + "name": "Horizontal alignment" + }, + { + "tooltip": "", + "name": "Vertical alignment" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "", + "name": "Padding" + } + ] + }, + "Node_Mirror": { + "tooltip": "Reflect the image along a reflection line.", + "name": "Mirror", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Mirror mask" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Frame": { + "tooltip": "Create frame surrounding nodes.", + "name": "Frame", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Alpha" + } + ] + }, + "Node_Scale_Algo": { + "tooltip": "Scale image using scale2x, scale3x algorithm.", + "name": "Scale Algorithm", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Algorithm" + }, + { + "tooltip": "", + "name": "Tolerance" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Color_adjust": { + "tooltip": "Adjust brightness, contrast, hue, saturation, value, alpha, and blend image with color.", + "name": "Color Adjust", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Color out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Brightness" + }, + { + "tooltip": "", + "name": "Contrast" + }, + { + "tooltip": "", + "name": "Hue" + }, + { + "tooltip": "", + "name": "Saturation" + }, + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Blend" + }, + { + "tooltip": "", + "name": "Blend alpha" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Exposure" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Input Type" + }, + { + "tooltip": "", + "name": "Color" + } + ] + }, + "Node_Curve": { + "tooltip": "Adjust brightness of an image using curves.", + "name": "Curve", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Brightness" + }, + { + "tooltip": "", + "name": "Red" + }, + { + "tooltip": "", + "name": "Green" + }, + { + "tooltip": "", + "name": "Blue" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Wiggler": { + "tooltip": "Create smooth random value.", + "name": "Wiggler", + "outputs": [ + { + "tooltip": "", + "name": "Output" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Frequency" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Display" + } + ] + }, + "Node_Mesh_Warp": { + "tooltip": "Wrap image by converting it to mesh, and using control points.", + "name": "Mesh Warp", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Mesh data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Amount of grid subdivision. Higher number means more grid, detail.", + "name": "Sample" + }, + { + "tooltip": "", + "name": "Spring Force" + }, + { + "tooltip": "", + "name": "Mesh" + }, + { + "tooltip": "Include diagonal link to prevent drastic grid deformation.", + "name": "Diagonal Link" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "Link length preservation, setting it to 1 will prevent any stretching, contraction.", + "name": "Link Strength" + }, + { + "tooltip": "", + "name": "Full Mesh" + } + ] + }, + "Node_3D_Repeat": { + "tooltip": "Repeat 3D object multiple times.", + "name": "3D Repeat", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D objects" + }, + { + "tooltip": "", + "name": "Normal pass" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "3D object" + }, + { + "tooltip": "Amount of copies to be generated.", + "name": "Repeat" + }, + { + "tooltip": "", + "name": "Repeat position" + }, + { + "tooltip": "", + "name": "Repeat rotation" + }, + { + "tooltip": "", + "name": "Repeat scale" + }, + { + "tooltip": "", + "name": "Repeat pattern" + }, + { + "tooltip": "", + "name": "Axis" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Padding": { + "tooltip": "Make image bigger by adding space in 4 directions.", + "name": "Padding", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Padding" + }, + { + "tooltip": "", + "name": "Fill method" + }, + { + "tooltip": "", + "name": "Fill color" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Pad mode" + }, + { + "tooltip": "", + "name": "Target dimension" + }, + { + "tooltip": "", + "name": "Horizontal alignment" + }, + { + "tooltip": "", + "name": "Vertical alignment" + } + ] + }, + "Node_Group_Input": { + "tooltip": "", + "name": "Input", + "outputs": [ + { + "tooltip": "", + "name": "Value" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Display type" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Input type" + }, + { + "tooltip": "", + "name": "Enum label" + }, + { + "tooltip": "", + "name": "Vector size" + }, + { + "tooltip": "", + "name": "Order" + }, + { + "tooltip": "", + "name": "Display preview gizmo" + }, + { + "tooltip": "", + "name": "Step" + } + ] + }, + "Node_Alpha_Grey": { + "tooltip": "Convert alpha value into solid greyscale.", + "name": "Alpha to Grey", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_VFX_Wind": { + "tooltip": "", + "name": "Wind", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Falloff distance" + }, + { + "tooltip": "", + "name": "Effect Vector" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Rotate particle" + }, + { + "tooltip": "", + "name": "Scale particle" + } + ] + }, + "Node_Path_Reverse": { + "tooltip": "", + "name": "Reverse Path", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + } + ] + }, + "Node_Text_File_Write": { + "tooltip": "Save text as a .txt file.", + "name": "Text File Out", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Content" } ] }, "Node_Palette": { - "name": "Palette", "tooltip": "", + "name": "Palette", "outputs": [ { - "name": "Palette", - "tooltip": "" + "tooltip": "", + "name": "Palette" } ], "inputs": [ { - "name": "Palette", - "tooltip": "" + "tooltip": "", + "name": "Palette" }, { - "name": "Trim range", - "tooltip": "" + "tooltip": "", + "name": "Trim range" + } + ] + }, + "Node_3D_Transform": { + "tooltip": "", + "name": "3D Transform", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "3D object" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Rigid_Global": { + "tooltip": "", + "name": "RigidSim Global", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Gravity" + } + ] + }, + "Node_Iterator_Output": { + "tooltip": "", + "name": "Output", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Order" + }, + { + "tooltip": "", + "name": "Loop exit" + } + ] + }, + "Node_Perlin": { + "tooltip": "Generate perlin noise.", + "name": "Perlin Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Iteration" + }, + { + "tooltip": "", + "name": "Tile" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Color mode" + }, + { + "tooltip": "", + "name": "Color R range" + }, + { + "tooltip": "", + "name": "Color G range" + }, + { + "tooltip": "", + "name": "Color B range" + } + ] + }, + "Node_Random": { + "tooltip": "", + "name": "Random", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "seed" + }, + { + "tooltip": "", + "name": "from" + }, + { + "tooltip": "", + "name": "to" + } + ] + }, + "Node_Text_File_Read": { + "tooltip": "Load .txt in as text.", + "name": "Text File In", + "outputs": [ + { + "tooltip": "", + "name": "Content" + }, + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + } + ] + }, + "Node_Path_Plot": { + "tooltip": "", + "name": "Path plot", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Output scale" + }, + { + "tooltip": "", + "name": "Coordinate" + }, + { + "tooltip": "", + "name": "Equation type" + }, + { + "tooltip": "", + "name": "0 function" + }, + { + "tooltip": "", + "name": "1 function" + }, + { + "tooltip": "", + "name": "Origin" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Input scale" + }, + { + "tooltip": "", + "name": "Input shift" + } + ] + }, + "Node_Render_Sprite_Sheet": { + "tooltip": "Create spritesheet from image array or animation.", + "name": "Render Spritesheet", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Atlas Data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Sprites" + }, + { + "tooltip": "", + "name": "Sprite set" + }, + { + "tooltip": "Number of frames until next sprite. Can be seen as (Step - 1) frame skip.", + "name": "Frame step" + }, + { + "tooltip": "", + "name": "Packing type" + }, + { + "tooltip": "", + "name": "Grid column" + }, + { + "tooltip": "", + "name": "Alignment" + }, + { + "tooltip": "", + "name": "Spacing" + }, + { + "tooltip": "", + "name": "Padding" + }, + { + "tooltip": "Starting\/ending frames, set end to 0 to default to last frame.", + "name": "Range" + } + ] + }, + "Node_Atlas_Set": { + "tooltip": "", + "name": "Atlas Set", + "outputs": [ + { + "tooltip": "", + "name": "Atlas" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Atlas" + }, + { + "tooltip": "", + "name": "Surface" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Blend" + }, + { + "tooltip": "", + "name": "Alpha" + } + ] + }, + "Node_Path_Trim": { + "tooltip": "", + "name": "Trim Path", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Range" + } + ] + }, + "Node_String_Regex_Replace": { + "tooltip": "", + "name": "RegEx Replace", + "outputs": [ + { + "tooltip": "", + "name": "Results" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Regex" + }, + { + "tooltip": "", + "name": "Replacement" + } + ] + }, + "Node_Image": { + "tooltip": "Load a single image from your computer.", + "name": "Image", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Padding" + } + ] + }, + "Node_Noise_Aniso": { + "tooltip": "Generate anisotropic noise.", + "name": "Anisotropic Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + } + ] + }, + "Node_Path_Wave": { + "tooltip": "", + "name": "Wave Path", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Frequency" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Smooth" + } + ] + }, + "Node_Strand_Group": { + "tooltip": "Create group for hair simulation.", + "name": "StrandSim", + "outputs": [], + "inputs": [] + }, + "Node_Dilate": { + "tooltip": "Expand the image around a mid point.", + "name": "Dilate", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Fluid_Domain": { + "tooltip": "", + "name": "Fluid Domain", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Collision" + }, + { + "tooltip": "", + "name": "Material dissipation type" + }, + { + "tooltip": "", + "name": "Material dissipation" + }, + { + "tooltip": "", + "name": "Velocity dissipation type" + }, + { + "tooltip": "", + "name": "Velocity dissipation" + }, + { + "tooltip": "", + "name": "Acceleration" + }, + { + "tooltip": "", + "name": "Material intertia" + }, + { + "tooltip": "", + "name": "Initial pressure" + }, + { + "tooltip": "", + "name": "Material maccormack weight" + }, + { + "tooltip": "", + "name": "Velocity maccormack weight" + }, + { + "tooltip": "", + "name": "Wrap" + }, + { + "tooltip": "", + "name": "Loop" + } + ] + }, + "Node_Convolution": { + "tooltip": "Apply convolution operation on each pixel using a custom 3x3 kernel.", + "name": "Convolution", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Kernel" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Gradient_Palette": { + "tooltip": "Create gradient from palette.", + "name": "Palette to Gradient", + "outputs": [ + { + "tooltip": "", + "name": "Gradient" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Palette" + }, + { + "tooltip": "", + "name": "Custom positions" + }, + { + "tooltip": "Array of number indicating color position (0 - 1).", + "name": "Positions" + }, + { + "tooltip": "", + "name": "Blending" + } + ] + }, + "Node_Lua_Surface": { + "tooltip": "", + "name": "Lua Surface", + "outputs": [ + { + "tooltip": "", + "name": "Execution thread" + }, + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Function name" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": 14, + "name": "Lua code" + }, + { + "tooltip": "", + "name": "Execution thread" + }, + { + "tooltip": "", + "name": "Execute on frame" + }, + { + "tooltip": "", + "name": "Argument name" + }, + { + "tooltip": "", + "name": "Argument type" + }, + { + "tooltip": "", + "name": "Argument value" + } + ] + }, + "Node_Iterate_Each": { + "tooltip": "Create group that iterate to each member in an array.", + "name": "Loop Array", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + } + ] + }, + "Node_Fluid_Repulse": { + "tooltip": "", + "name": "Repulse", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Mode" + } + ] + }, + "Node_Logic": { + "tooltip": "", + "name": "Logic Opr", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "a" + }, + { + "tooltip": "", + "name": "b" + } + ] + }, + "Node_Strand_Update": { + "tooltip": "", + "name": "Strand Update", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Step" + } + ] + }, + "Node_Struct_Get": { + "tooltip": "", + "name": "Struct Get", + "outputs": [ + { + "tooltip": "", + "name": "Struct" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Struct" + }, + { + "tooltip": "", + "name": "Key" + } + ] + }, + "Node_Websocket_Receiver": { + "tooltip": "Create websocket server to receive data from the network.", + "name": "Websocket Receiver", + "outputs": [ + { + "tooltip": "", + "name": "Data" + }, + { + "tooltip": "", + "name": "Receive data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Port" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Array_Find": { + "tooltip": "", + "name": "Array Find", + "outputs": [ + { + "tooltip": "", + "name": "Index" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Value" + } + ] + }, + "Node_Number": { + "tooltip": "", + "name": "Number", + "outputs": [ + { + "tooltip": "", + "name": "Number" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Integer" + }, + { + "tooltip": "", + "name": "Display" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Step" + } + ] + }, + "Node_Atlas_Get": { + "tooltip": "", + "name": "Atlas Get", + "outputs": [ + { + "tooltip": "", + "name": "Surface" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Blend" + }, + { + "tooltip": "", + "name": "Alpha" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Atlas" + } + ] + }, + "Node_Display_Text": { + "tooltip": "Display text on the graph.", + "name": "Display Text", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Style" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Line width" + } + ] + }, + "Node_Lua_Compute": { + "tooltip": "", + "name": "Lua Compute", + "outputs": [ + { + "tooltip": "", + "name": "Execution thread" + }, + { + "tooltip": "", + "name": "Return value" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Function name" + }, + { + "tooltip": "", + "name": "Return type" + }, + { + "tooltip": 14, + "name": "Lua code" + }, + { + "tooltip": "", + "name": "Execution thread" + }, + { + "tooltip": "", + "name": "Execute on frame" + }, + { + "tooltip": "", + "name": "Argument name" + }, + { + "tooltip": "", + "name": "Argument type" + }, + { + "tooltip": "", + "name": "Argument value" + } + ] + }, + "Node_Time_Remap": { + "tooltip": "Remap image using texture as time map. Where brighter pixel means using pixel from an older frame.", + "name": "Time Remap", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Map" + }, + { + "tooltip": "", + "name": "Max life" + }, + { + "tooltip": "", + "name": "Loop" + } + ] + }, + "Node_Trigger": { + "tooltip": "", + "name": "Trigger", + "outputs": [ + { + "tooltip": "", + "name": "Trigger" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Trigger" + }, + { + "tooltip": "", + "name": "Trigger" + } + ] + }, + "Node_Tunnel_Out": { + "tooltip": "Receive value from tunnel in of the same key.", + "name": "Tunnel Out", + "outputs": [ + { + "tooltip": "", + "name": "Value out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Name" + } + ] + }, + "Node_Flip": { + "tooltip": "Flip image horizontally or vertically.", + "name": "Flip", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Axis" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Composite": { + "tooltip": "Combine multiple images with controllable position, rotation, scale.", + "name": "Composite", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Atlas data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Padding" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Position 0" + }, + { + "tooltip": "", + "name": "Rotation 0" + }, + { + "tooltip": "", + "name": "Scale 0" + } + ] + }, + "Node_De_Stray": { + "tooltip": "Attempt to remove orphan pixel.", + "name": "De-Stray", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Tolerance" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Iterator_Index": { + "tooltip": "", + "name": "Index", + "outputs": [ + { + "tooltip": "", + "name": "Loop index" + } + ], + "inputs": [] + }, + "Node_Stripe": { + "tooltip": "Generate stripe pattern.", + "name": "Stripe", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "Smoothly blend between each stripe.", + "name": "Blend" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Random" + }, + { + "tooltip": "", + "name": "Random color" + }, + { + "tooltip": "", + "name": "Colors" + }, + { + "tooltip": "", + "name": "Color 1" + }, + { + "tooltip": "", + "name": "Color 2" + } + ] + }, + "Node_Array_Insert": { + "tooltip": "", + "name": "Array Insert", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Index" + }, + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Spread array" + } + ] + }, + "Node_ASE_layer": { + "tooltip": "", + "name": "ASE Layer", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "ASE data" + }, + { + "tooltip": "", + "name": "Use cel dimension" + } + ] + }, + "Node_String_Split": { + "tooltip": "", + "name": "Split Text", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "Character that used to split text,\nleave blank to create character array.", + "name": "Delimiter" + } + ] + }, + "Node_Rigid_Activate": { + "tooltip": "", + "name": "Activate Physics", + "outputs": [ + { + "tooltip": "", + "name": "Object" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Object" + }, + { + "tooltip": "", + "name": "Physics activated" + } + ] + }, + "Node_Color_HSV": { + "tooltip": "Create color from HSV value.", + "name": "HSV Color", + "outputs": [ + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Hue" + }, + { + "tooltip": "", + "name": "Saturation" + }, + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Normalized" + } + ] + }, + "Node_Surface_Replace": { + "tooltip": "", + "name": "Replace Image", + "outputs": [ + { + "tooltip": "", + "name": "Surface Out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Base Image" + }, + { + "tooltip": "", + "name": "Target Image" + }, + { + "tooltip": "", + "name": "Replacement Image" + }, + { + "tooltip": "How similiar the color need to be in order to be count as matched.", + "name": "Color Threshold" + }, + { + "tooltip": "", + "name": "Draw Base Image" + }, + { + "tooltip": "", + "name": "Fast Mode" + }, + { + "tooltip": "How many pixel need to me matched to replace with replacement image.", + "name": "Pixel Threshold" + }, + { + "tooltip": "", + "name": "Array mode" + }, + { + "tooltip": "", + "name": "Seed" + } + ] + }, + "Node_Export": { + "tooltip": "Export image, image array to file, image sequence, animation.", + "name": "Export", + "outputs": [ + { + "tooltip": "", + "name": "Loop exit" + }, + { + "tooltip": "", + "name": "Preview" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface" + }, + { + "tooltip": "", + "name": "Paths" + }, + { + "tooltip": "", + "name": "Template" + }, + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Template guides" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "", + "name": "Frame optimization" + }, + { + "tooltip": "", + "name": "Color merge" + }, + { + "tooltip": "", + "name": "Framerate" + }, + { + "tooltip": "", + "name": "Format" + }, + { + "tooltip": "", + "name": "Quality" + }, + { + "tooltip": "", + "name": "Sequence begin" + } + ] + }, + "Node_Blend": { + "tooltip": "Blend 2 images using different blendmodes.", + "name": "Blend", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Foreground" + }, + { + "tooltip": "", + "name": "Blend mode" + }, + { + "tooltip": "", + "name": "Opacity" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Fill mode" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "", + "name": "Constant dimension" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Preserve alpha" + }, + { + "tooltip": "", + "name": "Horizontal Align" + }, + { + "tooltip": "", + "name": "Vertical Align" + } + ] + }, + "Node_Rigid_Render": { + "tooltip": "", + "name": "Render", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Render dimension" + }, + { + "tooltip": "", + "name": "Object" + } + ] + }, + "Node_Fluid_Domain_Queue": { + "tooltip": "", + "name": "Queue Domain", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Input" + } + ] + }, + "Node_Counter": { + "tooltip": "Output current frame as frame index, or animation progress (0 - 1).", + "name": "Frame Index", + "outputs": [ + { + "tooltip": "", + "name": "Value" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Start" + }, + { + "tooltip": "", + "name": "Speed" + }, + { + "tooltip": "Counting mode\r\n - Frame count: Count value up\/down per frame.\r\n - Animation progress: Count from 0 (first frame) to 1 (last frame). ", + "name": "Mode" + } + ] + }, + "Node_Colorize": { + "tooltip": "Map brightness of a pixel to a color from a gradient.", + "name": "Colorize", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Gradient" + }, + { + "tooltip": "", + "name": "Gradient shift" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Multiply alpha" + } + ] + }, + "Node_Statistic": { + "tooltip": "", + "name": "Statistic", + "outputs": [ + { + "tooltip": "", + "name": "Statistic" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Input" + } + ] + }, + "Node_Grid_Hex": { + "tooltip": "Generate hexagonal grid pattern.", + "name": "Hexagonal Grid", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Gap" + }, + { + "tooltip": "", + "name": "Tile color" + }, + { + "tooltip": "", + "name": "Gap color" + }, + { + "tooltip": "", + "name": "Render type" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Texture" + } + ] + }, + "Node_Array_Sort": { + "tooltip": "", + "name": "Sort Number", + "outputs": [ + { + "tooltip": "", + "name": "Sorted array" + }, + { + "tooltip": "", + "name": "Sorted index" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array in" + }, + { + "tooltip": "", + "name": "Order" + } + ] + }, + "Node_Array_Remove": { + "tooltip": "", + "name": "Array Remove", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Index" + }, + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Spread array" + } + ] + }, + "Node_3D_Plane": { + "tooltip": "Put 2D image on a plane in 3D space.", + "name": "3D Plane", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "", + "name": "Constant dimension" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Texture scale" + }, + { + "tooltip": "", + "name": "Texture shift" + }, + { + "tooltip": "", + "name": "Subdiviion" + }, + { + "tooltip": "", + "name": "Normal axis" + } + ] + }, + "Node_VFX_Accelerate": { + "tooltip": "", + "name": "Accelerate", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Falloff distance" + }, + { + "tooltip": "", + "name": "Effect Vector" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Rotate particle" + }, + { + "tooltip": "", + "name": "Scale particle" + } + ] + }, + "Node_Local_Analyze": { + "tooltip": "Apply non-linear operation (minimum, maximum) on each pixel locally.", + "name": "Local Analyze", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Algorithm" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Color_replace": { + "tooltip": "Replace color that match one palette with another palette.", + "name": "Replace Color", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Color to be replaced.", + "name": "Palette from" + }, + { + "tooltip": "Palette to be replaced to.", + "name": "Palette to" + }, + { + "tooltip": "", + "name": "Threshold" + }, + { + "tooltip": "Set pixel that doesn't match any color in 'palette from' to black.", + "name": "Set others to black" + }, + { + "tooltip": "", + "name": "Multiply alpha" + }, + { + "tooltip": "Completely override pixel with new color instead of blending between it.", + "name": "Hard replace" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_VFX_Override": { + "tooltip": "", + "name": "VFX Override", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Positions" + }, + { + "tooltip": "", + "name": "Rotations" + }, + { + "tooltip": "", + "name": "Scales" + }, + { + "tooltip": "", + "name": "Blend" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Surface" + } + ] + }, + "Node_Array_Length": { + "tooltip": "", + "name": "Array Length", + "outputs": [ + { + "tooltip": "", + "name": "Size" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + } + ] + }, + "Node_Combine_HSV": { + "tooltip": "Combine 4 image in to one. Each image use to control HSVA channel.", + "name": "HSV Combine", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Hue" + }, + { + "tooltip": "", + "name": "Saturation" + }, + { + "tooltip": "", + "name": "Value" + } + ] + }, + "Node_Camera": { + "tooltip": "Create camera that crop image to fix dimension with control of position, zoom. Also can be use to create parallax effect.", + "name": "Camera", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Focus area" + }, + { + "tooltip": "", + "name": "Zoom" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Fix background" + }, + { + "tooltip": "", + "name": "Element 0" + }, + { + "tooltip": "", + "name": "Parallax 0" + } + ] + }, + "Node_Path_Sample": { + "tooltip": "Sample a 2D position from a path", + "name": "Sample Path", + "outputs": [ + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Direction" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Ratio" + }, + { + "tooltip": "", + "name": "Type" + } + ] + }, + "Node_String_Get_Char": { + "tooltip": "", + "name": "Get Character", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Index" + }, + { + "tooltip": "", + "name": "Amount" } ] }, "Node_Iterator_Each_Input": { - "name": "Input", "tooltip": "", + "name": "Input", "outputs": [ { - "name": "Value in", - "tooltip": "" + "tooltip": "", + "name": "Value in" } ], "inputs": [] }, "Node_Blur_Radial": { - "name": "Radial Blur", "tooltip": "Blur image by rotating aroung a mid point.", + "name": "Radial Blur", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface in" }, { - "name": "Strength", - "tooltip": "" + "tooltip": "", + "name": "Strength" }, { - "name": "Center", - "tooltip": "" + "tooltip": "", + "name": "Center" }, { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" }, { - "name": "Mask", - "tooltip": "" + "tooltip": "", + "name": "Mask" }, { - "name": "Mix", - "tooltip": "" + "tooltip": "", + "name": "Mix" }, { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Strand_Force_Apply": { - "name": "Strand Force Apply", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Turbulence", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Turbulence frequency", - "tooltip": "" - }, - { - "name": "Turbulence detail", - "tooltip": "" - } - ] - }, - "Node_Erode": { - "name": "Erode", - "tooltip": "Remove pixel that are close to the border of the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Width", - "tooltip": "" - }, - { - "name": "Preserve border", - "tooltip": "" - }, - { - "name": "Use alpha", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Texture_Remap": { - "name": "Texture Remap", - "tooltip": "Remap image using texture map. Where red channel control x position and green channel control y position.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "RG Map", - "tooltip": "Displacement map where red retermine the X position, and green determine the Y position." - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Normal": { - "name": "Normal", - "tooltip": "Create normal map using greyscale value as height.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Height", - "tooltip": "" - }, - { - "name": "Smooth", - "tooltip": "Include diagonal pixel in normal calculation, which leads to smoother output." - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Path_Sample": { - "name": "Sample Path", - "tooltip": "Sample a 2D position from a path", - "outputs": [ - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - } - ] - }, - "Node_Fluid_Domain_Queue": { - "name": "Queue Domain", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ] - }, - "Node_Tunnel_In": { - "name": "Tunnel In", - "tooltip": "Create tunnel for sending value based on key matching.", - "outputs": [], - "inputs": [ - { - "name": "Name", - "tooltip": "" - }, - { - "name": "Value in", - "tooltip": "" - } - ] - }, - "Node_Shape_Polygon": { - "name": "Polygon Shape", - "tooltip": "Draw simple shapes using triangles.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mesh", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Mesh", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Shape color", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Sides", - "tooltip": "" - }, - { - "name": "Inner radius", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Teeth", - "tooltip": "" - }, - { - "name": "Teeth height", - "tooltip": "" - }, - { - "name": "Teeth taper", - "tooltip": "" - }, - { - "name": "Angle range", - "tooltip": "" - }, - { - "name": "Round cap", - "tooltip": "" - }, - { - "name": "Mesh", - "tooltip": "" - } - ] - }, - "Node_Edge_Detect": { - "name": "Edge Detect", - "tooltip": "Edge detect by applying Sobel, Prewitt, or Laplacian kernel.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Algorithm", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Mirror": { - "name": "Mirror", - "tooltip": "Reflect the image along a reflection line.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mirror mask", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mirror mask", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Trigger": { - "name": "Trigger", - "tooltip": "", - "outputs": [ - { - "name": "Trigger", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Trigger", - "tooltip": "" - }, - { - "name": "Trigger", - "tooltip": "" - } - ] - }, - "Node_Shadow_Cast": { - "name": "Cast Shadow", - "tooltip": "Apply light that create shadow using shadow mask.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Light mask", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Light mask", - "tooltip": "" - }, - { - "name": "Light Position", - "tooltip": "" - }, - { - "name": "Soft light radius", - "tooltip": "" - }, - { - "name": "Light density", - "tooltip": "" - }, - { - "name": "Light type", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Light radius", - "tooltip": "" - }, - { - "name": "Render solid", - "tooltip": "" - }, - { - "name": "Use BG color", - "tooltip": "If checked, background color will be used as shadow caster." - }, - { - "name": "BG threshold", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Banding", - "tooltip": "" - }, - { - "name": "Attenuation", - "tooltip": "Control how light fade out over distance." - }, - { - "name": "Ambient occlusion", - "tooltip": "" - }, - { - "name": "Ambient occlusion strength", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Strand_Update": { - "name": "Strand Update", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Step", - "tooltip": "" - } - ] - }, - "Node_Image_Animated": { - "name": "Animation", - "tooltip": "Load multiple images from your computer as animation.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Padding", - "tooltip": "" - }, - { - "name": "Stretch frame", - "tooltip": "Stretch animation speed to match project length." - }, - { - "name": "Frame duration", - "tooltip": "" - }, - { - "name": "Animation end", - "tooltip": "" - }, - { - "name": "Set animation length to match", - "tooltip": "" - } - ] - }, - "Node_Rigid_Object": { - "name": "Object", - "tooltip": "", - "outputs": [ - { - "name": "Object", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Object", - "tooltip": "" - }, - { - "name": "Weight", - "tooltip": "" - }, - { - "name": "Contact friction", - "tooltip": "" - }, - { - "name": "Air resistance", - "tooltip": "" - }, - { - "name": "Rotation resistance", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Texture", - "tooltip": "" - }, - { - "name": "Start shape", - "tooltip": "" - }, - { - "name": "Spawn", - "tooltip": "Make object spawn when start." - }, - { - "name": "Generate mesh", - "tooltip": "" - }, - { - "name": "Mesh expansion", - "tooltip": "" - } - ] - }, - "Node_Display_Text": { - "name": "Display Text", - "tooltip": "Display text on the graph.", - "outputs": [], - "inputs": [ - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Style", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Line width", - "tooltip": "" - } - ] - }, - "Node_Array_Shift": { - "name": "Array Shift", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - } - ] - }, - "Node_Grid_Noise": { - "name": "Grid Noise", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Texture sample", - "tooltip": "" - }, - { - "name": "Shift axis", - "tooltip": "" - }, - { - "name": "Color mode", - "tooltip": "" - }, - { - "name": "Color R range", - "tooltip": "" - }, - { - "name": "Color G range", - "tooltip": "" - }, - { - "name": "Color B range", - "tooltip": "" - } - ] - }, - "Node_Array_Set": { - "name": "Array Set", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "Index", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - } - ] - }, - "Node_Displace": { - "name": "Displace", - "tooltip": "Distort image using another image as a map.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Displace map", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "Vector to displace pixel by." - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Mid value", - "tooltip": "Brightness value to be use as a basis for 'no displacement'." - }, - { - "name": "Color data", - "tooltip": "Use color data set extra information.\r\n - Ignore: Don't use color data.\r\n - Vector: Use red as X displacement, green as Y displacement.\r\n - Angle: Use red as angle, green as distance." - }, - { - "name": "Iterate", - "tooltip": "If not set, then strength value is multiplied directly to the displacement.\r\nIf set, then strength value control how many times the effect applies on itself." - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_9Slice": { - "name": "Nine Slice", - "tooltip": "Cut image into 3x3 parts, and scale\/repeat only the middle part.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Splice", - "tooltip": "" - }, - { - "name": "Filling modes", - "tooltip": "" - } - ] - }, - "Node_Noise_Tri": { - "name": "Triangular Noise", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Texture sample", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "" - } - ] - }, - "Node_String_Join": { - "name": "Join Text", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Divider", - "tooltip": "" - } - ] - }, - "Node_String_Merge": { - "name": "Combine Text", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Text B", - "tooltip": "" - } - ] - }, - "Node_Fluid_Apply_Velocity": { - "name": "Apply Velocity", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Brush", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Velocity", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Array_Insert": { - "name": "Array Insert", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "Index", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Spread array", - "tooltip": "" - } - ] - }, - "Node_Alpha_Grey": { - "name": "Alpha to Grey", - "tooltip": "Convert alpha value into solid greyscale.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Level_Selector": { - "name": "Level Selector", - "tooltip": "Isolate part of the image that falls in the selected brightness range.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mid point", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_VFX_Repel": { - "name": "Repel", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Falloff distance", - "tooltip": "" - }, - { - "name": "Effect Vector", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Rotate particle", - "tooltip": "" - }, - { - "name": "Scale particle", - "tooltip": "" - } - ] - }, - "Node_VFX_Turbulence": { - "name": "Turbulence", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Falloff distance", - "tooltip": "" - }, - { - "name": "Effect Vector", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Rotate particle", - "tooltip": "" - }, - { - "name": "Scale particle", - "tooltip": "" - }, - { - "name": "Turbulence scale", - "tooltip": "" - } - ] - }, - "Node_Number": { - "name": "Number", - "tooltip": "", - "outputs": [ - { - "name": "Number", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Number", - "tooltip": "" - }, - { - "name": "Integer", - "tooltip": "" - }, - { - "name": "Display", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Step", - "tooltip": "" - } - ] - }, - "Node_Group_Output": { - "name": "Output", - "tooltip": "", - "outputs": [], - "inputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - } - ] - }, - "Node_String_Trim": { - "name": "Trim Text", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Head", - "tooltip": "" - }, - { - "name": "Tail", - "tooltip": "" - }, - { - "name": "Trim", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "Set to progress to use ratio, where 0 means no change and 1 means the entire length of the text." - } - ] - }, - "Node_Fluid_Render": { - "name": "Render Domain", - "tooltip": "", - "outputs": [ - { - "name": "Fluid", - "tooltip": "" - }, - { - "name": "Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Interpolate", - "tooltip": "" - }, - { - "name": "Draw Domain", - "tooltip": "" - } - ] - }, - "Node_Area": { - "name": "Area", - "tooltip": "", - "outputs": [ - { - "name": "Area", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - } - ] - }, - "Node_Palette_Extract": { - "name": "Palette Extract", - "tooltip": "Extract palette from an image.", - "outputs": [ - { - "name": "Palette", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Palette", - "tooltip": "" - }, - { - "name": "Max colors", - "tooltip": "Amount of color in a palette." - }, - { - "name": "Seed", - "tooltip": "Random seed to be used to initialize K-mean algorithm." - }, - { - "name": "Algorithm", - "tooltip": "" - } - ] - }, - "Node_String_Regex_Replace": { - "name": "RegEx Replace", - "tooltip": "", - "outputs": [ - { - "name": "Results", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Results", - "tooltip": "" - }, - { - "name": "Regex", - "tooltip": "" - }, - { - "name": "Replacement", - "tooltip": "" - } - ] - }, - "Node_Fluid_Vortex": { - "name": "Vortex", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Attraction", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - } - ] - }, - "Node_Path": { - "name": "Path", - "tooltip": "", - "outputs": [ - { - "name": "Position out", - "tooltip": "" - }, - { - "name": "Path data", - "tooltip": "" - }, - { - "name": "Anchors", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Position out", - "tooltip": "Sample position from path." - }, - { - "name": "Path data", - "tooltip": "" - }, - { - "name": "Progress mode", - "tooltip": "" - }, - { - "name": "Round anchor", - "tooltip": "" - } - ] - }, - "Node_VFX_Group": { - "name": "VFX", - "tooltip": "Create VFX group, which generate particles that can be manipulated using different force nodes.", - "outputs": [], - "inputs": [] - }, - "Node_Text_File_Read": { - "name": "Text File In", - "tooltip": "Load .txt in as text.", - "outputs": [ - { - "name": "Content", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Content", - "tooltip": "" - } - ] - }, - "Node_3D_Cylinder": { - "name": "3D Cylinder", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Sides", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Render rotation", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Textures top", - "tooltip": "" - }, - { - "name": "Textures bottom", - "tooltip": "" - }, - { - "name": "Textures side", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Object rotation", - "tooltip": "" - }, - { - "name": "Object position", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Taper", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Anim_Curve": { - "name": "Evaluate Curve", - "tooltip": "Evaluate value from an animation curve.", - "outputs": [ - { - "name": "Curve", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Curve", - "tooltip": "" - }, - { - "name": "Progress", - "tooltip": "" - }, - { - "name": "Minimum", - "tooltip": "" - }, - { - "name": "Maximum", - "tooltip": "" - } - ] - }, - "Node_Iterator_Output": { - "name": "Output", - "tooltip": "", - "outputs": [], - "inputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - }, - { - "name": "Loop exit", - "tooltip": "" - } - ] - }, - "Node_Strand_Length_Adjust": { - "name": "Strand Length Adjust", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - } - ] - }, - "Node_Shadow": { - "name": "Shadow", - "tooltip": "Apply shadow behind the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Grow", - "tooltip": "" - }, - { - "name": "Blur", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_BW": { - "name": "BW", - "tooltip": "Convert color image to black and white.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Brightness", - "tooltip": "" - }, - { - "name": "Contrast", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Color_HSV": { - "name": "HSV Color", - "tooltip": "Create color from HSV value.", - "outputs": [ - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Saturation", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Normalized", - "tooltip": "" - } - ] - }, - "Node_ASE_File_Read": { - "name": "ASE File In", - "tooltip": "Load Aseprite file with support for layers, tags.", - "outputs": [ - { - "name": "Output", - "tooltip": "" - }, - { - "name": "Content", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Palette", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Output", - "tooltip": "" - }, - { - "name": "Content", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ] - }, - "Node_Blur": { - "name": "Blur", - "tooltip": "Blur image smoothly.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Override color", - "tooltip": "Replace all color while keeping the alpha. Used to\nfix grey outline when bluring transparent pixel." - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Fluid_Group": { - "name": "FluidSim", - "tooltip": "Create group for fluid simulation.", - "outputs": [], - "inputs": [] - }, - "Node_Posterize": { - "name": "Posterize", - "tooltip": "Reduce and remap color to match a palette.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Palette", - "tooltip": "" - }, - { - "name": "Use palette", - "tooltip": "" - }, - { - "name": "Colors", - "tooltip": "" - }, - { - "name": "Gamma", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Path_Shift": { - "name": "Shift Path", - "tooltip": "Move path along its normal.", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Distance", - "tooltip": "" - } - ] - }, - "Node_Array_Find": { - "name": "Array Find", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Index", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - } - ] - }, - "Node_3D_Obj": { - "name": "3D Object", - "tooltip": "Load .obj file from your computer as a 3D object.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Render position", - "tooltip": "" - }, - { - "name": "Render rotation", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Flip UV", - "tooltip": "Flip UV axis, can be use to fix some texture mapping error." - }, - { - "name": "Object rotation", - "tooltip": "" - }, - { - "name": "Object position", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Vector_Dot": { - "name": "Dot product", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Point 2", - "tooltip": "" - } - ] - }, - "Node_Trail": { - "name": "Trail", - "tooltip": "Blend animation by filling in the pixel 'in-between' two or more frames.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Trail UV", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Max life", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - }, - { - "name": "Max distance", - "tooltip": "Maximum distance to search for movement, set to -1 to search the entire image." - }, - { - "name": "Match color", - "tooltip": "Make trail track pixels of the same color, instead of the closet pixels." - }, - { - "name": "Blend color", - "tooltip": "Blend color between two pixel smoothly." - }, - { - "name": "Alpha over life", - "tooltip": "" - } - ] - }, - "Node_Seperate_Shape": { - "name": "Separate Shape", - "tooltip": "Separate disconnected pixel each into an image in an image array.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Tolerance", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Boundary data", - "tooltip": "" - }, - { - "name": "Override color", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Ignore blank", - "tooltip": "Skip empty and black shape." - } - ] - }, - "Node_Atlas_Get": { - "name": "Atlas Get", - "tooltip": "", - "outputs": [ - { - "name": "Surface", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Blend", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface", - "tooltip": "" - } - ] - }, - "Node_Feedback": { - "name": "Feedback", - "tooltip": "Create group that reuse output from last frame to the current one.", - "outputs": [], - "inputs": [] - }, - "Node_Iterator_Input": { - "name": "Input", - "tooltip": "", - "outputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Loop entrance", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Display type", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Input type", - "tooltip": "" - }, - { - "name": "Enum label", - "tooltip": "" - }, - { - "name": "Vector size", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - }, - { - "name": "Display preview gizmo", - "tooltip": "" - }, - { - "name": "Step", - "tooltip": "" - } - ] - }, - "Node_Color_Data": { - "name": "Color Data", - "tooltip": "Get data (rgb, hsv, brightness) from color.", - "outputs": [ - { - "name": "Red", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - }, - { - "name": "Blue", - "tooltip": "" - }, - { - "name": "Hue", - "tooltip": "" - }, - { - "name": "Saturation", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Brightness", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Red", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - } - ] - }, - "Node_Alpha_Cutoff": { - "name": "Alpha Cutoff", - "tooltip": "Remove pixel with low alpha value.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Minimum", - "tooltip": "Any pixel with less alpha (more transparent) than this will be removed." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Array_Zip": { - "name": "Array Zip", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Output", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - } - ] - }, - "Node_Atlas": { - "name": "Pixel Expand", - "tooltip": "Replace transparent pixel with the closet non-transparent pixel.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Compare": { - "name": "Compare", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Type", - "tooltip": "" - }, - { - "name": "a", - "tooltip": "" - }, - { - "name": "b", - "tooltip": "" - } - ] - }, - "Node_Composite": { - "name": "Composite", - "tooltip": "Combine multiple images with controllable position, rotation, scale.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Atlas data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Padding", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Background", - "tooltip": "" - }, - { - "name": "Position 0", - "tooltip": "" - }, - { - "name": "Rotation 0", - "tooltip": "" - }, - { - "name": "Scale 0", - "tooltip": "" - } - ] - }, - "Node_Blur_Bokeh": { - "name": "Lens Blur", - "tooltip": "Create bokeh effect. Blur lighter color in a lens-like manner.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Invert": { - "name": "Invert", - "tooltip": "Invert color.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Iterator_Filter_Output": { - "name": "Output", - "tooltip": "", - "outputs": [], - "inputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Result", - "tooltip": "" - } - ] - }, - "Node_Color": { - "name": "Color", - "tooltip": "", - "outputs": [ - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Color", - "tooltip": "" - } - ] - }, - "Node_WAV_File_Read": { - "name": "WAV File In", - "tooltip": "Load wav audio file.", - "outputs": [ - { - "name": "Data", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Sample rate", - "tooltip": "" - }, - { - "name": "Channels", - "tooltip": "" - }, - { - "name": "Duration (s)", - "tooltip": "" - }, - { - "name": "Loudness", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Data", - "tooltip": "" - }, - { - "name": "Sync lenght", - "tooltip": "" - } - ] - }, - "Node_Rigid_Group": { - "name": "RigidSim", - "tooltip": "Create group for rigidbody simulation.", - "outputs": [], - "inputs": [] - }, - "Node_Frame": { - "name": "Frame", - "tooltip": "Create frame surrounding nodes.", - "outputs": [], - "inputs": [ - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - } - ] - }, - "Node_Array_Copy": { - "name": "Array Copy", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "Starting Index", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - } - ] - }, - "Node_Scale": { - "name": "Scale", - "tooltip": "Simple node for scaling image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - }, - { - "name": "Target dimension", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_String_Length": { - "name": "Text Length", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - } - ] - }, - "Node_Chromatic_Aberration": { - "name": "Chromatic Aberration", - "tooltip": "Apply chromatic aberration effect to the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Color_Mix": { - "name": "Mix Color", - "tooltip": "", - "outputs": [ - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Color to", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - } - ] - }, - "Node_Canvas": { - "name": "Canvas", - "tooltip": "Draw on surface using brush, eraser, etc.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Preview", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Preview", - "tooltip": "" - }, - { - "name": "Brush size", - "tooltip": "" - }, - { - "name": "Fill threshold", - "tooltip": "" - }, - { - "name": "Fill type", - "tooltip": "" - }, - { - "name": "Draw preview overlay", - "tooltip": "" - }, - { - "name": "Brush", - "tooltip": "" - }, - { - "name": "Surface amount", - "tooltip": "" - }, - { - "name": "Background", - "tooltip": "" - }, - { - "name": "Background alpha", - "tooltip": "" - }, - { - "name": "Render background", - "tooltip": "" - } - ] - }, - "Node_Path_Map_Area": { - "name": "Remap Path", - "tooltip": "Scale path to fit a given area.", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - } - ] - }, - "Node_ASE_layer": { - "name": "ASE Layer", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Use cel dimension", - "tooltip": "" - } - ] - }, - "Node_Feedback_Input": { - "name": "Input", - "tooltip": "", - "outputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Feedback loop", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Display type", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Input type", - "tooltip": "" - }, - { - "name": "Enum label", - "tooltip": "" - }, - { - "name": "Vector size", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - }, - { - "name": "Display preview gizmo", - "tooltip": "" - }, - { - "name": "Step", - "tooltip": "" - } - ] - }, - "Node_Grid_Hex": { - "name": "Hexagonal Grid", - "tooltip": "Generate hexagonal grid pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Gap", - "tooltip": "" - }, - { - "name": "Tile color", - "tooltip": "" - }, - { - "name": "Gap color", - "tooltip": "" - }, - { - "name": "Render type", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Texture", - "tooltip": "" - } - ] - }, - "Node_Vector_Cross_3D": { - "name": "Cross product 3D", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Point 2", - "tooltip": "" - } - ] - }, - "Node_Normal_Light": { - "name": "Normal Light", - "tooltip": "Light up the image using normal mapping.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Normal map", - "tooltip": "" - }, - { - "name": "Normal intensity", - "tooltip": "" - }, - { - "name": "Ambient", - "tooltip": "" - }, - { - "name": "Light position", - "tooltip": "" - }, - { - "name": "Light range", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Light type", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Iterate": { - "name": "Loop", - "tooltip": "Create group that reuse output as input repeatedly in one frame.", - "outputs": [], - "inputs": [ - { - "name": "Repeat", - "tooltip": "" - } - ] - }, - "Node_Path_L_System": { - "name": "L system", - "tooltip": "", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Starting position", - "tooltip": "" - }, - { - "name": "Iteration", - "tooltip": "" - }, - { - "name": "Starting rule", - "tooltip": 37 - }, - { - "name": "End replacement", - "tooltip": "Replace symbol of the last generated rule, for example a=F to replace all a with F. Use comma to separate different replacements." - }, - { - "name": "Starting angle", - "tooltip": "" - }, - { - "name": "Name 0", - "tooltip": "" - }, - { - "name": "Rule 0", - "tooltip": "" - } - ] - }, - "Node_Scatter": { - "name": "Scatter", - "tooltip": "Scatter image randomly multiple times.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Atlas data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Distribution", - "tooltip": "" - }, - { - "name": "Point at center", - "tooltip": "Rotate each copy to face the spawn center." - }, - { - "name": "Uniform scaling", - "tooltip": "" - }, - { - "name": "Scatter", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Random blend", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Distribution map", - "tooltip": "" - }, - { - "name": "Distribution data", - "tooltip": "" - }, - { - "name": "Array", - "tooltip": "What to do when input array of surface.\r\n- Spread: Create Array of output each scattering single surface.\r\n- Mixed: Create single output scattering multiple images." - }, - { - "name": "Multiply alpha", - "tooltip": "" - }, - { - "name": "Use value", - "tooltip": "Apply the third value in each data point (if exist) on given properties." - }, - { - "name": "Blend mode", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ] - }, - "Node_Noise": { - "name": "Noise", - "tooltip": "Generate white noise.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Color mode", - "tooltip": "" - }, - { - "name": "Color R range", - "tooltip": "" - }, - { - "name": "Color G range", - "tooltip": "" - }, - { - "name": "Color B range", - "tooltip": "" - } - ] - }, - "Node_Json_File_Write": { - "name": "JSON File Out", - "tooltip": "Save data to .json file.", - "outputs": [], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Struct", - "tooltip": "" - }, - { - "name": "Key", - "tooltip": "" - }, - { - "name": "value", - "tooltip": "" - } - ] - }, - "Node_Text": { - "name": "Draw Text", - "tooltip": "Draw text on an image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Font", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Anti-Aliasing ", - "tooltip": "" - }, - { - "name": "Character range", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Fixed dimension", - "tooltip": "" - }, - { - "name": "Horizontal alignment", - "tooltip": "" - }, - { - "name": "Vertical alignment", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Padding", - "tooltip": "" - } - ] - }, - "Node_Path_Trim": { - "name": "Trim Path", - "tooltip": "", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - } - ] - }, - "Node_Vector_Cross_2D": { - "name": "Cross product 2D", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Point 2", - "tooltip": "" - } - ] - }, - "Node_Average": { - "name": "Average", - "tooltip": "Average color of every pixels in the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Path_Plot": { - "name": "Path plot", - "tooltip": "", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Coordinate", - "tooltip": "" - }, - { - "name": "Equation type", - "tooltip": "" - }, - { - "name": "0 function", - "tooltip": "" - }, - { - "name": "1 function", - "tooltip": "" - }, - { - "name": "Origin", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Input scale", - "tooltip": "" - }, - { - "name": "Input shift", - "tooltip": "" - } - ] - }, - "Node_String_Regex_Search": { - "name": "RegEx Search", - "tooltip": "", - "outputs": [ - { - "name": "Results", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Results", - "tooltip": "" - }, - { - "name": "Regex", - "tooltip": "" - } - ] - }, - "Node_2D_light": { - "name": "2D Light", - "tooltip": "Apply different shaped light on the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Light only", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Light shape", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Intensity", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Start", - "tooltip": "" - }, - { - "name": "Finish", - "tooltip": "" - }, - { - "name": "Sweep", - "tooltip": "" - }, - { - "name": "Sweep end", - "tooltip": "" - }, - { - "name": "Banding", - "tooltip": "" - }, - { - "name": "Attenuation", - "tooltip": "Control how light fade out over distance." - }, - { - "name": "Radial banding", - "tooltip": "" - }, - { - "name": "Radial start", - "tooltip": "" - }, - { - "name": "Radial band ratio", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_VFX_Override": { - "name": "VFX Override", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Positions", - "tooltip": "" - }, - { - "name": "Rotations", - "tooltip": "" - }, - { - "name": "Scales", - "tooltip": "" - }, - { - "name": "Blend", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Surface", - "tooltip": "" - } - ] - }, - "Node_3D_Combine": { - "name": "3D Combine", - "tooltip": "Combine multiple 3D object to a single scene,", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D objects", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "3D objects", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Render position", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - }, - { - "name": "3D object", - "tooltip": "" - } - ] - }, - "Node_VFX_Accelerate": { - "name": "Accelerate", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Falloff distance", - "tooltip": "" - }, - { - "name": "Effect Vector", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Rotate particle", - "tooltip": "" - }, - { - "name": "Scale particle", - "tooltip": "" - } - ] - }, - "Node_Time_Remap": { - "name": "Time Remap", - "tooltip": "Remap image using texture as time map. Where brighter pixel means using pixel from an older frame.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Map", - "tooltip": "" - }, - { - "name": "Max life", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - } - ] - }, - "Node_Color_RGB": { - "name": "RGB Color", - "tooltip": "Create color from RGB value.", - "outputs": [ - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - }, - { - "name": "Blue", - "tooltip": "" - }, - { - "name": "Normalized", - "tooltip": "" - } - ] - }, - "Node_Dilate": { - "name": "Dilate", - "tooltip": "Expand the image around a mid point.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Animation_Control": { - "name": "Animation Control", - "tooltip": "Control animation state with triggers.", - "outputs": [], - "inputs": [ - { - "name": "Toggle Play \/ Pause", - "tooltip": "" - }, - { - "name": "Pause", - "tooltip": "" - }, - { - "name": "Resume", - "tooltip": "" - }, - { - "name": "Play From Beginning", - "tooltip": "" - }, - { - "name": "Play once", - "tooltip": "" - }, - { - "name": "Skip Frames", - "tooltip": "" - }, - { - "name": "Skip Frames Count", - "tooltip": "" - } - ] - }, - "Node_Array_Get": { - "name": "Array Get", - "tooltip": "", - "outputs": [ - { - "name": "Value", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Index", - "tooltip": "" - }, - { - "name": "Overflow", - "tooltip": "" - } - ] - }, - "Node_Particle": { - "name": "Particle", - "tooltip": "Generate particle effect.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particle sprite", - "tooltip": "" - }, - { - "name": "Spawn delay", - "tooltip": "Frames delay between each particle spawn." - }, - { - "name": "Spawn amount", - "tooltip": "Amount of particle spawn in that frame." - }, - { - "name": "Spawn area", - "tooltip": "" - }, - { - "name": "Spawn distribution", - "tooltip": "" - }, - { - "name": "Lifespan", - "tooltip": "" - }, - { - "name": "Spawn direction", - "tooltip": "" - }, - { - "name": "Acceleration", - "tooltip": "" - }, - { - "name": "Orientation", - "tooltip": "" - }, - { - "name": "Rotational speed", - "tooltip": "" - }, - { - "name": "Spawn scale", - "tooltip": "" - }, - { - "name": "Scale over time", - "tooltip": "" - }, - { - "name": "Color over lifetime", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Alpha over time", - "tooltip": "" - }, - { - "name": "Rotate by direction", - "tooltip": "Make the particle rotates to follow its movement." - }, - { - "name": "Spawn type", - "tooltip": "" - }, - { - "name": "Spawn size", - "tooltip": "" - }, - { - "name": "Spawn velocity", - "tooltip": "" - }, - { - "name": "Gravity", - "tooltip": "" - }, - { - "name": "Wiggle", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - }, - { - "name": "Surface array", - "tooltip": "Whether to select image from an array in order, at random, or treat array as animation." - }, - { - "name": "Animation speed", - "tooltip": "" - }, - { - "name": "Scatter", - "tooltip": "" - }, - { - "name": "Boundary data", - "tooltip": "" - }, - { - "name": "On animation end", - "tooltip": "" - }, - { - "name": "Spawn", - "tooltip": "" - }, - { - "name": "Random blend", - "tooltip": "" - }, - { - "name": "Directed from center", - "tooltip": "Make particle move away from the spawn center." - }, - { - "name": "Distribution map", - "tooltip": "" - }, - { - "name": "Distribution data", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Gravity direction", - "tooltip": "" - }, - { - "name": "Turning", - "tooltip": "" - }, - { - "name": "Turn both directions", - "tooltip": "Apply randomized 1, -1 multiplier to the turning speed." - }, - { - "name": "Turn scale with speed", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Round position", - "tooltip": "Round position to the closest integer value to avoid jittering." - }, - { - "name": "Blend mode", - "tooltip": "" - } - ] - }, - "Node_VFX_Renderer": { - "name": "Renderer", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Round position", - "tooltip": "Round position to the closest integer value to avoid jittering." - }, - { - "name": "Blend mode", - "tooltip": "" - }, - { - "name": "Particles", - "tooltip": "" - } - ] - }, - "Node_Fluid_Add_Collider": { - "name": "Add Collider", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Collider", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - } - ] - }, - "Node_Dither": { - "name": "Dither", - "tooltip": "Reduce color and use dithering to preserve original color.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Palette", - "tooltip": "" - }, - { - "name": "Pattern", - "tooltip": "" - }, - { - "name": "Dither map", - "tooltip": "" - }, - { - "name": "Contrast", - "tooltip": "" - }, - { - "name": "Contrast map", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Camera": { - "name": "Camera", - "tooltip": "Create camera that crop image to fix dimension with control of position, zoom. Also can be use to create parallax effect.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Focus area", - "tooltip": "" - }, - { - "name": "Zoom", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Fix background", - "tooltip": "" - }, - { - "name": "Element 0", - "tooltip": "" - }, - { - "name": "Parallax 0", - "tooltip": "" - } - ] - }, - "Node_SDF": { - "name": "SDF", - "tooltip": "Create signed distance field using jump flooding algorithm.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Side", - "tooltip": "" - }, - { - "name": "Max distance", - "tooltip": "" - } - ] - }, - "Node_Strand_Create": { - "name": "Strand Create", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Density", - "tooltip": "How many strands to generate." - }, - { - "name": "Length", - "tooltip": "" - }, - { - "name": "Segment", - "tooltip": "" - }, - { - "name": "Elasticity", - "tooltip": "Length preservation, the higher the value the easier it is to stretch each segment." - }, - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Side", - "tooltip": "" - }, - { - "name": "Spring", - "tooltip": "Angular stiffness, the higher the value the easier it is to bend each segment." - }, - { - "name": "Structure", - "tooltip": "The ability to keep its original shape." - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Curl frequency", - "tooltip": "" - }, - { - "name": "Curliness", - "tooltip": "" - }, - { - "name": "Mesh", - "tooltip": "" - }, - { - "name": "Distribution", - "tooltip": "" - }, - { - "name": "Bake hair", - "tooltip": "Prevent strand reseting to apply manual modification. Unbaking will remove all changes." - }, - { - "name": "View fix hair", - "tooltip": "" - }, - { - "name": "Root strength", - "tooltip": "The force required to break strand from its root. Set to -1 to make strand infinitely strong." - } - ] - }, - "Node_Gradient_Out": { - "name": "Gradient", - "tooltip": "", - "outputs": [ - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "Position to sample a color from the gradient." - } - ] - }, - "Node_Random": { - "name": "Random", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "seed", - "tooltip": "" - }, - { - "name": "from", - "tooltip": "" - }, - { - "name": "to", - "tooltip": "" - } - ] - }, - "Node_Strand_Gravity": { - "name": "Strand Gravity", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Gravity", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - } - ] - }, - "Node_Mesh_Create_Path": { - "name": "Path to Mesh", - "tooltip": "Create mesh from path.", - "outputs": [ - { - "name": "Mesh", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Mesh", - "tooltip": "" - }, - { - "name": "Sample", - "tooltip": "" - }, - { - "name": "Algorithm", - "tooltip": "" - } - ] - }, - "Node_Pin": { - "name": "Pin", - "tooltip": "Craete pin to organize your connection. Can be create by double clicking on a connection line.", - "outputs": [ - { - "name": "Out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Out", - "tooltip": "" - } - ] - }, - "Node_Iterator_Filter_Input": { - "name": "Input", - "tooltip": "", - "outputs": [ - { - "name": "Value in", - "tooltip": "" - } - ], - "inputs": [] - }, - "Node_Scale_Algo": { - "name": "Scale Algorithm", - "tooltip": "Scale image using scale2x, scale3x algorithm.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Algorithm", - "tooltip": "" - }, - { - "name": "Tolerance", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Curve": { - "name": "Curve", - "tooltip": "Adjust brightness of an image using curves.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Brightness", - "tooltip": "" - }, - { - "name": "Red", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - }, - { - "name": "Blue", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_De_Stray": { - "name": "De-Stray", - "tooltip": "Attempt to remove orphan pixel.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Tolerance", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Equation": { - "name": "Equation", - "tooltip": "Evaluate string of equation. With an option for setting variables.", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Argument name", - "tooltip": "" - }, - { - "name": "Argument value", - "tooltip": "" - } - ] - }, - "Node_String": { - "name": "Text", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - } - ] - }, - "Node_Rigid_Force_Apply": { - "name": "Apply Force", - "tooltip": "", - "outputs": [ - { - "name": "Object", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Object", - "tooltip": "" - }, - { - "name": "Force type", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Torque", - "tooltip": "" - }, - { - "name": "Apply frame", - "tooltip": "Frame index to apply force." - }, - { - "name": "Force", - "tooltip": "" - }, - { - "name": "Scope", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - } - ] - }, - "Node_Mesh_Warp": { - "name": "Mesh Warp", - "tooltip": "Wrap image by converting it to mesh, and using control points.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mesh data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Sample", - "tooltip": "Amount of grid subdivision. Higher number means more grid, detail." - }, - { - "name": "Spring Force", - "tooltip": "" - }, - { - "name": "Mesh", - "tooltip": "" - }, - { - "name": "Diagonal Link", - "tooltip": "Include diagonal link to prevent drastic grid deformation." - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Link Strength", - "tooltip": "Link length preservation, setting it to 1 will prevent any stretching, contraction." - }, - { - "name": "Full Mesh", - "tooltip": "" - } - ] - }, - "Node_Zigzag": { - "name": "Zigzag", - "tooltip": "Generate zigzag pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Color 1", - "tooltip": "" - }, - { - "name": "Color 2", - "tooltip": "" - }, - { - "name": "Smooth", - "tooltip": "" - } - ] - }, - "Node_3D_Repeat": { - "name": "3D Repeat", - "tooltip": "Repeat 3D object multiple times.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D objects", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "3D objects", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Render position", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "3D object", - "tooltip": "" - }, - { - "name": "Repeat", - "tooltip": "Amount of copies to be generated." - }, - { - "name": "Repeat position", - "tooltip": "" - }, - { - "name": "Repeat rotation", - "tooltip": "" - }, - { - "name": "Repeat scale", - "tooltip": "" - }, - { - "name": "Repeat pattern", - "tooltip": "" - }, - { - "name": "Axis", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Path_Array": { - "name": "Path Array", - "tooltip": "", - "outputs": [ - { - "name": "Path array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path array", - "tooltip": "" - } - ] - }, - "Node_Gradient_Extract": { - "name": "Gradient Data", - "tooltip": "Get palatte and array of key positions from gradient.", - "outputs": [ - { - "name": "Colors", - "tooltip": "" - }, - { - "name": "Positions", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Colors", - "tooltip": "" - } - ] - }, - "Node_Audio_Window": { - "name": "Audio Window", - "tooltip": "Take a slice of an audio array based on the current frame.", - "outputs": [ - { - "name": "Windowed Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Windowed Array", - "tooltip": "" - }, - { - "name": "Sample", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - } - ] - }, - "Node_Line": { - "name": "Line", - "tooltip": "Draw line on an image. Connect path data to it to draw line from path.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Background", - "tooltip": "" - }, - { - "name": "Segment", - "tooltip": "" - }, - { - "name": "Width", - "tooltip": "" - }, - { - "name": "Wiggle", - "tooltip": "" - }, - { - "name": "Random seed", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "Draw line along path." - }, - { - "name": "Range", - "tooltip": "Range of the path to draw." - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Color over length", - "tooltip": "" - }, - { - "name": "Width over length", - "tooltip": "" - }, - { - "name": "Span width over path", - "tooltip": "Apply the full 'width over length' to the trimmed path." - }, - { - "name": "Round cap", - "tooltip": "" - }, - { - "name": "Round segment", - "tooltip": "" - }, - { - "name": "Span color over path", - "tooltip": "Apply the full 'color over length' to the trimmed path." - }, - { - "name": "Greyscale over width", - "tooltip": "" - }, - { - "name": "1px mode", - "tooltip": "Render pixel perfect 1px line." - }, - { - "name": "Texture", - "tooltip": "" - }, - { - "name": "Fix length", - "tooltip": "Fix length of each segment instead of segment count." - }, - { - "name": "Segment length", - "tooltip": "" - }, - { - "name": "Texture position", - "tooltip": "" - }, - { - "name": "Texture rotation", - "tooltip": "" - }, - { - "name": "Texture scale", - "tooltip": "" - } - ] - }, - "Node_Path_Transform": { - "name": "Transform Path", - "tooltip": "", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Anchor", - "tooltip": "" - } - ] - }, - "Node_Fluid_Domain": { - "name": "Fluid Domain", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Collision", - "tooltip": "" - }, - { - "name": "Material dissipation type", - "tooltip": "" - }, - { - "name": "Material dissipation", - "tooltip": "" - }, - { - "name": "Velocity dissipation type", - "tooltip": "" - }, - { - "name": "Velocity dissipation", - "tooltip": "" - }, - { - "name": "Acceleration", - "tooltip": "" - }, - { - "name": "Material intertia", - "tooltip": "" - }, - { - "name": "Initial pressure", - "tooltip": "" - }, - { - "name": "Material maccormack weight", - "tooltip": "" - }, - { - "name": "Velocity maccormack weight", - "tooltip": "" - }, - { - "name": "Wrap", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - } - ] - }, - "Node_Convolution": { - "name": "Convolution", - "tooltip": "Apply convolution operation on each pixel using a custom 3x3 kernel.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Kernel", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_VFX_Variable": { - "name": "VFX Variable", - "tooltip": "", - "outputs": [ - { - "name": "Positions", - "tooltip": "" - }, - { - "name": "Scales", - "tooltip": "" - }, - { - "name": "Rotations", - "tooltip": "" - }, - { - "name": "Blending", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Life", - "tooltip": "" - }, - { - "name": "Max life", - "tooltip": "" - }, - { - "name": "Surface", - "tooltip": "" - }, - { - "name": "Velocity", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Positions", - "tooltip": "" - } - ] - }, - "Node_Gradient_Palette": { - "name": "Palette to Gradient", - "tooltip": "Create gradient from palette.", - "outputs": [ - { - "name": "Gradient", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Custom positions", - "tooltip": "" - }, - { - "name": "Positions", - "tooltip": "Array of number indicating color position (0 - 1)." - }, - { - "name": "Blending", - "tooltip": "" - } - ] - }, - "Node_Iterate_Filter": { - "name": "Filter Array", - "tooltip": "Filter array using condition.", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - } - ] - }, - "Node_Corner": { - "name": "Corner", - "tooltip": "Round out sharp corner of the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Rigid_Override": { - "name": "Rigidbody Override", - "tooltip": "", - "outputs": [ - { - "name": "Object", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Object", - "tooltip": "" - }, - { - "name": "Positions", - "tooltip": "" - }, - { - "name": "Scales", - "tooltip": "" - }, - { - "name": "Rotations", - "tooltip": "" - }, - { - "name": "Blends", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Velocity", - "tooltip": "" - } - ] - }, - "Node_Iterator_Each_Output": { - "name": "Output", - "tooltip": "", - "outputs": [ - { - "name": "Preview", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Preview", - "tooltip": "" - } - ] - }, - "Node_Json_File_Read": { - "name": "JSON File In", - "tooltip": "Load .json file using keys.", - "outputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Struct", - "tooltip": "" - }, - { - "name": "Values", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Struct", - "tooltip": "" - } - ] - }, - "Node_Pack_Sprites": { - "name": "Pack Sprites", - "tooltip": "Combine array of images with different dimension using different algorithms.", - "outputs": [ - { - "name": "Packed image", - "tooltip": "" - }, - { - "name": "Atlas data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Packed image", - "tooltip": "" - }, - { - "name": "Algorithm", - "tooltip": "" - }, - { - "name": "Max width", - "tooltip": "" - }, - { - "name": "Max height", - "tooltip": "" - }, - { - "name": "Spacing", - "tooltip": "" - } - ] - }, - "Node_Palette_Sort": { - "name": "Sort Palette", - "tooltip": "", - "outputs": [ - { - "name": "Sorted palette", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Sorted palette", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - }, - { - "name": "Reverse", - "tooltip": "" - } - ] - }, - "Node_VFX_Destroy": { - "name": "Destroy", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Falloff distance", - "tooltip": "" - }, - { - "name": "Effect Vector", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Rotate particle", - "tooltip": "" - }, - { - "name": "Scale particle", - "tooltip": "" - } - ] - }, - "Node_3D_Plane": { - "name": "3D Plane", - "tooltip": "Put 2D image on a plane in 3D space.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Constant dimension", - "tooltip": "" - }, - { - "name": "Object position", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Texture scale", - "tooltip": "" - }, - { - "name": "Texture shift", - "tooltip": "" - }, - { - "name": "Subdiviion", - "tooltip": "" - }, - { - "name": "Normal axis", - "tooltip": "" - } - ] - }, - "Node_Scatter_Points": { - "name": "Scatter Points", - "tooltip": "Generate array of vector 2 points for scattering.", - "outputs": [ - { - "name": "Points", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Points", - "tooltip": "" - }, - { - "name": "Point distribution", - "tooltip": "" - }, - { - "name": "Scatter", - "tooltip": "" - }, - { - "name": "Point amount", - "tooltip": "Amount of particle spawn in that frame." - }, - { - "name": "Distribution map", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Fixed position", - "tooltip": "Fix point position, and only select point in the area." - }, - { - "name": "Reference dimension", - "tooltip": "" - } - ] - }, - "Node_3D_Cone": { - "name": "3D Cone", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Object rotation", - "tooltip": "" - }, - { - "name": "Object position", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Sides", - "tooltip": "" - }, - { - "name": "Textures base", - "tooltip": "" - }, - { - "name": "Textures side", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Struct": { - "name": "Struct", - "tooltip": "", - "outputs": [ - { - "name": "Struct", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Struct", - "tooltip": "" - }, - { - "name": "value", - "tooltip": "" - } - ] - }, - "Node_Render_Sprite_Sheet": { - "name": "Render Spritesheet", - "tooltip": "Create spritesheet from image array or animation.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Atlas Data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Sprite set", - "tooltip": "" - }, - { - "name": "Frame step", - "tooltip": "Number of frames until next sprite. Can be seen as (Step - 1) frame skip." - }, - { - "name": "Packing type", - "tooltip": "" - }, - { - "name": "Grid column", - "tooltip": "" - }, - { - "name": "Alignment", - "tooltip": "" - }, - { - "name": "Spacing", - "tooltip": "" - }, - { - "name": "Padding", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "Starting\/ending frames, set end to 0 to default to last frame." - } - ] - }, - "Node_Atlas_Draw": { - "name": "Draw Atlas", - "tooltip": "Render image atlas to a surface.", - "outputs": [ - { - "name": "Surface", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Atlas", - "tooltip": "" - } - ] - }, - "Node_Path_Reverse": { - "name": "Reverse Path", - "tooltip": "", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - } - ] - }, - "Node_Cellular": { - "name": "Cellular Noise", - "tooltip": "Generate voronoi pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Contrast", - "tooltip": "" - }, - { - "name": "Pattern", - "tooltip": "" - }, - { - "name": "Middle", - "tooltip": "" - }, - { - "name": "Radial scale", - "tooltip": "" - }, - { - "name": "Radial shatter", - "tooltip": "" - }, - { - "name": "Colored", - "tooltip": "" - } - ] - }, - "Node_Cache_Array": { - "name": "Cache Array", - "tooltip": "Store current animation as array. Cache persisted between save.", - "outputs": [ - { - "name": "Cache array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Cache array", - "tooltip": "" - }, - { - "name": "Start frame", - "tooltip": "Frame index to start caching, set to -1 to start at the first frame." - }, - { - "name": "Stop frame", - "tooltip": "Frame index to stop caching (inclusive), set to -1 to stop at the last frame." - }, - { - "name": "Step", - "tooltip": "Cache every N frames, set to 1 to cache every frame." - } - ] - }, - "Node_Surface_Replace": { - "name": "Replace Image", - "tooltip": "", - "outputs": [ - { - "name": "Surface Out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface Out", - "tooltip": "" - }, - { - "name": "Target Image", - "tooltip": "" - }, - { - "name": "Replacement Image", - "tooltip": "" - }, - { - "name": "Color Threshold", - "tooltip": "How similiar the color need to be in order to be count as matched." - }, - { - "name": "Draw Base Image", - "tooltip": "" - }, - { - "name": "Fast Mode", - "tooltip": "" - }, - { - "name": "Pixel Threshold", - "tooltip": "How many pixel need to me matched to replace with replacement image." - }, - { - "name": "Array mode", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - } - ] - }, - "Node_Vector_Split": { - "name": "Vector Split", - "tooltip": "", - "outputs": [ - { - "name": "x", - "tooltip": "" - }, - { - "name": "y", - "tooltip": "" - }, - { - "name": "z", - "tooltip": "" - }, - { - "name": "w", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "x", - "tooltip": "" - } - ] - }, - "Node_Iterator_Sort_Input": { - "name": "Sort Input", - "tooltip": "", - "outputs": [ - { - "name": "Value in", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Value in", - "tooltip": "" - } - ] - }, - "Node_Path_Builder": { - "name": "Path Builder", - "tooltip": "Create path from array of vec2 points.", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Connected", - "tooltip": "If set to true, will draw a single path from one point to another. If not set will treat each pair of points as an individual line." - } - ] - }, - "Node_Array_Length": { - "name": "Array Length", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Size", - "tooltip": "" - } - ] - }, - "Node_Combine_HSV": { - "name": "HSV Combine", - "tooltip": "Combine 4 image in to one. Each image use to control HSVA channel.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Saturation", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - } - ] - }, - "Node_Noise_Simplex": { - "name": "Simplex Noise", - "tooltip": "Generate simplex noise, similiar to perlin noise with better fidelity but non-tilable.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Iteration", - "tooltip": "" - }, - { - "name": "Color mode", - "tooltip": "" - }, - { - "name": "Color R range", - "tooltip": "" - }, - { - "name": "Color G range", - "tooltip": "" - }, - { - "name": "Color B range", - "tooltip": "" - } - ] - }, - "Node_Array_Range": { - "name": "Array Range", - "tooltip": "Create array of numbers by setting start, end and step length.", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "End", - "tooltip": "" - }, - { - "name": "Step", - "tooltip": "" - } - ] - }, - "Node_Text_File_Write": { - "name": "Text File Out", - "tooltip": "Save text as a .txt file.", - "outputs": [], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Content", - "tooltip": "" - } - ] - }, - "Node_Lua_Global": { - "name": "Lua Global", - "tooltip": "", - "outputs": [ - { - "name": "Execution thread", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Execution thread", - "tooltip": 14 - }, - { - "name": "Run order", - "tooltip": "" - }, - { - "name": "Execution thread", - "tooltip": "" - } - ] - }, - "Node_Math": { - "name": "Math", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Type", - "tooltip": "" - }, - { - "name": "a", - "tooltip": "" - }, - { - "name": "b", - "tooltip": "" - }, - { - "name": "Degree angle", - "tooltip": "" - }, - { - "name": "To integer", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - } - ] - }, - "Node_Move_Point": { - "name": "Translate Point", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Distance", - "tooltip": "" - } - ] - }, - "Node_Atlas_Set": { - "name": "Atlas Set", - "tooltip": "", - "outputs": [ - { - "name": "Atlas", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Atlas", - "tooltip": "" - }, - { - "name": "Surface", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Blend", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - } - ] - }, - "Node_Skew": { - "name": "Skew", - "tooltip": "Skew image horizontally, or vertically.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Axis", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Wrap", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" + "tooltip": "", + "name": "Active" } ] }, "Node_Grid": { - "name": "Grid", "tooltip": "Generate grid pattern.", + "name": "Grid", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Dimension", - "tooltip": "" + "tooltip": "", + "name": "Dimension" }, { - "name": "Position", - "tooltip": "" + "tooltip": "", + "name": "Position" }, { - "name": "Scale", - "tooltip": "" + "tooltip": "", + "name": "Scale" }, { - "name": "Gap", - "tooltip": "" + "tooltip": "", + "name": "Gap" }, { - "name": "Angle", - "tooltip": "" + "tooltip": "", + "name": "Angle" }, { - "name": "Tile color", - "tooltip": "" + "tooltip": "", + "name": "Tile color" }, { - "name": "Gap color", - "tooltip": "" + "tooltip": "", + "name": "Gap color" }, { - "name": "Texture", - "tooltip": "" + "tooltip": "", + "name": "Texture" }, { - "name": "Shift", - "tooltip": "" + "tooltip": "", + "name": "Shift" }, { - "name": "Shift axis", - "tooltip": "" + "tooltip": "", + "name": "Shift axis" }, { - "name": "Render type", - "tooltip": "" + "tooltip": "", + "name": "Render type" }, { - "name": "Seed", - "tooltip": "" - } - ] - }, - "Node_Color_Remove": { - "name": "Remove Color", - "tooltip": "Remove color that match a palette.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Colors", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Invert", - "tooltip": "Keep the selected colors and remove the rest." - } - ] - }, - "Node_Image": { - "name": "Image", - "tooltip": "Load a single image from your computer.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Padding", - "tooltip": "" - } - ] - }, - "Node_Checker": { - "name": "Checker", - "tooltip": "Genearte checkerboard pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Color 1", - "tooltip": "" - }, - { - "name": "Color 2", - "tooltip": "" - } - ] - }, - "Node_Gradient": { - "name": "Draw Gradient", - "tooltip": "Create image from gradient.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - } - ] - }, - "Node_Cache": { - "name": "Cache", - "tooltip": "Store current animation. Cache persisted between save.", - "outputs": [ - { - "name": "Cache surface", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Cache surface", - "tooltip": "" - } - ] - }, - "Node_Strand_Group": { - "name": "StrandSim", - "tooltip": "Create group for hair simulation.", - "outputs": [], - "inputs": [] - }, - "Node_Iterate_Sort": { - "name": "Sort Array", - "tooltip": "Sort array using node graph.", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - } - ] - }, - "Node_Level": { - "name": "Level", - "tooltip": "Adjust brightness of an image by changing its brightness range.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "White", - "tooltip": "" - }, - { - "name": "Red", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - }, - { - "name": "Blue", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Find_Pixel": { - "name": "Find pixel", - "tooltip": "Get the position of the first pixel with a given color.", - "outputs": [ - { - "name": "Surface in", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Search color", - "tooltip": "" - } - ] - }, - "Node_Fluid_Turbulence": { - "name": "Turbulence", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Effect area", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - } - ] - }, - "Node_Rigid_Object_Spawner": { - "name": "Object Spawner", - "tooltip": "", - "outputs": [ - { - "name": "Object", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Object", - "tooltip": "" - }, - { - "name": "Spawn area", - "tooltip": "" - }, - { - "name": "Spawn type", - "tooltip": "" - }, - { - "name": "Spawn delay", - "tooltip": "" - }, - { - "name": "Spawn amount", - "tooltip": "" - }, - { - "name": "Spawn frame", - "tooltip": "" - }, - { - "name": "Spawn", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - } - ] - }, - "Node_Grey_Alpha": { - "name": "Grey to Alpha", - "tooltip": "Convert greyscale to alpha value.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Replace color", - "tooltip": "Replace output with solid color." - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Iterate_Each": { - "name": "Loop Array", - "tooltip": "Create group that iterate to each member in an array.", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - } - ] - }, - "Node_3D_Transform": { - "name": "3D Transform", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Render position", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "3D object", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Switch": { - "name": "Switch", - "tooltip": "Given an index, output value base on index matching.", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Default value", - "tooltip": "" - }, - { - "name": "Case", - "tooltip": "" - }, - { - "name": "value", - "tooltip": "" - } - ] - }, - "Node_Feedback_Output": { - "name": "Output", - "tooltip": "", - "outputs": [], - "inputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - }, - { - "name": "Feedback loop", - "tooltip": "" - } - ] - }, - "Node_Websocket_Receiver": { - "name": "Websocket Receiver", - "tooltip": "Create websocket server to receive data from the network.", - "outputs": [ - { - "name": "Data", - "tooltip": "" - }, - { - "name": "Receive data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Port", - "tooltip": "" - }, - { - "name": "Receive data", - "tooltip": "" - } - ] - }, - "Node_Export": { - "name": "Export", - "tooltip": "Export image, image array to file, image sequence, animation.", - "outputs": [ - { - "name": "Loop exit", - "tooltip": "" - }, - { - "name": "Preview", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Loop exit", - "tooltip": "" - }, - { - "name": "Preview", - "tooltip": "" - }, - { - "name": "Template", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Template guides", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - }, - { - "name": "Frame optimization", - "tooltip": "" - }, - { - "name": "Color merge", - "tooltip": "" - }, - { - "name": "Framerate", - "tooltip": "" - }, - { - "name": "Format", - "tooltip": "" - }, - { - "name": "Quality", - "tooltip": "" - }, - { - "name": "Sequence begin", - "tooltip": "" - } - ] - }, - "Node_Bloom": { - "name": "Bloom", - "tooltip": "Apply bloom effect, bluring and brighten the bright part of the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "Bloom blur radius." - }, - { - "name": "Tolerance", - "tooltip": "How bright a pixel should be to start blooming." - }, - { - "name": "Strength", - "tooltip": "Blend intensity." - }, - { - "name": "Bloom mask", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Path_Anchor": { - "name": "Path Anchor", - "tooltip": "", - "outputs": [ - { - "name": "Anchor", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Anchor", - "tooltip": "" - }, - { - "name": "Control point 1", - "tooltip": "" - }, - { - "name": "Control point 2", - "tooltip": "" - }, - { - "name": "Mirror control point", - "tooltip": "" - } - ] - }, - "Node_Repeat": { - "name": "Repeat", - "tooltip": "Repeat image multiple times linearly, or in grid pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Pattern", - "tooltip": "" - }, - { - "name": "Repeat position", - "tooltip": "" - }, - { - "name": "Repeat rotation", - "tooltip": "" - }, - { - "name": "Scale multiply", - "tooltip": "" - }, - { - "name": "Angle range", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Start position", - "tooltip": "" - }, - { - "name": "Scale over copy", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "Make each copy follow along path." - }, - { - "name": "Path range", - "tooltip": "Range of the path to follow." - }, - { - "name": "Path shift", - "tooltip": "" - }, - { - "name": "Color over copy", - "tooltip": "" - }, - { - "name": "Alpha over copy", - "tooltip": "" - }, - { - "name": "Array select", - "tooltip": "Whether to select image from an array in order, at random, pr spread or each image to one output." - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Column", - "tooltip": "" - }, - { - "name": "Column shift", - "tooltip": "" - }, - { - "name": "Animator midpoint", - "tooltip": "" - }, - { - "name": "Animator range", - "tooltip": "" - }, - { - "name": "Animator position", - "tooltip": "" - }, - { - "name": "Animator rotation", - "tooltip": "" - }, - { - "name": "Animator scale", - "tooltip": "" - }, - { - "name": "Animator falloff", - "tooltip": "" - }, - { - "name": "Stack", - "tooltip": "Place each copy next to each other, taking surface dimension into account." - }, - { - "name": "Animator blend", - "tooltip": "" - }, - { - "name": "Animator alpha", - "tooltip": "" - } - ] - }, - "Node_Flip": { - "name": "Flip", - "tooltip": "Flip image horizontally or vertically.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Axis", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Pixel_Sort": { - "name": "Pixel Sort", - "tooltip": "Sort pixel by brightness in horizontal, or vertial axis.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Iteration", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Plot_Linear": { - "name": "Bar \/ Graph", - "tooltip": "Plot graph or bar chart from array of number.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Data", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Sample frequency", - "tooltip": "" - }, - { - "name": "Origin", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Base Color", - "tooltip": "" - }, - { - "name": "Graph Thickness", - "tooltip": "" - }, - { - "name": "Use Background", - "tooltip": "" - }, - { - "name": "Background", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Value Offset", - "tooltip": "" - }, - { - "name": "Color Over Sample", - "tooltip": "" - }, - { - "name": "Trim mode", - "tooltip": "" - }, - { - "name": "Window Size", - "tooltip": "" - }, - { - "name": "Window Offset", - "tooltip": "" - }, - { - "name": "Spacing", - "tooltip": "" - }, - { - "name": "Bar Width", - "tooltip": "" - }, - { - "name": "Rounded Bar", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Flip Value", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - }, - { - "name": "Smooth", - "tooltip": "" - } - ] - }, - "Node_Crop_Content": { - "name": "Crop Content", - "tooltip": "Crop out empty pixel pixel from the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Array", - "tooltip": "Cropping mode for dealing with image array." - }, - { - "name": "Padding", - "tooltip": "Add padding back after crop." - } - ] - }, - "Node_Morph_Surface": { - "name": "Morph Surface", - "tooltip": "Morph pixel bewteen two surfaces.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Surface to", - "tooltip": "" - }, - { - "name": "Morph amount", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "" - } - ] - }, - "Node_VFX_Spawner": { - "name": "Spawner", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "On create", - "tooltip": "" - }, - { - "name": "On step", - "tooltip": "" - }, - { - "name": "On destroy", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particle sprite", - "tooltip": "" - }, - { - "name": "Spawn delay", - "tooltip": "Frames delay between each particle spawn." - }, - { - "name": "Spawn amount", - "tooltip": "Amount of particle spawn in that frame." - }, - { - "name": "Spawn area", - "tooltip": "" - }, - { - "name": "Spawn distribution", - "tooltip": "" - }, - { - "name": "Lifespan", - "tooltip": "" - }, - { - "name": "Spawn direction", - "tooltip": "" - }, - { - "name": "Acceleration", - "tooltip": "" - }, - { - "name": "Orientation", - "tooltip": "" - }, - { - "name": "Rotational speed", - "tooltip": "" - }, - { - "name": "Spawn scale", - "tooltip": "" - }, - { - "name": "Scale over time", - "tooltip": "" - }, - { - "name": "Color over lifetime", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Alpha over time", - "tooltip": "" - }, - { - "name": "Rotate by direction", - "tooltip": "Make the particle rotates to follow its movement." - }, - { - "name": "Spawn type", - "tooltip": "" - }, - { - "name": "Spawn size", - "tooltip": "" - }, - { - "name": "Spawn velocity", - "tooltip": "" - }, - { - "name": "Gravity", - "tooltip": "" - }, - { - "name": "Wiggle", - "tooltip": "" - }, - { - "name": "Loop", - "tooltip": "" - }, - { - "name": "Surface array", - "tooltip": "Whether to select image from an array in order, at random, or treat array as animation." - }, - { - "name": "Animation speed", - "tooltip": "" - }, - { - "name": "Scatter", - "tooltip": "" - }, - { - "name": "Boundary data", - "tooltip": "" - }, - { - "name": "On animation end", - "tooltip": "" - }, - { - "name": "Spawn", - "tooltip": "" - }, - { - "name": "Random blend", - "tooltip": "" - }, - { - "name": "Directed from center", - "tooltip": "Make particle move away from the spawn center." - }, - { - "name": "Distribution map", - "tooltip": "" - }, - { - "name": "Distribution data", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Gravity direction", - "tooltip": "" - }, - { - "name": "Turning", - "tooltip": "" - }, - { - "name": "Turn both directions", - "tooltip": "Apply randomized 1, -1 multiplier to the turning speed." - }, - { - "name": "Turn scale with speed", - "tooltip": "" - }, - { - "name": "Spawn trigger", - "tooltip": "" - }, - { - "name": "Step interval", - "tooltip": "How often the 'on step' event is triggered.\nWith 1 being trigger every frame, 2 means triggered once every 2 frames." - } - ] - }, - "Node_Gradient_Shift": { - "name": "Gradient Shift", - "tooltip": "Move gradients keys.", - "outputs": [ - { - "name": "Gradient", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Wrap", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - } - ] - }, - "Node_Stripe": { - "name": "Stripe", - "tooltip": "Generate stripe pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Blend", - "tooltip": "Smoothly blend between each stripe." - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Random", - "tooltip": "" - }, - { - "name": "Random color", - "tooltip": "" - }, - { - "name": "Colors", - "tooltip": "" - }, - { - "name": "Color 1", - "tooltip": "" - }, - { - "name": "Color 2", - "tooltip": "" - } - ] - }, - "Node_Fluid_Update": { - "name": "Update Domain", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Image_Sequence": { - "name": "Image Array", - "tooltip": "Load multiple images from your computer as array.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Paths", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Padding", - "tooltip": "" - }, - { - "name": "Canvas size", - "tooltip": "" - }, - { - "name": "Sizing method", - "tooltip": "" - } - ] - }, - "Node_HSV_Channel": { - "name": "HSV Extract", - "tooltip": "Extract HSVA channel on an image, each channel becomes its own image.", - "outputs": [ - { - "name": "Hue", - "tooltip": "" - }, - { - "name": "Saturation", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Hue", - "tooltip": "" - } - ] - }, - "Node_VFX_Wind": { - "name": "Wind", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Falloff distance", - "tooltip": "" - }, - { - "name": "Effect Vector", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Rotate particle", - "tooltip": "" - }, - { - "name": "Scale particle", - "tooltip": "" - } - ] - }, - "Node_Print": { - "name": "Print", - "tooltip": "Display text to notification.", - "outputs": [], - "inputs": [ - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Text", - "tooltip": "" - } - ] - }, - "Node_Greyscale": { - "name": "Greyscale", - "tooltip": "Convert color image to greyscale.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Brightness", - "tooltip": "" - }, - { - "name": "Contrast", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Local_Analyze": { - "name": "Local Analyze", - "tooltip": "Apply non-linear operation (minimum, maximum) on each pixel locally.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Algorithm", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_3D_Sphere": { - "name": "3D Sphere", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Subdivisions", - "tooltip": "Amount of polygon in X and Y axis." - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Textures", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Object rotation", - "tooltip": "" - }, - { - "name": "Object position", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Blend": { - "name": "Blend", - "tooltip": "Blend 2 images using different blendmodes.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Foreground", - "tooltip": "" - }, - { - "name": "Blend mode", - "tooltip": "" - }, - { - "name": "Opacity", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Fill mode", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Constant dimension", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Preserve alpha", - "tooltip": "" - }, - { - "name": "Horizontal Align", - "tooltip": "" - }, - { - "name": "Vertical Align", - "tooltip": "" - } - ] - }, - "Node_3D_Export": { - "name": "3D Export", - "tooltip": "", - "outputs": [], - "inputs": [ - { - "name": "Vertex data", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "Export location without '.obj' extension." - }, - { - "name": "Export texture", - "tooltip": "" - } - ] - }, - "Node_Vector4": { - "name": "Vector4", - "tooltip": "", - "outputs": [ - { - "name": "Vector", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Vector", - "tooltip": "" - }, - { - "name": "y", - "tooltip": "" - }, - { - "name": "z", - "tooltip": "" - }, - { - "name": "w", - "tooltip": "" - }, - { - "name": "Integer", - "tooltip": "" - } - ] - }, - "Node_Base_Convert": { - "name": "Convert Base", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Base from", - "tooltip": "" - }, - { - "name": "Base to", - "tooltip": "" - } - ] - }, - "Node_Color_replace": { - "name": "Replace Color", - "tooltip": "Replace color that match one palette with another palette.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Palette from", - "tooltip": "Color to be replaced." - }, - { - "name": "Palette to", - "tooltip": "Palette to be replaced to." - }, - { - "name": "Threshold", - "tooltip": "" - }, - { - "name": "Set others to black", - "tooltip": "Set pixel that doesn't match any color in 'palette from' to black." - }, - { - "name": "Multiply alpha", - "tooltip": "" - }, - { - "name": "Hard replace", - "tooltip": "Completely override pixel with new color instead of blending between it." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Strand_Collision": { - "name": "Strand Collision", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Collision mesh", - "tooltip": "" - } - ] - }, - "Node_Colorize": { - "name": "Colorize", - "tooltip": "Map brightness of a pixel to a color from a gradient.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Gradient shift", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Multiply alpha", - "tooltip": "" - } - ] - }, - "Node_CSV_File_Read": { - "name": "CSV File In", - "tooltip": "Load .csv as text, number array.", - "outputs": [ - { - "name": "Content", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Content", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ] - }, - "Node_Fluid_Repulse": { - "name": "Repulse", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "" - } - ] - }, - "Node_Condition": { - "name": "Condition", - "tooltip": "Given a condition, output one value if true, another value is false.", - "outputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Bool", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Result", - "tooltip": "" - }, - { - "name": "Condition", - "tooltip": "" - }, - { - "name": "Compare to", - "tooltip": "" - }, - { - "name": "True", - "tooltip": "" - }, - { - "name": "False", - "tooltip": "" - }, - { - "name": "Eval mode", - "tooltip": "" - }, - { - "name": "Boolean", - "tooltip": "" - }, - { - "name": "Text 1", - "tooltip": "" - }, - { - "name": "Text 2", - "tooltip": "" - } - ] - }, - "Node_3D_Displace": { - "name": "3D Displace", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Render position", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - }, - { - "name": "Displacement map", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - } - ] - }, - "Node_WAV_File_Write": { - "name": "WAV File Out", - "tooltip": "Save wav audio file.", - "outputs": [], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Audio Data", - "tooltip": "" - }, - { - "name": "Sample", - "tooltip": "" - }, - { - "name": "Bit Depth", - "tooltip": "" - }, - { - "name": "Remap Data", - "tooltip": "" - }, - { - "name": "Data Range", - "tooltip": "" - } - ] - }, - "Node_FFT": { - "name": "FFT", - "tooltip": "Perform fourier transform on number array.", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "Preprocess Function", - "tooltip": "" - } - ] - }, - "Node_3D_Cube": { - "name": "3D Cube", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Textures per face", - "tooltip": "" - }, - { - "name": "Textures 0", - "tooltip": "" - }, - { - "name": "Textures 1", - "tooltip": "" - }, - { - "name": "Textures 2", - "tooltip": "" - }, - { - "name": "Textures 3", - "tooltip": "" - }, - { - "name": "Textures 4", - "tooltip": "" - }, - { - "name": "Textures 5", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Object rotation", - "tooltip": "" - }, - { - "name": "Object position", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Boolean": { - "name": "Boolean", - "tooltip": "", - "outputs": [ - { - "name": "Boolean", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Boolean", - "tooltip": "" - } - ] - }, - "Node_Pixel_Cloud": { - "name": "Pixel Cloud", - "tooltip": "Displace each pixel of the image randomly.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Strength map", - "tooltip": "" - }, - { - "name": "Color over lifetime", - "tooltip": "" - }, - { - "name": "Distance", - "tooltip": "" - }, - { - "name": "Alpha over lifetime", - "tooltip": "" - }, - { - "name": "Random blending", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_String_Get_Char": { - "name": "Get Character", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Index", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - } - ] - }, - "Node_Bevel": { - "name": "Bevel", - "tooltip": "Apply 2D bevel on the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Height", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Slope", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - } - ] - }, - "Node_Array_Add": { - "name": "Array Add", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Output", - "tooltip": "" - }, - { - "name": "Spread array", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - } - ] - }, - "Node_Array": { - "name": "Array", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Spread array", - "tooltip": "" - }, - { - "name": "Input", - "tooltip": "" - } - ] - }, - "Node_Lua_Surface": { - "name": "Lua Surface", - "tooltip": "", - "outputs": [ - { - "name": "Execution thread", - "tooltip": "" - }, - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Execution thread", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Lua code", - "tooltip": 14 - }, - { - "name": "Execution thread", - "tooltip": "" - }, - { - "name": "Execute on frame", - "tooltip": "" - }, - { - "name": "Argument name", - "tooltip": "" - }, - { - "name": "Argument type", - "tooltip": "" - }, - { - "name": "Argument value", - "tooltip": "" - } - ] - }, - "Node_3D_Extrude": { - "name": "3D Extrude", - "tooltip": "Extrude 2D image into 3D object.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "3D scene", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Normal pass", - "tooltip": "" - }, - { - "name": "3D vertex", - "tooltip": "" - }, - { - "name": "Object scale", - "tooltip": "" - }, - { - "name": "Render position", - "tooltip": "" - }, - { - "name": "Render rotation", - "tooltip": "" - }, - { - "name": "Render scale", - "tooltip": "" - }, - { - "name": "Manual generate", - "tooltip": "" - }, - { - "name": "Light direction", - "tooltip": "" - }, - { - "name": "Light height", - "tooltip": "" - }, - { - "name": "Light intensity", - "tooltip": "" - }, - { - "name": "Light color", - "tooltip": "" - }, - { - "name": "Ambient color", - "tooltip": "" - }, - { - "name": "Height map", - "tooltip": "" - }, - { - "name": "Always update", - "tooltip": "" - }, - { - "name": "Projection", - "tooltip": "" - }, - { - "name": "Field of view", - "tooltip": "" - }, - { - "name": "Scale view with dimension", - "tooltip": "" - } - ] - }, - "Node_Rigid_Global": { - "name": "RigidSim Global", - "tooltip": "", - "outputs": [], - "inputs": [ - { - "name": "Gravity", - "tooltip": "" - } - ] - }, - "Node_Struct_Get": { - "name": "Struct Get", - "tooltip": "", - "outputs": [ - { - "name": "Struct", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Struct", - "tooltip": "" - }, - { - "name": "Key", - "tooltip": "" - } - ] - }, - "Node_Gradient_Points": { - "name": "4 Points Gradient", - "tooltip": "Create image from 4 color points.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Center 1", - "tooltip": "" - }, - { - "name": "Color 1", - "tooltip": "" - }, - { - "name": "Center 2", - "tooltip": "" - }, - { - "name": "Color 2", - "tooltip": "" - }, - { - "name": "Center 3", - "tooltip": "" - }, - { - "name": "Color 3", - "tooltip": "" - }, - { - "name": "Center 4", - "tooltip": "" - }, - { - "name": "Color 4", - "tooltip": "" - }, - { - "name": "Use palette", - "tooltip": "" - }, - { - "name": "Palette", - "tooltip": "" - } - ] - }, - "Node_Trigger_Bool": { - "name": "Boolean Trigger", - "tooltip": "", - "outputs": [ - { - "name": "Trigger", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Trigger", - "tooltip": "" - }, - { - "name": "Trigger condition", - "tooltip": "" - } - ] - }, - "Node_Sequence_Anim": { - "name": "Array to Anim", - "tooltip": "Convert array of images into animation.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Speed", - "tooltip": "" - } - ] - }, - "Node_Strand_Render_Texture": { - "name": "Strand Render Texture", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Thickness", - "tooltip": "" - }, - { - "name": "Random color", - "tooltip": "" - }, - { - "name": "Texture", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - } - ] - }, - "Node_Stack": { - "name": "Stack", - "tooltip": "Place image next to each other linearly, or on top of each other.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Atlas data", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Axis", - "tooltip": "" - }, - { - "name": "Align", - "tooltip": "" - }, - { - "name": "Spacing", - "tooltip": "" - }, - { - "name": "Input", - "tooltip": "" - } - ] - }, - "Node_Image_gif": { - "name": "Image GIF", - "tooltip": "Load animated .gif from your computer.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - } - ] - }, - "Node_Fluid_Add": { - "name": "Add Fluid", - "tooltip": "", - "outputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Fluid Domain", - "tooltip": "" - }, - { - "name": "Fluid brush", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Inherit velocity", - "tooltip": "" - }, - { - "name": "Density", - "tooltip": "" - } - ] - }, - "Node_Noise_Aniso": { - "name": "Anisotropic Noise", - "tooltip": "Generate anisotropic noise.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Amount", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - } - ] - }, - "Node_Polar": { - "name": "Polar", - "tooltip": "Convert image to polar coordinate.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Padding": { - "name": "Padding", - "tooltip": "Make image bigger by adding space in 4 directions.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Padding", - "tooltip": "" - }, - { - "name": "Fill method", - "tooltip": "" - }, - { - "name": "Fill color", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Pad mode", - "tooltip": "" - }, - { - "name": "Target dimension", - "tooltip": "" - }, - { - "name": "Horizontal alignment", - "tooltip": "" - }, - { - "name": "Vertical alignment", - "tooltip": "" - } - ] - }, - "Node_Iterator_Each_Length": { - "name": "Array Length", - "tooltip": "", - "outputs": [ - { - "name": "Length", - "tooltip": "" - } - ], - "inputs": [] - }, - "Node_Solid": { - "name": "Solid", - "tooltip": "Create image of a single color.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Empty", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Use mask dimension", - "tooltip": "" - } - ] - }, - "Node_Color_adjust": { - "name": "Color Adjust", - "tooltip": "Adjust brightness, contrast, hue, saturation, value, alpha, and blend image with color.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Color out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Color out", - "tooltip": "" - }, - { - "name": "Contrast", - "tooltip": "" - }, - { - "name": "Hue", - "tooltip": "" - }, - { - "name": "Saturation", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Blend", - "tooltip": "" - }, - { - "name": "Blend alpha", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Exposure", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Input Type", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - } - ] - }, - "Node_Rigid_Activate": { - "name": "Activate Physics", - "tooltip": "", - "outputs": [ - { - "name": "Object", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Object", - "tooltip": "" - }, - { - "name": "Physics activated", - "tooltip": "" - } - ] - }, - "Node_RGB_Channel": { - "name": "RGBA Extract", - "tooltip": "Extract RGBA channel on an image, each channel becomes its own image.", - "outputs": [ - { - "name": "Red", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - }, - { - "name": "Blue", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Red", - "tooltip": "" - }, - { - "name": "Output type", - "tooltip": "" - } - ] - }, - "Node_FXAA": { - "name": "FXAA", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ] - }, - "Node_Blur_Contrast": { - "name": "Contrast Blur", - "tooltip": "Blur only pixel of a similiar color.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "Brightness different to be blur together." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Group_Input": { - "name": "Input", - "tooltip": "", - "outputs": [ - { - "name": "Value", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Display type", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Input type", - "tooltip": "" - }, - { - "name": "Enum label", - "tooltip": "" - }, - { - "name": "Vector size", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" - }, - { - "name": "Display preview gizmo", - "tooltip": "" - }, - { - "name": "Step", - "tooltip": "" - } - ] - }, - "Node_Group": { - "name": "Group", - "tooltip": "", - "outputs": [], - "inputs": [] - }, - "Node_Vector3": { - "name": "Vector3", - "tooltip": "", - "outputs": [ - { - "name": "Vector", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Vector", - "tooltip": "" - }, - { - "name": "y", - "tooltip": "" - }, - { - "name": "z", - "tooltip": "" - }, - { - "name": "Integer", - "tooltip": "" + "tooltip": "", + "name": "Seed" } ] }, "Node_VFX_Attract": { + "tooltip": "", "name": "Attract", - "tooltip": "", "outputs": [ { - "name": "Particles", - "tooltip": "" + "tooltip": "", + "name": "Particles" } ], "inputs": [ { - "name": "Particles", - "tooltip": "" + "tooltip": "", + "name": "Particles" }, { - "name": "Area", - "tooltip": "" + "tooltip": "", + "name": "Area" }, { - "name": "Falloff", - "tooltip": "" + "tooltip": "", + "name": "Falloff" }, { - "name": "Falloff distance", - "tooltip": "" + "tooltip": "", + "name": "Falloff distance" }, { - "name": "Effect Vector", - "tooltip": "" + "tooltip": "", + "name": "Effect Vector" }, { - "name": "Strength", - "tooltip": "" + "tooltip": "", + "name": "Strength" }, { - "name": "Rotate particle", - "tooltip": "" + "tooltip": "", + "name": "Rotate particle" }, { - "name": "Scale particle", - "tooltip": "" + "tooltip": "", + "name": "Scale particle" } ] }, - "Node_Sprite_Stack": { - "name": "Sprite Stack", - "tooltip": "Create sprite stack either from repeating a single image or stacking different images using array.", + "Node_Lua_Global": { + "tooltip": "", + "name": "Lua Global", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Execution thread" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": 14, + "name": "Lua code" }, { - "name": "Dimension", - "tooltip": "" + "tooltip": "", + "name": "Run order" }, { - "name": "Stack amount", - "tooltip": "" - }, - { - "name": "Stack shift", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Stack blend", - "tooltip": "" - }, - { - "name": "Alpha end", - "tooltip": "Alpha value for the last copy." - }, - { - "name": "Move base", - "tooltip": "Make each copy move the original image." + "tooltip": "", + "name": "Execution thread" } ] }, - "Node_Statistic": { - "name": "Statistic", - "tooltip": "", - "outputs": [ - { - "name": "Statistic", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Input", - "tooltip": "" - } - ] - }, - "Node_Gradient_Replace_Color": { - "name": "Gradient Replace", - "tooltip": "", - "outputs": [ - { - "name": "Gradient", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Gradient", - "tooltip": "" - }, - { - "name": "Color from", - "tooltip": "" - }, - { - "name": "Color to", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "" - } - ] - }, - "Node_Iterator_Sort_Output": { - "name": "Sort Output", - "tooltip": "", + "Node_Feedback": { + "tooltip": "Create group that reuse output from last frame to the current one.", + "name": "Feedback", "outputs": [], + "inputs": [] + }, + "Node_Gradient_Points": { + "tooltip": "Create image from 4 color points.", + "name": "4 Points Gradient", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], "inputs": [ { - "name": "Result", - "tooltip": "" + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Center 1" + }, + { + "tooltip": "", + "name": "Color 1" + }, + { + "tooltip": "", + "name": "Center 2" + }, + { + "tooltip": "", + "name": "Color 2" + }, + { + "tooltip": "", + "name": "Center 3" + }, + { + "tooltip": "", + "name": "Color 3" + }, + { + "tooltip": "", + "name": "Center 4" + }, + { + "tooltip": "", + "name": "Color 4" + }, + { + "tooltip": "", + "name": "Use palette" + }, + { + "tooltip": "", + "name": "Palette" } ] }, - "Node_Array_Sort": { - "name": "Sort Number", + "Node_Fluid_Add_Collider": { "tooltip": "", + "name": "Add Collider", "outputs": [ { - "name": "Sorted array", - "tooltip": "" - }, - { - "name": "Order", - "tooltip": "" + "tooltip": "", + "name": "Fluid Domain" } ], "inputs": [ { - "name": "Sorted array", - "tooltip": "" + "tooltip": "", + "name": "Fluid Domain" }, { - "name": "Order", - "tooltip": "" - } - ] - }, - "Node_Palette_Replace": { - "name": "Palette Replace", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Collider" }, { - "name": "Palette from", - "tooltip": "" - }, - { - "name": "Palette to", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "" - } - ] - }, - "Node_Array_Remove": { - "name": "Array Remove", - "tooltip": "", - "outputs": [ - { - "name": "Array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Array", - "tooltip": "" - }, - { - "name": "Type", - "tooltip": "" - }, - { - "name": "Index", - "tooltip": "" - }, - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Spread array", - "tooltip": "" - } - ] - }, - "Node_Strand_Render": { - "name": "Strand Render", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Thickness", - "tooltip": "" - }, - { - "name": "Thickness over length", - "tooltip": "" - }, - { - "name": "Random color", - "tooltip": "" - }, - { - "name": "Color over length", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Child", - "tooltip": "Render extra strands between the real strands." - } - ] - }, - "Node_Combine_RGB": { - "name": "RGBA Combine", - "tooltip": "Combine 4 image in to one. Each image use to control RGBA channel.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Green", - "tooltip": "" - }, - { - "name": "Blue", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Sampling type", - "tooltip": "" - } - ] - }, - "Node_Path_Wave": { - "name": "Wave Path", - "tooltip": "", - "outputs": [ - { - "name": "Path", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Frequency", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Shift", - "tooltip": "" - }, - { - "name": "Smooth", - "tooltip": "" - } - ] - }, - "Node_De_Corner": { - "name": "De-Corner", - "tooltip": "Attempt to remove single pixel corner from the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Tolerance", - "tooltip": "" - } - ] - }, - "Node_CSV_File_Write": { - "name": "CSV File Out", - "tooltip": "Save array as .csv file.", - "outputs": [], - "inputs": [ - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Content", - "tooltip": "" - } - ] - }, - "Node_Mesh_Transform": { - "name": "Mesh Transform", - "tooltip": "", - "outputs": [ - { - "name": "Mesh", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Mesh", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Anchor", - "tooltip": "" - } - ] - }, - "Node_Flood_Fill": { - "name": "Flood Fill", - "tooltip": "Filled connected pixel given position and color.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Colors", - "tooltip": "" - }, - { - "name": "Threshold", - "tooltip": "" - }, - { - "name": "Diagonal", - "tooltip": "" - } - ] - }, - "Node_Strand_Break": { - "name": "Strand Break", - "tooltip": "", - "outputs": [ - { - "name": "Strand", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Strand", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Range", - "tooltip": "" - }, - { - "name": "Direction", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Chance", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" + "tooltip": "", + "name": "Area" } ] }, "Node_Path_Blend": { - "name": "Blend Path", "tooltip": "Blend between 2 paths.", + "name": "Blend Path", "outputs": [ { - "name": "Path", - "tooltip": "" + "tooltip": "", + "name": "Path" } ], "inputs": [ { - "name": "Path", - "tooltip": "" + "tooltip": "", + "name": "Path 1" }, { - "name": "Path 2", - "tooltip": "" + "tooltip": "", + "name": "Path 2" }, { - "name": "Ratio", - "tooltip": "" + "tooltip": "", + "name": "Ratio" } ] }, - "Node_Lua_Compute": { - "name": "Lua Compute", + "Node_Rigid_Object_Spawner": { "tooltip": "", + "name": "Object Spawner", "outputs": [ { - "name": "Execution thread", - "tooltip": "" - }, - { - "name": "Return value", - "tooltip": "" + "tooltip": "", + "name": "Object" } ], "inputs": [ { - "name": "Execution thread", - "tooltip": "" + "tooltip": "", + "name": "Object" }, { - "name": "Return type", - "tooltip": "" + "tooltip": "", + "name": "Spawn area" }, { - "name": "Lua code", - "tooltip": 14 + "tooltip": "", + "name": "Spawn type" }, { - "name": "Execution thread", - "tooltip": "" + "tooltip": "", + "name": "Spawn delay" }, { - "name": "Execute on frame", - "tooltip": "" + "tooltip": "", + "name": "Spawn amount" }, { - "name": "Argument name", - "tooltip": "" + "tooltip": "", + "name": "Spawn frame" }, { - "name": "Argument type", - "tooltip": "" + "tooltip": "", + "name": "Spawn" }, { - "name": "Argument value", - "tooltip": "" + "tooltip": "", + "name": "Seed" } ] }, - "Node_Noise_Hex": { - "name": "Hexagonal Noise", - "tooltip": "", + "Node_Stack": { + "tooltip": "Place image next to each other linearly, or on top of each other.", + "name": "Stack", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Atlas data" } ], "inputs": [ { - "name": "Dimension", - "tooltip": "" + "tooltip": "", + "name": "Axis" }, { - "name": "Seed", - "tooltip": "" + "tooltip": "", + "name": "Align" }, { - "name": "Position", - "tooltip": "" + "tooltip": "", + "name": "Spacing" }, { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Texture sample", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "" - } - ] - }, - "Node_Blur_Simple": { - "name": "Simple Blur", - "tooltip": "Blur image using simpler algorithm. Allowing for variable blur strength.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Blur mask", - "tooltip": "" - }, - { - "name": "Override color", - "tooltip": "Replace all color while keeping the alpha. Used to\nfix grey outline when bluring transparent pixel." - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Rigid_Variable": { - "name": "Rigidbody Variable", - "tooltip": "", - "outputs": [ - { - "name": "Positions", - "tooltip": "" - }, - { - "name": "Scales", - "tooltip": "" - }, - { - "name": "Rotations", - "tooltip": "" - }, - { - "name": "Blends", - "tooltip": "" - }, - { - "name": "Alpha", - "tooltip": "" - }, - { - "name": "Velocity", - "tooltip": "" - }, - { - "name": "Center of mass", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Positions", - "tooltip": "" - } - ] - }, - "Node_Logic": { - "name": "Logic Opr", - "tooltip": "", - "outputs": [ - { - "name": "Result", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Type", - "tooltip": "" - }, - { - "name": "a", - "tooltip": "" - }, - { - "name": "b", - "tooltip": "" - } - ] - }, - "Node_Glow": { - "name": "Glow", - "tooltip": "Apply glow to the border of the image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Border", - "tooltip": "" - }, - { - "name": "Size", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Wiggler": { - "name": "Wiggler", - "tooltip": "Create smooth random value.", - "outputs": [ - { - "name": "Output", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Output", - "tooltip": "" - }, - { - "name": "Frequency", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Display", - "tooltip": "" - } - ] - }, - "Node_Shape": { - "name": "Shape", - "tooltip": "Draw simple shapes using signed distance field.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Background", - "tooltip": "" - }, - { - "name": "Shape", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Sides", - "tooltip": "" - }, - { - "name": "Inner radius", - "tooltip": "" - }, - { - "name": "Anti alising", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Angle range", - "tooltip": "" - }, - { - "name": "Corner radius", - "tooltip": "" - }, - { - "name": "Shape color", - "tooltip": "" - }, - { - "name": "Background color", - "tooltip": "" - }, - { - "name": "Height", - "tooltip": "" - }, - { - "name": "Start radius", - "tooltip": "" - }, - { - "name": "Shape path", - "tooltip": "" - } - ] - }, - "Node_Tunnel_Out": { - "name": "Tunnel Out", - "tooltip": "Receive value from tunnel in of the same key.", - "outputs": [ - { - "name": "Value out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Value out", - "tooltip": "" - } - ] - }, - "Node_String_Split": { - "name": "Split Text", - "tooltip": "", - "outputs": [ - { - "name": "Text", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Text", - "tooltip": "" - }, - { - "name": "Delimiter", - "tooltip": "Character that used to split text,\nleave blank to create character array." - } - ] - }, - "Node_Transform": { - "name": "Transform", - "tooltip": "Move, rotate, and scale image.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Output dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Anchor", - "tooltip": "" - }, - { - "name": "Relative anchor", - "tooltip": "" - }, - { - "name": "Rotation", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Tile", - "tooltip": "Repeat the surface to fill the screen." - }, - { - "name": "Rotate by velocity", - "tooltip": "Make the surface rotates to follow its movement." - }, - { - "name": "Output dimension type", - "tooltip": "" - }, - { - "name": "Round position", - "tooltip": "Round position to the closest integer value to avoid jittering." - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Grid_Tri": { - "name": "Triangular Grid", - "tooltip": "Generate triangular grid pattern.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Gap", - "tooltip": "" - }, - { - "name": "Angle", - "tooltip": "" - }, - { - "name": "Tile color", - "tooltip": "" - }, - { - "name": "Gap color", - "tooltip": "" - }, - { - "name": "Texture", - "tooltip": "" - }, - { - "name": "Render type", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - } - ] - }, - "Node_Twirl": { - "name": "Twirl", - "tooltip": "Twist the image around a mid point.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Radius", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Iterator_Index": { - "name": "Index", - "tooltip": "", - "outputs": [ - { - "name": "Loop index", - "tooltip": "" - } - ], - "inputs": [] - }, - "Node_VFX_Vortex": { - "name": "Vortex", - "tooltip": "", - "outputs": [ - { - "name": "Particles", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Particles", - "tooltip": "" - }, - { - "name": "Area", - "tooltip": "" - }, - { - "name": "Falloff", - "tooltip": "" - }, - { - "name": "Falloff distance", - "tooltip": "" - }, - { - "name": "Effect Vector", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Rotate particle", - "tooltip": "" - }, - { - "name": "Scale particle", - "tooltip": "" - }, - { - "name": "Attraction force", - "tooltip": "" - }, - { - "name": "Clockwise", - "tooltip": "" - } - ] - }, - "Node_Warp": { - "name": "Warp", - "tooltip": "Warp image by freely moving the corners.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Top left", - "tooltip": "" - }, - { - "name": "Top right", - "tooltip": "" - }, - { - "name": "Bottom left", - "tooltip": "" - }, - { - "name": "Bottom right", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Vector2": { - "name": "Vector2", - "tooltip": "", - "outputs": [ - { - "name": "Vector", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Vector", - "tooltip": "" - }, - { - "name": "y", - "tooltip": "" - }, - { - "name": "Integer", - "tooltip": "" - }, - { - "name": "Display", - "tooltip": "" - }, - { - "name": "Reset to center", - "tooltip": "" - } - ] - }, - "Node_Array_Shuffle": { - "name": "Shuffle Array", - "tooltip": "", - "outputs": [ - { - "name": "Shuffled array", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Shuffled array", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - } - ] - }, - "Node_Websocket_Sender": { - "name": "Websocket Sender", - "tooltip": "Create websocket server to send data to the network.", - "outputs": [], - "inputs": [ - { - "name": "Port", - "tooltip": "" - }, - { - "name": "Data type", - "tooltip": "" - }, - { - "name": "Struct", - "tooltip": "" - }, - { - "name": "Surface", - "tooltip": "" - }, - { - "name": "Path", - "tooltip": "" - }, - { - "name": "Target", - "tooltip": "" - } - ] - }, - "Node_Iterator_Length": { - "name": "Loop amount", - "tooltip": "", - "outputs": [ - { - "name": "Length", - "tooltip": "" - } - ], - "inputs": [] - }, - "Node_Sampler": { - "name": "Sampler", - "tooltip": "Sample color from an image.", - "outputs": [ - { - "name": "Color", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Color", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Sampling size", - "tooltip": "Size of square around the position to sample and average pixel color." - } - ] - }, - "Node_Rigid_Render": { - "name": "Render", - "tooltip": "", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Object", - "tooltip": "" - } - ] - }, - "Node_Blur_Zoom": { - "name": "Zoom Blur", - "tooltip": "Blur image by zooming in\/out from a mid point.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Surface out", - "tooltip": "" - }, - { - "name": "Strength", - "tooltip": "" - }, - { - "name": "Center", - "tooltip": "" - }, - { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." - }, - { - "name": "Zoom mode", - "tooltip": "" - }, - { - "name": "Blur mask", - "tooltip": "" - }, - { - "name": "Mask", - "tooltip": "" - }, - { - "name": "Mix", - "tooltip": "" - }, - { - "name": "Active", - "tooltip": "" - } - ] - }, - "Node_Perlin": { - "name": "Perlin Noise", - "tooltip": "Generate perlin noise.", - "outputs": [ - { - "name": "Surface out", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Dimension", - "tooltip": "" - }, - { - "name": "Position", - "tooltip": "" - }, - { - "name": "Scale", - "tooltip": "" - }, - { - "name": "Iteration", - "tooltip": "" - }, - { - "name": "Tile", - "tooltip": "" - }, - { - "name": "Seed", - "tooltip": "" - }, - { - "name": "Color mode", - "tooltip": "" - }, - { - "name": "Color R range", - "tooltip": "" - }, - { - "name": "Color G range", - "tooltip": "" - }, - { - "name": "Color B range", - "tooltip": "" - } - ] - }, - "Node_Counter": { - "name": "Frame Index", - "tooltip": "Output current frame as frame index, or animation progress (0 - 1).", - "outputs": [ - { - "name": "Value", - "tooltip": "" - } - ], - "inputs": [ - { - "name": "Value", - "tooltip": "" - }, - { - "name": "Speed", - "tooltip": "" - }, - { - "name": "Mode", - "tooltip": "Counting mode\r\n - Frame count: Count value up\/down per frame.\r\n - Animation progress: Count from 0 (first frame) to 1 (last frame). " + "tooltip": "", + "name": "Input" } ] }, "Node_Crop": { - "name": "Crop", "tooltip": "Crop out image to create smaller ones.", + "name": "Crop", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface in" }, { - "name": "Crop", - "tooltip": "" + "tooltip": "", + "name": "Crop" }, { - "name": "Active", - "tooltip": "" + "tooltip": "", + "name": "Active" } ] }, - "Node_Wrap_Area": { - "name": "Area Warp", - "tooltip": "Wrap image to fit area value (x, y, w, h).", + "Node_Grey_Alpha": { + "tooltip": "Convert greyscale to alpha value.", + "name": "Grey to Alpha", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface in" }, { - "name": "Area", - "tooltip": "" + "tooltip": "Replace output with solid color.", + "name": "Replace color" }, { - "name": "Active", - "tooltip": "" + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Active" } ] }, + "Node_Noise": { + "tooltip": "Generate white noise.", + "name": "Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Color mode" + }, + { + "tooltip": "", + "name": "Color R range" + }, + { + "tooltip": "", + "name": "Color G range" + }, + { + "tooltip": "", + "name": "Color B range" + } + ] + }, + "Node_Grid_Noise": { + "tooltip": "", + "name": "Grid Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Texture sample" + }, + { + "tooltip": "", + "name": "Shift axis" + }, + { + "tooltip": "", + "name": "Color mode" + }, + { + "tooltip": "", + "name": "Color R range" + }, + { + "tooltip": "", + "name": "Color G range" + }, + { + "tooltip": "", + "name": "Color B range" + } + ] + }, + "Node_Array_Set": { + "tooltip": "", + "name": "Array Set", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Index" + }, + { + "tooltip": "", + "name": "Value" + } + ] + }, + "Node_Scale": { + "tooltip": "Simple node for scaling image.", + "name": "Scale", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Mode" + }, + { + "tooltip": "", + "name": "Target dimension" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Strand_Gravity": { + "tooltip": "", + "name": "Strand Gravity", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Gravity" + }, + { + "tooltip": "", + "name": "Direction" + } + ] + }, + "Node_Displace": { + "tooltip": "Distort image using another image as a map.", + "name": "Displace", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Displace map" + }, + { + "tooltip": "Vector to displace pixel by.", + "name": "Position" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "Brightness value to be use as a basis for 'no displacement'.", + "name": "Mid value" + }, + { + "tooltip": "Use color data set extra information.\r\n - Ignore: Don't use color data.\r\n - Vector: Use red as X displacement, green as Y displacement.\r\n - Angle: Use red as angle, green as distance.", + "name": "Color data" + }, + { + "tooltip": "If not set, then strength value is multiplied directly to the displacement.\r\nIf set, then strength value control how many times the effect applies on itself.", + "name": "Iterate" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Iterator_Each_Length": { + "tooltip": "", + "name": "Array Length", + "outputs": [ + { + "tooltip": "", + "name": "Length" + } + ], + "inputs": [] + }, + "Node_Fluid_Apply_Velocity": { + "tooltip": "", + "name": "Apply Velocity", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Brush" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Velocity" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Unicode": { + "tooltip": "", + "name": "Unicode", + "outputs": [ + { + "tooltip": "", + "name": "Character" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Unicode" + } + ] + }, + "Node_Average": { + "tooltip": "Average color of every pixels in the image.", + "name": "Average", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Transform": { + "tooltip": "Move, rotate, and scale image.", + "name": "Transform", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Anchor" + }, + { + "tooltip": "", + "name": "Relative anchor" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "Repeat the surface to fill the screen.", + "name": "Tile" + }, + { + "tooltip": "Make the surface rotates to follow its movement.", + "name": "Rotate by velocity" + }, + { + "tooltip": "", + "name": "Output dimension type" + }, + { + "tooltip": "Round position to the closest integer value to avoid jittering.", + "name": "Round position" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_String_Join": { + "tooltip": "", + "name": "Join Text", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text array" + }, + { + "tooltip": "", + "name": "Divider" + } + ] + }, + "Node_Palette_Replace": { + "tooltip": "", + "name": "Palette Replace", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Palette in" + }, + { + "tooltip": "", + "name": "Palette from" + }, + { + "tooltip": "", + "name": "Palette to" + }, + { + "tooltip": "", + "name": "Threshold" + } + ] + }, + "Node_FXAA": { + "tooltip": "", + "name": "FXAA", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + } + ] + }, + "Node_Seperate_Shape": { + "tooltip": "Separate disconnected pixel each into an image in an image array.", + "name": "Separate Shape", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Boundary data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Tolerance" + }, + { + "tooltip": "", + "name": "Override color" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "Skip empty and black shape.", + "name": "Ignore blank" + } + ] + }, + "Node_Crop_Content": { + "tooltip": "Crop out empty pixel pixel from the image.", + "name": "Crop Content", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "Cropping mode for dealing with image array.", + "name": "Array" + }, + { + "tooltip": "Add padding back after crop.", + "name": "Padding" + } + ] + }, + "Node_Pack_Sprites": { + "tooltip": "Combine array of images with different dimension using different algorithms.", + "name": "Pack Sprites", + "outputs": [ + { + "tooltip": "", + "name": "Packed image" + }, + { + "tooltip": "", + "name": "Atlas data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Sprites" + }, + { + "tooltip": "", + "name": "Algorithm" + }, + { + "tooltip": "", + "name": "Max width" + }, + { + "tooltip": "", + "name": "Max height" + }, + { + "tooltip": "", + "name": "Spacing" + } + ] + }, + "Node_Morph_Surface": { + "tooltip": "Morph pixel bewteen two surfaces.", + "name": "Morph Surface", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface from" + }, + { + "tooltip": "", + "name": "Surface to" + }, + { + "tooltip": "", + "name": "Morph amount" + }, + { + "tooltip": "", + "name": "Threshold" + } + ] + }, + "Node_Level_Selector": { + "tooltip": "Isolate part of the image that falls in the selected brightness range.", + "name": "Level Selector", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Mid point" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Feedback_Input": { + "tooltip": "", + "name": "Input", + "outputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Feedback loop" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Display type" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Input type" + }, + { + "tooltip": "", + "name": "Enum label" + }, + { + "tooltip": "", + "name": "Vector size" + }, + { + "tooltip": "", + "name": "Order" + }, + { + "tooltip": "", + "name": "Display preview gizmo" + }, + { + "tooltip": "", + "name": "Step" + } + ] + }, + "Node_Atlas_Draw": { + "tooltip": "Render image atlas to a surface.", + "name": "Draw Atlas", + "outputs": [ + { + "tooltip": "", + "name": "Surface" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Atlas" + } + ] + }, + "Node_Fluid_Render": { + "tooltip": "", + "name": "Render Domain", + "outputs": [ + { + "tooltip": "", + "name": "Fluid" + }, + { + "tooltip": "", + "name": "Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Interpolate" + }, + { + "tooltip": "", + "name": "Draw Domain" + } + ] + }, + "Node_WAV_File_Write": { + "tooltip": "Save wav audio file.", + "name": "WAV File Out", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Audio Data" + }, + { + "tooltip": "", + "name": "Sample" + }, + { + "tooltip": "", + "name": "Bit Depth" + }, + { + "tooltip": "", + "name": "Remap Data" + }, + { + "tooltip": "", + "name": "Data Range" + } + ] + }, + "Node_Corner": { + "tooltip": "Round out sharp corner of the image.", + "name": "Corner", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Anim_Curve": { + "tooltip": "Evaluate value from an animation curve.", + "name": "Evaluate Curve", + "outputs": [ + { + "tooltip": "", + "name": "Curve" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Curve" + }, + { + "tooltip": "", + "name": "Progress" + }, + { + "tooltip": "", + "name": "Minimum" + }, + { + "tooltip": "", + "name": "Maximum" + } + ] + }, + "Node_HSV_Channel": { + "tooltip": "Extract HSVA channel on an image, each channel becomes its own image.", + "name": "HSV Extract", + "outputs": [ + { + "tooltip": "", + "name": "Hue" + }, + { + "tooltip": "", + "name": "Saturation" + }, + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Alpha" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + } + ] + }, + "Node_Pixel_Sort": { + "tooltip": "Sort pixel by brightness in horizontal, or vertial axis.", + "name": "Pixel Sort", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Iteration" + }, + { + "tooltip": "", + "name": "Threshold" + }, + { + "tooltip": "", + "name": "Direction" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Array_Shift": { + "tooltip": "", + "name": "Array Shift", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Shift" + } + ] + }, + "Node_Blur_Contrast": { + "tooltip": "Blur only pixel of a similiar color.", + "name": "Contrast Blur", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "Brightness different to be blur together.", + "name": "Threshold" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Pixel_Cloud": { + "tooltip": "Displace each pixel of the image randomly.", + "name": "Pixel Cloud", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Strength map" + }, + { + "tooltip": "", + "name": "Color over lifetime" + }, + { + "tooltip": "", + "name": "Distance" + }, + { + "tooltip": "", + "name": "Alpha over lifetime" + }, + { + "tooltip": "", + "name": "Random blending" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_VFX_Group": { + "tooltip": "Create VFX group, which generate particles that can be manipulated using different force nodes.", + "name": "VFX", + "outputs": [], + "inputs": [] + }, "Node_Blur_Directional": { - "name": "Directional Blur", "tooltip": "Blur image given a direction.", + "name": "Directional Blur", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface in" }, { - "name": "Strength", - "tooltip": "" + "tooltip": "", + "name": "Strength" }, { - "name": "Direction", - "tooltip": "" + "tooltip": "", + "name": "Direction" }, { - "name": "Mask", - "tooltip": "" + "tooltip": "", + "name": "Mask" }, { - "name": "Mix", - "tooltip": "" + "tooltip": "", + "name": "Mix" }, { - "name": "Active", - "tooltip": "" + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Iterator_Sort_Input": { + "tooltip": "", + "name": "Sort Input", + "outputs": [ + { + "tooltip": "", + "name": "Value in" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Value in" + } + ] + }, + "Node_Scatter_Points": { + "tooltip": "Generate array of vector 2 points for scattering.", + "name": "Scatter Points", + "outputs": [ + { + "tooltip": "", + "name": "Points" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Point area" + }, + { + "tooltip": "", + "name": "Point distribution" + }, + { + "tooltip": "", + "name": "Scatter" + }, + { + "tooltip": "Amount of particle spawn in that frame.", + "name": "Point amount" + }, + { + "tooltip": "", + "name": "Distribution map" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "Fix point position, and only select point in the area.", + "name": "Fixed position" + }, + { + "tooltip": "", + "name": "Reference dimension" + } + ] + }, + "Node_Strand_Length_Adjust": { + "tooltip": "", + "name": "Strand Length Adjust", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Direction" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Strength" + } + ] + }, + "Node_Strand_Break": { + "tooltip": "", + "name": "Strand Break", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Direction" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Chance" + }, + { + "tooltip": "", + "name": "Seed" + } + ] + }, + "Node_Vector_Dot": { + "tooltip": "", + "name": "Dot product", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Point 1" + }, + { + "tooltip": "", + "name": "Point 2" + } + ] + }, + "Node_Trigger_Bool": { + "tooltip": "", + "name": "Boolean Trigger", + "outputs": [ + { + "tooltip": "", + "name": "Trigger" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Boolean" + }, + { + "tooltip": "", + "name": "Trigger condition" + } + ] + }, + "Node_Blur": { + "tooltip": "Blur image smoothly.", + "name": "Blur", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "Replace all color while keeping the alpha. Used to\nfix grey outline when bluring transparent pixel.", + "name": "Override color" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Posterize": { + "tooltip": "Reduce and remap color to match a palette.", + "name": "Posterize", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Palette" + }, + { + "tooltip": "", + "name": "Use palette" + }, + { + "tooltip": "", + "name": "Colors" + }, + { + "tooltip": "", + "name": "Gamma" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Iterator_Length": { + "tooltip": "", + "name": "Loop amount", + "outputs": [ + { + "tooltip": "", + "name": "Length" + } + ], + "inputs": [] + }, + "Node_Polar": { + "tooltip": "Convert image to polar coordinate.", + "name": "Polar", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Invert": { + "tooltip": "Invert color.", + "name": "Invert", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_3D_Cube": { + "tooltip": "", + "name": "3D Cube", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Main texture" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Textures per face" + }, + { + "tooltip": "", + "name": "Textures 0" + }, + { + "tooltip": "", + "name": "Textures 1" + }, + { + "tooltip": "", + "name": "Textures 2" + }, + { + "tooltip": "", + "name": "Textures 3" + }, + { + "tooltip": "", + "name": "Textures 4" + }, + { + "tooltip": "", + "name": "Textures 5" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Strand_Create": { + "tooltip": "", + "name": "Strand Create", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "How many strands to generate.", + "name": "Density" + }, + { + "tooltip": "", + "name": "Length" + }, + { + "tooltip": "", + "name": "Segment" + }, + { + "tooltip": "Length preservation, the higher the value the easier it is to stretch each segment.", + "name": "Elasticity" + }, + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Side" + }, + { + "tooltip": "Angular stiffness, the higher the value the easier it is to bend each segment.", + "name": "Spring" + }, + { + "tooltip": "The ability to keep its original shape.", + "name": "Structure" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Curl frequency" + }, + { + "tooltip": "", + "name": "Curliness" + }, + { + "tooltip": "", + "name": "Mesh" + }, + { + "tooltip": "", + "name": "Distribution" + }, + { + "tooltip": "Prevent strand reseting to apply manual modification. Unbaking will remove all changes.", + "name": "Bake hair" + }, + { + "tooltip": "", + "name": "View fix hair" + }, + { + "tooltip": "The force required to break strand from its root. Set to -1 to make strand infinitely strong.", + "name": "Root strength" + } + ] + }, + "Node_WAV_File_Read": { + "tooltip": "Load wav audio file.", + "name": "WAV File In", + "outputs": [ + { + "tooltip": "", + "name": "Data" + }, + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Sample rate" + }, + { + "tooltip": "", + "name": "Channels" + }, + { + "tooltip": "", + "name": "Duration (s)" + }, + { + "tooltip": "", + "name": "Loudness" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Sync lenght" + } + ] + }, + "Node_Path_Array": { + "tooltip": "", + "name": "Path Array", + "outputs": [ + { + "tooltip": "", + "name": "Path array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + } + ] + }, + "Node_Find_Pixel": { + "tooltip": "Get the position of the first pixel with a given color.", + "name": "Find pixel", + "outputs": [ + { + "tooltip": "", + "name": "Position" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Search color" + } + ] + }, + "Node_String_Length": { + "tooltip": "", + "name": "Text Length", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + }, + { + "tooltip": "", + "name": "Mode" + } + ] + }, + "Node_Blur_Bokeh": { + "tooltip": "Create bokeh effect. Blur lighter color in a lens-like manner.", + "name": "Lens Blur", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Color": { + "tooltip": "", + "name": "Color", + "outputs": [ + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Color" + } + ] + }, + "Node_Cellular": { + "tooltip": "Generate voronoi pattern.", + "name": "Cellular Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Contrast" + }, + { + "tooltip": "", + "name": "Pattern" + }, + { + "tooltip": "", + "name": "Middle" + }, + { + "tooltip": "", + "name": "Radial scale" + }, + { + "tooltip": "", + "name": "Radial shatter" + }, + { + "tooltip": "", + "name": "Colored" + } + ] + }, + "Node_Path_Map_Area": { + "tooltip": "Scale path to fit a given area.", + "name": "Remap Path", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Area" + } + ] + }, + "Node_Iterator_Sort_Output": { + "tooltip": "", + "name": "Sort Output", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Result" + } + ] + }, + "Node_Vector_Split": { + "tooltip": "", + "name": "Vector Split", + "outputs": [ + { + "tooltip": "", + "name": "x" + }, + { + "tooltip": "", + "name": "y" + }, + { + "tooltip": "", + "name": "z" + }, + { + "tooltip": "", + "name": "w" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Vector" + } + ] + }, + "Node_Audio_Window": { + "tooltip": "Take a slice of an audio array based on the current frame.", + "name": "Audio Window", + "outputs": [ + { + "tooltip": "", + "name": "Windowed Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Audio Array" + }, + { + "tooltip": "", + "name": "Sample" + }, + { + "tooltip": "", + "name": "Size" + } + ] + }, + "Node_Bloom": { + "tooltip": "Apply bloom effect, bluring and brighten the bright part of the image.", + "name": "Bloom", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Bloom blur radius.", + "name": "Size" + }, + { + "tooltip": "How bright a pixel should be to start blooming.", + "name": "Tolerance" + }, + { + "tooltip": "Blend intensity.", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Bloom mask" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Color_Mix": { + "tooltip": "", + "name": "Mix Color", + "outputs": [ + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Color from" + }, + { + "tooltip": "", + "name": "Color to" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Mode" + } + ] + }, + "Node_Path_L_System": { + "tooltip": "", + "name": "L system", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Length" + }, + { + "tooltip": "", + "name": "Angle" + }, + { + "tooltip": "", + "name": "Starting position" + }, + { + "tooltip": "", + "name": "Iteration" + }, + { + "tooltip": 37, + "name": "Starting rule" + }, + { + "tooltip": "Replace symbol of the last generated rule, for example a=F to replace all a with F. Use comma to separate different replacements.", + "name": "End replacement" + }, + { + "tooltip": "", + "name": "Starting angle" + }, + { + "tooltip": "", + "name": "Name 0" + }, + { + "tooltip": "", + "name": "Rule 0" + } + ] + }, + "Node_Fluid_Add": { + "tooltip": "", + "name": "Add Fluid", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Fluid brush" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Inherit velocity" + }, + { + "tooltip": "", + "name": "Density" + } + ] + }, + "Node_VFX_Spawner": { + "tooltip": "", + "name": "Spawner", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "On create" + }, + { + "tooltip": "", + "name": "On step" + }, + { + "tooltip": "", + "name": "On destroy" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particle sprite" + }, + { + "tooltip": "Frames delay between each particle spawn.", + "name": "Spawn delay" + }, + { + "tooltip": "Amount of particle spawn in that frame.", + "name": "Spawn amount" + }, + { + "tooltip": "", + "name": "Spawn area" + }, + { + "tooltip": "", + "name": "Spawn distribution" + }, + { + "tooltip": "", + "name": "Lifespan" + }, + { + "tooltip": "", + "name": "Spawn direction" + }, + { + "tooltip": "", + "name": "Acceleration" + }, + { + "tooltip": "", + "name": "Orientation" + }, + { + "tooltip": "", + "name": "Rotational speed" + }, + { + "tooltip": "", + "name": "Spawn scale" + }, + { + "tooltip": "", + "name": "Scale over time" + }, + { + "tooltip": "", + "name": "Color over lifetime" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Alpha over time" + }, + { + "tooltip": "Make the particle rotates to follow its movement.", + "name": "Rotate by direction" + }, + { + "tooltip": "", + "name": "Spawn type" + }, + { + "tooltip": "", + "name": "Spawn size" + }, + { + "tooltip": "", + "name": "Spawn velocity" + }, + { + "tooltip": "", + "name": "Gravity" + }, + { + "tooltip": "", + "name": "Wiggle" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "Whether to select image from an array in order, at random, or treat array as animation.", + "name": "Surface array" + }, + { + "tooltip": "", + "name": "Animation speed" + }, + { + "tooltip": "", + "name": "Scatter" + }, + { + "tooltip": "", + "name": "Boundary data" + }, + { + "tooltip": "", + "name": "On animation end" + }, + { + "tooltip": "", + "name": "Spawn" + }, + { + "tooltip": "", + "name": "Random blend" + }, + { + "tooltip": "Make particle move away from the spawn center.", + "name": "Directed from center" + }, + { + "tooltip": "", + "name": "Distribution map" + }, + { + "tooltip": "", + "name": "Distribution data" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Gravity direction" + }, + { + "tooltip": "", + "name": "Turning" + }, + { + "tooltip": "Apply randomized 1, -1 multiplier to the turning speed.", + "name": "Turn both directions" + }, + { + "tooltip": "", + "name": "Turn scale with speed" + }, + { + "tooltip": "", + "name": "Spawn trigger" + }, + { + "tooltip": "How often the 'on step' event is triggered.\nWith 1 being trigger every frame, 2 means triggered once every 2 frames.", + "name": "Step interval" + } + ] + }, + "Node_Path_Anchor": { + "tooltip": "", + "name": "Path Anchor", + "outputs": [ + { + "tooltip": "", + "name": "Anchor" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Postion" + }, + { + "tooltip": "", + "name": "Control point 1" + }, + { + "tooltip": "", + "name": "Control point 2" + }, + { + "tooltip": "", + "name": "Mirror control point" + } + ] + }, + "Node_Image_Sequence": { + "tooltip": "Load multiple images from your computer as array.", + "name": "Image Array", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Paths" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Padding" + }, + { + "tooltip": "", + "name": "Canvas size" + }, + { + "tooltip": "", + "name": "Sizing method" + } + ] + }, + "Node_Json_File_Read": { + "tooltip": "Load .json file using keys.", + "name": "JSON File In", + "outputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Struct" + }, + { + "tooltip": "", + "name": "Values" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Key" + } + ] + }, + "Node_Iterator_Each_Output": { + "tooltip": "", + "name": "Output", + "outputs": [ + { + "tooltip": "", + "name": "Preview" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Value out" + } + ] + }, + "Node_3D_Sphere": { + "tooltip": "", + "name": "3D Sphere", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "Amount of polygon in X and Y axis.", + "name": "Subdivisions" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Textures" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Vector_Cross_3D": { + "tooltip": "", + "name": "Cross product 3D", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Point 1" + }, + { + "tooltip": "", + "name": "Point 2" + } + ] + }, + "Node_Color_Data": { + "tooltip": "Get data (rgb, hsv, brightness) from color.", + "name": "Color Data", + "outputs": [ + { + "tooltip": "", + "name": "Red" + }, + { + "tooltip": "", + "name": "Green" + }, + { + "tooltip": "", + "name": "Blue" + }, + { + "tooltip": "", + "name": "Hue" + }, + { + "tooltip": "", + "name": "Saturation" + }, + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Brightness" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Normalize" + } + ] + }, + "Node_Array_Zip": { + "tooltip": "", + "name": "Array Zip", + "outputs": [ + { + "tooltip": "", + "name": "Output" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Value" + } + ] + }, + "Node_Strand_Collision": { + "tooltip": "", + "name": "Strand Collision", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Collision mesh" } ] }, "Node_Threshold": { - "name": "Threshold", "tooltip": "Set a threshold where pixel darker will becomes black, and brighter to white. Also works with alpha.", + "name": "Threshold", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface in" }, { - "name": "Mode", - "tooltip": "" + "tooltip": "", + "name": "Mode" }, { - "name": "Threshold", - "tooltip": "" + "tooltip": "", + "name": "Threshold" }, { - "name": "Smoothness", - "tooltip": "" + "tooltip": "", + "name": "Smoothness" }, { - "name": "Mask", - "tooltip": "" + "tooltip": "", + "name": "Mask" }, { - "name": "Mix", - "tooltip": "" + "tooltip": "", + "name": "Mix" }, { - "name": "Active", - "tooltip": "" + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_3D_Cone": { + "tooltip": "", + "name": "3D Cone", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Sides" + }, + { + "tooltip": "", + "name": "Textures base" + }, + { + "tooltip": "", + "name": "Textures side" + }, + { + "tooltip": "", + "name": "Scale view with dimension" } ] }, "Node_Outline": { - "name": "Outline", "tooltip": "Add border to the image.", + "name": "Outline", "outputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface out" }, { - "name": "Outline", - "tooltip": "" + "tooltip": "", + "name": "Outline" } ], "inputs": [ { - "name": "Surface out", - "tooltip": "" + "tooltip": "", + "name": "Surface in" }, { - "name": "Width", - "tooltip": "" + "tooltip": "", + "name": "Width" }, { - "name": "Color", - "tooltip": "" + "tooltip": "", + "name": "Color" }, { - "name": "Blend", - "tooltip": "Blend outline color with the original color." + "tooltip": "Blend outline color with the original color.", + "name": "Blend" }, { - "name": "Blend alpha", - "tooltip": "" + "tooltip": "", + "name": "Blend alpha" }, { - "name": "Position", - "tooltip": "" + "tooltip": "", + "name": "Position" }, { - "name": "Anti alising", - "tooltip": "" + "tooltip": "", + "name": "Anti alising" }, { - "name": "Oversample mode", - "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture." + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" }, { - "name": "Start", - "tooltip": "Shift outline inside, outside the shape." + "tooltip": "Shift outline inside, outside the shape.", + "name": "Start" }, { - "name": "Mask", - "tooltip": "" + "tooltip": "", + "name": "Mask" }, { - "name": "Mix", - "tooltip": "" + "tooltip": "", + "name": "Mix" }, { - "name": "Active", - "tooltip": "" + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Image_Sheet": { + "tooltip": "Cut up spritesheet into animation or image array.", + "name": "Splice Spritesheet", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Atlas Data" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Sprite size" + }, + { + "tooltip": "", + "name": "Row" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Offset" + }, + { + "tooltip": "", + "name": "Spacing" + }, + { + "tooltip": "", + "name": "Padding" + }, + { + "tooltip": "", + "name": "Output" + }, + { + "tooltip": "", + "name": "Animation speed" + }, + { + "tooltip": "", + "name": "Orientation" + }, + { + "tooltip": "Automatically set amount based on sprite size.", + "name": "Auto fill" + }, + { + "tooltip": "", + "name": "Sync animation" + }, + { + "tooltip": "", + "name": "Filter empty output" + }, + { + "tooltip": "", + "name": "Filtered Pixel" + }, + { + "tooltip": "", + "name": "Filtered Color" + } + ] + }, + "Node_Fluid_Turbulence": { + "tooltip": "", + "name": "Turbulence", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Effect area" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Mode" + } + ] + }, + "Node_Iterator_Filter_Output": { + "tooltip": "", + "name": "Output", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Result" + } + ] + }, + "Node_ASE_File_Read": { + "tooltip": "Load Aseprite file with support for layers, tags.", + "name": "ASE File In", + "outputs": [ + { + "tooltip": "", + "name": "Output" + }, + { + "tooltip": "", + "name": "Content" + }, + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Palette" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Generate layers" + }, + { + "tooltip": "", + "name": "Current tag" + } + ] + }, + "Node_Gradient_Replace_Color": { + "tooltip": "", + "name": "Gradient Replace", + "outputs": [ + { + "tooltip": "", + "name": "Gradient" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Gradient" + }, + { + "tooltip": "", + "name": "Color from" + }, + { + "tooltip": "", + "name": "Color to" + }, + { + "tooltip": "", + "name": "Threshold" + } + ] + }, + "Node_Array_Reverse": { + "tooltip": "", + "name": "Array Reverse", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + } + ] + }, + "Node_Chromatic_Aberration": { + "tooltip": "Apply chromatic aberration effect to the image.", + "name": "Chromatic Aberration", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Path_Builder": { + "tooltip": "Create path from array of vec2 points.", + "name": "Path Builder", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Point array" + }, + { + "tooltip": "If set to true, will draw a single path from one point to another. If not set will treat each pair of points as an individual line.", + "name": "Connected" + } + ] + }, + "Node_Canvas": { + "tooltip": "Draw on surface using brush, eraser, etc.", + "name": "Canvas", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Preview" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Brush size" + }, + { + "tooltip": "", + "name": "Fill threshold" + }, + { + "tooltip": "", + "name": "Fill type" + }, + { + "tooltip": "", + "name": "Draw preview overlay" + }, + { + "tooltip": "", + "name": "Brush" + }, + { + "tooltip": "", + "name": "Surface amount" + }, + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Background alpha" + }, + { + "tooltip": "", + "name": "Render background" + } + ] + }, + "Node_Noise_Simplex": { + "tooltip": "Generate simplex noise, similiar to perlin noise with better fidelity but non-tilable.", + "name": "Simplex Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Iteration" + }, + { + "tooltip": "", + "name": "Color mode" + }, + { + "tooltip": "", + "name": "Color R range" + }, + { + "tooltip": "", + "name": "Color G range" + }, + { + "tooltip": "", + "name": "Color B range" + } + ] + }, + "Node_VFX_Repel": { + "tooltip": "", + "name": "Repel", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Falloff distance" + }, + { + "tooltip": "", + "name": "Effect Vector" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Rotate particle" + }, + { + "tooltip": "", + "name": "Scale particle" + } + ] + }, + "Node_Condition": { + "tooltip": "Given a condition, output one value if true, another value is false.", + "name": "Condition", + "outputs": [ + { + "tooltip": "", + "name": "Result" + }, + { + "tooltip": "", + "name": "Bool" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Check value" + }, + { + "tooltip": "", + "name": "Condition" + }, + { + "tooltip": "", + "name": "Compare to" + }, + { + "tooltip": "", + "name": "True" + }, + { + "tooltip": "", + "name": "False" + }, + { + "tooltip": "", + "name": "Eval mode" + }, + { + "tooltip": "", + "name": "Boolean" + }, + { + "tooltip": "", + "name": "Text 1" + }, + { + "tooltip": "", + "name": "Text 2" + } + ] + }, + "Node_Array_Get": { + "tooltip": "", + "name": "Array Get", + "outputs": [ + { + "tooltip": "", + "name": "Value" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Index" + }, + { + "tooltip": "", + "name": "Overflow" + } + ] + }, + "Node_Glow": { + "tooltip": "Apply glow to the border of the image.", + "name": "Glow", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Border" + }, + { + "tooltip": "", + "name": "Size" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Plot_Linear": { + "tooltip": "Plot graph or bar chart from array of number.", + "name": "Bar \/ Graph", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Data" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Sample frequency" + }, + { + "tooltip": "", + "name": "Origin" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Base Color" + }, + { + "tooltip": "", + "name": "Graph Thickness" + }, + { + "tooltip": "", + "name": "Use Background" + }, + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Direction" + }, + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "Value Offset" + }, + { + "tooltip": "", + "name": "Color Over Sample" + }, + { + "tooltip": "", + "name": "Trim mode" + }, + { + "tooltip": "", + "name": "Window Size" + }, + { + "tooltip": "", + "name": "Window Offset" + }, + { + "tooltip": "", + "name": "Spacing" + }, + { + "tooltip": "", + "name": "Bar Width" + }, + { + "tooltip": "", + "name": "Rounded Bar" + }, + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Flip Value" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "", + "name": "Smooth" + } + ] + }, + "Node_Shape": { + "tooltip": "Draw simple shapes using signed distance field.", + "name": "Shape", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Sides" + }, + { + "tooltip": "", + "name": "Inner radius" + }, + { + "tooltip": "", + "name": "Anti alising" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Angle range" + }, + { + "tooltip": "", + "name": "Corner radius" + }, + { + "tooltip": "", + "name": "Shape color" + }, + { + "tooltip": "", + "name": "Background color" + }, + { + "tooltip": "", + "name": "Height" + }, + { + "tooltip": "", + "name": "Start radius" + }, + { + "tooltip": "", + "name": "Shape path" + } + ] + }, + "Node_Mesh_Create_Path": { + "tooltip": "Create mesh from path.", + "name": "Path to Mesh", + "outputs": [ + { + "tooltip": "", + "name": "Mesh" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Sample" + }, + { + "tooltip": "", + "name": "Algorithm" + } + ] + }, + "Node_Color_Remove": { + "tooltip": "Remove color that match a palette.", + "name": "Remove Color", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Colors" + }, + { + "tooltip": "", + "name": "Threshold" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "Keep the selected colors and remove the rest.", + "name": "Invert" + } + ] + }, + "Node_Shape_Polygon": { + "tooltip": "Draw simple shapes using triangles.", + "name": "Polygon Shape", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Mesh" + }, + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Background color" + }, + { + "tooltip": "", + "name": "Shape color" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Sides" + }, + { + "tooltip": "", + "name": "Inner radius" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "", + "name": "Teeth" + }, + { + "tooltip": "", + "name": "Teeth height" + }, + { + "tooltip": "", + "name": "Teeth taper" + }, + { + "tooltip": "", + "name": "Angle range" + }, + { + "tooltip": "", + "name": "Round cap" + }, + { + "tooltip": "", + "name": "Mesh" + } + ] + }, + "Node_VFX_Renderer": { + "tooltip": "", + "name": "Renderer", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Output dimension" + }, + { + "tooltip": "Round position to the closest integer value to avoid jittering.", + "name": "Round position" + }, + { + "tooltip": "", + "name": "Blend mode" + }, + { + "tooltip": "", + "name": "Particles" + } + ] + }, + "Node_Flood_Fill": { + "tooltip": "Filled connected pixel given position and color.", + "name": "Flood Fill", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Colors" + }, + { + "tooltip": "", + "name": "Threshold" + }, + { + "tooltip": "", + "name": "Diagonal" + } + ] + }, + "Node_Twirl": { + "tooltip": "Twist the image around a mid point.", + "name": "Twirl", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.", + "name": "Oversample mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_String_Merge": { + "tooltip": "", + "name": "Combine Text", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text A" + }, + { + "tooltip": "", + "name": "Text B" + } + ] + }, + "Node_VFX_Vortex": { + "tooltip": "", + "name": "Vortex", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Falloff distance" + }, + { + "tooltip": "", + "name": "Effect Vector" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Rotate particle" + }, + { + "tooltip": "", + "name": "Scale particle" + }, + { + "tooltip": "", + "name": "Attraction force" + }, + { + "tooltip": "", + "name": "Clockwise" + } + ] + }, + "Node_Iterator_Filter_Input": { + "tooltip": "", + "name": "Input", + "outputs": [ + { + "tooltip": "", + "name": "Value in" + } + ], + "inputs": [] + }, + "Node_Noise_Tri": { + "tooltip": "", + "name": "Triangular Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Texture sample" + }, + { + "tooltip": "", + "name": "Oversample mode" + } + ] + }, + "Node_Gradient_Extract": { + "tooltip": "Get palatte and array of key positions from gradient.", + "name": "Gradient Data", + "outputs": [ + { + "tooltip": "", + "name": "Colors" + }, + { + "tooltip": "", + "name": "Positions" + }, + { + "tooltip": "", + "name": "Type" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Gradient" + } + ] + }, + "Node_CSV_File_Write": { + "tooltip": "Save array as .csv file.", + "name": "CSV File Out", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Content" + } + ] + }, + "Node_Path_Transform": { + "tooltip": "", + "name": "Transform Path", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Anchor" + } + ] + }, + "Node_Equation": { + "tooltip": "Evaluate string of equation. With an option for setting variables.", + "name": "Equation", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Equation" + }, + { + "tooltip": "", + "name": "Argument name" + }, + { + "tooltip": "", + "name": "Argument value" + } + ] + }, + "Node_Group_Output": { + "tooltip": "", + "name": "Output", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Value" + }, + { + "tooltip": "", + "name": "Order" + } + ] + }, + "Node_String": { + "tooltip": "", + "name": "Text", + "outputs": [ + { + "tooltip": "", + "name": "Text" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Text" + } + ] + }, + "Node_Sampler": { + "tooltip": "Sample color from an image.", + "name": "Sampler", + "outputs": [ + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "Size of square around the position to sample and average pixel color.", + "name": "Sampling size" + } + ] + }, + "Node_Zigzag": { + "tooltip": "Generate zigzag pattern.", + "name": "Zigzag", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Amount" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Color 1" + }, + { + "tooltip": "", + "name": "Color 2" + }, + { + "tooltip": "", + "name": "Smooth" + } + ] + }, + "Node_Vector4": { + "tooltip": "", + "name": "Vector4", + "outputs": [ + { + "tooltip": "", + "name": "Vector" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "x" + }, + { + "tooltip": "", + "name": "y" + }, + { + "tooltip": "", + "name": "z" + }, + { + "tooltip": "", + "name": "w" + }, + { + "tooltip": "", + "name": "Integer" + } + ] + }, + "Node_Animation_Control": { + "tooltip": "Control animation state with triggers.", + "name": "Animation Control", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Toggle Play \/ Pause" + }, + { + "tooltip": "", + "name": "Pause" + }, + { + "tooltip": "", + "name": "Resume" + }, + { + "tooltip": "", + "name": "Play From Beginning" + }, + { + "tooltip": "", + "name": "Play once" + }, + { + "tooltip": "", + "name": "Skip Frames" + }, + { + "tooltip": "", + "name": "Skip Frames Count" + } + ] + }, + "Node_Strand_Render_Texture": { + "tooltip": "", + "name": "Strand Render Texture", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Thickness" + }, + { + "tooltip": "", + "name": "Random color" + }, + { + "tooltip": "", + "name": "Texture" + }, + { + "tooltip": "", + "name": "Seed" + } + ] + }, + "Node_Line": { + "tooltip": "Draw line on an image. Connect path data to it to draw line from path.", + "name": "Line", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Background" + }, + { + "tooltip": "", + "name": "Segment" + }, + { + "tooltip": "", + "name": "Width" + }, + { + "tooltip": "", + "name": "Wiggle" + }, + { + "tooltip": "", + "name": "Random seed" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "Draw line along path.", + "name": "Path" + }, + { + "tooltip": "Range of the path to draw.", + "name": "Range" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Color over length" + }, + { + "tooltip": "", + "name": "Width over length" + }, + { + "tooltip": "Apply the full 'width over length' to the trimmed path.", + "name": "Span width over path" + }, + { + "tooltip": "", + "name": "Round cap" + }, + { + "tooltip": "", + "name": "Round segment" + }, + { + "tooltip": "Apply the full 'color over length' to the trimmed path.", + "name": "Span color over path" + }, + { + "tooltip": "", + "name": "Greyscale over width" + }, + { + "tooltip": "Render pixel perfect 1px line.", + "name": "1px mode" + }, + { + "tooltip": "", + "name": "Texture" + }, + { + "tooltip": "Fix length of each segment instead of segment count.", + "name": "Fix length" + }, + { + "tooltip": "", + "name": "Segment length" + }, + { + "tooltip": "", + "name": "Texture position" + }, + { + "tooltip": "", + "name": "Texture rotation" + }, + { + "tooltip": "", + "name": "Texture scale" + } + ] + }, + "Node_Noise_Hex": { + "tooltip": "", + "name": "Hexagonal Noise", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Scale" + }, + { + "tooltip": "", + "name": "Texture sample" + }, + { + "tooltip": "", + "name": "Oversample mode" + } + ] + }, + "Node_Solid": { + "tooltip": "Create image of a single color.", + "name": "Solid", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Empty" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Use mask dimension" + } + ] + }, + "Node_Wrap_Area": { + "tooltip": "Wrap image to fit area value (x, y, w, h).", + "name": "Area Warp", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_RGB_Channel": { + "tooltip": "Extract RGBA channel on an image, each channel becomes its own image.", + "name": "RGBA Extract", + "outputs": [ + { + "tooltip": "", + "name": "Red" + }, + { + "tooltip": "", + "name": "Green" + }, + { + "tooltip": "", + "name": "Blue" + }, + { + "tooltip": "", + "name": "Alpha" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Output type" + } + ] + }, + "Node_Fluid_Vortex": { + "tooltip": "", + "name": "Vortex", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Radius" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Attraction" + }, + { + "tooltip": "", + "name": "Mode" + } + ] + }, + "Node_Fluid_Update": { + "tooltip": "", + "name": "Update Domain", + "outputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Fluid Domain" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Group": { + "tooltip": "", + "name": "Group", + "outputs": [], + "inputs": [] + }, + "Node_Palette_Sort": { + "tooltip": "", + "name": "Sort Palette", + "outputs": [ + { + "tooltip": "", + "name": "Sorted palette" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Palette in" + }, + { + "tooltip": "", + "name": "Order" + }, + { + "tooltip": "", + "name": "Reverse" + } + ] + }, + "Node_Pin": { + "tooltip": "Craete pin to organize your connection. Can be create by double clicking on a connection line.", + "name": "Pin", + "outputs": [ + { + "tooltip": "", + "name": "Out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "In" } ] }, "Node_String_Regex_Match": { - "name": "RegEx Match", "tooltip": "", + "name": "RegEx Match", "outputs": [ { - "name": "Results", - "tooltip": "" + "tooltip": "", + "name": "Results" } ], "inputs": [ { - "name": "Results", - "tooltip": "" + "tooltip": "", + "name": "Text" }, { - "name": "Regex", - "tooltip": "" + "tooltip": "", + "name": "Regex" + } + ] + }, + "Node_Cache_Array": { + "tooltip": "Store current animation as array. Cache persisted between save.", + "name": "Cache Array", + "outputs": [ + { + "tooltip": "", + "name": "Cache array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "Frame index to start caching, set to -1 to start at the first frame.", + "name": "Start frame" + }, + { + "tooltip": "Frame index to stop caching (inclusive), set to -1 to stop at the last frame.", + "name": "Stop frame" + }, + { + "tooltip": "Cache every N frames, set to 1 to cache every frame.", + "name": "Step" + } + ] + }, + "Node_Json_File_Write": { + "tooltip": "Save data to .json file.", + "name": "JSON File Out", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Struct" + }, + { + "tooltip": "", + "name": "Key" + }, + { + "tooltip": "", + "name": "value" + } + ] + }, + "Node_Struct": { + "tooltip": "", + "name": "Struct", + "outputs": [ + { + "tooltip": "", + "name": "Struct" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Key" + }, + { + "tooltip": "", + "name": "value" + } + ] + }, + "Node_Path_Shift": { + "tooltip": "Move path along its normal.", + "name": "Shift Path", + "outputs": [ + { + "tooltip": "", + "name": "Path" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Distance" + } + ] + }, + "Node_Boolean": { + "tooltip": "", + "name": "Boolean", + "outputs": [ + { + "tooltip": "", + "name": "Boolean" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Value" + } + ] + }, + "Node_Websocket_Sender": { + "tooltip": "Create websocket server to send data to the network.", + "name": "Websocket Sender", + "outputs": [], + "inputs": [ + { + "tooltip": "", + "name": "Port" + }, + { + "tooltip": "", + "name": "Data type" + }, + { + "tooltip": "", + "name": "Struct" + }, + { + "tooltip": "", + "name": "Surface" + }, + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Target" + } + ] + }, + "Node_Strand_Force_Apply": { + "tooltip": "", + "name": "Strand Force Apply", + "outputs": [ + { + "tooltip": "", + "name": "Strand" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Shape" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Direction" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Turbulence" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "", + "name": "Turbulence frequency" + }, + { + "tooltip": "", + "name": "Turbulence detail" + } + ] + }, + "Node_2D_light": { + "tooltip": "Apply different shaped light on the image.", + "name": "2D Light", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Light only" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Light shape" + }, + { + "tooltip": "", + "name": "Center" + }, + { + "tooltip": "", + "name": "Range" + }, + { + "tooltip": "", + "name": "Intensity" + }, + { + "tooltip": "", + "name": "Color" + }, + { + "tooltip": "", + "name": "Start" + }, + { + "tooltip": "", + "name": "Finish" + }, + { + "tooltip": "", + "name": "Sweep" + }, + { + "tooltip": "", + "name": "Sweep end" + }, + { + "tooltip": "", + "name": "Banding" + }, + { + "tooltip": "Control how light fade out over distance.", + "name": "Attenuation" + }, + { + "tooltip": "", + "name": "Radial banding" + }, + { + "tooltip": "", + "name": "Radial start" + }, + { + "tooltip": "", + "name": "Radial band ratio" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Array_Add": { + "tooltip": "", + "name": "Array Add", + "outputs": [ + { + "tooltip": "", + "name": "Output" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + }, + { + "tooltip": "", + "name": "Spread array" + }, + { + "tooltip": "", + "name": "Value" + } + ] + }, + "Node_Strand_Render": { + "tooltip": "", + "name": "Strand Render", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Strand" + }, + { + "tooltip": "", + "name": "Thickness" + }, + { + "tooltip": "", + "name": "Thickness over length" + }, + { + "tooltip": "", + "name": "Random color" + }, + { + "tooltip": "", + "name": "Color over length" + }, + { + "tooltip": "", + "name": "Seed" + }, + { + "tooltip": "Render extra strands between the real strands.", + "name": "Child" + } + ] + }, + "Node_Sprite_Stack": { + "tooltip": "Create sprite stack either from repeating a single image or stacking different images using array.", + "name": "Sprite Stack", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Base shape" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Stack amount" + }, + { + "tooltip": "", + "name": "Stack shift" + }, + { + "tooltip": "", + "name": "Position" + }, + { + "tooltip": "", + "name": "Rotation" + }, + { + "tooltip": "", + "name": "Stack blend" + }, + { + "tooltip": "Alpha value for the last copy.", + "name": "Alpha end" + }, + { + "tooltip": "Make each copy move the original image.", + "name": "Move base" + } + ] + }, + "Node_Trail": { + "tooltip": "Blend animation by filling in the pixel 'in-between' two or more frames.", + "name": "Trail", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "Trail UV" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Max life" + }, + { + "tooltip": "", + "name": "Loop" + }, + { + "tooltip": "Maximum distance to search for movement, set to -1 to search the entire image.", + "name": "Max distance" + }, + { + "tooltip": "Make trail track pixels of the same color, instead of the closet pixels.", + "name": "Match color" + }, + { + "tooltip": "Blend color between two pixel smoothly.", + "name": "Blend color" + }, + { + "tooltip": "", + "name": "Alpha over life" + } + ] + }, + "Node_Color_RGB": { + "tooltip": "Create color from RGB value.", + "name": "RGB Color", + "outputs": [ + { + "tooltip": "", + "name": "Color" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Red" + }, + { + "tooltip": "", + "name": "Green" + }, + { + "tooltip": "", + "name": "Blue" + }, + { + "tooltip": "", + "name": "Normalized" + } + ] + }, + "Node_Level": { + "tooltip": "Adjust brightness of an image by changing its brightness range.", + "name": "Level", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "White" + }, + { + "tooltip": "", + "name": "Red" + }, + { + "tooltip": "", + "name": "Green" + }, + { + "tooltip": "", + "name": "Blue" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Image_Animated": { + "tooltip": "Load multiple images from your computer as animation.", + "name": "Animation", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Path" + }, + { + "tooltip": "", + "name": "Padding" + }, + { + "tooltip": "Stretch animation speed to match project length.", + "name": "Stretch frame" + }, + { + "tooltip": "", + "name": "Frame duration" + }, + { + "tooltip": "", + "name": "Animation end" + }, + { + "tooltip": "", + "name": "Set animation length to match" + } + ] + }, + "Node_Math": { + "tooltip": "", + "name": "Math", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "a" + }, + { + "tooltip": "", + "name": "b" + }, + { + "tooltip": "", + "name": "Degree angle" + }, + { + "tooltip": "", + "name": "To integer" + }, + { + "tooltip": "", + "name": "Amount" + } + ] + }, + "Node_Move_Point": { + "tooltip": "", + "name": "Translate Point", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Point" + }, + { + "tooltip": "", + "name": "Mode" + }, + { + "tooltip": "", + "name": "Shift" + }, + { + "tooltip": "", + "name": "Direction" + }, + { + "tooltip": "", + "name": "Distance" + } + ] + }, + "Node_Dither": { + "tooltip": "Reduce color and use dithering to preserve original color.", + "name": "Dither", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Palette" + }, + { + "tooltip": "", + "name": "Pattern" + }, + { + "tooltip": "", + "name": "Dither map" + }, + { + "tooltip": "", + "name": "Contrast" + }, + { + "tooltip": "", + "name": "Contrast map" + }, + { + "tooltip": "", + "name": "Mode" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" + } + ] + }, + "Node_Combine_RGB": { + "tooltip": "Combine 4 image in to one. Each image use to control RGBA channel.", + "name": "RGBA Combine", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Red" + }, + { + "tooltip": "", + "name": "Green" + }, + { + "tooltip": "", + "name": "Blue" + }, + { + "tooltip": "", + "name": "Alpha" + }, + { + "tooltip": "", + "name": "Sampling type" + } + ] + }, + "Node_Iterate_Sort": { + "tooltip": "Sort array using node graph.", + "name": "Sort Array", + "outputs": [ + { + "tooltip": "", + "name": "Array" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Array" + } + ] + }, + "Node_VFX_Destroy": { + "tooltip": "", + "name": "Destroy", + "outputs": [ + { + "tooltip": "", + "name": "Particles" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Particles" + }, + { + "tooltip": "", + "name": "Area" + }, + { + "tooltip": "", + "name": "Falloff" + }, + { + "tooltip": "", + "name": "Falloff distance" + }, + { + "tooltip": "", + "name": "Effect Vector" + }, + { + "tooltip": "", + "name": "Strength" + }, + { + "tooltip": "", + "name": "Rotate particle" + }, + { + "tooltip": "", + "name": "Scale particle" + } + ] + }, + "Node_9Slice": { + "tooltip": "Cut image into 3x3 parts, and scale\/repeat only the middle part.", + "name": "Nine Slice", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Splice" + }, + { + "tooltip": "", + "name": "Filling modes" + } + ] + }, + "Node_3D_Extrude": { + "tooltip": "Extrude 2D image into 3D object.", + "name": "3D Extrude", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + }, + { + "tooltip": "", + "name": "3D scene" + }, + { + "tooltip": "", + "name": "Normal pass" + }, + { + "tooltip": "", + "name": "3D vertex" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Dimension" + }, + { + "tooltip": "", + "name": "Object position" + }, + { + "tooltip": "", + "name": "Object rotation" + }, + { + "tooltip": "", + "name": "Object scale" + }, + { + "tooltip": "", + "name": "Render position" + }, + { + "tooltip": "", + "name": "Render rotation" + }, + { + "tooltip": "", + "name": "Render scale" + }, + { + "tooltip": "", + "name": "Manual generate" + }, + { + "tooltip": "", + "name": "Light direction" + }, + { + "tooltip": "", + "name": "Light height" + }, + { + "tooltip": "", + "name": "Light intensity" + }, + { + "tooltip": "", + "name": "Light color" + }, + { + "tooltip": "", + "name": "Ambient color" + }, + { + "tooltip": "", + "name": "Height map" + }, + { + "tooltip": "", + "name": "Always update" + }, + { + "tooltip": "", + "name": "Projection" + }, + { + "tooltip": "", + "name": "Field of view" + }, + { + "tooltip": "", + "name": "Scale view with dimension" + } + ] + }, + "Node_Compare": { + "tooltip": "", + "name": "Compare", + "outputs": [ + { + "tooltip": "", + "name": "Result" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Type" + }, + { + "tooltip": "", + "name": "a" + }, + { + "tooltip": "", + "name": "b" + } + ] + }, + "Node_Erode": { + "tooltip": "Remove pixel that are close to the border of the image.", + "name": "Erode", + "outputs": [ + { + "tooltip": "", + "name": "Surface out" + } + ], + "inputs": [ + { + "tooltip": "", + "name": "Surface in" + }, + { + "tooltip": "", + "name": "Width" + }, + { + "tooltip": "", + "name": "Preserve border" + }, + { + "tooltip": "", + "name": "Use alpha" + }, + { + "tooltip": "", + "name": "Mask" + }, + { + "tooltip": "", + "name": "Mix" + }, + { + "tooltip": "", + "name": "Active" } ] } diff --git a/datafiles/data/themes/default.zip b/datafiles/data/themes/default.zip index a7878a5cf..6fd89c6dc 100644 Binary files a/datafiles/data/themes/default.zip and b/datafiles/data/themes/default.zip differ diff --git a/objects/o_dialog_group_input_order/Create_0.gml b/objects/o_dialog_group_input_order/Create_0.gml index d42086e9b..f20f42d92 100644 --- a/objects/o_dialog_group_input_order/Create_0.gml +++ b/objects/o_dialog_group_input_order/Create_0.gml @@ -14,9 +14,9 @@ event_inherited(); tb_edit = new textBox(TEXTBOX_INPUT.text, function(str) { if(sep_editing == -1) return; - var sep = node.attributes[? "Separator"]; + var sep = node.attributes.separator; sep[sep_editing][1] = str; - node.attributes[? "Separator"] = sep; + node.attributes.separator = sep; node.sortIO(); } ); @@ -59,7 +59,7 @@ event_inherited(); draw_sprite_ui(THEME.hamburger, 0, hg / 2, _y + hg / 2, 0.5, 0.5,, COLORS._main_icon_light); if(sep_editing == disp[2]) { - var sep = node.attributes[? "Separator"]; + var sep = node.attributes.separator; WIDGET_CURRENT = tb_edit; tb_edit.setActiveFocus(sFOCUS, sHOVER); @@ -106,9 +106,9 @@ event_inherited(); } if(sep_dragging > -1 && mouse_release(mb_left)) { - var sep = node.attributes[? "Separator"]; + var sep = node.attributes.separator; sep[sep_dragging][0] = hovr; - node.attributes[? "Separator"] = sep; + node.attributes.separator = sep; node.sortIO(); sep_dragging = -1; diff --git a/objects/o_dialog_group_input_order/Draw_64.gml b/objects/o_dialog_group_input_order/Draw_64.gml index 8968bc9d8..ba026cb9f 100644 --- a/objects/o_dialog_group_input_order/Draw_64.gml +++ b/objects/o_dialog_group_input_order/Draw_64.gml @@ -25,7 +25,7 @@ if !ready exit; var _txt = __txtx("dialog_group_order_add", "Add separator"); if(buttonInstant(THEME.button_hide, bx, by, ui(32), ui(32), mouse_ui, sFOCUS, sHOVER, _txt, THEME.add, 1, COLORS._main_value_positive) == 2) { - var sep = node.attributes[? "Separator"]; + var sep = node.attributes.separator; array_push(sep, [ds_list_size(node.inputs) - node.custom_input_index, ""]); node.sortIO(); } diff --git a/objects/o_dialog_splash/Draw_64.gml b/objects/o_dialog_splash/Draw_64.gml index f502d6370..4f06ed6a8 100644 --- a/objects/o_dialog_splash/Draw_64.gml +++ b/objects/o_dialog_splash/Draw_64.gml @@ -45,6 +45,7 @@ if !ready exit; draw_sprite_stretched(THEME.ui_panel_bg, 0, x0, y0, x1 - x0, y1 - y0); sp_recent.setActiveFocus(sFOCUS, sHOVER); sp_recent.draw(x0 + ui(6), y0); + draw_sprite_stretched(THEME.ui_panel_fg, 0, x0, y0, x1 - x0, y1 - y0); var bx = x1 - ui(28); var by = y0 - ui(28 + 4); @@ -80,8 +81,9 @@ if !ready exit; x0 = x1 + ui(16); x1 = dialog_x + dialog_w - ui(16); - bx = x0; + var tab_cover = noone; + var th = ui(36) + THEME_VALUE.panel_tab_extend; for( var i = 0; i < array_length(pages); i++ ) { draw_set_text(f_p0, fa_left, fa_bottom, project_page == i? COLORS._main_text : COLORS._main_text_sub); @@ -101,8 +103,11 @@ if !ready exit; if(txt == "Contests") tw += ui(32); - if(project_page != i && point_in_rectangle(mouse_mx, mouse_my, bx, y0 - ui(32), bx + tw, y0)) { - draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, bx, y0 - ui(32), tw, ui(40), COLORS.panel_tab_hover, 1); + if(project_page == i) { + draw_sprite_stretched_ext(THEME.ui_panel_tab, 1, bx, y0 - ui(32), tw, th, COLORS.panel_tab, 1); + tab_cover = BBOX().fromWH(bx, y0, tw, THEME_VALUE.panel_tab_extend); + } else if(point_in_rectangle(mouse_mx, mouse_my, bx, y0 - ui(32), bx + tw, y0)) { + draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, bx, y0 - ui(32), tw, th, COLORS.panel_tab_hover, 1); if(mouse_click(mb_left, sFOCUS)) { project_page = i; @@ -112,21 +117,17 @@ if !ready exit; expandAction = true; } } - } else { - var foc = project_page == i; - draw_sprite_stretched_ext(THEME.ui_panel_tab, foc, bx, y0 - ui(32), tw, ui(40), - foc? COLORS.panel_tab_active : COLORS.panel_tab_inactive, 1); - } - + } else + draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, bx, y0 - ui(32), tw, th, COLORS.panel_tab_inactive, 1); + var _btx = bx + ui(8); if(txt == "Contests") { draw_sprite_ui(THEME.trophy, 0, _btx + ui(16), y0 - ui(14),,,, CDEF.yellow); _btx += ui(32); } - var cc = COLORS._main_text; - if(txt == "Contests") cc = project_page == i? CDEF.yellow : COLORS._main_text_sub; - if(project_page == i) cc = COLORS._main_text_on_accent; + var cc = COLORS._main_text_sub; + if(project_page == i) cc = txt == "Contests"? CDEF.yellow : COLORS._main_text; draw_set_color(cc); draw_text(_btx, y0 - ui(4), dtxt); @@ -147,6 +148,8 @@ if !ready exit; } draw_sprite_stretched(THEME.ui_panel_bg, 0, x0, y0, x1 - x0, y1 - y0); + draw_sprite_stretched(THEME.ui_panel_fg, 0, x0, y0, x1 - x0, y1 - y0); + draw_sprite_bbox(THEME.ui_panel_tab, 3, tab_cover); switch(pages[project_page]) { case "Sample projects" : diff --git a/objects/o_main/Step_0.gml b/objects/o_main/Step_0.gml index 9b3ba8a10..a217eb388 100644 --- a/objects/o_main/Step_0.gml +++ b/objects/o_main/Step_0.gml @@ -23,7 +23,7 @@ if(OS == os_windows && gameframe_is_minimized()) exit; try { if(PANEL_MAIN != 0) PANEL_MAIN.step(); - + for(var i = 0; i < ds_list_size(NODES); i++) { NODES[| i].triggerCheck(); NODES[| i].step(); diff --git a/scripts/_3D/_3D.gml b/scripts/_3D/_3D.gml index 48afd84da..00ac9ed3f 100644 --- a/scripts/_3D/_3D.gml +++ b/scripts/_3D/_3D.gml @@ -286,7 +286,7 @@ enum CAMERA_PROJ { ]; } - function _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny) { + function _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny) { #region var _gpos = inputs[| global_pos].getValue(); var _gsca = inputs[| global_sca].getValue(); @@ -485,6 +485,7 @@ enum CAMERA_PROJ { } inputs[| global_pos].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); + #endregion } function _3d_local_transform(_lpos, _lrot, _lsca) { @@ -501,13 +502,52 @@ enum CAMERA_PROJ { matrix_stack_pop(); } - function _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, _pass = "diff", _scale = noone) { + function __3d_transform(pos = 0, rot = 0, sca = 0, lpos = 0, lrot = 0, lsca = 0, apply_local = true, sdim = true) constructor { + self.pos = pos; + self.rot = rot; + self.sca = sca; + + self.local_pos = lpos; + self.local_rot = lrot; + self.local_sca = lsca; + + self.apply_local = apply_local; + self.scaleDimension = sdim; + } + + function __3d_light(dir = 0, height = 0, intensity = 0, color = c_white, ambient = c_white) constructor { + self.dir = dir; + self.height = height; + self.intensity = intensity; + self.color = color; + self.ambient = ambient; + } + + function __3d_camera(proj, fov) constructor { + self.projection = proj; + self.fov = fov; + } + + function _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, _pass = "diff") { _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); + var _pos = _transform.pos; + var _sca = _transform.sca; + var _lpos = _transform.local_pos; + var _lrot = _transform.local_rot; + var _lsca = _transform.local_sca; + + var _ldir = _light.dir; + var _lhgt = _light.height; + var _lint = _light.intensity; + var _lclr = _light.color; + var _aclr = _light.ambient; + var _proj = _cam.projection; var _fov = _cam.fov; - var _applyLocal = _scale == noone? true : _scale.local; - var scaleDimension = _scale == noone? true : _scale.dimension; + + var _applyLocal = _transform.apply_local; + var scaleDimension = _transform.scaleDimension; var lightFor = [ -cos(degtorad(_ldir)), -_lhgt, -sin(degtorad(_ldir)) ]; diff --git a/scripts/__bbox/__bbox.gml b/scripts/__bbox/__bbox.gml index 7f1fdd811..e9ac9c46a 100644 --- a/scripts/__bbox/__bbox.gml +++ b/scripts/__bbox/__bbox.gml @@ -4,8 +4,8 @@ function BoundingBox(minx = noone, miny = noone, maxx = noone, maxy = noone) con self.maxx = maxx; self.maxy = maxy; - self.width = 0; - self.height = 0; + self.width = maxx - minx; + self.height = maxy - miny; static addPoint = function(px, py) { minx = minx == noone? px : min(minx, px); @@ -30,16 +30,41 @@ function BoundingBox(minx = noone, miny = noone, maxx = noone, maxy = noone) con static clone = function() { return new BoundingBox(minx, miny, maxx, maxy); } } -function node_bbox(x0, y0, x1, y1) constructor { - self.x0 = x0; - self.x1 = x1; - self.y0 = y0; - self.y1 = y1; +function BBOX() { return new __BBOX(); } +function __BBOX() constructor { + x0 = 0; x1 = 0; + y0 = 0; y1 = 0; - xc = (x0 + x1) / 2; - yc = (y0 + y1) / 2; - w = x1 - x0; - h = y1 - y0; + xc = 0; yc = 0; + w = 0; h = 0; - static clone = function() { return node_bbox(x0, y0, x1, y1); }; + static fromPoints = function(x0, y0, x1, y1) { + self.x0 = x0; + self.x1 = x1; + self.y0 = y0; + self.y1 = y1; + + xc = (x0 + x1) / 2; + yc = (y0 + y1) / 2; + w = x1 - x0; + h = y1 - y0; + + return self; + } + + static fromWH = function(x0, y0, w, h) { + self.x0 = x0; + self.x1 = x0 + w; + self.y0 = y0; + self.y1 = y0 + h; + + self.xc = (x0 + x1) / 2; + self.yc = (y0 + y1) / 2; + self.w = w; + self.h = h; + + return self; + } + + static clone = function() { return BBOX().fromPoints(x0, y0, x1, y1); }; } \ 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 e8cbf3b93..084634c6f 100644 --- a/scripts/_node_VFX_spawner/_node_VFX_spawner.gml +++ b/scripts/_node_VFX_spawner/_node_VFX_spawner.gml @@ -111,11 +111,11 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co ["Render", true], 21 ]; - attributes[? "part_amount"] = 512; + attributes.part_amount = 512; array_push(attributeEditors, ["Maximum particles", "part_amount", - new textBox(TEXTBOX_INPUT.number, function(val) { attributes[? "part_amount"] = val; }) ]); + new textBox(TEXTBOX_INPUT.number, function(val) { attributes.part_amount = val; }) ]); - parts = array_create(attributes[? "part_amount"]); + parts = array_create(attributes.part_amount); parts_runner = 0; seed = 0; @@ -125,7 +125,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co current_data = []; - for(var i = 0; i < attributes[? "part_amount"]; i++) + for(var i = 0; i < attributes.part_amount; i++) parts[i] = new __part(self); static spawn = function(_time = ANIMATOR.current_frame, _pos = -1) { @@ -270,10 +270,10 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co part.setPhysic(_vx, _vy, _acc, _grav, _gvDir, _wigg, _trn, _turnSc); part.setTransform(_scx, _scy, _scale_time, _rot, _rot_spd, _follow); part.setDraw(_color, _bld, _alp, _fade); - spawn_index = safe_mod(spawn_index + 1, attributes[? "part_amount"]); + spawn_index = safe_mod(spawn_index + 1, attributes.part_amount); onSpawn(_time, part); - parts_runner = safe_mod(parts_runner + 1, attributes[? "part_amount"]); + parts_runner = safe_mod(parts_runner + 1, attributes.part_amount); } } @@ -304,7 +304,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co } function checkPartPool() { - var _part_amo = attributes[? "part_amount"]; + var _part_amo = attributes.part_amount; var _curr_amo = array_length(parts); if(_part_amo > _curr_amo) { diff --git a/scripts/append_function/append_function.gml b/scripts/append_function/append_function.gml index 28503a354..dc1cb36c3 100644 --- a/scripts/append_function/append_function.gml +++ b/scripts/append_function/append_function.gml @@ -1,6 +1,6 @@ function APPEND(_path, context = PANEL_GRAPH.getCurrentContext()) { if(_path == "") return noone; - var _map = json_load(_path); + var _map = json_load_struct(_path); if(_map == -1) { printlog("Decode error"); @@ -19,8 +19,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) { APPENDING = true; UNDO_HOLDING = true; - if(ds_map_exists(_map, "version")) { - var _v = _map[? "version"]; + if(struct_has(_map, "version")) { + var _v = _map.version; LOADING_VERSION = _v; if(_v != SAVEFILE_VERSION) { var warn = "File version mismatch : loading file verion " + string(_v) + " to Pixel Composer " + string(SAVEFILE_VERSION); @@ -28,8 +28,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) { } } - if(!ds_map_exists(_map, "nodes")) return noone; - var _node_list = _map[? "nodes"]; + if(!struct_has(_map, "nodes")) return noone; + var _node_list = _map.nodes; var appended_list = ds_list_create(); var node_create = ds_list_create(); @@ -37,8 +37,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) { ds_map_clear(APPEND_MAP); var t = current_time; - for(var i = 0; i < ds_list_size(_node_list); i++) { - var _node = nodeLoad(_node_list[| i], true, context); + for(var i = 0; i < array_length(_node_list); i++) { + var _node = nodeLoad(_node_list[i], true, context); if(_node) ds_list_add(appended_list, _node); } printlog("Load time: " + string(current_time - t)); t = current_time; @@ -98,12 +98,12 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) { try { while(++pass < 3 && !ds_queue_empty(CONNECTION_CONFLICT)) { var size = ds_queue_size(CONNECTION_CONFLICT); - log_message("APPEND", "[Connect] " + string(size) + " Connection conflict(s) detected ( pass: " + string(pass) + " )"); + log_message("APPEND", $"[Connect] {size} Connection conflict(s) detected (pass: {pass})"); repeat(size) { var junc = ds_queue_dequeue(CONNECTION_CONFLICT); var res = junc.connect(true); - log_message("APPEND", "[Connect] Reconnecting " + string(junc.name) + " " + (res? "SUCCESS" : "FAILED")); + log_message("APPEND", $"[Connect] Reconnecting {junc.name} {res? "SUCCESS" : "FAILED"}"); } Render(true); } @@ -131,8 +131,8 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) { PANEL_ANIMATION.updatePropertyList(); UPDATE |= RENDER_TYPE.full; - if(ds_map_exists(_map, "metadata")) { - var meta = _map[? "metadata"]; + if(struct_has(_map, "metadata")) { + var meta = _map.metadata; for( var i = 0; i < ds_list_size(node_create); i++ ) { var _node = node_create[| i]; if(!struct_has(_node, "metadata")) continue; @@ -141,7 +141,6 @@ function __APPEND_MAP(_map, context = PANEL_GRAPH.getCurrentContext()) { } } - ds_map_destroy(_map); refreshNodeMap(); return node_create; diff --git a/scripts/areaBox/areaBox.gml b/scripts/areaBox/areaBox.gml index 3d061ff9b..640d00c0e 100644 --- a/scripts/areaBox/areaBox.gml +++ b/scripts/areaBox/areaBox.gml @@ -127,7 +127,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor { y = _y; w = 0; h = ui(204); - mode = ds_list_get(_extra_data, 0); + mode = _extra_data[0]; if(buttonInstant(THEME.button_hide, _x - ui(48), _y + ui(64 - 48), ui(96), ui(96), _m, adjust_shape && active, adjust_shape && hover, "", THEME.inspector_area, array_safe_get(_data, 4), c_white) == 2) { @@ -213,7 +213,7 @@ function areaBox(_onModify, _unit = noone) : widget() constructor { break; } - _extra_data[| 0] = (mode + 1) % 3; + _extra_data[0] = (mode + 1) % 3; } } diff --git a/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml b/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml index fe3881234..d07a3a58d 100644 --- a/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml +++ b/scripts/draw_sprite_ext_override/draw_sprite_ext_override.gml @@ -28,6 +28,11 @@ function draw_sprite_stretched_points(spr, ind, _x0, _y0, _x1, _y1) { __draw_sprite_stretched(spr, ind, _xs, _ys, _w, _h); } +function draw_sprite_bbox(spr, ind, _bbox) { + if(_bbox == noone) return; + __draw_sprite_stretched(spr, ind, _bbox.x0, _bbox.y0, _bbox.w, _bbox.h); +} + function draw_sprite_uniform(spr, ind, _x, _y, scale, color = c_white) { draw_sprite_ext(spr, ind, round(_x), round(_y), scale, scale, 0, color, 1); } diff --git a/scripts/draw_surface_functions/draw_surface_functions.gml b/scripts/draw_surface_functions/draw_surface_functions.gml index f3b0d18b2..8b9424d0f 100644 --- a/scripts/draw_surface_functions/draw_surface_functions.gml +++ b/scripts/draw_surface_functions/draw_surface_functions.gml @@ -1,4 +1,6 @@ function draw_surface_align(surface, _x, _y, _s, _halign = fa_left, _valign = fa_top) { + if(!is_surface(surface)) return; + var w = surface_get_width(surface) * _s; var h = surface_get_height(surface) * _s; diff --git a/scripts/gradients_function/gradients_function.gml b/scripts/gradients_function/gradients_function.gml index 5dabb3a01..be33e6d80 100644 --- a/scripts/gradients_function/gradients_function.gml +++ b/scripts/gradients_function/gradients_function.gml @@ -10,12 +10,7 @@ function gradientKey(time, value) constructor { static clone = function() { return new gradientKey(time, value); } - static serialize = function() { - var m = ds_map_create(); - m[? "time"] = time; - m[? "value"] = value; - return m; - } + static serialize = function() { return self; } } function gradientObject(color = c_black) constructor { @@ -142,14 +137,10 @@ function gradientObject(color = c_black) constructor { s = json_try_parse(str); else if(is_struct(str)) s = str; - else if(ds_exists(str, ds_type_list)) { - + else if(is_array(str)) { keys = []; - for( var i = 0; i < ds_list_size(str); i++ ) { - if(!ds_exists(str[| i], ds_type_map)) continue; - - keys[i] = new gradientKey(str[| i][? "time"], str[| i][? "value"]); - } + for( var i = 0; i < array_length(str); i++ ) + keys[i] = new gradientKey(str[i].time, str[i].value); return self; } diff --git a/scripts/histogram_drawer/histogram_drawer.gml b/scripts/histogram_drawer/histogram_drawer.gml index 4cdc5035a..20e6ebc09 100644 --- a/scripts/histogram_drawer/histogram_drawer.gml +++ b/scripts/histogram_drawer/histogram_drawer.gml @@ -1,14 +1,14 @@ function histogramInit() { - attributes[? "preview_resolution"] = 64; + attributes.preview_resolution = 64; array_push(attributeEditors, ["Preview resolution", "preview_resolution", - new textBox(TEXTBOX_INPUT.number, function(val) { attributes[? "preview_resolution"] = val; })]); + new textBox(TEXTBOX_INPUT.number, function(val) { attributes.preview_resolution = val; })]); - attributes[? "preview_sample"] = 32; + attributes.preview_sample = 32; array_push(attributeEditors, ["Preview sample", "preview_sample", - new textBox(TEXTBOX_INPUT.number, function(val) { attributes[? "preview_sample"] = val; })]); + new textBox(TEXTBOX_INPUT.number, function(val) { attributes.preview_sample = val; })]); for( var i = 0; i < 4; i++ ) { - hist[i] = array_create(attributes[? "preview_resolution"] + 1); + hist[i] = array_create(attributes.preview_resolution + 1); histShow[i] = true; } histMax = 0; @@ -50,7 +50,7 @@ function histogramDraw(_x, _y, _w, _h) { } function histogramUpdate(surface) { - if(array_length(hist[0]) != attributes[? "preview_resolution"] + 1) + if(array_length(hist[0]) != attributes.preview_resolution + 1) histogramInit(); if(!is_surface(surface)) return; @@ -58,8 +58,8 @@ function histogramUpdate(surface) { histMax = 0; var sw = surface_get_width(surface); var sh = surface_get_height(surface); - var stw = max(1, sw / attributes[? "preview_sample"]); - var sth = max(1, sh / attributes[? "preview_sample"]); + var stw = max(1, sw / attributes.preview_sample); + var sth = max(1, sh / attributes.preview_sample); for( var j = 0; j < 4; j++ ) for( var i = 0; i < array_length(hist[0]); i++ ) { @@ -73,9 +73,9 @@ function histogramUpdate(surface) { for( var j = 0; j < sh; j += sth ) { var col = buffer_get_color(surface_buffer, i, j, sw, sh); var colA = []; - colA[0] = round(color_get_red(col) / 256 * attributes[? "preview_resolution"]); - colA[1] = round(color_get_green(col) / 256 * attributes[? "preview_resolution"]); - colA[2] = round(color_get_blue(col) / 256 * attributes[? "preview_resolution"]); + colA[0] = round(color_get_red(col) / 256 * attributes.preview_resolution); + colA[1] = round(color_get_green(col) / 256 * attributes.preview_resolution); + colA[2] = round(color_get_blue(col) / 256 * attributes.preview_resolution); colA[3] = round((colA[0] + colA[1] + colA[2]) / 3); for( var k = 0; k < 4; k++ ) { diff --git a/scripts/load_function/load_function.gml b/scripts/load_function/load_function.gml index c6d136eeb..34e09f247 100644 --- a/scripts/load_function/load_function.gml +++ b/scripts/load_function/load_function.gml @@ -56,16 +56,10 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) { READONLY = readonly; SET_PATH(path); - var file = file_text_open_read(temp_path); - var load_str = ""; + var _load_content = json_load_struct(temp_path); - while(!file_text_eof(file)) - load_str += file_text_readln(file); - file_text_close(file); - - var _map = json_decode(load_str); - if(ds_map_exists(_map, "version")) { - var _v = _map[? "version"]; + if(struct_has(_load_content, "version")) { + var _v = _load_content.version; LOADING_VERSION = _v; if(_v != SAVEFILE_VERSION) { var warn = "File version mismatch : loading file verion " + string(_v) + " to Pixel Composer " + string(SAVEFILE_VERSION); @@ -79,11 +73,11 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) { nodeCleanUp(); var create_list = ds_list_create(); - if(ds_map_exists(_map, "nodes")) { + if(struct_has(_load_content, "nodes")) { try { - var _node_list = _map[? "nodes"]; - for(var i = 0; i < ds_list_size(_node_list); i++) { - var _node = nodeLoad(_node_list[| i]); + var _node_list = _load_content.nodes; + for(var i = 0; i < array_length(_node_list); i++) { + var _node = nodeLoad(_node_list[i]); if(_node) ds_list_add(create_list, _node); } } catch(e) { @@ -92,37 +86,37 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) { } try { - if(ds_map_exists(_map, "animator")) { - var _anim_map = _map[? "animator"]; - ANIMATOR.frames_total = ds_map_try_get(_anim_map, "frames_total"); - ANIMATOR.framerate = ds_map_try_get(_anim_map, "framerate"); + if(struct_has(_load_content, "animator")) { + var _anim_map = _load_content.animator; + ANIMATOR.frames_total = _anim_map.frames_total; + ANIMATOR.framerate = _anim_map.framerate; } } catch(e) { log_warning("LOAD, animator", exception_print(e)); } try { - if(ds_map_exists(_map, "metadata")) - METADATA.deserialize(_map[? "metadata"]); + if(struct_has(_load_content, "metadata")) + METADATA.deserialize(_load_content.metadata); } catch(e) { log_warning("LOAD, metadata", exception_print(e)); } GLOBAL = new Node_Global(); try { - if(ds_map_exists(_map, "global")) - GLOBAL.deserialize(_map[? "global"]); + if(struct_has(_load_content, "global")) + GLOBAL.deserialize(_load_content.global); } catch(e) { log_warning("LOAD, global", exception_print(e)); } try { - if(ds_map_exists(_map, "addon")) { - var _addon = _map[? "addon"]; + if(struct_has(_load_content, "addon")) { + var _addon = _load_content.addon; with(addon) { - if(!ds_map_exists(_addon, name)) continue; - var _mp = json_parse(_addon[? name]); + if(!struct_has(_addon, name)) continue; + var _mp = json_parse(_addon.name); lua_call(thread, "deserialize", _mp); } @@ -178,7 +172,7 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) { try { while(++pass < 4 && !ds_queue_empty(CONNECTION_CONFLICT)) { var size = ds_queue_size(CONNECTION_CONFLICT); - log_message("LOAD", "[Connect] " + string(size) + " Connection conflict(s) detected ( pass: " + string(pass) + " )"); + log_message("LOAD", $"[Connect] {size} Connection conflict(s) detected (pass: {pass})"); repeat(size) ds_queue_dequeue(CONNECTION_CONFLICT).connect(); Render(); @@ -208,7 +202,6 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false) { log_message("FILE", "load " + path, THEME.noti_icon_file_load); PANEL_MENU.setNotiIcon(THEME.noti_icon_file_load); - ds_map_destroy(_map); refreshNodeMap(); return true; diff --git a/scripts/meta_data/meta_data.gml b/scripts/meta_data/meta_data.gml index 9c5c0029a..452e37b02 100644 --- a/scripts/meta_data/meta_data.gml +++ b/scripts/meta_data/meta_data.gml @@ -31,29 +31,26 @@ function MetaDataManager() constructor { ]; static serialize = function() { - var m = ds_map_create(); - m[? "description"] = description; - m[? "author"] = author; - m[? "contact"] = contact; - m[? "alias"] = alias; - m[? "aut_id"] = author_steam_id; - m[? "file_id"] = file_id; - - ds_map_add_list(m, "tags", ds_list_create_from_array(tags)); + var m = {}; + m.description = description; + m.author = author; + m.contact = contact; + m.alias = alias; + m.aut_id = author_steam_id; + m.file_id = file_id; + m.tags = tags; return m; } static deserialize = function(m, readonly = false) { - description = ds_map_try_get(m, "description", description); - author = ds_map_try_get(m, "author", author); - contact = ds_map_try_get(m, "contact", contact); - alias = ds_map_try_get(m, "alias", alias); - author_steam_id = ds_map_try_get(m, "aut_id", author_steam_id); - file_id = ds_map_try_get(m, "file_id", file_id); - - if(ds_map_exists(m, "tags")) - tags = array_create_from_list(m[? "tags"]); + description = struct_try_get(m, "description", description); + author = struct_try_get(m, "author", author); + contact = struct_try_get(m, "contact", contact); + alias = struct_try_get(m, "alias", alias); + author_steam_id = struct_try_get(m, "aut_id", author_steam_id); + file_id = struct_try_get(m, "file_id", file_id); + tags = struct_try_get(m, "tags", tags); return self; } diff --git a/scripts/node_3d_combine/node_3d_combine.gml b/scripts/node_3d_combine/node_3d_combine.gml index 265cf09b5..bf1a231bf 100644 --- a/scripts/node_3d_combine/node_3d_combine.gml +++ b/scripts/node_3d_combine/node_3d_combine.gml @@ -179,19 +179,20 @@ function Node_3D_Combine(_x, _y, _group = noone) : Node(_x, _y, _group) construc case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: false, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); submit_vertex(); _3d_post_setup(); } } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } } \ No newline at end of file diff --git a/scripts/node_3d_displace/node_3d_displace.gml b/scripts/node_3d_displace/node_3d_displace.gml index d7397347c..6c80b245f 100644 --- a/scripts/node_3d_displace/node_3d_displace.gml +++ b/scripts/node_3d_displace/node_3d_displace.gml @@ -70,7 +70,7 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou 0, 2, 1, 3, ] - attributes[? "auto_update"] = true; + attributes.auto_update = true; array_push(attributeEditors, ["Auto Update", "auto_update", new checkBox(function() { attribute[? "auto_update"] = !attribute[? "auto_update"]; }, false)]); @@ -124,7 +124,7 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou var _dspTex = _data[15]; var _dspStr = _data[16]; - if(_output_index == 0 && attributes[? "auto_update"]) { + if(_output_index == 0 && attributes.auto_update) { var _vert = _data[11]; for( var i = 0; i < array_length(vertexObjects); i++ ) @@ -167,10 +167,11 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: true, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); for( var i = 0; i < array_length(vertexObjects); i++ ) vertexObjects[i].submit(); _3d_post_setup(); diff --git a/scripts/node_3d_extrude/node_3d_extrude.gml b/scripts/node_3d_extrude/node_3d_extrude.gml index 954dfe86a..4afb9a3e8 100644 --- a/scripts/node_3d_extrude/node_3d_extrude.gml +++ b/scripts/node_3d_extrude/node_3d_extrude.gml @@ -313,10 +313,11 @@ function Node_3D_Extrude(_x, _y, _group = noone) : Node_Processor(_x, _y, _group if(_upda && ANIMATOR.frame_progress) generateMesh(); - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: false, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); submit_vertex(_array_index); _3d_post_setup(); diff --git a/scripts/node_3d_obj/node_3D_obj.gml b/scripts/node_3d_obj/node_3D_obj.gml index 38cea09d0..4eba0d140 100644 --- a/scripts/node_3d_obj/node_3D_obj.gml +++ b/scripts/node_3d_obj/node_3D_obj.gml @@ -235,9 +235,6 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 16].setVisible(_proj == 1); - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: true, dimension: _dimS }; - for( var i = 0; i < array_length(output_display_list) - 1; i++ ) { var ind = output_display_list[i]; var _outSurf = outputs[| ind].getValue(); @@ -248,7 +245,11 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor case 2 : pass = "norm" break; } - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); + + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); for(var i = 0; i < array_length(VB); i++) { if(i >= array_length(materialIndex)) continue; diff --git a/scripts/node_3d_prim_cone/node_3d_prim_cone.gml b/scripts/node_3d_prim_cone/node_3d_prim_cone.gml index 6b09f3a1b..0cc41cae7 100644 --- a/scripts/node_3d_prim_cone/node_3d_prim_cone.gml +++ b/scripts/node_3d_prim_cone/node_3d_prim_cone.gml @@ -184,10 +184,11 @@ function Node_3D_Cone(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: true, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); matrix_set(matrix_world, matrix_stack_top()); vertexObjects[0].submit(face_bas); diff --git a/scripts/node_3d_prim_cube/node_3d_prim_cube.gml b/scripts/node_3d_prim_cube/node_3d_prim_cube.gml index 5081ef595..262dd28f9 100644 --- a/scripts/node_3d_prim_cube/node_3d_prim_cube.gml +++ b/scripts/node_3d_prim_cube/node_3d_prim_cube.gml @@ -139,10 +139,11 @@ function Node_3D_Cube(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: true, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); for(var i = 0; i < array_length(vertexObjects); i++) { var _surf = _usetex? _data[6 + i] : _inSurf; diff --git a/scripts/node_3d_prim_cylinder/node_3d_prim_cylinder.gml b/scripts/node_3d_prim_cylinder/node_3d_prim_cylinder.gml index bd4b79060..1a61d944d 100644 --- a/scripts/node_3d_prim_cylinder/node_3d_prim_cylinder.gml +++ b/scripts/node_3d_prim_cylinder/node_3d_prim_cylinder.gml @@ -210,10 +210,11 @@ function Node_3D_Cylinder(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: true, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); matrix_set(matrix_world, matrix_stack_top()); vertexObjects[0].submit(face_top); diff --git a/scripts/node_3d_prim_sphere/node_3d_prim_sphere.gml b/scripts/node_3d_prim_sphere/node_3d_prim_sphere.gml index eb3f8e7a4..4dee08ed0 100644 --- a/scripts/node_3d_prim_sphere/node_3d_prim_sphere.gml +++ b/scripts/node_3d_prim_sphere/node_3d_prim_sphere.gml @@ -196,10 +196,11 @@ function Node_3D_Sphere(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: true, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); vertexObjects[0].submit(texture); _3d_post_setup(); diff --git a/scripts/node_3d_render/node_3d_render.gml b/scripts/node_3d_render/node_3d_render.gml new file mode 100644 index 000000000..77f8ddc2f --- /dev/null +++ b/scripts/node_3d_render/node_3d_render.gml @@ -0,0 +1,241 @@ +//function Node_3D_Render(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { +// name = "3D Render"; + +// inputs[| 2] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2) +// .setDisplay(VALUE_DISPLAY.vector); + +// inputs[| 3] = nodeValue("Render position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0.5, 0.5 ]) +// .setDisplay(VALUE_DISPLAY.vector) +// .setUnitRef( function() { return inputs[| 2].getValue(); }, VALUE_UNIT.reference); + +// inputs[| 4] = nodeValue("Render rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ]) +// .setDisplay(VALUE_DISPLAY.vector); + +// inputs[| 5] = nodeValue("Render scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ]) +// .setDisplay(VALUE_DISPLAY.vector); + +// inputs[| 6] = nodeValue("Light direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) +// .setDisplay(VALUE_DISPLAY.rotation) +// .rejectArray(); + +// inputs[| 7] = nodeValue("Light height", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5) +// .setDisplay(VALUE_DISPLAY.slider, [-1, 1, 0.01]) +// .rejectArray(); + +// inputs[| 8] = nodeValue("Light intensity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) +// .setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]) +// .rejectArray(); + +// inputs[| 9] = nodeValue("Light color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white) +// .rejectArray(); + +// inputs[| 10] = nodeValue("Ambient color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_grey) +// .rejectArray(); + +// inputs[| 15] = nodeValue("Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) +// .setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]) +// .rejectArray(); + +// inputs[| 16] = nodeValue("Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60) +// .setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]) +// .rejectArray(); + +// inputs[| 17] = nodeValue("Scale view with dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true) + +// input_display_list = [ +// ["Output", false], 2, 17, +// ["Geometry", false], 0, 1, +// ["Object transform", false], 14, 13, 11, +// ["Camera", false], 15, 16, 3, 5, +// ["Light", false], 6, 7, 8, 9, 10, +// ["Textures", true], 12, +// ]; +// input_length = ds_list_size(inputs); +// input_display_len = array_length(input_display_list); + +// outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); + +// outputs[| 1] = nodeValue("3D scene", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); }); + +// outputs[| 2] = nodeValue("Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); + +// output_display_list = [ +// 0, 2, 1 +// ] + +// _3d_node_init(2, /*Transform*/ 3, 5, 14, 13, 11); + +// tex_surface = surface_create(1, 1); + +// function reset_tex() { +// tex_surface = surface_verify(tex_surface, 1, 1); +// surface_set_target(tex_surface); +// draw_clear(c_black); +// surface_reset_target(); +// } +// reset_tex(); + +// static onValueUpdate = function(index = 0) { +// if(index == 12) updateObj(false); +// } + +// function setPath(path) { +// inputs[| 0].setValue(path); +// updateObj(); +// } + +// function createMaterial(m_index) { +// var index = ds_list_size(inputs); +// inputs[| index] = nodeValue(materialNames[m_index] + " texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, tex_surface); +// inputs[| index].setVisible(true); + +// input_display_list[input_display_len + m_index] = index; + +// if(m_index >= array_length(materials)) return; + +// var matY = y - (array_length(materials) - 1) / 2 * (128 + 32); +// var mat = materials[m_index]; + +// if(file_exists(mat.diff_path)) { +// var sol = Node_create_Image_path(x - (w + 64), matY + m_index * (128 + 32), mat.diff_path); +// sol.name = mat.name + " texture"; + +// inputs[| index].setFrom(sol.outputs[| 0]); +// } else { +// var sol = nodeBuild("Node_Solid", x - (w + 64), matY + m_index * (128 + 32)); +// sol.name = mat.name + " texture"; +// sol.inputs[| 1].setValue(mat.diff); + +// inputs[| index].setFrom(sol.outputs[| 0]); +// } +// } + +// materialNames = []; +// materialIndex = []; +// materials = []; + +// static updateObj = function(updateMat = true) { +// var _path = inputs[| 0].getValue(); +// var _flip = inputs[| 12].getValue(); +// var _dir = filename_dir(_path); +// var _pathMtl = string_copy(_path, 1, string_length(_path) - 4) + ".mtl"; + +// var _v = readObj(_path, _flip); + +// if(_v != noone) { +// VB = _v.vertex_groups; +// materialNames = _v.materials; +// materialIndex = _v.material_index; +// use_normal = _v.use_normal; +// if(_v.mtl_path != "") +// _pathMtl = _dir + "/" + _v.mtl_path; +// } + +// if(updateMat) { +// if(array_length(materialNames)) +// materials = readMtl(_pathMtl); +// else { +// materialNames = ["Material"]; +// materialIndex = [0]; +// materials = [ new MTLmaterial("Material") ]; +// } + +// do_reset_material = true; +// } +// update(); +// } +// do_reset_material = false; + +// static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { +// _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny); +// } + +// static submit_vertex = function() { +// var _lpos = inputs[| 14].getValue(); +// var _lrot = inputs[| 13].getValue(); +// var _lsca = inputs[| 11].getValue(); + +// _3d_local_transform(_lpos, _lrot, _lsca); + +// for(var i = 0; i < array_length(VB); i++) { +// if(i >= array_length(materialIndex)) continue; + +// var mIndex = materialIndex[i]; +// var tex = inputs[| input_length + mIndex].getValue(); + +// if(!is_surface(tex)) continue; +// vertex_submit(VB[i], pr_trianglelist, surface_get_texture(tex)); +// } + +// _3d_clear_local_transform(); +// } + +// static update = function(frame = ANIMATOR.current_frame) { +// if(!surface_exists(tex_surface)) reset_tex(); + +// if(do_reset_material) { +// array_resize(input_display_list, input_display_len); + +// while(ds_list_size(inputs) > input_length) +// ds_list_delete(inputs, input_length); + +// for(var i = 0; i < array_length(materialNames); i++) +// createMaterial(i); +// do_reset_material = false; +// } + +// var _dim = inputs[| 2].getValue(); +// var _pos = inputs[| 3].getValue(); +// //var _rot = inputs[| 4].getValue(); +// var _sca = inputs[| 5].getValue(); + +// var _ldir = inputs[| 6].getValue(); +// var _lhgt = inputs[| 7].getValue(); +// var _lint = inputs[| 8].getValue(); +// var _lclr = inputs[| 9].getValue(); +// var _aclr = inputs[| 10].getValue(); + +// var _lpos = inputs[| 14].getValue(); +// var _lrot = inputs[| 13].getValue(); +// var _lsca = inputs[| 11].getValue(); + +// var _proj = inputs[| 15].getValue(); +// var _fov = inputs[| 16].getValue(); +// var _dimS = inputs[| 17].getValue(); + +// inputs[| 16].setVisible(_proj == 1); + +// for( var i = 0; i < array_length(output_display_list) - 1; i++ ) { +// var ind = output_display_list[i]; +// var _outSurf = outputs[| ind].getValue(); + +// var pass = "diff"; +// switch(ind) { +// case 0 : pass = "diff" break; +// case 2 : pass = "norm" break; +// } + +// var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, true, _dimS ); +// var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); +// var _cam = new __3d_camera(_proj, _fov); + +// _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); +// for(var i = 0; i < array_length(VB); i++) { +// if(i >= array_length(materialIndex)) continue; + +// var mIndex = materialIndex[i]; +// var tex = inputs[| input_length + mIndex].getValue(); + +// if(!is_surface(tex)) continue; +// vertex_submit(VB[i], pr_trianglelist, surface_get_texture(tex)); +// } +// _3d_post_setup(); + +// outputs[| ind].setValue(_outSurf); +// } +// } + +// static onCleanUp = function() { +// surface_free(tex_surface); +// } +//} \ No newline at end of file diff --git a/scripts/node_3d_render/node_3d_render.yy b/scripts/node_3d_render/node_3d_render.yy new file mode 100644 index 000000000..994a71a53 --- /dev/null +++ b/scripts/node_3d_render/node_3d_render.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_render", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "3D", + "path": "folders/nodes/data/3D.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_repeat/node_3d_repeat.gml b/scripts/node_3d_repeat/node_3d_repeat.gml index 71b4c11d6..1311da6f0 100644 --- a/scripts/node_3d_repeat/node_3d_repeat.gml +++ b/scripts/node_3d_repeat/node_3d_repeat.gml @@ -193,10 +193,11 @@ function Node_3D_Repeat(_x, _y, _group = noone) : Node(_x, _y, _group) construct case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: false, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); submit_vertex(); _3d_post_setup(); diff --git a/scripts/node_3d_transform/node_3d_transform.gml b/scripts/node_3d_transform/node_3d_transform.gml index dd807d2f1..3f6d27226 100644 --- a/scripts/node_3d_transform/node_3d_transform.gml +++ b/scripts/node_3d_transform/node_3d_transform.gml @@ -117,10 +117,11 @@ function Node_3D_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro case 2 : pass = "norm" break; } - var _cam = { projection: _proj, fov: _fov }; - var _scale = { local: false, dimension: _dimS }; + var _transform = new __3d_transform(_pos,, _sca, _lpos, _lrot, _lsca, false, _dimS ); + var _light = new __3d_light(_ldir, _lhgt, _lint, _lclr, _aclr); + var _cam = new __3d_camera(_proj, _fov); - _outSurf = _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _cam, pass, _scale); + _outSurf = _3d_pre_setup(_outSurf, _dim, _transform, _light, _cam, pass); submit_vertex(); _3d_post_setup(); diff --git a/scripts/node_VFX_renderer/node_VFX_renderer.gml b/scripts/node_VFX_renderer/node_VFX_renderer.gml index 8ca2b93fd..8b032c9d7 100644 --- a/scripts/node_VFX_renderer/node_VFX_renderer.gml +++ b/scripts/node_VFX_renderer/node_VFX_renderer.gml @@ -115,9 +115,9 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } } \ 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 17f93b444..d41f5e227 100644 --- a/scripts/node_VFX_spawner/node_VFX_spawner.gml +++ b/scripts/node_VFX_spawner/node_VFX_spawner.gml @@ -3,7 +3,7 @@ function Node_VFX_Spawner(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y color = COLORS.node_blend_vfx; icon = THEME.vfx; - attributes[? "Output pool"] = false; + attributes.Output_pool = false; inputs[| input_len + 0] = nodeValue("Spawn trigger", self, JUNCTION_CONNECT.input, VALUE_TYPE.node, false) .setVisible(true, true); @@ -26,7 +26,7 @@ function Node_VFX_Spawner(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y reset(); runVFX(ANIMATOR.current_frame); - if(attributes[? "Output pool"]) { + if(attributes.Output_pool) { outputs[| 0].setValue(parts); return; } else { diff --git a/scripts/node_array/node_array.gml b/scripts/node_array/node_array.gml index c7df7b213..f07173866 100644 --- a/scripts/node_array/node_array.gml +++ b/scripts/node_array/node_array.gml @@ -25,7 +25,7 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var by = _y + ui(8); if(buttonInstant(THEME.button_hide, bx, by, bw, bh, _m, _focus, _hover) == 2) { var amo = ds_list_size(inputs) - input_fix_len; - attributes[? "size"] = amo + 1; + attributes.size = amo + 1; refreshDynamicInput(); update(); } @@ -37,10 +37,10 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { draw_text(bxc + ui(48), byc, __txt("Add")); var bx = _x + bw + ui(8); - var amo = attributes[? "size"]; + var amo = attributes.size; if(amo > 1 && buttonInstant(THEME.button_hide, bx, by, bw, bh, _m, _focus, _hover) == 2) { var amo = ds_list_size(inputs) - input_fix_len; - attributes[? "size"] = max(amo - 1, 1); + attributes.size = max(amo - 1, 1); refreshDynamicInput(); update(); } @@ -64,8 +64,8 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, []); - attributes[? "size"] = 1; - attributes[? "spread_value"] = false; + attributes.size = 1; + attributes.spread_value = false; static getType = function() { var _type = inputs[| 0].getValue(); @@ -93,7 +93,7 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { static refreshDynamicInput = function() { var _l = ds_list_create(); - var amo = attributes[? "size"]; + var amo = attributes.size; var extra = true; var lastNode = noone; @@ -185,9 +185,9 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_array_add/node_array_add.gml b/scripts/node_array_add/node_array_add.gml index ffc1d5bc1..1e832406f 100644 --- a/scripts/node_array_add/node_array_add.gml +++ b/scripts/node_array_add/node_array_add.gml @@ -83,9 +83,9 @@ function Node_Array_Add(_x, _y, _group = noone) : Node(_x, _y, _group) construct } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length ) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length ) createNewInput(); } diff --git a/scripts/node_array_zip/node_array_zip.gml b/scripts/node_array_zip/node_array_zip.gml index 51beea012..aca8f700f 100644 --- a/scripts/node_array_zip/node_array_zip.gml +++ b/scripts/node_array_zip/node_array_zip.gml @@ -86,9 +86,9 @@ function Node_Array_Zip(_x, _y, _group = noone) : Node(_x, _y, _group) construct } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length ) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length ) createNewInput(); } diff --git a/scripts/node_ase_file_read/node_ase_file_read.gml b/scripts/node_ase_file_read/node_ase_file_read.gml index 069dd2064..9cc748f03 100644 --- a/scripts/node_ase_file_read/node_ase_file_read.gml +++ b/scripts/node_ase_file_read/node_ase_file_read.gml @@ -51,7 +51,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const var amo = array_length(layers); var hh = 28; var _h = hh * amo + 16; - var _vis = attributes[? "layer_visible"]; + var _vis = attributes.layer_visible; draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, _h, COLORS.node_composite_bg_blend, 1); for( var i = 0; i < array_length(layers); i++ ) { @@ -63,16 +63,16 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const draw_line(_x + 16, _yy - 2, _x + _w - 16, _yy - 2); } - var vis = ds_list_get(_vis, i, true); + var vis = array_safe_get(_vis, i, true); var _bx = _x + 24; if(point_in_circle(_m[0], _m[1], _bx, _yy + hh / 2, 12)) { draw_sprite_ui_uniform(THEME.junc_visible, vis, _bx, _yy + hh / 2, 1, c_white); if(mouse_press(mb_left, _focus)) - hold_visibility = !_vis[| i]; + hold_visibility = !_vis[i]; - if(mouse_click(mb_left, _focus) && _vis[| i] != hold_visibility) { - _vis[| i] = hold_visibility; + if(mouse_click(mb_left, _focus) && _vis[i] != hold_visibility) { + _vis[i] = hold_visibility; update(); } } else @@ -159,7 +159,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const ["Tags", false], 2, tag_renderer, ]; - attributes[? "layer_visible"] = ds_list_create(); + attributes.layer_visible = []; content = ds_map_create(); layers = []; @@ -224,7 +224,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const read_ase(path, content); layers = []; - var vis = attributes[? "layer_visible"]; + var vis = attributes.layer_visible; ds_list_clear(vis); var frames = content[? "Frames"]; @@ -316,7 +316,7 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const _tag_delay = kf.time; } - var vis = attributes[? "layer_visible"]; + var vis = attributes.layer_visible; var ww = content[? "Width"]; var hh = content[? "Height"]; @@ -347,14 +347,14 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const } static attributeSerialize = function() { - var att = ds_map_create(); - ds_map_add_list(att, "layer_visible", ds_list_clone(attributes[? "layer_visible"])); + var att = {}; + att.layer_visible = attributes.layer_visible; return att; } static attributeDeserialize = function(attr) { - if(ds_map_exists(attr, "layer_visible")) - attributes[? "layer_visible"] = ds_list_clone(attr[? "layer_visible"], true); + if(struct_has(attr, "layer_visible")) + attributes.layer_visible = attr.layer_visible; } } \ No newline at end of file diff --git a/scripts/node_base_convert/node_base_convert.gml b/scripts/node_base_convert/node_base_convert.gml index c679f1a6e..0299986cc 100644 --- a/scripts/node_base_convert/node_base_convert.gml +++ b/scripts/node_base_convert/node_base_convert.gml @@ -28,8 +28,8 @@ function Node_Base_Convert(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro var baseTo = current_data[2]; var bbox = drawGetBbox(xx, yy, _s); - var b1 = new node_bbox(bbox.x0, bbox.y0, bbox.xc - _s * 8, bbox.y1); - var b2 = new node_bbox(bbox.xc + _s * 8, bbox.y0, bbox.x1, bbox.y1); + var b1 = BBOX().fromPoints(bbox.x0, bbox.y0, bbox.xc - _s * 8, bbox.y1); + var b2 = BBOX().fromPoints(bbox.xc + _s * 8, bbox.y0, bbox.x1, bbox.y1); draw_sprite_ext(THEME.arrow, 0, bbox.xc, bbox.yc + 1 * _s, .5 * _s, .5 * _s, 0, COLORS._main_icon, 1); draw_text_bbox(b1, baseFrom); diff --git a/scripts/node_bevel/node_bevel.gml b/scripts/node_bevel/node_bevel.gml index c49bbc95f..55d3756bd 100644 --- a/scripts/node_bevel/node_bevel.gml +++ b/scripts/node_bevel/node_bevel.gml @@ -60,7 +60,7 @@ function Node_Bevel(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con var _shf = _data[2]; var _sca = _data[3]; var _slp = _data[4]; - var _sam = ds_map_try_get(attributes, "oversample"); + var _sam = struct_try_get(attributes, "oversample"); surface_set_shader(_outSurf, shader); shader_set_uniform_f(uniform_hei, _hei); diff --git a/scripts/node_blur/node_blur.gml b/scripts/node_blur/node_blur.gml index 07f928c6b..8ff0bb7e0 100644 --- a/scripts/node_blur/node_blur.gml +++ b/scripts/node_blur/node_blur.gml @@ -33,7 +33,7 @@ function Node_Blur(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons static process_data = function(_outSurf, _data, _output_index, _array_index) { var _size = _data[1]; - var _clamp = ds_map_try_get(attributes, "oversample"); + var _clamp = struct_try_get(attributes, "oversample"); var _isovr = _data[3]; var _mask = _data[5]; var _mix = _data[6]; diff --git a/scripts/node_blur_radial/node_blur_radial.gml b/scripts/node_blur_radial/node_blur_radial.gml index df6ed1c0b..df868b860 100644 --- a/scripts/node_blur_radial/node_blur_radial.gml +++ b/scripts/node_blur_radial/node_blur_radial.gml @@ -44,7 +44,7 @@ function Node_Blur_Radial(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou static process_data = function(_outSurf, _data, _output_index, _array_index) { var _str = _data[1]; var _cen = _data[2]; - var _sam = ds_map_try_get(attributes, "oversample"); + var _sam = struct_try_get(attributes, "oversample"); var _mask = _data[4]; var _mix = _data[5]; _cen[0] /= surface_get_width(_outSurf); diff --git a/scripts/node_blur_simple/node_blur_simple.gml b/scripts/node_blur_simple/node_blur_simple.gml index b2dc03054..6e938feaa 100644 --- a/scripts/node_blur_simple/node_blur_simple.gml +++ b/scripts/node_blur_simple/node_blur_simple.gml @@ -45,7 +45,7 @@ function Node_Blur_Simple(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou static process_data = function(_outSurf, _data, _output_index, _array_index) { if(!is_surface(_data[0])) return _outSurf; var _size = _data[1]; - var _samp = ds_map_try_get(attributes, "oversample"); + var _samp = struct_try_get(attributes, "oversample"); var _mask = _data[3]; var _isovr = _data[4]; var _overc = _data[5]; diff --git a/scripts/node_blur_zoom/node_blur_zoom.gml b/scripts/node_blur_zoom/node_blur_zoom.gml index 0c75beb73..acde47837 100644 --- a/scripts/node_blur_zoom/node_blur_zoom.gml +++ b/scripts/node_blur_zoom/node_blur_zoom.gml @@ -56,7 +56,7 @@ function Node_Blur_Zoom(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) static process_data = function(_outSurf, _data, _output_index, _array_index) { var _str = _data[1]; var _cen = _data[2]; - var _sam = ds_map_try_get(attributes, "oversample"); + var _sam = struct_try_get(attributes, "oversample"); var _blr = _data[4]; var _msk = _data[5]; var _mask = _data[6]; diff --git a/scripts/node_cache/node_cache.gml b/scripts/node_cache/node_cache.gml index 9bef76419..81e3d670a 100644 --- a/scripts/node_cache/node_cache.gml +++ b/scripts/node_cache/node_cache.gml @@ -33,7 +33,7 @@ function Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } static update = function() { - if(recoverCache() || !ANIMATOR.is_playing) return; + if(recoverCache()) return; if(!inputs[| 0].value_from) return; var _surf = inputs[| 0].getValue(); @@ -50,9 +50,9 @@ function Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } static postDeserialize = function() { - if(!ds_map_exists(load_map, "cache")) return; - cache_content = load_map[? "cache"]; - cache_loading_progress = 0; + if(!struct_has(load_map, "cache")) return; + cache_content = load_map.cache; + cache_loading_progress = 0; cache_loading = true; } } \ No newline at end of file diff --git a/scripts/node_cache_array/node_cache_array.gml b/scripts/node_cache_array/node_cache_array.gml index a25e37ab6..bc83235b0 100644 --- a/scripts/node_cache_array/node_cache_array.gml +++ b/scripts/node_cache_array/node_cache_array.gml @@ -40,6 +40,8 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru } static update = function() { + if(recoverCache()) return; + var ss = []; var str = inputs[| 1].getValue(); var lst = inputs[| 2].getValue(); @@ -72,8 +74,8 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru } static postDeserialize = function() { - if(!ds_map_exists(load_map, "cache")) return; - cache_content = load_map[? "cache"]; + if(!struct_has(load_map, "cache")) return; + cache_content = load_map.cache; cache_loading_progress = 0; cache_loading = true; } diff --git a/scripts/node_camera/node_camera.gml b/scripts/node_camera/node_camera.gml index d75ecc49a..e029eca1d 100644 --- a/scripts/node_camera/node_camera.gml +++ b/scripts/node_camera/node_camera.gml @@ -120,7 +120,7 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co if(!is_surface(_data[0])) return; var _area = _data[1]; var _zoom = _data[2]; - var _samp = ds_map_try_get(attributes, "oversample"); + var _samp = struct_try_get(attributes, "oversample"); var _fix = _data[4]; var cDep = attrDepth(); @@ -208,9 +208,9 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } } \ No newline at end of file diff --git a/scripts/node_canvas/node_canvas.gml b/scripts/node_canvas/node_canvas.gml index 8b5569d31..84d9b2dcc 100644 --- a/scripts/node_canvas/node_canvas.gml +++ b/scripts/node_canvas/node_canvas.gml @@ -623,8 +623,8 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } static doApplyDeserialize = function() { - if(!ds_map_exists(load_map, "surface")) return; - var buff = buffer_base64_decode(load_map[? "surface"]); + if(!struct_has(load_map, "surface")) return; + var buff = buffer_base64_decode(load_map.surface); surface_buffer = buffer_decompress(buff); var _dim = inputs[| 0].getValue(); diff --git a/scripts/node_collection/node_collection.gml b/scripts/node_collection/node_collection.gml index 781737ee0..ffff3559f 100644 --- a/scripts/node_collection/node_collection.gml +++ b/scripts/node_collection/node_collection.gml @@ -74,11 +74,11 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc metadata = new MetaDataManager(); - attributes[? "Separator"] = []; - attributes[? "w"] = 128; - attributes[? "h"] = 128; + attributes.separator = []; + attributes.w = 128; + attributes.h = 128; - array_push(attributeEditors, ["Edit separator", "Separator", + array_push(attributeEditors, ["Edit separator", "separator", button(function() { var dia = dialogCall(o_dialog_group_input_order); dia.node = self; @@ -136,23 +136,41 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc } } + static getOutputNodes = function() { + var nodes = []; + for( var i = custom_output_index; i < ds_list_size(outputs); i++ ) { + var _junc = outputs[| i]; + + for( var j = 0; j < ds_list_size(_junc.value_to); j++ ) { + var _to = _junc.value_to[| j]; + if(_to.value_from != _junc) continue; + array_push_unique(nodes, _to.node); + } + } + return nodes; + } + static getNextNodes = function() { //get node inside the group LOG_BLOCK_START(); LOG_IF(global.FLAG.render, $"→→→→→ Call get next node from group"); - var allReady = true; - for(var i = custom_input_index; i < ds_list_size(inputs); i++) { - var _in = inputs[| i].from; - if(!_in.renderActive) continue; + var nodes = []; + if(renderActive) { + var allReady = true; + for(var i = custom_input_index; i < ds_list_size(inputs); i++) { + var _in = inputs[| i].from; + if(!_in.renderActive) continue; - if(!_in.isRenderable()) { - LOG_IF(global.FLAG.render, $"Node {_in.internalName} not ready, loop skip."); - LOG_BLOCK_END(); - return []; + if(!_in.isRenderable()) { + LOG_IF(global.FLAG.render, $"Node {_in.internalName} not ready, loop skip."); + LOG_BLOCK_END(); + return []; + } } + + nodes = __nodeLeafList(getNodeList()); } - var nodes = __nodeLeafList(getNodeList()); LOG_BLOCK_END(); return nodes; } @@ -186,7 +204,7 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc var siz = ds_list_size(outputs); for( var i = custom_output_index; i < siz; i++ ) { var _o = outputs[| i]; - if(_o.node.rendered) continue; + if(_o.from.rendered) continue; rendered = false; break; @@ -282,11 +300,18 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc render_time += node_list[| i].render_time; } - w = attributes[? "w"]; + w = attributes.w; onStep(); } + static triggerCheck = function() { + _triggerCheck(); + var node_list = getNodeList(); + for(var i = 0; i < ds_list_size(node_list); i++) + node_list[| i].triggerCheck(); + } + static onStep = function() {} PATCH_STATIC @@ -306,7 +331,7 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc static sortIO = function() { input_display_list = []; - var sep = attributes[? "Separator"]; + var sep = attributes.separator; array_sort(sep, function(a0, a1) { return a0[0] - a1[0]; }); var siz = ds_list_size(inputs); var ar = ds_priority_create(); @@ -427,25 +452,25 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc } static preConnect = function() { - instanceBase = GetAppendID(ds_map_try_get(load_map, "instance_base", noone)); + instanceBase = GetAppendID(struct_try_get(load_map, "instance_base", noone)); sortIO(); applyDeserialize(); } static attributeSerialize = function() { - var att = ds_map_create(); - att[? "Separator"] = json_stringify(attributes[? "Separator"]); - att[? "w"] = attributes[? "w"]; - att[? "h"] = attributes[? "h"]; + var att = {}; + att.separator = json_stringify(attributes.separator); + att.w = attributes.w; + att.h = attributes.h; return att; } static attributeDeserialize = function(attr) { - if(ds_map_exists(attr, "Separator")) - attributes[? "Separator"] = json_parse(attr[? "Separator"]); - attributes[? "w"] = ds_map_try_get(attr, "w", 128); - attributes[? "h"] = ds_map_try_get(attr, "h", 128); + if(struct_has(attr, "separator")) + attributes.separator = json_parse(attr.separator); + attributes.w = attr.w; + attributes.h = attr.h; } } \ No newline at end of file diff --git a/scripts/node_composite/node_composite.gml b/scripts/node_composite/node_composite.gml index b6c5c9626..ed16dbe90 100644 --- a/scripts/node_composite/node_composite.gml +++ b/scripts/node_composite/node_composite.gml @@ -36,8 +36,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) input_fix_len = ds_list_size(inputs); data_length = 4; - attributes[? "layer_visible"] = ds_list_create(); - attributes[? "layer_selectable"] = ds_list_create(); + attributes.layer_visible = []; + attributes.layer_selectable = []; hold_visibility = true; hold_select = true; @@ -52,8 +52,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) layer_renderer.h = _h; draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, _h, COLORS.node_composite_bg_blend, 1); - var _vis = attributes[? "layer_visible"]; - var _sel = attributes[? "layer_selectable"]; + var _vis = attributes.layer_visible; + var _sel = attributes.layer_selectable; var ly = _y + 8; var ssh = lh - 6; var hoverIndex = noone; @@ -81,8 +81,8 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) if(!is_surface(_surf)) continue; var aa = (ind != layer_dragging || layer_dragging == noone)? 1 : 0.5; - var vis = _vis[| ind]; - var sel = _sel[| ind]; + var vis = _vis[ind]; + var sel = _sel[ind]; var hover = point_in_rectangle(_m[0], _m[1], _x, _cy, _x + _w, _cy + lh); draw_set_color(COLORS.node_composite_separator); @@ -93,10 +93,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) draw_sprite_ui_uniform(THEME.junc_visible, vis, _bx, _cy + lh / 2, 1, c_white); if(mouse_press(mb_left, _focus)) - hold_visibility = !_vis[| ind]; + hold_visibility = !_vis[ind]; - if(mouse_click(mb_left, _focus) && _vis[| ind] != hold_visibility) { - _vis[| ind] = hold_visibility; + if(mouse_click(mb_left, _focus) && _vis[ind] != hold_visibility) { + _vis[@ ind] = hold_visibility; doUpdate(); } } else @@ -107,10 +107,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) draw_sprite_ui_uniform(THEME.cursor_select, sel, _bx, _cy + lh / 2, 1, c_white); if(mouse_press(mb_left, _focus)) - hold_select = !_sel[| ind]; + hold_select = !_sel[ind]; - if(mouse_click(mb_left, _focus) && _sel[| ind] != hold_select) - _sel[| ind] = hold_select; + if(mouse_click(mb_left, _focus) && _sel[ind] != hold_select) + _sel[@ ind] = hold_select; } else draw_sprite_ui_uniform(THEME.cursor_select, sel, _bx, _cy + lh / 2, 1, COLORS._main_icon, 0.5 + 0.5 * sel); @@ -158,17 +158,17 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) if(layer_dragging != hoverIndex && hoverIndex != noone) { var index = input_fix_len + layer_dragging * data_length; var targt = input_fix_len + hoverIndex * data_length; - var _vis = attributes[? "layer_visible"]; - var _sel = attributes[? "layer_selectable"]; + var _vis = attributes.layer_visible; + var _sel = attributes.layer_selectable; var ext = []; - var vis = _vis[| layer_dragging]; - ds_list_delete(_vis, layer_dragging); - ds_list_insert(_vis, hoverIndex, vis); + var vis = _vis[layer_dragging]; + array_delete(_vis, layer_dragging, 1); + array_insert(_vis, hoverIndex, vis); - var sel = _sel[| layer_dragging]; - ds_list_delete(_sel, layer_dragging); - ds_list_insert(_sel, hoverIndex, sel); + var sel = _sel[layer_dragging]; + array_delete(_sel, layer_dragging, 1); + array_insert(_sel, hoverIndex, sel); for( var i = 0; i < data_length; i++ ) { ext[i] = inputs[| index]; @@ -181,6 +181,7 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) doUpdate(); } + layer_dragging = noone; } @@ -233,10 +234,10 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) array_push(input_display_list, index + 2); array_push(input_display_list, index + 3); - while(_s >= ds_list_size(attributes[? "layer_visible"])) - ds_list_add(attributes[? "layer_visible"], true); - while(_s >= ds_list_size(attributes[? "layer_selectable"])) - ds_list_add(attributes[? "layer_selectable"], true); + while(_s >= array_length(attributes.layer_visible)) + array_push(attributes.layer_visible, true); + while(_s >= array_length(attributes.layer_selectable)) + array_push(attributes.layer_selectable, true); } if(!LOADING && !APPENDING) createNewSurface(); @@ -572,16 +573,16 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var hovering = -1; var hovering_type = 0; - var _vis = attributes[? "layer_visible"]; - var _sel = attributes[? "layer_selectable"]; + var _vis = attributes.layer_visible; + var _sel = attributes.layer_selectable; var amo = (ds_list_size(inputs) - input_fix_len) / data_length; if(array_length(current_data) < input_fix_len + amo * data_length) return; for(var i = 0; i < amo; i++) { - var vis = _vis[| i]; - var sel = _sel[| i]; + var vis = _vis[i]; + var sel = _sel[i]; if(!vis) continue; var index = input_fix_len + i * data_length; @@ -770,12 +771,12 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var res_index = 0, bg = 0; var imageAmo = (ds_list_size(inputs) - input_fix_len) / data_length; - var _vis = attributes[? "layer_visible"]; + var _vis = attributes.layer_visible; surface_set_shader(_outSurf, sh_sample, true, BLEND.alphamulp); for(var i = 0; i < imageAmo; i++) { - var vis = _vis[| i]; + var vis = _vis[i]; if(!vis) continue; var startDataIndex = input_fix_len + i * data_length; @@ -807,26 +808,26 @@ function Node_Composite(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewSurface(); } static attributeSerialize = function() { - var att = ds_map_create(); - ds_map_add_list(att, "layer_visible", ds_list_clone(attributes[? "layer_visible"])); - ds_map_add_list(att, "layer_selectable", ds_list_clone(attributes[? "layer_selectable"])); + var att = {}; + att.layer_visible = attributes.layer_visible; + att.layer_selectable = attributes.layer_selectable; return att; } static attributeDeserialize = function(attr) { - if(ds_map_exists(attr, "layer_visible")) - attributes[? "layer_visible"] = ds_list_clone(attr[? "layer_visible"], true); + if(struct_has(attr, "layer_visible")) + attributes.layer_visible = attr.layer_visible; - if(ds_map_exists(attr, "layer_selectable")) - attributes[? "layer_selectable"] = ds_list_clone(attr[? "layer_selectable"], true); + if(struct_has(attr, "layer_selectable")) + attributes.layer_selectable = attr.layer_selectable; } } diff --git a/scripts/node_convolution/node_convolution.gml b/scripts/node_convolution/node_convolution.gml index 96573f8f0..cc8b4a114 100644 --- a/scripts/node_convolution/node_convolution.gml +++ b/scripts/node_convolution/node_convolution.gml @@ -34,7 +34,7 @@ function Node_Convolution(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou static process_data = function(_outSurf, _data, _output_index, _array_index) { var _ker = _data[1]; - var _sam = ds_map_try_get(attributes, "oversample"); + var _sam = struct_try_get(attributes, "oversample"); surface_set_target(_outSurf); DRAW_CLEAR diff --git a/scripts/node_crop_content/node_crop_content.gml b/scripts/node_crop_content/node_crop_content.gml index c755001b5..a594897bb 100644 --- a/scripts/node_crop_content/node_crop_content.gml +++ b/scripts/node_crop_content/node_crop_content.gml @@ -25,69 +25,69 @@ function Node_Crop_Content(_x, _y, _group = noone) : Node(_x, _y, _group) constr drag_my = 0; drag_sv = 0; - temp_surface = [ surface_create(1, 1), surface_create(1, 1) ]; + temp_surface = [ surface_create(1, 1, surface_r32float) ]; - static findBoundary = function(surface) { - if(!is_surface(surface)) return [ 0, 0, 0, 0 ]; + //static findBoundary = function(surface) { + // if(!is_surface(surface)) return [ 0, 0, 0, 0 ]; - var _w = surface_get_width(surface); - var _h = surface_get_height(surface); + // var _w = surface_get_width(surface); + // var _h = surface_get_height(surface); - var s = surface_create(_w, _h, surface_r8unorm); - surface_set_target(s); - DRAW_CLEAR - draw_surface_safe(surface, 0, 0); - surface_reset_target(); + // var s = surface_create(_w, _h, surface_r8unorm); + // surface_set_target(s); + // DRAW_CLEAR + // draw_surface_safe(surface, 0, 0); + // surface_reset_target(); - var buff = buffer_create(_w * _h, buffer_fast, 1); - buffer_get_surface(buff, s, 0); + // var buff = buffer_create(_w * _h, buffer_fast, 1); + // buffer_get_surface(buff, s, 0); - var top = 0; - for( var i = top; i < _h; i++ ) - for( var j = 0; j < _w; j++ ) { - var col = buffer_read_at(buff, i * _w + j, buffer_u8); - if(col > 0) { - top = i; - i = _h; - break; - } - } + // var top = 0; + // for( var i = top; i < _h; i++ ) + // for( var j = 0; j < _w; j++ ) { + // var col = buffer_read_at(buff, i * _w + j, buffer_u8); + // if(col > 0) { + // top = i; + // i = _h; + // break; + // } + // } - var bottom = _h; - for( var i = bottom; i >= top; i-- ) - for( var j = 0; j < _w; j++ ) { - var col = buffer_read_at(buff, i * _w + j, buffer_u8); - if(col > 0) { - bottom = i; - i = 0; - break; - } - } + // var bottom = _h; + // for( var i = bottom; i >= top; i-- ) + // for( var j = 0; j < _w; j++ ) { + // var col = buffer_read_at(buff, i * _w + j, buffer_u8); + // if(col > 0) { + // bottom = i; + // i = 0; + // break; + // } + // } - var left = 0; - for( var j = 0; j < _w; j++ ) - for( var i = top; i < bottom; i++ ) { - var col = buffer_read_at(buff, i * _w + j, buffer_u8); - if(col > 0) { - left = j; - j = _w; - break; - } - } + // var left = 0; + // for( var j = 0; j < _w; j++ ) + // for( var i = top; i < bottom; i++ ) { + // var col = buffer_read_at(buff, i * _w + j, buffer_u8); + // if(col > 0) { + // left = j; + // j = _w; + // break; + // } + // } - var right = 0; - for( var j = _w; j >= left; j-- ) - for( var i = top; i < bottom; i++ ) { - var col = buffer_read_at(buff, i * _w + j, buffer_u8); - if(col > 0) { - right = j; - j = 0; - break; - } - } + // var right = 0; + // for( var j = _w; j >= left; j-- ) + // for( var i = top; i < bottom; i++ ) { + // var col = buffer_read_at(buff, i * _w + j, buffer_u8); + // if(col > 0) { + // right = j; + // j = 0; + // break; + // } + // } - return [ left, top, right + 1, bottom + 1 ]; - } + // return [ left, top, right + 1, bottom + 1 ]; + //} static update = function() { var _inSurf = inputs[| 0].getValue(); @@ -124,38 +124,35 @@ function Node_Crop_Content(_x, _y, _group = noone) : Node(_x, _y, _group) constr draw_surface_safe(_surf, 0, 0); surface_reset_target(); - var _minx, _miny, _maxx, _maxy; - - for( var i = 0; i < array_length(temp_surface); i++ ) { - temp_surface[i] = surface_verify(temp_surface[i], 1, 1, cDep); + var _minx = 0, _miny = 0, _maxx = _dim[0], _maxy = _dim[1]; + temp_surface[0] = surface_verify(temp_surface[0], 1, 1, surface_r32float); - shader_set(sh_find_boundary); - shader_set_f("dimension", _dim); + shader_set(sh_find_boundary); + shader_set_f("dimension", _dim); + shader_set_surface("texture", s); + + for( var i = 0; i < 4; i++ ) { shader_set_i("mode", i); - if(i) shader_set_f("minn", [ _minx, _miny ]); - shader_set_surface("texture", s); + shader_set_f("bbox", [ _minx, _miny, _maxx, _maxy ]); - surface_set_target(temp_surface[i]); + surface_set_target(temp_surface[0]); DRAW_CLEAR BLEND_OVERRIDE; draw_surface(s, 0, 0); BLEND_NORMAL; surface_reset_target(); - shader_reset(); - if(i == 0) { - var minBox = surface_get_pixel_ext(temp_surface[0] , 0, 0); - _minx = max(0, color_get_red(minBox) * 256 + color_get_green(minBox)); - _miny = max(0, color_get_blue(minBox) * 256 + color_get_alpha(minBox)); + switch(i) { + case 0 : _minx = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255); break; + case 1 : _miny = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255); break; + case 2 : _maxx = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255) + 1; break; + case 3 : _maxy = round(surface_get_pixel_ext(temp_surface[0], 0, 0) / 255) + 1; break; } } + shader_reset(); surface_free(s); - var maxBox = surface_get_pixel_ext(temp_surface[1], 0, 0); - _maxx = color_get_red(maxBox) * 256 + color_get_green(maxBox) + 1; - _maxy = color_get_blue(maxBox) * 256 + color_get_alpha(maxBox) + 1; - if(_array == 0) { minx = min(minx, _minx); miny = min(miny, _miny); diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 4b88cfb97..3df379629 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -59,7 +59,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x inspector_display_list = -1; is_dynamic_output = false; - attributes = ds_map_create(); + attributes = {}; attributeEditors = []; inspectInput1 = nodeValue("Toggle execution", self, JUNCTION_CONNECT.input, VALUE_TYPE.action, false).setVisible(true, true); @@ -188,11 +188,14 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x h = max(min_h, (preview_surface && previewable)? 128 : 0, _hi, _ho); } + onSetDisplayName = noone; static setDisplayName = function(_name) { display_name = _name; internalName = string_replace_all(display_name, " ", "_"); - refreshNodeMap(); + + if(onSetDisplayName != noone) + onSetDisplayName(); } static getOutput = function(junc = noone) { @@ -292,12 +295,35 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static doStepBegin = function() {} static triggerCheck = function() { + _triggerCheck(); + } + + static _triggerCheck = function() { for( var i = 0; i < ds_list_size(inputs); i++ ) { if(inputs[| i].type != VALUE_TYPE.trigger) continue; if(!is_instanceof(inputs[| i].editWidget, buttonClass)) continue; var trig = inputs[| i].getValue(); - if(trig) inputs[| i].editWidget.onClick(); + if(trig) { + inputs[| i].editWidget.onClick(); + inputs[| i].setValue(false); + } + } + + if(hasInspector1Update()) { + var trig = inspectInput1.getValue(); + if(trig) { + inspectInput1.editWidget.onClick(); + inspectInput1.setValue(false); + } + } + + if(hasInspector2Update()) { + var trig = inspectInput2.getValue(); + if(trig) { + inspectInput2.editWidget.onClick(); + inspectInput2.setValue(false); + } } } @@ -312,14 +338,6 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x LOG_BLOCK_START(); LOG_IF(global.FLAG.render, $">>>>>>>>>> DoUpdate called from {internalName} <<<<<<<<<<"); - for( var i = 0; i < ds_list_size(inputs); i++ ) { - if(inputs[| i].type != VALUE_TYPE.trigger) continue; - if(inputs[| i].editWidget == noone) continue; - - var trg = inputs[| i].getValue(); - if(trg) inputs[| i].editWidget.onClick(); - } - try { var t = get_timer(); @@ -512,7 +530,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x var y0 = yy + 20 * draw_name + draw_padding * _s; var y1 = yy + (h - draw_padding) * _s; - return new node_bbox(x0, y0, x1, y1); + return BBOX().fromPoints(x0, y0, x1, y1); } static drawNodeName = function(xx, yy, _s) { @@ -1242,48 +1260,44 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x } static serialize = function(scale = false, preset = false) { - var _map = ds_map_create(); + var _map = {}; //print(" > Serializing: " + name); if(!preset) { - _map[? "id"] = node_id; - _map[? "render"] = renderActive; - _map[? "name"] = display_name; - _map[? "iname"] = internalName; - _map[? "x"] = x; - _map[? "y"] = y; - _map[? "type"] = instanceof(self); - _map[? "group"] = group == noone? group : group.node_id; - _map[? "preview"] = previewable; + _map.id = node_id; + _map.render = renderActive; + _map.name = display_name; + _map.iname = internalName; + _map.x = x; + _map.y = y; + _map.type = instanceof(self); + _map.group = group == noone? group : group.node_id; + _map.preview = previewable; } - ds_map_add_map(_map, "attri", attributeSerialize()); + _map.attri = attributeSerialize(); - var _inputs = ds_list_create(); + var _inputs = []; for(var i = 0; i < ds_list_size(inputs); i++) - ds_list_add_map(_inputs, inputs[| i].serialize(scale, preset)); - ds_map_add_list(_map, "inputs", _inputs); + array_push(_inputs, inputs[| i].serialize(scale, preset)); + _map.inputs = _inputs; - var _outputs = ds_list_create(); + var _outputs = []; for(var i = 0; i < ds_list_size(outputs); i++) - ds_list_add_map(_outputs, outputs[| i].serialize(scale, preset)); - ds_map_add_list(_map, "outputs", _outputs); + array_push(_outputs, outputs[| i].serialize(scale, preset)); + _map.outputs = _outputs; - var _trigger = ds_list_create(); - ds_list_add_map(_trigger, inspectInput1.serialize(scale, preset)); - ds_list_add_map(_trigger, inspectInput2.serialize(scale, preset)); - ds_map_add_list(_map, "inspectInputs", _trigger); + var _trigger = []; + array_push(_trigger, inspectInput1.serialize(scale, preset)); + array_push(_trigger, inspectInput2.serialize(scale, preset)); + _map.inspectInputs = _trigger; doSerialize(_map); processSerialize(_map); return _map; } - static attributeSerialize = function() { - var att = ds_map_create(); - ds_map_override(att, attributes); - return att; - } + static attributeSerialize = function() { return attributes; } static doSerialize = function(_map) {} static processSerialize = function(_map) {} @@ -1294,28 +1308,26 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x load_scale = scale; if(!preset) { - if(APPENDING) - APPEND_MAP[? load_map[? "id"]] = node_id; - else - node_id = ds_map_try_get(load_map, "id"); - + if(APPENDING) APPEND_MAP[? load_map.id] = node_id; + else node_id = load_map.id; + NODE_MAP[? node_id] = self; - if(ds_map_exists(load_map, "name")) - setDisplayName(ds_map_try_get(load_map, "name", "")); + if(struct_has(load_map, "name")) + setDisplayName(load_map.name); - internalName = ds_map_try_get(load_map, "iname", internalName); - _group = ds_map_try_get(load_map, "group", noone); + internalName = struct_try_get(load_map, "iname", internalName); + _group = struct_try_get(load_map, "group", noone); if(_group == -1) _group = noone; - x = ds_map_try_get(load_map, "x"); - y = ds_map_try_get(load_map, "y"); - renderActive = ds_map_try_get(load_map, "render", true); - previewable = ds_map_try_get(load_map, "preview", previewable); + x = struct_try_get(load_map, "x"); + y = struct_try_get(load_map, "y"); + renderActive = struct_try_get(load_map, "render", true); + previewable = struct_try_get(load_map, "preview", previewable); } - if(ds_map_exists(load_map, "attri")) - attributeDeserialize(load_map[? "attri"]); + if(struct_has(load_map, "attri")) + attributeDeserialize(load_map.attri); doDeserialize(); processDeserialize(); @@ -1331,33 +1343,33 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static doDeserialize = function() {} static attributeDeserialize = function(attr) { - ds_map_override(attributes, attr); + struct_override(attributes, attr); } static postDeserialize = function() {} static processDeserialize = function() {} static applyDeserialize = function(preset = false) { - var _inputs = load_map[? "inputs"]; - var amo = min(ds_list_size(inputs), ds_list_size(_inputs)); + var _inputs = load_map.inputs; + var amo = min(ds_list_size(inputs), array_length(_inputs)); for(var i = 0; i < amo; i++) { if(inputs[| i] == noone) continue; - inputs[| i].applyDeserialize(_inputs[| i], load_scale, preset); + inputs[| i].applyDeserialize(_inputs[i], load_scale, preset); } - if(ds_map_exists(load_map, "outputs")) { - var _outputs = load_map[? "outputs"]; + if(struct_has(load_map, "outputs")) { + var _outputs = load_map.outputs; for(var i = 0; i < ds_list_size(outputs); i++) { if(outputs[| i] == noone) continue; - outputs[| i].applyDeserialize(_outputs[| i], load_scale, preset); + outputs[| i].applyDeserialize(_outputs[i], load_scale, preset); } } - if(ds_map_exists(load_map, "inspectInputs")) { - var insInp = load_map[? "inspectInputs"]; - inspectInput1.applyDeserialize(insInp[| 0], load_scale, preset); - inspectInput2.applyDeserialize(insInp[| 1], load_scale, preset); + if(struct_has(load_map, "inspectInputs")) { + var insInp = load_map.inspectInputs; + inspectInput1.applyDeserialize(insInp[0], load_scale, preset); + inspectInput2.applyDeserialize(insInp[1], load_scale, preset); } doApplyDeserialize(); @@ -1386,7 +1398,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x for(var i = 0; i < ds_list_size(inputs); i++) connected &= inputs[| i].connect(log); - if(ds_map_exists(load_map, "inspectInputs")) { + if(struct_has(load_map, "inspectInputs")) { inspectInput1.connect(log); inspectInput2.connect(log); } @@ -1413,8 +1425,6 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x ds_map_destroy(inputMap); ds_map_destroy(outputMap); - ds_map_destroy(attributes); - for( var i = 0; i < array_length(temp_surface); i++ ) surface_free(temp_surface[i]); @@ -1425,8 +1435,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x // helper function static attrDepth = function() { - if(ds_map_exists(attributes, "color_depth")) { - var form = attributes[? "color_depth"]; + if(struct_has(attributes, "color_depth")) { + var form = attributes.color_depth; if(inputs[| 0].type == VALUE_TYPE.surface) form--; if(form >= 0) diff --git a/scripts/node_dilate/node_dilate.gml b/scripts/node_dilate/node_dilate.gml index 31d04b89b..df0b285d1 100644 --- a/scripts/node_dilate/node_dilate.gml +++ b/scripts/node_dilate/node_dilate.gml @@ -55,7 +55,7 @@ function Node_Dilate(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co var center = _data[1]; var stren = _data[2]; var rad = _data[3]; - var sam = ds_map_try_get(attributes, "oversample"); + var sam = struct_try_get(attributes, "oversample"); surface_set_shader(_outSurf, shader); shader_set_interpolation(_data[0]); diff --git a/scripts/node_displacement/node_displacement.gml b/scripts/node_displacement/node_displacement.gml index 1d4508cb4..9439ff019 100644 --- a/scripts/node_displacement/node_displacement.gml +++ b/scripts/node_displacement/node_displacement.gml @@ -83,7 +83,7 @@ If set, then strength value control how many times the effect applies on itself. shader_set_uniform_f(uniform_mid, _data[4]); shader_set_uniform_i(uniform_rg, _data[5]); shader_set_uniform_i(uniform_it, _data[6]); - shader_set_uniform_i(uniform_sam, ds_map_try_get(attributes, "oversample")); + shader_set_uniform_i(uniform_sam, struct_try_get(attributes, "oversample")); draw_surface_safe(_data[0], 0, 0); surface_reset_shader(); diff --git a/scripts/node_edge_detect/node_edge_detect.gml b/scripts/node_edge_detect/node_edge_detect.gml index 24e4126ad..2e3d2138a 100644 --- a/scripts/node_edge_detect/node_edge_detect.gml +++ b/scripts/node_edge_detect/node_edge_detect.gml @@ -34,7 +34,7 @@ function Node_Edge_Detect(_x, _y, _group = noone) : Node_Processor(_x, _y, _grou static process_data = function(_outSurf, _data, _output_index, _array_index) { var ft = _data[1]; - var ov = ds_map_try_get(attributes, "oversample"); + var ov = struct_try_get(attributes, "oversample"); surface_set_target(_outSurf); DRAW_CLEAR diff --git a/scripts/node_equation/node_equation.gml b/scripts/node_equation/node_equation.gml index bfa79055f..7ff38cf90 100644 --- a/scripts/node_equation/node_equation.gml +++ b/scripts/node_equation/node_equation.gml @@ -164,9 +164,9 @@ function Node_Equation(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_flood_fill/node_flood_fill.gml b/scripts/node_flood_fill/node_flood_fill.gml index 5213272e2..f488d21f7 100644 --- a/scripts/node_flood_fill/node_flood_fill.gml +++ b/scripts/node_flood_fill/node_flood_fill.gml @@ -33,11 +33,11 @@ function Node_Flood_Fill(_x, _y, _group = noone) : Node_Processor(_x, _y, _group attribute_surface_depth(); - attributes[? "fill_iteration"] = -1; + attributes.fill_iteration = -1; array_push(attributeEditors, "Algorithm"); array_push(attributeEditors, ["Fill iteration", "fill_iteration", new textBox(TEXTBOX_INPUT.number, function(val) { - attributes[? "fill_iteration"] = val; + attributes.fill_iteration = val; triggerRender(); })]); @@ -80,7 +80,7 @@ function Node_Flood_Fill(_x, _y, _group = noone) : Node_Processor(_x, _y, _group surface_reset_target(); var ind = 0; - var it = attributes[? "fill_iteration"] == -1? sw + sh : attributes[? "fill_iteration"]; + var it = attributes.fill_iteration == -1? sw + sh : attributes.fill_iteration; repeat(it) { ind = !ind; diff --git a/scripts/node_fluid_domain_queue/node_fluid_domain_queue.gml b/scripts/node_fluid_domain_queue/node_fluid_domain_queue.gml index 3cf6638a5..edff9d78b 100644 --- a/scripts/node_fluid_domain_queue/node_fluid_domain_queue.gml +++ b/scripts/node_fluid_domain_queue/node_fluid_domain_queue.gml @@ -50,9 +50,9 @@ function Node_Fluid_Domain_Queue(_x, _y, _group = noone) : Node_Fluid(_x, _y, _g } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = 0; i < ds_list_size(_inputs); i++) + for(var i = 0; i < array_length(_inputs); i++) createNewInput(); } diff --git a/scripts/node_functions/node_functions.gml b/scripts/node_functions/node_functions.gml index fe8dd91be..6816e70d7 100644 --- a/scripts/node_functions/node_functions.gml +++ b/scripts/node_functions/node_functions.gml @@ -137,7 +137,7 @@ #endregion #region utilities - function previewWindow(node) { + function create_preview_window(node) { if(node == noone) return; var win = new Panel_Preview_Window(); win.node_target = node; diff --git a/scripts/node_global/node_global.gml b/scripts/node_global/node_global.gml index d2ac72367..843dd3923 100644 --- a/scripts/node_global/node_global.gml +++ b/scripts/node_global/node_global.gml @@ -238,41 +238,39 @@ function Node_Global(_x = 0, _y = 0) : __Node_Base(_x, _y) constructor { } static serialize = function() { - var _map = ds_map_create(); + var _map = {}; - var _inputs = ds_list_create(); + var _inputs = []; for(var i = 0; i < ds_list_size(inputs); i++) { var _ser = inputs[| i].serialize(); - _ser[? "global_type"] = inputs[| i].editor.type_index; - _ser[? "global_disp"] = inputs[| i].editor.disp_index; - _ser[? "global_name"] = inputs[| i].editor.value_name; - _ser[? "global_s_range"] = ds_list_create_from_array(inputs[| i].editor.slider_range); - _ser[? "global_s_step "] = inputs[| i].editor.slider_step; + _ser.global_type = inputs[| i].editor.type_index; + _ser.global_disp = inputs[| i].editor.disp_index; + _ser.global_name = inputs[| i].editor.value_name; + _ser.global_s_range = inputs[| i].editor.slider_range; + _ser.global_s_step = inputs[| i].editor.slider_step; - ds_list_add(_inputs, _ser); - ds_list_mark_as_map(_inputs, i); + array_push(_inputs, _ser); } - ds_map_add_list(_map, "inputs", _inputs); - + _map.inputs = _inputs; return _map; } static deserialize = function(_map) { - var _inputs = _map[? "inputs"]; + var _inputs = _map.inputs; - for(var i = 0; i < ds_list_size(_inputs); i++) { - var _des = _inputs[| i]; + for(var i = 0; i < array_length(_inputs); i++) { + var _des = _inputs[i]; var _in = createValue(); - _in.editor.type_index = ds_map_try_get(_des, "global_type", 0); - _in.editor.disp_index = ds_map_try_get(_des, "global_disp", 0); - _in.editor.disp_index = ds_map_try_get(_des, "global_disp", 0); - _in.editor.value_name = ds_map_try_get(_des, "global_name", ""); + _in.editor.type_index = struct_try_get(_des, "global_type", 0); + _in.editor.disp_index = struct_try_get(_des, "global_disp", 0); + _in.editor.disp_index = struct_try_get(_des, "global_disp", 0); + _in.editor.value_name = struct_try_get(_des, "global_name", ""); - _in.editor.slider_range = array_create_from_list(ds_map_try_get(_des, "global_s_range", [ 0, 0 ])); - _in.editor.slider_step = ds_map_try_get(_des, "global_s_step", 0.01); + _in.editor.slider_range = _des.global_s_range; + _in.editor.slider_step = struct_try_get(_des, "global_s_step", 0.01); _in.editor.refreshInput(); diff --git a/scripts/node_group_input/node_group_input.gml b/scripts/node_group_input/node_group_input.gml index 058c0aa33..9e9940be5 100644 --- a/scripts/node_group_input/node_group_input.gml +++ b/scripts/node_group_input/node_group_input.gml @@ -12,6 +12,18 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru h = 32 + 24; min_h = h; + data_type_list = [ "Integer", "Float", "Boolean", "Color", "Surface", + "File Path", "Curve", "Text", "Object", "Node", + "3D object", "Any", "Path", "Particle", "Rigidbody Object", + "Fluid Domain", "Struct", "Strands", "Mesh", "Trigger" + ]; + + data_type_map = [ VALUE_TYPE.integer, VALUE_TYPE.float, VALUE_TYPE.boolean, VALUE_TYPE.color, VALUE_TYPE.surface, + VALUE_TYPE.path, VALUE_TYPE.curve, VALUE_TYPE.text, VALUE_TYPE.object, VALUE_TYPE.node, + VALUE_TYPE.d3object, VALUE_TYPE.any, VALUE_TYPE.pathnode, VALUE_TYPE.particle, VALUE_TYPE.rigid, + VALUE_TYPE.fdomain, VALUE_TYPE.struct, VALUE_TYPE.strands, VALUE_TYPE.mesh, VALUE_TYPE.trigger + ]; + display_list = [ /*Integer*/ [ "Default", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area", "Enum button", "Menu scroll" ], /*Float*/ [ "Default", "Range", "Rotation", "Rotation range", "Slider", "Slider range", "Padding", "Vector", "Vector range", "Area" ], @@ -32,6 +44,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru /*Struct*/ [ "Default", ], /*Strand*/ [ "Default", ], /*Mesh*/ [ "Default", ], + /*Trigger*/ [ "Default", ], ]; inputs[| 0] = nodeValue("Display type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) @@ -45,8 +58,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru .rejectArray(); inputs[| 2] = nodeValue("Input type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) - .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Integer", "Float", "Boolean", "Color", "Surface", "File Path", "Curve", "Text", "Object", "Node", - "3D object", "Any", "Path", "Particle", "Rigidbody Object", "Fluid Domain", "Struct", "Strands", "Mesh" ], { update_hover: false }) + .setDisplay(VALUE_DISPLAY.enum_scroll, data_type_list, { update_hover: false }) .rejectArray(); inputs[| 2].editWidget.update_hover = false; @@ -68,14 +80,25 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru inputs[| 7] = nodeValue("Step", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.01) .setVisible(false) .rejectArray(); + + inputs[| 8] = nodeValue("Button Label", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "Trigger") + .setVisible(false) + .rejectArray(); input_display_list = [ ["Display", false], 5, 6, - ["Data", false], 2, 0, 4, 1, 7, 3, + ["Data", false], 2, 0, 4, 1, 7, 3, 8, ]; outputs[| 0] = nodeValue("Value", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0); + attributes.inherit_name = true; + doTrigger = 0; + + _onSetDisplayName = function() { + attributes.inherit_name = false; + } + static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { if(inParent.isArray()) return; inParent.drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); @@ -86,7 +109,8 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru var _dtype = inputs[| 0].getValue(); var _range = inputs[| 1].getValue(); - var _val_type = inputs[| 2].getValue(); + var _type = inputs[| 2].getValue(); + var _val_type = data_type_map[_type]; var _enum_label = inputs[| 3].getValue(); var _vec_size = inputs[| 4].getValue(); var _step = inputs[| 7].getValue(); @@ -176,14 +200,24 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru inParent.setDisplay(VALUE_DISPLAY.palette); break; - case "Gradient": + case "Gradient": inParent.type = VALUE_TYPE.gradient; outputs[| 0].type = inParent.type; inParent.animator = new valueAnimator(new gradientObject(c_white), inParent); inParent.setDisplay(VALUE_DISPLAY._default); break; - default: inParent.setDisplay(VALUE_DISPLAY._default); break; + + default: + inParent.setDisplay(VALUE_DISPLAY._default); + break; + } + + switch(_val_type) { + case VALUE_TYPE.trigger : + var bname = inputs[| 8].getValue(); + inParent.setDisplay(VALUE_DISPLAY.button, [ function() { doTrigger = 1; }, bname]); + break; } if(index == 5) @@ -192,7 +226,7 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru static createInput = function(override_order = true) { if(group == noone || !is_struct(group)) return noone; - + if(override_order) { input_fix_len = ds_list_size(group.inputs); inputs[| 5].setValue(input_fix_len); @@ -229,6 +263,27 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru inParent.name = display_name; group.inputMap[? string_replace_all(display_name, " ", "_")] = inParent; } + + var _to_list = outputs[| 0].value_to; + onSetDisplayName = _onSetDisplayName; + if(attributes.inherit_name && !ds_list_empty(_to_list)) { + for( var i = 0; i < ds_list_size(_to_list); i++ ) { + if(_to_list[| i].value_from != outputs[| 0]) continue; + if(display_name == _to_list[| i].name) break; + onSetDisplayName = noone; + setDisplayName(_to_list[| i].name); + } + } + + if(inParent.type == VALUE_TYPE.trigger) { + if(doTrigger == 1) { + outputs[| 0].setValue(true); + doTrigger = -1; + } else if(doTrigger == -1) { + outputs[| 0].setValue(false); + doTrigger = 0; + } + } } PATCH_STATIC @@ -236,16 +291,19 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru static update = function(frame = ANIMATOR.current_frame) { if(is_undefined(inParent)) return; - var _dtype = inputs[| 0].getValue(); + var _dstype = inputs[| 0].getValue(); var _data = inputs[| 2].getValue(); - _dtype = display_list[_data][_dtype]; + _dstype = display_list[_data][_dstype]; + + var _datype = data_type_map[_data]; inputs[| 1].setVisible(false); inputs[| 3].setVisible(false); inputs[| 4].setVisible(false); inputs[| 7].setVisible(false); + inputs[| 8].setVisible(_datype == VALUE_TYPE.trigger); - switch(_dtype) { + switch(_dstype) { case "Slider" : case "Slider range" : inputs[| 7].setVisible(true); @@ -266,22 +324,21 @@ function Node_Group_Input(_x, _y, _group = noone) : Node(_x, _y, _group) constru static postDeserialize = function() { createInput(false); - var _inputs = load_map[? "inputs"]; - inputs[| 5].applyDeserialize(_inputs[| 5], load_scale); + var _inputs = load_map.inputs; + inputs[| 5].applyDeserialize(_inputs[5], load_scale); group.sortIO(); - inputs[| 2].applyDeserialize(_inputs[| 2], load_scale); + inputs[| 2].applyDeserialize(_inputs[2], load_scale); onValueUpdate(2); } static applyDeserialize = function() { - var _inputs = load_map[? "inputs"]; - var amo = min(ds_list_size(_inputs), ds_list_size(inputs)); + var _inputs = load_map.inputs; + var amo = min(array_length(_inputs), ds_list_size(inputs)); for(var i = 0; i < amo; i++) { if(i == 2 || i == 5) continue; - inputs[| i].applyDeserialize(_inputs[| i], load_scale); - var raw_val = _inputs[| i][? "raw value"]; + inputs[| i].applyDeserialize(_inputs[i], load_scale); } inParent.name = name; diff --git a/scripts/node_group_output/node_group_output.gml b/scripts/node_group_output/node_group_output.gml index f7410e00b..e0028ae54 100644 --- a/scripts/node_group_output/node_group_output.gml +++ b/scripts/node_group_output/node_group_output.gml @@ -15,9 +15,14 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr inputs[| 1] = nodeValue("Order", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) .rejectArray(); + attributes.inherit_name = true; outParent = undefined; output_index = -1; + _onSetDisplayName = function() { + attributes.inherit_name = false; + } + static setRenderStatus = function(result) { LOG_LINE_IF(global.FLAG.render, $"Set render status for {internalName} : {result}"); @@ -104,6 +109,14 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr outParent.type = inputs[| 0].type; outParent.display_type = inputs[| 0].display_type; + + onSetDisplayName = _onSetDisplayName; + if(attributes.inherit_name && inputs[| 0].value_from != noone) { + if(display_name != inputs[| 0].value_from.name) { + onSetDisplayName = noone; + setDisplayName(inputs[| 0].value_from.name); + } + } } //static triggerRender = function() { @@ -118,8 +131,8 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr static postDeserialize = function() { createOutput(false); - var _inputs = load_map[? "inputs"]; - inputs[| 1].applyDeserialize(_inputs[| 1], load_scale); + var _inputs = load_map.inputs; + inputs[| 1].applyDeserialize(_inputs[1], load_scale); group.sortIO(); } diff --git a/scripts/node_guide/node_guide.gml b/scripts/node_guide/node_guide.gml index bf82b61e8..4d1d030e2 100644 --- a/scripts/node_guide/node_guide.gml +++ b/scripts/node_guide/node_guide.gml @@ -37,7 +37,7 @@ function __generate_node_data() { }; _lin[i] = { - name: _b.inputs[| i].name, + name: _b.inputs[| i]._initName, tooltip: _b.inputs[| i].tooltip, }; } @@ -49,7 +49,7 @@ function __generate_node_data() { }; _lot[i] = { - name: _b.outputs[| i].name, + name: _b.outputs[| i]._initName, tooltip: _b.outputs[| i].tooltip, }; } diff --git a/scripts/node_json_file_read/node_json_file_read.gml b/scripts/node_json_file_read/node_json_file_read.gml index ea3f02c94..ed75a1698 100644 --- a/scripts/node_json_file_read/node_json_file_read.gml +++ b/scripts/node_json_file_read/node_json_file_read.gml @@ -191,9 +191,9 @@ function Node_Json_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) cons } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_json_file_write/node_json_file_write.gml b/scripts/node_json_file_write/node_json_file_write.gml index 4a8878aab..53c6ba3ce 100644 --- a/scripts/node_json_file_write/node_json_file_write.gml +++ b/scripts/node_json_file_write/node_json_file_write.gml @@ -127,9 +127,9 @@ function Node_Json_File_Write(_x, _y, _group = noone) : Node(_x, _y, _group) con } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_keyframe/node_keyframe.gml b/scripts/node_keyframe/node_keyframe.gml index 33b6a8844..3004a88ac 100644 --- a/scripts/node_keyframe/node_keyframe.gml +++ b/scripts/node_keyframe/node_keyframe.gml @@ -128,6 +128,12 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { static getValue = function(_time = ANIMATOR.current_frame) { if(prop.type == VALUE_TYPE.trigger) { + if(ds_list_size(values) == 0) + return false; + + if(!prop.is_anim) + return values[| 0].value; + for(var i = 0; i < ds_list_size(values); i++) { //Find trigger var _key = values[| i]; if(_key.time == _time) @@ -278,6 +284,11 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { static setValue = function(_val = 0, _record = true, _time = ANIMATOR.current_frame, ease_in = 0, ease_out = 0) { if(prop.type == VALUE_TYPE.trigger) { + if(!prop.is_anim) { + values[| 0] = new valueKey(0, _val, self); + return true; + } + for(var i = 0; i < ds_list_size(values); i++) { //Find trigger var _key = values[| i]; if(_key.time == _time) { @@ -344,60 +355,56 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { } static serialize = function(scale = false) { - var _list = ds_list_create(); + var _data = []; for(var i = 0; i < ds_list_size(values); i++) { - var _value_list = ds_list_create(); + var _value_list = []; if(scale) - _value_list[| 0] = values[| i].time / (ANIMATOR.frames_total - 1); + _value_list[0] = values[| i].time / (ANIMATOR.frames_total - 1); else - _value_list[| 0] = values[| i].time; + _value_list[0] = values[| i].time; var val = values[| i].value; if(prop.type == VALUE_TYPE.struct) - _value_list[| 1] = json_stringify(val); + _value_list[1] = json_stringify(val); else if(is_struct(val)) - _value_list[| 1] = val.serialize(); + _value_list[1] = val.serialize(); else if(!sep_axis && typeArray(prop.display_type) && is_array(val)) { - var __v = ds_list_create(); + var __v = []; for(var j = 0; j < array_length(val); j++) { if(is_struct(val[j]) && struct_has(val[j], "serialize")) - ds_list_add_map(__v, val[j].serialize()); + array_push(__v, val[j].serialize()); else - ds_list_add(__v, val[j]); + array_push(__v, val[j]); } - _value_list[| 1] = __v; - ds_list_mark_as_list(_value_list, 1); + _value_list[1] = __v; } else - _value_list[| 1] = values[| i].value; + _value_list[1] = values[| i].value; - _value_list[| 2] = ds_list_create_from_array(values[| i].ease_in); - ds_list_mark_as_list(_value_list, 2); - _value_list[| 3] = ds_list_create_from_array(values[| i].ease_out); - ds_list_mark_as_list(_value_list, 3); - - _value_list[| 4] = values[| i].ease_in_type; - _value_list[| 5] = values[| i].ease_out_type; + _value_list[2] = values[| i].ease_in; + _value_list[3] = values[| i].ease_out; + _value_list[4] = values[| i].ease_in_type; + _value_list[5] = values[| i].ease_out_type; - ds_list_add_list(_list, _value_list); + array_push(_data, _value_list); } - return _list; + return _data; } - static deserialize = function(_list, scale = false) { + static deserialize = function(_data, scale = false) { ds_list_clear(values); if(prop.type == VALUE_TYPE.gradient && LOADING_VERSION < 1340 && !CLONING) { //backward compat: Gradient var _val = []; - var value = _list[| 0][| 1]; + var value = _data[0][1]; - if(ds_exists(value, ds_type_list)) - for(var i = 0; i < ds_list_size(value); i++) { - var _keyframe = value[| i]; - var _t = ds_map_try_get(_keyframe, "time"); - var _v = ds_map_try_get(_keyframe, "value"); + if(is_array(value)) + for(var i = 0; i < array_length(value); i++) { + var _keyframe = value[i]; + var _t = struct_try_get(_keyframe, "time"); + var _v = struct_try_get(_keyframe, "value"); array_push(_val, new gradientKey(_t, _v)); } @@ -410,36 +417,35 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { var base = getValue(); - for(var i = 0; i < ds_list_size(_list); i++) { - var _keyframe = _list[| i]; - var _time = _keyframe[| 0]; + for(var i = 0; i < array_length(_data); i++) { + var _keyframe = _data[i]; + var _time = _keyframe[0]; if(scale && _time <= 1) _time = round(_time * (ANIMATOR.frames_total - 1)); - var value = ds_list_get(_keyframe, 1); - var ease_in = array_create_from_list(ds_list_get(_keyframe, 2)); - var ease_out = array_create_from_list(ds_list_get(_keyframe, 3)); + var value = _keyframe[1]; + var ease_in = _keyframe[2]; + var ease_out = _keyframe[3]; + var ease_in_type = _keyframe[4]; + var ease_out_type = _keyframe[5]; - var ease_in_type = ds_list_get(_keyframe, 4, CURVE_TYPE.bezier); - var ease_out_type = ds_list_get(_keyframe, 5, CURVE_TYPE.bezier); var _val = value; if(prop.type == VALUE_TYPE.struct) _val = json_parse(value); else if(prop.type == VALUE_TYPE.path && prop.display_type == VALUE_DISPLAY.path_array) { - for(var j = 0; j < ds_list_size(value); j++) - _val[j] = value[| j]; + for(var j = 0; j < array_length(value); j++) + _val[j] = value[j]; } else if(prop.type == VALUE_TYPE.gradient) { var grad = new gradientObject(); _val = grad.deserialize(value); } else if(!sep_axis && typeArray(prop.display_type)) { _val = []; - if(ds_exists(value, ds_type_list)) { - for(var j = 0; j < ds_list_size(value); j++) - _val[j] = processValue(value[| j]); - } + if(is_array(value)) + for(var j = 0; j < array_length(value); j++) + _val[j] = processValue(value[j]); } //print($"Deserialize {prop.node.name}:{prop.name} = {_val} "); diff --git a/scripts/node_local_analyze/node_local_analyze.gml b/scripts/node_local_analyze/node_local_analyze.gml index 223cc9198..ada1acb70 100644 --- a/scripts/node_local_analyze/node_local_analyze.gml +++ b/scripts/node_local_analyze/node_local_analyze.gml @@ -43,7 +43,7 @@ function Node_Local_Analyze(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr static process_data = function(_outSurf, _data, _output_index, _array_index) { var _alg = _data[1]; var _siz = _data[2]; - var _sam = ds_map_try_get(attributes, "oversample"); + var _sam = struct_try_get(attributes, "oversample"); var _shp = _data[4]; surface_set_target(_outSurf); diff --git a/scripts/node_lua_compute/node_lua_compute.gml b/scripts/node_lua_compute/node_lua_compute.gml index b399554e8..962af5b8a 100644 --- a/scripts/node_lua_compute/node_lua_compute.gml +++ b/scripts/node_lua_compute/node_lua_compute.gml @@ -236,12 +236,9 @@ function Node_Lua_Compute(_x, _y, _group = noone) : Node(_x, _y, _group) constru } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - if(LOADING_VERSION < 1380 && !CLONING) - ds_list_insert(_inputs, 4, noone); - - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_lua_surface/node_lua_surface.gml b/scripts/node_lua_surface/node_lua_surface.gml index f3cb146a3..707a71dc3 100644 --- a/scripts/node_lua_surface/node_lua_surface.gml +++ b/scripts/node_lua_surface/node_lua_surface.gml @@ -234,12 +234,9 @@ function Node_Lua_Surface(_x, _y, _group = noone) : Node(_x, _y, _group) constru } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - if(LOADING_VERSION < 1380 && !CLONING) - ds_list_insert(_inputs, 4, noone); - - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_noise_grid_hex/node_noise_grid_hex.gml b/scripts/node_noise_grid_hex/node_noise_grid_hex.gml index 186550335..af17884c9 100644 --- a/scripts/node_noise_grid_hex/node_noise_grid_hex.gml +++ b/scripts/node_noise_grid_hex/node_noise_grid_hex.gml @@ -48,7 +48,7 @@ function Node_Noise_Hex(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _pos = _data[2]; var _sca = _data[3]; var _sam = _data[4]; - var _samTyp = ds_map_try_get(attributes, "oversample"); + var _samTyp = struct_try_get(attributes, "oversample"); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); diff --git a/scripts/node_noise_grid_tri/node_noise_grid_tri.gml b/scripts/node_noise_grid_tri/node_noise_grid_tri.gml index 89c3faae0..a848a11d2 100644 --- a/scripts/node_noise_grid_tri/node_noise_grid_tri.gml +++ b/scripts/node_noise_grid_tri/node_noise_grid_tri.gml @@ -48,7 +48,7 @@ function Node_Noise_Tri(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var _pos = _data[2]; var _sca = _data[3]; var _sam = _data[4]; - var _samTyp = ds_map_try_get(attributes, "oversample"); + var _samTyp = struct_try_get(attributes, "oversample"); _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); diff --git a/scripts/node_outline/node_outline.gml b/scripts/node_outline/node_outline.gml index 844780bc9..832b76507 100644 --- a/scripts/node_outline/node_outline.gml +++ b/scripts/node_outline/node_outline.gml @@ -66,7 +66,7 @@ function Node_Outline(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) c var alpha = _data[4]; var side = _data[5]; var aa = _data[6]; - var sam = ds_map_try_get(attributes, "oversample"); + var sam = struct_try_get(attributes, "oversample"); var bst = _data[8]; surface_set_target(_outSurf); diff --git a/scripts/node_palette_extract/node_palette_extract.gml b/scripts/node_palette_extract/node_palette_extract.gml index 0b0a17fd9..d4fc110e3 100644 --- a/scripts/node_palette_extract/node_palette_extract.gml +++ b/scripts/node_palette_extract/node_palette_extract.gml @@ -307,7 +307,7 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node(_x, _y, _group) con static onValueFromUpdate = function() { extractPalettes(); } function update() { - if(attributes[? "auto_exe"]) + if(attributes.auto_exe) extractPalettes(); } diff --git a/scripts/node_particle/node_particle.gml b/scripts/node_particle/node_particle.gml index df5ef3d1e..69443da21 100644 --- a/scripts/node_particle/node_particle.gml +++ b/scripts/node_particle/node_particle.gml @@ -87,7 +87,7 @@ function Node_Particle(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y, _ var surf_w = surface_get_width(_outSurf); var surf_h = surface_get_height(_outSurf); - for(var i = 0; i < attributes[? "part_amount"]; i++) + for(var i = 0; i < attributes.part_amount; i++) parts[i].draw(_exact, surf_w, surf_h); BLEND_NORMAL; diff --git a/scripts/node_path/node_path.gml b/scripts/node_path/node_path.gml index 668c31226..4b03de126 100644 --- a/scripts/node_path/node_path.gml +++ b/scripts/node_path/node_path.gml @@ -1,3 +1,14 @@ +enum _ANCHOR { + x, + y, + c1x, + c1y, + c2x, + c2y, + + ind, +} + function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { name = "Path"; previewable = false; @@ -28,7 +39,7 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { function createAnchor(_x, _y, _dxx = 0, _dxy = 0, _dyx = 0, _dyy = 0) { var index = ds_list_size(inputs); - inputs[| index] = nodeValue("Anchor", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ _x, _y, _dxx, _dxy, _dyx, _dyy ]) + inputs[| index] = nodeValue("Anchor", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ _x, _y, _dxx, _dxy, _dyx, _dyy, false ]) .setDisplay(VALUE_DISPLAY.vector); recordAction(ACTION_TYPE.var_modify, self, [ array_clone(input_display_list), "input_display_list" ]); @@ -73,12 +84,11 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { drag_point_sy = 0; transform_type = 0; - transform_minx = 0; - transform_miny = 0; - transform_maxx = 0; - transform_maxy = 0; - transform_mx = 0; - transform_my = 0; + transform_minx = 0; transform_miny = 0; + transform_maxx = 0; transform_maxy = 0; + transform_cx = 0; transform_cy = 0; + transform_sx = 0; transform_sy = 0; + transform_mx = 0; transform_my = 0; static onValueUpdate = function(index = 0) { if(index == 2) { @@ -96,30 +106,34 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var ansize = ds_list_size(inputs) - input_fix_len; var _edited = false; - if(transform_type > 0) { - var dx = _mx - transform_mx; - var dy = _my - transform_my; - + if(transform_type > 0) { var _transform_minx = transform_minx; var _transform_miny = transform_miny; var _transform_maxx = transform_maxx; var _transform_maxy = transform_maxy; - if(transform_type == 1) { - transform_minx += dx / _s; - transform_miny += dy / _s; - } else if(transform_type == 2) { - transform_maxx += dx / _s; - transform_miny += dy / _s; - } else if(transform_type == 3) { - transform_minx += dx / _s; - transform_maxy += dy / _s; - } else if(transform_type == 4) { - transform_maxx += dx / _s; - transform_maxy += dy / _s; - } - - if(transform_type == 5) { + if(transform_type == 5) { #region move + var mx = _mx, my = _my; + + if(key_mod_press(SHIFT)) { + var dirr = point_direction(transform_sx, transform_sy, _mx, _my) + 360; + var diss = point_distance( transform_sx, transform_sy, _mx, _my); + var ang = round((dirr) / 45) * 45; + mx = transform_sx + lengthdir_x(diss, ang); + my = transform_sy + lengthdir_y(diss, ang); + } + + //var _tsx = transform_sx; + //var _tsy = transform_sy; + //draw_set_color(COLORS._main_accent); + //draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 0), _tsy + lengthdir_y(1000, 0)); + //draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 90), _tsy + lengthdir_y(1000, 90)); + //draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 180), _tsy + lengthdir_y(1000, 180)); + //draw_line(_tsx, _tsy, _tsx + lengthdir_x(1000, 270), _tsy + lengthdir_y(1000, 270)); + + var dx = mx - transform_mx; + var dy = my - transform_my; + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { var p = inputs[| i].getValue(); @@ -129,85 +143,189 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { if(inputs[| i].setValue(p)) _edited = true; } - } else { - for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { - var p = inputs[| i].getValue(); + + transform_mx = mx; + transform_my = my; + #endregion + } else { #region scale + var mx = (_mx - _x) / _s; + var my = (_my - _y) / _s; + + switch(transform_type) { + case 1 : + if(key_mod_press(SHIFT)) { + var _dx = mx - _transform_maxx; + var _dy = my - _transform_maxy; + var _dd = max(abs(_dx), abs(_dy)); + + mx = _transform_maxx + _dd * sign(_dx); + my = _transform_maxy + _dd * sign(_dy); + } + + transform_minx = mx; + transform_miny = my; + + if(key_mod_press(ALT)) { + transform_maxx = transform_cx - (mx - transform_cx); + transform_maxy = transform_cy - (my - transform_cy); + } + break; + case 2 : + if(key_mod_press(SHIFT)) { + var _dx = mx - _transform_minx; + var _dy = my - _transform_maxy; + var _dd = max(abs(_dx), abs(_dy)); + + mx = _transform_minx + _dd * sign(_dx); + my = _transform_maxy + _dd * sign(_dy); + } - p[0] = transform_minx + (p[0] - _transform_minx) / (_transform_maxx - _transform_minx) * (transform_maxx - transform_minx); - p[1] = transform_miny + (p[1] - _transform_miny) / (_transform_maxy - _transform_miny) * (transform_maxy - transform_miny); + transform_maxx = mx; + transform_miny = my; + + if(key_mod_press(ALT)) { + transform_minx = transform_cx - (mx - transform_cx); + transform_maxy = transform_cy - (my - transform_cy); + } + break; + case 3 : + if(key_mod_press(SHIFT)) { + var _dx = mx - _transform_maxx; + var _dy = my - _transform_miny; + var _dd = max(abs(_dx), abs(_dy)); + + mx = _transform_maxx + _dd * sign(_dx); + my = _transform_miny + _dd * sign(_dy); + } + + transform_minx = mx; + transform_maxy = my; + + if(key_mod_press(ALT)) { + transform_maxx = transform_cx - (mx - transform_cx); + transform_miny = transform_cy - (my - transform_cy); + } + break; + case 4 : + if(key_mod_press(SHIFT)) { + var _dx = mx - _transform_minx; + var _dy = my - _transform_miny; + var _dd = max(abs(_dx), abs(_dy)); + + mx = _transform_minx + _dd * sign(_dx); + my = _transform_miny + _dd * sign(_dy); + } + + transform_maxx = mx; + transform_maxy = my; + + if(key_mod_press(ALT)) { + transform_minx = transform_cx - (mx - transform_cx); + transform_miny = transform_cy - (my - transform_cy); + } + break; + } + + var tr_rx = transform_maxx - transform_minx; + var tr_ry = transform_maxy - transform_miny; + var _tr_rx = _transform_maxx - _transform_minx; + var _tr_ry = _transform_maxy - _transform_miny; + + for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { + var p = inputs[| i].getValue(); + + var _p2 = p[_ANCHOR.x] + p[_ANCHOR.c1x]; + var _p3 = p[_ANCHOR.y] + p[_ANCHOR.c1y]; + var _p4 = p[_ANCHOR.x] + p[_ANCHOR.c2x]; + var _p5 = p[_ANCHOR.y] + p[_ANCHOR.c2y]; + + p[_ANCHOR.x] = transform_minx + (p[_ANCHOR.x] - _transform_minx) / _tr_rx * tr_rx; + p[_ANCHOR.y] = transform_miny + (p[_ANCHOR.y] - _transform_miny) / _tr_ry * tr_ry; + + _p2 = transform_minx + (_p2 - _transform_minx) / _tr_rx * tr_rx; + _p3 = transform_miny + (_p3 - _transform_miny) / _tr_ry * tr_ry; + _p4 = transform_minx + (_p4 - _transform_minx) / _tr_rx * tr_rx; + _p5 = transform_miny + (_p5 - _transform_miny) / _tr_ry * tr_ry; + + p[_ANCHOR.c1x] = _p2 - p[_ANCHOR.x]; + p[_ANCHOR.c1y] = _p3 - p[_ANCHOR.y]; + p[_ANCHOR.c2x] = _p4 - p[_ANCHOR.x]; + p[_ANCHOR.c2y] = _p5 - p[_ANCHOR.y]; if(inputs[| i].setValue(p)) _edited = true; } + #endregion } if(_edited) UNDO_HOLDING = true; - - transform_mx = _mx; - transform_my = _my; if(mouse_release(mb_left)) { transform_type = 0; UPDATE |= RENDER_TYPE.full; UNDO_HOLDING = false; } - } else if(drag_point > -1) { + } else if(drag_point > -1) { var dx = value_snap(drag_point_sx + (_mx - drag_point_mx) / _s, _snx); var dy = value_snap(drag_point_sy + (_my - drag_point_my) / _s, _sny); - if(drag_type < 2) { + if(drag_type < 2) { #region move points var inp = inputs[| input_fix_len + drag_point]; var anc = inp.getValue(); + if(drag_type != 0 && SHIFT == KEYBOARD_STATUS.down) + anc[_ANCHOR.ind] = !anc[_ANCHOR.ind]; + if(drag_type == 0) { //drag anchor point - anc[0] = dx; - anc[1] = dy; + anc[_ANCHOR.x] = dx; + anc[_ANCHOR.y] = dy; if(key_mod_press(CTRL)) { - anc[0] = round(anc[0]); - anc[1] = round(anc[1]); + anc[_ANCHOR.x] = round(anc[0]); + anc[_ANCHOR.y] = round(anc[1]); } } else if(drag_type == 1) { //drag control 1 - anc[2] = dx - anc[0]; - anc[3] = dy - anc[1]; + anc[_ANCHOR.c1x] = dx - anc[_ANCHOR.x]; + anc[_ANCHOR.c1y] = dy - anc[_ANCHOR.y]; - if(!key_mod_press(SHIFT)) { - anc[4] = -anc[2]; - anc[5] = -anc[3]; + if(!anc[_ANCHOR.ind]) { + anc[_ANCHOR.c2x] = -anc[_ANCHOR.c1x]; + anc[_ANCHOR.c2y] = -anc[_ANCHOR.c1y]; } if(key_mod_press(CTRL)) { - anc[2] = round(anc[2]); - anc[3] = round(anc[3]); + anc[_ANCHOR.c1x] = round(anc[_ANCHOR.c1x]); + anc[_ANCHOR.c1y] = round(anc[_ANCHOR.c1y]); - if(key_mod_press(SHIFT)) { - anc[4] = round(anc[4]); - anc[5] = round(anc[5]); + if(!anc[_ANCHOR.ind]) { + anc[_ANCHOR.c2x] = round(anc[_ANCHOR.c2x]); + anc[_ANCHOR.c2y] = round(anc[_ANCHOR.c2y]); } } } else if(drag_type == -1) { //drag control 2 - anc[4] = dx - anc[0]; - anc[5] = dy - anc[1]; + anc[_ANCHOR.c2x] = dx - anc[_ANCHOR.x]; + anc[_ANCHOR.c2y] = dy - anc[_ANCHOR.y]; - if(!key_mod_press(SHIFT)) { - anc[2] = -anc[4]; - anc[3] = -anc[5]; + if(!anc[_ANCHOR.ind]) { + anc[_ANCHOR.c1x] = -anc[4]; + anc[_ANCHOR.c1y] = -anc[5]; } if(key_mod_press(CTRL)) { - anc[2] = round(anc[2]); - anc[3] = round(anc[3]); + anc[_ANCHOR.c2x] = round(anc[_ANCHOR.c2x]); + anc[_ANCHOR.c2y] = round(anc[_ANCHOR.c2y]); - if(!key_mod_press(SHIFT)) { - anc[4] = round(anc[4]); - anc[5] = round(anc[5]); + if(!anc[_ANCHOR.ind]) { + anc[_ANCHOR.c1x] = round(anc[_ANCHOR.c1x]); + anc[_ANCHOR.c1y] = round(anc[_ANCHOR.c1y]); } } } if(inp.setValue(anc)) _edited = true; - } else if(drag_type == 2) { //pen tools + #endregion + } else if(drag_type == 2) { #region pen tools var ox, oy, nx, ny; var pxx = (_mx - _x) / _s; var pxy = (_my - _y) / _s; @@ -215,11 +333,10 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { draw_set_color(COLORS._main_accent); for( var i = 0; i < array_length(drag_points); i++ ) { var _p = drag_points[i]; - nx = _x + _p[0] * _s; - ny = _y + _p[1] * _s; + nx = _x + _p[_ANCHOR.x] * _s; + ny = _y + _p[_ANCHOR.y] * _s; - if(i) - draw_line(ox, oy, nx, ny); + if(i) draw_line(ox, oy, nx, ny); ox = nx; oy = ny; @@ -282,12 +399,12 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var _p0 = drag_points[points[i - 1]]; var _p1 = drag_points[points[i + 1]]; - var d0 = point_direction(_p0[0], _p0[1], _p[0], _p[1]); - var d1 = point_direction(_p[0], _p[1], _p1[0], _p1[1]); + var d0 = point_direction(_p0[_ANCHOR.x], _p0[_ANCHOR.y], _p[_ANCHOR.x], _p[_ANCHOR.y]); + var d1 = point_direction( _p[_ANCHOR.x], _p[_ANCHOR.y], _p1[_ANCHOR.x], _p1[_ANCHOR.y]); var dd = d0 + angle_difference(d1, d0) / 2; - var ds0 = point_distance(_p0[0], _p0[1], _p[0], _p[1]); - var ds1 = point_distance(_p[0], _p[1], _p1[0], _p1[1]); + var ds0 = point_distance(_p0[_ANCHOR.x], _p0[_ANCHOR.y], _p[_ANCHOR.x], _p[_ANCHOR.y]); + var ds1 = point_distance( _p[_ANCHOR.x], _p[_ANCHOR.y], _p1[_ANCHOR.x], _p1[_ANCHOR.y]); dxx = lengthdir_x(ds0 / 3, dd + 180); dxy = lengthdir_y(ds0 / 3, dd + 180); @@ -295,9 +412,9 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { dyy = lengthdir_y(ds1 / 3, dd); } - anc = [_p[0], _p[1], dxx, dxy, dyx, dyy]; + anc = [_p[_ANCHOR.x], _p[_ANCHOR.y], dxx, dxy, dyx, dyy]; if(input_fix_len + i >= ds_list_size(inputs)) - createAnchor(_p[0], _p[1], dxx, dxy, dyx, dyy); + createAnchor(_p[_ANCHOR.x], _p[_ANCHOR.y], dxx, dxy, dyx, dyy); else inputs[| input_fix_len + i].setValue(anc); } @@ -307,7 +424,8 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { inputs[| input_fix_len + i].setValue(anc); } } - } else if(drag_type == 3) { + #endregion + } else if(drag_type == 3) { #region draw rectangle var minx = min((_mx - _x) / _s, (drag_point_mx - _x) / _s); var maxx = max((_mx - _x) / _s, (drag_point_mx - _x) / _s); var miny = min((_my - _y) / _s, (drag_point_my - _y) / _s); @@ -328,23 +446,24 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { for( var i = 0; i < 4; i++ ) a[i] = inputs[| input_fix_len + i].getValue(); - a[0][0] = minx; - a[0][1] = miny; + a[0][_ANCHOR.x] = minx; + a[0][_ANCHOR.y] = miny; - a[1][0] = maxx; - a[1][1] = miny; + a[1][_ANCHOR.x] = maxx; + a[1][_ANCHOR.y] = miny; - a[2][0] = maxx; - a[2][1] = maxy; + a[2][_ANCHOR.x] = maxx; + a[2][_ANCHOR.y] = maxy; - a[3][0] = minx; - a[3][1] = maxy; + a[3][_ANCHOR.x] = minx; + a[3][_ANCHOR.y] = maxy; for( var i = 0; i < 4; i++ ) { if(inputs[| input_fix_len + i].setValue(a[i])) _edited = true; } - } else if(drag_type == 4) { + #endregion + } else if(drag_type == 4) { #region draw circle var minx = min((_mx - _x) / _s, (drag_point_mx - _x) / _s); var maxx = max((_mx - _x) / _s, (drag_point_mx - _x) / _s); var miny = min((_my - _y) / _s, (drag_point_my - _y) / _s); @@ -365,38 +484,39 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { for( var i = 0; i < 4; i++ ) a[i] = inputs[| input_fix_len + i].getValue(); - a[0][0] = (minx + maxx) / 2; - a[0][1] = miny; - a[0][2] = -(maxx - minx) * 0.27614; - a[0][3] = 0; - a[0][4] = (maxx - minx) * 0.27614; - a[0][5] = 0; + a[0][_ANCHOR.x ] = (minx + maxx) / 2; + a[0][_ANCHOR.y ] = miny; + a[0][_ANCHOR.c1x] = -(maxx - minx) * 0.27614; + a[0][_ANCHOR.c1y] = 0; + a[0][_ANCHOR.c2x] = (maxx - minx) * 0.27614; + a[0][_ANCHOR.c2y] = 0; - a[1][0] = maxx; - a[1][1] = (miny + maxy) / 2; - a[1][2] = 0; - a[1][3] = -(maxy - miny) * 0.27614; - a[1][4] = 0; - a[1][5] = (maxy - miny) * 0.27614; + a[1][_ANCHOR.x ] = maxx; + a[1][_ANCHOR.y ] = (miny + maxy) / 2; + a[1][_ANCHOR.c1x] = 0; + a[1][_ANCHOR.c1y] = -(maxy - miny) * 0.27614; + a[1][_ANCHOR.c2x] = 0; + a[1][_ANCHOR.c2y] = (maxy - miny) * 0.27614; - a[2][0] = (minx + maxx) / 2; - a[2][1] = maxy; - a[2][2] = (maxx - minx) * 0.27614; - a[2][3] = 0; - a[2][4] = -(maxx - minx) * 0.27614; - a[2][5] = 0; + a[2][_ANCHOR.x ] = (minx + maxx) / 2; + a[2][_ANCHOR.y ] = maxy; + a[2][_ANCHOR.c1x] = (maxx - minx) * 0.27614; + a[2][_ANCHOR.c1y] = 0; + a[2][_ANCHOR.c2x] = -(maxx - minx) * 0.27614; + a[2][_ANCHOR.c2y] = 0; - a[3][0] = minx; - a[3][1] = (miny + maxy) / 2; - a[3][2] = 0; - a[3][3] = (maxy - miny) * 0.27614; - a[3][4] = 0; - a[3][5] = -(maxy - miny) * 0.27614; + a[3][_ANCHOR.x ] = minx; + a[3][_ANCHOR.y ] = (miny + maxy) / 2; + a[3][_ANCHOR.c1x] = 0; + a[3][_ANCHOR.c1y] = (maxy - miny) * 0.27614; + a[3][_ANCHOR.c2x] = 0; + a[3][_ANCHOR.c2y] = -(maxy - miny) * 0.27614; for( var i = 0; i < 4; i++ ) { if(inputs[| input_fix_len + i].setValue(a[i])) _edited = true; } + #endregion } if(_edited) UNDO_HOLDING = true; @@ -408,13 +528,13 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } } - #region draw control anchor + #region check line hover var line_hover = -1; var points = []; var _a0, _a1; - var minx = 99999, miny = 99999; - var maxx = 0 , maxy = 0; + var minx = 99999, miny = 99999; + var maxx = -99999, maxy = -99999; for(var i = loop? 0 : 1; i < ansize; i++) { if(i) { @@ -424,17 +544,21 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { _a0 = inputs[| input_fix_len + ansize - 1].getValue(); _a1 = inputs[| input_fix_len + 0].getValue(); } - + var _ox = 0, _oy = 0, _nx = 0, _ny = 0, p = 0, pnt = []; for(var j = 0; j < sample; j++) { if(array_length(_a0) < 6) continue; - p = eval_bezier(j / (sample - 1), _a0[0], _a0[1], _a1[0], _a1[1], _a0[0] + _a0[4], _a0[1] + _a0[5], _a1[0] + _a1[2], _a1[1] + _a1[3]); + p = eval_bezier(j / (sample - 1), _a0[_ANCHOR.x], _a0[_ANCHOR.y], + _a1[_ANCHOR.x], _a1[_ANCHOR.y], + _a0[_ANCHOR.x] + _a0[_ANCHOR.c2x], _a0[_ANCHOR.y] + _a0[_ANCHOR.c2y], + _a1[_ANCHOR.x] + _a1[_ANCHOR.c1x], _a1[_ANCHOR.y] + _a1[_ANCHOR.c1y]); _nx = _x + p[0] * _s; _ny = _y + p[1] * _s; - + minx = min(minx, _nx); miny = min(miny, _ny); maxx = max(maxx, _nx); maxy = max(maxy, _ny); + array_push(pnt, [ _nx, _ny ]); if(j && (key_mod_press(CTRL) || isUsingTool(1)) && distance_to_line(_mx, _my, _ox, _oy, _nx, _ny) < 4) @@ -447,72 +571,73 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { array_push(points, pnt); } #endregion - - draw_set_color(isUsingTool(0)? c_white : COLORS._main_accent); - var ind = 0; - for(var i = loop? 0 : 1; i < ansize; i++) { - for(var j = 0; j < sample; j++) { - _nx = points[ind][j][0]; - _ny = points[ind][j][1]; + #region draw path + draw_set_color(isUsingTool(0)? c_white : COLORS._main_accent); + var ind = 0; + for(var i = loop? 0 : 1; i < ansize; i++) { + for(var j = 0; j < sample; j++) { + _nx = points[ind][j][_ANCHOR.x]; + _ny = points[ind][j][_ANCHOR.y]; - if(j) draw_line_width(_ox, _oy, _nx, _ny, 1 + 2 * (line_hover == i)); + if(j) draw_line_width(_ox, _oy, _nx, _ny, 1 + 2 * (line_hover == i)); - _ox = _nx; - _oy = _ny; + _ox = _nx; + _oy = _ny; + } + + ind++; } - - ind++; - } - var anchor_hover = -1; - var hover_type = 0; + var anchor_hover = -1; + var hover_type = 0; - if(!isUsingTool(0)) - for(var i = 0; i < ansize; i++) { - var _a = inputs[| input_fix_len + i].getValue(); - var xx = _x + _a[0] * _s; - var yy = _y + _a[1] * _s; - var cont = false; - var _ax0 = 0, _ay0 = 0; - var _ax1 = 0, _ay1 = 0; + if(!isUsingTool(0)) + for(var i = 0; i < ansize; i++) { + var _a = inputs[| input_fix_len + i].getValue(); + var xx = _x + _a[0] * _s; + var yy = _y + _a[1] * _s; + var cont = false; + var _ax0 = 0, _ay0 = 0; + var _ax1 = 0, _ay1 = 0; - if(array_length(_a) < 6) continue; + if(array_length(_a) < 6) continue; - if(_a[2] != 0 || _a[3] != 0 || _a[4] != 0 || _a[5] != 0) { - _ax0 = _x + (_a[0] + _a[2]) * _s; - _ay0 = _y + (_a[1] + _a[3]) * _s; - _ax1 = _x + (_a[0] + _a[4]) * _s; - _ay1 = _y + (_a[1] + _a[5]) * _s; - cont = true; + if(_a[2] != 0 || _a[3] != 0 || _a[4] != 0 || _a[5] != 0) { + _ax0 = _x + (_a[0] + _a[2]) * _s; + _ay0 = _y + (_a[1] + _a[3]) * _s; + _ax1 = _x + (_a[0] + _a[4]) * _s; + _ay1 = _y + (_a[1] + _a[5]) * _s; + cont = true; - draw_set_color(COLORS.node_path_overlay_control_line); - draw_line(_ax0, _ay0, xx, yy); - draw_line(_ax1, _ay1, xx, yy); + draw_set_color(COLORS.node_path_overlay_control_line); + draw_line(_ax0, _ay0, xx, yy); + draw_line(_ax1, _ay1, xx, yy); - draw_sprite_colored(THEME.anchor_selector, 2, _ax0, _ay0); - draw_sprite_colored(THEME.anchor_selector, 2, _ax1, _ay1); - } + draw_sprite_colored(THEME.anchor_selector, 2, _ax0, _ay0); + draw_sprite_colored(THEME.anchor_selector, 2, _ax1, _ay1); + } - draw_sprite_colored(THEME.anchor_selector, 0, xx, yy); + draw_sprite_colored(THEME.anchor_selector, 0, xx, yy); - if(drag_point == i) { - draw_sprite_colored(THEME.anchor_selector, 1, xx, yy); - } else if(point_in_circle(_mx, _my, xx, yy, 8)) { - draw_sprite_colored(THEME.anchor_selector, 1, xx, yy); - anchor_hover = i; - hover_type = 0; - } else if(cont && point_in_circle(_mx, _my, _ax0, _ay0, 8)) { - draw_sprite_colored(THEME.anchor_selector, 0, _ax0, _ay0); - anchor_hover = i; - hover_type = 1; - } else if(cont && point_in_circle(_mx, _my, _ax1, _ay1, 8)) { - draw_sprite_colored(THEME.anchor_selector, 0, _ax1, _ay1); - anchor_hover = i; - hover_type = -1; + if(drag_point == i) { + draw_sprite_colored(THEME.anchor_selector, 1, xx, yy); + } else if(point_in_circle(_mx, _my, xx, yy, 8)) { + draw_sprite_colored(THEME.anchor_selector, 1, xx, yy); + anchor_hover = i; + hover_type = 0; + } else if(cont && point_in_circle(_mx, _my, _ax0, _ay0, 8)) { + draw_sprite_colored(THEME.anchor_selector, 0, _ax0, _ay0); + anchor_hover = i; + hover_type = 1; + } else if(cont && point_in_circle(_mx, _my, _ax1, _ay1, 8)) { + draw_sprite_colored(THEME.anchor_selector, 0, _ax1, _ay1); + anchor_hover = i; + hover_type = -1; + } } - } + #endregion - if(isUsingTool(0)) { //transform tools + if(isUsingTool(0)) { #region transform tools var hov = 0; if(point_in_circle(_mx, _my, minx, miny, 8)) hov = 1; else if(point_in_circle(_mx, _my, maxx, miny, 8)) hov = 2; @@ -530,14 +655,16 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { if(hov && mouse_press(mb_left, active)) { transform_type = hov; - transform_minx = (minx - _x) / _s; - transform_maxx = (maxx - _x) / _s; - transform_miny = (miny - _y) / _s; - transform_maxy = (maxy - _y) / _s; - transform_mx = _mx; - transform_my = _my; + transform_minx = (minx - _x) / _s; transform_maxx = (maxx - _x) / _s; + transform_miny = (miny - _y) / _s; transform_maxy = (maxy - _y) / _s; + transform_mx = _mx; transform_my = _my; + transform_sx = _mx; transform_sy = _my; + + transform_cx = (transform_minx + transform_maxx) / 2; + transform_cy = (transform_miny + transform_maxy) / 2; } - } else if(isUsingTool(3)) { //pen tools + #endregion + } else if(isUsingTool(3)) { #region pen tools draw_sprite_ui_uniform(THEME.path_tools_draw, 0, _mx + 16, _my + 16); if(mouse_press(mb_left, active)) { @@ -554,7 +681,8 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { drag_point_mx = (_mx - _x) / _s; drag_point_my = (_my - _y) / _s; } - } else if(isUsingTool(4) || isUsingTool(5)) { //shape tools + #endregion + } else if(isUsingTool(4) || isUsingTool(5)) { #region shape tools draw_sprite_ui_uniform(THEME.cursor_path_add, 0, _mx + 16, _my + 16); if(mouse_press(mb_left, active)) { @@ -571,9 +699,10 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { repeat(4) createAnchor(value_snap((_mx - _x) / _s, _snx), value_snap((_my - _y) / _s, _sny)); } - } else if(anchor_hover != -1) { //no tool, dragging existing point + #endregion + } else if(anchor_hover != -1) { #region no tool, dragging existing point var _a = inputs[| input_fix_len + anchor_hover].getValue(); - if(isUsingTool(2)) { + if(isUsingTool(2) && hover_type == 0) { draw_sprite_ui_uniform(THEME.cursor_path_anchor, 0, _mx + 16, _my + 16); if(mouse_press(mb_left, active)) { @@ -582,12 +711,14 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { _a[3] = 0; _a[4] = 0; _a[5] = 0; + _a[6] = false; inputs[| input_fix_len + anchor_hover].setValue(_a); } else { _a[2] = -8; _a[3] = 0; _a[4] = 8; _a[5] = 0; + _a[6] = false; drag_point = anchor_hover; drag_type = 1; @@ -612,6 +743,11 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { draw_sprite_ui_uniform(THEME.cursor_path_move, 0, _mx + 16, _my + 16); if(mouse_press(mb_left, active)) { + if(isUsingTool(2)) { + _a[_ANCHOR.ind] = true; + inputs[| input_fix_len + anchor_hover].setValue(_a); + } + drag_point = anchor_hover; drag_type = hover_type; drag_point_mx = _mx; @@ -628,7 +764,8 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } } } - } else if(key_mod_press(CTRL) || isUsingTool(1)) { //anchor edit + #endregion + } else if(key_mod_press(CTRL) || isUsingTool(1)) { #region anchor edit draw_sprite_ui_uniform(THEME.cursor_path_add, 0, _mx + 16, _my + 16); if(mouse_press(mb_left, active)) { @@ -651,6 +788,7 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { UPDATE |= RENDER_TYPE.full; } + #endregion } } @@ -832,12 +970,9 @@ function Node_Path(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - if(LOADING_VERSION < 1380 && !CLONING) - ds_list_insert(_inputs, 3, noone); - - for(var i = input_fix_len; i < ds_list_size(_inputs); i++) + for(var i = input_fix_len; i < array_length(_inputs); i++) createAnchor(0, 0); } } \ No newline at end of file diff --git a/scripts/node_path_array/node_path_array.gml b/scripts/node_path_array/node_path_array.gml index 1d79e50dd..686c3b01a 100644 --- a/scripts/node_path_array/node_path_array.gml +++ b/scripts/node_path_array/node_path_array.gml @@ -133,9 +133,9 @@ function Node_Path_Array(_x, _y, _group = noone) : Node(_x, _y, _group) construc } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_path_l_system/node_path_l_system.gml b/scripts/node_path_l_system/node_path_l_system.gml index a6bc23d6d..b2660d16f 100644 --- a/scripts/node_path_l_system/node_path_l_system.gml +++ b/scripts/node_path_l_system/node_path_l_system.gml @@ -286,9 +286,9 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node(_x, _y, _group) const } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } } \ No newline at end of file diff --git a/scripts/node_processor/node_processor.gml b/scripts/node_processor/node_processor.gml index a28eee719..338eb5936 100644 --- a/scripts/node_processor/node_processor.gml +++ b/scripts/node_processor/node_processor.gml @@ -8,7 +8,7 @@ enum ARRAY_PROCESS { #macro PROCESSOR_OVERLAY_CHECK if(array_length(current_data) != ds_list_size(inputs)) return; function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { - attributes[? "array_process"] = ARRAY_PROCESS.loop; + attributes.array_process = ARRAY_PROCESS.loop; current_data = []; inputs_data = []; @@ -23,7 +23,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct array_push(attributeEditors, [ "Array process type", "array_process", new scrollBox([ "Loop", "Hold", "Expand", "Expand inverse" ], function(val) { - attributes[? "array_process"] = val; + attributes.array_process = val; triggerRender(); }, false) ]); @@ -36,7 +36,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct if(!_n.isArray()) return _in; - switch(attributes[? "array_process"]) { + switch(attributes.array_process) { case ARRAY_PROCESS.loop : _index = safe_mod(_arr, array_length(_in)); break; case ARRAY_PROCESS.hold : _index = min(_arr, array_length(_in) - 1); break; case ARRAY_PROCESS.expand : _index = floor(_arr / process_length[_index][1]) % process_length[_index][0]; break; @@ -131,7 +131,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct continue; } var _index = 0; - switch(attributes[? "array_process"]) { + switch(attributes.array_process) { case ARRAY_PROCESS.loop : _index = safe_mod(l, array_length(_in)); break; case ARRAY_PROCESS.hold : _index = min(l, array_length(_in) - 1); break; case ARRAY_PROCESS.expand : _index = floor(l / process_length[i][1]) % process_length[i][0]; break; @@ -184,7 +184,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct inputs_data[i] = val; - switch(attributes[? "array_process"]) { + switch(attributes.array_process) { case ARRAY_PROCESS.loop : case ARRAY_PROCESS.hold : process_amount = max(process_amount, amo); @@ -218,10 +218,10 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct } static processSerialize = function(_map) { - _map[? "array_process"] = attributes[? "array_process"]; + _map.array_process = attributes.array_process; } static processDeserialize = function() { - attributes[? "array_process"] = ds_map_try_get(load_map, "array_process", ARRAY_PROCESS.loop); + attributes.array_process = struct_try_get(load_map, "array_process", ARRAY_PROCESS.loop); } } \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 384eed71d..d207c05f0 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -605,19 +605,13 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #region node function function nodeLoad(_data, scale = false, _group = PANEL_GRAPH.getCurrentContext()) { - if(!ds_exists(_data, ds_type_map)) return noone; - - var _x = ds_map_try_get(_data, "x", 0); - var _y = ds_map_try_get(_data, "y", 0); - var _type = ds_map_try_get(_data, "type", 0); + var _x = _data.x; + var _y = _data.y; + var _type = _data.type; var _node = nodeBuild(_type, _x, _y, _group); + if(_node) _node.deserialize(_data, scale); - if(_node) { - var map = ds_map_clone(_data); - _node.deserialize(map, scale); - } - return _node; } @@ -767,44 +761,44 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { function attribute_surface_depth(label = true) { depth_array = inputs[| 0].type == VALUE_TYPE.surface? global.SURFACE_FORMAT_NAME_PROCESS : global.SURFACE_FORMAT_NAME; - attributes[? "color_depth"] = array_find(depth_array, "8 bit RGBA"); + attributes.color_depth = array_find(depth_array, "8 bit RGBA"); if(label) array_push(attributeEditors, "Surface"); array_push(attributeEditors, ["Color depth", "color_depth", new scrollBox(depth_array, function(val) { - attributes[? "color_depth"] = val; + attributes.color_depth = val; triggerRender(); }, false)]); } function attribute_interpolation(label = false) { - attributes[? "interpolation"] = 0; + attributes.interpolation = 0; if(label) array_push(attributeEditors, "Surface"); array_push(attributeEditors, ["Texture interpolation", "interpolation", new scrollBox(global.SURFACE_INTERPOLATION, function(val) { - attributes[? "interpolation"] = val; + attributes.interpolation = val; triggerRender(); }, false)]); } function attribute_oversample(label = false) { - attributes[? "oversample"] = 0; + attributes.oversample = 0; if(label) array_push(attributeEditors, "Surface"); array_push(attributeEditors, ["Oversample", "oversample", new scrollBox(global.SURFACE_OVERSAMPLE, function(val) { - attributes[? "oversample"] = val; + attributes.oversample = val; triggerRender(); }, false)]); } function attribute_auto_execute(label = false) { - attributes[? "auto_exe"] = false; + attributes.auto_exe = false; if(label) array_push(attributeEditors, "Node"); array_push(attributeEditors, ["Auto execute", "auto_exe", new checkBox(function() { - attributes[? "auto_exe"] = !attributes[? "auto_exe"]; + attributes.auto_exe = !attributes.auto_exe; })]); } #endregion \ No newline at end of file diff --git a/scripts/node_rigid_object/node_rigid_object.gml b/scripts/node_rigid_object/node_rigid_object.gml index a826aa6a9..b62a2af15 100644 --- a/scripts/node_rigid_object/node_rigid_object.gml +++ b/scripts/node_rigid_object/node_rigid_object.gml @@ -8,7 +8,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr min_h = 96; object = []; - attributes[? "mesh"] = []; + attributes.mesh = []; inputs[| 0] = nodeValue("Affect by force", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true) .rejectArray(); @@ -62,12 +62,12 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr ]; static newMesh = function(index) { - var mesh = ds_map_try_get(attributes, "mesh", []); + var mesh = struct_try_get(attributes, "mesh", []); mesh[index] = [ [ 0, 0], [32, 0], [32, 32], [ 0, 32] ]; - attributes[? "mesh"] = mesh; + attributes.mesh = mesh; } newMesh(0); @@ -90,7 +90,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _shp = inputs[| 5].getValue(); var _box = inputs[| 7].getValue(); - var meshes = attributes[? "mesh"]; + var meshes = attributes.mesh; if(preview_index >= array_length(meshes)) return; if(previewing == 0) { @@ -260,7 +260,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr if(!is_surface(_tex)) return; - var meshes = attributes[? "mesh"]; + var meshes = attributes.mesh; var mesh = []; var ww = surface_get_width(_tex); @@ -368,7 +368,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr buffer_delete(surface_buffer); meshes[index] = mesh; - attributes[? "mesh"] = meshes; + attributes.mesh = meshes; } static removeColinear = function(mesh) { @@ -541,7 +541,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr physics_fixture_set_circle_shape(fixture, min(_spos[2], _spos[3])); fixtureCreate(fixture, object); } else if(_shp == 2) { - var meshes = attributes[? "mesh"]; + var meshes = attributes.mesh; if(array_safe_get(meshes, index, noone) == noone) return noone; @@ -652,7 +652,7 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr var _tex = inputs[| 6].getValue(); if(is_array(_tex)) { - var meshes = attributes[? "mesh"]; + var meshes = attributes.mesh; for( var i = array_length(meshes); i < array_length(_tex); i++ ) newMesh(i); @@ -687,16 +687,16 @@ function Node_Rigid_Object(_x, _y, _group = noone) : Node(_x, _y, _group) constr } static attributeSerialize = function() { - var att = ds_map_create(); + var att = {}; - var mesh = ds_map_try_get(attributes, "mesh", []); - att[? "mesh"] = json_stringify(mesh); + var mesh = struct_try_get(attributes, "mesh", []); + att.mesh = json_stringify(mesh); return att; } static attributeDeserialize = function(attr) { - if(ds_map_exists(attr, "mesh")) - attributes[? "mesh"] = json_parse(attr[? "mesh"]); + if(struct_has(attr, "mesh")) + attributes.mesh = json_parse(attr.mesh); } } \ No newline at end of file diff --git a/scripts/node_rigid_render/node_rigid_render.gml b/scripts/node_rigid_render/node_rigid_render.gml index 13e360b79..7cea52d6a 100644 --- a/scripts/node_rigid_render/node_rigid_render.gml +++ b/scripts/node_rigid_render/node_rigid_render.gml @@ -119,9 +119,9 @@ function Node_Rigid_Render(_x, _y, _group = noone) : Node(_x, _y, _group) constr } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } } \ No newline at end of file diff --git a/scripts/node_seperate_shapes/node_seperate_shapes.gml b/scripts/node_seperate_shapes/node_seperate_shapes.gml index 179bd0b78..80f2d9d5b 100644 --- a/scripts/node_seperate_shapes/node_seperate_shapes.gml +++ b/scripts/node_seperate_shapes/node_seperate_shapes.gml @@ -35,10 +35,10 @@ function Node_Seperate_Shape(_x, _y, _group = noone) : Node(_x, _y, _group) cons surface_w = 1; surface_h = 1; - attributes[? "max_shape"] = 32; + attributes.max_shape = 32; array_push(attributeEditors, ["Maximum shapes", "max_shape", new textBox(TEXTBOX_INPUT.number, function(val) { - attributes[? "max_shape"] = val; + attributes.max_shape = val; triggerRender(); })]); @@ -53,7 +53,7 @@ function Node_Seperate_Shape(_x, _y, _group = noone) : Node(_x, _y, _group) cons static onInspector1Update = function() { separateShape(); } static update = function() { - if(attributes[? "auto_exe"]) + if(attributes.auto_exe) separateShape(); } @@ -111,16 +111,16 @@ function Node_Seperate_Shape(_x, _y, _group = noone) : Node(_x, _y, _group) cons shader_reset(); - var _pixel_surface = surface_create_valid(attributes[? "max_shape"], 1); + var _pixel_surface = surface_create_valid(attributes.max_shape, 1); surface_set_target(_pixel_surface); DRAW_CLEAR BLEND_OVERRIDE; shader_set(sh_seperate_shape_counter); texture_set_stage(shader_get_sampler_index(sh_seperate_shape_counter, "surface"), surface_get_texture(temp_surface[res_index])); shader_set_uniform_f_array_safe(shader_get_uniform(sh_seperate_shape_counter, "dimension"), [ ww, hh ]); - shader_set_uniform_i(shader_get_uniform(sh_seperate_shape_counter, "maxShape"), attributes[? "max_shape"]); + shader_set_uniform_i(shader_get_uniform(sh_seperate_shape_counter, "maxShape"), attributes.max_shape); shader_set_uniform_i(shader_get_uniform(sh_seperate_shape_counter, "ignore"), _ignore); - draw_sprite_ext(s_fx_pixel, 0, 0, 0, attributes[? "max_shape"], 1, 0, c_white, 1); + draw_sprite_ext(s_fx_pixel, 0, 0, 0, attributes.max_shape, 1, 0, c_white, 1); shader_reset(); BLEND_NORMAL; surface_reset_target(); diff --git a/scripts/node_sequence_to_anim/node_sequence_to_anim.gml b/scripts/node_sequence_to_anim/node_sequence_to_anim.gml index 12b4e16be..72263ef57 100644 --- a/scripts/node_sequence_to_anim/node_sequence_to_anim.gml +++ b/scripts/node_sequence_to_anim/node_sequence_to_anim.gml @@ -2,16 +2,18 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const name = "Array to Anim"; update_on_frame = true; - inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); + inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0) + .setArrayDepth(1); inputs[| 1] = nodeValue("Speed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) .rejectArray(); inputs[| 2] = nodeValue("Sequence", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, []) + .setVisible(true, true) .setArrayDepth(1); inputs[| 3] = nodeValue("Overflow", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) - .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Hold", "Loop", "Empty" ]); + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Hold", "Loop", "Ping Pong", "Empty" ]); outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); @@ -21,7 +23,13 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const var _ord = inputs[| 2].getValue(); var _h = ui(64); - if(_hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h)) { + if(array_length(_ord) == 0) { + _ord = array_create(array_length(_seq)); + for( var i = 0; i < array_length(_seq); i++ ) + _ord[i] = i; + } + + if(_hover && point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h) && inputs[| 2].value_from == noone) { draw_sprite_stretched(THEME.button, mouse_click(mb_left, _focus)? 2 : 1, _x, _y, _w, _h); if(mouse_press(mb_left, _focus)) dialogPanelCall(new Panel_Array_Sequence(self)); @@ -71,41 +79,50 @@ function Node_Sequence_Anim(_x, _y, _group = noone) : Node(_x, _y, _group) const }); input_display_list = [ 0, - ["Frames", false], sequence_renderer, 3, + ["Frames", false], sequence_renderer, 2, 3, ["Animation", false], 1, ]; static update = function(frame = ANIMATOR.current_frame) { - var _seq = inputs[| 0].getValue(); - var _spd = inputs[| 1].getValue(); - var _ord = inputs[| 2].getValue(); - var _ovf = inputs[| 3].getValue(); - - if(!is_array(_seq)) { - outputs[| 0].setValue(_seq); + var _sur = inputs[| 0].getValue(); + if(!is_array(_sur)) { + outputs[| 0].setValue(_sur); return; } + var _spd = inputs[| 1].getValue(); + var _seq = inputs[| 2].getValue(); + var _ovf = inputs[| 3].getValue(); + var frm = floor(ANIMATOR.current_frame / _spd); var ind = frm; - if(array_length(_ord) > 0) { - if(_ovf == 0) - ind = clamp(ind, 0, array_length(_ord) - 1); - else if(_ovf == 2 && ind >= array_length(_ord)) { - outputs[| 0].setValue(noone); - return; - } + if(array_length(_seq) == 0) { + _seq = array_create(array_length(_sur)); + for( var i = 0; i < array_length(_sur); i++ ) + _seq[i] = i; + } + + if(_ovf == 0) + ind = clamp(ind, 0, array_length(_seq) - 1); + else if(_ovf == 2) { + var _slen = array_length(_seq); + var _slpp = _slen * 2 - 2; + ind = abs(ind % _slpp); + if(ind >= _slen) + ind = _slpp - ind; + } else if(_ovf == 3 && ind >= array_length(_seq)) { + outputs[| 0].setValue(noone); + return; + } - ind = array_safe_get(_ord, ind,, ARRAY_OVERFLOW.loop); - } else - ind = safe_mod(floor(ANIMATOR.current_frame / _spd), array_length(_seq)); + ind = array_safe_get(_seq, ind,, ARRAY_OVERFLOW.loop); if(ind == noone) { outputs[| 0].setValue(noone); return; } - outputs[| 0].setValue(array_safe_get(_seq, ind)); + outputs[| 0].setValue(array_safe_get(_sur, ind)); } } \ No newline at end of file diff --git a/scripts/node_skew/node_skew.gml b/scripts/node_skew/node_skew.gml index 6016f1b30..8940f9c6f 100644 --- a/scripts/node_skew/node_skew.gml +++ b/scripts/node_skew/node_skew.gml @@ -61,7 +61,7 @@ function Node_Skew(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons var _amou = _data[2]; //var _wrap = _data[3]; var _cent = _data[4]; - var _samp = ds_map_try_get(attributes, "oversample"); + var _samp = struct_try_get(attributes, "oversample"); surface_set_shader(_outSurf, shader); shader_set_interpolation(_data[0]); diff --git a/scripts/node_stack/node_stack.gml b/scripts/node_stack/node_stack.gml index d25ee9804..5614ca2b2 100644 --- a/scripts/node_stack/node_stack.gml +++ b/scripts/node_stack/node_stack.gml @@ -144,9 +144,9 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } } diff --git a/scripts/node_statistic/node_statistic.gml b/scripts/node_statistic/node_statistic.gml index fc9db5129..132018295 100644 --- a/scripts/node_statistic/node_statistic.gml +++ b/scripts/node_statistic/node_statistic.gml @@ -175,9 +175,9 @@ function Node_Statistic(_x, _y, _group = noone) : Node(_x, _y, _group) construct } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_strand_create/node_strand_create.gml b/scripts/node_strand_create/node_strand_create.gml index 8f613f25e..afb953ac2 100644 --- a/scripts/node_strand_create/node_strand_create.gml +++ b/scripts/node_strand_create/node_strand_create.gml @@ -46,8 +46,8 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const inputs[| 15] = nodeValue("Bake hair", self, JUNCTION_CONNECT.input, VALUE_TYPE.trigger, 0, "Prevent strand reseting to apply manual modification. Unbaking will remove all changes.") .setDisplay(VALUE_DISPLAY.button, [ function() { - attributes[? "use_groom"] = !attributes[? "use_groom"]; - if(attributes[? "use_groom"]) + attributes.use_groom = !attributes.use_groom; + if(attributes.use_groom) groomed = strands.clone(); strandUpdate(true); }, "Bake" ]); @@ -66,7 +66,7 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const ["Preview", true], 16, ]; - attributes[? "use_groom"] = false; + attributes.use_groom = false; groomed = new StrandMesh(); strands = new StrandMesh(); @@ -118,10 +118,10 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) { var _typ = inputs[| 0].getValue(); var _pre = inputs[| 16].getValue(); - if(!attributes[? "use_groom"]) + if(!attributes.use_groom) strands.draw(_x, _y, _s, _pre); - tools = attributes[? "use_groom"]? groomTools : -1; + tools = attributes.use_groom? groomTools : -1; if(_typ == 0) { if(tool_dragging == noone) @@ -154,7 +154,7 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const _msh.draw(_x, _y, _s); } - if(!attributes[? "use_groom"]) return; + if(!attributes.use_groom) return; groomed.draw(_x, _y, _s, _pre, true); var __mx = (_mx - _x) / _s; @@ -428,8 +428,8 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const inputs[| 13].setVisible(_typ == 2, _typ == 2); inputs[| 14].setVisible(_typ != 2); - inputs[| 15].editWidget.text = attributes[? "use_groom"]? "Unbake" : "Bake"; - inputs[| 15].editWidget.blend = attributes[? "use_groom"]? COLORS._main_value_negative : COLORS._main_value_positive; + inputs[| 15].editWidget.text = attributes.use_groom? "Unbake" : "Bake"; + inputs[| 15].editWidget.blend = attributes.use_groom? COLORS._main_value_negative : COLORS._main_value_positive; } static strandUpdate = function(willReset = false) { @@ -452,7 +452,7 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const var sx, sy, prog, dir; if(willReset) { - if(attributes[? "use_groom"]) { + if(attributes.use_groom) { strands = groomed.clone(); outputs[| 0].setValue(strands); return; @@ -543,16 +543,16 @@ function Node_Strand_Create(_x, _y, _group = noone) : Node(_x, _y, _group) const } static attributeSerialize = function() { - var att = ds_map_create(); - att[? "use_groom"] = attributes[? "use_groom"]; - att[? "fixStrand"] = groomed.serialize(); + var att = {}; + att.use_groom = attributes.use_groom; + att.fixStrand = groomed.serialize(); return att; } static attributeDeserialize = function(attr) { - if(ds_map_exists(attr, "fixStrand")) - groomed.deserialize(attr[? "fixStrand"]); + if(struct_has(attr, "fixStrand")) + groomed.deserialize(attr.fixStrand); - attributes[? "use_groom"] = ds_map_try_get(attr, "use_groom", false); + attributes.use_groom = struct_try_get(attr, "use_groom", false); } } \ No newline at end of file diff --git a/scripts/node_struct/node_struct.gml b/scripts/node_struct/node_struct.gml index 891d07b34..24421feec 100644 --- a/scripts/node_struct/node_struct.gml +++ b/scripts/node_struct/node_struct.gml @@ -68,8 +68,9 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor for(var i = input_fix_len; i < ds_list_size(inputs) - data_length; i += data_length) { var key = inputs[| i + 0].getValue(); var val = inputs[| i + 1].getValue(); + var frm = inputs[| i + 1].value_from; - if(inputs[| i + 1].type == VALUE_TYPE.surface) + if(frm != noone && frm.type == VALUE_TYPE.surface) str[$ key] = new Surface(val); else str[$ key] = val; @@ -93,9 +94,9 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_switch/node_switch.gml b/scripts/node_switch/node_switch.gml index 2deae818e..b2e844f76 100644 --- a/scripts/node_switch/node_switch.gml +++ b/scripts/node_switch/node_switch.gml @@ -127,9 +127,9 @@ function Node_Switch(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length) + for(var i = input_fix_len; i < array_length(_inputs); i += data_length) createNewInput(); } diff --git a/scripts/node_transform/node_transform.gml b/scripts/node_transform/node_transform.gml index 67c4514d5..cfd0a526c 100644 --- a/scripts/node_transform/node_transform.gml +++ b/scripts/node_transform/node_transform.gml @@ -31,7 +31,8 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) inputs[| 6] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ]) .setDisplay(VALUE_DISPLAY.vector); - inputs[| 7] = nodeValue("Tile", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Repeat the surface to fill the screen."); + inputs[| 7] = nodeValue("Render Mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + .setDisplay(VALUE_DISPLAY.enum_button, [ "Normal", "Tile", "Wrap" ]); inputs[| 8] = nodeValue("Rotate by velocity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0, "Make the surface rotates to follow its movement.") .setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]); @@ -43,9 +44,9 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) inputs[| 11] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); active_index = 11; - + input_display_list = [ 11, 0, - ["Output", true], 9, 1, 7, + ["Output", true], 9, 1, 7, ["Position", false], 2, 10, ["Rotation", false], 3, 5, 8, ["Scale", false], 6 @@ -139,8 +140,8 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) var rot_vel = vel * _data[8]; var rot = _data[5] + rot_vel; - var sca = _data[6]; - var wrp = _data[7]; + var sca = _data[6]; + var mode = _data[7]; var cDep = attrDepth(); @@ -180,7 +181,7 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) pos = point_rotate(pos[0], pos[1], pos[0] + anc[0], pos[1] + anc[1], rot); - if(wrp) { + if(mode == 1) { var _w = _ww * sqrt(2); var _h = _hh * sqrt(2); var _px = (_w - _ww) / 2; @@ -223,9 +224,22 @@ function Node_Transform(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) draw_y = round(draw_y); } - surface_set_shader(_outSurf); + surface_set_shader(_outSurf); shader_set_interpolation(ins); draw_surface_ext_safe(ins, draw_x, draw_y, sca[0], sca[1], rot, c_white, 1); + + if(mode == 2) { + draw_surface_ext_safe(ins, draw_x - _ww, draw_y - _hh, sca[0], sca[1], rot, c_white, 1); + draw_surface_ext_safe(ins, draw_x, draw_y - _hh, sca[0], sca[1], rot, c_white, 1); + draw_surface_ext_safe(ins, draw_x + _ww, draw_y - _hh, sca[0], sca[1], rot, c_white, 1); + + draw_surface_ext_safe(ins, draw_x - _ww, draw_y, sca[0], sca[1], rot, c_white, 1); + draw_surface_ext_safe(ins, draw_x + _ww, draw_y, sca[0], sca[1], rot, c_white, 1); + + draw_surface_ext_safe(ins, draw_x - _ww, draw_y + _hh, sca[0], sca[1], rot, c_white, 1); + draw_surface_ext_safe(ins, draw_x, draw_y + _hh, sca[0], sca[1], rot, c_white, 1); + draw_surface_ext_safe(ins, draw_x + _ww, draw_y + _hh, sca[0], sca[1], rot, c_white, 1); + } surface_reset_shader(); } diff --git a/scripts/node_trigger/node_trigger.gml b/scripts/node_trigger/node_trigger.gml index d1f9f7620..578072fc2 100644 --- a/scripts/node_trigger/node_trigger.gml +++ b/scripts/node_trigger/node_trigger.gml @@ -18,7 +18,7 @@ function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor insp2UpdateTooltip = "Trigger"; insp2UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ]; - doTrigger = false; + doTrigger = 0; static onInspector2Update = function() { inputs[| 0].setAnim(true); @@ -26,16 +26,18 @@ function Node_Trigger(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } function step() { - if(doTrigger) { + if(doTrigger == 1) { outputs[| 0].setValue(true); - doTrigger = false; - } else + doTrigger = -1; + } else if(doTrigger == -1) { outputs[| 0].setValue(false); + doTrigger = 0; + } } function update() { var trg = inputs[| 0].getValue(); - if(trg) doTrigger = true; + if(trg) doTrigger = 1; } static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { diff --git a/scripts/node_trigger_bool/node_trigger_bool.gml b/scripts/node_trigger_bool/node_trigger_bool.gml index 467c3a794..7a594867a 100644 --- a/scripts/node_trigger_bool/node_trigger_bool.gml +++ b/scripts/node_trigger_bool/node_trigger_bool.gml @@ -16,29 +16,30 @@ function Node_Trigger_Bool(_x, _y, _group = noone) : Node(_x, _y, _group) constr prevVal = false; preview = false; + doTrigger = 0; + + function step() { + if(doTrigger == 1) { + outputs[| 0].setValue(true); + doTrigger = -1; + } else if(doTrigger == -1) { + outputs[| 0].setValue(false); + doTrigger = 0; + } + } + function update() { var val = inputs[| 0].getValue(); var con = inputs[| 1].getValue(); switch(con) { - case 0 : - outputs[| 0].setValue(val); - preview = val; - break; - case 1 : - outputs[| 0].setValue(!prevVal && val); - preview = !prevVal && val; - break; - case 2 : - outputs[| 0].setValue( prevVal && !val); - preview = prevVal && !val; - break; - case 3 : - outputs[| 0].setValue( prevVal != val); - preview = prevVal != val; - break; + case 0 : doTrigger = val; break; + case 1 : doTrigger = !prevVal && val; break; + case 2 : doTrigger = prevVal && !val; break; + case 3 : doTrigger = prevVal != val; break; } + preview = doTrigger; prevVal = val; } diff --git a/scripts/node_twirl/node_twirl.gml b/scripts/node_twirl/node_twirl.gml index 5dc175484..52eb5769b 100644 --- a/scripts/node_twirl/node_twirl.gml +++ b/scripts/node_twirl/node_twirl.gml @@ -54,7 +54,7 @@ function Node_Twirl(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con var center = _data[1]; var stren = _data[2]; var rad = _data[3]; - var sam = ds_map_try_get(attributes, "oversample"); + var sam = struct_try_get(attributes, "oversample"); surface_set_shader(_outSurf, shader); shader_set_interpolation(_data[0]); diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index 721ace98f..463900dcc 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -352,7 +352,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru type = _type; forward = true; - name = __txt_junction_name(instanceof(node), type, index, _name); + _initName = _name; + name = __txt_junction_name(instanceof(node), type, index, _name); + name = _name; internalName = string_replace_all(_name, " ", "_"); if(struct_has(node, "inputMap")) { @@ -386,7 +388,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru def_val = _value; on_end = KEYFRAME_END.hold; unit = new nodeValueUnit(self); - extra_data = ds_list_create(); + extra_data = []; dyna_depo = ds_list_create(); draw_line_shift_x = 0; @@ -667,7 +669,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru for( var i = 0; i < array_length(animators); i++ ) animators[i].suffix = " " + array_safe_get(global.displaySuffix_Area, i, ""); - extra_data[| 0] = AREA_MODE.area; + extra_data[0] = AREA_MODE.area; extract_node = "Node_Area"; break; case VALUE_DISPLAY.padding : @@ -925,7 +927,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } if(display_type == VALUE_DISPLAY.area) { - var dispType = ds_list_get(nodeFrom.extra_data, 0); + var dispType = nodeFrom.extra_data[0]; var surfGet = nodeFrom.display_data; if(!applyUnit || surfGet == -1) return value; @@ -986,6 +988,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } static getValue = function(_time = ANIMATOR.current_frame, applyUnit = true, arrIndex = 0, useCache = true) { + if(type == VALUE_TYPE.trigger) + useCache = false; + if(useCache) { var cache_hit = cache_value[0]; cache_hit &= cache_value[1] == _time; @@ -1070,6 +1075,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru static getValueRecursive = function(_time = ANIMATOR.current_frame) { var val = [ -1, self ]; + if(type == VALUE_TYPE.trigger && connect_type == JUNCTION_CONNECT.output) //trigger even will not propagate from input to output, need to be done manually + return [ __getAnimValue(_time), self ]; + if(value_from == noone) { var _val = __getAnimValue(_time); val = [ _val, self ]; @@ -1593,32 +1601,31 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } static serialize = function(scale = false, preset = false) { - var _map = ds_map_create(); + var _map = {}; - _map[? "visible"] = visible; + _map.visible = visible; if(connect_type == JUNCTION_CONNECT.output) return _map; - _map[? "on end"] = on_end; - _map[? "unit"] = unit.mode; - _map[? "sep_axis"] = sep_axis; - _map[? "shift x"] = draw_line_shift_x; - _map[? "shift y"] = draw_line_shift_y; - _map[? "from node"] = !preset && value_from? value_from.node.node_id : -1; - _map[? "from index"] = !preset && value_from? value_from.index : -1; - _map[? "global_use"] = expUse; - _map[? "global_key"] = expression; - _map[? "anim"] = is_anim; + _map.on_end = on_end; + _map.unit = unit.mode; + _map.sep_axis = sep_axis; + _map.shift_x = draw_line_shift_x; + _map.shift_y = draw_line_shift_y; + _map.from_node = !preset && value_from? value_from.node.node_id : -1; + _map.from_index = !preset && value_from? value_from.index : -1; + _map.global_use = expUse; + _map.global_key = expression; + _map.anim = is_anim; - ds_map_add_list(_map, "raw value", animator.serialize(scale)); + _map.raw_value = animator.serialize(scale); - var _anims = ds_list_create(); + var _anims = []; for( var i = 0; i < array_length(animators); i++ ) - ds_list_add_list(_anims, animators[i].serialize(scale)); - ds_map_add_list(_map, "animators", _anims); - - ds_map_add_list(_map, "data", ds_list_clone(extra_data)); + array_push(_anims, animators[i].serialize(scale)); + _map.animators = _anims; + _map.data = extra_data; return _map; } @@ -1630,38 +1637,38 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru if(_map == undefined) return; if(_map == noone) return; - visible = ds_map_try_get(_map, "visible", visible); + visible = _map.visible; if(connect_type == JUNCTION_CONNECT.output) return; //printIf(TESTING, " |- Applying deserialize to junction " + name + " of node " + node.name); - on_end = ds_map_try_get(_map, "on end", on_end); - unit.mode = ds_map_try_get(_map, "unit", VALUE_UNIT.constant); - expUse = ds_map_try_get(_map, "global_use"); - expression = ds_map_try_get(_map, "global_key"); + on_end = struct_try_get(_map, "on_end"); + unit.mode = struct_try_get(_map, "unit"); + expUse = struct_try_get(_map, "global_use"); + expression = struct_try_get(_map, "global_key"); expTree = evaluateFunctionTree(expression); - sep_axis = ds_map_try_get(_map, "sep_axis"); - is_anim = ds_map_try_get(_map, "anim"); + sep_axis = struct_try_get(_map, "sep_axis"); + is_anim = struct_try_get(_map, "anim"); - draw_line_shift_x = ds_map_try_get(_map, "shift x"); - draw_line_shift_y = ds_map_try_get(_map, "shift y"); + draw_line_shift_x = struct_try_get(_map, "shift_x"); + draw_line_shift_y = struct_try_get(_map, "shift_y"); - animator.deserialize(_map[? "raw value"], scale); + animator.deserialize(struct_try_get(_map, "raw_value"), scale); - if(ds_map_exists(_map, "animators")) { - var anims = _map[? "animators"]; - for( var i = 0; i < ds_list_size(anims); i++ ) - animators[i].deserialize(anims[| i], scale); + if(struct_has(_map, "animators")) { + var anims = _map.animators; + for( var i = 0; i < array_length(anims); i++ ) + animators[i].deserialize(anims[i], scale); } if(!preset) { - con_node = _map[? "from node"]; - con_index = _map[? "from index"]; + con_node = struct_try_get(_map, "from_node", -1); + con_index = struct_try_get(_map, "from_index", -1); } - if(ds_map_exists(_map, "data")) - ds_list_copy(extra_data, _map[? "data"]); + if(struct_has(_map, "data")) + extra_data = _map.data; if(APPENDING) def_val = getValue(0); @@ -1680,8 +1687,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } if(!ds_map_exists(NODE_MAP, _node)) { - var txt = "Node connect error : Node ID " + string(_node) + " not found."; - log_warning("LOAD", "[Connect] " + txt, node); + var txt = $"Node connect error : Node ID {_node} not found."; + log_warning("LOAD", $"[Connect] {txt}", node); return false; } @@ -1689,17 +1696,17 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var _ol = ds_list_size(_nd.outputs); if(log) - log_warning("LOAD", "[Connect] Reconnecting " + string(node.name) + " to " + _nd.name, node); + log_warning("LOAD", $"[Connect] Reconnecting {node.name} to {_nd.name}", node); if(con_index < _ol) { if(setFrom(_nd.outputs[| con_index], false)) return true; - log_warning("LOAD", "[Connect] Connection conflict " + string(node.name) + " to " + string(_nd.name) + " : Connection failed.", node); + log_warning("LOAD", $"[Connect] Connection conflict {node.name} to {_nd.name} : Connection failed.", node); return false; } - log_warning("LOAD", "[Connect] Connection conflict " + string(node.name) + " to " + string(_nd.name) + " : Node not exist.", node); + log_warning("LOAD", $"[Connect] Connection conflict {node.name} to {_nd.name} : Node not exist.", node); return false; } @@ -1712,7 +1719,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru static cleanUp = function() { ds_list_destroy(value_to); - ds_list_destroy(extra_data); animator.cleanUp(); delete animator; } diff --git a/scripts/node_wav_file_read/node_wav_file_read.gml b/scripts/node_wav_file_read/node_wav_file_read.gml index 9fc359580..aa99ec04e 100644 --- a/scripts/node_wav_file_read/node_wav_file_read.gml +++ b/scripts/node_wav_file_read/node_wav_file_read.gml @@ -74,19 +74,19 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const wav_file_prg = 0; wav_file_lim = 1; - attributes[? "preview_shift"] = 0; - attributes[? "preview_gain"] = 0.5; + attributes.preview_shift = 0; + attributes.preview_gain = 0.5; array_push(attributeEditors, "Audio Preview"); array_push(attributeEditors, ["Gain", "preview_gain", new textBox(TEXTBOX_INPUT.number, function(val) { - attributes[? "preview_gain"] = val; + attributes.preview_gain = val; })]); array_push(attributeEditors, ["Shift", "preview_shift", new textBox(TEXTBOX_INPUT.number, function(val) { - attributes[? "preview_shift"] = val; + attributes.preview_shift = val; })]); on_dragdrop_file = function(path) { @@ -184,7 +184,7 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const insp2UpdateTooltip = __txtx("play_with_timeline", "Play with timeline"); insp2UpdateIcon = [ THEME.play_sound, 1, COLORS._main_icon_light ]; - attributes[? "play"] = true; + attributes.play = true; static onInspector1Update = function() { var path = inputs[| 0].getValue(); @@ -194,7 +194,7 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const } static onInspector2Update = function() { - attributes[? "play"] = !attributes[? "play"]; + attributes.play = !attributes.play; } static step = function() { @@ -206,21 +206,21 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const UPDATE |= RENDER_TYPE.full; } - insp2UpdateIcon[1] = attributes[? "play"]; - insp2UpdateIcon[2] = attributes[? "play"]? COLORS._main_icon_light : COLORS._main_icon; + insp2UpdateIcon[1] = attributes.play; + insp2UpdateIcon[2] = attributes.play? COLORS._main_icon_light : COLORS._main_icon; if(preview_audio == -1) return; if(audio_is_playing(preview_audio) && !ANIMATOR.is_playing) audio_stop_sound(preview_audio); - if(!attributes[? "play"]) return; + if(!attributes.play) return; if(ANIMATOR.is_playing) { if(ANIMATOR.current_frame == 0) audio_stop_sound(preview_audio); - var dur = ANIMATOR.current_frame / ANIMATOR.framerate - attributes[? "preview_shift"]; + var dur = ANIMATOR.current_frame / ANIMATOR.framerate - attributes.preview_shift; if(!audio_is_playing(preview_audio)) - audio_play_sound(preview_audio, 1, false, attributes[? "preview_gain"], dur); + audio_play_sound(preview_audio, 1, false, attributes.preview_gain, dur); else if(ANIMATOR.frame_progress) audio_sound_set_track_position(preview_audio, dur); } @@ -277,7 +277,7 @@ function Node_WAV_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const draw_surface_part_ext_safe(audio_surface, 0, 0, min(wd, sw), sh, bbox.xc - sw * ss / 2, bbox.yc - sh * ss / 2, - ss, ss,, attributes[? "play"]? COLORS._main_accent : c_white); + ss, ss,, attributes.play? COLORS._main_accent : c_white); } var str = filename_name(path_current); diff --git a/scripts/node_websocket_receiver/node_websocket_receiver.gml b/scripts/node_websocket_receiver/node_websocket_receiver.gml index 26f6ee23b..669a234f4 100644 --- a/scripts/node_websocket_receiver/node_websocket_receiver.gml +++ b/scripts/node_websocket_receiver/node_websocket_receiver.gml @@ -43,7 +43,7 @@ function Node_Websocket_Receiver(_x, _y, _group = noone) : Node(_x, _y, _group) setPort(_port); } - network_trigger = false; + network_trigger = 0; function asyncPackets(_async_load) { var _active = inputs[| 1].getValue(); if(!_active) return; @@ -72,11 +72,13 @@ function Node_Websocket_Receiver(_x, _y, _group = noone) : Node(_x, _y, _group) } static step = function() { - if(network_trigger) { + if(network_trigger == 1) { outputs[| 1].setValue(1); - network_trigger = false; - } else + network_trigger = -1; + } else if(network_trigger == -1) { outputs[| 1].setValue(0); + network_trigger = 0; + } } static update = function(frame = ANIMATOR.current_frame) { diff --git a/scripts/node_wrap_mesh/node_wrap_mesh.gml b/scripts/node_wrap_mesh/node_wrap_mesh.gml index a4e8711fc..8e51f9071 100644 --- a/scripts/node_wrap_mesh/node_wrap_mesh.gml +++ b/scripts/node_wrap_mesh/node_wrap_mesh.gml @@ -57,10 +57,10 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) array_push(attributeEditors, "Warp"); - attributes[? "iteration"] = 4; + attributes.iteration = 4; array_push(attributeEditors, ["Iteration", "iteration", new textBox(TEXTBOX_INPUT.number, function(val) { - attributes[? "iteration"] = val; + attributes.iteration = val; triggerRender(); })]); @@ -438,7 +438,7 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } } - var it = attributes[? "iteration"]; + var it = attributes.iteration; var _rat = 1 / it; repeat(it) { @@ -487,34 +487,33 @@ function Node_Mesh_Warp(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) } static postDeserialize = function() { - var _inputs = load_map[? "inputs"]; + var _inputs = load_map.inputs; - for(var i = control_index; i < ds_list_size(_inputs); i++) { + for(var i = control_index; i < array_length(_inputs); i++) { var inp = createControl(); - print(instanceof(inp)) - inp.applyDeserialize(_inputs[| i]); + inp.applyDeserialize(_inputs[i]); } } static attributeSerialize = function() { - var att = ds_map_create(); + var att = {}; - var pinList = ds_list_create(); + var pinList = []; for( var j = 0; j < array_length(data.points); j++ ) for( var k = 0; k < array_length(data.points[j]); k++ ) { var p = data.points[j][k]; if(p == 0) continue; - if(p.pin) ds_list_add(pinList, p.index); + if(p.pin) array_push(pinList, p.index); } - ds_map_add_list(att, "pin", pinList); + att.pin = pinList; return att; } loadPin = noone; static attributeDeserialize = function(attr) { - if(ds_map_exists(attr, "pin")) - loadPin = attr[? "pin"]; + if(struct_has(attr, "pin")) + loadPin = attr.pin; } static postConnect = function() { diff --git a/scripts/panel_array_sequence/panel_array_sequence.gml b/scripts/panel_array_sequence/panel_array_sequence.gml index 04da492bb..b405c8306 100644 --- a/scripts/panel_array_sequence/panel_array_sequence.gml +++ b/scripts/panel_array_sequence/panel_array_sequence.gml @@ -1,6 +1,6 @@ function Panel_Array_Sequence(node) : PanelContent() constructor { self.node = node; - title = __txt("Array Sequence"); + title = __txt("Frame Sequence Editor"); w = ui(640); h = ui(168); @@ -105,11 +105,19 @@ function Panel_Array_Sequence(node) : PanelContent() constructor { draw_set_alpha(1); draw_set_text(f_p2, fa_center, fa_top, COLORS._main_text_sub); - draw_text_add(_sx + _ns / 2, ui(0), i); + draw_text_add(_sx + _ns / 2, ui(0), i + 1); } - for( var i = 0; i < array_length(_ord); i++ ) { - var _i = _ord[i]; + var __ord = _ord; + var _def = array_length(_ord) == 0; + if(_def) { + __ord = array_create(array_length(_seq)); + for( var i = 0; i < array_length(_seq); i++ ) + __ord[i] = i; + } + + for( var i = 0; i < array_length(__ord); i++ ) { + var _i = __ord[i]; if(_i == noone) continue; var _s = _seq[_i]; if(!is_surface(_s)) continue; @@ -122,9 +130,9 @@ function Panel_Array_Sequence(node) : PanelContent() constructor { var _ssx = _sx + (_ns - _sw * _ss) / 2; var _ssy = _sy + (_ns - _sh * _ss) / 2; - draw_surface_ext_safe(_s, _ssx, _ssy, _ss, _ss); + draw_surface_ext_safe(_s, _ssx, _ssy, _ss, _ss,,, _def? 0.5 : 1); - if(pHOVER && point_in_rectangle(msx, msy, _sx, _sy, _sx + _ns, _sy + _ns)) { + if(pHOVER && !_def && point_in_rectangle(msx, msy, _sx, _sy, _sx + _ns, _sy + _ns)) { if(mouse_press(mb_left, pFOCUS)) { _ord[i] = noone; node.inputs[| 2].setValue(_ord); diff --git a/scripts/panel_data/panel_data.gml b/scripts/panel_data/panel_data.gml index 23267a48a..535234976 100644 --- a/scripts/panel_data/panel_data.gml +++ b/scripts/panel_data/panel_data.gml @@ -27,7 +27,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor { split = ""; tab_width = 0; - tab_height = ui(20); + tab_height = ui(24); tab_x = 0; tab_x_to = 0; tab_surface = noone; @@ -450,13 +450,15 @@ function Panel(_parent, _x, _y, _w, _h) constructor { checkHover(); } + tab_cover = noone; function drawTab() { tab_surface = surface_verify(tab_surface, w - padding * 2 + 1, tab_height + ui(4)); var tsx = x + padding - 1; - var tsy = y; + var tsy = y + ui(2); var msx = mouse_x - tsx; var msy = mouse_y - tsy; + tab_cover = noone; surface_set_target(tab_surface); DRAW_CLEAR @@ -490,22 +492,25 @@ function Panel(_parent, _x, _y, _w, _h) constructor { content[i].tab_x = lerp_float(content[i].tab_x, tbx, 5); var _tbx = content[i].tab_x; var _hov = point_in_rectangle(msx, msy, _tbx, tby, _tbx + tbw, tab_height); + var _tdh = tbh + THEME_VALUE.panel_tab_extend; if(i == content_index) { foc = FOCUS == self; - var cc = FOCUS == self? COLORS.panel_tab_active : COLORS.panel_tab; - draw_sprite_stretched_ext(THEME.ui_panel_tab, FOCUS == self, _tbx, tby, tbw, tbh, cc, 1); + var cc = FOCUS == self? COLORS._main_accent : COLORS.panel_tab; + draw_sprite_stretched_ext(THEME.ui_panel_tab, 1 + (FOCUS == self), _tbx, tby, tbw, _tdh, cc, 1); + if(!foc) tab_cover = BBOX().fromWH(tsx + _tbx, tsy + tby + tbh - ui(2), tbw, THEME_VALUE.panel_tab_extend); } else { - draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, _tbx, tby, tbw, tbh, COLORS.panel_tab_inactive, 1); - + var cc = COLORS.panel_tab_inactive; if(HOVER == self && _hov) - draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, _tbx, tby, tbw, tbh, COLORS.panel_tab_hover, 1); + var cc = COLORS.panel_tab_hover; + + draw_sprite_stretched_ext(THEME.ui_panel_tab, 0, _tbx, tby, tbw, _tdh, cc, 1); } if(HOVER == self && _hov) { if(mouse_press(mb_left, FOCUS == self)) { content_index = i; - + tab_holding = content[i]; tab_hold_state = 0; tab_holding_mx = msx; @@ -516,7 +521,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor { if(mouse_press(mb_right, FOCUS == self)) { var menu = array_clone(border_rb_menu); if(instanceof(content[i]) == "Panel_Menu") - array_remove(menu, 2, border_rb_close); + array_remove(menu, 2); menuCall("panel_border_menu",,, menu); } @@ -533,7 +538,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor { } draw_set_text(f_p3, fa_left, fa_bottom, cc); - draw_text_add(_tbx + ui(8), tab_height - ui(2), txt); + draw_text_add(_tbx + ui(8), tab_height - ui(4), txt); tbx += tbw + ui(2); } @@ -553,7 +558,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor { var tbw = string_width(txt) + ui(16); if(icn != noone) tbw += ui(16 + 4); - draw_sprite_stretched_ext(THEME.ui_panel_tab, FOCUS == self, _tbx, tby, tbw, tbh, COLORS.panel_tab_active, 1); + draw_sprite_stretched_ext(THEME.ui_panel_tab, 2, _tbx, tby, tbw, tbh, COLORS._main_accent, 1); var cc = COLORS.panel_bg_clear_inner; if(icn != noone) { @@ -561,7 +566,7 @@ function Panel(_parent, _x, _y, _w, _h) constructor { _tbx += ui(20); } draw_set_text(f_p3, fa_left, fa_bottom, COLORS.panel_bg_clear_inner); - draw_text(_tbx + ui(8), tab_height - ui(2), txt); + draw_text_add(_tbx + ui(8), tab_height - ui(4), txt); if(tab_hold_state == 0) { if(point_distance(tab_holding_mx, tab_holding_my, msx, msy) > 8) @@ -633,7 +638,8 @@ function Panel(_parent, _x, _y, _w, _h) constructor { surface_reset_target(); draw_surface_safe(content_surface, tx, ty); - draw_sprite_stretched(THEME.ui_panel_bg, 3, tx + padding, ty + padding, _tw, _th); + draw_sprite_stretched(THEME.ui_panel_fg, 0, tx + padding, ty + padding, _tw, _th); + draw_sprite_bbox(THEME.ui_panel_tab, 3, tab_cover); if(FOCUS == self && parent != noone) { draw_sprite_stretched_ext(THEME.ui_panel_active, 0, tx + padding, ty + padding, tw - padding * 2, th - padding * 2, COLORS._main_accent, 1); diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index 350c0b7a3..ca5516da1 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -175,7 +175,7 @@ function Panel_Graph() : PanelContent() constructor { addHotkey("Graph", "Add node", "A", MOD_KEY.none, function() { PANEL_GRAPH.callAddDialog(); }); addHotkey("Graph", "Focus content", "F", MOD_KEY.none, function() { PANEL_GRAPH.fullView(); }); addHotkey("Graph", "Preview focusing node", "P", MOD_KEY.none, function() { PANEL_GRAPH.setCurrentPreview(); }); - addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { PANEL_GRAPH.previewWindow(PANEL_GRAPH.node_focus); }); + addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { create_preview_window(PANEL_GRAPH.node_focus); }); addHotkey("Graph", "Import image", "I", MOD_KEY.none, function() { nodeBuild("Node_Image", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); addHotkey("Graph", "Import image array", "I", MOD_KEY.shift, function() { nodeBuild("Node_Image_Sequence", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); addHotkey("Graph", "Add number", "1", MOD_KEY.none, function() { nodeBuild("Node_Number", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); }); @@ -493,7 +493,7 @@ function Panel_Graph() : PanelContent() constructor { })); array_push(menu, menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() { - previewWindow(node_hover); + create_preview_window(node_hover); }, noone, ["Graph", "Preview window"])); array_push(menu, menuItem(__txtx("panel_graph_inspector_panel", "Send to new inspector"), function() { @@ -910,11 +910,11 @@ function Panel_Graph() : PanelContent() constructor { nodeArray[i] = nodes_select_list[| i]; } - var _map = ds_map_create(); - var _node = ds_list_create(); + var _map = {}; + var _node = []; for(var i = 0; i < array_length(nodeArray); i++) SAVE_NODE(_node, nodeArray[i],,,, getCurrentContext()); - ds_map_add_list(_map, "nodes", _node); + _map.nodes = _node; APPENDING = true; CLONING = true; @@ -922,8 +922,6 @@ function Panel_Graph() : PanelContent() constructor { APPENDING = false; CLONING = false; - ds_map_destroy(_map); - if(ds_list_size(_app) == 0) { ds_list_destroy(_app); return; @@ -984,20 +982,19 @@ function Panel_Graph() : PanelContent() constructor { } } - var _map = ds_map_create(); - var _node = ds_list_create(); + var _map = {}; + var _node = []; for(var i = 0; i < array_length(nodeArray); i++) SAVE_NODE(_node, nodeArray[i],,,, getCurrentContext()); - ds_map_add_list(_map, "nodes", _node); + _map.nodes = _node; clipboard_set_text(json_encode_minify(_map)); - ds_map_destroy(_map); } function doPaste() { var txt = clipboard_get_text(); - var _map = json_decode(txt); - if(_map != -1) { + var _map = json_try_parse(txt); + if(_map != noone) { ds_map_clear(APPEND_MAP); APPENDING = true; CLONING = true; @@ -1005,7 +1002,6 @@ function Panel_Graph() : PanelContent() constructor { APPENDING = false; CLONING = false; - ds_map_destroy(_map); if(_app == noone) return; diff --git a/scripts/panel_inspector/panel_inspector.gml b/scripts/panel_inspector/panel_inspector.gml index edf0916c5..117359b6f 100644 --- a/scripts/panel_inspector/panel_inspector.gml +++ b/scripts/panel_inspector/panel_inspector.gml @@ -312,7 +312,7 @@ function Panel_Inspector() : PanelContent() constructor { continue; } - var val = inspecting.attributes[? edt[1]]; + var val = inspecting.attributes[$ edt[1]]; edt[2].setActiveFocus(pFOCUS, pHOVER); if(instanceof(edt[2]) == "buttonClass") { diff --git a/scripts/panel_preview/panel_preview.gml b/scripts/panel_preview/panel_preview.gml index 33e9d7298..4218126a1 100644 --- a/scripts/panel_preview/panel_preview.gml +++ b/scripts/panel_preview/panel_preview.gml @@ -146,7 +146,7 @@ function Panel_Preview() : PanelContent() constructor { addHotkey("Preview", "Focus content", "F", MOD_KEY.none, function() { PANEL_PREVIEW.fullView(); }); addHotkey("Preview", "Save current frame", "S", MOD_KEY.shift, function() { PANEL_PREVIEW.saveCurrentFrame(); }); addHotkey("Preview", "Save all current frame", -1, MOD_KEY.none, function() { PANEL_PREVIEW.saveAllCurrentFrames(); }); - addHotkey("Preview", "Preview window", "P", MOD_KEY.ctrl, function() { PANEL_PREVIEW.previewWindow(PANEL_PREVIEW.getNodePreview()); }); + addHotkey("Preview", "Preview window", "P", MOD_KEY.ctrl, function() { create_preview_window(PANEL_PREVIEW.getNodePreview()); }); addHotkey("Preview", "Toggle grid", "G", MOD_KEY.ctrl, function() { PANEL_PREVIEW.grid_show = !PANEL_PREVIEW.grid_show; }); addHotkey("Preview", "Pan", "", MOD_KEY.alt, function() { PANEL_PREVIEW.canvas_dragging_key = true; }); @@ -871,7 +871,7 @@ function Panel_Preview() : PanelContent() constructor { if(mouse_on_preview && mouse_press(mb_right, pFOCUS)) { menuCall("preview_context_menu",,, [ - menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() { previewWindow(getNodePreview()); }, noone, ["Preview", "Preview window"]), + menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() { create_preview_window(getNodePreview()); }, noone, ["Preview", "Preview window"]), -1, menuItem(__txtx("panel_preview_save", "Save current preview as") + "...", function() { saveCurrentFrame(); }), menuItem(__txtx("panel_preview_save_all", "Save all current previews as") + "...", function() { saveAllCurrentFrames(); }), diff --git a/scripts/panel_preview_window/panel_preview_window.gml b/scripts/panel_preview_window/panel_preview_window.gml index 63fbe6720..2ec4f00b8 100644 --- a/scripts/panel_preview_window/panel_preview_window.gml +++ b/scripts/panel_preview_window/panel_preview_window.gml @@ -63,7 +63,7 @@ function Panel_Preview_Window() : PanelContent() constructor { surface_set_target(content_surface); draw_clear(COLORS.panel_bg_clear); - draw_sprite_tiled_ext(s_transparent, 0, 0, 0, 1, 1, c_white, 0.75); + draw_sprite_tiled_ext(s_transparent, 0, 0, 0, 1, 1, COLORS.panel_preview_transparent, 1); var surf = node_target.outputs[| preview_channel].getValue(); if(is_array(surf)) diff --git a/scripts/render_data/render_data.gml b/scripts/render_data/render_data.gml index 93f89d742..ec07ce325 100644 --- a/scripts/render_data/render_data.gml +++ b/scripts/render_data/render_data.gml @@ -128,8 +128,9 @@ $"============================== RENDER START [frame {string(ANIMATOR.current_fr if(runAction && rendering.hasInspector1Update()) rendering.inspector1Update(); - } else + } else if(rendering.renderActive) { RENDER_QUEUE.enqueue(rendering); + } LOG_BLOCK_END(); } @@ -182,16 +183,28 @@ function RenderList(list) { // render forward while(!ds_queue_empty(queue)) { - rendering = ds_queue_dequeue(queue); - if(!rendering.isRenderable()) continue; + LOG_BLOCK_START(); + LOG_IF(global.FLAG.render, $"➤➤➤➤➤➤ CURRENT RENDER QUEUE {RENDER_QUEUE}"); + rendering = RENDER_QUEUE.dequeue(); + if(!ds_list_exist(list, rendering)) continue; + var renderable = rendering.isRenderable(); - rendering.doUpdate(); + LOG_IF(global.FLAG.render, $"Rendering {rendering.internalName} ({rendering.display_name}) : {renderable? "Update" : "Pass"}"); + + if(renderable) { + rendering.doUpdate(); - LOG_LINE_IF(global.FLAG.render, $"Rendering {rendering.internalName}"); + var nextNodes = rendering.getNextNodes(); + for( var i = 0; i < array_length(nextNodes); i++ ) + RENDER_QUEUE.enqueue(nextNodes[i]); - var nextNodes = rendering.getNextNodes(); - for( var i = 0; i < array_length(nextNodes); i++ ) - ds_queue_enqueue(queue, nextNodes[i]); + if(runAction && rendering.hasInspector1Update()) + rendering.inspector1Update(); + } else if(rendering.renderActive) { + RENDER_QUEUE.enqueue(rendering); + } + + LOG_BLOCK_END(); } } catch(e) { @@ -234,24 +247,28 @@ function RenderListAction(list, context = PANEL_GRAPH.getCurrentContext()) { // render forward while(!RENDER_QUEUE.empty()) { + LOG_BLOCK_START(); + LOG_IF(global.FLAG.render, $"➤➤➤➤➤➤ CURRENT RENDER QUEUE {RENDER_QUEUE}"); rendering = RENDER_QUEUE.dequeue(); - if(rendering.group == context) break; + if(!ds_list_exist(list, rendering)) continue; + var renderable = rendering.isRenderable(); - var txt = rendering.isRenderable()? " [Skip]" : " [Update]"; + LOG_IF(global.FLAG.render, $"Rendering {rendering.internalName} ({rendering.display_name}) : {renderable? "Update" : "Pass"}"); - if(!rendering.isRenderable()) { + if(renderable) { rendering.doUpdate(); - if(rendering.hasInspector1Update()) { - rendering.inspector1Update(); - printIf(global.FLAG.render, $" > Toggle manual execution {rendering.internalName}"); - } var nextNodes = rendering.getNextNodes(); - for( var i = 0; i < array_length(nextNodes); i++ ) + for( var i = 0; i < array_length(nextNodes); i++ ) RENDER_QUEUE.enqueue(nextNodes[i]); + + if(runAction && rendering.hasInspector1Update()) + rendering.inspector1Update(); + } else if(rendering.renderActive) { + RENDER_QUEUE.enqueue(rendering); } - printIf(global.FLAG.render, $"Rendered {rendering.internalName} {txt}"); + LOG_BLOCK_END(); } printIf(global.FLAG.render, "=== RENDER COMPLETE IN {" + string(current_time - t) + "ms} ===\n"); diff --git a/scripts/save_function/save_function.gml b/scripts/save_function/save_function.gml index 96d037c6c..bb7f23481 100644 --- a/scripts/save_function/save_function.gml +++ b/scripts/save_function/save_function.gml @@ -23,44 +23,42 @@ function __NEW() { } function save_serialize() { - var _map = ds_map_create(); - _map[? "version"] = SAVEFILE_VERSION; + var _map = {}; + _map.version = SAVEFILE_VERSION; - var _node_list = ds_list_create(); + var _node_list = []; var _key = ds_map_find_first(NODE_MAP); repeat(ds_map_size(NODE_MAP)) { var _node = NODE_MAP[? _key]; if(_node.active) - ds_list_add_map(_node_list, _node.serialize()); + array_push(_node_list, _node.serialize()); _key = ds_map_find_next(NODE_MAP, _key); } - ds_map_add_list(_map, "nodes", _node_list); + _map.nodes = _node_list; - var _anim_map = ds_map_create(); - _anim_map[? "frames_total"] = ANIMATOR.frames_total; - _anim_map[? "framerate"] = ANIMATOR.framerate; - ds_map_add_map(_map, "animator", _anim_map); + var _anim_map = {}; + _anim_map.frames_total = ANIMATOR.frames_total; + _anim_map.framerate = ANIMATOR.framerate; + _map.animator = _anim_map; - ds_map_add_map(_map, "metadata", METADATA.serialize()); - - ds_map_add_map(_map, "global", GLOBAL.serialize()); + _map.metadata = METADATA.serialize(); + _map.global = GLOBAL.serialize(); var prev = PANEL_PREVIEW.getNodePreviewSurface(); - if(!is_surface(prev)) _map[? "preview"] = ""; - else _map[? "preview"] = surface_encode(surface_size_lim(prev, 128, 128)); + if(!is_surface(prev)) _map.preview = ""; + else _map.preview = surface_encode(surface_size_lim(prev, 128, 128)); - var _addon = ds_map_create(); + var _addon = {}; with(_addon_custom) { var _ser = lua_call(thread, "serialize"); - _addon[? name] = PREF_MAP[? "save_file_minify"]? json_stringify_minify(_ser) : json_stringify(_ser); + _addon[$ name] = PREF_MAP[? "save_file_minify"]? json_stringify_minify(_ser) : json_stringify(_ser); } - ds_map_add_map(_map, "addon", _addon); + _map.addon = _addon; - var val = PREF_MAP[? "save_file_minify"]? json_encode_minify(_map) : json_encode(_map, true); - ds_map_destroy(_map); + var val = PREF_MAP[? "save_file_minify"]? json_stringify_minify(_map) : json_stringify(_map, true); return val; } @@ -130,10 +128,10 @@ function SAVE_AT(path, log = "save at ") { } function SAVE_COLLECTIONS(_list, _path, save_surface = true, metadata = noone, context = PANEL_GRAPH.getCurrentContext()) { - var _map = ds_map_create(); - _map[? "version"] = SAVEFILE_VERSION; + var _content = {}; + _content.version = SAVEFILE_VERSION; - var _node_list = ds_list_create(); + var _nodes = []; var cx = 0; var cy = 0; for(var i = 0; i < ds_list_size(_list); i++) { @@ -152,17 +150,16 @@ function SAVE_COLLECTIONS(_list, _path, save_surface = true, metadata = noone, c } for(var i = 0; i < ds_list_size(_list); i++) - SAVE_NODE(_node_list, _list[| i], cx, cy, true, context); - ds_map_add_list(_map, "nodes", _node_list); + SAVE_NODE(_nodes, _list[| i], cx, cy, true, context); + _content.nodes = _nodes; if(metadata != noone) - ds_map_add_map(_map, "metadata", metadata.serialize()); + _content.metadata = metadata.serialize(); var file = file_text_open_write(_path); - file_text_write_string(file, PREF_MAP[? "save_file_minify"]? json_encode_minify(_map) : json_encode(_map, true)); + file_text_write_string(file, PREF_MAP[? "save_file_minify"]? json_stringify_minify(_content) : json_stringify(_content, true)); file_text_close(file); - ds_map_destroy(_map); var pane = findPanel("Panel_Collection"); if(pane) pane.refreshContext(); @@ -179,21 +176,20 @@ function SAVE_COLLECTION(_node, _path, save_surface = true, metadata = noone, co } } - var _map = ds_map_create(); - _map[? "version"] = SAVEFILE_VERSION; + var _content = {}; + _content.version = SAVEFILE_VERSION; - var _node_list = ds_list_create(); - SAVE_NODE(_node_list, _node, _node.x, _node.y, true, context); - ds_map_add_list(_map, "nodes", _node_list); + var _nodes = []; + SAVE_NODE(_nodes, _node, _node.x, _node.y, true, context); + _content.nodes = nodes; if(metadata != noone) - ds_map_add_map(_map, "metadata", metadata.serialize()); + _content.metadata = metadata.serialize(); var file = file_text_open_write(_path); - file_text_write_string(file, PREF_MAP[? "save_file_minify"]? json_encode_minify(_map) : json_encode(_map, true)); + file_text_write_string(file, PREF_MAP[? "save_file_minify"]? json_stringify_minify(_content) : json_stringify(_content, true)); file_text_close(file); - ds_map_destroy(_map); var pane = findPanel("Panel_Collection"); if(pane) pane.refreshContext(); @@ -201,20 +197,18 @@ function SAVE_COLLECTION(_node, _path, save_surface = true, metadata = noone, co PANEL_MENU.setNotiIcon(THEME.noti_icon_file_save); } -function SAVE_NODE(_list, _node, dx = 0, dy = 0, scale = false, context = PANEL_GRAPH.getCurrentContext()) { - if(variable_struct_exists(_node, "nodes")) { +function SAVE_NODE(_arr, _node, dx = 0, dy = 0, scale = false, context = PANEL_GRAPH.getCurrentContext()) { + if(struct_has(_node, "nodes")) { for(var i = 0; i < ds_list_size(_node.nodes); i++) - SAVE_NODE(_list, _node.nodes[| i], dx, dy, scale, context); + SAVE_NODE(_arr, _node.nodes[| i], dx, dy, scale, context); } var m = _node.serialize(scale); - m[? "x"] -= dx; - m[? "y"] -= dy; + m.x -= dx; + m.y -= dy; var c = context == noone? noone : context.node_id; - if(m[? "group"] == c) - m[? "group"] = noone; + if(m.group == c) m.group = noone; - ds_list_add(_list, m); - ds_list_mark_as_map(_list, ds_list_size(_list) - 1); + array_push(_arr, m); } \ No newline at end of file diff --git a/scripts/shader_functions/shader_functions.gml b/scripts/shader_functions/shader_functions.gml index 110b3af27..85b6a5456 100644 --- a/scripts/shader_functions/shader_functions.gml +++ b/scripts/shader_functions/shader_functions.gml @@ -67,7 +67,7 @@ function shader_set_surface(sampler, surface) { } function shader_set_interpolation(surface) { - var intp = ds_map_try_get(attributes, "interpolation", 0); + var intp = struct_try_get(attributes, "interpolation", 0); gpu_set_tex_filter(intp); shader_set_i("interpolation", intp); diff --git a/scripts/struct_functions/struct_functions.gml b/scripts/struct_functions/struct_functions.gml index 88b3c094d..e9cdaf1ac 100644 --- a/scripts/struct_functions/struct_functions.gml +++ b/scripts/struct_functions/struct_functions.gml @@ -12,5 +12,7 @@ function struct_override(original, override) { } function struct_try_get(struct, key, def = 0) { + if(struct_has(struct, key)) return struct[$ key]; + key = string_replace_all(key, "_", " "); return struct_has(struct, key)? struct[$ key] : def; } \ No newline at end of file diff --git a/scripts/textBox/textBox.gml b/scripts/textBox/textBox.gml index f10a7fee4..53d1e23eb 100644 --- a/scripts/textBox/textBox.gml +++ b/scripts/textBox/textBox.gml @@ -380,7 +380,7 @@ function textBox(_input, _onModify, _extras = noone) : textInput(_input, _onModi } text_surface = surface_verify(text_surface, _w - ui(16), _h); - draw_sprite_stretched_ext(THEME.textbox, 3, _x, _y, _w, _h, boxColor, 1); + if(!hide) draw_sprite_stretched_ext(THEME.textbox, 3, _x, _y, _w, _h, boxColor, 1); disp_x = lerp_float(disp_x, disp_x_to, 5); var hoverRect = point_in_rectangle(_m[0], _m[1], _x, _y, _x + _w, _y + _h); diff --git a/shaders/sh_find_boundary/sh_find_boundary.fsh b/shaders/sh_find_boundary/sh_find_boundary.fsh index b70b9085e..f375a4fe8 100644 --- a/shaders/sh_find_boundary/sh_find_boundary.fsh +++ b/shaders/sh_find_boundary/sh_find_boundary.fsh @@ -5,88 +5,52 @@ varying vec2 v_vTexcoord; varying vec4 v_vColour; uniform vec2 dimension; -uniform vec2 minn; +uniform vec4 bbox; uniform int mode; uniform sampler2D texture; void main() { - //float minx = dimension.x; - //float miny = dimension.y; - //float maxx = 0.; - //float maxy = 0.; - - //for(float i = 0.; i <= dimension.x; i++) - //for(float j = 0.; j <= dimension.y; j++) { - // vec4 col = texture2D( gm_BaseTexture, vec2(i, j) / (dimension + 1.) ); - // if(col.r == 0.) continue; - - // minx = min(minx, i); - // miny = min(miny, j); - // maxx = max(maxx, i); - // maxy = max(maxy, j); - //} - float _w = dimension.x; float _h = dimension.y; vec4 col; float i, j; - if(mode == 0) { - float miny = 0.; - for( i = miny; i < _h; i++ ) - for( j = 0.; j < _w; j++ ) { - col = texture2D( texture, vec2(j, i) / dimension); + if(mode == 0) { //minx + for( i = 0.; i < _w; i++ ) + for( j = 0.; j < _h; j++ ) { + col = texture2D( texture, vec2(i, j) / dimension); if(col.r > 0.) { - miny = i; - i = _h; - break; + gl_FragColor = vec4(i); + return; } } - - float minx = 0.; - for( j = 0.; j < _w; j++ ) - for( i = miny; i < _h; i++ ) { + } else if(mode == 1) { //miny + for( i = 0.; i < _h; i++ ) + for( j = bbox.x; j < _w; j++ ) { col = texture2D( texture, vec2(j, i) / dimension); if(col.r > 0.) { - minx = j; - j = _w; - break; + gl_FragColor = vec4(i); + return; } } - - float minx_h = floor(minx / 256.) / 255.; - float minx_l = mod(minx, 256.) / 255.; - float miny_h = floor(miny / 256.) / 255.; - float miny_l = mod(miny, 256.) / 255.; - gl_FragColor = vec4(minx_h, minx_l, miny_h, miny_l); - } else { - float maxy = _h; - for( i = maxy; i >= minn.y; i-- ) - for( j = 0.; j < _w; j++ ) { + } else if(mode == 2) { //maxx + for( i = _w; i > bbox.x; i-- ) + for( j = bbox.y; j < _h; j++ ) { + col = texture2D( texture, vec2(i, j) / dimension); + if(col.r > 0.) { + gl_FragColor = vec4(i); + return; + } + } + } else if(mode == 3) { //maxy + for( i = _h; i > bbox.y; i-- ) + for( j = bbox.x; j < bbox.z; j++ ) { col = texture2D( texture, vec2(j, i) / dimension); if(col.r > 0.) { - maxy = i; - i = 0.; - break; + gl_FragColor = vec4(i); + return; } } - - float maxx = 0.; - for( j = _w; j >= minn.x; j-- ) - for( i = minn.y; i < maxy; i++ ) { - col = texture2D( texture, vec2(j, i) / dimension); - if(col.r > 0.) { - maxx = j; - j = 0.; - break; - } - } - - float maxx_h = floor(maxx / 256.) / 255.; - float maxx_l = mod(maxx, 256.) / 255.; - float maxy_h = floor(maxy / 256.) / 255.; - float maxy_l = mod(maxy, 256.) / 255.; - gl_FragColor = vec4(maxx_h, maxx_l, maxy_h, maxy_l); - } + } }