1.0.9 update

This commit is contained in:
Tanasart 2023-01-09 09:14:20 +07:00
parent 2b1edf0457
commit 2adbd51215
178 changed files with 6612 additions and 3634 deletions

View file

@ -10,6 +10,7 @@
{"id":{"name":"sh_perlin","path":"shaders/sh_perlin/sh_perlin.yy",},"order":1,},
{"id":{"name":"sh_normal_light","path":"shaders/sh_normal_light/sh_normal_light.yy",},"order":0,},
{"id":{"name":"sh_scale3x","path":"shaders/sh_scale3x/sh_scale3x.yy",},"order":31,},
{"id":{"name":"node_csv_file_write","path":"scripts/node_csv_file_write/node_csv_file_write.yy",},"order":13,},
{"id":{"name":"surface_functions","path":"scripts/surface_functions/surface_functions.yy",},"order":5,},
{"id":{"name":"s_node_normal","path":"sprites/s_node_normal/s_node_normal.yy",},"order":28,},
{"id":{"name":"buffer_surface","path":"scripts/buffer_surface/buffer_surface.yy",},"order":3,},
@ -19,11 +20,14 @@
{"id":{"name":"panel_data","path":"scripts/panel_data/panel_data.yy",},"order":0,},
{"id":{"name":"s_node_text_file_read","path":"sprites/s_node_text_file_read/s_node_text_file_read.yy",},"order":16,},
{"id":{"name":"s_node_text_trim","path":"sprites/s_node_text_trim/s_node_text_trim.yy",},"order":18,},
{"id":{"name":"sh_noise_grid_hex","path":"shaders/sh_noise_grid_hex/sh_noise_grid_hex.yy",},"order":24,},
{"id":{"name":"node_3d_obj","path":"scripts/node_3d_obj/node_3d_obj.yy",},"order":8,},
{"id":{"name":"s_node_grid_tri_noise","path":"sprites/s_node_grid_tri_noise/s_node_grid_tri_noise.yy",},"order":22,},
{"id":{"name":"o_dialog_menubox","path":"objects/o_dialog_menubox/o_dialog_menubox.yy",},"order":1,},
{"id":{"name":"s_node_blend","path":"sprites/s_node_blend/s_node_blend.yy",},"order":5,},
{"id":{"name":"draw_text_function","path":"scripts/draw_text_function/draw_text_function.yy",},"order":11,},
{"id":{"name":"libdlgmodule","path":"extensions/libdlgmodule/libdlgmodule.yy",},"order":2,},
{"id":{"name":"node_3d_prim_cone","path":"scripts/node_3d_prim_cone/node_3d_prim_cone.yy",},"order":14,},
{"id":{"name":"node_line","path":"scripts/node_line/node_line.yy",},"order":7,},
{"id":{"name":"s_node_frame","path":"sprites/s_node_frame/s_node_frame.yy",},"order":1,},
{"id":{"name":"node_2d_light","path":"scripts/node_2d_light/node_2d_light.yy",},"order":40,},
@ -79,6 +83,7 @@
{"id":{"name":"s_node_vfx","path":"sprites/s_node_vfx/s_node_vfx.yy",},"order":9,},
{"id":{"name":"draw_surface_blend","path":"scripts/draw_surface_blend/draw_surface_blend.yy",},"order":1,},
{"id":{"name":"sh_simplex","path":"shaders/sh_simplex/sh_simplex.yy",},"order":22,},
{"id":{"name":"node_noise_grid_tri","path":"scripts/node_noise_grid_tri/node_noise_grid_tri.yy",},"order":25,},
{"id":{"name":"blurSurface","path":"scripts/blurSurface/blurSurface.yy",},"order":0,},
{"id":{"name":"node_threshold","path":"scripts/node_threshold/node_threshold.yy",},"order":51,},
{"id":{"name":"sh_cell_noise_edge","path":"shaders/sh_cell_noise_edge/sh_cell_noise_edge.yy",},"order":5,},
@ -101,9 +106,11 @@
{"id":{"name":"s_node_trail","path":"sprites/s_node_trail/s_node_trail.yy",},"order":38,},
{"id":{"name":"sh_level_selector","path":"shaders/sh_level_selector/sh_level_selector.yy",},"order":25,},
{"id":{"name":"string_eval","path":"scripts/string_eval/string_eval.yy",},"order":0,},
{"id":{"name":"sh_noise_grid_tri","path":"shaders/sh_noise_grid_tri/sh_noise_grid_tri.yy",},"order":25,},
{"id":{"name":"globals","path":"scripts/globals/globals.yy",},"order":1,},
{"id":{"name":"s_node_noise_perlin","path":"sprites/s_node_noise_perlin/s_node_noise_perlin.yy",},"order":11,},
{"id":{"name":"s_node_dithering","path":"sprites/s_node_dithering/s_node_dithering.yy",},"order":19,},
{"id":{"name":"s_node_boolean","path":"sprites/s_node_boolean/s_node_boolean.yy",},"order":21,},
{"id":{"name":"node_compare","path":"scripts/node_compare/node_compare.yy",},"order":16,},
{"id":{"name":"s_node_HSV_combine","path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},"order":42,},
{"id":{"name":"node_normal_light","path":"scripts/node_normal_light/node_normal_light.yy",},"order":0,},
@ -115,6 +122,7 @@
{"id":{"name":"s_node_pixel_cloud","path":"sprites/s_node_pixel_cloud/s_node_pixel_cloud.yy",},"order":30,},
{"id":{"name":"node_noise_grid","path":"scripts/node_noise_grid/node_noise_grid.yy",},"order":8,},
{"id":{"name":"s_node_HSV","path":"sprites/s_node_HSV/s_node_HSV.yy",},"order":44,},
{"id":{"name":"s_node_3d_cone","path":"sprites/s_node_3d_cone/s_node_3d_cone.yy",},"order":9,},
{"id":{"name":"s_node_compose","path":"sprites/s_node_compose/s_node_compose.yy",},"order":1,},
{"id":{"name":"s_node_switch","path":"sprites/s_node_switch/s_node_switch.yy",},"order":20,},
{"id":{"name":"s_node_crop","path":"sprites/s_node_crop/s_node_crop.yy",},"order":2,},
@ -159,6 +167,7 @@
{"id":{"name":"node_processor","path":"scripts/node_processor/node_processor.yy",},"order":8,},
{"id":{"name":"animation_controller","path":"scripts/animation_controller/animation_controller.yy",},"order":1,},
{"id":{"name":"s_node_shadow","path":"sprites/s_node_shadow/s_node_shadow.yy",},"order":34,},
{"id":{"name":"s_node_grid_hex_noise","path":"sprites/s_node_grid_hex_noise/s_node_grid_hex_noise.yy",},"order":21,},
{"id":{"name":"sh_zigzag","path":"shaders/sh_zigzag/sh_zigzag.yy",},"order":11,},
{"id":{"name":"sh_color_remove","path":"shaders/sh_color_remove/sh_color_remove.yy",},"order":24,},
{"id":{"name":"s_node_blur","path":"sprites/s_node_blur/s_node_blur.yy",},"order":7,},
@ -166,6 +175,7 @@
{"id":{"name":"s_node_gradient_4points","path":"sprites/s_node_gradient_4points/s_node_gradient_4points.yy",},"order":2,},
{"id":{"name":"s_node_gradient_out","path":"sprites/s_node_gradient_out/s_node_gradient_out.yy",},"order":8,},
{"id":{"name":"s_node_vec3","path":"sprites/s_node_vec3/s_node_vec3.yy",},"order":7,},
{"id":{"name":"sh_vertex_normal_pass","path":"shaders/sh_vertex_normal_pass/sh_vertex_normal_pass.yy",},"order":5,},
{"id":{"name":"surface_valid","path":"scripts/surface_valid/surface_valid.yy",},"order":6,},
{"id":{"name":"sh_blur_radial","path":"shaders/sh_blur_radial/sh_blur_radial.yy",},"order":5,},
{"id":{"name":"node_VFX_renderer","path":"scripts/node_VFX_renderer/node_VFX_renderer.yy",},"order":5,},
@ -184,6 +194,7 @@
{"id":{"name":"node_blur","path":"scripts/node_blur/node_blur.yy",},"order":16,},
{"id":{"name":"s_node_loop","path":"sprites/s_node_loop/s_node_loop.yy",},"order":5,},
{"id":{"name":"node_zigzag","path":"scripts/node_zigzag/node_zigzag.yy",},"order":12,},
{"id":{"name":"node_equation","path":"scripts/node_equation/node_equation.yy",},"order":18,},
{"id":{"name":"preset_data","path":"scripts/preset_data/preset_data.yy",},"order":7,},
{"id":{"name":"_f_h5","path":"fonts/_f_h5/_f_h5.yy",},"order":2,},
{"id":{"name":"node_color","path":"scripts/node_color/node_color.yy",},"order":0,},
@ -262,6 +273,7 @@
{"id":{"name":"notification_system","path":"scripts/notification_system/notification_system.yy",},"order":6,},
{"id":{"name":"node_color_from_hsv","path":"scripts/node_color_from_hsv/node_color_from_hsv.yy",},"order":6,},
{"id":{"name":"s_node_image_copy","path":"sprites/s_node_image_copy/s_node_image_copy.yy",},"order":6,},
{"id":{"name":"node_boolean","path":"scripts/node_boolean/node_boolean.yy",},"order":17,},
{"id":{"name":"node_grid_tri","path":"scripts/node_grid_tri/node_grid_tri.yy",},"order":21,},
{"id":{"name":"window_command_hook","path":"extensions/window_command_hook/window_command_hook.yy",},"order":6,},
{"id":{"name":"slider","path":"scripts/slider/slider.yy",},"order":15,},
@ -307,6 +319,7 @@
{"id":{"name":"s_node_blur_simple","path":"sprites/s_node_blur_simple/s_node_blur_simple.yy",},"order":41,},
{"id":{"name":"node_VFX_spawner","path":"scripts/node_VFX_spawner/node_VFX_spawner.yy",},"order":2,},
{"id":{"name":"libfilesystem","path":"extensions/libfilesystem/libfilesystem.yy",},"order":3,},
{"id":{"name":"s_node_equation","path":"sprites/s_node_equation/s_node_equation.yy",},"order":22,},
{"id":{"name":"sh_color_replace","path":"shaders/sh_color_replace/sh_color_replace.yy",},"order":4,},
{"id":{"name":"Apollo","path":"extensions/Apollo/Apollo.yy",},"order":8,},
{"id":{"name":"rotator","path":"scripts/rotator/rotator.yy",},"order":11,},
@ -325,6 +338,7 @@
{"id":{"name":"matrixGrid","path":"scripts/matrixGrid/matrixGrid.yy",},"order":23,},
{"id":{"name":"_node_VFX_effector","path":"scripts/_node_VFX_effector/_node_VFX_effector.yy",},"order":1,},
{"id":{"name":"areaBox","path":"scripts/areaBox/areaBox.yy",},"order":1,},
{"id":{"name":"node_noise_grid_hex","path":"scripts/node_noise_grid_hex/node_noise_grid_hex.yy",},"order":24,},
{"id":{"name":"node_lua_global","path":"scripts/node_lua_global/node_lua_global.yy",},"order":6,},
{"id":{"name":"o_dialog_preset","path":"objects/o_dialog_preset/o_dialog_preset.yy",},"order":1,},
{"id":{"name":"s_node_erode","path":"sprites/s_node_erode/s_node_erode.yy",},"order":21,},
@ -442,6 +456,7 @@
{"id":{"name":"_p_dialog","path":"objects/_p_dialog/_p_dialog.yy",},"order":0,},
{"id":{"name":"render_data","path":"scripts/render_data/render_data.yy",},"order":2,},
{"id":{"name":"_node_VFX","path":"scripts/_node_VFX/_node_VFX.yy",},"order":4,},
{"id":{"name":"addon_key_displayer","path":"objects/addon_key_displayer/addon_key_displayer.yy",},"order":0,},
{"id":{"name":"s_node_blur_directional","path":"sprites/s_node_blur_directional/s_node_blur_directional.yy",},"order":9,},
{"id":{"name":"distance_to_line","path":"scripts/distance_to_line/distance_to_line.yy",},"order":0,},
{"id":{"name":"s_node_sprite_sheet","path":"sprites/s_node_sprite_sheet/s_node_sprite_sheet.yy",},"order":1,},
@ -461,8 +476,8 @@
{"id":{"name":"node_image_sequence","path":"scripts/node_image_sequence/node_image_sequence.yy",},"order":1,},
{"id":{"name":"node_text_file_read","path":"scripts/node_text_file_read/node_text_file_read.yy",},"order":7,},
{"id":{"name":"s_menu_transparent","path":"sprites/s_menu_transparent/s_menu_transparent.yy",},"order":0,},
{"id":{"name":"sh_palette_replace","path":"shaders/sh_palette_replace/sh_palette_replace.yy",},"order":51,},
{"id":{"name":"key_press","path":"scripts/key_press/key_press.yy",},"order":0,},
{"id":{"name":"curve_power_function","path":"scripts/curve_power_function/curve_power_function.yy",},"order":3,},
{"id":{"name":"sh_mirror","path":"shaders/sh_mirror/sh_mirror.yy",},"order":0,},
{"id":{"name":"sh_cell_noise_random","path":"shaders/sh_cell_noise_random/sh_cell_noise_random.yy",},"order":6,},
{"id":{"name":"node_iterator_input","path":"scripts/node_iterator_input/node_iterator_input.yy",},"order":2,},
@ -535,6 +550,7 @@
{"id":{"name":"s_node_level_selector","path":"sprites/s_node_level_selector/s_node_level_selector.yy",},"order":27,},
{"id":{"name":"random_function","path":"scripts/random_function/random_function.yy",},"order":3,},
{"id":{"name":"s_node_input","path":"sprites/s_node_input/s_node_input.yy",},"order":6,},
{"id":{"name":"addon","path":"objects/addon/addon.yy",},"order":1,},
{"id":{"name":"string_decimal","path":"scripts/string_decimal/string_decimal.yy",},"order":0,},
{"id":{"name":"_f_h3","path":"fonts/_f_h3/_f_h3.yy",},"order":3,},
{"id":{"name":"s_node_math","path":"sprites/s_node_math/s_node_math.yy",},"order":2,},
@ -580,11 +596,14 @@
{"id":{"name":"draw_line_curve","path":"scripts/draw_line_curve/draw_line_curve.yy",},"order":5,},
{"id":{"name":"sh_blend_screen","path":"shaders/sh_blend_screen/sh_blend_screen.yy",},"order":3,},
{"id":{"name":"node_group_output","path":"scripts/node_group_output/node_group_output.yy",},"order":2,},
{"id":{"name":"node_palette_replacement","path":"scripts/node_palette_replacement/node_palette_replacement.yy",},"order":54,},
{"id":{"name":"s_node_scatter","path":"sprites/s_node_scatter/s_node_scatter.yy",},"order":19,},
{"id":{"name":"sh_vertex_depth_pass","path":"shaders/sh_vertex_depth_pass/sh_vertex_depth_pass.yy",},"order":6,},
{"id":{"name":"_f_p2","path":"fonts/_f_p2/_f_p2.yy",},"order":4,},
{"id":{"name":"node_text_file_write","path":"scripts/node_text_file_write/node_text_file_write.yy",},"order":11,},
{"id":{"name":"sh_lum2alpha","path":"shaders/sh_lum2alpha/sh_lum2alpha.yy",},"order":43,},
{"id":{"name":"button","path":"scripts/button/button.yy",},"order":2,},
{"id":{"name":"s_node_3d_sphere","path":"sprites/s_node_3d_sphere/s_node_3d_sphere.yy",},"order":8,},
{"id":{"name":"node_VFX_effector","path":"scripts/node_VFX_effector/node_VFX_effector.yy",},"order":8,},
{"id":{"name":"sh_blur_gaussian","path":"shaders/sh_blur_gaussian/sh_blur_gaussian.yy",},"order":0,},
{"id":{"name":"s_node_3d_cylinder","path":"sprites/s_node_3d_cylinder/s_node_3d_cylinder.yy",},"order":1,},
@ -644,6 +663,7 @@
{"id":{"name":"shell_helper","path":"scripts/shell_helper/shell_helper.yy",},"order":20,},
{"id":{"name":"o_dialog_preference","path":"objects/o_dialog_preference/o_dialog_preference.yy",},"order":15,},
{"id":{"name":"node_wrap","path":"scripts/node_wrap/node_wrap.yy",},"order":2,},
{"id":{"name":"node_3d_prim_sphere","path":"scripts/node_3d_prim_sphere/node_3d_prim_sphere.yy",},"order":13,},
{"id":{"name":"o_dialog_about","path":"objects/o_dialog_about/o_dialog_about.yy",},"order":13,},
{"id":{"name":"dialog_management","path":"scripts/dialog_management/dialog_management.yy",},"order":5,},
{"id":{"name":"draw_shapes","path":"scripts/draw_shapes/draw_shapes.yy",},"order":10,},
@ -686,6 +706,7 @@
{"roomId":{"name":"rm_main","path":"rooms/rm_main/rm_main.yy",},},
],
"Folders": [
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"addons","folderPath":"folders/addons.yy","order":15,},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"animation_curve","folderPath":"folders/animation_curve.yy","order":14,},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"dialog","folderPath":"folders/dialog.yy","order":5,},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"animation","folderPath":"folders/dialog/animation.yy","order":31,},
@ -878,7 +899,6 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_splice_draw.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/tool",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_timeline_elastic.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_timeline_keyframe_selecting.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_timeline_ease_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_draw_area.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_draw_path.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_junction_name_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
@ -979,9 +999,7 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_color_picker_dropper.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_workspace_1.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_inspector_padding.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/inspector",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_prop_on_end_strip3.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/inspector",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_active.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_timeline_keyframes_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"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_slider_strip5.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",},
@ -991,7 +1009,6 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"A9Rwvus4g_1fk5bwb_iqs.tmp","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_checkbox_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_bg_name.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphics x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/inspector",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_inspector_area_strip2.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/inspector",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_cache.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_timeline_keyframe_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
@ -1007,7 +1024,6 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_noti_icon_file_save.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_noti_icon_file_load.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_state_strip2.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_dialog_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_refresh_24.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_tile_view_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
@ -1033,15 +1049,23 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_new_badge.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_junctions_single.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphics x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_glow.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"Collections.zip","CopyToMask":-1,"filePath":"datafiles/data",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"FiraCode-Medium.ttf","CopyToMask":-1,"filePath":"datafiles/data/themes/default/fonts",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_textbox_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_textbox_code_line.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/widget",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_prop_on_end.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/inspector",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphics x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/inspector",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"1.png.tmp$$","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphics x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_view_group.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_key_display.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/UI",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphic x2.ai","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_timeline_ease_strip4.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/timeline",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"default.zip","CopyToMask":-1,"filePath":"datafiles/data/themes",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"Collections.zip","CopyToMask":-1,"filePath":"datafiles/data",},
],
"MetaData": {
"IDEVersion": "2022.11.1.56",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

View file

@ -382,6 +382,13 @@
"yorigin": 16,
"slice": null
},
"view_group": {
"path": "./icon/s_view_group.png",
"subimages": 2,
"xorigin": 24,
"yorigin": 24,
"slice": null
},
"view_mode": {
"path": "./icon/s_view_mode_strip2.png",
"subimages": 2,
@ -439,8 +446,8 @@
"slice": null
},
"prop_on_end": {
"path": "./inspector/s_prop_on_end_strip3.png",
"subimages": 3,
"path": "./inspector/s_prop_on_end.png",
"subimages": 4,
"xorigin": 16,
"yorigin": 16,
"slice": null
@ -818,6 +825,19 @@
"bottom": 5
}
},
"key_display": {
"path": "./UI/s_key_display.png",
"subimages": 1,
"xorigin": 0,
"yorigin": 0,
"slice": {
"enabled": true,
"left": 10,
"right": 10,
"top": 10,
"bottom": 10
}
},
"toolbar_shadow": {
"path": "./UI/s_toolbar_shadow.png",
"subimages": 1,

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 883 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 559 B

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,2 @@
/// @description
name = "";

33
objects/addon/addon.yy Normal file
View file

@ -0,0 +1,33 @@
{
"resourceType": "GMObject",
"resourceVersion": "1.0",
"name": "addon",
"spriteId": null,
"solid": false,
"visible": true,
"managed": true,
"spriteMaskId": null,
"persistent": false,
"parentObjectId": null,
"physicsObject": false,
"physicsSensor": false,
"physicsShape": 1,
"physicsGroup": 1,
"physicsDensity": 0.5,
"physicsRestitution": 0.1,
"physicsLinearDamping": 0.1,
"physicsAngularDamping": 0.1,
"physicsFriction": 0.2,
"physicsStartAwake": true,
"physicsKinematic": false,
"physicsShapePoints": [],
"eventList": [
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","isDnD":false,"eventNum":0,"eventType":0,"collisionObjectId":null,},
],
"properties": [],
"overriddenProperties": [],
"parent": {
"name": "addons",
"path": "folders/addons.yy",
},
}

View file

@ -0,0 +1,7 @@
/// @description
event_inherited();
name = "Key display";
alpha = 0;
disp_text = "";
depth = -999;

View file

@ -0,0 +1,44 @@
/// @description
#region draw
var key = "";
if(keyboard_check(vk_control))
key += "Ctrl";
if(keyboard_check(vk_shift))
key += key == ""? "Shift" : " + Shift";
if(keyboard_check(vk_alt))
key += key == ""? "Alt" : " + Alt";
if(keyboard_check(vk_anykey)) {
var pres = keyboard_lastkey;
if(pres >= 32 && pres <= 126) {
pres = string_upper(ansi_char(pres));
key += key == ""? pres : " + " + pres;
}
}
var pressing = key != "";
if(key != "") {
disp_text = key;
alpha = 2;
} else
alpha = lerp_linear(alpha, 0, 0.01);
if(alpha > 0) {
draw_set_text(f_h3, fa_right, fa_bottom, COLORS._main_icon_dark);
var ww = string_width(disp_text) + ui(16);
var hh = string_height(disp_text) + ui(16);
var x1 = WIN_W - ui(8);
var y1 = WIN_H - ui(8);
var x0 = x1 - ww;
var y0 = y1 - hh;
draw_sprite_stretched_ext(THEME.key_display, 0, x0, y0, ww, hh,
pressing? COLORS._main_accent : COLORS._main_icon, alpha);
draw_set_alpha(alpha);
draw_text(x1 - ui(8), y1 - ui(8), disp_text);
draw_set_alpha(1);
}
#endregion

View file

@ -0,0 +1,37 @@
{
"resourceType": "GMObject",
"resourceVersion": "1.0",
"name": "addon_key_displayer",
"spriteId": null,
"solid": false,
"visible": true,
"managed": true,
"spriteMaskId": null,
"persistent": false,
"parentObjectId": {
"name": "addon",
"path": "objects/addon/addon.yy",
},
"physicsObject": false,
"physicsSensor": false,
"physicsShape": 1,
"physicsGroup": 1,
"physicsDensity": 0.5,
"physicsRestitution": 0.1,
"physicsLinearDamping": 0.1,
"physicsAngularDamping": 0.1,
"physicsFriction": 0.2,
"physicsStartAwake": true,
"physicsKinematic": false,
"physicsShapePoints": [],
"eventList": [
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","isDnD":false,"eventNum":75,"eventType":8,"collisionObjectId":null,},
{"resourceType":"GMEvent","resourceVersion":"1.0","name":"","isDnD":false,"eventNum":0,"eventType":0,"collisionObjectId":null,},
],
"properties": [],
"overriddenProperties": [],
"parent": {
"name": "addons",
"path": "folders/addons.yy",
},
}

View file

@ -146,7 +146,7 @@ event_inherited();
var hh = 0;
var _hover = sHOVER && content_pane.hover;
if(ADD_NODE_MODE == 0) {
if(PREF_MAP[? "dialog_add_node_view"] == 0) {
var grid_size = ui(64);
var grid_width = ui(80);
var grid_space = ui(12);
@ -160,6 +160,8 @@ event_inherited();
for(var index = 0; index < node_count; index++) {
var _node = node_list[| index];
if(is_string(_node)) {
if(!PREF_MAP[? "dialog_add_node_grouping"])
continue;
hh += curr_height;
yy += curr_height;
@ -216,7 +218,7 @@ event_inherited();
hh += curr_height;
yy += curr_height;
} else if(ADD_NODE_MODE == 1) {
} else if(PREF_MAP[? "dialog_add_node_view"] == 1) {
var list_width = content_pane.surface_w;
var list_height = ui(28);
var yy = _y + list_height / 2;
@ -226,6 +228,9 @@ event_inherited();
var _node = node_list[| i];
if(is_string(_node)) {
if(!PREF_MAP[? "dialog_add_node_grouping"])
continue;
hh += ui(8);
yy += ui(8);
@ -359,7 +364,7 @@ event_inherited();
var hh = 0;
var _hover = sHOVER && search_pane.hover;
if(ADD_NODE_MODE == 0) {
if(PREF_MAP[? "dialog_add_node_view"] == 0) {
var grid_size = ui(64);
var grid_width = ui(80);
var grid_space = ui(16);
@ -434,7 +439,7 @@ event_inherited();
yy += hght;
}
}
} else if(ADD_NODE_MODE == 1) {
} else if(PREF_MAP[? "dialog_add_node_view"] == 1) {
var list_width = search_pane.surface_w;
var list_height = ui(28);
var yy = _y + list_height / 2;

View file

@ -31,11 +31,18 @@ if !ready exit;
search_pane.draw(dialog_x + ui(16), dialog_y + ui(52));
}
tb_search.draw(dialog_x + ui(14), dialog_y + ui(14), dialog_w - ui(64), ui(32), search_string, mouse_ui);
tb_search.draw(dialog_x + ui(14), dialog_y + ui(14), dialog_w - ui(96), ui(32), search_string, mouse_ui);
var bx = dialog_x + dialog_w - ui(44);
var by = dialog_y + ui(16);
var b = buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sFOCUS, sHOVER,
ADD_NODE_MODE == 1? "List view" : "Grid view", THEME.view_mode, ADD_NODE_MODE, COLORS._main_icon);
PREF_MAP[? "dialog_add_node_view"]? "List view" : "Grid view", THEME.view_mode, PREF_MAP[? "dialog_add_node_view"], COLORS._main_icon);
if(b == 2)
ADD_NODE_MODE = !ADD_NODE_MODE;
PREF_MAP[? "dialog_add_node_view"] = !PREF_MAP[? "dialog_add_node_view"];
bx -= ui(32);
var b = buttonInstant(THEME.button_hide, bx, by, ui(28), ui(28), mouse_ui, sFOCUS, sHOVER,
PREF_MAP[? "dialog_add_node_grouping"]? "Group enabled" : "Group disabled", THEME.view_group, PREF_MAP[? "dialog_add_node_grouping"], COLORS._main_icon);
if(b == 2)
PREF_MAP[? "dialog_add_node_grouping"] = !PREF_MAP[? "dialog_add_node_grouping"];
#endregion

View file

@ -39,7 +39,7 @@ if !ready exit;
if(!in.animator.is_anim) continue;
for(var j = 0; j < ds_list_size(in.animator.values); j++) {
var t = in.animator.values[| j];
t.time = t.ratio * len;
t.time = t.ratio * scale_to;
}
}
}

View file

@ -120,7 +120,7 @@ event_inherited();
function sortPalette(sortFunc) {
array_sort(palette, sortFunc);
selector.onApply();
onApply(palette);
}
#endregion

View file

@ -153,7 +153,7 @@ if palette == 0 exit;
if(array_length(palette) > 1) {
if(buttonInstant(THEME.button, bx, by, ui(28), ui(28), mouse_ui, sFOCUS, sHOVER, "", THEME.minus) == 2) {
array_resize(palette, array_length(palette) - 1);
array_delete(palette, index_selecting, 1);
onApply(palette);
}
} else {

View file

@ -1,3 +1,8 @@
enum CAMERA_PROJ {
ortho,
perspective
}
#region setup
globalvar PRIMITIVES, FORMAT_PT, FORMAT_PNT;
PRIMITIVES = ds_map_create();
@ -110,22 +115,17 @@
#region helper
function _3d_node_init(iDim, iPos, iRot, iSca) {
uniVertex_lightFor = shader_get_uniform(sh_vertex_pnt_light, "u_LightForward");
uniLightAmb = shader_get_uniform(sh_vertex_pnt_light, "u_AmbientLight");
uniLightClr = shader_get_uniform(sh_vertex_pnt_light, "u_LightColor");
uniLightInt = shader_get_uniform(sh_vertex_pnt_light, "u_LightIntensity");
uniLightNrm = shader_get_uniform(sh_vertex_pnt_light, "useNormal");
VB = [];
use_normal = true;
TM = matrix_build(0, 0, 0, 0, 0, 0, 1, 1, 1);
cam = camera_create();
cam_view = matrix_build_lookat(0, 0, 1, 0, 0, 0, 0, 1, 0);
cam_proj = matrix_build_projection_ortho(1, 1, 1, 100);
camera_set_proj_mat(cam, cam_view);
camera_set_view_mat(cam, cam_proj);
camera_set_view_mat(cam, cam_view);
camera_set_proj_mat(cam, cam_proj);
drag_index = -1;
drag_sv = 0;
@ -138,7 +138,7 @@
input_sca = iSca;
}
function _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny, inv = false) {
function _3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny, invx = false, invy = true) {
if(inputs[| input_pos].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny)) active = false;
var _dim = inputs[| input_dim].getValue();
@ -158,7 +158,7 @@
if(drag_index == 0) {
var dx = (_mx - drag_mx) / _s * -6;
_rot[1] = drag_sv - dx * (inv? -1 : 1);
_rot[1] = drag_sv - dx * (invx? -1 : 1);
if(inputs[| input_rot].setValue(_rot))
UNDO_HOLDING = true;
@ -169,7 +169,7 @@
}
} else if(drag_index == 1) {
var dy = (_my - drag_my) / _s * 6;
_rot[0] = drag_sv - dy * (inv? -1 : 1);
_rot[0] = drag_sv - dy * (invy? -1 : 1);
if(inputs[| input_rot].setValue(_rot))
UNDO_HOLDING = true;
@ -237,29 +237,57 @@
matrix_stack_pop();
}
function _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _applyLocal = true) {
function _3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj = CAMERA_PROJ.perspective, _fov = 60, _pass = "diff", _applyLocal = true) {
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
var cam_proj = matrix_build_projection_ortho(_dim[0], _dim[1], 1, 100);
camera_set_proj_mat(cam, cam_proj);
camera_set_view_size(cam, _dim[0], _dim[1]);
var lightFor = [ -cos(degtorad(_ldir)), -_lhgt, -sin(degtorad(_ldir)) ];
gpu_set_ztestenable(true);
surface_set_target(_outSurf);
draw_clear_alpha(0, 0);
shader_set(sh_vertex_pnt_light);
var shader = sh_vertex_pnt_light;
if(_pass == "diff") shader = sh_vertex_pnt_light;
else if(_pass == "norm") shader = sh_vertex_normal_pass;
else if(_pass == "dept") shader = sh_vertex_depth_pass;
uniVertex_lightFor = shader_get_uniform(shader, "u_LightForward");
uniLightAmb = shader_get_uniform(shader, "u_AmbientLight");
uniLightClr = shader_get_uniform(shader, "u_LightColor");
uniLightInt = shader_get_uniform(shader, "u_LightIntensity");
uniLightNrm = shader_get_uniform(shader, "useNormal");
shader_set(shader);
shader_set_uniform_f_array(uniVertex_lightFor, lightFor);
shader_set_uniform_f_array(uniLightAmb, colorArrayFromReal(_aclr));
shader_set_uniform_f_array(uniLightClr, colorArrayFromReal(_lclr));
shader_set_uniform_f(uniLightInt, _lint);
shader_set_uniform_i(uniLightNrm, use_normal);
var cam_view, cam_proj;
if(_proj == CAMERA_PROJ.ortho) {
cam_view = matrix_build_lookat(0, 0, 128, 0, 0, 0, 0, 1, 0);
cam_proj = matrix_build_projection_ortho(_dim[0], _dim[1], 0.1, 256);
} else {
var _adjFov = power(_fov / 90, 1 / 4) * 90;
var dist = _dim[0] / 2 * dtan(90 - _adjFov);
cam_view = matrix_build_lookat(0, 0, 1 + dist, 0, 0, 0, 0, 1, 0);
cam_proj = matrix_build_projection_perspective(_dim[0], _dim[1], dist, dist + 256);
}
var cam = camera_get_active();
camera_set_view_size(cam, _dim[0], _dim[1]);
camera_set_view_mat(cam, cam_view);
camera_set_proj_mat(cam, cam_proj);
camera_apply(cam);
matrix_stack_push(matrix_build(_pos[0], _pos[1], 0, 0, 0, 0, _dim[0] * _sca[0], _dim[1] * _sca[1], 1));
if(_proj == CAMERA_PROJ.ortho)
matrix_stack_push(matrix_build(_dim[0] / 2 - _pos[0], _pos[1] - _dim[1] / 2, 0, 0, 0, 0, _dim[0] * _sca[0], _dim[1] * _sca[1], 1));
else
matrix_stack_push(matrix_build(_dim[0] / 2 - _pos[0], _pos[1] - _dim[1] / 2, 0, 0, 0, 0, _dim[0] * _sca[0], _dim[1] * _sca[1], 1));
//matrix_stack_push(matrix_build(0, 0, 0, 0, 0, 0, 1, 1, 1));
if(_applyLocal) _3d_local_transform(_lpos, _lrot, _lsca);
matrix_set(matrix_world, matrix_stack_top());
@ -272,7 +300,10 @@
matrix_set(matrix_world, MATRIX_IDENTITY);
gpu_set_ztestenable(false);
camera_apply(0);
var cam = camera_get_active();
camera_set_view_mat(cam, matrix_build_lookat(0, 0, 1, 0, 0, 0, 0, 1, 0));
camera_set_proj_mat(cam, matrix_build_projection_ortho(1, 1, 0.1, 256));
camera_apply(cam);
surface_reset_target();
}

View file

@ -118,7 +118,7 @@ function __part(_node) constructor {
rot = point_direction(xp, yp, x, y);
else
rot += rot_s;
alp_draw = alp * eval_bezier_cubic(1 - life / life_total, alp_fade[0], alp_fade[1], alp_fade[2], alp_fade[3]);
alp_draw = alp * eval_curve_bezier_cubic_x(alp_fade, 1 - life / life_total);
if(step_int > 0 && safe_mod(life, step_int) == 0)
node.onPartStep(self);

View file

@ -40,7 +40,7 @@ function Node_VFX(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
.setDisplay(VALUE_DISPLAY.gradient);
inputs[| 14] = nodeValue(14, "Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
.setDisplay(VALUE_DISPLAY.range);
inputs[| 15] = nodeValue(15, "Alpha over time", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, [1, 1, 1, 1]);
inputs[| 15] = nodeValue(15, "Alpha over time", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11);
inputs[| 16] = nodeValue(16, "Rotate by direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);

View file

@ -25,7 +25,7 @@ function Node_Particle_Effector(_x, _y, _group = -1) : Node(_x, _y, _group) cons
inputs[| 2] = nodeValue(2, "Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ])
.setDisplay(VALUE_DISPLAY.area);
inputs[| 3] = nodeValue(3, "Falloff", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, [0, 0, 1, 1] )
inputs[| 3] = nodeValue(3, "Falloff", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_01 )
.setDisplay(VALUE_DISPLAY.curve);
inputs[| 4] = nodeValue(4, "Falloff distance", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4 );

View file

@ -35,7 +35,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = -1) : Node(_x, _y, _group) const
.setDisplay(VALUE_DISPLAY.gradient);
inputs[| 13] = nodeValue(13, "Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
.setDisplay(VALUE_DISPLAY.range);
inputs[| 14] = nodeValue(14, "Alpha over time", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, [1, 1, 1, 1]);
inputs[| 14] = nodeValue(14, "Alpha over time", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11);
inputs[| 15] = nodeValue(15, "Rotate by direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);

View file

@ -70,8 +70,6 @@ function APPEND(_path) {
appended_list[| i].preConnect();
for(var i = 0; i < ds_list_size(appended_list); i++)
appended_list[| i].connect();
for(var i = 0; i < ds_list_size(appended_list); i++)
appended_list[| i].postConnect();
} catch(e) {
log_warning("APPEND, connect", exception_print(e));
}
@ -85,8 +83,6 @@ function APPEND(_path) {
}
printlog("Update time: " + string(current_time - t)); t = current_time;
ds_list_destroy(appended_list);
Render(true);
if(!ds_queue_empty(CONNECTION_CONFLICT)) {
@ -113,6 +109,15 @@ function APPEND(_path) {
}
printlog("Conflict time: " + string(current_time - t)); t = current_time;
try {
for(var i = 0; i < ds_list_size(appended_list); i++)
appended_list[| i].postConnect();
} catch(e) {
log_warning("APPEND, connect", exception_print(e));
}
ds_list_destroy(appended_list);
APPENDING = false;
PANEL_ANIMATION.updatePropertyList();
UPDATE = RENDER_TYPE.full;

View file

@ -1,3 +1,10 @@
function array_create_from_list(list) {
var arr = array_create(ds_list_size(list));
for( var i = 0; i < ds_list_size(list); i++ )
arr[i] = list[| i];
return arr;
}
function array_safe_set(arr, index, value) {
if(index < 0) return;
if(index >= array_length(arr)) return;
@ -56,3 +63,21 @@ function array_clone(arr) {
}
return _res;
}
function array_min(arr) {
if(array_length(arr) == 0) return 0;
var mn = arr[0];
for( var i = 0; i < array_length(arr); i++ )
mn = min(mn, arr[i]);
return mn;
}
function array_max(arr) {
if(array_length(arr) == 0) return 0;
var mx = arr[0];
for( var i = 0; i < array_length(arr); i++ )
mx = max(mx, arr[i]);
return mx;
}

View file

@ -17,32 +17,49 @@ function curveBox(_onModify) constructor {
static curve_amo = 3;
var curve_h = _h;
#region curve
var _range;
_range = bezier_range(_data[0], _data[1], _data[2], _data[3]);
var yS = _data[0];
var x0 = _data[1], y0 = _data[2];
var x1 = _data[3], y1 = _data[4];
var yE = _data[5];
var _range = bezier_range(_data);
var y_min = min(0, _range[0]);
var y_max = max(1, _range[1]);
var y_range = y_max - y_min;
var _y_0 = get_y(0, _y, curve_h, y_max, y_range);
var _y_1 = get_y(1, _y, curve_h, y_max, y_range);
var yS = get_y(yS, _y, curve_h, y_max, y_range);
var yE = get_y(yE, _y, curve_h, y_max, y_range);
#region draw frame
draw_set_color(COLORS.widget_curve_outline);
draw_set_alpha(0.5);
draw_line(_x + _w / 3, _y, _x + _w / 3, _y + curve_h);
draw_line(_x + _w / 3 * 2, _y, _x + _w / 3 * 2, _y + curve_h);
draw_line(_x, _y_0, _x + _w, _y_0);
draw_line(_x, _y_1, _x + _w, _y_1);
draw_line(_x, yS, _x + _w, yS);
draw_line(_x, yE, _x + _w, yE);
draw_set_alpha(1);
draw_rectangle(_x, _y, _x + _w, _y + curve_h, true);
#endregion
if(node_dragging != -1) {
if(node_dragging == 0 || node_dragging == 3) {
var targ = node_dragging == 0? 0 : 5;
var _my = -((_m[1] - _y) / curve_h * drag_range - drag_max);
_my = clamp(_my, 0, 1);
_data[node_dragging] = _my;
_data[targ] = _my;
if(mouse_release(mb_left)) {
onModify(_data);
node_dragging = -1;
}
} else if(node_dragging != -1) {
var _mx = (_m[0] - _x) / _w;
_mx = clamp(_mx, 0, 1);
var _my = -((_m[1] - _y) / curve_h * drag_range - drag_max);
_my = clamp(_my, 0, 1);
_data[1 + (node_dragging - 1) * 2 + 0] = _mx;
_data[1 + (node_dragging - 1) * 2 + 1] = _my;
if(mouse_release(mb_left)) {
onModify(_data);
@ -50,23 +67,25 @@ function curveBox(_onModify) constructor {
}
}
var _y0 = _data[0];
var _y1 = _data[1];
var _y2 = _data[2];
var _y3 = _data[3];
var node_hovering = -1;
var points = [ [0, _data[0]], [_data[1], _data[2]], [_data[3], _data[4]], [1, _data[5]] ];
var _dy = _y + (y_max - 1) / y_range * curve_h;
var _dh = -curve_h / y_range;
var _sx = _x + points[0][0] * _w
var _sy = get_y(points[0][1], _y, curve_h, y_max, y_range);
var _ex = _x + points[3][0] * _w
var _ey = get_y(points[3][1], _y, curve_h, y_max, y_range);
draw_set_color(COLORS.widget_curve_line);
draw_line_bezier_cubic(_x, _dy, _w, _dh, _y0, _y1, _y2, _y3);
var node_hovering = -1;
for(var i = 0; i < 4; i++) {
var _nx = i / 3 * _w + _x;
var _ny = get_y(_data[i], _y, curve_h, y_max, y_range);
var _nx = _x + points[i][0] * _w;
var _ny = get_y(points[i][1], _y, curve_h, y_max, y_range);
if(i == 1)
draw_line(_sx, _sy, _nx, _ny);
else if(i == 2)
draw_line(_nx, _ny, _ex, _ey);
draw_set_color(COLORS.widget_curve_outline);
draw_circle(_nx, _ny, 3, false);
if(hover && point_in_circle(_m[0], _m[1], _nx, _ny, 6)) {
@ -75,22 +94,17 @@ function curveBox(_onModify) constructor {
}
}
if(mouse_press(mb_left, active)) {
if(node_hovering != -1) {
var _dy = _y + (y_max - 1) / y_range * curve_h;
var _dh = -curve_h / y_range;
draw_set_color(COLORS._main_accent);
draw_line_bezier_cubic(_x, _dy, _w, _dh, _data);
if(mouse_press(mb_left, active) && node_hovering != -1) {
node_dragging = node_hovering;
drag_range = y_range;
drag_max = y_max;
}
} else if(mouse_press(mb_right, active)) {
switch(node_hovering) {
case 0 : _data[0] = 0; break;
case 1 : _data[1] = 0; break;
case 2 : _data[2] = 1; break;
case 3 : _data[3] = 1; break;
}
onModify(_data);
}
#endregion
active = false;
hover = false;

View file

@ -1,27 +1,95 @@
function draw_line_bezier_cubic(x0, y0, _w, _h, c0, c1, c2, c3) {
#macro CURVE_DEF_01 [0, 1/3, 1/3, 2/3, 2/3, 1]
#macro CURVE_DEF_11 [1, 1/3, 1, 2/3, 1, 1]
function draw_line_bezier_cubic(x0, y0, _w, _h, _bz) {
static SAMPLE = 32;
var _oy;
var _ox, _oy;
for(var i = 0; i <= SAMPLE; i++) {
var t = i / SAMPLE;
var _ry = eval_bezier_cubic(t, c0, c1, c2, c3);
var _r = eval_bezier_cubic(t, _bz);
var _rx = _r[0], _ry = _r[1];
var _nx = _rx * _w + x0;
var _ny = (_h? _ry : 1 - _ry) * abs(_h) + y0;
if(i) draw_line((i - 1) / SAMPLE * _w + x0, _oy, t * _w + x0, _ny);
if(i)
draw_line(_ox, _oy, _nx, _ny);
_ox = _nx;
_oy = _ny;
}
}
function eval_bezier_cubic(t, c0, c1, c2, c3) {
return power(1 - t, 3) * c0 + 3 * power(1 - t, 2) * t * c1 + 3 * (1 - t) * power(t, 2) * c2 + power(t, 3) * c3;
function eval_bezier_cubic(t, _bz) {
return [
power(1 - t, 3) * 0
+ 3 * power(1 - t, 2) * t * _bz[1]
+ 3 * (1 - t) * power(t, 2) * _bz[3]
+ power(t, 3) * 1,
power(1 - t, 3) * _bz[0]
+ 3 * power(1 - t, 2) * t * _bz[2]
+ 3 * (1 - t) * power(t, 2) * _bz[4]
+ power(t, 3) * _bz[5]
];
}
function eval_curve_bezier_cubic(curve, t) {
return eval_bezier_cubic(t, curve[0], curve[1], curve[2], curve[3]);
function eval_curve_bezier_cubic_x(_bz, _x, _prec = 0.00001) {
var st = 0;
var ed = 1;
var _xt = _x;
var _binRep = 5;
repeat(_binRep) {
var _ftx = power(1 - _xt, 3) * 0
+ 3 * power(1 - _xt, 2) * _xt * _bz[1]
+ 3 * (1 - _xt) * power(_xt, 2) * _bz[3]
+ power(_xt, 3) * 1;
if(abs(_ftx - _x) < _prec)
return eval_curve_bezier_cubic_t(_bz, _xt);
if(_xt < _x)
st = _xt;
else
ed = _xt;
_xt = (st + ed) / 2;
}
var _newRep = 8;
repeat(_newRep) {
var slope = (9 * _bz[1] - 9 * _bz[3] + 3) * _xt * _xt
+ (-12 * _bz[1] + 6 * _bz[3]) * _xt
+ 3 * _bz[1];
var _ftx = power(1 - _xt, 3) * 0
+ 3 * power(1 - _xt, 2) * _xt * _bz[1]
+ 3 * (1 - _xt) * power(_xt, 2) * _bz[3]
+ power(_xt, 3) * 1
- _x;
_xt -= _ftx / slope;
if(abs(_ftx) < _prec)
break;
}
return eval_curve_bezier_cubic_t(_bz, _xt);
}
function bezier_range(c0, c1, c2, c3) {
return [ min(c0, c1, c2, c3), max(c0, c1, c2, c3) ];
function eval_curve_bezier_cubic_t(_bz, t) {
return power(1 - t, 3) * _bz[0]
+ 3 * power(1 - t, 2) * t * _bz[2]
+ 3 * (1 - t) * power(t, 2) * _bz[4]
+ power(t, 3) * _bz[5];
}
function bezier_range(bz) {
return [ min(bz[0], bz[2], bz[4], bz[5]), max(bz[0], bz[2], bz[4], bz[5]) ];
}
function bezier_interpol_x(a, b, t, iteration = 10) {

View file

@ -1,23 +0,0 @@
function draw_line_power(x0, y0, _w, _h, c0, c1, c2, c3) {
static SAMPLE = 32;
var _oy;
for(var i = 0; i <= SAMPLE; i++) {
var t = i / SAMPLE;
var _ry = eval_bezier_cubic(t, c0, c1, c2, c3);
var _ny = (_h? _ry : 1 - _ry) * abs(_h) + y0;
if(i) draw_line((i - 1) / SAMPLE * _w + x0, _oy, t * _w + x0, _ny);
_oy = _ny;
}
}
function ease_power_in(rat, pow) {
return power(rat, pow);
}
function ease_power_out(rat, pow) {
return 1 - power(1 - rat, pow);
}
function ease_power_inout(rat, pow) {
return rat < 0.5 ? ease_power_in(2 * rat, pow) / 2 : (ease_power_out(2 * rat - 1, pow) + 1) / 2;
}

View file

@ -10,16 +10,16 @@ function draw_line_width2(x0, y0, x1, y1, w0, w1, cap = false) {
var _y3 = y1 + lengthdir_y(w1 / 2, aa + 180);
draw_primitive_begin(pr_trianglestrip);
draw_vertex(round(_x0), round(_y0));
draw_vertex(round(_x1), round(_y1));
draw_vertex(round(_x2), round(_y2));
draw_vertex(round(_x3), round(_y3));
draw_vertex(_x0, _y0);
draw_vertex(_x1, _y1);
draw_vertex(_x2, _y2);
draw_vertex(_x3, _y3);
draw_primitive_end();
if(cap && w0 / 2 - 1 > 0) {
//draw_set_color(c_red);
draw_circle(round(x0) - 1, round(y0) - 1, w0 / 2 - 1, 0);
draw_circle(round(x1) - 1, round(y1) - 1, w1 / 2 - 1, 0);
draw_circle(x0 - 1, y0 - 1, w0 / 2 - 1, 0);
draw_circle(x1 - 1, y1 - 1, w1 / 2 - 1, 0);
}
}
@ -30,10 +30,10 @@ function draw_line_width2_angle(x0, y0, x1, y1, w0, w1, a0 = 0, a1 = 0) {
var _y1 = y1 + lengthdir_y(w1 / 2, a1);
draw_primitive_begin(pr_trianglestrip);
draw_vertex(round(x0), round(y0));
draw_vertex(round(x1), round(y1));
draw_vertex(round(_x0), round(_y0));
draw_vertex(round(_x1), round(_y1));
draw_vertex( x0, y0);
draw_vertex( x1, y1);
draw_vertex(_x0, _y0);
draw_vertex(_x1, _y1);
draw_primitive_end();
var _x0 = x0 + lengthdir_x(w0 / 2, a0 + 180);
@ -42,9 +42,9 @@ function draw_line_width2_angle(x0, y0, x1, y1, w0, w1, a0 = 0, a1 = 0) {
var _y1 = y1 + lengthdir_y(w1 / 2, a1 + 180);
draw_primitive_begin(pr_trianglestrip);
draw_vertex(round(x0), round(y0));
draw_vertex(round(x1), round(y1));
draw_vertex(round(_x0), round(_y0));
draw_vertex(round(_x1), round(_y1));
draw_vertex( x0, y0);
draw_vertex( x1, y1);
draw_vertex(_x0, _y0);
draw_vertex(_x1, _y1);
draw_primitive_end();
}

View file

@ -1,4 +1,4 @@
function draw_sprite_fit(spr, ind, xx, yy, w, h) {
var ss = min(w / sprite_get_width(spr), h / sprite_get_height(spr));
draw_sprite_ext(spr, ind, xx, yy, w, h, 0, c_white, 1);
draw_sprite_ext(spr, ind, xx, yy, ss, ss, 0, c_white, 1);
}

View file

@ -22,7 +22,7 @@
globalvar VERSION, SAVEFILE_VERSION, VERSION_STRING;
VERSION = 1090;
SAVEFILE_VERSION = 1080;
SAVEFILE_VERSION = 1090;
VERSION_STRING = "1.0.9";
globalvar NODES, NODE_MAP, APPEND_MAP, HOTKEYS, HOTKEY_CONTEXT;
@ -51,11 +51,10 @@
TEXTBOX_ACTIVE = noone;
DIALOG_CLICK = true;
globalvar ADD_NODE_PAGE, ADD_NODE_W, ADD_NODE_H, ADD_NODE_MODE;
globalvar ADD_NODE_PAGE, ADD_NODE_W, ADD_NODE_H;
ADD_NODE_PAGE = 0;
ADD_NODE_W = -1;
ADD_NODE_H = -1;
ADD_NODE_MODE = 0;
#endregion
#region macro

View file

@ -120,8 +120,6 @@ function LOAD_PATH(path, readonly = false) {
create_list[| i].preConnect();
for(var i = 0; i < ds_list_size(create_list); i++)
create_list[| i].connect();
for(var i = 0; i < ds_list_size(create_list); i++)
create_list[| i].postConnect();
} catch(e) {
log_warning("LOAD, connect", exception_print(e));
}
@ -154,6 +152,13 @@ function LOAD_PATH(path, readonly = false) {
}
}
try {
for(var i = 0; i < ds_list_size(create_list); i++)
create_list[| i].postConnect();
} catch(e) {
log_warning("LOAD, connect", exception_print(e));
}
UPDATE = RENDER_TYPE.full;
LOADING = false;

View file

@ -48,6 +48,8 @@ function draw_code(_x, _y, str) {
for( var i = 0; i < amo; i++ ) {
var _w = stringSplice[i];
_w = string_trim_end(_w);
isStr = !isStr;
if(isStr) {

View file

@ -52,12 +52,15 @@ function Node_2D_light(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 13] = nodeValue(13, "Radial start", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.rotation);
inputs[| 14] = nodeValue(14, "Radial band ratio", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "Light only", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
input_display_list = [ 0,
["Shape", false], 1, 2, 6, 7, 8, 9,
["Light", false], 3, 4, 5, 12, 13,
["Light", false], 3, 4, 5, 12, 13, 14,
["Render", false], 11, 10
];
@ -97,6 +100,7 @@ function Node_2D_light(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 12].setVisible(true);
inputs[| 13].setVisible(true);
inputs[| 14].setVisible(true);
break;
case LIGHT_SHAPE_2D.line :
case LIGHT_SHAPE_2D.line_asym :
@ -109,6 +113,7 @@ function Node_2D_light(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 12].setVisible(false);
inputs[| 13].setVisible(false);
inputs[| 14].setVisible(false);
break;
case LIGHT_SHAPE_2D.spot :
inputs[| 2].setVisible(false);
@ -120,6 +125,7 @@ function Node_2D_light(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 12].setVisible(false);
inputs[| 13].setVisible(false);
inputs[| 14].setVisible(false);
break;
}
@ -156,12 +162,13 @@ function Node_2D_light(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
case LIGHT_SHAPE_2D.point :
var _rbnd = _data[12];
var _rbns = _data[13];
var _rbnr = _data[14];
if(_rbnd < 2)
draw_circle_color(_pos[0], _pos[1], _range, c_white, c_black, 0);
else {
_rbnd *= 2;
var bnd_amo = ceil(64 / _rbnd);
var bnd_amo = ceil(64 / _rbnd); //band radial per step
var step = bnd_amo * _rbnd;
var astp = 360 / step;
var ox, oy, nx, ny;
@ -169,12 +176,12 @@ function Node_2D_light(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
draw_primitive_begin(pr_trianglelist);
for( var i = 0; i < step; i++ ) {
for( var i = 0; i <= step; i++ ) {
var dir = _rbns + i * astp;
nx = _pos[0] + lengthdir_x(_range, dir);
ny = _pos[1] + lengthdir_y(_range, dir);
if(floor(i / bnd_amo) % 2 && i) {
if((i % bnd_amo) / bnd_amo < _rbnr && i) {
draw_vertex_color(_pos[0], _pos[1], c_white, 1);
draw_vertex_color(ox, oy, c_black, 1);
draw_vertex_color(nx, ny, c_black, 1);

View file

@ -55,10 +55,16 @@ function Node_3D_Obj(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
inputs[| 14] = nodeValue(14, "Object position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 15] = nodeValue(15, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 16] = nodeValue(16, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [ 2,
["Geometry", false], 0, 1,
["Object transform", false], 14, 13, 11,
["Render", false], 3, 5,
["Camera", false], 15, 16, 3, 5,
["Light", false], 6, 7, 8, 9, 10,
["Textures", true], 12,
];
@ -66,8 +72,15 @@ function Node_3D_Obj(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
input_display_len = array_length(input_display_list);
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(2, /*Transform*/ 3, 13, 5);
function reset_tex() {
@ -144,7 +157,7 @@ function Node_3D_Obj(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
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, true);
_3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny, true, false);
}
static submit_vertex = function() {
@ -197,11 +210,25 @@ function Node_3D_Obj(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
var _lrot = inputs[| 13].getValue();
var _lsca = inputs[| 11].getValue();
var _outSurf = outputs[| 0].getValue();
outputs[| 0].setValue(_outSurf);
var _proj = inputs[| 15].getValue();
var _fov = inputs[| 16].getValue();
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, false);
inputs[| 16].setVisible(_proj);
for( var i = 0; i < array_length(output_display_list) - 1; i++ ) {
var ind = output_display_list[i];
var _outSurf = outputs[| ind].getValue();
outputs[| ind].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
var pass = "diff";
switch(ind) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass, false);
submit_vertex();
_3d_post_setup();
}
}
}

View file

@ -33,18 +33,33 @@ function Node_3D_Combine(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
inputs[| 10] = nodeValue(10, "Ambient color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_grey);
inputs[| 11] = nodeValue(11, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 12] = nodeValue(12, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [ 0,
["Object transform", false], 1, 2, 3,
["Render", false], 4, 5,
["Camera", false], 11, 12, 4, 5,
["Light", false], 6, 7, 8, 9, 10,
["Objects", true],
];
data_length = 1;
input_fix_len = ds_list_size(inputs);
input_display_len = array_length(input_display_list);
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D objects", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(1, /*Transform*/ 4, 2, 5);
static createNewInput = function() {
@ -56,10 +71,7 @@ function Node_3D_Combine(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
}
if(!LOADING && !APPENDING) createNewInput();
static updateValueFrom = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
static refreshDynamicInput = function() {
var _l = ds_list_create();
for( var i = 0; i < ds_list_size(inputs); i++ ) {
if(i < input_fix_len || inputs[| i].value_from)
@ -86,6 +98,13 @@ function Node_3D_Combine(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
createNewInput();
}
static onValueFromUpdate = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
refreshDynamicInput();
}
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
_3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny);
}
@ -127,11 +146,32 @@ function Node_3D_Combine(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
var _lclr = inputs[| 9].getValue();
var _aclr = inputs[| 10].getValue();
var _outSurf = outputs[| 0].getValue();
outputs[| 0].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
var _proj = inputs[| 11].getValue();
var _fov = inputs[| 12].getValue();
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, false);
inputs[| 12].setVisible(_proj);
for( var i = 0; i < array_length(output_display_list) - 1; i++ ) {
var ind = output_display_list[i];
var _outSurf = outputs[| ind].getValue();
outputs[| ind].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
var pass = "diff";
switch(ind) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass, false);
submit_vertex();
_3d_post_setup();
}
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -9,7 +9,7 @@ function Node_3D_Extrude(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
inputs[| 2] = nodeValue(2, "Object position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 3] = nodeValue(3, "Object rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
inputs[| 3] = nodeValue(3, "Object rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 180, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 4] = nodeValue(4, "Object scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1, 0.1 ])
@ -47,10 +47,16 @@ function Node_3D_Extrude(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
inputs[| 15] = nodeValue(15, "Always update", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
inputs[| 16] = nodeValue(16, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 17] = nodeValue(17, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [1,
["Geometry", false], 0, 12, 8, 14,
["Geometry", false], 0, 8, 14,
["Object transform", false], 2, 3, 4,
["Render", false], 5, 7, 15,
["Camera", false], 16, 17, 5, 7, 15,
["Light", false], 9, 10, 11, 12, 13,
];
@ -58,14 +64,20 @@ function Node_3D_Extrude(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function(index) { return submit_vertex(index); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(1, /*Transform*/ 5, 3, 7);
VB = [];
VB[0] = vertex_create_buffer();
vertex_begin(VB[0], FORMAT_PT);
vertex_begin(VB[0], FORMAT_PNT);
vertex_end(VB[0]);
static onValueUpdateFrom = function(index) {
static onValueFromUpdate = function(index) {
if(index == 0 || index == 14)
generateMesh();
}
@ -84,14 +96,15 @@ function Node_3D_Extrude(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
var _ins = inputs[| 0].getValue();
if(!is_array(_ins)) _ins = [ _ins ];
for( var i = 0; i < array_length(_ins); i++ ) {
for( var i = 0; i < array_length(_ins); i++ )
VB[i] = generateMeshIndex(i);
}
UPDATE |= RENDER_TYPE.full;
}
static generateMeshIndex = function(index) {
var _ins = getSingleValue( 0, index);
var _hei = getSingleValue(12, index);
var _hei = getSingleValue(14, index);
if(!is_surface(_ins)) return;
var ww = surface_get_width(_ins);
@ -216,9 +229,10 @@ function Node_3D_Extrude(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
_3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny);
}
static submit_vertex = function(index) {
static submit_vertex = function(index = 0) {
var _ins = getSingleValue(0, index);
if(!is_surface(_ins)) return;
if(index >= array_length(VB)) return;
var _lpos = getSingleValue(2, index);
var _lrot = getSingleValue(3, index);
@ -247,16 +261,31 @@ function Node_3D_Extrude(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
var _upda = _data[15];
surface_verify(_outSurf, _dim[0], _dim[1]);
var _proj = _data[16];
var _fov = _data[17];
inputs[| 17].setVisible(_proj);
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
if(!is_surface(_ins)) return _outSurf;
var pass = "diff";
switch(_output_index) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
if(_upda && ANIMATOR.frame_progress)
generateMesh();
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, false);
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass, false);
submit_vertex(_array_index);
_3d_post_setup();
return _outSurf;
}
static postConnect = function() {
generateMesh();
}
}

View file

@ -36,15 +36,28 @@ function Node_3D_Transform(_x, _y, _group = -1) : Node(_x, _y, _group) construct
inputs[| 11] = nodeValue(11, "3D object", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3object, noone)
.setVisible(true, true);
inputs[| 12] = nodeValue(12, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 13] = nodeValue(13, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [ 0, 11,
["Object transform", false], 1, 2, 3,
["Render", false], 4, 5,
["Camera", false], 12, 13, 4, 5,
["Light", true], 6, 7, 8, 9, 10,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(1, /*Transform*/ 4, 2, 5);
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
@ -85,11 +98,25 @@ function Node_3D_Transform(_x, _y, _group = -1) : Node(_x, _y, _group) construct
var _lclr = inputs[| 9].getValue();
var _aclr = inputs[| 10].getValue();
var _outSurf = outputs[| 0].getValue();
outputs[| 0].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
var _proj = inputs[| 12].getValue();
var _fov = inputs[| 13].getValue();
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, false);
inputs[| 13].setVisible(_proj);
for( var i = 0; i < array_length(output_display_list) - 1; i++ ) {
var ind = output_display_list[i];
var _outSurf = outputs[| ind].getValue();
outputs[| ind].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
var pass = "diff";
switch(ind) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass, false);
submit_vertex();
_3d_post_setup();
}
}
}

View file

@ -25,15 +25,33 @@ function Node_3D_Plane(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 7] = nodeValue(7, "Object scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 8] = nodeValue(8, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 9] = nodeValue(9, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
inputs[| 10] = nodeValue(10, "Texture scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 11] = nodeValue(11, "Texture shift", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
input_display_list = [0,
["Outputs", true], 4, 5,
["Object transform", false], 6, 2, 7,
["Render", false], 1, 3,
["Camera", false], 8, 9, 1, 3,
["Texture", false], 10, 11,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
output_display_list = [
0, 1
]
_3d_node_init(0, /*Transform*/ 1, 2, 3);
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
@ -42,7 +60,7 @@ function Node_3D_Plane(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
var _out = outputs[| 0].getValue();
if(!is_surface(_out) || !surface_exists(_out)) return;
_3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny);
_3d_gizmo(active, _x, _y, _s, _mx, _my, _snx, _sny,, false);
}
static submit_vertex = function(index = 0) {
@ -95,18 +113,48 @@ function Node_3D_Plane(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
var _lrot = _data[2];
var _lsca = _data[7];
var cam_proj = matrix_build_projection_ortho(_ww, _hh, 1, 100);
camera_set_view_mat(cam, cam_proj);
camera_set_view_size(cam, _ww, _hh);
var _proj = _data[8];
var _fov = _data[9];
var _uvSca = _data[10];
var _uvShf = _data[11];
inputs[| 9].setVisible(_proj);
surface_set_target(_outSurf);
draw_clear_alpha(0, 0);
BLEND_OVER
shader_set(sh_vertex_pt);
shader = sh_vertex_pt;
shader_set(shader);
uniUVscale = shader_get_uniform(shader, "UVscale");
uniUVshift = shader_get_uniform(shader, "UVshift");
shader_set_uniform_f_array(uniUVscale, _uvSca);
shader_set_uniform_f_array(uniUVshift, _uvShf);
var cam_view, cam_proj;
if(_proj == CAMERA_PROJ.ortho) {
cam_view = matrix_build_lookat(0, 0, 128, 0, 0, 0, 0, 1, 0);
cam_proj = matrix_build_projection_ortho(_ww, _hh, 0.1, 256);
} else {
var dist = _ww / 2 * dtan(90 - _fov);
cam_view = matrix_build_lookat(0, 0, 1 + dist, 0, 0, 0, 0, 1, 0);
cam_proj = matrix_build_projection_perspective(_ww, _hh, dist, dist + 128);
}
var cam = camera_get_active();
camera_set_view_size(cam, _ww, _hh);
camera_set_view_mat(cam, cam_view);
camera_set_proj_mat(cam, cam_proj);
camera_apply(cam);
matrix_stack_push(matrix_build(_pos[0], _pos[1], 0, 0, 0, 0, _ww * _sca[0], _hh * _sca[1], 1));
if(_proj == CAMERA_PROJ.ortho)
matrix_stack_push(matrix_build(_ww / 2 - _pos[0], _pos[1] - _hh / 2, 0, 0, 0, 0, _ww * _sca[0], -_hh * _sca[1], 1));
else
matrix_stack_push(matrix_build(_ww / 2 - _pos[0], _pos[1] - _hh / 2, 0, 0, 0, 0, _ww * _sca[0], -_hh * _sca[1], 1));
matrix_stack_push(matrix_build(_lpos[0], _lpos[1], _lpos[2], 0, 0, 0, 1, 1, 1));
matrix_stack_push(matrix_build(0, 0, 0, _lrot[0], _lrot[1], _lrot[2], 1, 1, 1));
matrix_stack_push(matrix_build(0, 0, 0, 0, 0, 0, _lsca[0], _lsca[1], _lsca[2]));

View file

@ -0,0 +1,181 @@
function Node_3D_Cone(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constructor {
name = "3D Cone";
inputs[| 0] = nodeValue(0, "Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2)
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 1] = nodeValue(1, "Render position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ def_surf_size / 2, def_surf_size / 2 ])
.setDisplay(VALUE_DISPLAY.vector)
.setUnitRef(function(index) { return getDimension(index); });
inputs[| 2] = nodeValue(2, "Render rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 3] = nodeValue(3, "Render scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 4] = nodeValue(4, "Object scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 5] = nodeValue(5, "Light direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.rotation);
inputs[| 6] = nodeValue(6, "Light height", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5)
.setDisplay(VALUE_DISPLAY.slider, [-1, 1, 0.01]);
inputs[| 7] = nodeValue(7, "Light intensity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
inputs[| 8] = nodeValue(8, "Light color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white);
inputs[| 9] = nodeValue(9, "Ambient color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_grey);
inputs[| 10] = nodeValue(10, "Object rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 11] = nodeValue(11, "Object position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 12] = nodeValue(12, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 13] = nodeValue(13, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
inputs[| 14] = nodeValue(14, "Sides", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 16);
inputs[| 15] = nodeValue(15, "Textures base", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
inputs[| 16] = nodeValue(16, "Textures side", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
input_display_list = [0,
["Geometry", false], 14,
["Object transform", false], 11, 10, 4,
["Camera", false], 12, 13, 1, 3,
["Texture", true], 15, 16,
["Light", false], 5, 6, 7, 8, 9,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(0, /*Transform*/ 1, 10, 3);
sides = 16;
VB_top = vertex_create_buffer();
VB_sid = vertex_create_buffer();
static generate_vb = function() {
var _ox, _oy, _nx, _ny, _ou, _nu;
vertex_begin(VB_top, FORMAT_PNT);
for(var i = 0; i <= sides; i++) {
_nx = lengthdir_x(0.5, i * 360 / sides);
_ny = lengthdir_y(0.5, i * 360 / sides);
if(i) {
vertex_add_pnt(VB_top, [ 0, 0.5, 0], [0, 1, 0], [ 0 + 0.5, 0 + 0.5]);
vertex_add_pnt(VB_top, [_ox, 0.5, _oy], [0, 1, 0], [_ox + 0.5, _oy + 0.5]);
vertex_add_pnt(VB_top, [_nx, 0.5, _ny], [0, 1, 0], [_nx + 0.5, _ny + 0.5]);
}
_ox = _nx;
_oy = _ny;
}
vertex_end(VB_top);
vertex_begin(VB_sid, FORMAT_PNT);
for(var i = 0; i <= sides; i++) {
_nx = lengthdir_x(0.5, i * 360 / sides);
_ny = lengthdir_y(0.5, i * 360 / sides);
_nu = i / sides;
if(i) {
vertex_add_pnt(VB_sid, [ 0, -0.5, 0], [_nx, -0.5, _ny], [_nu, 1]);
vertex_add_pnt(VB_sid, [_nx, 0.5, _ny], [_nx, -0.5, _ny], [_nu, 0]);
vertex_add_pnt(VB_sid, [_ox, 0.5, _oy], [_nx, -0.5, _ny], [_ou, 0]);
}
_ox = _nx;
_oy = _ny;
_ou = _nu;
}
vertex_end(VB_sid);
}
generate_vb();
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(index = 0) {
var _lpos = getSingleValue(11, index);
var _lrot = getSingleValue(10, index);
var _lsca = getSingleValue( 4, index);
var face_bas = getSingleValue(15, index);
var face_sid = getSingleValue(16, index);
_3d_local_transform(_lpos, _lrot, _lsca);
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB_top, pr_trianglelist, surface_get_texture(face_bas));
vertex_submit(VB_sid, pr_trianglelist, surface_get_texture(face_sid));
_3d_clear_local_transform();
}
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _sides = _data[14];
if(_sides != sides) {
sides = _sides;
generate_vb();
}
var _dim = _data[0];
var _pos = _data[1];
var _sca = _data[3];
var face_bas = _data[15];
var face_sid = _data[16];
var _lpos = _data[11];
var _lrot = _data[10];
var _lsca = _data[ 4];
var _ldir = _data[5];
var _lhgt = _data[6];
var _lint = _data[7];
var _lclr = _data[8];
var _aclr = _data[9];
var _proj = _data[12];
var _fov = _data[13];
inputs[| 13].setVisible(_proj);
var pass = "diff";
switch(_output_index) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass);
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB_top, pr_trianglelist, surface_get_texture(face_bas));
vertex_submit(VB_sid, pr_trianglelist, surface_get_texture(face_sid));
_3d_post_setup();
return _outSurf;
}
}

View file

@ -1,11 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "curve_power_function",
"name": "node_3d_prim_cone",
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "curve",
"path": "folders/functions/curve.yy",
"name": "3D",
"path": "folders/nodes/data/3D.yy",
},
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "3D",
"path": "folders/nodes/data/3D.yy",
},
"resourceVersion": "1.0",
"name": "node_3d_prim_cube",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -48,16 +48,29 @@ function Node_3D_Cube(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) cons
inputs[| 19] = nodeValue(19, "Object position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 20] = nodeValue(20, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 21] = nodeValue(21, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [1,
["Object transform",false], 19, 18, 12,
["Render", false], 2, 4,
["Camera", false], 20, 21, 2, 4,
["Texture", true], 0, 5, 6, 7, 8, 9, 10, 11,
["Light", false], 13, 14, 15, 16, 17,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function(index) { return submit_vertex(index); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(1, /*Transform*/ 2, 18, 4);
cube_faces = [
@ -115,10 +128,21 @@ function Node_3D_Cube(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) cons
var _usetex = _data[5];
var _proj = _data[20];
var _fov = _data[21];
inputs[| 21].setVisible(_proj);
for(var i = 6; i <= 11; i++) inputs[| i].setVisible(true, _usetex);
inputs[| 0].setVisible(true, !_usetex);
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca);
var pass = "diff";
switch(_output_index) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass);
if(_usetex) {
for(var i = 0; i < 6; i++) {

View file

@ -44,20 +44,37 @@ function Node_3D_Cylinder(_x, _y, _group = -1) : Node_Processor(_x, _y, _group)
inputs[| 16] = nodeValue(16, "Object position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 17] = nodeValue(17, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 18] = nodeValue(18, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
inputs[| 19] = nodeValue(19, "Taper", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]);
input_display_list = [2,
["Geometry", false], 0, 1,
["Geometry", false], 0, 1, 19,
["Object transform", false], 16, 15, 9,
["Render", false], 3, 5,
["Camera", false], 17, 18, 3, 5,
["Texture", true], 6, 7, 8,
["Light", false], 10, 11, 12, 13, 14,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(2, /*Transform*/ 3, 15, 5);
sides = 16;
taper = 1;
thick = 0.5;
VB_top = vertex_create_buffer();
VB_sid = vertex_create_buffer();
@ -88,14 +105,16 @@ function Node_3D_Cylinder(_x, _y, _group = -1) : Node_Processor(_x, _y, _group)
_ny = lengthdir_y(0.5, i * 360 / sides);
_nu = i / sides;
if(i) {
vertex_add_pnt(VB_sid, [_ox, -thick / 2, _oy], [_nx, 0, _ny], [_ou, 0]);
vertex_add_pnt(VB_sid, [_ox, thick / 2, _oy], [_nx, 0, _ny], [_ou, 1]);
vertex_add_pnt(VB_sid, [_nx, thick / 2, _ny], [_nx, 0, _ny], [_nu, 1]);
var nrm_y = 1 - taper;
vertex_add_pnt(VB_sid, [_nx, thick / 2, _ny], [_nx, 0, _ny], [_nu, 1]);
vertex_add_pnt(VB_sid, [_nx, -thick / 2, _ny], [_nx, 0, _ny], [_nu, 0]);
vertex_add_pnt(VB_sid, [_ox, -thick / 2, _oy], [_nx, 0, _ny], [_ou, 0]);
if(i) {
vertex_add_pnt(VB_sid, [_ox * taper, -thick / 2, _oy * taper], [_nx, nrm_y, _ny], [_ou, 0]);
vertex_add_pnt(VB_sid, [_ox, thick / 2, _oy ], [_nx, nrm_y, _ny], [_ou, 1]);
vertex_add_pnt(VB_sid, [_nx, thick / 2, _ny ], [_nx, nrm_y, _ny], [_nu, 1]);
vertex_add_pnt(VB_sid, [_nx, thick / 2, _ny ], [_nx, nrm_y, _ny], [_nu, 1]);
vertex_add_pnt(VB_sid, [_nx * taper, -thick / 2, _ny * taper], [_nx, nrm_y, _ny], [_nu, 0]);
vertex_add_pnt(VB_sid, [_ox * taper, -thick / 2, _oy * taper], [_nx, nrm_y, _ny], [_ou, 0]);
}
_ox = _nx;
@ -124,7 +143,7 @@ function Node_3D_Cylinder(_x, _y, _group = -1) : Node_Processor(_x, _y, _group)
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB_top, pr_trianglelist, surface_get_texture(face_top));
matrix_stack_push(matrix_build(0, -thick, 0, 0, 0, 0, 1, 1, 1));
matrix_stack_push(matrix_build(0, -thick, 0, 0, 0, 0, taper, 1, taper));
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB_top, pr_trianglelist, surface_get_texture(face_bot));
matrix_stack_pop();
@ -138,10 +157,12 @@ function Node_3D_Cylinder(_x, _y, _group = -1) : Node_Processor(_x, _y, _group)
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _sides = _data[0];
var _thick = _data[1];
var _taper = _data[19];
if(_sides != sides || _thick != thick) {
if(_sides != sides || _thick != thick || _taper != taper) {
sides = _sides;
thick = _thick;
taper = _taper;
generate_vb();
}
@ -163,12 +184,23 @@ function Node_3D_Cylinder(_x, _y, _group = -1) : Node_Processor(_x, _y, _group)
var _lclr = _data[13];
var _aclr = _data[14];
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca);
var _proj = _data[17];
var _fov = _data[18];
inputs[| 18].setVisible(_proj);
var pass = "diff";
switch(_output_index) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass);
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB_top, pr_trianglelist, surface_get_texture(face_top));
matrix_stack_push(matrix_build(0, -thick, 0, 0, 0, 0, 1, 1, 1));
matrix_stack_push(matrix_build(0, -thick, 0, 0, 0, 0, taper, 1, taper));
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB_top, pr_trianglelist, surface_get_texture(face_bot));
matrix_stack_pop();

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "3D",
"path": "folders/nodes/data/3D.yy",
},
"resourceVersion": "1.0",
"name": "node_3d_prim_cube",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,191 @@
function Node_3D_Sphere(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constructor {
name = "3D Sphere";
dimension_index = 1;
inputs[| 0] = nodeValue(0, "Subdivisions", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [8, 4])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 1] = nodeValue(1, "Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2)
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 2] = nodeValue(2, "Render position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ def_surf_size / 2, def_surf_size / 2 ])
.setDisplay(VALUE_DISPLAY.vector)
.setUnitRef(function(index) { return getDimension(index); });
inputs[| 3] = nodeValue(3, "Render rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 4] = nodeValue(4, "Render scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 5] = nodeValue(5, "Textures", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
inputs[| 6] = nodeValue(6, "Object scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1, 1 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 7] = nodeValue(7, "Light direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.rotation);
inputs[| 8] = nodeValue(8, "Light height", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5)
.setDisplay(VALUE_DISPLAY.slider, [-1, 1, 0.01]);
inputs[| 9] = nodeValue(9, "Light intensity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
inputs[| 10] = nodeValue(10, "Light color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white);
inputs[| 11] = nodeValue(11, "Ambient color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_grey);
inputs[| 12] = nodeValue(12, "Object rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 13] = nodeValue(13, "Object position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 14] = nodeValue(14, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 15] = nodeValue(15, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [1,
["Geometry", false], 0,
["Object transform", false], 13, 12, 6,
["Camera", false], 14, 15, 2, 4,
["Texture", true], 5,
["Light", false], 7, 8, 9, 10, 11,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D object", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(1, /*Transform*/ 2, 12, 4);
subd = [0, 0];
VB = vertex_create_buffer();
static generate_vb = function() {
var _ox, _oy, _nx, _ny, _ou, _nu;
vertex_begin(VB, FORMAT_PNT);
for( var i = 0; i < subd[0]; i++ )
for( var j = 0; j < subd[1]; j++ ) {
var ha0 = (i + 0) / subd[0] * 360;
var ha1 = (i + 1) / subd[0] * 360;
var va0 = 90 - (j + 0) / subd[1] * 180;
var va1 = 90 - (j + 1) / subd[1] * 180;
var h0 = dsin(va0) * 0.5;
var h1 = dsin(va1) * 0.5;
var r0 = dcos(va0) * 0.5;
var r1 = dcos(va1) * 0.5;
var hx0 = dcos(ha0) * r0;
var hy0 = dsin(ha0) * r0;
var hz0 = h0;
var hx1 = dcos(ha1) * r0;
var hy1 = dsin(ha1) * r0;
var hz1 = h0;
var hx2 = dcos(ha0) * r1;
var hy2 = dsin(ha0) * r1;
var hz2 = h1;
var hx3 = dcos(ha1) * r1;
var hy3 = dsin(ha1) * r1;
var hz3 = h1;
var u0 = ha0 / 360;
var v0 = 0.5 + 0.5 * dsin(va0);
var u1 = ha1 / 360;
var v1 = 0.5 + 0.5 * dsin(va0);
var u2 = ha0 / 360;
var v2 = 0.5 + 0.5 * dsin(va1);
var u3 = ha1 / 360;
var v3 = 0.5 + 0.5 * dsin(va1);
vertex_add_pnt(VB, [hx0, hz0, hy0], [hx0, hz0, hy0], [u0, v0]);
vertex_add_pnt(VB, [hx1, hz1, hy1], [hx1, hz1, hy1], [u1, v1]);
vertex_add_pnt(VB, [hx2, hz2, hy2], [hx2, hz2, hy2], [u2, v2]);
vertex_add_pnt(VB, [hx1, hz1, hy1], [hx1, hz1, hy1], [u1, v1]);
vertex_add_pnt(VB, [hx2, hz2, hy2], [hx2, hz2, hy2], [u2, v2]);
vertex_add_pnt(VB, [hx3, hz3, hy3], [hx3, hz3, hy3], [u3, v3]);
}
vertex_end(VB);
}
generate_vb();
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(index = 0) {
var _lpos = getSingleValue(13, index);
var _lrot = getSingleValue(12, index);
var _lsca = getSingleValue( 6, index);
var texture = getSingleValue(5, index);
_3d_local_transform(_lpos, _lrot, _lsca);
matrix_set(matrix_world, matrix_stack_top());
vertex_submit(VB, pr_trianglelist, surface_get_texture(texture));
_3d_clear_local_transform();
}
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _subd = _data[0];
if(_subd[0] != subd[0] || _subd[1] != subd[1]) {
subd[0] = _subd[0];
subd[1] = _subd[1];
generate_vb();
}
var _dim = _data[1];
var _pos = _data[2];
//var _rot = _data[3];
var _sca = _data[4];
var texture = _data[5];
var _lpos = _data[13];
var _lrot = _data[12];
var _lsca = _data[ 6];
var _ldir = _data[ 7];
var _lhgt = _data[ 8];
var _lint = _data[ 9];
var _lclr = _data[10];
var _aclr = _data[11];
var _proj = _data[14];
var _fov = _data[15];
inputs[| 15].setVisible(_proj);
var pass = "diff";
switch(_output_index) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass);
vertex_submit(VB, pr_trianglelist, surface_get_texture(texture));
_3d_post_setup();
return _outSurf;
}
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_3d_prim_sphere",
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "3D",
"path": "folders/nodes/data/3D.yy",
},
}

View file

@ -58,17 +58,30 @@ function Node_3D_Repeat(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
inputs[| 19] = nodeValue(19, "Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0, 360 ])
.setDisplay(VALUE_DISPLAY.rotation_range);
inputs[| 20] = nodeValue(20, "Projection", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_button, [ "Orthographic", "Perspective" ]);
inputs[| 21] = nodeValue(21, "Field of view", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 60)
.setDisplay(VALUE_DISPLAY.slider, [ 0, 90, 1 ]);
input_display_list = [ 0, 11,
["Object transform", true], 1, 2, 3,
["Render", true], 4, 5,
["Camera", true], 20, 21, 4, 5,
["Light", true], 6, 7, 8, 9, 10,
["Repeat", false], 12, 16, 13, 14, 15, 17, 18, 19
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
outputs[| 1] = nodeValue(1, "3D objects", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3object, function() { return submit_vertex(); });
outputs[| 2] = nodeValue(2, "Normal pass", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
output_display_list = [
0, 2, 1
]
_3d_node_init(1, /*Transform*/ 4, 2, 5);
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
@ -154,18 +167,31 @@ function Node_3D_Repeat(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
var _lclr = inputs[| 9].getValue();
var _aclr = inputs[| 10].getValue();
var _proj = inputs[| 20].getValue();
var _fov = inputs[| 21].getValue();
var _patt = inputs[| 16].getValue();
inputs[| 13].setVisible(_patt == 0);
inputs[| 17].setVisible(_patt == 1);
inputs[| 18].setVisible(_patt == 1);
inputs[| 19].setVisible(_patt == 1);
inputs[| 21].setVisible(_proj);
var _outSurf = outputs[| 0].getValue();
outputs[| 0].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
for( var i = 0; i < array_length(output_display_list) - 1; i++ ) {
var ind = output_display_list[i];
var _outSurf = outputs[| ind].getValue();
outputs[| ind].setValue(surface_verify(_outSurf, _dim[0], _dim[1]));
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, false);
var pass = "diff";
switch(ind) {
case 0 : pass = "diff" break;
case 2 : pass = "norm" break;
}
_3d_pre_setup(_outSurf, _dim, _pos, _sca, _ldir, _lhgt, _lint, _lclr, _aclr, _lpos, _lrot, _lsca, _proj, _fov, pass, false);
submit_vertex();
_3d_post_setup();
}
}
}

View file

@ -20,7 +20,7 @@ function Node_9Slice(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) const
drag_my = 0;
drag_sv = 0;
static updateValueFrom = function(index) {
static onValueFromUpdate = function(index) {
if(index == 0) {
var s = inputs[| 0].getValue();
if(is_array(s)) s = s[0];

View file

@ -13,7 +13,7 @@ function Node_VFX_effector(_x, _y, _group = -1) : Node(_x, _y, _group) construct
inputs[| 1] = nodeValue(1, "Area", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ])
.setDisplay(VALUE_DISPLAY.area);
inputs[| 2] = nodeValue(2, "Falloff", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, [0, 0, 1, 1] )
inputs[| 2] = nodeValue(2, "Falloff", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_01 )
.setDisplay(VALUE_DISPLAY.curve);
inputs[| 3] = nodeValue(3, "Falloff distance", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4 );

View file

@ -9,7 +9,8 @@ function Node_VFX_Renderer(_x, _y, _group = -1) : Node(_x, _y, _group) construct
inputs[| 2] = nodeValue(2, "Blend mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0 )
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Normal", "Additive" ]);
input_index = ds_list_size(inputs);
data_length = 1;
input_fix_len = ds_list_size(inputs);
static createNewInput = function() {
var index = ds_list_size(inputs);
@ -20,13 +21,10 @@ function Node_VFX_Renderer(_x, _y, _group = -1) : Node(_x, _y, _group) construct
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
static updateValueFrom = function(index) {
if(index < input_index) return;
if(LOADING || APPENDING) return;
static refreshDynamicInput = function() {
var _l = ds_list_create();
for( var i = 0; i < ds_list_size(inputs); i++ ) {
if(i < input_index || inputs[| i].value_from)
if(i < input_fix_len || inputs[| i].value_from)
ds_list_add(_l, inputs[| i]);
else
delete inputs[| i];
@ -41,6 +39,13 @@ function Node_VFX_Renderer(_x, _y, _group = -1) : Node(_x, _y, _group) construct
createNewInput();
}
static onValueFromUpdate = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
refreshDynamicInput();
}
function update(_time = ANIMATOR.current_frame) {
var _dim = inputs[| 0].getValue(_time);
var _exact = inputs[| 1].getValue(_time);
@ -59,7 +64,7 @@ function Node_VFX_Renderer(_x, _y, _group = -1) : Node(_x, _y, _group) construct
case PARTICLE_BLEND_MODE.additive : gpu_set_blendmode(bm_add); break;
}
for( var i = input_index; i < ds_list_size(inputs) - 1; i++ ) {
for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) {
var parts = inputs[| i].getValue(_time);
if(!ds_exists(parts, ds_type_list)) continue;
@ -78,7 +83,7 @@ function Node_VFX_Renderer(_x, _y, _group = -1) : Node(_x, _y, _group) construct
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_index; i < ds_list_size(_inputs); i++)
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -6,7 +6,7 @@ function Node_Anim_Curve(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
w = 96;
min_h = 0;
inputs[| 0] = nodeValue(0, "Curve", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, [0, 0, 1, 1]);
inputs[| 0] = nodeValue(0, "Curve", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_01);
inputs[| 1] = nodeValue(1, "Progress", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
@ -20,7 +20,7 @@ function Node_Anim_Curve(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
var time = _data[1];
var _min = _data[2];
var _max = _data[3];
var val = eval_curve_bezier_cubic(curve, time) * (_max - _min) + _min;
var val = eval_curve_bezier_cubic_x(curve, time) * (_max - _min) + _min;
return val;
}

View file

@ -12,11 +12,12 @@ function Node_Array(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
}
if(!LOADING && !APPENDING) createNewInput();
input_fix_len = 0;
data_length = 1;
outputs[| 0] = nodeValue(0, "Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, []);
static updateValueFrom = function(index) {
if(LOADING || APPENDING) return;
static refreshDynamicInput = function() {
var _l = ds_list_create();
for( var i = 0; i < ds_list_size(inputs); i++ ) {
if(inputs[| i].value_from)
@ -34,6 +35,12 @@ function Node_Array(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
createNewInput();
}
static onValueFromUpdate = function(index) {
if(LOADING || APPENDING) return;
refreshDynamicInput();
}
static update = function() {
var res = array_create(ds_list_size(inputs) - 1);
@ -51,7 +58,7 @@ function Node_Array(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = 0; i < ds_list_size(_inputs); i++)
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
}

View file

@ -0,0 +1,26 @@
function Node_Boolean(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
name = "Boolean";
color = COLORS.node_blend_number;
previewable = false;
w = 96;
min_h = 32 + 24 * 1;
inputs[| 0] = nodeValue(0, "Value", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false)
.setVisible(true, true);
outputs[| 0] = nodeValue(0, "Boolean", self, JUNCTION_CONNECT.output, VALUE_TYPE.boolean, false);
function process_data(_output, _data, index = 0) {
return _data[0];
}
static onDrawNode = function(xx, yy, _mx, _my, _s) {
draw_set_text(f_h5, fa_center, fa_center, COLORS._main_text);
var str = outputs[| 0].getValue()? "True" : "False";
var bbox = drawGetBbox(xx, yy, _s);
var ss = string_scale(str, bbox.w, bbox.h);
draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0);
}
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_boolean",
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "value",
"path": "folders/nodes/data/value.yy",
},
}

View file

@ -1,21 +1,24 @@
function Node_Color_replace(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constructor {
name = "Color replace";
shader = sh_color_replace;
shader = sh_palette_replace;
uniform_from = shader_get_uniform(shader, "colorFrom");
uniform_from_count = shader_get_uniform(shader, "colorFrom_amo");
uniform_to = shader_get_uniform(shader, "colorTo");
uniform_to_count = shader_get_uniform(shader, "colorTo_amo");
uniform_ter = shader_get_uniform(shader, "treshold");
uniform_alp = shader_get_uniform(shader, "alphacmp");
uniform_inv = shader_get_uniform(shader, "inverted");
uniform_hrd = shader_get_uniform(shader, "hardReplace");
inputs[| 0] = nodeValue(0, "Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
inputs[| 1] = nodeValue(1, "Color from", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, [ c_black ])
inputs[| 1] = nodeValue(1, "Palette from", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, [ c_black ])
.setDisplay(VALUE_DISPLAY.palette);
inputs[| 2] = nodeValue(2, "Color to", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white);
inputs[| 2] = nodeValue(2, "Palette to", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, [ c_white ])
.setDisplay(VALUE_DISPLAY.palette);
inputs[| 3] = nodeValue(3, "Treshold", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
@ -27,7 +30,7 @@ function Node_Color_replace(_x, _y, _group = -1) : Node_Processor(_x, _y, _group
inputs[| 6] = nodeValue(6, "Hard replace", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
input_display_list = [0,
["Color", false], 1, 2,
["Palette", false], 1, 2,
["Comparison", false], 3, 5,
["Render", false], 4, 6
];
@ -42,12 +45,20 @@ function Node_Color_replace(_x, _y, _group = -1) : Node_Processor(_x, _y, _group
var alp = _data[5];
var hrd = _data[6];
var _colors = array_create(array_length(fr) * 4);
var _colorFrom = array_create(array_length(fr) * 4);
for(var i = 0; i < array_length(fr); i++) {
_colors[i * 4 + 0] = color_get_red(fr[i]) / 255;
_colors[i * 4 + 1] = color_get_green(fr[i]) / 255;
_colors[i * 4 + 2] = color_get_blue(fr[i]) / 255;
_colors[i * 4 + 3] = 1;
_colorFrom[i * 4 + 0] = color_get_red(fr[i]) / 255;
_colorFrom[i * 4 + 1] = color_get_green(fr[i]) / 255;
_colorFrom[i * 4 + 2] = color_get_blue(fr[i]) / 255;
_colorFrom[i * 4 + 3] = 1;
}
var _colorTo = array_create(array_length(to) * 4);
for(var i = 0; i < array_length(to); i++) {
_colorTo[i * 4 + 0] = color_get_red(to[i]) / 255;
_colorTo[i * 4 + 1] = color_get_green(to[i]) / 255;
_colorTo[i * 4 + 2] = color_get_blue(to[i]) / 255;
_colorTo[i * 4 + 3] = 1;
}
surface_set_target(_outSurf);
@ -55,12 +66,13 @@ function Node_Color_replace(_x, _y, _group = -1) : Node_Processor(_x, _y, _group
BLEND_OVER
shader_set(shader);
shader_set_uniform_f_array(uniform_from, _colors);
shader_set_uniform_f_array(uniform_from, _colorFrom);
shader_set_uniform_i(uniform_from_count, array_length(fr));
shader_set_uniform_i(uniform_alp, alp);
shader_set_uniform_i(uniform_hrd, hrd);
shader_set_uniform_f_array(uniform_to, [ color_get_red(to) / 255, color_get_green(to) / 255, color_get_blue(to) / 255, 1.0 ] );
shader_set_uniform_f_array(uniform_to, _colorTo);
shader_set_uniform_i(uniform_to_count, array_length(to));
shader_set_uniform_f(uniform_ter, tr);
shader_set_uniform_i(uniform_inv, in);

View file

@ -6,30 +6,87 @@ function Node_Sampler(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) cons
inputs[| 0] = nodeValue(0, "Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
inputs[| 1] = nodeValue(1, "Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
inputs[| 1] = nodeValue(1, "Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector)
.setUnitRef(function(index) { return getDimension(index); });
inputs[| 2] = nodeValue(2, "Sampling size", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1)
.setDisplay(VALUE_DISPLAY.slider, [1, 3, 1]);
outputs[| 0] = nodeValue(0, "Color", self, JUNCTION_CONNECT.output, VALUE_TYPE.color, c_white);
static getPreviewValue = function() { return inputs[| 0]; }
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
inputs[| 1].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
var _suf = current_data[0];
if(!is_surface(_suf)) return;
var ww = surface_get_width(_suf);
var hh = surface_get_height(_suf);
var _pos = current_data[1];
var _sam = 1 + (current_data[2] - 1) * 2;
var x0 = _pos[0] + 0.5 - _sam / 2;
var x1 = _pos[0] + 0.5 + _sam / 2;
var y0 = _pos[1] + 0.5 - _sam / 2;
var y1 = _pos[1] + 0.5 + _sam / 2;
x0 = clamp(x0, 0, ww);
x1 = clamp(x1, 0, ww);
y0 = clamp(y0, 0, hh);
y1 = clamp(y1, 0, hh);
x0 = _x + x0 * _s;
x1 = _x + x1 * _s;
y0 = _y + y0 * _s;
y1 = _y + y1 * _s;
draw_set_color(COLORS._main_accent);
draw_rectangle(x0, y0, x1, y1, true);
}
function process_data(_output, _data, index = 0) {
var _surf = _data[0];
var _pos = _data[1];
var _sam = _data[2];
if(!is_surface(_surf)) return c_black;
return surface_getpixel(_surf, _pos[0], _pos[1]);
var ww = surface_get_width(_surf);
var hh = surface_get_height(_surf);
var r = 0, g = 0, b = 0, amo = 0;
_sam -= 1;
for( var i = -_sam; i <= _sam; i++ )
for( var j = -_sam; j <= _sam; j++ ) {
var px = _pos[0] + i;
var py = _pos[1] + j;
if(px < 0) continue;
if(py < 0) continue;
if(px >= ww) continue;
if(py >= hh) continue;
var cc = surface_getpixel(_surf, px, py);
r += color_get_red(cc);
g += color_get_green(cc);
b += color_get_blue(cc);
amo++;
}
r /= amo;
g /= amo;
b /= amo;
return make_color_rgb(r, g, b);
}
static onDrawNode = function(xx, yy, _mx, _my, _s) {
var bbox = drawGetBbox(xx, yy, _s);
if(y1 <= y0) return;
if(bbox.h <= 0) return;
var c = outputs[| 0].getValue();
if(is_array(c)) c = c[0];

View file

@ -153,6 +153,8 @@ function Node_Composite(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) co
}
layer_dragging = noone;
}
return _h;
});
input_display_list = [
@ -223,7 +225,7 @@ function Node_Composite(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) co
overlay_w = 0;
overlay_h = 0;
static updateValueFrom = function(index) {
static onValueFromUpdate = function(index) {
if(LOADING || APPENDING) return;
if(index + data_length >= ds_list_size(inputs))

View file

@ -5,7 +5,7 @@ function Node_create_CSV_File_Read(_x, _y, _group = -1) {
if(path == "") return noone;
}
var node = new Node_Text_File_Read(_x, _y, _group);
var node = new Node_CSV_File_Read(_x, _y, _group);
node.inputs[| 0].setValue(path);
node.doUpdate();

View file

@ -0,0 +1,62 @@
function Node_create_CSV_File_Write(_x, _y, _group = -1) {
var path = "";
var node = new Node_CSV_File_Write(_x, _y, _group);
node.inputs[| 0].setValue(path);
node.doUpdate();
return node;
}
function Node_CSV_File_Write(_x, _y, _group = -1) : Node(_x, _y, _group) constructor {
name = "CSV out";
color = COLORS.node_blend_input;
previewable = false;
w = 128;
min_h = 0;
inputs[| 0] = nodeValue(0, "Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.path, "")
.setDisplay(VALUE_DISPLAY.path_save, ["*.csv", ""]);
inputs[| 1] = nodeValue(1, "Content", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, "")
.setDisplay(true);
static update = function() {
var path = inputs[| 0].getValue();
if(path == "") return;
if(filename_ext(path) != ".csv")
path += ".csv";
var _val = inputs[| 1].getValue();
var str = "";
if(is_array(_val)) {
for( var i = 0; i < array_length(_val); i++ ) {
if(is_array(_val[i])) {
for( var j = 0; j < array_length(_val[i]); j++ )
str += (j? ", " : "") + string(_val[i][j])
str += "\n";
} else
str += (i? ", " : "") + string(_val[i])
}
} else
str = string(_val);
var f = file_text_open_write(path);
file_text_write_string(f, str);
file_text_close(f);
}
function onDrawNode(xx, yy, _mx, _my, _s) {
var bbox = drawGetBbox(xx, yy, _s);
var str = filename_name(inputs[| 0].getValue());
if(filename_ext(str) != ".csv")
str += ".csv";
draw_set_text(f_h5, fa_center, fa_center, COLORS._main_text);
var ss = string_scale(str, bbox.w, bbox.h);
draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0);
}
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_csv_file_write",
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "IO",
"path": "folders/nodes/data/IO.yy",
},
}

View file

@ -165,6 +165,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) constructor {
}
static onValueUpdate = function(index) {}
static onValueFromUpdate = function(index) {}
static isUpdateReady = function() {
//if(rendered) return false;
@ -181,9 +182,6 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) constructor {
static update = function() {}
static updateValue = function(index) {}
static updateValueFrom = function(index) {}
static triggerRender = function() {
setRenderStatus(false);
UPDATE |= RENDER_TYPE.partial;
@ -273,7 +271,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) constructor {
static drawNodeName = function(xx, yy, _s) {
draw_name = false;
if(name == "") return;
if(_s < 0.5) return;
if(_s < 0.6) return;
draw_name = true;
draw_sprite_stretched_ext(THEME.node_bg_name, 0, xx, yy, w * _s, ui(20), color, 0.75);
@ -802,8 +800,12 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) constructor {
inputs[| i].applyDeserialize(_inputs[| i], load_scale);
printIf(TESTING, " > Applying deserialize to node " + name + " completed");
doApplyDeserialize();
}
static doApplyDeserialize = function() {}
static loadGroup = function() {
if(_group == -1) {
var c = PANEL_GRAPH.getCurrentContext();

View file

@ -0,0 +1,136 @@
function Node_Equation(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constructor {
name = "Equation";
color = COLORS.node_blend_number;
previewable = false;
w = 96;
min_h = 0;
inputs[| 0] = nodeValue(1, "Equation", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "");
static createNewInput = function() {
var index = ds_list_size(inputs);
inputs[| index + 0] = nodeValue( index + 0, "Argument name", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" );
inputs[| index + 1] = nodeValue( index + 1, "Argument value", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 )
.setVisible(true, true);
}
outputs[| 0] = nodeValue(0, "Result", self, JUNCTION_CONNECT.output, VALUE_TYPE.float, 0);
argument_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) {
var tx = _x + ui(8);
var ty = _y + ui(8);
var hh = ui(8);
var _th = TEXTBOX_HEIGHT;
for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) {
var _h = 0;
var _jName = inputs[| i + 0];
_jName.editWidget.hover = _hover;
_jName.editWidget.active = _focus;
_jName.editWidget.draw(tx, ty, ui(128), _th, _jName.showValue(), _m, _jName.display_type);
draw_set_text(f_p1, fa_center, fa_top, COLORS._main_text_sub);
draw_text_add(tx + ui(128 + 12), ty + ui(6), "=");
var _jValue = inputs[| i + 1];
_jValue.editWidget.hover = _hover;
_jValue.editWidget.active = _focus;
_jValue.editWidget.draw(tx + ui(128 + 24), ty, _w - ui(128 + 24 + 16), _th, _jValue.showValue(), _m);
_h += _th + ui(6);
hh += _h;
ty += _h;
}
return hh;
});
input_display_list = [
["Function", false], 0,
["Arguments", false], argument_renderer,
["Inputs", true],
]
input_fix_len = ds_list_size(inputs);
input_display_len = array_length(input_display_list);
data_length = 2;
if(!LOADING && !APPENDING) createNewInput();
static refreshDynamicInput = function() {
var _in = ds_list_create();
for( var i = 0; i < input_fix_len; i++ )
ds_list_add(_in, inputs[| i]);
array_resize(input_display_list, input_display_len);
for( var i = input_fix_len; i < ds_list_size(inputs); i += data_length ) {
if(inputs[| i].getValue() != "") {
ds_list_add(_in, inputs[| i + 0]);
ds_list_add(_in, inputs[| i + 1]);
array_push(input_display_list, i + 1);
} else {
delete inputs[| i + 0];
delete inputs[| i + 1];
}
}
for( var i = 0; i < ds_list_size(_in); i++ )
_in[| i].index = i;
ds_list_destroy(inputs);
inputs = _in;
createNewInput();
}
static onValueUpdate = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 1].name = inputs[| index].getValue();
}
refreshDynamicInput();
}
function process_data(_output, _data, index = 0) {
var eq = _data[0];
var params = {};
for( var i = input_fix_len; i < array_length(_data); i += data_length ) {
var _pName = _data[i + 0];
var _pVal = _data[i + 1];
variable_struct_set(params, _pName, _pVal);
}
return evaluateFunction(eq, params);
}
function onDrawNode(xx, yy, _mx, _my, _s) {
draw_set_text(f_h5, fa_center, fa_center, COLORS._main_text);
var str = inputs[| 0].getValue();
var bbox = drawGetBbox(xx, yy, _s);
var ss = string_scale(str, bbox.w, bbox.h);
draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0);
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
static doApplyDeserialize = function() {
refreshDynamicInput();
}
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_equation",
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "value",
"path": "folders/nodes/data/value.yy",
},
}

View file

@ -8,6 +8,9 @@ function Node_Grid_Hex(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
uniform_rot = shader_get_uniform(shader, "angle");
uniform_thk = shader_get_uniform(shader, "thick");
uniform_clr0 = shader_get_uniform(shader, "color0");
uniform_clr1 = shader_get_uniform(shader, "color1");
inputs[| 0] = nodeValue(0, "Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2 )
.setDisplay(VALUE_DISPLAY.vector);
@ -24,9 +27,14 @@ function Node_Grid_Hex(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 4] = nodeValue(4, "Thickness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
inputs[| 5] = nodeValue(5, "Color 1", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white);
inputs[| 6] = nodeValue(6, "Color 2", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_black);
input_display_list = [
["Output", false], 0,
["Pattern", false], 1, 2, 3, 4
["Pattern", false], 1, 2, 3, 4,
["Render", false], 5, 6,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
@ -42,6 +50,9 @@ function Node_Grid_Hex(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
var _rot = _data[3];
var _thk = _data[4];
var _clr0 = _data[5];
var _clr1 = _data[6];
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
surface_set_target(_outSurf);
@ -53,6 +64,9 @@ function Node_Grid_Hex(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
shader_set_uniform_f(uniform_rot, degtorad(_rot));
shader_set_uniform_f(uniform_thk, _thk);
shader_set_uniform_f_array(uniform_clr0, colToVec4(_clr0));
shader_set_uniform_f_array(uniform_clr1, colToVec4(_clr1));
draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], 0, c_white, 1);
shader_reset();
surface_reset_target();

View file

@ -8,6 +8,9 @@ function Node_Grid_Tri(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
uniform_rot = shader_get_uniform(shader, "angle");
uniform_thk = shader_get_uniform(shader, "thick");
uniform_clr0 = shader_get_uniform(shader, "color0");
uniform_clr1 = shader_get_uniform(shader, "color1");
inputs[| 0] = nodeValue(0, "Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2 )
.setDisplay(VALUE_DISPLAY.vector);
@ -24,9 +27,14 @@ function Node_Grid_Tri(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
inputs[| 4] = nodeValue(4, "Thickness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1)
.setDisplay(VALUE_DISPLAY.slider, [0, 1, 0.01]);
inputs[| 5] = nodeValue(5, "Color 1", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white);
inputs[| 6] = nodeValue(6, "Color 2", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_black);
input_display_list = [
["Output", false], 0,
["Pattern", false], 1, 2, 3, 4
["Pattern", false], 1, 2, 3, 4,
["Render", false], 5, 6,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
@ -42,6 +50,9 @@ function Node_Grid_Tri(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
var _rot = _data[3];
var _thk = _data[4];
var _clr0 = _data[5];
var _clr1 = _data[6];
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
surface_set_target(_outSurf);
@ -53,6 +64,9 @@ function Node_Grid_Tri(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) con
shader_set_uniform_f(uniform_rot, degtorad(_rot));
shader_set_uniform_f(uniform_thk, _thk);
shader_set_uniform_f_array(uniform_clr0, colToVec4(_clr0));
shader_set_uniform_f_array(uniform_clr1, colToVec4(_clr1));
draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], 0, c_white, 1);
shader_reset();
surface_reset_target();

View file

@ -58,7 +58,9 @@ function Node_Iterate(_x, _y, _group = -1) : Node_Collection(_x, _y, _group) con
}
if(iter) {
if(++iterated == inputs[| 0].getValue()) {
iterated++;
if(iterated == inputs[| 0].getValue()) {
render_time = get_timer() - loop_start_time;
return ITERATION_STATUS.complete;
} else if(iterated > inputs[| 0].getValue())

View file

@ -36,7 +36,8 @@ function Node_Json_File_Read(_x, _y, _group = -1) : Node(_x, _y, _group) constru
outputs[| 0] = nodeValue(0, "Path", self, JUNCTION_CONNECT.output, VALUE_TYPE.path, "")
.setVisible(true, true);
input_index = ds_list_size(inputs);
data_length = 1;
input_fix_len = ds_list_size(inputs);
static createNewInput = function() {
var index = ds_list_size(inputs);
@ -62,15 +63,12 @@ function Node_Json_File_Read(_x, _y, _group = -1) : Node(_x, _y, _group) constru
return false;
}
static updateValue = function(index) {
if(index < input_index) return;
if(LOADING || APPENDING) return;
static refreshDynamicInput = function() {
var _in = ds_list_create();
var _ot = ds_list_create();
for( var i = 0; i < ds_list_size(inputs); i++ ) {
if(i < input_index || inputs[| i].getValue() != "") {
if(i < input_fix_len || inputs[| i].getValue() != "") {
ds_list_add(_in, inputs[| i]);
ds_list_add(_ot, outputs[| i]);
} else {
@ -93,6 +91,13 @@ function Node_Json_File_Read(_x, _y, _group = -1) : Node(_x, _y, _group) constru
createNewInput();
}
static onValueUpdate = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
refreshDynamicInput();
}
function updatePaths(path) {
if(path_current == path) return false;
@ -120,7 +125,7 @@ function Node_Json_File_Read(_x, _y, _group = -1) : Node(_x, _y, _group) constru
if(path == "") return;
updatePaths(path);
for( var i = 1; i < ds_list_size(inputs) - 1; i++ ) {
for( var i = input_fix_len; i < ds_list_size(inputs) - 1; i++ ) {
var key = inputs[| i].getValue();
outputs[| i].name = key;
@ -150,7 +155,11 @@ function Node_Json_File_Read(_x, _y, _group = -1) : Node(_x, _y, _group) constru
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_index; i < ds_list_size(_inputs); i++)
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
static doApplyDeserialize = function() {
refreshDynamicInput();
}
}

View file

@ -30,14 +30,7 @@ function Node_Json_File_Write(_x, _y, _group = -1) : Node(_x, _y, _group) constr
if(!LOADING && !APPENDING) createNewInput();
static updateValue = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 1].name = inputs[| index].getValue() + " value";
}
static refreshDynamicInput = function() {
var _in = ds_list_create();
for( var i = 0; i < input_fix_len; i++ )
@ -67,6 +60,17 @@ function Node_Json_File_Write(_x, _y, _group = -1) : Node(_x, _y, _group) constr
createNewInput();
}
static onValueUpdate = function(index) {
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 1].name = inputs[| index].getValue() + " value";
}
refreshDynamicInput();
}
static update = function() {
var path = inputs[| 0].getValue();
if(path == "") return;
@ -97,4 +101,15 @@ function Node_Json_File_Write(_x, _y, _group = -1) : Node(_x, _y, _group) constr
var ss = string_scale(str, bbox.w, bbox.h);
draw_text_transformed(bbox.xc, bbox.yc, str, ss, ss, 0);
}
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
static doApplyDeserialize = function() {
refreshDynamicInput();
}
}

View file

@ -1,23 +1,19 @@
enum CURVE_TYPE {
none,
bezier,
bounce,
damping
}
globalvar ON_END_NAME;
ON_END_NAME = [ "Hold", "Loop", "Ping pong" ];
function valueKey(_time, _value, _anim = noone, _in = 0, _out = 0) constructor {
function valueKey(_time, _value, _anim = noone, _in = 0, _ot = 0) constructor {
time = _time;
ratio = time / (ANIMATOR.frames_total - 1);
value = _value;
anim = _anim;
ease_in = _in;
ease_out = _out;
ease_in = is_array(_in)? _in : [_in, 1];
ease_out = is_array(_ot)? _ot : [_ot, 0];
ease_in_type = CURVE_TYPE.bezier;
ease_out_type = CURVE_TYPE.bezier;
ease_in_type = CURVE_TYPE.none;
ease_out_type = CURVE_TYPE.none;
static setTime = function(time) {
self.time = time;
@ -34,40 +30,80 @@ function valueAnimator(_val, _prop) constructor {
prop = _prop;
static interpolate = function(from, to, rat) {
if(from.ease_out == 0 && to.ease_in == 0)
if(to.ease_in_type == CURVE_TYPE.none && from.ease_out_type == CURVE_TYPE.none)
return rat;
if(rat == 0 || rat == 1)
return rat;
var eo = rat;
var ei = rat;
var eox = clamp(from.ease_out[0], 0, 0.9);
var eix = clamp(to.ease_in[0], 0, 0.9);
var eoy = from.ease_out[1];
var eiy = to.ease_in[1];
if(from.ease_out != 0) {
switch(from.ease_out_type) {
case CURVE_TYPE.bezier :
eo = ease_cubic_in(rat);
eo = lerp(rat, eo, from.ease_out);
break;
case CURVE_TYPE.damping :
eo = ease_damp_in(rat, 1 + from.ease_out * 10);
break;
}
var bz = [0, eox, eoy, 1. - eix, eiy, 1];
return eval_curve_bezier_cubic_x(bz, rat);
//var eo = rat;
//var ei = rat;
//if(from.ease_out != 0) {
// switch(from.ease_out_type) {
// case CURVE_TYPE.bezier :
// eo = ease_cubic_in(rat);
// eo = lerp(rat, eo, from.ease_out);
// break;
// case CURVE_TYPE.damping :
// eo = ease_damp_in(rat, 1 + from.ease_out * 10);
// break;
// }
//}
//if(to.ease_in != 0) {
// switch(to.ease_in_type) {
// case CURVE_TYPE.bezier :
// ei = ease_cubic_out(rat);
// ei = lerp(rat, ei, to.ease_in);
// break;
// case CURVE_TYPE.damping :
// ei = ease_damp_out(rat, 1 + to.ease_in * 10);
// break;
// }
//}
//if(from.ease_out_type == CURVE_TYPE.damping && to.ease_in_type == CURVE_TYPE.damping)
// return lerp(eo, ei, rat < 0.5 ? 4 * power(rat, 3) : 1 - power(-2 * rat + 2, 3) / 2);
//return lerp(eo, ei, rat);
}
if(to.ease_in != 0) {
switch(to.ease_in_type) {
case CURVE_TYPE.bezier :
ei = ease_cubic_out(rat);
ei = lerp(rat, ei, to.ease_in);
break;
case CURVE_TYPE.damping :
ei = ease_damp_out(rat, 1 + to.ease_in * 10);
break;
}
static lerpValue = function(from, to, _lrp) {
if(prop.type == VALUE_TYPE.color) {
var _f = from.value;
var _t = to.value;
if(is_array(_f)) {
var amo = max(array_length(_f), array_length(_t));
var res = array_create(amo);
for( var i = 0; i < amo; i++ )
res[i] = merge_color(array_safe_get(_f, i, 0), array_safe_get(_t, i, 0), _lrp);
return res;
}
if(from.ease_out_type == CURVE_TYPE.damping && to.ease_in_type == CURVE_TYPE.damping)
return lerp(eo, ei, rat < 0.5 ? 4 * power(rat, 3) : 1 - power(-2 * rat + 2, 3) / 2);
return processType(merge_color(_f, _t, _lrp));
}
return lerp(eo, ei, rat);
if(typeArray(prop.display_type) && is_array(from.value)) {
var _vec = array_create(array_length(from.value));
for(var i = 0; i < array_length(_vec); i++)
_vec[i] = processType(lerp(from.value[i], to.value[i], _lrp));
return _vec;
}
if(prop.type == VALUE_TYPE.text)
return processType(from.value);
return processType(lerp(from.value, to.value, _lrp));
}
static getValue = function(_time = ANIMATOR.current_frame) {
@ -78,7 +114,6 @@ function valueAnimator(_val, _prop) constructor {
if(ds_list_size(values) == 1) return processType(values[| 0].value);
if(!is_anim) return processType(values[| 0].value);
if(ds_list_size(values) > 1) {
var _time_first = values[| 0].time;
var _time_last = values[| ds_list_size(values) - 1].time;
var _time_dura = _time_last - _time_first;
@ -97,35 +132,48 @@ function valueAnimator(_val, _prop) constructor {
break;
}
}
if(_time < values[| 0].time) { //Wrap begin
if(prop.on_end == KEYFRAME_END.wrap) {
var from = values[| ds_list_size(values) - 1];
var to = values[| 0];
var prog = ANIMATOR.frames_total - from.time + _time;
var totl = ANIMATOR.frames_total - from.time + to.time;
var rat = prog / totl;
var _lrp = interpolate(from, to, rat);
return lerpValue(from, to, _lrp);
}
for(var i = 0; i < ds_list_size(values); i++) {
return processType(values[| 0].value); //First frame
}
for(var i = 0; i < ds_list_size(values); i++) { //In between
var _key = values[| i];
if(_key.time > _time) {
if(i == 0)
return processType(values[| 0].value);
else {
if(_key.time <= _time) continue;
var rat = (_time - values[| i - 1].time) / (values[| i].time - values[| i - 1].time);
var from = values[| i - 1];
var to = values[| i];
var _lerp = interpolate(from, to, rat);
var _lrp = interpolate(from, to, rat);
if(prop.type == VALUE_TYPE.color) {
return processType(merge_color(from.value, to.value, _lerp));
} else if(typeArray(prop.display_type) && is_array(from.value)) {
var _vec = array_create(array_length(from.value));
for(var i = 0; i < array_length(_vec); i++)
_vec[i] = processType(lerp(from.value[i], to.value[i], _lerp));
return _vec;
} else if(prop.type == VALUE_TYPE.text) {
return processType(from.value);
} else {
return processType(lerp(from.value, to.value, _lerp));
return lerpValue(from, to, _lrp);
}
if(prop.on_end == KEYFRAME_END.wrap) { //Wrap end
var from = values[| ds_list_size(values) - 1];
var to = values[| 0];
var prog = _time - from.time;
var totl = ANIMATOR.frames_total - from.time + to.time;
var rat = prog / totl;
var _lrp = interpolate(from, to, rat);
return lerpValue(from, to, _lrp);
}
}
}
return processType(values[| ds_list_size(values) - 1].value);
return processType(values[| ds_list_size(values) - 1].value); //Last frame
}
static processType = function(_val) {
@ -257,13 +305,15 @@ function valueAnimator(_val, _prop) constructor {
_value_list[| 1] = values[| i].value;
}
_value_list[| 2] = values[| i].ease_in;
_value_list[| 3] = values[| i].ease_out;
_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;
ds_list_add(_list, _value_list);
ds_list_mark_as_list(_list, i);
ds_list_add_list(_list, _value_list);
}
return _list;
@ -284,6 +334,11 @@ function valueAnimator(_val, _prop) constructor {
var value = ds_list_get(_key, 1);
var ease_in = ds_list_get(_key, 2);
var ease_out = ds_list_get(_key, 3);
if(LOADING_VERSION >= 1090) {
ease_in = array_create_from_list(ease_in);
ease_out = array_create_from_list(ease_out);
}
var ease_in_type = ds_list_get(_key, 4, CURVE_TYPE.bezier);
var ease_out_type = ds_list_get(_key, 5, CURVE_TYPE.bezier);
var _val = _key[| 1];

View file

@ -77,7 +77,7 @@ function Node_Level(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constr
histogramUpdate(current_data[0]);
}
static onValueUpdateFrom = function(index) {
static onValueFromUpdate = function(index) {
if(index == 0) {
update();
if(array_length(current_data) > 0)

View file

@ -46,6 +46,8 @@ function Node_Level_Selector(_x, _y, _group = -1) : Node_Processor(_x, _y, _grou
draw_set_color(COLORS.node_level_outline);
draw_rectangle(x0, y0, x1, y1, true);
return _h;
});
input_display_list = [
@ -59,7 +61,7 @@ function Node_Level_Selector(_x, _y, _group = -1) : Node_Processor(_x, _y, _grou
histogramUpdate(current_data[0]);
}
static onValueUpdate = function(index) {
static onValueFromUpdate = function(index) {
if(index == 0) {
update();
if(array_length(current_data) > 0)

View file

@ -15,7 +15,7 @@ function Node_Line(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constru
inputs[| 4] = nodeValue(4, "Wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0)
.setDisplay(VALUE_DISPLAY.slider, [0, 16, 0.01]);
inputs[| 5] = nodeValue(5, "Random seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0);
inputs[| 5] = nodeValue(5, "Random seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0);
inputs[| 6] = nodeValue(6, "Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.rotation);
@ -32,7 +32,7 @@ function Node_Line(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constru
inputs[| 10] = nodeValue(10, "Color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white)
.setDisplay(VALUE_DISPLAY.gradient);
inputs[| 11] = nodeValue(11, "Width over length", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, [1, 1, 1, 1]);
inputs[| 11] = nodeValue(11, "Width over length", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11);
input_display_list = [
["Output", true], 0, 1,
@ -69,6 +69,7 @@ function Node_Line(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constru
inputs[| 6].setVisible(!_use_path);
random_set_seed(_sed);
var _sedIndex = 0;
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
@ -97,12 +98,15 @@ function Node_Line(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constru
if(_total < _rtLen) {
var _d = point_direction(_ox, _oy, _nx, _ny);
_nx += lengthdir_x(random(_wig) * choose(-1, 1), _d + 90);
_ny += lengthdir_y(random(_wig) * choose(-1, 1), _d + 90);
_nx += lengthdir_x(random1D(_sed + _sedIndex, -_wig, _wig), _d + 90);
_sedIndex++;
_ny += lengthdir_y(random1D(_sed + _sedIndex, -_wig, _wig), _d + 90);
_sedIndex++;
}
_nw = random_range(_wid[0], _wid[1]);
_nw *= eval_bezier_cubic(1 - _prog_curr, _widc[0], _widc[1], _widc[2], _widc[3]);
_nw *= eval_curve_bezier_cubic_x(_widc, _prog_curr);
if(_total <= _prog_curr - _prog) {
_na = point_direction(_ox, _oy, _nx, _ny) + 90;
@ -156,11 +160,14 @@ function Node_Line(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constru
_nx = x0 + lengthdir_x(_l * _prog_curr, _d);
_ny = y0 + lengthdir_y(_l * _prog_curr, _d);
_nx += lengthdir_x(random(_wig) * choose(-1, 1), _d + 90);
_ny += lengthdir_y(random(_wig) * choose(-1, 1), _d + 90);
_nx += lengthdir_x(random1D(_sed + _sedIndex, -_wig, _wig), _d + 90);
_sedIndex++;
_ny += lengthdir_y(random1D(_sed + _sedIndex, -_wig, _wig), _d + 90);
_sedIndex++;
_nw = random_range(_wid[0], _wid[1]);
_nw *= eval_bezier_cubic(1 - _prog_curr, _widc[0], _widc[1], _widc[2], _widc[3]);
_nw *= eval_curve_bezier_cubic_x(_widc, _prog_curr);
if(_prog_curr > _prog) {
draw_set_color(gradient_eval(_color, _prog_eli / _rtLen, ds_list_get(_col_data, 0)));

View file

@ -7,7 +7,7 @@ function Node_Lua_Compute(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
inputs[| 0] = nodeValue(0, "Function name", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "render" + string(irandom_range(100000, 999999)));
inputs[| 1] = nodeValue(1, "Type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
inputs[| 1] = nodeValue(1, "Return type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Number", "String" ]);
inputs[| 2] = nodeValue(2, "Lua code", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "")
@ -33,11 +33,12 @@ function Node_Lua_Compute(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
luaArgumentRenderer();
input_display_list = [
["Main", false], 0, 3, 1, 2,
input_display_list = [ 3,
["Function", false], 0, 1,
["Arguments", false], argument_renderer,
["Script", false], 2,
["Inputs", true],
]
];
input_fix_len = ds_list_size(inputs);
input_display_len = array_length(input_display_list);
@ -76,37 +77,7 @@ function Node_Lua_Compute(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
return inputs[| 3].value_from.node.getState();
}
static updateValueFrom = function(index) {
compiled = false;
}
static updateValue = function(index) {
compiled = false;
if(index == 4) {
for( var i = 0; i < ds_list_size(outputs[| 0].value_to); i++ ) {
var _j = outputs[| 0].value_to[| i];
if(_j.value_from != outputs[| 0]) continue;
_j.node.compiled = false;
}
}
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 2].name = inputs[| index].getValue();
} else if((index - input_fix_len) % data_length == 1) { //Variable type
var type = inputs[| index].getValue();
switch(type) {
case 0 : inputs[| index + 1].type = VALUE_TYPE.float; break;
case 1 : inputs[| index + 1].type = VALUE_TYPE.text; break;
case 2 : inputs[| index + 1].type = VALUE_TYPE.surface; break;
}
inputs[| index + 1].setDisplay(VALUE_DISPLAY._default);
}
static refreshDynamicInput = function() {
var _in = ds_list_create();
for( var i = 0; i < input_fix_len; i++ )
@ -137,6 +108,43 @@ function Node_Lua_Compute(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
createNewInput();
}
static onValueFromUpdate = function(index) {
if(index == 0 || index == 2) compiled = false;
}
static onValueUpdate = function(index) {
if(index == 0 || index == 2) compiled = false;
if(index == 3) {
for( var i = 0; i < ds_list_size(outputs[| 0].value_to); i++ ) {
var _j = outputs[| 0].value_to[| i];
if(_j.value_from != outputs[| 0]) continue;
_j.node.compiled = false;
}
compiled = false;
}
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 2].name = inputs[| index].getValue();
compiled = false;
} else if((index - input_fix_len) % data_length == 1) { //Variable type
var type = inputs[| index].getValue();
switch(type) {
case 0 : inputs[| index + 1].type = VALUE_TYPE.float; break;
case 1 : inputs[| index + 1].type = VALUE_TYPE.text; break;
case 2 : inputs[| index + 1].type = VALUE_TYPE.surface; break;
}
inputs[| index + 1].setDisplay(VALUE_DISPLAY._default);
compiled = false;
}
refreshDynamicInput();
}
static update = function() {
if(!compiled) return;
@ -192,7 +200,11 @@ function Node_Lua_Compute(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_index; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
static doApplyDeserialize = function() {
refreshDynamicInput();
}
}

View file

@ -5,20 +5,20 @@ function Node_Lua_Global(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
min_h = 0;
inputs[| 0] = nodeValue(2, "Lua code", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "")
inputs[| 0] = nodeValue(0, "Lua code", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "")
.setDisplay(VALUE_DISPLAY.code);
inputs[| 1] = nodeValue(3, "Run order", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
inputs[| 1] = nodeValue(1, "Run order", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "On start", "Every frame" ]);
inputs[| 2] = nodeValue(4, "Execution thread", self, JUNCTION_CONNECT.input, VALUE_TYPE.node, noone)
inputs[| 2] = nodeValue(2, "Execution thread", self, JUNCTION_CONNECT.input, VALUE_TYPE.node, noone)
.setVisible(false, true);
outputs[| 0] = nodeValue(0, "Execution thread", self, JUNCTION_CONNECT.output, VALUE_TYPE.node, noone );
input_display_list = [
["Main", false], 2, 1, 0,
]
];
lua_state = lua_create();
@ -44,12 +44,12 @@ function Node_Lua_Global(_x, _y, _group = -1) : Node(_x, _y, _group) constructor
return inputs[| 2].value_from.node.getState();
}
static updateValueFrom = function(index) {
compiled = false;
static onValueFromUpdate = function(index) {
if(index == 0 || index == 2) compiled = false;
}
static updateValue = function(index) {
compiled = false;
static onValueUpdate = function(index) {
if(index == 0 || index == 2) compiled = false;
}
static update = function() {

View file

@ -30,11 +30,12 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
luaArgumentRenderer();
input_display_list = [
["Main", false], 0, 3, 1, 2,
input_display_list = [ 3,
["Function", false], 0, 1,
["Arguments", false], argument_renderer,
["Script", false], 2,
["Inputs", true],
]
];
input_fix_len = ds_list_size(inputs);
input_display_len = array_length(input_display_list);
@ -67,37 +68,7 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
return inputs[| 3].value_from.node.getState();
}
static updateValueFrom = function(index) {
compiled = false;
}
static updateValue = function(index) {
compiled = false;
if(index == 4) {
for( var i = 0; i < ds_list_size(outputs[| 0].value_to); i++ ) {
var _j = outputs[| 0].value_to[| i];
if(_j.value_from != outputs[| 0]) continue;
_j.node.compiled = false;
}
}
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 2].name = inputs[| index].getValue();
} else if((index - input_fix_len) % data_length == 1) { //Variable type
var type = inputs[| index].getValue();
switch(type) {
case 0 : inputs[| index + 1].type = VALUE_TYPE.float; break;
case 1 : inputs[| index + 1].type = VALUE_TYPE.text; break;
case 2 : inputs[| index + 1].type = VALUE_TYPE.surface; break;
}
inputs[| index + 1].setDisplay(VALUE_DISPLAY._default);
}
static refreshDynamicInput = function() {
var _in = ds_list_create();
for( var i = 0; i < input_fix_len; i++ )
@ -111,6 +82,17 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
ds_list_add(_in, inputs[| i + 1]);
ds_list_add(_in, inputs[| i + 2]);
if(LOADING || APPENDING) {
var type = inputs[| i + 1].getValue();
switch(type) {
case 0 : inputs[| i + 2].type = VALUE_TYPE.float; break;
case 1 : inputs[| i + 2].type = VALUE_TYPE.text; break;
case 2 : inputs[| i + 2].type = VALUE_TYPE.surface; break;
}
inputs[| i + 2].setDisplay(VALUE_DISPLAY._default);
}
array_push(input_display_list, i + 2);
} else {
delete inputs[| i + 0];
@ -128,6 +110,43 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
createNewInput();
}
static onValueFromUpdate = function(index) {
if(index == 0 || index == 2) compiled = false;
}
static onValueUpdate = function(index) {
if(index == 0 || index == 2) compiled = false;
if(index == 3) {
for( var i = 0; i < ds_list_size(outputs[| 0].value_to); i++ ) {
var _j = outputs[| 0].value_to[| i];
if(_j.value_from != outputs[| 0]) continue;
_j.node.compiled = false;
}
compiled = false;
}
if(index < input_fix_len) return;
if(LOADING || APPENDING) return;
if((index - input_fix_len) % data_length == 0) { //Variable name
inputs[| index + 2].name = inputs[| index].getValue();
compiled = false;
} else if((index - input_fix_len) % data_length == 1) { //Variable type
var type = inputs[| index].getValue();
switch(type) {
case 0 : inputs[| index + 1].type = VALUE_TYPE.float; break;
case 1 : inputs[| index + 1].type = VALUE_TYPE.text; break;
case 2 : inputs[| index + 1].type = VALUE_TYPE.surface; break;
}
inputs[| index + 1].setDisplay(VALUE_DISPLAY._default);
compiled = false;
}
refreshDynamicInput();
}
static update = function() {
if(!compiled) return;
@ -140,7 +159,7 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
}
var _outSurf = outputs[| 1].getValue();
surface_verify(_outSurf, _dimm[0], _dimm[1]);
_outSurf = surface_verify(_outSurf, _dimm[0], _dimm[1]);
surface_set_target(_outSurf);
try {
@ -167,9 +186,9 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
if(i) lua_code += ", "
lua_code += argument_name[i];
}
lua_code += ")";
lua_code += ")\n";
lua_code += _code;
lua_code += "end";
lua_code += "\nend";
lua_add_code(getState(), lua_code);
@ -187,7 +206,11 @@ function Node_Lua_Surface(_x, _y, _group = -1) : Node(_x, _y, _group) constructo
static postDeserialize = function() {
var _inputs = load_map[? "inputs"];
for(var i = input_index; i < ds_list_size(_inputs); i += data_length)
for(var i = input_fix_len; i < ds_list_size(_inputs); i += data_length)
createNewInput();
}
static doApplyDeserialize = function() {
refreshDynamicInput();
}
}

View file

@ -7,7 +7,7 @@ function Node_Noise(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constr
inputs[| 0] = nodeValue(0, "Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2 )
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 1] = nodeValue(1, "Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, irandom(99999));
inputs[| 1] = nodeValue(1, "Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999));
input_display_list = [
["Output", false], 0,

View file

@ -13,7 +13,7 @@ function Node_Noise_Aniso(_x, _y, _group = -1) : Node_Processor(_x, _y, _group)
inputs[| 1] = nodeValue(1, "Amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 2, 16 ])
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 2] = nodeValue(2, "Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, irandom(9999999));
inputs[| 2] = nodeValue(2, "Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(9999999));
inputs[| 3] = nodeValue(3, "Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ])
.setDisplay(VALUE_DISPLAY.vector)

View file

@ -63,9 +63,8 @@ function Node_Grid_Noise(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) c
shader_set_uniform_i(uniform_sam, is_surface(_sam));
shader_set_uniform_f(uniform_shf, _shf);
shader_set_uniform_i(uniform_shfax, _shfAx);
shader_set_uniform_f(uniform_sed, _sed);
random_set_seed(_sed);
shader_set_uniform_f(uniform_sed, random_range(1.0, 100.0));
if(is_surface(_sam))
draw_surface_stretched(_sam, 0, 0, _dim[0], _dim[1]);
else

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_gradient",
"tags": [],
"resourceType": "GMScript",
}

View file

@ -0,0 +1,64 @@
function Node_Noise_Hex(_x, _y, _group = -1) : Node_Processor(_x, _y, _group) constructor {
name = "Hexagonal noise";
shader = sh_noise_grid_hex;
uniform_dim = shader_get_uniform(shader, "dimension");
uniform_sed = shader_get_uniform(shader, "seed");
uniform_pos = shader_get_uniform(shader, "position");
uniform_sca = shader_get_uniform(shader, "scale");
uniform_ang = shader_get_uniform(shader, "angle");
uniform_sam = shader_get_uniform(shader, "useSampler");
inputs[| 0] = nodeValue(0, "Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, def_surf_size2 )
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 1] = nodeValue(1, "Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, irandom(99999));
inputs[| 2] = nodeValue(2, "Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0] )
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 3] = nodeValue(3, "Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 8, 8 ] )
.setDisplay(VALUE_DISPLAY.vector);
inputs[| 4] = nodeValue(4, "Texture sample", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
input_display_list = [
["Output", false], 0,
["Noise", false], 1, 2, 3,
["Texture", false], 4,
];
outputs[| 0] = nodeValue(0, "Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, PIXEL_SURFACE);
static drawOverlay = function(active, _x, _y, _s, _mx, _my, _snx, _sny) {
inputs[| 2].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny);
}
static process_data = function(_outSurf, _data, _output_index, _array_index) {
var _dim = _data[0];
var _sed = _data[1];
var _pos = _data[2];
var _sca = _data[3];
var _sam = _data[4];
_outSurf = surface_verify(_outSurf, _dim[0], _dim[1]);
surface_set_target(_outSurf);
shader_set(shader);
shader_set_uniform_f_array(uniform_dim, [_dim[0], _dim[1]]);
shader_set_uniform_f(uniform_sed, _sed);
shader_set_uniform_f_array(uniform_pos, _pos);
shader_set_uniform_f_array(uniform_sca, _sca);
shader_set_uniform_i(uniform_sam, is_surface(_sam));
if(is_surface(_sam))
draw_surface_stretched(_sam, 0, 0, _dim[0], _dim[1]);
else
draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dim[0], _dim[1], 0, c_white, 1);
shader_reset();
surface_reset_target();
return _outSurf;
}
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_noise_grid_hex",
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
}

View file

@ -0,0 +1,12 @@
{
"isDnD": false,
"isCompatibility": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
"resourceVersion": "1.0",
"name": "node_perlin",
"tags": [],
"resourceType": "GMScript",
}

Some files were not shown because too many files have changed in this diff Show more