diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index eb53a3b2f..1e68ae0e6 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -292,6 +292,7 @@ {"name":"o_dialog_notifications","order":6,"path":"objects/o_dialog_notifications/o_dialog_notifications.yy",}, {"name":"sh_draw_color","order":8,"path":"shaders/sh_draw_color/sh_draw_color.yy",}, {"name":"d3d_scene","order":4,"path":"scripts/d3d_scene/d3d_scene.yy",}, + {"name":"sh_channel_R2A","order":13,"path":"shaders/sh_channel_R2A/sh_channel_R2A.yy",}, {"name":"s_node_array_find","order":2,"path":"sprites/s_node_array_find/s_node_array_find.yy",}, {"name":"fd_rectangle_set_velocity_time_step","order":17,"path":"scripts/fd_rectangle_set_velocity_time_step/fd_rectangle_set_velocity_time_step.yy",}, {"name":"fd_rectangle_set_collision_mask_sprite","order":1,"path":"scripts/fd_rectangle_set_collision_mask_sprite/fd_rectangle_set_collision_mask_sprite.yy",}, @@ -377,6 +378,7 @@ {"name":"s_node_replace_palette","order":59,"path":"sprites/s_node_replace_palette/s_node_replace_palette.yy",}, {"name":"sh_cell_noise_round","order":4,"path":"shaders/sh_cell_noise_round/sh_cell_noise_round.yy",}, {"name":"s_node_cross_product_2d","order":12,"path":"sprites/s_node_cross_product_2d/s_node_cross_product_2d.yy",}, + {"name":"d3d_uvsphere","order":3,"path":"scripts/d3d_uvsphere/d3d_uvsphere.yy",}, {"name":"s_node_path_plot","order":12,"path":"sprites/s_node_path_plot/s_node_path_plot.yy",}, {"name":"__initAddon","order":2,"path":"scripts/__initAddon/__initAddon.yy",}, {"name":"node_pb_draw_trapezoid","order":8,"path":"scripts/node_pb_draw_trapezoid/node_pb_draw_trapezoid.yy",}, @@ -589,6 +591,7 @@ {"name":"sh_warp_4points_pers","order":10,"path":"shaders/sh_warp_4points_pers/sh_warp_4points_pers.yy",}, {"name":"node_mirror","order":3,"path":"scripts/node_mirror/node_mirror.yy",}, {"name":"node_corner","order":6,"path":"scripts/node_corner/node_corner.yy",}, + {"name":"node_3d_mesh_cylinder","order":3,"path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",}, {"name":"__vertex_function","order":1,"path":"scripts/__vertex_function/__vertex_function.yy",}, {"name":"node_path_anchor","order":13,"path":"scripts/node_path_anchor/node_path_anchor.yy",}, {"name":"s_node_path_wave","order":7,"path":"sprites/s_node_path_wave/s_node_path_wave.yy",}, @@ -607,7 +610,6 @@ {"name":"s_node_surface_from_buffer","order":1,"path":"sprites/s_node_surface_from_buffer/s_node_surface_from_buffer.yy",}, {"name":"node_iterator_filter_output","order":2,"path":"scripts/node_iterator_filter_output/node_iterator_filter_output.yy",}, {"name":"color_function","order":9,"path":"scripts/color_function/color_function.yy",}, - {"name":"d3d_cube_faces","order":1,"path":"scripts/d3d_cube_faces/d3d_cube_faces.yy",}, {"name":"fd_rectangle_set_pressure_size","order":11,"path":"scripts/fd_rectangle_set_pressure_size/fd_rectangle_set_pressure_size.yy",}, {"name":"node_color_data","order":6,"path":"scripts/node_color_data/node_color_data.yy",}, {"name":"node_array_shift","order":24,"path":"scripts/node_array_shift/node_array_shift.yy",}, @@ -666,6 +668,7 @@ {"name":"s_node_text_splice","order":6,"path":"sprites/s_node_text_splice/s_node_text_splice.yy",}, {"name":"__atlas","order":6,"path":"scripts/__atlas/__atlas.yy",}, {"name":"node_3d_transform","order":7,"path":"scripts/node_3d_transform/node_3d_transform.yy",}, + {"name":"__d3d_gizmo","order":2,"path":"scripts/__d3d_gizmo/__d3d_gizmo.yy",}, {"name":"sh_draw_single_channel","order":3,"path":"shaders/sh_draw_single_channel/sh_draw_single_channel.yy",}, {"name":"draw_sprite_ext_override","order":9,"path":"scripts/draw_sprite_ext_override/draw_sprite_ext_override.yy",}, {"name":"node_array_add","order":9,"path":"scripts/node_array_add/node_array_add.yy",}, @@ -677,6 +680,7 @@ {"name":"s_node_pb_fx_radial","order":4,"path":"sprites/s_node_pb_fx_radial/s_node_pb_fx_radial.yy",}, {"name":"__background_get_internal","order":2,"path":"scripts/__background_get_internal/__background_get_internal.yy",}, {"name":"s_biterator_b_labels","order":9,"path":"sprites/s_biterator_b_labels/s_biterator_b_labels.yy",}, + {"name":"d3d_ray","order":9,"path":"scripts/d3d_ray/d3d_ray.yy",}, {"name":"sh_combine_hsv","order":10,"path":"shaders/sh_combine_hsv/sh_combine_hsv.yy",}, {"name":"s_node_array_insert","order":4,"path":"sprites/s_node_array_insert/s_node_array_insert.yy",}, {"name":"addon_lua","order":1,"path":"scripts/addon_lua/addon_lua.yy",}, @@ -694,6 +698,7 @@ {"name":"buttonColor","order":3,"path":"scripts/buttonColor/buttonColor.yy",}, {"name":"notification_system","order":7,"path":"scripts/notification_system/notification_system.yy",}, {"name":"buffer_object","order":1,"path":"scripts/buffer_object/buffer_object.yy",}, + {"name":"node_3d_mesh_sphere","order":4,"path":"scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.yy",}, {"name":"s_node_audio_trim","order":3,"path":"sprites/s_node_audio_trim/s_node_audio_trim.yy",}, {"name":"s_node_pb_fx_highlight","order":7,"path":"sprites/s_node_pb_fx_highlight/s_node_pb_fx_highlight.yy",}, {"name":"node_color_from_hsv","order":8,"path":"scripts/node_color_from_hsv/node_color_from_hsv.yy",}, @@ -887,6 +892,7 @@ {"name":"s_node_draw_stack","order":4,"path":"sprites/s_node_draw_stack/s_node_draw_stack.yy",}, {"name":"sh_d3d_grid_view","order":12,"path":"shaders/sh_d3d_grid_view/sh_d3d_grid_view.yy",}, {"name":"delaunay","order":1,"path":"scripts/delaunay/delaunay.yy",}, + {"name":"sh_d3d_shadow_depth","order":19,"path":"shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.yy",}, {"name":"s_node_noise_fbm","order":26,"path":"sprites/s_node_noise_fbm/s_node_noise_fbm.yy",}, {"name":"sh_color_select_content","order":1,"path":"shaders/sh_color_select_content/sh_color_select_content.yy",}, {"name":"sh_outline","order":18,"path":"shaders/sh_outline/sh_outline.yy",}, @@ -919,6 +925,7 @@ {"name":"safe_operation","order":6,"path":"scripts/safe_operation/safe_operation.yy",}, {"name":"s_node_rigid_override","order":9,"path":"sprites/s_node_rigid_override/s_node_rigid_override.yy",}, {"name":"s_node_array_get","order":3,"path":"sprites/s_node_array_get/s_node_array_get.yy",}, + {"name":"d3d_bbox","order":8,"path":"scripts/d3d_bbox/d3d_bbox.yy",}, {"name":"o_dialog_save","order":12,"path":"objects/o_dialog_save/o_dialog_save.yy",}, {"name":"s_node_BW","order":13,"path":"sprites/s_node_BW/s_node_BW.yy",}, {"name":"s_node_strandSim_collide","order":7,"path":"sprites/s_node_strandSim_collide/s_node_strandSim_collide.yy",}, @@ -926,6 +933,7 @@ {"name":"sh_fd_turbulence","order":22,"path":"shaders/sh_fd_turbulence/sh_fd_turbulence.yy",}, {"name":"s_node_compare","order":1,"path":"sprites/s_node_compare/s_node_compare.yy",}, {"name":"s_node_fluidSim_domain_queue","order":9,"path":"sprites/s_node_fluidSim_domain_queue/s_node_fluidSim_domain_queue.yy",}, + {"name":"sh_d3d_shadow_cube_depth","order":20,"path":"shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.yy",}, {"name":"s_node_vfx_spawn","order":2,"path":"sprites/s_node_vfx_spawn/s_node_vfx_spawn.yy",}, {"name":"d3d_vec3","order":4,"path":"scripts/d3d_vec3/d3d_vec3.yy",}, {"name":"texture_set_repeat","order":1,"path":"scripts/texture_set_repeat/texture_set_repeat.yy",}, @@ -948,7 +956,9 @@ {"name":"getGradientData","order":1,"path":"scripts/getGradientData/getGradientData.yy",}, {"name":"s_node_pb_box_inset","order":22,"path":"sprites/s_node_pb_box_inset/s_node_pb_box_inset.yy",}, {"name":"node_glow","order":10,"path":"scripts/node_glow/node_glow.yy",}, + {"name":"o_dialog_preview_snap","order":4,"path":"objects/o_dialog_preview_snap/o_dialog_preview_snap.yy",}, {"name":"sh_blend_min","order":9,"path":"shaders/sh_blend_min/sh_blend_min.yy",}, + {"name":"d3d_gizmo_circle_z","order":4,"path":"scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.yy",}, {"name":"sh_pb_shade_half","order":5,"path":"shaders/sh_pb_shade_half/sh_pb_shade_half.yy",}, {"name":"node_polar","order":4,"path":"scripts/node_polar/node_polar.yy",}, {"name":"s_node_twirl","order":41,"path":"sprites/s_node_twirl/s_node_twirl.yy",}, @@ -998,6 +1008,7 @@ {"name":"s_node_crop_content","order":13,"path":"sprites/s_node_crop_content/s_node_crop_content.yy",}, {"name":"draw_line_zigzag","order":20,"path":"scripts/draw_line_zigzag/draw_line_zigzag.yy",}, {"name":"sh_alpha_grey","order":1,"path":"shaders/sh_alpha_grey/sh_alpha_grey.yy",}, + {"name":"sh_channel_R2B","order":12,"path":"shaders/sh_channel_R2B/sh_channel_R2B.yy",}, {"name":"s_node_rigidSim_activate","order":6,"path":"sprites/s_node_rigidSim_activate/s_node_rigidSim_activate.yy",}, {"name":"s_transparent","order":1,"path":"sprites/s_transparent/s_transparent.yy",}, {"name":"o_dialog_animation","order":1,"path":"objects/o_dialog_animation/o_dialog_animation.yy",}, @@ -1036,6 +1047,7 @@ {"name":"node_pb_draw_ellipse","order":2,"path":"scripts/node_pb_draw_ellipse/node_pb_draw_ellipse.yy",}, {"name":"sh_outline_only","order":35,"path":"shaders/sh_outline_only/sh_outline_only.yy",}, {"name":"lcd_function","order":13,"path":"scripts/lcd_function/lcd_function.yy",}, + {"name":"d3d_gizmo_line","order":1,"path":"scripts/d3d_gizmo_line/d3d_gizmo_line.yy",}, {"name":"s_node_destray","order":18,"path":"sprites/s_node_destray/s_node_destray.yy",}, {"name":"node_color_sampler","order":3,"path":"scripts/node_color_sampler/node_color_sampler.yy",}, {"name":"node_iterator_sort_output","order":2,"path":"scripts/node_iterator_sort_output/node_iterator_sort_output.yy",}, @@ -1117,12 +1129,14 @@ {"name":"node_text_file_read","order":7,"path":"scripts/node_text_file_read/node_text_file_read.yy",}, {"name":"node_pb_box_divide_grid","order":7,"path":"scripts/node_pb_box_divide_grid/node_pb_box_divide_grid.yy",}, {"name":"draw_tooltip","order":13,"path":"scripts/draw_tooltip/draw_tooltip.yy",}, + {"name":"d3d_cylinder","order":2,"path":"scripts/d3d_cylinder/d3d_cylinder.yy",}, {"name":"sh_palette_replace","order":45,"path":"shaders/sh_palette_replace/sh_palette_replace.yy",}, {"name":"sh_cell_noise_random","order":3,"path":"shaders/sh_cell_noise_random/sh_cell_noise_random.yy",}, {"name":"node_iterator_input","order":1,"path":"scripts/node_iterator_input/node_iterator_input.yy",}, {"name":"s_node_atlas","order":5,"path":"sprites/s_node_atlas/s_node_atlas.yy",}, {"name":"node_fluid_add","order":4,"path":"scripts/node_fluid_add/node_fluid_add.yy",}, {"name":"BBMOD_Quaternion","order":3,"path":"scripts/BBMOD_Quaternion/BBMOD_Quaternion.yy",}, + {"name":"d3d_cube","order":1,"path":"scripts/d3d_cube/d3d_cube.yy",}, {"name":"d3d_group","order":9,"path":"scripts/d3d_group/d3d_group.yy",}, {"name":"o_dialog_output_visibility","order":2,"path":"objects/o_dialog_output_visibility/o_dialog_output_visibility.yy",}, {"name":"node_normal","order":1,"path":"scripts/node_normal/node_normal.yy",}, @@ -1135,6 +1149,7 @@ {"name":"node_array_length","order":11,"path":"scripts/node_array_length/node_array_length.yy",}, {"name":"node_erode","order":9,"path":"scripts/node_erode/node_erode.yy",}, {"name":"sh_colours_replace","order":54,"path":"shaders/sh_colours_replace/sh_colours_replace.yy",}, + {"name":"sh_channel_R2G","order":11,"path":"shaders/sh_channel_R2G/sh_channel_R2G.yy",}, {"name":"node_wrap_mesh","order":6,"path":"scripts/node_wrap_mesh/node_wrap_mesh.yy",}, {"name":"sh_alpha_hash","order":2,"path":"shaders/sh_alpha_hash/sh_alpha_hash.yy",}, {"name":"vct_slider","order":1,"path":"scripts/vct_slider/vct_slider.yy",}, @@ -1144,6 +1159,7 @@ {"name":"value_snap","order":10,"path":"scripts/value_snap/value_snap.yy",}, {"name":"file_dropper","order":1,"path":"extensions/file_dropper/file_dropper.yy",}, {"name":"s_biterator_b_shape_idle","order":3,"path":"sprites/s_biterator_b_shape_idle/s_biterator_b_shape_idle.yy",}, + {"name":"o_dialog_preview_3d_settings","order":3,"path":"objects/o_dialog_preview_3d_settings/o_dialog_preview_3d_settings.yy",}, {"name":"sh_mirror_mask","order":8,"path":"shaders/sh_mirror_mask/sh_mirror_mask.yy",}, {"name":"node_export","order":10,"path":"scripts/node_export/node_export.yy",}, {"name":"controlPointBox","order":21,"path":"scripts/controlPointBox/controlPointBox.yy",}, @@ -1220,6 +1236,7 @@ {"name":"node_strand_update","order":3,"path":"scripts/node_strand_update/node_strand_update.yy",}, {"name":"sh_grid_noise","order":2,"path":"shaders/sh_grid_noise/sh_grid_noise.yy",}, {"name":"draw_set_blend_mode","order":1,"path":"scripts/draw_set_blend_mode/draw_set_blend_mode.yy",}, + {"name":"d3d_gizmo_line_dashed","order":3,"path":"scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy",}, {"name":"gameframe_macros","order":1,"path":"scripts/gameframe_macros/gameframe_macros.yy",}, {"name":"s_node_trigger_bool","order":4,"path":"sprites/s_node_trigger_bool/s_node_trigger_bool.yy",}, {"name":"panel_color","order":1,"path":"scripts/panel_color/panel_color.yy",}, @@ -1252,7 +1269,6 @@ {"name":"__view_get","order":1,"path":"scripts/__view_get/__view_get.yy",}, {"name":"s_node_texture_map","order":38,"path":"sprites/s_node_texture_map/s_node_texture_map.yy",}, {"name":"fd_rectangle_create","order":7,"path":"scripts/fd_rectangle_create/fd_rectangle_create.yy",}, - {"name":"d3d_gizmo","order":3,"path":"scripts/d3d_gizmo/d3d_gizmo.yy",}, {"name":"s_node_level_selector","order":29,"path":"sprites/s_node_level_selector/s_node_level_selector.yy",}, {"name":"random_function","order":3,"path":"scripts/random_function/random_function.yy",}, {"name":"s_node_input","order":6,"path":"sprites/s_node_input/s_node_input.yy",}, @@ -1355,6 +1371,7 @@ {"name":"s_node_ase_layer","order":14,"path":"sprites/s_node_ase_layer/s_node_ase_layer.yy",}, {"name":"_f_p1","order":1,"path":"fonts/_f_p1/_f_p1.yy",}, {"name":"tuple_functions","order":5,"path":"scripts/tuple_functions/tuple_functions.yy",}, + {"name":"node_3d_mesh_obj","order":2,"path":"scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy",}, {"name":"sh_blur_simple","order":6,"path":"shaders/sh_blur_simple/sh_blur_simple.yy",}, {"name":"sh_blend_difference","order":51,"path":"shaders/sh_blend_difference/sh_blend_difference.yy",}, {"name":"s_node_image_animation","order":2,"path":"sprites/s_node_image_animation/s_node_image_animation.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index ddd6a94f9..b679afaba 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -276,6 +276,8 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"graphics.json","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics",}, {"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_3d_preview_settings.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_3d_snap_settings.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ac_constant.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ac_function.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_ac_node.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, @@ -344,6 +346,7 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_output_visibility.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_play_sound.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_preview_export.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_preview_light.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_reset_16.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_reset_when_preview_strip2.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_icon_revert.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/icon",}, @@ -476,6 +479,7 @@ {"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":"s_node_bg_pill.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"s_node_deprecated_badge.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",}, {"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_frame_bg.png","CopyToMask":-1,"filePath":"datafiles/data/themes/default/graphics/node",}, @@ -814,6 +818,7 @@ {"id":{"name":"o_dialog_notifications","path":"objects/o_dialog_notifications/o_dialog_notifications.yy",},}, {"id":{"name":"sh_draw_color","path":"shaders/sh_draw_color/sh_draw_color.yy",},}, {"id":{"name":"d3d_scene","path":"scripts/d3d_scene/d3d_scene.yy",},}, + {"id":{"name":"sh_channel_R2A","path":"shaders/sh_channel_R2A/sh_channel_R2A.yy",},}, {"id":{"name":"s_node_array_find","path":"sprites/s_node_array_find/s_node_array_find.yy",},}, {"id":{"name":"fd_rectangle_set_velocity_time_step","path":"scripts/fd_rectangle_set_velocity_time_step/fd_rectangle_set_velocity_time_step.yy",},}, {"id":{"name":"fd_rectangle_set_collision_mask_sprite","path":"scripts/fd_rectangle_set_collision_mask_sprite/fd_rectangle_set_collision_mask_sprite.yy",},}, @@ -914,6 +919,7 @@ {"id":{"name":"s_node_replace_palette","path":"sprites/s_node_replace_palette/s_node_replace_palette.yy",},}, {"id":{"name":"sh_cell_noise_round","path":"shaders/sh_cell_noise_round/sh_cell_noise_round.yy",},}, {"id":{"name":"s_node_cross_product_2d","path":"sprites/s_node_cross_product_2d/s_node_cross_product_2d.yy",},}, + {"id":{"name":"d3d_uvsphere","path":"scripts/d3d_uvsphere/d3d_uvsphere.yy",},}, {"id":{"name":"s_node_path_plot","path":"sprites/s_node_path_plot/s_node_path_plot.yy",},}, {"id":{"name":"__initAddon","path":"scripts/__initAddon/__initAddon.yy",},}, {"id":{"name":"node_pb_draw_trapezoid","path":"scripts/node_pb_draw_trapezoid/node_pb_draw_trapezoid.yy",},}, @@ -1160,6 +1166,7 @@ {"id":{"name":"sh_warp_4points_pers","path":"shaders/sh_warp_4points_pers/sh_warp_4points_pers.yy",},}, {"id":{"name":"node_mirror","path":"scripts/node_mirror/node_mirror.yy",},}, {"id":{"name":"node_corner","path":"scripts/node_corner/node_corner.yy",},}, + {"id":{"name":"node_3d_mesh_cylinder","path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",},}, {"id":{"name":"__vertex_function","path":"scripts/__vertex_function/__vertex_function.yy",},}, {"id":{"name":"node_path_anchor","path":"scripts/node_path_anchor/node_path_anchor.yy",},}, {"id":{"name":"s_node_path_wave","path":"sprites/s_node_path_wave/s_node_path_wave.yy",},}, @@ -1250,6 +1257,7 @@ {"id":{"name":"s_node_text_splice","path":"sprites/s_node_text_splice/s_node_text_splice.yy",},}, {"id":{"name":"__atlas","path":"scripts/__atlas/__atlas.yy",},}, {"id":{"name":"node_3d_transform","path":"scripts/node_3d_transform/node_3d_transform.yy",},}, + {"id":{"name":"__d3d_gizmo","path":"scripts/__d3d_gizmo/__d3d_gizmo.yy",},}, {"id":{"name":"sh_draw_single_channel","path":"shaders/sh_draw_single_channel/sh_draw_single_channel.yy",},}, {"id":{"name":"draw_sprite_ext_override","path":"scripts/draw_sprite_ext_override/draw_sprite_ext_override.yy",},}, {"id":{"name":"node_array_add","path":"scripts/node_array_add/node_array_add.yy",},}, @@ -1261,6 +1269,7 @@ {"id":{"name":"s_node_pb_fx_radial","path":"sprites/s_node_pb_fx_radial/s_node_pb_fx_radial.yy",},}, {"id":{"name":"__background_get_internal","path":"scripts/__background_get_internal/__background_get_internal.yy",},}, {"id":{"name":"s_biterator_b_labels","path":"sprites/s_biterator_b_labels/s_biterator_b_labels.yy",},}, + {"id":{"name":"d3d_ray","path":"scripts/d3d_ray/d3d_ray.yy",},}, {"id":{"name":"sh_combine_hsv","path":"shaders/sh_combine_hsv/sh_combine_hsv.yy",},}, {"id":{"name":"s_node_array_insert","path":"sprites/s_node_array_insert/s_node_array_insert.yy",},}, {"id":{"name":"addon_lua","path":"scripts/addon_lua/addon_lua.yy",},}, @@ -1281,6 +1290,7 @@ {"id":{"name":"buttonColor","path":"scripts/buttonColor/buttonColor.yy",},}, {"id":{"name":"notification_system","path":"scripts/notification_system/notification_system.yy",},}, {"id":{"name":"buffer_object","path":"scripts/buffer_object/buffer_object.yy",},}, + {"id":{"name":"node_3d_mesh_sphere","path":"scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.yy",},}, {"id":{"name":"s_node_audio_trim","path":"sprites/s_node_audio_trim/s_node_audio_trim.yy",},}, {"id":{"name":"s_node_pb_fx_highlight","path":"sprites/s_node_pb_fx_highlight/s_node_pb_fx_highlight.yy",},}, {"id":{"name":"sh_shadow_cast","path":"shaders/sh_shadow_cast/sh_shadow_cast.yy",},}, @@ -1496,6 +1506,7 @@ {"id":{"name":"s_node_draw_stack","path":"sprites/s_node_draw_stack/s_node_draw_stack.yy",},}, {"id":{"name":"sh_d3d_grid_view","path":"shaders/sh_d3d_grid_view/sh_d3d_grid_view.yy",},}, {"id":{"name":"delaunay","path":"scripts/delaunay/delaunay.yy",},}, + {"id":{"name":"sh_d3d_shadow_depth","path":"shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.yy",},}, {"id":{"name":"s_node_noise_fbm","path":"sprites/s_node_noise_fbm/s_node_noise_fbm.yy",},}, {"id":{"name":"sh_color_select_content","path":"shaders/sh_color_select_content/sh_color_select_content.yy",},}, {"id":{"name":"sh_outline","path":"shaders/sh_outline/sh_outline.yy",},}, @@ -1530,6 +1541,7 @@ {"id":{"name":"safe_operation","path":"scripts/safe_operation/safe_operation.yy",},}, {"id":{"name":"s_node_rigid_override","path":"sprites/s_node_rigid_override/s_node_rigid_override.yy",},}, {"id":{"name":"s_node_array_get","path":"sprites/s_node_array_get/s_node_array_get.yy",},}, + {"id":{"name":"d3d_bbox","path":"scripts/d3d_bbox/d3d_bbox.yy",},}, {"id":{"name":"o_dialog_save","path":"objects/o_dialog_save/o_dialog_save.yy",},}, {"id":{"name":"s_node_BW","path":"sprites/s_node_BW/s_node_BW.yy",},}, {"id":{"name":"s_node_strandSim_collide","path":"sprites/s_node_strandSim_collide/s_node_strandSim_collide.yy",},}, @@ -1537,6 +1549,7 @@ {"id":{"name":"sh_fd_turbulence","path":"shaders/sh_fd_turbulence/sh_fd_turbulence.yy",},}, {"id":{"name":"s_node_compare","path":"sprites/s_node_compare/s_node_compare.yy",},}, {"id":{"name":"s_node_fluidSim_domain_queue","path":"sprites/s_node_fluidSim_domain_queue/s_node_fluidSim_domain_queue.yy",},}, + {"id":{"name":"sh_d3d_shadow_cube_depth","path":"shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.yy",},}, {"id":{"name":"sh_camera","path":"shaders/sh_camera/sh_camera.yy",},}, {"id":{"name":"s_node_vfx_spawn","path":"sprites/s_node_vfx_spawn/s_node_vfx_spawn.yy",},}, {"id":{"name":"d3d_vec3","path":"scripts/d3d_vec3/d3d_vec3.yy",},}, @@ -1564,7 +1577,9 @@ {"id":{"name":"s_node_character","path":"sprites/s_node_character/s_node_character.yy",},}, {"id":{"name":"s_node_pb_box_inset","path":"sprites/s_node_pb_box_inset/s_node_pb_box_inset.yy",},}, {"id":{"name":"node_glow","path":"scripts/node_glow/node_glow.yy",},}, + {"id":{"name":"o_dialog_preview_snap","path":"objects/o_dialog_preview_snap/o_dialog_preview_snap.yy",},}, {"id":{"name":"sh_blend_min","path":"shaders/sh_blend_min/sh_blend_min.yy",},}, + {"id":{"name":"d3d_gizmo_circle_z","path":"scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.yy",},}, {"id":{"name":"sh_pb_shade_half","path":"shaders/sh_pb_shade_half/sh_pb_shade_half.yy",},}, {"id":{"name":"node_polar","path":"scripts/node_polar/node_polar.yy",},}, {"id":{"name":"s_node_twirl","path":"sprites/s_node_twirl/s_node_twirl.yy",},}, @@ -1617,6 +1632,7 @@ {"id":{"name":"s_node_crop_content","path":"sprites/s_node_crop_content/s_node_crop_content.yy",},}, {"id":{"name":"draw_line_zigzag","path":"scripts/draw_line_zigzag/draw_line_zigzag.yy",},}, {"id":{"name":"sh_alpha_grey","path":"shaders/sh_alpha_grey/sh_alpha_grey.yy",},}, + {"id":{"name":"sh_channel_R2B","path":"shaders/sh_channel_R2B/sh_channel_R2B.yy",},}, {"id":{"name":"s_node_rigidSim_activate","path":"sprites/s_node_rigidSim_activate/s_node_rigidSim_activate.yy",},}, {"id":{"name":"s_transparent","path":"sprites/s_transparent/s_transparent.yy",},}, {"id":{"name":"o_dialog_animation","path":"objects/o_dialog_animation/o_dialog_animation.yy",},}, @@ -1660,6 +1676,7 @@ {"id":{"name":"sh_blink_extract","path":"shaders/sh_blink_extract/sh_blink_extract.yy",},}, {"id":{"name":"sh_outline_only","path":"shaders/sh_outline_only/sh_outline_only.yy",},}, {"id":{"name":"lcd_function","path":"scripts/lcd_function/lcd_function.yy",},}, + {"id":{"name":"d3d_gizmo_line","path":"scripts/d3d_gizmo_line/d3d_gizmo_line.yy",},}, {"id":{"name":"s_node_destray","path":"sprites/s_node_destray/s_node_destray.yy",},}, {"id":{"name":"node_color_sampler","path":"scripts/node_color_sampler/node_color_sampler.yy",},}, {"id":{"name":"node_iterator_sort_output","path":"scripts/node_iterator_sort_output/node_iterator_sort_output.yy",},}, @@ -1751,6 +1768,7 @@ {"id":{"name":"s_menu_transparent","path":"sprites/s_menu_transparent/s_menu_transparent.yy",},}, {"id":{"name":"node_pb_box_divide_grid","path":"scripts/node_pb_box_divide_grid/node_pb_box_divide_grid.yy",},}, {"id":{"name":"draw_tooltip","path":"scripts/draw_tooltip/draw_tooltip.yy",},}, + {"id":{"name":"d3d_cylinder","path":"scripts/d3d_cylinder/d3d_cylinder.yy",},}, {"id":{"name":"sh_palette_replace","path":"shaders/sh_palette_replace/sh_palette_replace.yy",},}, {"id":{"name":"buffer_functions","path":"scripts/buffer_functions/buffer_functions.yy",},}, {"id":{"name":"key_press","path":"scripts/key_press/key_press.yy",},}, @@ -1775,6 +1793,7 @@ {"id":{"name":"node_array_length","path":"scripts/node_array_length/node_array_length.yy",},}, {"id":{"name":"node_erode","path":"scripts/node_erode/node_erode.yy",},}, {"id":{"name":"sh_colours_replace","path":"shaders/sh_colours_replace/sh_colours_replace.yy",},}, + {"id":{"name":"sh_channel_R2G","path":"shaders/sh_channel_R2G/sh_channel_R2G.yy",},}, {"id":{"name":"node_wrap_mesh","path":"scripts/node_wrap_mesh/node_wrap_mesh.yy",},}, {"id":{"name":"node_surface_to_buffer","path":"scripts/node_surface_to_buffer/node_surface_to_buffer.yy",},}, {"id":{"name":"node_curve","path":"scripts/node_curve/node_curve.yy",},}, @@ -1792,6 +1811,7 @@ {"id":{"name":"node_pb_draw_rectangle","path":"scripts/node_pb_draw_rectangle/node_pb_draw_rectangle.yy",},}, {"id":{"name":"s_biterator_b_shape_idle","path":"sprites/s_biterator_b_shape_idle/s_biterator_b_shape_idle.yy",},}, {"id":{"name":"compat_path_array","path":"scripts/compat_path_array/compat_path_array.yy",},}, + {"id":{"name":"o_dialog_preview_3d_settings","path":"objects/o_dialog_preview_3d_settings/o_dialog_preview_3d_settings.yy",},}, {"id":{"name":"sh_mirror_mask","path":"shaders/sh_mirror_mask/sh_mirror_mask.yy",},}, {"id":{"name":"node_export","path":"scripts/node_export/node_export.yy",},}, {"id":{"name":"controlPointBox","path":"scripts/controlPointBox/controlPointBox.yy",},}, @@ -1879,6 +1899,7 @@ {"id":{"name":"node_strand_update","path":"scripts/node_strand_update/node_strand_update.yy",},}, {"id":{"name":"sh_grid_noise","path":"shaders/sh_grid_noise/sh_grid_noise.yy",},}, {"id":{"name":"draw_set_blend_mode","path":"scripts/draw_set_blend_mode/draw_set_blend_mode.yy",},}, + {"id":{"name":"d3d_gizmo_line_dashed","path":"scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy",},}, {"id":{"name":"gameframe_macros","path":"scripts/gameframe_macros/gameframe_macros.yy",},}, {"id":{"name":"s_node_trigger_bool","path":"sprites/s_node_trigger_bool/s_node_trigger_bool.yy",},}, {"id":{"name":"panel_color","path":"scripts/panel_color/panel_color.yy",},}, @@ -1919,7 +1940,6 @@ {"id":{"name":"sh_sample","path":"shaders/sh_sample/sh_sample.yy",},}, {"id":{"name":"s_node_texture_map","path":"sprites/s_node_texture_map/s_node_texture_map.yy",},}, {"id":{"name":"fd_rectangle_create","path":"scripts/fd_rectangle_create/fd_rectangle_create.yy",},}, - {"id":{"name":"d3d_gizmo","path":"scripts/d3d_gizmo/d3d_gizmo.yy",},}, {"id":{"name":"s_node_level_selector","path":"sprites/s_node_level_selector/s_node_level_selector.yy",},}, {"id":{"name":"random_function","path":"scripts/random_function/random_function.yy",},}, {"id":{"name":"s_node_input","path":"sprites/s_node_input/s_node_input.yy",},}, @@ -2036,6 +2056,7 @@ {"id":{"name":"_f_p1","path":"fonts/_f_p1/_f_p1.yy",},}, {"id":{"name":"tuple_functions","path":"scripts/tuple_functions/tuple_functions.yy",},}, {"id":{"name":"curve_bezier_function","path":"scripts/curve_bezier_function/curve_bezier_function.yy",},}, + {"id":{"name":"node_3d_mesh_obj","path":"scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy",},}, {"id":{"name":"sh_blur_simple","path":"shaders/sh_blur_simple/sh_blur_simple.yy",},}, {"id":{"name":"sh_blend_difference","path":"shaders/sh_blend_difference/sh_blend_difference.yy",},}, {"id":{"name":"s_node_image_animation","path":"sprites/s_node_image_animation/s_node_image_animation.yy",},}, diff --git a/datafiles/data/themes/default.zip b/datafiles/data/themes/default.zip index a5bda4cf4..8edc166d4 100644 Binary files a/datafiles/data/themes/default.zip and b/datafiles/data/themes/default.zip differ diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 7d37cfacb..8944c9bb1 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -433,6 +433,11 @@ event_inherited(); draw_sprite_ui_uniform(THEME.node_new_badge, 1, _boxx + grid_size - ui(12), yy + ui(6)); } + if(_node.deprecated) { + draw_sprite_ui_uniform(THEME.node_deprecated_badge, 0, _boxx + grid_size - ui(12), yy + ui(6),, COLORS._main_value_negative); + draw_sprite_ui_uniform(THEME.node_deprecated_badge, 1, _boxx + grid_size - ui(12), yy + ui(6)); + } + var fav = array_exists(global.FAV_NODES, _node.node); if(fav) draw_sprite_ui_uniform(THEME.star, 0, _boxx + grid_size - ui(10), yy + grid_size - ui(10), 0.7, COLORS._main_accent, 1.); @@ -546,6 +551,12 @@ event_inherited(); tx += ui(40); } + if(_node.deprecated) { + draw_sprite_ui_uniform(THEME.node_deprecated_badge, 0, tx + ui(16), yy + list_height / 2 + ui(1),, COLORS._main_value_negative); + draw_sprite_ui_uniform(THEME.node_deprecated_badge, 1, tx + ui(16), yy + list_height / 2 + ui(1)); + tx += ui(40); + } + draw_set_text(f_p2, fa_left, fa_center, COLORS._main_text); draw_text_add(tx, yy + list_height / 2, _node.getName()); @@ -634,6 +645,7 @@ event_inherited(); if(is_string(_node)) continue; if(ds_map_exists(search_map, _node.node)) continue; + if(_node[$ "deprecated"]) continue; var match = string_partial_match(string_lower(_node.getName()), search_lower); var param = ""; diff --git a/objects/o_dialog_graph_grid/Draw_64.gml b/objects/o_dialog_graph_grid/Draw_64.gml index d7fe29991..cded6d2e7 100644 --- a/objects/o_dialog_graph_grid/Draw_64.gml +++ b/objects/o_dialog_graph_grid/Draw_64.gml @@ -27,7 +27,7 @@ if(PANEL_GRAPH.project == noone || !PANEL_GRAPH.project.active) tb_size.register(); draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text); draw_text(dialog_x + ui(32), yy, __txtx("grid_size", "Grid size")); - tb_size.draw(dialog_x + dialog_w - ui(24), yy, ww, TEXTBOX_HEIGHT, PANEL_GRAPH.project.graphGrid.size, mouse_ui,, fa_right, fa_center); + tb_size.draw(dialog_x + dialog_w - ui(24), yy, ww, TEXTBOX_HEIGHT, PANEL_GRAPH.project.graphGrid.size, mouse_ui, fa_right, fa_center); yy += ui(40); sl_opacity.setFocusHover(sFOCUS, sHOVER); diff --git a/objects/o_dialog_graph_view/Draw_64.gml b/objects/o_dialog_graph_view/Draw_64.gml index 738354c9d..8a1af4547 100644 --- a/objects/o_dialog_graph_view/Draw_64.gml +++ b/objects/o_dialog_graph_view/Draw_64.gml @@ -29,8 +29,10 @@ if !ready exit; draw_text(dialog_x + ui(32), yy, _text); var params = new widgetParam(dialog_x + dialog_w - ui(16) - ww, yy - wh / 2, ww, wh, _data); - if(is_instanceof(_widg, checkBox)) + if(is_instanceof(_widg, checkBox)) { params.halign = fa_center; + params.valign = fa_center; + } _widg.drawParam(params); diff --git a/objects/o_dialog_preview_3d_settings/Create_0.gml b/objects/o_dialog_preview_3d_settings/Create_0.gml new file mode 100644 index 000000000..19ad09ddb --- /dev/null +++ b/objects/o_dialog_preview_3d_settings/Create_0.gml @@ -0,0 +1,41 @@ +/// @description init +event_inherited(); + +#region data + dialog_w = ui(320); + + destroy_on_click_out = true; + preview_panel = noone; +#endregion + +#region data + properties = [ + [ + new checkBox(function() { preview_panel.d3_scene_light_enabled = !preview_panel.d3_scene_light_enabled; }), + __txt("Preview Light"), + function() { return preview_panel.d3_scene_light_enabled }, + ], + [ + new buttonColor(function(col) { + preview_panel.d3_scene.lightAmbient = col; }), + __txt("Ambient Color"), + function() { return preview_panel.d3_scene.lightAmbient }, + ], + [ + new slider(0, 1, 0.01, function(val) { + preview_panel.d3_scene_light0.intensity = val; + preview_panel.d3_scene_light1.intensity = val; + }), + __txt("Light Intensity"), + function() { return preview_panel.d3_scene_light0.intensity }, + ], + [ + new checkBox(function() { + preview_panel.d3_scene_light0.shadow_active = !preview_panel.d3_scene_light0.shadow_active; }), + __txt("Shadow"), + function() { return preview_panel.d3_scene_light0.shadow_active }, + ], + ] + + dialog_h = ui(60 + 40 * array_length(properties)); +#endregion \ No newline at end of file diff --git a/objects/o_dialog_preview_3d_settings/Draw_64.gml b/objects/o_dialog_preview_3d_settings/Draw_64.gml new file mode 100644 index 000000000..f547596d8 --- /dev/null +++ b/objects/o_dialog_preview_3d_settings/Draw_64.gml @@ -0,0 +1,41 @@ +/// @description init +if !ready exit; + +#region base UI + draw_sprite_stretched(THEME.dialog_bg, 0, dialog_x, dialog_y, dialog_w, dialog_h); + if(sFOCUS) + draw_sprite_stretched_ext(THEME.dialog_active, 0, dialog_x, dialog_y, dialog_w, dialog_h, COLORS._main_accent, 1); + + draw_set_text(f_p0, fa_left, fa_top, COLORS._main_text); + draw_text(dialog_x + ui(24), dialog_y + ui(16), __txtx("preview_3d_settings", "3D Preview Settings")); +#endregion + +#region draw + var yy = dialog_y + ui(64); + var ww = ui(128); + var wh = TEXTBOX_HEIGHT; + + for( var i = 0, n = array_length(properties); i < n; i++ ) { + var _prop = properties[i]; + + var _widg = _prop[0]; + var _text = _prop[1]; + var _data = _prop[2](); + + _widg.setFocusHover(sFOCUS, sHOVER); + _widg.register(); + + draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text); + draw_text(dialog_x + ui(32), yy, _text); + + var params = new widgetParam(dialog_x + dialog_w - ui(16) - ww, yy - wh / 2, ww, wh, _data); + if(is_instanceof(_widg, checkBox)) { + params.halign = fa_center; + params.valign = fa_center; + } + + _widg.drawParam(params); + + yy += ui(40); + } +#endregion \ No newline at end of file diff --git a/objects/o_dialog_preview_3d_settings/o_dialog_preview_3d_settings.yy b/objects/o_dialog_preview_3d_settings/o_dialog_preview_3d_settings.yy new file mode 100644 index 000000000..20d428d55 --- /dev/null +++ b/objects/o_dialog_preview_3d_settings/o_dialog_preview_3d_settings.yy @@ -0,0 +1,37 @@ +{ + "resourceType": "GMObject", + "resourceVersion": "1.0", + "name": "o_dialog_preview_3d_settings", + "eventList": [ + {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,}, + {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,}, + ], + "managed": true, + "overriddenProperties": [], + "parent": { + "name": "preview", + "path": "folders/dialog/preview.yy", + }, + "parentObjectId": { + "name": "_p_dialog", + "path": "objects/_p_dialog/_p_dialog.yy", + }, + "persistent": false, + "physicsAngularDamping": 0.1, + "physicsDensity": 0.5, + "physicsFriction": 0.2, + "physicsGroup": 1, + "physicsKinematic": false, + "physicsLinearDamping": 0.1, + "physicsObject": false, + "physicsRestitution": 0.1, + "physicsSensor": false, + "physicsShape": 1, + "physicsShapePoints": [], + "physicsStartAwake": true, + "properties": [], + "solid": false, + "spriteId": null, + "spriteMaskId": null, + "visible": true, +} \ No newline at end of file diff --git a/objects/o_dialog_preview_snap/Create_0.gml b/objects/o_dialog_preview_snap/Create_0.gml new file mode 100644 index 000000000..adefb05da --- /dev/null +++ b/objects/o_dialog_preview_snap/Create_0.gml @@ -0,0 +1,31 @@ +/// @description init +event_inherited(); + +#region data + dialog_w = ui(320); + + destroy_on_click_out = true; + preview_panel = noone; +#endregion + +#region data + properties = [ + [ + new checkBox(function() { preview_panel.d3_tool_snap = !preview_panel.d3_tool_snap; }), + __txt("Snap"), + function() { return preview_panel.d3_tool_snap }, + ], + [ + new textBox(TEXTBOX_INPUT.number, function(val) { preview_panel.d3_tool_snap_position = val; }), + __txt("Linear"), + function() { return preview_panel.d3_tool_snap_position }, + ], + [ + new textBox(TEXTBOX_INPUT.number, function(val) { preview_panel.d3_tool_snap_rotation = val; }), + __txt("Rotation"), + function() { return preview_panel.d3_tool_snap_rotation }, + ], + ] + + dialog_h = ui(60 + 40 * array_length(properties)); +#endregion \ No newline at end of file diff --git a/objects/o_dialog_preview_snap/Draw_64.gml b/objects/o_dialog_preview_snap/Draw_64.gml new file mode 100644 index 000000000..f547596d8 --- /dev/null +++ b/objects/o_dialog_preview_snap/Draw_64.gml @@ -0,0 +1,41 @@ +/// @description init +if !ready exit; + +#region base UI + draw_sprite_stretched(THEME.dialog_bg, 0, dialog_x, dialog_y, dialog_w, dialog_h); + if(sFOCUS) + draw_sprite_stretched_ext(THEME.dialog_active, 0, dialog_x, dialog_y, dialog_w, dialog_h, COLORS._main_accent, 1); + + draw_set_text(f_p0, fa_left, fa_top, COLORS._main_text); + draw_text(dialog_x + ui(24), dialog_y + ui(16), __txtx("preview_3d_settings", "3D Preview Settings")); +#endregion + +#region draw + var yy = dialog_y + ui(64); + var ww = ui(128); + var wh = TEXTBOX_HEIGHT; + + for( var i = 0, n = array_length(properties); i < n; i++ ) { + var _prop = properties[i]; + + var _widg = _prop[0]; + var _text = _prop[1]; + var _data = _prop[2](); + + _widg.setFocusHover(sFOCUS, sHOVER); + _widg.register(); + + draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text); + draw_text(dialog_x + ui(32), yy, _text); + + var params = new widgetParam(dialog_x + dialog_w - ui(16) - ww, yy - wh / 2, ww, wh, _data); + if(is_instanceof(_widg, checkBox)) { + params.halign = fa_center; + params.valign = fa_center; + } + + _widg.drawParam(params); + + yy += ui(40); + } +#endregion \ No newline at end of file diff --git a/objects/o_dialog_preview_snap/o_dialog_preview_snap.yy b/objects/o_dialog_preview_snap/o_dialog_preview_snap.yy new file mode 100644 index 000000000..8fee59574 --- /dev/null +++ b/objects/o_dialog_preview_snap/o_dialog_preview_snap.yy @@ -0,0 +1,37 @@ +{ + "resourceType": "GMObject", + "resourceVersion": "1.0", + "name": "o_dialog_preview_snap", + "eventList": [ + {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,}, + {"resourceType":"GMEvent","resourceVersion":"1.0","name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,}, + ], + "managed": true, + "overriddenProperties": [], + "parent": { + "name": "preview", + "path": "folders/dialog/preview.yy", + }, + "parentObjectId": { + "name": "_p_dialog", + "path": "objects/_p_dialog/_p_dialog.yy", + }, + "persistent": false, + "physicsAngularDamping": 0.1, + "physicsDensity": 0.5, + "physicsFriction": 0.2, + "physicsGroup": 1, + "physicsKinematic": false, + "physicsLinearDamping": 0.1, + "physicsObject": false, + "physicsRestitution": 0.1, + "physicsSensor": false, + "physicsShape": 1, + "physicsShapePoints": [], + "physicsStartAwake": true, + "properties": [], + "solid": false, + "spriteId": null, + "spriteMaskId": null, + "visible": true, +} \ No newline at end of file diff --git a/objects/o_main/Create_0.gml b/objects/o_main/Create_0.gml index 41230132f..5cdc3acf1 100644 --- a/objects/o_main/Create_0.gml +++ b/objects/o_main/Create_0.gml @@ -301,6 +301,10 @@ NODE_COLOR_SHOW_PALETTE = false; #endregion +#region 3D + set3DGlobalPreview(); +#endregion + #region debug //instance_create_depth(0, 0, 0, addon_key_displayer); #endregion \ No newline at end of file diff --git a/objects/o_main/Step_0.gml b/objects/o_main/Step_0.gml index 4d1477d96..483ace211 100644 --- a/objects/o_main/Step_0.gml +++ b/objects/o_main/Step_0.gml @@ -139,12 +139,3 @@ if(PROJECT.active) { } } #endregion - -//print("===== Step end ====="); - -//if(keyboard_check_pressed(ord("Q"))) { -// if(key_mod_press(CTRL)) -// print(panelSerializeArray()); -// else -// print(panelSerialize()); -//} \ No newline at end of file diff --git a/scripts/BBMOD_Quaternion/BBMOD_Quaternion.gml b/scripts/BBMOD_Quaternion/BBMOD_Quaternion.gml index 05a3102c7..b8dbbd291 100644 --- a/scripts/BBMOD_Quaternion/BBMOD_Quaternion.gml +++ b/scripts/BBMOD_Quaternion/BBMOD_Quaternion.gml @@ -156,9 +156,9 @@ function BBMOD_Quaternion(_x=0.0, _y=0.0, _z=0.0, _w=1.0) constructor gml_pragma("forceinline"); _angle = -_angle; var _sinHalfAngle = dsin(_angle * 0.5); - X = _axis.X * _sinHalfAngle; - Y = _axis.Y * _sinHalfAngle; - Z = _axis.Z * _sinHalfAngle; + X = is_nan(_axis.X)? 0 : _axis.X * _sinHalfAngle; + Y = is_nan(_axis.Y)? 0 : _axis.Y * _sinHalfAngle; + Z = is_nan(_axis.Z)? 0 : _axis.Z * _sinHalfAngle; W = dcos(_angle * 0.5); return self; }; diff --git a/scripts/__d3d_gizmo/__d3d_gizmo.gml b/scripts/__d3d_gizmo/__d3d_gizmo.gml new file mode 100644 index 000000000..9cee45f7e --- /dev/null +++ b/scripts/__d3d_gizmo/__d3d_gizmo.gml @@ -0,0 +1,12 @@ +function __3dGizmo() : __3dObject() constructor { + vertex = []; + + VF = global.VF_POS_COL; + render_type = pr_linelist; + + static submitSel = function(params = {}) { + shader_set(sh_d3d_wireframe); + submitVertex(params); + shader_reset(); + } +} \ No newline at end of file diff --git a/scripts/__d3d_gizmo/__d3d_gizmo.yy b/scripts/__d3d_gizmo/__d3d_gizmo.yy new file mode 100644 index 000000000..31cf3973b --- /dev/null +++ b/scripts/__d3d_gizmo/__d3d_gizmo.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "__d3d_gizmo", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "gizmo", + "path": "folders/functions/3d/gizmo.yy", + }, +} \ No newline at end of file diff --git a/scripts/__node_3d/__node_3d.gml b/scripts/__node_3d/__node_3d.gml index 1cdeb8bd2..7fec7278f 100644 --- a/scripts/__node_3d/__node_3d.gml +++ b/scripts/__node_3d/__node_3d.gml @@ -2,6 +2,12 @@ function Node_3D(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constr name = "3D"; is_3D = true; + w = 64; + h = 64; + min_h = h; + + mesh_prev_surface = surface_create(64, 64); + static drawOverlay3D = function(active, params, _mx, _my, _snx, _sny, _panel) {} static processData = function(_outSurf, _data, _output_index, _array_index) {} @@ -26,4 +32,46 @@ function Node_3D(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constr } #endregion static getPreviewObjectOutline = function() { return getPreviewObject() } + + static refreshPreview = function() { #region + var _prev_obj = getPreviewObject(); + + mesh_prev_surface = surface_verify(mesh_prev_surface, 64, 64); + surface_set_target(mesh_prev_surface); + DRAW_CLEAR + + gpu_set_zwriteenable(true); + gpu_set_ztestenable(true); + gpu_set_cullmode(cull_noculling); + + D3D_GLOBAL_PREVIEW.applyCamera(); + D3D_GLOBAL_PREVIEW.apply(); + + for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) { + var _prev = _prev_obj[i]; + if(_prev == noone) continue; + var _b = _prev.getBBOX(); + var _c = _prev.getCenter(); + if(_b == noone || _c == noone) continue; + + D3D_GLOBAL_PREVIEW.custom_transform.set(_c); + + var _sca = 1 / _b.getMaximumScale(); + D3D_GLOBAL_PREVIEW.custom_scale.set(_sca); + + _prev.submitUI(D3D_GLOBAL_PREVIEW); + } + surface_reset_target(); + + D3D_GLOBAL_PREVIEW.resetCamera(); + } #endregion + + static postUpdate = function() { refreshPreview(); } + + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover = false, _focus = false) { #region + if(!is_surface(mesh_prev_surface)) return; + + var bbox = drawGetBbox(xx, yy, _s); + draw_surface_bbox(mesh_prev_surface, bbox); + } #endregion } \ No newline at end of file diff --git a/scripts/__node_3d_light/__node_3d_light.gml b/scripts/__node_3d_light/__node_3d_light.gml index 80edb0397..3a68d02b4 100644 --- a/scripts/__node_3d_light/__node_3d_light.gml +++ b/scripts/__node_3d_light/__node_3d_light.gml @@ -4,20 +4,22 @@ function Node_3D_Light(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) if(!LOADING && !APPENDING) inputs[| 0].setValue([ 0, 0, 1 ]); - inputs[| in_d3d + 0] = nodeValue("Color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white); + inputs[| in_d3d + 0] = nodeValue("Active", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); - inputs[| in_d3d + 1] = nodeValue("Intensity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) + inputs[| in_d3d + 1] = nodeValue("Color", self, JUNCTION_CONNECT.input, VALUE_TYPE.color, c_white); + + inputs[| in_d3d + 2] = nodeValue("Intensity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) .setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]); in_light = ds_list_size(inputs); outputs[| 0] = nodeValue("Light", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Light, noone); - #macro __d3d_input_list_light ["Light", false], in_d3d + 0, in_d3d + 1 + #macro __d3d_input_list_light ["Light", false], in_d3d + 0, in_d3d + 1, in_d3d + 2 static setLight = function(light, _data) { - var _col = _data[in_d3d + 0]; - var _int = _data[in_d3d + 1]; + var _col = _data[in_d3d + 1]; + var _int = _data[in_d3d + 2]; light.color = _col; light.intensity = _int; @@ -25,16 +27,14 @@ function Node_3D_Light(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) return light; } - static processData = function(_output, _data, _output_index, _array_index = 0) { - var object = new __3dLight(); - - setTransform(object, _data); - setLight(object, _data); - - return object; - } + static processData = function(_output, _data, _output_index, _array_index = 0) { } static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + var _colr = current_data[in_d3d + 1]; + var bbox = drawGetBbox(xx, yy, _s); + draw_set_color(_colr); + draw_circle(bbox.xc, bbox.yc, 8 * _s, false); + draw_circle(bbox.xc, bbox.yc, 12 * _s, true); } } \ No newline at end of file diff --git a/scripts/__node_3d_mesh/__node_3d_mesh.gml b/scripts/__node_3d_mesh/__node_3d_mesh.gml index 74c4bbe39..8e0742a3d 100644 --- a/scripts/__node_3d_mesh/__node_3d_mesh.gml +++ b/scripts/__node_3d_mesh/__node_3d_mesh.gml @@ -8,8 +8,4 @@ function Node_3D_Mesh(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) c #macro __d3d_input_list_mesh ["Mesh", false] static processData = function(_output, _data, _output_index, _array_index = 0) {} - - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { - - } } \ No newline at end of file diff --git a/scripts/__node_3d_object/__node_3d_object.gml b/scripts/__node_3d_object/__node_3d_object.gml index 8d630f6d2..c91c1ca19 100644 --- a/scripts/__node_3d_object/__node_3d_object.gml +++ b/scripts/__node_3d_object/__node_3d_object.gml @@ -1,7 +1,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constructor { name = "3D Object"; - h = 64; - min_h = h; + cached_object = []; + object_class = noone; preview_channel = 0; @@ -24,6 +24,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr drag_delta = 0; drag_prev = 0; + drag_val = 0; drag_mx = 0; drag_my = 0; drag_px = 0; @@ -124,7 +125,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr ga[i] = _qview.Rotate(_qinv.Rotate(_qrot.Rotate(ga[i]))); else if(_axis == 1) ga[i] = _qview.Rotate(_qinv.Rotate(ga[i])); - + th = 2 + (axis_hover == i || drag_axis == i); if(drag_axis != noone && drag_axis != i) continue; @@ -215,11 +216,11 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr if(drag_prev != undefined) { var _diff = mAdj.subtract(drag_prev); var _dist = _diff.dot(prj); - + for( var i = 0; i < 3; i++ ) - _pos[i] += prj.getIndex(i) * _dist; - - if(inputs[| index].setValue(_pos)) + drag_val[i] += prj.getIndex(i) * _dist; + + if(inputs[| index].setValue(value_snap(drag_val, _snx))) UNDO_HOLDING = true; } } else { @@ -239,9 +240,9 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr var _diff = mAdj.subtract(drag_prev); for( var i = 0; i < 3; i++ ) - _pos[i] += _diff.getIndex(i); - - if(inputs[| index].setValue(_pos)) + drag_val[i] += _diff.getIndex(i); + + if(inputs[| index].setValue(value_snap(drag_val, _snx))) UNDO_HOLDING = true; } } @@ -263,7 +264,8 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr drag_py = _my; drag_cx = cx; drag_cy = cy; - + + drag_val = _pos; drag_original = new __vec3(_pos); } #endregion } #endregion @@ -345,7 +347,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr if(_axis == 0) _n = _qrot.Rotate(_n).Normalize(); - + var _nv = _qview.Rotate(_qinv.Rotate(_n)); draw_line_round(cx, cy, cx + _nv.X * 100, cy + _nv.Y * 100, 2); @@ -353,12 +355,19 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr var _rd = (mAng - drag_prev) * (_nv.Z > 0? 1 : -1); var _currR = new BBMOD_Quaternion().FromAxisAngle(_n, _rd); - var _mulp = _currR.Mul(_qrot); - var _Nrot = _mulp.ToArray(); + drag_val = _currR.Mul(drag_val); + + var _axs = drag_val.GetAxis(); + var _ang = drag_val.GetAngle(); + var _ans = value_snap(_ang, _sny); + + var _NrotE = new BBMOD_Quaternion().FromAxisAngle(_axs, -_ans); + + var _Nrot = _NrotE.ToArray(); if(inputs[| index].setValue(_Nrot)) UNDO_HOLDING = true; - } + } draw_set_color(COLORS._main_accent); draw_line_dashed(cx, cy, _mx, _my, 1, 4); @@ -369,6 +378,9 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr if(_hover != noone && mouse_press(mb_left, active)) { #region drag_axis = _hover; drag_prev = undefined; + + drag_axs = undefined; + drag_val = _qrot.Clone(); } #endregion } #endregion @@ -514,9 +526,9 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr var _dist = _diff.dot(prj); for( var i = 0; i < 3; i++ ) - _sca[i] += prj.getIndex(i) * _dist; + drag_val[i] += prj.getIndex(i) * _dist; - if(inputs[| index].setValue(_sca)) + if(inputs[| index].setValue(value_snap(drag_val, _snx))) UNDO_HOLDING = true; } } else { @@ -535,9 +547,9 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr var _diff = mAdj.subtract(drag_prev); for( var i = 0; i < 3; i++ ) - _sca[i] += _diff.getIndex(i); + drag_val[i] += _diff.getIndex(i); - if(inputs[| index].setValue(_sca)) + if(inputs[| index].setValue(value_snap(drag_val, _snx))) UNDO_HOLDING = true; } } @@ -560,6 +572,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr drag_cx = cx; drag_cy = cy; + drag_val = _sca; drag_original = new __vec3(_sca); } #endregion } #endregion @@ -583,6 +596,7 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr } #endregion static setTransform = function(object, _data) { #region + if(object == noone) return; var _pos = _data[0]; var _rot = _data[1]; var _sca = _data[2]; @@ -592,4 +606,19 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr object.scale.set(_sca[0], _sca[1], _sca[2]); return object; } #endregion + + static newObject = function() { return object_class == noone? noone : new object_class(); } + + static getObject = function(index, class = object_class) { #region + var _obj = array_safe_get(cached_object, index, noone); + if(_obj == noone) { + _obj = newObject(); + } else if(!is_instanceof(_obj, class)) { + _obj.destroy(); + _obj = newObject(); + } + + cached_object[index] = _obj; + return _obj; + } #endregion } \ No newline at end of file diff --git a/scripts/__vertex_function/__vertex_function.gml b/scripts/__vertex_function/__vertex_function.gml index a69aa0292..edb01306c 100644 --- a/scripts/__vertex_function/__vertex_function.gml +++ b/scripts/__vertex_function/__vertex_function.gml @@ -9,18 +9,25 @@ MATRIX_IDENTITY = matrix_build_identity(); global.format_pc = vertex_format_end(); #endregion -function vertex_add_pt(vertex, position, texture) { - vertex_position_3d(vertex, position[0], position[1], position[2]); - vertex_texcoord(vertex, texture[0], texture[1]); +function vertex_add_pt(buffer, position, texture) { + vertex_position_3d(buffer, position[0], position[1], position[2]); + vertex_texcoord(buffer, texture[0], texture[1]); } -function vertex_add_pnt(vertex, position, normal, texture) { - vertex_position_3d(vertex, position[0], position[1], position[2]); - vertex_normal(vertex, normal[0], normal[1], normal[2]); - vertex_texcoord(vertex, texture[0], texture[1]); +function vertex_add_pnt(buffer, position, normal, texture) { + vertex_position_3d(buffer, position[0], position[1], position[2]); + vertex_normal(buffer, normal[0], normal[1], normal[2]); + vertex_texcoord(buffer, texture[0], texture[1]); } -function vertex_add_2pc(vertex, _x, _y, color, alpha = 1) { - vertex_position(vertex, _x, _y); - vertex_color(vertex, color, alpha); +function vertex_add_pntc(buffer, position, normal, texture, color = c_white, alpha = 1) { + vertex_position_3d(buffer, position[0], position[1], position[2]); + vertex_normal(buffer, normal[0], normal[1], normal[2]); + vertex_texcoord(buffer, texture[0], texture[1]); + vertex_color(buffer, color, alpha); +} + +function vertex_add_2pc(buffer, _x, _y, color, alpha = 1) { + vertex_position(buffer, _x, _y); + vertex_color(buffer, color, alpha); } \ No newline at end of file diff --git a/scripts/array_functions/array_functions.gml b/scripts/array_functions/array_functions.gml index b79bc1d8b..79da40352 100644 --- a/scripts/array_functions/array_functions.gml +++ b/scripts/array_functions/array_functions.gml @@ -9,7 +9,9 @@ function array_create_from_list(list) { } function array_safe_set(arr, index, value, fill = 0) { - if(!is_array(arr)) return arr; + if(!is_array(arr)) return arr; + if(is_array(index)) return arr; + if(index < 0) return arr; if(index >= array_length(arr)) { var i = array_length(arr); @@ -42,7 +44,8 @@ enum ARRAY_OVERFLOW { function array_safe_get(arr, index, def = 0, overflow = ARRAY_OVERFLOW._default) { gml_pragma("forceinline"); - if(!is_array(arr)) return def; + if(!is_array(arr)) return def; + if(is_array(index)) return def; if(overflow == ARRAY_OVERFLOW.loop) { var len = array_length(arr); diff --git a/scripts/checkbox/checkbox.gml b/scripts/checkbox/checkbox.gml index 478243962..e4792ec88 100644 --- a/scripts/checkbox/checkbox.gml +++ b/scripts/checkbox/checkbox.gml @@ -24,15 +24,21 @@ function checkBox(_onClick) : widget() constructor { static drawParam = function(params) { var ss = params.s; - var x0; + var x0, y0; switch(params.halign) { case fa_left : x0 = params.x; break; case fa_center : x0 = params.x + (params.w - ss) / 2; break; - case fa_right : x0 = params.x + params.w - ss; break; + case fa_right : x0 = params.x + params.w - ss; break; } - return draw(x0, params.y, params.data, params.m, params.s); + switch(params.valign) { + case fa_top : y0 = params.y; break; + case fa_center : y0 = params.y + (params.h - ss) / 2; break; + case fa_bottom : y0 = params.y + params.h - ss; break; + } + + return draw(x0, y0, params.data, params.m, params.s); } static draw = function(_x, _y, _value, _m, ss = ui(28), halign = fa_left, valign = fa_top) { diff --git a/scripts/d3_vector/d3_vector.gml b/scripts/d3_vector/d3_vector.gml index cd0da5f7f..3792466d4 100644 --- a/scripts/d3_vector/d3_vector.gml +++ b/scripts/d3_vector/d3_vector.gml @@ -8,10 +8,12 @@ function d3_normalize(vec) { return vec; } -function d3_cross_product(a, b, result) { +function d3_cross_product(a, b) { var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2]; - result[@ 0] = ay * bz - az * by; - result[@ 1] = az * bx - ax * bz; - result[@ 2] = ax * by - ay * bx; + var result = []; + result[0] = ay * bz - az * by; + result[1] = az * bx - ax * bz; + result[2] = ax * by - ay * bx; + return result; } diff --git a/scripts/d3d_bbox/d3d_bbox.gml b/scripts/d3d_bbox/d3d_bbox.gml new file mode 100644 index 000000000..089403585 --- /dev/null +++ b/scripts/d3d_bbox/d3d_bbox.gml @@ -0,0 +1,22 @@ +function __bbox3D(first, second) constructor { + self.first = first; + self.second = second; + + static getScale = function() { + gml_pragma("forceinline"); + return sqrt( + sqr(first.x - second.x) + + sqr(first.y - second.y) + + sqr(first.z - second.z) + ); + } + + static getMaximumScale = function() { + gml_pragma("forceinline"); + return max( + abs(first.x - second.x), + abs(first.y - second.y), + abs(first.z - second.z), + ); + } +} \ No newline at end of file diff --git a/scripts/d3d_bbox/d3d_bbox.yy b/scripts/d3d_bbox/d3d_bbox.yy new file mode 100644 index 000000000..b20c4cbcd --- /dev/null +++ b/scripts/d3d_bbox/d3d_bbox.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "d3d_bbox", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "util", + "path": "folders/functions/3d/util.yy", + }, +} \ No newline at end of file diff --git a/scripts/d3d_camera/d3d_camera.gml b/scripts/d3d_camera/d3d_camera.gml index 8a5f76414..18527a275 100644 --- a/scripts/d3d_camera/d3d_camera.gml +++ b/scripts/d3d_camera/d3d_camera.gml @@ -9,6 +9,8 @@ function __3dCamera() constructor { focus = new __vec3(); up = new __vec3(0, 0, -1); + raw = camera_create(); + useFocus = true; focus_angle_x = 0; focus_angle_y = 0; @@ -17,8 +19,8 @@ function __3dCamera() constructor { projection = CAMERA_PROJECTION.perspective; fov = 60; - view_near = 1; - view_far = 32000; + view_near = .01; + view_far = 100; view_w = 1; view_h = 1; @@ -40,18 +42,26 @@ function __3dCamera() constructor { return upVector._normalize(); } - static applyCamera = function(cam) { - camera_set_proj_mat(cam, projMat.raw); - camera_set_view_mat(cam, viewMat.raw); + static applyCamera = function() { + camera_set_proj_mat(raw, projMat.raw); + camera_set_view_mat(raw, viewMat.raw); - camera_apply(cam); + camera_apply(raw); + } + + static resetCamera = function() { + camera_apply(0); + gpu_set_cullmode(cull_noculling); } static setMatrix = function() { if(projection == CAMERA_PROJECTION.perspective) projMat.setRaw(matrix_build_projection_perspective_fov(fov, view_aspect, view_near, view_far)); - else + else { projMat.setRaw(matrix_build_projection_ortho(view_w, view_h, view_near, view_far)); + //print($"{view_w}, {view_h}, {view_near}, {view_far}") + //print(projMat); + } if(useFocus) viewMat.setRaw(matrix_build_lookat(position.x, position.y, position.z, focus.x, focus.y, focus.z, up.x, up.y, up.z)); diff --git a/scripts/d3d_cube/d3d_cube.yy b/scripts/d3d_cube/d3d_cube.yy index d98cce271..8146b3d82 100644 --- a/scripts/d3d_cube/d3d_cube.yy +++ b/scripts/d3d_cube/d3d_cube.yy @@ -5,7 +5,7 @@ "isCompatibility": false, "isDnD": false, "parent": { - "name": "3d", - "path": "folders/functions/3d.yy", + "name": "mesh", + "path": "folders/functions/3d/mesh.yy", }, } \ No newline at end of file diff --git a/scripts/d3d_cylinder/d3d_cylinder.gml b/scripts/d3d_cylinder/d3d_cylinder.gml new file mode 100644 index 000000000..9584eed49 --- /dev/null +++ b/scripts/d3d_cylinder/d3d_cylinder.gml @@ -0,0 +1,113 @@ +function __3dCylinder(radius = 0.5, height = 1, sides = 8, smooth = false) : __3dObject() constructor { + VF = global.VF_POS_NORM_TEX_COL; + render_type = pr_trianglelist; + + self.radius = radius; + self.height = height; + self.sides = sides; + self.smooth = smooth; + + static initModel = function() { + var v0 = array_create(3 * sides); + var v1 = array_create(3 * sides); + var n0 = array_create(3 * sides); + var n1 = array_create(3 * sides); + var u0 = array_create(3 * sides); + var u1 = array_create(3 * sides); + + var _h = height / 2; + + for( var i = 0; i < sides; i++ ) { + var a0 = (i + 0) / sides * 360; + var a1 = (i + 1) / sides * 360; + + var x0 = lengthdir_x(radius, a0); + var y0 = lengthdir_y(radius, a0); + var x1 = lengthdir_x(radius, a1); + var y1 = lengthdir_y(radius, a1); + + v0[i * 3 + 0] = [ 0, 0, _h]; + v0[i * 3 + 1] = [x0, y0, _h]; + v0[i * 3 + 2] = [x1, y1, _h]; + + v1[i * 3 + 0] = [ 0, 0, -_h]; + v1[i * 3 + 1] = [x0, y0, -_h]; + v1[i * 3 + 2] = [x1, y1, -_h]; + + n0[i * 3 + 0] = [ 0, 0, 1]; + n0[i * 3 + 1] = [ 0, 0, 1]; + n0[i * 3 + 2] = [ 0, 0, 1]; + + n1[i * 3 + 0] = [ 0, 0, -1]; + n1[i * 3 + 1] = [ 0, 0, -1]; + n1[i * 3 + 2] = [ 0, 0, -1]; + + var _u0 = 0.5 + lengthdir_x(0.5, a0); + var _v0 = 0.5 + lengthdir_y(0.5, a0); + var _u1 = 0.5 + lengthdir_x(0.5, a1); + var _v1 = 0.5 + lengthdir_y(0.5, a1); + + u0[i * 3 + 0] = [ 0.5, 0.5]; + u0[i * 3 + 1] = [ _u0, _v0]; + u0[i * 3 + 2] = [ _u1, _v1]; + + u1[i * 3 + 0] = [ 0.5, 0.5]; + u1[i * 3 + 1] = [ _u0, _v0]; + u1[i * 3 + 2] = [ _u1, _v1]; + } + + var vs = array_create(3 * sides * 2); + var ns = array_create(3 * sides * 2); + var us = array_create(3 * sides * 2); + + for( var i = 0; i < sides; i++ ) { + var a0 = (i + 0) / sides * 360; + var a1 = (i + 1) / sides * 360; + + var x0 = lengthdir_x(radius, a0); + var y0 = lengthdir_y(radius, a0); + var x1 = lengthdir_x(radius, a1); + var y1 = lengthdir_y(radius, a1); + + vs[i * 3 * 2 + 0] = [x0, y0, _h]; + vs[i * 3 * 2 + 1] = [x1, y1, _h]; + vs[i * 3 * 2 + 2] = [x0, y0, -_h]; + + vs[i * 3 * 2 + 3] = [x0, y0, -_h]; + vs[i * 3 * 2 + 4] = [x1, y1, _h]; + vs[i * 3 * 2 + 5] = [x1, y1, -_h]; + + var nx0 = smooth? lengthdir_x(1, a0) : lengthdir_x(1, (a0 + a1) / 2); + var ny0 = smooth? lengthdir_y(1, a0) : lengthdir_y(1, (a0 + a1) / 2); + var nx1 = smooth? lengthdir_x(1, a1) : lengthdir_x(1, (a0 + a1) / 2); + var ny1 = smooth? lengthdir_y(1, a1) : lengthdir_y(1, (a0 + a1) / 2); + + ns[i * 3 * 2 + 0] = [nx0, ny0, 0]; + ns[i * 3 * 2 + 1] = [nx1, ny1, 0]; + ns[i * 3 * 2 + 2] = [nx0, ny0, 0]; + + ns[i * 3 * 2 + 3] = [nx0, ny0, 0]; + ns[i * 3 * 2 + 4] = [nx1, ny1, 0]; + ns[i * 3 * 2 + 5] = [nx1, ny1, 0]; + + var ux0 = (i + 0) / sides; + var ux1 = (i + 1) / sides; + + us[i * 3 * 2 + 0] = [ux0, 0]; + us[i * 3 * 2 + 1] = [ux1, 0]; + us[i * 3 * 2 + 2] = [ux0, 1]; + + us[i * 3 * 2 + 3] = [ux0, 1]; + us[i * 3 * 2 + 4] = [ux1, 0]; + us[i * 3 * 2 + 5] = [ux1, 1]; + } + + vertex = [ v0, v1, vs ]; + normals = [ n0, n1, ns ]; + uv = [ u0, u1, us ]; + + VB = build(); + } initModel(); + + static onParameterUpdate = initModel; +} \ No newline at end of file diff --git a/scripts/d3d_cylinder/d3d_cylinder.yy b/scripts/d3d_cylinder/d3d_cylinder.yy new file mode 100644 index 000000000..99579e1b8 --- /dev/null +++ b/scripts/d3d_cylinder/d3d_cylinder.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "d3d_cylinder", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "mesh", + "path": "folders/functions/3d/mesh.yy", + }, +} \ No newline at end of file diff --git a/scripts/d3d_gizmo/d3d_gizmo.gml b/scripts/d3d_gizmo/d3d_gizmo.gml deleted file mode 100644 index 6548fcac2..000000000 --- a/scripts/d3d_gizmo/d3d_gizmo.gml +++ /dev/null @@ -1,3 +0,0 @@ -function __3dGizmo() constructor { - -} \ No newline at end of file diff --git a/scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.gml b/scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.gml new file mode 100644 index 000000000..238c93ca9 --- /dev/null +++ b/scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.gml @@ -0,0 +1,18 @@ +function __3dGizmoCircleZ(radius = 0.5, color = c_white, alpha = 1) : __3dGizmo() constructor { + vertex = array_create(33 * 2); + + var _i = 0; + for( var i = 0; i <= 32; i++ ) { + var a0 = (i + 0) / 32 * 360; + var a1 = (i + 1) / 32 * 360; + var x0 = lengthdir_x(radius, a0); + var y0 = lengthdir_y(radius, a0); + var x1 = lengthdir_x(radius, a1); + var y1 = lengthdir_y(radius, a1); + + vertex[_i++] = [ x0, y0, 0, color, alpha ]; + vertex[_i++] = [ x1, y1, 0, color, alpha ]; + } + + VB = build(); +} \ No newline at end of file diff --git a/scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.yy b/scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.yy new file mode 100644 index 000000000..b7047ffab --- /dev/null +++ b/scripts/d3d_gizmo_circle_z/d3d_gizmo_circle_z.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "d3d_gizmo_circle_z", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "gizmo", + "path": "folders/functions/3d/gizmo.yy", + }, +} \ No newline at end of file diff --git a/scripts/d3d_gizmo_line/d3d_gizmo_line.gml b/scripts/d3d_gizmo_line/d3d_gizmo_line.gml new file mode 100644 index 000000000..9e1b6a77b --- /dev/null +++ b/scripts/d3d_gizmo_line/d3d_gizmo_line.gml @@ -0,0 +1,7 @@ +function __3dGizmoLine(from, to, color = c_white, alpha = 1) : __3dGizmo() constructor { + vertex = [ + [ from.x, from.y, from.z, color, alpha ], + [ to.x, to.y, to.z, color, alpha ], + ]; + VB = build(); +} \ No newline at end of file diff --git a/scripts/d3d_gizmo_line/d3d_gizmo_line.yy b/scripts/d3d_gizmo_line/d3d_gizmo_line.yy new file mode 100644 index 000000000..b313a6287 --- /dev/null +++ b/scripts/d3d_gizmo_line/d3d_gizmo_line.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "d3d_gizmo_line", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "gizmo", + "path": "folders/functions/3d/gizmo.yy", + }, +} \ No newline at end of file diff --git a/scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.gml b/scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.gml new file mode 100644 index 000000000..a8fd027a6 --- /dev/null +++ b/scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.gml @@ -0,0 +1,14 @@ +function __3dGizmoLineDashed(from, to, dash = 0.1, color = c_white, alpha = 1) : __3dGizmo() constructor { + var _dist = from.distance(to); + var _dash = max(2, ceil(_dist / dash)); + + vertex = array_create(_dash); + for( var i = 0; i < _dash; i++ ) { + var prog = i / (_dash - 1); + vertex[i] = [ lerp(from.x, to.x, prog), + lerp(from.y, to.y, prog), + lerp(from.z, to.z, prog), + color, alpha ] + } + VB = build(); +} \ No newline at end of file diff --git a/scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy b/scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy new file mode 100644 index 000000000..d0d7733ea --- /dev/null +++ b/scripts/d3d_gizmo_line_dashed/d3d_gizmo_line_dashed.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "d3d_gizmo_line_dashed", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "gizmo", + "path": "folders/functions/3d/gizmo.yy", + }, +} \ No newline at end of file diff --git a/scripts/d3d_gizmo_sphere/d3d_gizmo_sphere.gml b/scripts/d3d_gizmo_sphere/d3d_gizmo_sphere.gml index 3a50760fb..f70359185 100644 --- a/scripts/d3d_gizmo_sphere/d3d_gizmo_sphere.gml +++ b/scripts/d3d_gizmo_sphere/d3d_gizmo_sphere.gml @@ -1,4 +1,4 @@ -function __3dGizmoSphere(radius = 0.5, color = c_white, alpha = 1) : __3dObject() constructor { +function __3dGizmoSphere(radius = 0.5, color = c_white, alpha = 1) : __3dGizmo() constructor { vertex = array_create(33 * 3); var _i = 0; @@ -17,14 +17,6 @@ function __3dGizmoSphere(radius = 0.5, color = c_white, alpha = 1) : __3dObject( vertex[_i++] = [ x0, y0, 0, color, alpha ]; vertex[_i++] = [ x1, y1, 0, color, alpha ]; } - - VF = global.VF_POS_COL; - render_type = pr_linelist; - VB = build(); - static submitSel = function(params = {}) { - shader_set(sh_d3d_wireframe); - submitVertex(params); - shader_reset(); - } + VB = build(); } \ No newline at end of file diff --git a/scripts/d3d_group/d3d_group.gml b/scripts/d3d_group/d3d_group.gml index af72d488e..497c5fd57 100644 --- a/scripts/d3d_group/d3d_group.gml +++ b/scripts/d3d_group/d3d_group.gml @@ -1,6 +1,45 @@ function __3dGroup() constructor { objects = []; + static getCenter = function() { + var _v = new __vec3(); + var _i = 0; + + for( var i = 0, n = array_length(objects); i < n; i++ ) { + var _c = objects[i].getCenter(); + if(_c == noone) continue; + _v._add(objects[i].getCenter()); + _i++; + } + + return _i == 0? new __vec3() : _v.multiply(1 / _i); + } + + static getBBOX = function() { + if(array_empty(objects)) return new __bbox3D(new __vec3(-0.5), new __vec3(0.5)); + var _m0 = noone; + var _m1 = noone; + var _cc = getCenter(); + + for( var i = 0, n = array_length(objects); i < n; i++ ) { + var _c = objects[i].getCenter(); + var _b = objects[i].getBBOX(); + + if(_c == noone || _b == noone) continue; + + var _n0 = _b.first.add(_c); + var _n1 = _b.second.add(_c); + + _m0 = _m0 == noone? _n0 : _m0.minVal(_n0); + _m1 = _m1 == noone? _n1 : _m1.maxVal(_n1); + } + + _m0._subtract(_cc); + _m1._subtract(_cc); + + return new __bbox3D(_m0, _m1); + } + static _submit = function(callback, params = {}, shader = noone) { for( var i = 0, n = array_length(objects); i < n; i++ ) callback(objects[i], params, shader); @@ -8,6 +47,11 @@ function __3dGroup() constructor { static submitShader = function(params = {}) { _submit(function(_obj, params) { _obj.submitShader(params); }, params); } static submitSel = function(params = {}) { _submit(function(_obj, params) { _obj.submitSel(params); }, params); } - static submitUI = function(params = {}, shader = noone) { _submit(function(_obj, params, shader) { _obj.submitUI(params, shader); }, params); } - static submit = function(params = {}, shader = noone) { _submit(function(_obj, params, shader) { _obj.submit(params, shader); }, params); } + static submitUI = function(params = {}, shader = noone) { _submit(function(_obj, params, shader) { _obj.submitUI(params, shader); }, params, shader); } + static submit = function(params = {}, shader = noone) { _submit(function(_obj, params, shader) { _obj.submit(params, shader); }, params, shader); } + + static map = function(callback, params = {}) { + for( var i = 0, n = array_length(objects); i < n; i++ ) + callback(objects[i], params); + } } \ No newline at end of file diff --git a/scripts/d3d_light/d3d_light.gml b/scripts/d3d_light/d3d_light.gml index f19766da1..9563b7e3e 100644 --- a/scripts/d3d_light/d3d_light.gml +++ b/scripts/d3d_light/d3d_light.gml @@ -6,5 +6,41 @@ function __3dLight() : __3dObject() constructor { color = c_white; intensity = 1; + shadow_mapper = sh_d3d_shadow_depth; + shadow_active = false; + shadow_map = noone; + shadow_map_size = 1024; + shadow_map_scale = 256; + shadow_map_camera = camera_create(); + shadow_map_view = array_create(16, 0); + shadow_map_proj = array_create(16, 0); + + static getCenter = function() { return noone; } + static getBBOX = function() { return noone; } + static submit = function(params = {}, shader = noone) {} + + static setShadow = function(active, shadowMapSize, shadowMapScale = shadow_map_scale) { #region + shadow_active = active; + shadow_map_size = shadowMapSize; + shadow_map_scale = shadowMapScale; + + return self; + } #endregion + + static shadowProjectBegin = function() {} + + static shadowProjectEnd = function() {} + + static shadowProjectVertex = function(scene, objects) { #region + if(!shadow_active) return; + + shadowProjectBegin(); + for( var i = 0, n = array_length(objects); i < n; i++ ) { + var _prev = objects[i]; + if(_prev == noone) continue; + _prev.submit(scene, shadow_mapper); + } + shadowProjectEnd(); + } #endregion } \ No newline at end of file diff --git a/scripts/d3d_light_directional/d3d_light_directional.gml b/scripts/d3d_light_directional/d3d_light_directional.gml index 51d2f375c..dd90f48a1 100644 --- a/scripts/d3d_light_directional/d3d_light_directional.gml +++ b/scripts/d3d_light_directional/d3d_light_directional.gml @@ -8,15 +8,17 @@ function __3dLightDirectional() : __3dLight() constructor { intensity = 1; position.set(4, 0, 0); - static submitSel = function(params = {}) { + shadow_mapper = sh_d3d_shadow_depth; + + static submitSel = function(params = {}) { #region shader_set(sh_d3d_wireframe); preSubmitVertex(params); shader_reset(); - } + } #endregion static submitShader = function(params = {}) { params.addLightDirectional(self); } - static preSubmitVertex = function(params = {}) { + static preSubmitVertex = function(params = {}) { #region var _rot = new __rot3(0, 0, 0).lookAt(position, params.camera.position); var rot = matrix_build(0, 0, 0, @@ -42,5 +44,28 @@ function __3dLightDirectional() : __3dLight() constructor { matrix_stack_clear(); matrix_set(matrix_world, matrix_build_identity()); - } + } #endregion + + static shadowProjectBegin = function() { #region + shadow_map = surface_verify(shadow_map, shadow_map_size, shadow_map_size, surface_r32float); + + shadow_map_view = matrix_build_lookat(position.x, position.y, position.z, 0, 0, 0, 0, 0, -1); + shadow_map_proj = matrix_build_projection_ortho(shadow_map_size / shadow_map_scale, shadow_map_size / shadow_map_scale, .01, 100); + + surface_set_target(shadow_map); + draw_clear(c_black); + shader_set(shadow_mapper); + gpu_set_ztestenable(true); + + camera_set_view_mat(shadow_map_camera, shadow_map_view); + camera_set_proj_mat(shadow_map_camera, shadow_map_proj); + camera_apply(shadow_map_camera); + } #endregion + + static shadowProjectEnd = function() { #region + shader_reset(); + surface_reset_target(); + camera_apply(0); + gpu_set_ztestenable(false); + } #endregion } \ No newline at end of file diff --git a/scripts/d3d_light_point/d3d_light_point.gml b/scripts/d3d_light_point/d3d_light_point.gml index 51cb3c7c6..f2be28fac 100644 --- a/scripts/d3d_light_point/d3d_light_point.gml +++ b/scripts/d3d_light_point/d3d_light_point.gml @@ -3,6 +3,13 @@ function __3dLightPoint() : __3dLight() constructor { intensity = 1; radius = 10; + shadow_mapper = sh_d3d_shadow_depth; + shadow_map_size = 512; + shadow_map_scale = 128; + + shadow_map_views = array_create(6); + shadow_maps = array_create(6); + static submitSel = function(params = {}) { shader_set(sh_d3d_wireframe); preSubmitVertex(params); @@ -11,7 +18,7 @@ function __3dLightPoint() : __3dLight() constructor { static submitShader = function(params = {}) { params.addLightPoint(self); } - static preSubmitVertex = function(params = {}) { + static preSubmitVertex = function(params = {}) { #region var _rot = new __rot3(0, 0, 0).lookAt(position, params.camera.position); var rot = matrix_build(0, 0, 0, @@ -46,5 +53,75 @@ function __3dLightPoint() : __3dLight() constructor { matrix_stack_clear(); matrix_set(matrix_world, matrix_build_identity()); - } + } #endregion + + static shadowProjectBegin = function(index = 0) { #region + //print($"Projecting cube face {index} to {shadow_maps[index]} with view {shadow_map_views[index]}") + surface_set_target(shadow_maps[index]); + + draw_clear(c_black); + shader_set(shadow_mapper); + gpu_set_ztestenable(true); + + camera_set_view_mat(shadow_map_camera, shadow_map_views[index]); + camera_set_proj_mat(shadow_map_camera, shadow_map_proj); + camera_apply(shadow_map_camera); + } #endregion + + static shadowProjectEnd = function() { #region + shader_reset(); + surface_reset_target(); + camera_apply(0); + gpu_set_ztestenable(false); + } #endregion + + static shadowProjectVertex = function(scene, objects) { #region + if(!shadow_active) return; + + for( var i = 0; i < 6; i++ ) + shadow_maps[i] = surface_verify(shadow_maps[i], shadow_map_size, shadow_map_size, surface_r32float); + + shadow_map_views = array_create(6); + shadow_map_views[0] = matrix_build_lookat(position.x, position.y, position.z, position.x + 1, position.y, position.z, 0, 0, -1); + shadow_map_views[1] = matrix_build_lookat(position.x, position.y, position.z, position.x - 1, position.y, position.z, 0, 0, -1); + shadow_map_views[2] = matrix_build_lookat(position.x, position.y, position.z, position.x, position.y + 1, position.z, 0, 0, -1); + shadow_map_views[3] = matrix_build_lookat(position.x, position.y, position.z, position.x, position.y - 1, position.z, 0, 0, -1); + shadow_map_views[4] = matrix_build_lookat(position.x, position.y, position.z, position.x, position.y, position.z + 1, 0, -1, 0); + shadow_map_views[5] = matrix_build_lookat(position.x, position.y, position.z, position.x, position.y, position.z - 1, 0, 1, 0); + + shadow_map_view = array_merge( shadow_map_views[0], shadow_map_views[1], shadow_map_views[2], shadow_map_views[3], shadow_map_views[4], shadow_map_views[5] ); + shadow_map_proj = matrix_build_projection_perspective_fov(90, 1, .01, radius); + + for( var j = 0; j < 6; j++ ) { ///FUCK There's gotta be a better way to do this in GameMaker + shadowProjectBegin(j); + for( var i = 0, n = array_length(objects); i < n; i++ ) { + var _prev = objects[i]; + if(_prev == noone) continue; + _prev.submit(scene, shadow_mapper); + } + shadowProjectEnd(); + } + + shadow_map = surface_verify(shadow_map, shadow_map_size * 2, shadow_map_size, surface_rgba32float); + + surface_set_target(shadow_map); + draw_clear(c_black); + gpu_set_blendmode_ext(bm_one, bm_one); + + draw_surface(shadow_maps[0], 0, 0); + draw_surface(shadow_maps[3], shadow_map_size, 0); + + shader_set(sh_channel_R2G); + draw_surface(shadow_maps[1], 0, 0); + draw_surface(shadow_maps[4], shadow_map_size, 0); + shader_reset(); + + shader_set(sh_channel_R2B); + draw_surface(shadow_maps[2], 0, 0); + draw_surface(shadow_maps[5], shadow_map_size, 0); + shader_reset(); + + gpu_set_blendmode(bm_normal); + surface_reset_target(); + } #endregion } \ No newline at end of file diff --git a/scripts/d3d_object/d3d_object.gml b/scripts/d3d_object/d3d_object.gml index 910d1de5e..0152daac6 100644 --- a/scripts/d3d_object/d3d_object.gml +++ b/scripts/d3d_object/d3d_object.gml @@ -22,13 +22,29 @@ function __3dObject() constructor { custom_shader = noone; - position = new __vec3(0, 0, 0); + position = new __vec3(0); rotation = new BBMOD_Quaternion(); - scale = new __vec3(1, 1, 1); + scale = new __vec3(1); + size = new __vec3(1); texture = -1; - static buildVertex = function(_vertex, _normal, _uv) { + static checkParameter = function(params = {}) { #region + var _keys = struct_get_names(params); + var check = false; + for( var i = 0, n = array_length(_keys); i < n; i++ ) { + var key = _keys[i]; + if(self[$ key] != params[$ key]) + check = true; + self[$ key] = params[$ key]; + } + + if(check) onParameterUpdate(); + } #endregion + + static onParameterUpdate = function() {} + + static buildVertex = function(_vertex, _normal, _uv) { #region var _buffer = vertex_create_buffer(); vertex_begin(_buffer, VF); for( var i = 0, n = array_length(_vertex); i < n; i++ ) { @@ -48,17 +64,14 @@ function __3dObject() constructor { var cc = array_length(v) > 3? v[3] : c_white; var aa = array_length(v) > 4? v[4] : 1; - vertex_position_3d(_buffer, v[0], v[1], v[2]); - vertex_normal(_buffer, nor[0], nor[1], nor[2]); - vertex_texcoord(_buffer, uuv[0], uuv[1]); - vertex_color(_buffer, cc, aa); + vertex_add_pntc(_buffer, v, nor, uuv, cc, aa); break; } } vertex_end(_buffer); return _buffer; - } + } #endregion static build = function(_buffer = VB, _vertex = vertex, _normal = normals, _uv = uv) { #region if(is_array(_buffer)) { @@ -81,6 +94,9 @@ function __3dObject() constructor { static preSubmitVertex = function(params = {}) {} static postSubmitVertex = function(params = {}) {} + static getCenter = function() { return new __vec3(position.x, position.y, position.z); } + static getBBOX = function() { return new __bbox3D(size.multiplyVec(scale).multiply(-0.5), size.multiplyVec(scale).multiply(0.5)); } + static submitShader = function(params = {}, shader = noone) {} static submit = function(params = {}, shader = noone) { submitVertex(params, shader); } @@ -102,19 +118,37 @@ function __3dObject() constructor { preSubmitVertex(params); if(VB != noone) { - var pos = matrix_build(position.x, position.y, position.z, - 0, 0, 0, - 1, 1, 1); - var rot = rotation.ToMatrix(); - var sca = matrix_build(0, 0, 0, - 0, 0, 0, - scale.x, scale.y, scale.z); - matrix_stack_clear(); - matrix_stack_push(pos); - matrix_stack_push(rot); - matrix_stack_push(sca); - matrix_set(matrix_world, matrix_stack_top()); + + if(params.apply_transform) { + var pos = matrix_build(position.x, position.y, position.z, + 0, 0, 0, + 1, 1, 1); + var rot = rotation.ToMatrix(); + var sca = matrix_build(0, 0, 0, + 0, 0, 0, + scale.x, scale.y, scale.z); + + matrix_stack_push(pos); + matrix_stack_push(rot); + matrix_stack_push(sca); + matrix_set(matrix_world, matrix_stack_top()); + } else { + var pos = matrix_build(position.x - params.custom_transform.x, position.y - params.custom_transform.y, position.z - params.custom_transform.z, + 0, 0, 0, + 1, 1, 1); + var siz = matrix_build(0, 0, 0, + 0, 0, 0, + scale.x, scale.y, scale.z); + var sca = matrix_build(0, 0, 0, + 0, 0, 0, + params.custom_scale.x, params.custom_scale.y, params.custom_scale.z); + + matrix_stack_push(pos); + matrix_stack_push(siz); + matrix_stack_push(sca); + matrix_set(matrix_world, matrix_stack_top()); + } if(is_array(VB)) { for( var i = 0, n = array_length(VB); i < n; i++ ) @@ -130,4 +164,20 @@ function __3dObject() constructor { shader_reset(); } #endregion + + static clone = function() { #region + var _obj = variable_clone(self); + return _obj; + } #endregion + + static destroy = function() { #region + if(is_array(VB)) { + for( var i = 0, n = array_length(VB); i < n; i++ ) + vertex_delete_buffer(VB[i]); + } else if(VB != noone) + vertex_delete_buffer(VB); + onDestroy(); + } #endregion + + static onDestroy = function() { } } \ No newline at end of file diff --git a/scripts/d3d_plane/d3d_plane.gml b/scripts/d3d_plane/d3d_plane.gml index f37f8e549..c365282e3 100644 --- a/scripts/d3d_plane/d3d_plane.gml +++ b/scripts/d3d_plane/d3d_plane.gml @@ -1,13 +1,3 @@ -function __ray(origin, direction) constructor { - self.origin = origin; - self.direction = direction.normalize(); - - static sampleDistance = function(t) { - gml_pragma("forceinline"); - return origin.add(direction.multiply(t)); - } -} - function __plane(origin, normal) constructor { self.origin = origin; self.normal = normal.normalize(); diff --git a/scripts/d3d_ray/d3d_ray.gml b/scripts/d3d_ray/d3d_ray.gml new file mode 100644 index 000000000..98e9aa61c --- /dev/null +++ b/scripts/d3d_ray/d3d_ray.gml @@ -0,0 +1,9 @@ +function __ray(origin, direction) constructor { + self.origin = origin; + self.direction = direction.normalize(); + + static sampleDistance = function(t) { + gml_pragma("forceinline"); + return origin.add(direction.multiply(t)); + } +} \ No newline at end of file diff --git a/scripts/d3d_gizmo/d3d_gizmo.yy b/scripts/d3d_ray/d3d_ray.yy similarity index 59% rename from scripts/d3d_gizmo/d3d_gizmo.yy rename to scripts/d3d_ray/d3d_ray.yy index 64cb050dd..4d768bcab 100644 --- a/scripts/d3d_gizmo/d3d_gizmo.yy +++ b/scripts/d3d_ray/d3d_ray.yy @@ -1,11 +1,11 @@ { "resourceType": "GMScript", "resourceVersion": "1.0", - "name": "d3d_gizmo", + "name": "d3d_ray", "isCompatibility": false, "isDnD": false, "parent": { - "name": "3d", - "path": "folders/functions/3d.yy", + "name": "util", + "path": "folders/functions/3d/util.yy", }, } \ No newline at end of file diff --git a/scripts/d3d_rot3/d3d_rot3.gml b/scripts/d3d_rot3/d3d_rot3.gml index 2e0f70d8d..8b55b07fb 100644 --- a/scripts/d3d_rot3/d3d_rot3.gml +++ b/scripts/d3d_rot3/d3d_rot3.gml @@ -51,7 +51,8 @@ function __rot3(_x = 0, _y = 0, _z = 0) constructor { var w0 = new __vec3( -dir.y, dir.x, 0); var u0 = w0.cross(dir); var ax = arctan2( w0.dot(up) / w0.length(), u0.dot(up) / u0.length() ); - + if(is_nan(ax)) ax = 0; + ax = radtodeg(ax); ay = radtodeg(ay); az = radtodeg(az); diff --git a/scripts/d3d_scene/d3d_scene.gml b/scripts/d3d_scene/d3d_scene.gml index 9afbc0a4c..251a3613a 100644 --- a/scripts/d3d_scene/d3d_scene.gml +++ b/scripts/d3d_scene/d3d_scene.gml @@ -1,65 +1,161 @@ +#region global preview camera + globalvar D3D_GLOBAL_PREVIEW; + + function set3DGlobalPreview() { + var d3_view_camera = new __3dCamera(); + d3_view_camera.setViewSize(2, 2); + d3_view_camera.setFocusAngle(135, 45, 8); + d3_view_camera.position.set(calculate_3d_position(0, 0, 0, d3_view_camera.focus_angle_x, d3_view_camera.focus_angle_y, d3_view_camera.focus_dist)); + + d3_view_camera.projection = CAMERA_PROJECTION.orthograph; + d3_view_camera.setMatrix(); + + D3D_GLOBAL_PREVIEW = new __3dScene(d3_view_camera); + D3D_GLOBAL_PREVIEW.apply_transform = false; + + var d3_scene_light0 = new __3dLightDirectional(); + d3_scene_light0.position.set(-1, -2, 3); + d3_scene_light0.color = $AAAAAA; + + var d3_scene_light1 = new __3dLightDirectional(); + d3_scene_light1.position.set(1, 2, 3); + d3_scene_light1.color = $FFFFFF; + + D3D_GLOBAL_PREVIEW.lightAmbient = $404040; + D3D_GLOBAL_PREVIEW.addLightDirectional(d3_scene_light0); + D3D_GLOBAL_PREVIEW.addLightDirectional(d3_scene_light1); + } +#endregion + function __3dScene(camera) constructor { self.camera = camera; name = "New scene"; - lightAmbient = c_black; - lightDir_count = 0; - lightDir_direction = []; - lightDir_color = []; - lightDir_intensity = []; + apply_transform = true; + custom_transform = new __vec3(); + custom_scale = new __vec3(1, 1, 1); - lightPnt_count = 0; - lightPnt_position = []; - lightPnt_color = []; - lightPnt_intensity = []; - lightPnt_radius = []; + lightAmbient = c_black; + + lightDir_max = 16; + lightDir_shadow_max = 4; + + lightPnt_max = 16; + lightPnt_shadow_max = 4; + + gammaCorrection = true; static reset = function() { lightDir_count = 0; lightDir_direction = []; lightDir_color = []; lightDir_intensity = []; + + lightDir_shadow_count = 0; + lightDir_shadow = []; + lightDir_shadowMap = []; + lightDir_viewMat = []; + lightDir_projMat = []; + lightDir_shadowBias = .001; lightPnt_count = 0; lightPnt_position = []; lightPnt_color = []; lightPnt_intensity = []; lightPnt_radius = []; - } + + lightPnt_shadow_count = 0; + lightPnt_shadow = []; + lightPnt_shadowMap = []; + lightPnt_viewMat = []; + lightPnt_projMat = []; + } reset(); + + static applyCamera = function() { camera.applyCamera(); } + static resetCamera = function() { camera.resetCamera(); } static apply = function() { shader_set(sh_d3d_default); shader_set_f("light_ambient", colToVec4(lightAmbient)); shader_set_i("light_dir_count", lightDir_count); - shader_set_f("light_dir_direction", lightDir_direction); - shader_set_f("light_dir_color", lightDir_color); - shader_set_f("light_dir_intensity", lightDir_intensity); + if(lightDir_count) { + shader_set_f("light_dir_direction", lightDir_direction); + shader_set_f("light_dir_color", lightDir_color); + shader_set_f("light_dir_intensity", lightDir_intensity); + shader_set_i("light_dir_shadow_active", lightDir_shadow); + for( var i = 0, n = array_length(lightDir_shadowMap); i < n; i++ ) + shader_set_surface($"light_dir_shadowmap_{i}", lightDir_shadowMap[i], true); + shader_set_f("light_dir_view", lightDir_viewMat); + shader_set_f("light_dir_proj", lightDir_projMat); + shader_set_f("shadowBias", lightDir_shadowBias); + } shader_set_i("light_pnt_count", lightPnt_count); - shader_set_f("light_pnt_position", lightPnt_position); - shader_set_f("light_pnt_color", lightPnt_color); - shader_set_f("light_pnt_intensity", lightPnt_intensity); - shader_set_f("light_pnt_radius", lightPnt_radius); + if(lightPnt_count) { + shader_set_f("light_pnt_position", lightPnt_position); + shader_set_f("light_pnt_color", lightPnt_color); + shader_set_f("light_pnt_intensity", lightPnt_intensity); + shader_set_f("light_pnt_radius", lightPnt_radius); + shader_set_i("light_pnt_shadow_active", lightPnt_shadow); + for( var i = 0, n = array_length(lightPnt_shadowMap); i < n; i++ ) + shader_set_surface($"light_pnt_shadowmap_{i}", lightPnt_shadowMap[i], true, true); + shader_set_f("light_pnt_view", lightPnt_viewMat); + shader_set_f("light_pnt_proj", lightPnt_projMat); + } - //print($"Scene {name} submit {lightPnt_position} point lights"); + shader_set_i("gammaCorrection", gammaCorrection); shader_reset(); } static addLightDirectional = function(light) { + if(lightDir_count >= lightDir_max) { + noti_warning("Direction light limit exceeded"); + return self; + } + array_append(lightDir_direction, [ light.position.x, light.position.y, light.position.z ]); array_append(lightDir_color, colToVec4(light.color)); - array_append(lightDir_intensity, [ light.intensity ]); + + array_push(lightDir_intensity, light.intensity); + array_push(lightDir_shadow, light.shadow_active); + + if(light.shadow_active) { + if(lightDir_shadow_count < lightDir_shadow_max) { + array_push(lightDir_shadowMap, light.shadow_map); + lightDir_shadow_count++; + } else + noti_warning("Direction light shadow caster limit exceeded"); + } + array_append(lightDir_viewMat, light.shadow_map_view); + array_append(lightDir_projMat, light.shadow_map_proj); lightDir_count++; return self; } static addLightPoint = function(light) { + if(lightPnt_count >= lightPnt_max) { + noti_warning("Point light limit exceeded"); + return self; + } + array_append(lightPnt_position, [ light.position.x, light.position.y, light.position.z ]); array_append(lightPnt_color, colToVec4(light.color)); - array_append(lightPnt_intensity, [ light.intensity ]); - array_append(lightPnt_radius, [ light.radius ]); + + array_push(lightPnt_intensity, light.intensity); + array_push(lightPnt_radius, light.radius); + array_push(lightPnt_shadow, light.shadow_active); + + if(light.shadow_active) { + if(lightPnt_shadow_count < lightPnt_shadow_max) { + array_push(lightPnt_shadowMap, light.shadow_map); + lightPnt_shadow_count++; + } else + noti_warning("Point light shadow caster limit exceeded"); + } + array_append(lightPnt_viewMat, light.shadow_map_view); + array_append(lightPnt_projMat, light.shadow_map_proj); lightPnt_count++; return self; diff --git a/scripts/d3d_uvsphere/d3d_uvsphere.gml b/scripts/d3d_uvsphere/d3d_uvsphere.gml new file mode 100644 index 000000000..5437c0051 --- /dev/null +++ b/scripts/d3d_uvsphere/d3d_uvsphere.gml @@ -0,0 +1,100 @@ +function __3dUVSphere(radius = 0.5, hori = 16, vert = 8, smt = false) : __3dObject() constructor { + VF = global.VF_POS_NORM_TEX_COL; + render_type = pr_trianglelist; + + self.radius = radius; + self.hori = hori; + self.vert = vert; + self.smooth = smt; + + static initModel = function() { // swap H, V because fuck me + vertex = array_create(vert * hori * 2 * 3); + normals = array_create(vert * hori * 2 * 3); + uv = array_create(vert * hori * 2 * 3); + var amo = 0; + + for (var i = 0; i < vert; i++) + for (var j = 0; j < hori; j++) { + var ha0 = (i + 0) / vert * 360; + var ha1 = (i + 1) / vert * 360; + var va0 = 90 - (j + 0) / hori * 180; + var va1 = 90 - (j + 1) / hori * 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); + + var ind = (i * hori + j) * 6; + + vertex[ind + 0] = [hx0, hy0, hz0]; + vertex[ind + 1] = [hx1, hy1, hz1]; + vertex[ind + 2] = [hx2, hy2, hz2]; + + vertex[ind + 3] = [hx1, hy1, hz1]; + vertex[ind + 4] = [hx2, hy2, hz2]; + vertex[ind + 5] = [hx3, hy3, hz3]; + + if(smooth) { + normals[ind + 0] = d3_normalize([hx0, hy0, hz0]); + normals[ind + 1] = d3_normalize([hx1, hy1, hz1]); + normals[ind + 2] = d3_normalize([hx2, hy2, hz2]); + + normals[ind + 3] = d3_normalize([hx1, hy1, hz1]); + normals[ind + 4] = d3_normalize([hx2, hy2, hz2]); + normals[ind + 5] = d3_normalize([hx3, hy3, hz3]); + } else { + var nor = d3_cross_product([hx2 - hx0, hy2 - hy0, hz2 - hz0], [hx1 - hx0, hy1 - hy0, hz1 - hz0]); + nor = d3_normalize(nor); + + normals[ind + 0] = nor; + normals[ind + 1] = nor; + normals[ind + 2] = nor; + + normals[ind + 3] = nor; + normals[ind + 4] = nor; + normals[ind + 5] = nor; + } + + uv[ind + 0] = [u0, v0]; + uv[ind + 1] = [u1, v1]; + uv[ind + 2] = [u2, v2]; + + uv[ind + 3] = [u1, v1]; + uv[ind + 4] = [u2, v2]; + uv[ind + 5] = [u3, v3]; + } + + VB = build(); + } initModel(); + + static onParameterUpdate = initModel; +} \ No newline at end of file diff --git a/scripts/d3d_uvsphere/d3d_uvsphere.yy b/scripts/d3d_uvsphere/d3d_uvsphere.yy new file mode 100644 index 000000000..a2fb3427a --- /dev/null +++ b/scripts/d3d_uvsphere/d3d_uvsphere.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "d3d_uvsphere", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "mesh", + "path": "folders/functions/3d/mesh.yy", + }, +} \ No newline at end of file diff --git a/scripts/d3d_vec3/d3d_vec3.gml b/scripts/d3d_vec3/d3d_vec3.gml index dcfba0466..69f21b488 100644 --- a/scripts/d3d_vec3/d3d_vec3.gml +++ b/scripts/d3d_vec3/d3d_vec3.gml @@ -2,7 +2,7 @@ #macro __vec3_right new __vec3(0.0, 1.0, 0.0) #macro __vec3_up new __vec3(0.0, 0.0, 1.0) -function __vec3(_x = 0, _y = 0, _z = 0) constructor { +function __vec3(_x = 0, _y = _x, _z = _x) constructor { static set = function(_x = 0, _y = _x, _z = _x) { if(is_struct(_x) && is_instanceof(_x, __vec3)) { x = _x.x; @@ -70,6 +70,11 @@ function __vec3(_x = 0, _y = 0, _z = 0) constructor { return new __vec3(x * _scalar, y * _scalar, z * _scalar); } + static multiplyVec = function(_vec) { + gml_pragma("forceinline"); + return new __vec3(x * _vec.x, y * _vec.y, z * _vec.z); + } + static divide = function(_scalar) { gml_pragma("forceinline"); if (_scalar != 0) @@ -116,6 +121,14 @@ function __vec3(_x = 0, _y = 0, _z = 0) constructor { return self; } + static _multiplyVec = function(_vec) { + gml_pragma("forceinline"); + x *= _vec.x; + y *= _vec.y; + z *= _vec.z; + return self; + } + static _divide = function(_scalar) { gml_pragma("forceinline"); if (_scalar != 0) { @@ -174,6 +187,24 @@ function __vec3(_x = 0, _y = 0, _z = 0) constructor { return x == to.x && y == to.y && z == to.z; } + static minVal = function(vec) { + gml_pragma("forceinline"); + return new __vec3( + min(x, vec.x), + min(y, vec.y), + min(z, vec.z), + ); + } + + static maxVal = function(vec) { + gml_pragma("forceinline"); + return new __vec3( + max(x, vec.x), + max(y, vec.y), + max(z, vec.z), + ); + } + static clone = function() { gml_pragma("forceinline"); return new __vec3(x, y, z); diff --git a/scripts/d3d_vec4/d3d_vec4.gml b/scripts/d3d_vec4/d3d_vec4.gml index 764329774..1aac9f0b0 100644 --- a/scripts/d3d_vec4/d3d_vec4.gml +++ b/scripts/d3d_vec4/d3d_vec4.gml @@ -1,4 +1,4 @@ -function __vec4(_x = 0, _y = 0, _z = 0, _w = 0) constructor { +function __vec4(_x = 0, _y = _x, _z = _x, _w = _x) constructor { static set = function(_x = 0, _y = _x, _z = _x, _w = _x) { if (is_struct(_x)) { if(is_instanceof(_x, __vec4)) { @@ -166,6 +166,26 @@ function __vec4(_x = 0, _y = 0, _z = 0, _w = 0) constructor { return x == to.x && y == to.y && z == to.z && w == to.w; } + static minVal = function(vec) { + gml_pragma("forceinline"); + return new __vec4( + min(x, vec.x), + min(y, vec.y), + min(z, vec.z), + min(w, vec.w), + ); + } + + static maxVal = function(vec) { + gml_pragma("forceinline"); + return new __vec4( + max(x, vec.x), + max(y, vec.y), + max(z, vec.z), + max(w, vec.w), + ); + } + static clone = function() { gml_pragma("forceinline"); return new __vec4(x, y, z, w); diff --git a/scripts/nodeValue_drawer/nodeValue_drawer.gml b/scripts/nodeValue_drawer/nodeValue_drawer.gml index 68c309920..b68a8f707 100644 --- a/scripts/nodeValue_drawer/nodeValue_drawer.gml +++ b/scripts/nodeValue_drawer/nodeValue_drawer.gml @@ -15,7 +15,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc var lb_y = yy + lb_h / 2; var butx = xx; - if(jun.connect_type == JUNCTION_CONNECT.input && jun.isAnimable() && !jun.expUse) { + if(jun.connect_type == JUNCTION_CONNECT.input && jun.isAnimable() && !jun.expUse) { #region animation var index = jun.value_from == noone? jun.is_anim : 2; draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1, index == 2? COLORS._main_accent : c_white, 0.8); if(_hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10))) { @@ -36,13 +36,13 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc PANEL_ANIMATION.updatePropertyList(); } } - } + } #endregion if(anim_hold != noone && mouse_release(mb_left)) anim_hold = noone; butx += ui(20); - if(!global_var) { + if(!global_var) { #region visibility index = jun.visible; draw_sprite_ui_uniform(THEME.junc_visible, index, butx, lb_y, 1,, 0.8); if(_hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10))) { @@ -57,6 +57,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc visi_hold = jun.visible; } } + #endregion } else draw_sprite_ui_uniform(THEME.node_use_expression, 0, butx, lb_y, 1,, 0.8); @@ -192,7 +193,7 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc var widH = lineBreak? editBoxH : 0; var mbRight = true; - if(jun.expUse) { + if(jun.expUse) { #region expression editor var expValid = jun.expTree != noone && jun.expTree.validate(); jun.express_edit.boxColor = expValid? COLORS._main_value_positive : COLORS._main_value_negative; jun.express_edit.rx = rx; @@ -203,7 +204,8 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc var wd_h = jun.express_edit.draw(editBoxX, editBoxY, editBoxW, editBoxH, jun.expression, _m); widH = wd_h - (TEXTBOX_HEIGHT * !lineBreak); - } else if(jun.editWidget) { + #endregion + } else if(jun.editWidget) { #region edit widget jun.editWidget.setFocusHover(_focus, _hover); if(jun.connect_type == JUNCTION_CONNECT.input) { @@ -213,11 +215,6 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc jun.editWidget.setInteract(false); } - //if(jun.display_type == VALUE_DISPLAY.area) { - // print("======= Show value widget ====="); - // print(jun.animator.values[| 0].value); - // print(jun.showValue()); - //} var param = new widgetParam(editBoxX, editBoxY, editBoxW, editBoxH, jun.showValue(), jun.extra_data, _m, rx, ry); switch(jun.type) { @@ -241,19 +238,15 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc var _widH = jun.editWidget.drawParam(param) ?? 0; widH = _widH - (TEXTBOX_HEIGHT * !lineBreak); - - } else if(jun.display_type == VALUE_DISPLAY.label) { + #endregion + } else if(jun.display_type == VALUE_DISPLAY.label) { #region label draw_set_text(f_p1, fa_left, fa_top, COLORS._main_text_sub); draw_text_add(xx + ui(16), _hsy, jun.display_data); widH = string_height(jun.display_data); + #endregion } else widH = 0; - //draw_set_color(c_white); - //draw_rectangle(xx, yy, xx + ww, yy + widH, true); - //draw_set_color(c_red); - //draw_line(xx + ww / 2, yy, xx + ww / 2, yy + widH); - return [ widH, mbRight ]; } \ No newline at end of file diff --git a/scripts/node_3d_camera/node_3d_camera.gml b/scripts/node_3d_camera/node_3d_camera.gml index 5a8735e79..7cd00063e 100644 --- a/scripts/node_3d_camera/node_3d_camera.gml +++ b/scripts/node_3d_camera/node_3d_camera.gml @@ -3,6 +3,10 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) object = new __3dCamera_object(); camera = new __3dCamera(); lookat = new __3dGizmoSphere(0.5, c_ltgray, 1); + lookLine = noone; + lookRad = new __3dGizmoCircleZ(0.5, c_yellow, 0.5); + + w = 128; scene = new __3dScene(camera); scene.name = "Camera"; @@ -10,7 +14,7 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) inputs[| in_d3d + 0] = nodeValue("FOV", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 60) .setDisplay(VALUE_DISPLAY.slider, [ 10, 90, 1 ]); - inputs[| in_d3d + 1] = nodeValue("Clipping Distance", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 1, 32000 ]) + inputs[| in_d3d + 1] = nodeValue("Clipping Distance", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0.01, 100 ]) .setDisplay(VALUE_DISPLAY.vector); inputs[| in_d3d + 2] = nodeValue("Dimension", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, DEF_SURF ) @@ -171,6 +175,7 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) camera.rotation = new BBMOD_Quaternion().FromLookRotation(_for, camera.up).Mul(_qi1).Mul(_qi2); lookat.position.set(_look); + lookLine = new __3dGizmoLineDashed(camera.position, camera.focus, 0.25, c_gray, 1); break; case 2 : camera.useFocus = true; @@ -184,11 +189,18 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) camera.rotation = new BBMOD_Quaternion().FromLookRotation(_for, camera.up).Mul(_qi1).Mul(_qi3); lookat.position.set(_look); + lookLine = new __3dGizmoLineDashed(camera.position, camera.focus, 0.25, c_gray, 1); + + var _camRad = camera.position.subtract(camera.focus); + var _rad = point_distance(0, 0, _camRad.x, _camRad.y) * 2; + lookRad.scale.set(_rad, _rad, 1); + lookRad.position.set(new __vec3(camera.focus.x, camera.focus.y, camera.position.z)); break; } object.position.set(camera.position); object.rotation = camera.rotation.Clone(); + object.scale.set(1, _dim[0] / _dim[1], 1); if(_scne == noone) return; @@ -211,17 +223,17 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) gpu_set_ztestenable(true); gpu_set_cullmode(_back); - var cam = camera_get_active(); - camera.applyCamera(cam); + camera.applyCamera(); scene.reset(); _scne.submitShader(scene); scene.apply(); - + _scne.submit(scene); //////////////// SUBMIT //////////////// surface_reset_target(); - gpu_set_cullmode(cull_noculling); + + scene.resetCamera(); return _output; } #endregion @@ -239,8 +251,8 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) switch(_posm) { case 0 : return [ object, _scene ]; - case 1 : return [ object, lookat, _scene ]; - case 2 : return [ object, lookat, _scene ]; + case 1 : return [ object, lookat, lookLine, _scene ]; + case 2 : return [ object, lookat, lookLine, lookRad, _scene ]; } return [ object, _scene ]; diff --git a/scripts/node_3d_light_directional/node_3d_light_directional.gml b/scripts/node_3d_light_directional/node_3d_light_directional.gml index 12be4e07e..fec35c160 100644 --- a/scripts/node_3d_light_directional/node_3d_light_directional.gml +++ b/scripts/node_3d_light_directional/node_3d_light_directional.gml @@ -1,16 +1,37 @@ function Node_3D_Light_Directional(_x, _y, _group = noone) : Node_3D_Light(_x, _y, _group) constructor { - name = "Directional Light"; + name = "Directional Light"; + + object_class = __3dLightDirectional; + + inputs[| in_light + 0] = nodeValue("Cast Shadow", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); + + inputs[| in_light + 1] = nodeValue("Shadow Map Size", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1024); + + inputs[| in_light + 2] = nodeValue("Shadow Map Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 256); input_display_list = [ ["Transform", false], 0, __d3d_input_list_light, + ["Shadow", false], in_light + 0, in_light + 1, in_light + 2, ] + tools = [ tool_pos ]; + tool_settings = []; + tool_attribute.context = 1; + static processData = function(_output, _data, _output_index, _array_index = 0) { - var object = new __3dLightDirectional(); + var _active = _data[in_d3d + 0]; + if(!_active) return noone; + + var _shadow_active = _data[in_light + 0]; + var _shadow_map_size = _data[in_light + 1]; + var _shadow_map_scal = _data[in_light + 2]; + + var object = getObject(_array_index); setTransform(object, _data); setLight(object, _data); + object.setShadow(_shadow_active, _shadow_map_size, _shadow_map_scal); var _rot = new __rot3().lookAt(object.position, new __vec3()); object.rotation.FromEuler(_rot.x, _rot.y, _rot.z); diff --git a/scripts/node_3d_light_point/node_3d_light_point.gml b/scripts/node_3d_light_point/node_3d_light_point.gml index dc1f62636..e75ecf0ea 100644 --- a/scripts/node_3d_light_point/node_3d_light_point.gml +++ b/scripts/node_3d_light_point/node_3d_light_point.gml @@ -1,21 +1,38 @@ function Node_3D_Light_Point(_x, _y, _group = noone) : Node_3D_Light(_x, _y, _group) constructor { name = "Point Light"; + object_class = __3dLightPoint; + inputs[| in_light + 0] = nodeValue("Radius", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4) + inputs[| in_light + 1] = nodeValue("Cast Shadow", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); + + inputs[| in_light + 2] = nodeValue("Shadow Map Size", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1024); + input_display_list = [ ["Transform", false], 0, __d3d_input_list_light, in_light, + ["Shadow", false], in_light + 1, in_light + 2, in_light + 3, ] + tools = [ tool_pos ]; + tool_settings = []; + tool_attribute.context = 1; + static processData = function(_output, _data, _output_index, _array_index = 0) { - var object = new __3dLightPoint(); + var _active = _data[in_d3d + 0]; + if(!_active) return noone; + + var _radius = _data[in_light + 0]; + var _shadow_active = _data[in_light + 1]; + var _shadow_map_size = _data[in_light + 2]; + + var object = getObject(_array_index); setTransform(object, _data); setLight(object, _data); - - var _rad = inputs[| in_light + 0].getValue(); - object.radius = _rad; + object.setShadow(_shadow_active, _shadow_map_size); + object.radius = _radius; return object; } diff --git a/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml b/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml index 203b12b8a..e8935b646 100644 --- a/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml +++ b/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml @@ -1,19 +1,21 @@ function Node_3D_Mesh_Cube(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { name = "3D Cube"; + object_class = noone; + inputs[| in_mesh + 0] = nodeValue("Texture per side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); inputs[| in_mesh + 1] = nodeValue("Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); - inputs[| in_mesh + 2] = nodeValue("Texture 2", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + inputs[| in_mesh + 2] = nodeValue("Texture Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); - inputs[| in_mesh + 3] = nodeValue("Texture 3", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + inputs[| in_mesh + 3] = nodeValue("Texture Left", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); - inputs[| in_mesh + 4] = nodeValue("Texture 4", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + inputs[| in_mesh + 4] = nodeValue("Texture Right", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); - inputs[| in_mesh + 5] = nodeValue("Texture 5", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + inputs[| in_mesh + 5] = nodeValue("Texture Back", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); - inputs[| in_mesh + 6] = nodeValue("Texture 6", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + inputs[| in_mesh + 6] = nodeValue("Texture Front", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); input_display_list = [ __d3d_input_list_mesh, @@ -22,10 +24,15 @@ function Node_3D_Mesh_Cube(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group in_mesh + 4, in_mesh + 5, in_mesh + 6, ] + static newObject = function(_side) { + if(_side) return new __3dCubeFaces(); + return new __3dCube(); + } + static step = function() { #region var _tex_side = inputs[| in_mesh + 0].getValue(); - inputs[| in_mesh + 1].name = _tex_side? "Texture 1" : "Texture"; + inputs[| in_mesh + 1].name = _tex_side? "Texture Top" : "Texture"; inputs[| in_mesh + 1].setVisible(true, true); inputs[| in_mesh + 2].setVisible(_tex_side, _tex_side); inputs[| in_mesh + 3].setVisible(_tex_side, _tex_side); @@ -45,12 +52,12 @@ function Node_3D_Mesh_Cube(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group var object; if(_tex_side) { - object = new __3dCubeFaces(); + object = getObject(_array_index, __3dCubeFaces); object.texture = [ surface_texture(_tex_1), surface_texture(_tex_2), surface_texture(_tex_3), surface_texture(_tex_4), surface_texture(_tex_5), surface_texture(_tex_6) ]; } else { - object = new __3dCube(); + object = getObject(_array_index, __3dCube); object.texture = surface_texture(_tex_1); } diff --git a/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml new file mode 100644 index 000000000..cddf2b0f8 --- /dev/null +++ b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml @@ -0,0 +1,39 @@ +function Node_3D_Mesh_Cylinder(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "3D Cylinder"; + + object_class = __3dCylinder; + + inputs[| in_mesh + 0] = nodeValue("Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 8 ); + + inputs[| in_mesh + 1] = nodeValue("Texture Top", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + + inputs[| in_mesh + 2] = nodeValue("Texture Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + + inputs[| in_mesh + 3] = nodeValue("Texture Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + + inputs[| in_mesh + 4] = nodeValue("Smooth Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); + + input_display_list = [ + __d3d_input_list_mesh, in_mesh + 0, in_mesh + 4, + __d3d_input_list_transform, + ["Texture", false], in_mesh + 1, in_mesh + 2, in_mesh + 3, + ] + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var _side = _data[in_mesh + 0]; + var _tex_top = _data[in_mesh + 1]; + var _tex_bot = _data[in_mesh + 2]; + var _tex_sid = _data[in_mesh + 3]; + var _smt = _data[in_mesh + 4]; + + var object = getObject(_array_index); + object.checkParameter({sides: _side, smooth: _smt}); + object.texture = [ surface_texture(_tex_top), surface_texture(_tex_bot), surface_texture(_tex_sid) ]; + + setTransform(object, _data); + + return object; + } #endregion + + static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 1, noone); } +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy new file mode 100644 index 000000000..4fd6b5a77 --- /dev/null +++ b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_mesh_cylinder", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "d3d mesh", + "path": "folders/nodes/data/3D/d3d mesh.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_cylinder/node_counter.yy b/scripts/node_3d_mesh_cylinder/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_mesh_cylinder/node_counter.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "variable", + "path": "folders/nodes/data/variable.yy", + }, + "resourceVersion": "1.0", + "name": "node_counter", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_obj/node_3d_mesh_obj.gml b/scripts/node_3d_mesh_obj/node_3d_mesh_obj.gml new file mode 100644 index 000000000..d798626ad --- /dev/null +++ b/scripts/node_3d_mesh_obj/node_3d_mesh_obj.gml @@ -0,0 +1,154 @@ +function Node_create_3D_Obj(_x, _y, _group = noone) { + var path = ""; + if(!LOADING && !APPENDING && !CLONING) { + path = get_open_filename(".obj", ""); + key_release(); + if(path == "") return noone; + } + + var node = new Node_3D_Mesh_Obj(_x, _y, _group); + node.setPath(path); + return node; +} + +function Node_create_3D_Obj_path(_x, _y, path) { + if(!file_exists(path)) return noone; + + var node = new Node_3D_Mesh_Obj(_x, _y, PANEL_GRAPH.getCurrentContext()); + node.setPath(path); + return node; +} + +function Node_3D_Mesh_Obj(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "3D Obj"; + + object = noone; + object_class = __3dObject; + + inputs[| in_mesh + 0] = nodeValue("File Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.path, "" ) + .setDisplay(VALUE_DISPLAY.path_load, [ "*.obj", "" ]) + .rejectArray(); + + inputs[| in_mesh + 1] = nodeValue("Flip UV", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true, "Flip UV axis, can be use to fix some texture mapping error.") + .rejectArray(); + + input_display_list = [ + __d3d_input_list_mesh, + __d3d_input_list_transform, + ["Object", false], in_mesh + 0, + ["Texture", false], in_mesh + 1, + ] + + input_fix_len = ds_list_size(inputs); + input_display_len = array_length(input_display_list); + + current_path = ""; + materials = []; + materialNames = []; + materialIndex = []; + use_normal = false; + + function setPath(path) { + inputs[| in_mesh + 0].setValue(path); + updateObj(path); + } + + static createMaterial = function(m_index) { #region + var index = ds_list_size(inputs); + inputs[| index] = nodeValue(materialNames[m_index] + " Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone) + .setVisible(true, true); + input_display_list[input_display_len + m_index] = index; + + if(m_index >= array_length(materials)) return; + + var matY = y - (array_length(materials) - 1) / 2 * (128 + 32); + var mat = materials[m_index]; + + if(file_exists(mat.diff_path)) { + var sol = Node_create_Image_path(x - (w + 128), matY + m_index * (128 + 32), mat.diff_path); + sol.name = mat.name + " texture"; + + inputs[| index].setFrom(sol.outputs[| 0]); + } else { + var sol = nodeBuild("Node_Solid", x - (w + 128), matY + m_index * (128 + 32)); + sol.name = mat.name + " texture"; + sol.inputs[| 1].setValue(mat.diff); + + inputs[| index].setFrom(sol.outputs[| 0]); + } + } #endregion + + static updateObj = function(_path) { #region + if(!file_exists(_path)) return; + current_path = _path; + + var _flip = inputs[| in_mesh + 1].getValue(); + var _dir = filename_dir(_path); + var _pathMtl = string_copy(_path, 1, string_length(_path) - 4) + ".mtl"; + + var _v = readObj(_path, _flip); + if(_v == noone) return; + + if(object != noone) object.destroy(); + object = new __3dObject(); + object.VB = _v.vertex_groups; + object.vertex = _v.vertex_positions; + object.normals = _v.vertex_normals; + object.uv = _v.vertex_textures; + + object.size = _v.model_size; + materialNames = _v.materials; + materialIndex = _v.material_index; + use_normal = _v.use_normal; + if(_v.mtl_path != "") + _pathMtl = _dir + "/" + _v.mtl_path; + + if(array_length(materialNames)) + materials = readMtl(_pathMtl); + else { + materialNames = ["Material"]; + materialIndex = [0]; + materials = [ new MTLmaterial("Material") ]; + } + + array_resize(input_display_list, input_display_len); + + while(ds_list_size(inputs) > input_fix_len) + ds_list_delete(inputs, input_fix_len); + + for(var i = 0; i < array_length(materialNames); i++) + createMaterial(i); + + triggerRender(); + } #endregion + + static step = function() { #region + + } #endregion + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var _path = _data[in_mesh + 0]; + if(_path != current_path) + updateObj(_path); + + var textures = []; + for( var i = input_fix_len, n = array_length(_data); i < n; i++ ) + textures[i - input_fix_len] = surface_texture(_data[i]); + + var _object = getObject(_array_index); + if(object == noone) + return _object; + + _object.VF = global.VF_POS_NORM_TEX_COL; + _object.VB = object.VB; + _object.vertex = object.vertex; + _object.normals = object.normals; + _object.uv = object.uv; + _object.texture = textures; + + setTransform(_object, _data); + return _object; + } #endregion + + //static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 1, noone); } +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy b/scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy new file mode 100644 index 000000000..e0feb92fc --- /dev/null +++ b/scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_mesh_obj", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "d3d mesh", + "path": "folders/nodes/data/3D/d3d mesh.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_obj/node_counter.yy b/scripts/node_3d_mesh_obj/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_mesh_obj/node_counter.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "variable", + "path": "folders/nodes/data/variable.yy", + }, + "resourceVersion": "1.0", + "name": "node_counter", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.gml b/scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.gml new file mode 100644 index 000000000..08f30c248 --- /dev/null +++ b/scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.gml @@ -0,0 +1,36 @@ +function Node_3D_Mesh_Sphere(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "3D Sphere"; + + object_class = __3dUVSphere; + + inputs[| in_mesh + 0] = nodeValue("Horizontal Slices", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 16 ); + + inputs[| in_mesh + 1] = nodeValue("Vertical Slices", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 8 ); + + inputs[| in_mesh + 2] = nodeValue("Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + + inputs[| in_mesh + 3] = nodeValue("Smooth Normal", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); + + input_display_list = [ + __d3d_input_list_mesh, in_mesh + 0, in_mesh + 1, in_mesh + 3, + __d3d_input_list_transform, + ["Texture", false], in_mesh + 2, + ] + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var _sideH = _data[in_mesh + 0]; + var _sideV = _data[in_mesh + 1]; + var _tex = _data[in_mesh + 2]; + var _smt = _data[in_mesh + 3]; + + var object = getObject(_array_index); + object.checkParameter({hori: _sideH, vert: _sideV, smooth: _smt}); + object.texture = surface_texture(_tex); + + setTransform(object, _data); + + return object; + } #endregion + + static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 1, noone); } +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.yy b/scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.yy new file mode 100644 index 000000000..b995ce581 --- /dev/null +++ b/scripts/node_3d_mesh_sphere/node_3d_mesh_sphere.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_mesh_sphere", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "d3d mesh", + "path": "folders/nodes/data/3D/d3d mesh.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_sphere/node_counter.yy b/scripts/node_3d_mesh_sphere/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_mesh_sphere/node_counter.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "variable", + "path": "folders/nodes/data/variable.yy", + }, + "resourceVersion": "1.0", + "name": "node_counter", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_3d_obj/node_3D_obj.gml b/scripts/node_3d_obj/node_3D_obj.gml index 32772d04a..a1fde5c8f 100644 --- a/scripts/node_3d_obj/node_3D_obj.gml +++ b/scripts/node_3d_obj/node_3D_obj.gml @@ -1,24 +1,3 @@ -function Node_create_3D_Obj(_x, _y, _group = noone) { - var path = ""; - if(!LOADING && !APPENDING && !CLONING) { - path = get_open_filename(".obj", ""); - key_release(); - if(path == "") return noone; - } - - var node = new Node_3D_Obj(_x, _y, _group); - node.setPath(path); - return node; -} - -function Node_create_3D_Obj_path(_x, _y, path) { - if(!file_exists(path)) return noone; - - var node = new Node_3D_Obj(_x, _y, PANEL_GRAPH.getCurrentContext()); - node.setPath(path); - return node; -} - function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { name = "3D Object"; @@ -94,7 +73,7 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor ["Textures", true], 12, ]; input_length = ds_list_size(inputs); - input_display_len = array_length(input_display_list); + input_display_len = array_length(input_display_list); outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); @@ -110,6 +89,10 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor tex_surface = surface_create(1, 1); + materialNames = []; + materialIndex = []; + materials = []; + function reset_tex() { tex_surface = surface_verify(tex_surface, 1, 1); surface_set_target(tex_surface); @@ -153,10 +136,6 @@ function Node_3D_Obj(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } } - materialNames = []; - materialIndex = []; - materials = []; - static updateObj = function(updateMat = true) { var _path = inputs[| 0].getValue(); if(!file_exists(_path)) return; diff --git a/scripts/node_3d_scene/node_3d_scene.gml b/scripts/node_3d_scene/node_3d_scene.gml index 49e443ab8..24a51eceb 100644 --- a/scripts/node_3d_scene/node_3d_scene.gml +++ b/scripts/node_3d_scene/node_3d_scene.gml @@ -51,6 +51,4 @@ function Node_3D_Scene(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constru return _scene; } - - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {} } \ No newline at end of file diff --git a/scripts/node_array/node_array.gml b/scripts/node_array/node_array.gml index 9c4cb9645..3300e1024 100644 --- a/scripts/node_array/node_array.gml +++ b/scripts/node_array/node_array.gml @@ -137,17 +137,6 @@ function Node_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { input_display_list = [ 0, array_adjust_tool, 1 ]; - //var _typ = getType(); - - //for( var i = input_fix_len; i < ds_list_size(inputs); i++ ) { - // if(_typ != VALUE_TYPE.any) - // inputs[| i].type = _typ; - // inputs[| i].resetDisplay(); - - // if(_typ && inputs[| i].value_from && (value_bit(inputs[| i].value_from.type) & value_bit(_typ) == 0)) - // inputs[| i].removeFrom(); - //} - refreshDynamicInput(); } diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 13d15efe3..6f9c7f13e 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -614,12 +614,15 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static drawGetBbox = function(xx, yy, _s) { #region var pad_label = draw_name && display_parameter.avoid_label; - var _w = w - draw_padding * 2; - var _h = h - draw_padding * 2 - 20 * pad_label; + var _w = w; + var _h = h; _w *= display_parameter.preview_scale / 100 * _s; _h *= display_parameter.preview_scale / 100 * _s; + _w -= draw_padding * 2; + _h -= draw_padding * 2 + 20 * pad_label; + var _xc = xx + w * _s / 2; var _yc = yy + (h * _s + 20 * pad_label) / 2; @@ -1024,6 +1027,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x outputs[| i].destroy(); onDestroy(); + UPDATE |= RENDER_TYPE.full; } #endregion static restore = function() { #region diff --git a/scripts/node_keyframe/node_keyframe.gml b/scripts/node_keyframe/node_keyframe.gml index 5f0172ec1..73ffca8e8 100644 --- a/scripts/node_keyframe/node_keyframe.gml +++ b/scripts/node_keyframe/node_keyframe.gml @@ -202,11 +202,6 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { var fTime = from.time; var tTime = to.time; - //if(from > PROJECT.animator.frames_total) { - // fTime = fTime % PROJECT.animator.frames_total; - // tTime = tTime - PROJECT.animator.frames_total; - //} - var prog = PROJECT.animator.frames_total - fTime + _time; var totl = PROJECT.animator.frames_total - fTime + tTime; diff --git a/scripts/node_processor/node_processor.gml b/scripts/node_processor/node_processor.gml index 7cd8f7999..0b6fb3dc4 100644 --- a/scripts/node_processor/node_processor.gml +++ b/scripts/node_processor/node_processor.gml @@ -11,6 +11,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct attributes.array_process = ARRAY_PROCESS.loop; current_data = []; inputs_data = []; + inputs_is_array = []; all_inputs = []; process_amount = 0; @@ -29,7 +30,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct static processData = function(_outSurf, _data, _output_index, _array_index = 0) { return _outSurf; } - static getSingleValue = function(_index, _arr = 0, output = false) { + static getSingleValue = function(_index, _arr = 0, output = false) { #region var _l = output? outputs : inputs; var _n = _l[| _index]; var _in = _n.getValue(); @@ -44,9 +45,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct } return array_safe_get(_in, _index); - } + } #endregion - static getDimension = function(arr = 0) { + static getDimension = function(arr = 0) { #region if(dimension_index == -1) return [1, 1]; var _in = getSingleValue(dimension_index, arr); @@ -61,9 +62,9 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct return _in; return [1, 1]; - } + } #endregion - static preProcess = function(outIndex) { + static preProcess = function(outIndex) { #region var _out = outputs[| outIndex].getValue(); all_inputs = array_create(ds_list_size(inputs)); @@ -128,15 +129,18 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct for(var i = 0; i < ds_list_size(inputs); i++) { #region input preparation var _in = inputs_data[i]; - if(!inputs[| i].isArray(_in)) { - _data[i] = inputs_data[i]; + if(!inputs_is_array[i]) { + _data[i] = _in; + all_inputs[i][l] = _data[i]; continue; } if(array_length(_in) == 0) { _data[i] = 0; + all_inputs[i][l] = _data[i]; continue; } + var _index = 0; switch(attributes.array_process) { case ARRAY_PROCESS.loop : _index = safe_mod(l, array_length(_in)); break; @@ -145,7 +149,7 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct case ARRAY_PROCESS.expand_inv : _index = floor(l / process_length[ds_list_size(inputs) - 1 - i][1]) % process_length[i][0]; break; } - _data[i] = _in[_index]; + _data[i] = inputs[| i].arrayBalance(_in[_index]); all_inputs[i][l] = _data[i]; } #endregion @@ -180,18 +184,20 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct } return _out; - } + } #endregion static update = function(frame = PROJECT.animator.current_frame) { #region process_amount = 0; inputs_data = array_create(ds_list_size(inputs)); + inputs_is_array = array_create(ds_list_size(inputs)); process_length = array_create(ds_list_size(inputs)); for(var i = 0; i < ds_list_size(inputs); i++) { //pre-collect current input data var val = inputs[| i].getValue(); var amo = inputs[| i].arrayLength(val); - inputs_data[i] = val; + inputs_data[i] = val; + inputs_is_array[i] = inputs[| i].isArray(val); switch(attributes.array_process) { case ARRAY_PROCESS.loop : @@ -224,8 +230,12 @@ function Node_Processor(_x, _y, _group = noone) : Node(_x, _y, _group) construct val = processData(noone, noone, i); outputs[| i].setValue(val); } + + postUpdate(); } #endregion + static postUpdate = function() {} + static processSerialize = function(_map) { #region _map.array_process = attributes.array_process; } #endregion diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 96da629f8..1ab8c514c 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -5,7 +5,8 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { createNode = _create; self.tags = tags; - tooltip = ""; + tooltip = ""; + deprecated = false; var pth = DIRECTORY + "Nodes/tooltip/" + node + ".png"; if(file_exists(pth)) @@ -26,6 +27,11 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { return self; } + static isDeprecated = function() { + deprecated = true; + return self; + } + static getName = function() { return name; /*__txt_node_name(node, name); */ } static getTooltip = function() { return tooltip; /*__txt_node_tooltip(node, tooltip); */ } @@ -354,27 +360,30 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { addNodeObject(threeD, "3D Camera", s_node_3d_cube, "Node_3D_Camera", [1, Node_3D_Camera]); ds_list_add(threeD, "Mesh"); - addNodeObject(threeD, "3D Cube", s_node_3d_cube, "Node_3D_Mesh_Cube", [1, Node_3D_Mesh_Cube]); + addNodeObject(threeD, "3D Object", s_node_3d_obj, "Node_3D_Mesh_Obj", [0, Node_create_3D_Obj],, "Load .obj file from your computer as a 3D object."); + addNodeObject(threeD, "3D Cube", s_node_3d_cube, "Node_3D_Mesh_Cube", [1, Node_3D_Mesh_Cube]); + addNodeObject(threeD, "3D Cylinder", s_node_3d_cylinder, "Node_3D_Mesh_Cylinder", [1, Node_3D_Mesh_Cylinder]); + addNodeObject(threeD, "3D Sphere", s_node_3d_sphere, "Node_3D_Mesh_Sphere", [1, Node_3D_Mesh_Sphere]); ds_list_add(threeD, "Light"); addNodeObject(threeD, "Directional Light", s_node_3d_cube, "Node_3D_Light_Directional", [1, Node_3D_Light_Directional]); addNodeObject(threeD, "Point Light", s_node_3d_cube, "Node_3D_Light_Point", [1, Node_3D_Light_Point]); ds_list_add(threeD, "Legacy"); - addNodeObject(threeD, "3D Object", s_node_3d_obj, "Node_3D_Obj", [0, Node_create_3D_Obj],, "Load .obj file from your computer as a 3D object."); - addNodeObject(threeD, "3D Plane", s_node_3d_plane, "Node_3D_Plane", [1, Node_3D_Plane],, "Put 2D image on a plane in 3D space."); - addNodeObject(threeD, "3D Cube", s_node_3d_cube, "Node_3D_Cube", [1, Node_3D_Cube]); - addNodeObject(threeD, "3D Cylinder", s_node_3d_cylinder, "Node_3D_Cylinder", [1, Node_3D_Cylinder]); - addNodeObject(threeD, "3D Sphere", s_node_3d_sphere, "Node_3D_Sphere", [1, Node_3D_Sphere]).setVersion(1090); - addNodeObject(threeD, "3D Cone", s_node_3d_cone, "Node_3D_Cone", [1, Node_3D_Cone]).setVersion(1090); - addNodeObject(threeD, "3D Extrude", s_node_3d_extrude, "Node_3D_Extrude", [1, Node_3D_Extrude],, "Extrude 2D image into 3D object."); + addNodeObject(threeD, "3D Object", s_node_3d_obj, "Node_3D_Obj", [1, Node_3D_Obj],, "Load .obj file from your computer as a 3D object.").isDeprecated(); + addNodeObject(threeD, "3D Plane", s_node_3d_plane, "Node_3D_Plane", [1, Node_3D_Plane],, "Put 2D image on a plane in 3D space.").isDeprecated(); + addNodeObject(threeD, "3D Cube", s_node_3d_cube, "Node_3D_Cube", [1, Node_3D_Cube]).isDeprecated(); + addNodeObject(threeD, "3D Cylinder", s_node_3d_cylinder, "Node_3D_Cylinder", [1, Node_3D_Cylinder]).isDeprecated(); + addNodeObject(threeD, "3D Sphere", s_node_3d_sphere, "Node_3D_Sphere", [1, Node_3D_Sphere]).setVersion(1090).isDeprecated(); + addNodeObject(threeD, "3D Cone", s_node_3d_cone, "Node_3D_Cone", [1, Node_3D_Cone]).setVersion(1090).isDeprecated(); + addNodeObject(threeD, "3D Extrude", s_node_3d_extrude, "Node_3D_Extrude", [1, Node_3D_Extrude],, "Extrude 2D image into 3D object.").isDeprecated(); - addNodeObject(threeD, "3D Transform", s_node_3d_transform, "Node_3D_Transform", [1, Node_3D_Transform]).setVersion(1080); - addNodeObject(threeD, "3D Combine", s_node_3d_obj_combine, "Node_3D_Combine", [1, Node_3D_Combine],, "Combine multiple 3D object to a single scene,").setVersion(1080); - addNodeObject(threeD, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat], ["3d array"], "Repeat 3D object multiple times.").setVersion(1080); - addNodeObject(threeD, "3D Displace", s_node_3d_displace, "Node_3D_Displace", [1, Node_3D_Displace]).setVersion(1143); + addNodeObject(threeD, "3D Transform", s_node_3d_transform, "Node_3D_Transform", [1, Node_3D_Transform]).setVersion(1080).isDeprecated(); + addNodeObject(threeD, "3D Combine", s_node_3d_obj_combine, "Node_3D_Combine", [1, Node_3D_Combine],, "Combine multiple 3D object to a single scene,").setVersion(1080).isDeprecated(); + addNodeObject(threeD, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat], ["3d array"], "Repeat 3D object multiple times.").setVersion(1080).isDeprecated(); + addNodeObject(threeD, "3D Displace", s_node_3d_displace, "Node_3D_Displace", [1, Node_3D_Displace]).setVersion(1143).isDeprecated(); - addNodeObject(threeD, "3D Export", s_node_3d_export, "Node_3D_Export", [1, Node_3D_Export]).setVersion(1143); + addNodeObject(threeD, "3D Export", s_node_3d_export, "Node_3D_Export", [1, Node_3D_Export]).setVersion(1143).isDeprecated(); var generator = ds_list_create(); addNodeCatagory("Generate", generator); diff --git a/scripts/node_struct/node_struct.gml b/scripts/node_struct/node_struct.gml index fdd736d5c..94acf9e18 100644 --- a/scripts/node_struct/node_struct.gml +++ b/scripts/node_struct/node_struct.gml @@ -71,6 +71,8 @@ function Node_Struct(_x, _y, _group = noone) : Node(_x, _y, _group) constructor if(frm != noone && frm.type == VALUE_TYPE.surface) str[$ key] = new Surface(val); + else if(frm != noone && frm.type == VALUE_TYPE.buffer) + str[$ key] = new Buffer(val); else str[$ key] = val; } diff --git a/scripts/node_struct_get/node_struct_get.gml b/scripts/node_struct_get/node_struct_get.gml index b186bf6b1..4382d5109 100644 --- a/scripts/node_struct_get/node_struct_get.gml +++ b/scripts/node_struct_get/node_struct_get.gml @@ -32,10 +32,10 @@ function Node_Struct_Get(_x, _y, _group = noone) : Node(_x, _y, _group) construc var val = variable_struct_get(_str, k); if(j == array_length(keys) - 1) { if(is_struct(val)) { - if(instanceof(val) == "Surface") { + if(is_instanceof(val, Surface)) { out.type = VALUE_TYPE.surface; val = val.get(); - } else if(instanceof(val) == "Buffer") { + } else if(is_instanceof(val, Buffer)) { out.type = VALUE_TYPE.buffer; val = val.buffer; } else diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index 6d9efdb38..54c67c3a9 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -438,6 +438,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru #region ---- value ---- def_val = _value; + def_length = is_array(def_val)? array_length(def_val) : 0; unit = new nodeValueUnit(self); extra_data = {}; dyna_depo = ds_list_create(); @@ -1171,6 +1172,23 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru return animator.getValue(_time); } #endregion + static arrayBalance = function(val) { #region //Balance array (generate uniform array from single values) + if(!is_array(def_val)) + return val; + if(typeArrayDynamic(display_type)) + return val; + + if(!is_array(val)) + val = array_create(def_length, val); + else if(array_length(val) < def_length) { + for( var i = array_length(val); i < def_length; i++ ) + val[i] = 0; + } else if(array_length(val) > def_length) + array_resize(val, def_length); + + return val; + } #endregion + static _getValue = function(_time = PROJECT.animator.current_frame, applyUnit = true, arrIndex = 0) { #region var _val = getValueRecursive(_time); var val = _val[0]; @@ -1178,6 +1196,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru var typ = nod.type; var dis = nod.display_type; + if(connect_type == JUNCTION_CONNECT.output) + return val; + if(typ == VALUE_TYPE.surface && (type == VALUE_TYPE.integer || type == VALUE_TYPE.float) && accept_array) { //Dimension conversion if(is_array(val)) { var eqSize = true; @@ -1203,15 +1224,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru return [1, 1]; } - if(is_array(def_val) && !typeArrayDynamic(display_type)) { //Balance array (generate uniform array from single values) - if(!is_array(val)) { - val = array_create(array_length(def_val), val); - return valueProcess(val, nod, applyUnit, arrIndex); - } else if(array_length(val) < array_length(def_val)) { - for( var i = array_length(val); i < array_length(def_val); i++ ) - val[i] = 0; - } - } + val = arrayBalance(val); if(isArray(val) && array_length(val) < 128) { //Process data for( var i = 0, n = array_length(val); i < n; i++ ) @@ -1266,6 +1279,9 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } #endregion static setAnim = function(anim) { #region + if(anim && !is_anim && ds_list_size(animator.values) == 1) + animator.values[| 0].time = PROJECT.animator.current_frame; + is_anim = anim; PANEL_ANIMATION.updatePropertyList(); } #endregion diff --git a/scripts/obj_reader/obj_reader.gml b/scripts/obj_reader/obj_reader.gml index b57aada9e..b987cc3f6 100644 --- a/scripts/obj_reader/obj_reader.gml +++ b/scripts/obj_reader/obj_reader.gml @@ -6,57 +6,56 @@ function readObj(path, flipUV = false) { var _VBN = []; var mats = []; var matIndex = []; + var tris = []; var mtlPath = ""; var use_normal = true; - var v = []; - var vt = []; - var vn = []; - var f = []; - var ft = []; - var fn = []; - var face = 0; + var v = ds_list_create(); + var vt = ds_list_create(); + var vn = ds_list_create(); + var f = ds_list_create(); + var ft = ds_list_create(); + var fn = ds_list_create(); + var tri = 0; var file = file_text_open_read(path); while(!file_text_eof(file)) { var l = file_text_readln(file); - l = string_replace_all(l, "\n", ""); + l = string_trim(l); - var sep = string_splice(l, " "); - if(array_length(sep) == 0 || sep[0] == "") continue; + var sep = string_split(l, " "); + if(array_length(sep) == 0) continue; switch(sep[0]) { case "v" : - array_push(v, [ toNumber(sep[1]), toNumber(sep[2]), toNumber(sep[3]) ]); + ds_list_add(v, [ toNumber(sep[1]), toNumber(sep[2]), toNumber(sep[3]) ]); break; case "vt" : - if(flipUV) - array_push(vt, [ toNumber(sep[1]), 1 - toNumber(sep[2]) ]); - else - array_push(vt, [ toNumber(sep[1]), toNumber(sep[2]) ]); + ds_list_add(vt, [ toNumber(sep[1]), flipUV + toNumber(sep[2]) * (1 - flipUV * 2) ]); // flipUV? 1 - sep[2] : sep[2] break; case "vn" : - array_push(vn, [ toNumber(sep[1]), toNumber(sep[2]), toNumber(sep[3]) ]); + ds_list_add(vn, [ toNumber(sep[1]), toNumber(sep[2]), toNumber(sep[3]) ]); break; case "f" : - var _f = []; - var _ft = []; - var _fn = []; + var _len = array_length(sep); + var _f = array_create(_len - 1); + var _ft = array_create(_len - 1); + var _fn = array_create(_len - 1); - for( var i = 1; i < array_length(sep); i++ ) { - var _sp = string_splice(sep[i], "/"); + for( var i = 1; i < _len; i++ ) { + var _sp = string_split(sep[i], "/"); if(array_length(_sp) < 2) continue; - _f[i - 1] = toNumber(array_safe_get(_sp, 0)); - _ft[i - 1] = toNumber(array_safe_get(_sp, 1)); - _fn[i - 1] = toNumber(array_safe_get(_sp, 2)); + _f[i - 1] = toNumber(array_safe_get(_sp, 0, 1)); + _ft[i - 1] = toNumber(array_safe_get(_sp, 1, 1)); + _fn[i - 1] = toNumber(array_safe_get(_sp, 2, 1)); if(array_length(_sp) < 3) use_normal = false; } - face++; - array_push(f, _f ); //get position - array_push(ft, _ft); //get texture map - array_push(fn, _fn); //get normal + tri += _len - 2; + ds_list_add(f, _f ); //get position + ds_list_add(ft, _ft); //get texture map + ds_list_add(fn, _fn); //get normal break; case "usemtl" : var mname = ""; @@ -67,14 +66,17 @@ function readObj(path, flipUV = false) { array_push_unique(mats, mname); array_push(matIndex, array_find(mats, mname)); - if(array_length(f)) { + if(!ds_list_empty(f)) { array_push(_VB, f); array_push(_VBT, ft); array_push(_VBN, fn); - f = []; - ft = []; - fn = []; + array_push(tris, tri); + f = ds_list_create(); + ft = ds_list_create(); + fn = ds_list_create(); } + + tri = 0; break; case "mtllib" : mtlPath = ""; @@ -87,93 +89,162 @@ function readObj(path, flipUV = false) { break; } } - if(array_length(f)) { + + if(!ds_list_empty(f)) { array_push(_VB, f); array_push(_VBT, ft); array_push(_VBN, fn); + array_push(tris, tri); } file_text_close(file); - //var txt = "OBJ summary"; - //txt += "\n\tVerticies : " + string(array_length(v)); - //txt += "\n\tTexture Verticies : " + string(array_length(vt)); - //txt += "\n\tNormal Verticies : " + string(array_length(vn)); - //txt += "\n\tFaces : " + string(face); - //txt += "\n\tVertex groups : " + string(array_length(_VB)); - //print(txt); + if(use_normal) vn[| 0] = [ 0, 0, 0 ]; + + var txt = "OBJ summary"; + txt += $"\n\tVerticies : {ds_list_size(v)}"; + txt += $"\n\tTexture Verticies : {ds_list_size(vt)}"; + txt += $"\n\tNormal Verticies : {ds_list_size(vn)}"; + txt += $"\n\tVertex groups : {array_length(_VB)}"; + txt += $"\n\tTriangles : {tris}"; + print(txt); #region centralize vertex + var _bmin = v[| 0]; + var _bmax = v[| 0]; var cv = [0, 0, 0]; - var vertex = array_length(v); + var vertex = ds_list_size(v); + for( var i = 0; i < vertex; i++ ) { - var _v = v[i]; + var _v = v[| i]; cv[0] += _v[0]; cv[1] += _v[1]; cv[2] += _v[2]; + + _bmin = [ + min(_bmin[0], _v[0]), + min(_bmin[1], _v[1]), + min(_bmin[2], _v[2]), + ]; + _bmax = [ + max(_bmax[0], _v[0]), + max(_bmax[1], _v[1]), + max(_bmax[2], _v[2]), + ]; } cv[0] /= vertex; cv[1] /= vertex; cv[2] /= vertex; - for( var i = 0, n = array_length(v); i < n; i++ ) { - v[i][0] -= cv[0]; - v[i][1] -= cv[1]; - v[i][2] -= cv[2]; + for( var i = 0, n = ds_list_size(v); i < n; i++ ) { + v[| i][0] -= cv[0]; + v[| i][1] -= cv[1]; + v[| i][2] -= cv[2]; + } + + var _size = new __vec3( + _bmax[0] - _bmin[0], + _bmax[1] - _bmin[1], + _bmax[2] - _bmin[2], + ); + #endregion + + #region vertex buffer creation + var _vblen = array_length(_VB); + var VBS = array_create(_vblen); + var Vpos = array_create(_vblen); + var Vnor = array_create(_vblen); + var Vtex = array_create(_vblen); + + for(var i = 0; i < _vblen; i++) { + var VB = vertex_create_buffer(); + vertex_begin(VB, global.VF_POS_NORM_TEX_COL); + var face = _VB[i]; + var facet = _VBT[i]; + var facen = _VBN[i]; + var tri = tris[i]; + + var _flen = ds_list_size(face); + var _vpos = array_create(tri * 3); + var _vnor = array_create(tri * 3); + var _vtex = array_create(tri * 3); + var _vind = 0; + + for(var j = 0; j < _flen; j++) { + var _f = face[| j]; + var _ft = facet[| j]; + var _fn = facen[| j]; + + var _vlen = array_length(_f); + var _pf = array_create(_vlen); + var _pft = array_create(_vlen); + var _pfn = array_create(_vlen); + + for( var k = 0; k < _vlen; k++ ) { + var _vPindex = _f[k] - 1; + _pf[k] = v[| _vPindex]; + + var _vNindex = _fn[k] - 1; + _pfn[k] = vn[| _vNindex]; + + var _vTindex = _ft[k] - 1; + _pft[k] = vt[| _vTindex]; + + //print($"vPos {k}[{_vPindex}] = {_pf[k]}"); + //print($"vNor {k}[{_vNindex}] = {_pfn[k]}"); + //print($"vTex {k}[{_vTindex}] = {_pft[k]}"); + } + + if(_vlen >= 3) { + vertex_add_pntc(VB, _pf[0], _pfn[0], _pft[0]); + vertex_add_pntc(VB, _pf[1], _pfn[1], _pft[1]); + vertex_add_pntc(VB, _pf[2], _pfn[2], _pft[2]); + + _vpos[_vind] = _pf[0]; _vnor[_vind] = _pfn[0]; _vtex[_vind] = _pft[0]; _vind++; + _vpos[_vind] = _pf[1]; _vnor[_vind] = _pfn[1]; _vtex[_vind] = _pft[1]; _vind++; + _vpos[_vind] = _pf[2]; _vnor[_vind] = _pfn[2]; _vtex[_vind] = _pft[2]; _vind++; + } + + if(_vlen >= 4) { + vertex_add_pntc(VB, _pf[0], _pfn[0], _pft[0]); + vertex_add_pntc(VB, _pf[2], _pfn[2], _pft[2]); + vertex_add_pntc(VB, _pf[3], _pfn[3], _pft[3]); + + _vpos[_vind] = _pf[0]; _vnor[_vind] = _pfn[0]; _vtex[_vind] = _pft[0]; _vind++; + _vpos[_vind] = _pf[2]; _vnor[_vind] = _pfn[2]; _vtex[_vind] = _pft[2]; _vind++; + _vpos[_vind] = _pf[3]; _vnor[_vind] = _pfn[3]; _vtex[_vind] = _pft[3]; _vind++; + } + } + vertex_end(VB); + vertex_freeze(VB); + + VBS[i] = VB; + Vpos[i] = _vpos; + Vnor[i] = _vnor; + Vtex[i] = _vtex; } #endregion - var VBS = []; - - for(var i = 0; i < array_length(_VB); i++) { - var VB = vertex_create_buffer(); - vertex_begin(VB, FORMAT_PNT); - var face = _VB[i]; - var facet = _VBT[i]; - var facen = _VBN[i]; + #region clean + array_foreach(_VB, function(val, ind) { ds_list_destroy(val); }); + array_foreach(_VBT, function(val, ind) { ds_list_destroy(val); }); + array_foreach(_VBN, function(val, ind) { ds_list_destroy(val); }); - for(var j = 0; j < array_length(face); j++) { - var _f = face[j]; - var _ft = facet[j]; - var _fn = facen[j]; - - var _pf = []; - var _pft = []; - var _pfn = []; - - for( var k = 0; k < array_length(_f); k++ ) { - var _f1 = v[_f[k] - 1]; - var _ft1 = vt[_ft[k] - 1]; - var _fn1 = _fn[k]? vn[_fn[k] - 1] : [0, 0, 0]; - - array_push( _pf, _f1); - array_push(_pft, _ft1); - array_push(_pfn, _fn1); - } - - if(array_length(_f) >= 3) { - vertex_add_pnt(VB, _pf[0], _pfn[0], _pft[0]); - vertex_add_pnt(VB, _pf[1], _pfn[1], _pft[1]); - vertex_add_pnt(VB, _pf[2], _pfn[2], _pft[2]); - } - - if(array_length(_f) >= 4) { - vertex_add_pnt(VB, _pf[0], _pfn[0], _pft[0]); - vertex_add_pnt(VB, _pf[2], _pfn[2], _pft[2]); - vertex_add_pnt(VB, _pf[3], _pfn[3], _pft[3]); - } - } - vertex_end(VB); - vertex_freeze(VB); - - array_push(VBS, VB); - } + ds_list_destroy(v); + ds_list_destroy(vn); + ds_list_destroy(vt); + #endregion return { - vertex_groups: VBS, + vertex_groups: VBS, + vertex_positions: Vpos, + vertex_normals: Vnor, + vertex_textures: Vtex, + materials: mats, material_index: matIndex, use_normal: use_normal, mtl_path: mtlPath, + model_size: _size, }; } \ No newline at end of file diff --git a/scripts/panel_inspector/panel_inspector.gml b/scripts/panel_inspector/panel_inspector.gml index b546b5eda..00aff3790 100644 --- a/scripts/panel_inspector/panel_inspector.gml +++ b/scripts/panel_inspector/panel_inspector.gml @@ -4,112 +4,122 @@ function Inspector_Custom_Renderer(drawFn) : widget() constructor { } function Panel_Inspector() : PanelContent() constructor { - title = __txt("Inspector"); - context_str = "Inspector"; - icon = THEME.panel_inspector; + #region ---- main ---- + title = __txt("Inspector"); + context_str = "Inspector"; + icon = THEME.panel_inspector; - w = ui(400); - h = ui(640); + w = ui(400); + h = ui(640); + min_w = ui(160); - locked = false; - inspecting = noone; - top_bar_h = ui(100); + locked = false; + inspecting = noone; + top_bar_h = ui(100); + + static initSize = function() { + content_w = w - ui(32); + content_h = h - top_bar_h - ui(12); + } + initSize(); + #endregion - prop_hover = noone; - prop_selecting = noone; + #region ---- properties ---- + prop_hover = noone; + prop_selecting = noone; - prop_dragging = noone; - prop_sel_drag_x = 0; - prop_sel_drag_y = 0; + prop_dragging = noone; + prop_sel_drag_x = 0; + prop_sel_drag_y = 0; - color_picking = false; - - static initSize = function() { - content_w = w - ui(32); - content_h = h - top_bar_h - ui(12); - } - initSize(); - - keyframe_dragging = noone; - keyframe_drag_st = 0; + color_picking = false; + + picker_index = 0; + picker_change = false; + #endregion globalvar_viewer_init(); drawWidgetInit(); - min_w = ui(160); + #region ---- header labels ---- + tb_node_name = new textBox(TEXTBOX_INPUT.text, function(txt) { + if(inspecting) inspecting.setDisplayName(txt); + }) - tb_node_name = new textBox(TEXTBOX_INPUT.text, function(txt) { - if(inspecting) inspecting.setDisplayName(txt); - }) + tb_prop_filter = new textBox(TEXTBOX_INPUT.text, function(txt) { filter_text = txt; }) + tb_prop_filter.no_empty = false; + tb_prop_filter.auto_update = true; + tb_prop_filter.font = f_p0; + tb_prop_filter.color = COLORS._main_text_sub; + tb_prop_filter.align = fa_center; + tb_prop_filter.hide = true; + filter_text = ""; - tb_prop_filter = new textBox(TEXTBOX_INPUT.text, function(txt) { filter_text = txt; }) - tb_prop_filter.no_empty = false; - tb_prop_filter.auto_update = true; - tb_prop_filter.font = f_p0; - tb_prop_filter.color = COLORS._main_text_sub; - tb_prop_filter.align = fa_center; - tb_prop_filter.hide = true; - filter_text = ""; + prop_page_button = new buttonGroup([ "Properties", "Settings" ], function(val) { prop_page = val; }); + prop_page_button.buttonSpr = [ THEME.button_hide_left, THEME.button_hide_middle, THEME.button_hide_right ]; + prop_page_button.font = f_p1; + prop_page_button.fColor = COLORS._main_text_sub; + prop_page = 0; + #endregion - prop_page_button = new buttonGroup([ "Properties", "Settings" ], function(val) { prop_page = val; }); - prop_page_button.buttonSpr = [ THEME.button_hide_left, THEME.button_hide_middle, THEME.button_hide_right ]; - prop_page_button.font = f_p1; - prop_page_button.fColor = COLORS._main_text_sub; - prop_page = 0; + #region ---- metadata ---- + current_meta = -1; + meta_tb[0] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.description = str; }); + meta_tb[1] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.author = str; }); + meta_tb[2] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.contact = str; }); + meta_tb[3] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.alias = str; }); + meta_tb[4] = new textArrayBox(noone, META_TAGS); + for( var i = 0, n = array_length(meta_tb); i < n; i++ ) + meta_tb[i].hide = true; - picker_index = 0; - picker_change = false; + meta_display = [ + [ __txt("Project Settings"), false ], + [ __txt("Metadata"), true ], + [ __txtx("panel_globalvar", "Global variables"), true, button(function() { panelAdd("Panel_Globalvar", true); }, THEME.node_goto).setIcon(THEME.node_goto, 0, COLORS._main_icon) ] + ]; + #endregion - current_meta = -1; - meta_tb[0] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.description = str; }); - meta_tb[1] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.author = str; }); - meta_tb[2] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.contact = str; }); - meta_tb[3] = new textArea(TEXTBOX_INPUT.text, function(str) { current_meta.alias = str; }); - meta_tb[4] = new textArrayBox(noone, META_TAGS); - for( var i = 0, n = array_length(meta_tb); i < n; i++ ) - meta_tb[i].hide = true; + #region ---- workshop ---- + workshop_uploading = false; + #endregion - meta_display = [ - [ __txt("Project Settings"), false ], - [ __txt("Metadata"), true ], - [ __txtx("panel_globalvar", "Global variables"), true, button(function() { panelAdd("Panel_Globalvar", true); }, THEME.node_goto).setIcon(THEME.node_goto, 0, COLORS._main_icon) ] - ]; + #region ++++ hotkeys ++++ + addHotkey("Inspector", "Copy property", "C", MOD_KEY.ctrl, function() { PANEL_INSPECTOR.propSelectCopy(); }); + addHotkey("Inspector", "Paste property", "V", MOD_KEY.ctrl, function() { PANEL_INSPECTOR.propSelectPaste(); }); + addHotkey("Inspector", "Toggle animation", "I", MOD_KEY.none, function() { PANEL_INSPECTOR.anim_toggling = true; }); - workshop_uploading = false; + addHotkey("", "Color picker", "", MOD_KEY.alt, function() { + if(!PREF_MAP[? "alt_picker"]) return; + PANEL_INSPECTOR.color_picking = true; + }); + #endregion - addHotkey("Inspector", "Copy property", "C", MOD_KEY.ctrl, function() { PANEL_INSPECTOR.propSelectCopy(); }); - addHotkey("Inspector", "Paste property", "V", MOD_KEY.ctrl, function() { PANEL_INSPECTOR.propSelectPaste(); }); - addHotkey("Inspector", "Toggle animation", "I", MOD_KEY.none, function() { PANEL_INSPECTOR.anim_toggling = true; }); - - addHotkey("", "Color picker", "", MOD_KEY.alt, function() { - if(!PREF_MAP[? "alt_picker"]) return; - PANEL_INSPECTOR.color_picking = true; - }); - - group_menu = [ - menuItem(__txt("Expand all"), function() { - if(inspecting == noone) return; - if(inspecting.input_display_list == -1) return; + #region ++++ menus ++++ + group_menu = [ + menuItem(__txt("Expand all"), function() { + if(inspecting == noone) return; + if(inspecting.input_display_list == -1) return; - var dlist = inspecting.input_display_list; - for( var i = 0, n = array_length(dlist); i < n; i++ ) { - if(!is_array(dlist[i])) continue; - dlist[i][@ 1] = false; - } - }), - menuItem(__txt("Collapse all"), function() { - if(inspecting == noone) return; - if(inspecting.input_display_list == -1) return; + var dlist = inspecting.input_display_list; + for( var i = 0, n = array_length(dlist); i < n; i++ ) { + if(!is_array(dlist[i])) continue; + dlist[i][@ 1] = false; + } + }), + menuItem(__txt("Collapse all"), function() { + if(inspecting == noone) return; + if(inspecting.input_display_list == -1) return; - var dlist = inspecting.input_display_list; - for( var i = 0, n = array_length(dlist); i < n; i++ ) { - if(!is_array(dlist[i])) continue; - dlist[i][@ 1] = true; - } - }), - ] + var dlist = inspecting.input_display_list; + for( var i = 0, n = array_length(dlist); i < n; i++ ) { + if(!is_array(dlist[i])) continue; + dlist[i][@ 1] = true; + } + }), + ] + #endregion - function setInspecting(inspecting) { + function setInspecting(inspecting) { #region if(locked) return; self.inspecting = inspecting; @@ -120,16 +130,16 @@ function Panel_Inspector() : PanelContent() constructor { contentPane.scroll_y_to = 0; picker_index = 0; - } + } #endregion function onFocusBegin() { PANEL_INSPECTOR = self; } - function onResize() { + function onResize() { #region initSize(); contentPane.resize(content_w, content_h); - } + } #endregion - static drawMeta = function(_y, _m) { + static drawMeta = function(_y, _m) { #region var con_w = contentPane.surface_w - ui(4); var _hover = pHOVER && contentPane.hover; @@ -310,9 +320,9 @@ function Panel_Inspector() : PanelContent() constructor { } return hh; - } + } #endregion - contentPane = new scrollPane(content_w, content_h, function(_y, _m) { + contentPane = new scrollPane(content_w, content_h, function(_y, _m) { #region var con_w = contentPane.surface_w - ui(4); var _hover = pHOVER && contentPane.hover; @@ -342,7 +352,7 @@ function Panel_Inspector() : PanelContent() constructor { var xc = con_w / 2; - if(prop_page == 1) { + if(prop_page == 1) { #region attribute/settings editor hh += ui(8); var hg = ui(32); var yy = hh; @@ -391,7 +401,7 @@ function Panel_Inspector() : PanelContent() constructor { hh += hg + ui(8); } return hh; - } + } #endregion var color_picker_selecting = noone; var color_picker_index = 0; @@ -400,7 +410,7 @@ function Panel_Inspector() : PanelContent() constructor { for(var i = 0; i < amo; i++) { var yy = hh + _y; - if(i < amoIn) { + if(i < amoIn) { #region inputs if(inspecting.input_display_list == -1) { jun = inspecting.inputs[| i]; } else { @@ -453,17 +463,20 @@ function Panel_Inspector() : PanelContent() constructor { } jun = inspecting.inputs[| inspecting.input_display_list[i]]; } - } else if(i == amoIn) { + #endregion + } else if(i == amoIn) { #region output label hh += ui(8 + 32 + 8); draw_sprite_stretched_ext(THEME.group_label, 0, 0, yy + ui(8), con_w, ui(32), COLORS.panel_inspector_output_label, 0.85); draw_set_text(f_p0b, fa_center, fa_center, COLORS._main_text_sub); draw_text_add(xc, yy + ui(8 + 16), __txt("Outputs")); continue; - } else { + #endregion + } else { #region outputs var outInd = i - amoIn - 1; jun = inspecting.outputs[| outInd]; - } + #endregion + } if(!is_struct(jun)) continue; if(instanceof(jun) != "NodeValue") continue; @@ -474,34 +487,36 @@ function Panel_Inspector() : PanelContent() constructor { if(pos == 0) continue; } - var lb_h = line_get_height(f_p0) + ui(8); - var lb_w = line_get_width(jun.name, f_p0) + ui(16); - var padd = ui(8); + #region ++++ draw widget + var lb_h = line_get_height(f_p0) + ui(8); + var lb_w = line_get_width(jun.name, f_p0) + ui(16); + var padd = ui(8); - var _selY = yy - ui(0); - var lbHov = point_in_rectangle(_m[0], _m[1], ui(48), _selY, ui(48) + lb_w, _selY + lb_h); - if(lbHov) - draw_sprite_stretched_ext(THEME.group_label, 0, ui(48), _selY + ui(2), lb_w, lb_h - ui(4), COLORS._main_icon_dark, 0.85); + var _selY = yy - ui(0); + var lbHov = point_in_rectangle(_m[0], _m[1], ui(48), _selY, ui(48) + lb_w, _selY + lb_h); + if(lbHov) + draw_sprite_stretched_ext(THEME.group_label, 0, ui(48), _selY + ui(2), lb_w, lb_h - ui(4), COLORS._main_icon_dark, 0.85); - var widg = drawWidget(ui(16), yy, contentPane.surface_w - ui(24), _m, jun, false, pHOVER && contentPane.hover, pFOCUS, contentPane, ui(16) + x, top_bar_h + y); - var widH = widg[0]; - var mbRight = widg[1]; + var widg = drawWidget(ui(16), yy, contentPane.surface_w - ui(24), _m, jun, false, pHOVER && contentPane.hover, pFOCUS, contentPane, ui(16) + x, top_bar_h + y); + var widH = widg[0]; + var mbRight = widg[1]; - hh += lb_h + widH + padd; + hh += lb_h + widH + padd; - var _selY1 = yy + lb_h + widH + ui(2); - var _selH = _selY1 - _selY; + var _selY1 = yy + lb_h + widH + ui(2); + var _selH = _selY1 - _selY; - if(_hover && lbHov) { - if(prop_dragging == noone && mouse_press(mb_left, pFOCUS)) { - prop_dragging = jun; + if(_hover && lbHov) { + if(prop_dragging == noone && mouse_press(mb_left, pFOCUS)) { + prop_dragging = jun; - prop_sel_drag_x = mouse_mx; - prop_sel_drag_y = mouse_my; + prop_sel_drag_x = mouse_mx; + prop_sel_drag_y = mouse_my; + } } - } + #endregion - if(jun.connect_type == JUNCTION_CONNECT.input && jun.type == VALUE_TYPE.color && jun.display_type == VALUE_DISPLAY._default) { + if(jun.connect_type == JUNCTION_CONNECT.input && jun.type == VALUE_TYPE.color && jun.display_type == VALUE_DISPLAY._default) { #region color picker pickers[color_picker_index] = jun; if(color_picker_index == picker_index) { if(color_picking && WIDGET_CURRENT == noone && !instance_exists(_p_dialog)) @@ -510,9 +525,9 @@ function Panel_Inspector() : PanelContent() constructor { } color_picker_index++; - } + } #endregion - if(_hover && point_in_rectangle(_m[0], _m[1], ui(4), _selY, contentPane.surface_w - ui(4), _selY + _selH)) { + if(_hover && point_in_rectangle(_m[0], _m[1], ui(4), _selY, contentPane.surface_w - ui(4), _selY + _selH)) { #region mouse in widget _HOVERING_ELEMENT = jun; if(NODE_DROPPER_TARGET != noone && NODE_DROPPER_TARGET != jun) { @@ -535,7 +550,7 @@ function Panel_Inspector() : PanelContent() constructor { if(mouse_press(mb_left, pFOCUS)) prop_selecting = jun; - if(mouse_press(mb_right, pFOCUS && mbRight)) { + if(mouse_press(mb_right, pFOCUS && mbRight)) { #region right click menu var _menuItem = []; if(i < amoIn) { @@ -595,8 +610,8 @@ function Panel_Inspector() : PanelContent() constructor { var dia = menuCall("inspector_value_menu",,, _menuItem,, jun); __dialog_junction = jun; - } - } + } #endregion + } #endregion } if(color_picker_selecting == noone) @@ -627,18 +642,19 @@ function Panel_Inspector() : PanelContent() constructor { color_picking = false; return hh; - }); + }); #endregion - function propSelectCopy() { + function propSelectCopy() { #region if(!prop_selecting) return; clipboard_set_text(prop_selecting.getShowString()); - } - function propSelectPaste() { + } #endregion + + function propSelectPaste() { #region if(!prop_selecting) return; prop_selecting.setString(clipboard_get_text()); - } + } #endregion - function drawInspectingNode() { + function drawInspectingNode() { #region tb_node_name.font = f_h5; tb_node_name.hide = true; tb_node_name.setFocusHover(pFOCUS, pHOVER); @@ -684,9 +700,9 @@ function Panel_Inspector() : PanelContent() constructor { if(buttonInstant(THEME.button_hide, bx, by, ui(32), ui(32), [mx, my], pFOCUS, pHOVER, inspecting.insp2UpdateTooltip, icon[0], icon[1], icon[2]) = 2) inspecting.inspector2Update(); } - } + } #endregion - function drawContent(panel) { + function drawContent(panel) { #region >>>>>>>>>>>>>>>>>>>> MAIN DRAW <<<<<<<<<<<<<<<<<<<< draw_clear_alpha(COLORS.panel_bg_clear, 0); lineBreak = w < PREF_MAP[? "inspector_line_break_width"]; @@ -761,5 +777,5 @@ function Panel_Inspector() : PanelContent() constructor { if(!locked && PANEL_GRAPH.node_focus && inspecting != PANEL_GRAPH.node_focus) setInspecting(PANEL_GRAPH.node_focus); - } + } #endregion } \ No newline at end of file diff --git a/scripts/panel_preview/panel_preview.gml b/scripts/panel_preview/panel_preview.gml index e5f571e5e..b973c2222 100644 --- a/scripts/panel_preview/panel_preview.gml +++ b/scripts/panel_preview/panel_preview.gml @@ -89,37 +89,56 @@ function Panel_Preview() : PanelContent() constructor { d3_surface = noone; d3_outline_surface = noone; - d3_view_camera = new __3dCamera(); - d3_camW = 1; - d3_camH = 1; + #region camera + d3_view_camera = new __3dCamera(); + d3_camW = 1; + d3_camH = 1; - d3_view_camera.setFocusAngle(135, 45, 16); - d3_camLerp = false; + d3_view_camera.setFocusAngle(135, 45, 16); + d3_camLerp = false; - d3_camTarget = new __vec3(); + d3_camTarget = new __vec3(); - d3_camPanning = false; - d3_camPan_mx = 0; - d3_camPan_my = 0; + d3_camPanning = false; + d3_camPan_mx = 0; + d3_camPan_my = 0; - d3_zoom_speed = 0.2; - d3_pan_speed = 2; + d3_zoom_speed = 0.2; + d3_pan_speed = 2; + #endregion - d3_scene = new __3dScene(d3_view_camera); - d3_scene.lightAmbient = $404040; + #region scene + d3_scene = new __3dScene(d3_view_camera); + d3_scene.lightAmbient = $404040; - d3_scene_light0 = new __3dLightDirectional(); - d3_scene_light0.position.set(-1, -2, 3); - d3_scene_light0.color = $AAAAAA; + d3_scene_light_enabled = true; + + d3_scene_light0 = new __3dLightDirectional(); + d3_scene_light0.position.set(-1, -2, 3); + d3_scene_light0.color = $FFFFFF; + d3_scene_light0.shadow_active = false; + d3_scene_light0.shadow_map_scale = 128; + + d3_scene_light1 = new __3dLightDirectional(); + d3_scene_light1.position.set(1, 2, -3); + d3_scene_light1.color = $505050; + #endregion - d3_scene_light1 = new __3dLightDirectional(); - d3_scene_light1.position.set(1, 2, 3); - d3_scene_light1.color = $FFFFFF; + #region tool + d3_tool_snap = false; + d3_tool_snap_position = 1; + d3_tool_snap_rotation = 15; + #endregion + + #region shadow map + + #endregion #endregion tb_framerate = new textBox(TEXTBOX_INPUT.number, function(val) { preview_rate = real(val); }); #region ++++ toolbars & actions ++++ + topbar_height = ui(32); toolbar_height = ui(40); toolbars = [ [ @@ -183,6 +202,29 @@ function Panel_Preview() : PanelContent() constructor { ], ]; + toolbars_3d = [ + [ + THEME.d3d_preview_settings, + function() { return 0; }, + function() { return __txt("3D Preview Settings") }, + function(param) { + var gs = dialogCall(o_dialog_preview_3d_settings, param.x, param.y); + gs.anchor = ANCHOR.bottom | ANCHOR.left; + gs.preview_panel = self; + } + ], + [ + THEME.d3d_snap_settings, + function() { return 0; }, + function() { return __txt("3D Snap Settings") }, + function(param) { + var gs = dialogCall(o_dialog_preview_snap, param.x, param.y); + gs.anchor = ANCHOR.bottom | ANCHOR.left; + gs.preview_panel = self; + } + ], + ]; + actions = [ [ THEME.icon_preview_export, @@ -699,7 +741,6 @@ function Panel_Preview() : PanelContent() constructor { _prev_node.previewing = 1; #region view - var cam = camera_get_active(); var _pos, targ, _blend = 1; targ = d3_camTarget; @@ -737,14 +778,34 @@ function Panel_Preview() : PanelContent() constructor { d3_view_camera.setMatrix(); #endregion - #region draw + #region shadow + if(_prev_node.is_3D) { + var _prev_obj = _prev_node.getPreviewObject(); + d3_scene_light0.shadowProjectVertex(d3_scene, _prev_obj); + + for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) { + var _prev = _prev_obj[i]; + if(_prev == noone) + continue; + if(!is_instanceof(_prev, __3dGroup)) + continue; + + _prev.map(function(object, params) { + if(!is_instanceof(object, __3dLight)) return; + object.shadowProjectVertex(params.scene, params.objs); + }, { scene: d3_scene, objs:_prev_obj }); + } + } + #endregion + + #region grid d3_surface = surface_verify(d3_surface, w, h); d3_outline_surface = surface_verify(d3_outline_surface, w, h); surface_set_target(d3_surface); draw_clear(bg_color); - d3_view_camera.applyCamera(cam); + d3_view_camera.applyCamera(); gpu_set_ztestenable(true); gpu_set_zwriteenable(false); @@ -764,12 +825,17 @@ function Panel_Preview() : PanelContent() constructor { gpu_set_zwriteenable(true); d3_scene.reset(); + #endregion + + #region draw if(_prev_node.is_3D) { var _prev_obj = _prev_node.getPreviewObject(); - d3_scene.addLightDirectional(d3_scene_light0); - d3_scene.addLightDirectional(d3_scene_light1); - + if(d3_scene_light_enabled) { + d3_scene.addLightDirectional(d3_scene_light0); + d3_scene.addLightDirectional(d3_scene_light1); + } + for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) { var _prev = _prev_obj[i]; if(_prev == noone) continue; @@ -788,6 +854,7 @@ function Panel_Preview() : PanelContent() constructor { surface_reset_target(); draw_surface_safe(d3_surface); + //draw_surface_stretched(d3_scene_light0.shadow_map, 64, 64, 96, 96); #endregion #region outline @@ -799,7 +866,7 @@ function Panel_Preview() : PanelContent() constructor { surface_set_target(d3_outline_surface); draw_clear(c_black); - d3_view_camera.applyCamera(cam); + d3_view_camera.applyCamera(); gpu_set_ztestenable(false); for( var i = 0, n = array_length(_inspect_obj); i < n; i++ ) { @@ -815,6 +882,8 @@ function Panel_Preview() : PanelContent() constructor { shader_reset(); } #endregion + + d3_scene.resetCamera(); } #endregion function drawPreviewOverlay() { #region @@ -960,21 +1029,29 @@ function Panel_Preview() : PanelContent() constructor { mouse_on_preview = false; } - if(key_mod_press(CTRL)) { - _snx = PROJECT.previewGrid.show? PROJECT.previewGrid.width : 1; - _sny = PROJECT.previewGrid.show? PROJECT.previewGrid.height : 1; - } else if(PROJECT.previewGrid.snap) { - _snx = PROJECT.previewGrid.width; - _sny = PROJECT.previewGrid.height; - } - var overlayHover = tool_hovering == noone; overlayHover &= active && isHover; overlayHover &= point_in_rectangle(mx, my, 0, toolbar_height, w, h - toolbar_height); overlayHover &= !key_mod_press(CTRL); - if(_node.is_3D) _node.drawOverlay3D(overlayHover, d3_scene, _mx, _my, _snx, _sny, { w, h }); - else _node.drawOverlay(overlayHover, cx, cy, canvas_s, _mx, _my, _snx, _sny, { w, h }); + if(_node.is_3D) { + if(key_mod_press(CTRL) || d3_tool_snap) { + _snx = d3_tool_snap_position; + _sny = d3_tool_snap_rotation; + } + + _node.drawOverlay3D(overlayHover, d3_scene, _mx, _my, _snx, _sny, { w, h }); + } else { + if(key_mod_press(CTRL)) { + _snx = PROJECT.previewGrid.show? PROJECT.previewGrid.width : 1; + _sny = PROJECT.previewGrid.show? PROJECT.previewGrid.height : 1; + } else if(PROJECT.previewGrid.snap) { + _snx = PROJECT.previewGrid.width; + _sny = PROJECT.previewGrid.height; + } + + _node.drawOverlay(overlayHover, cx, cy, canvas_s, _mx, _my, _snx, _sny, { w, h }); + } var _tool = tool_hovering; tool_hovering = noone; @@ -984,7 +1061,7 @@ function Panel_Preview() : PanelContent() constructor { return; } - var aa = d3_active? 0.5 : 1; + var aa = d3_active? 0.8 : 1; draw_sprite_stretched_ext(THEME.tool_side, 1, 0, ui(32), tool_width, h - toolbar_height - ui(32), c_white, aa); var xx = ui(1) + tool_width / 2; @@ -1068,10 +1145,8 @@ function Panel_Preview() : PanelContent() constructor { var ty = h - toolbar_height; //draw_sprite_stretched_ext(THEME.toolbar_shadow, 0, 0, ty - 12 + 4, w, 12, c_white, 0.5); - var scHeight = ui(32); - var aa = d3_active? 0.5 : 1; - - draw_sprite_stretched_ext(THEME.toolbar, 1, 0, 0, w, scHeight, c_white, aa); + var aa = d3_active? 0.8 : 1; + draw_sprite_stretched_ext(THEME.toolbar, 1, 0, 0, w, topbar_height, c_white, aa); draw_sprite_stretched_ext(THEME.toolbar, 0, 0, ty, w, toolbar_height, c_white, aa); if(!_node) return; @@ -1126,7 +1201,7 @@ function Panel_Preview() : PanelContent() constructor { var cx = ui(10); var cy = ui(10); var cw = ui(32); - var ch = scHeight - ui(16); + var ch = topbar_height - ui(16); if(sample_color != noone) { draw_set_color(sample_color); @@ -1152,14 +1227,17 @@ function Panel_Preview() : PanelContent() constructor { var tbx = toolbar_height / 2; var tby = ty + toolbar_height / 2; - for( var i = 0, n = array_length(toolbars); i < n; i++ ) { - var tb = toolbars[i]; - var tbSpr = tb[0]; - var tbInd = tb[1](); + var _toolbars = d3_active? toolbars_3d : toolbars; + + for( var i = 0, n = array_length(_toolbars); i < n; i++ ) { + var tb = _toolbars[i]; + var tbSpr = tb[0]; + var tbInd = tb[1](); var tbTooltip = tb[2](); + var tbActive = tb[3]; var b = buttonInstant(THEME.button_hide, tbx - ui(14), tby - ui(14), ui(28), ui(28), [mx, my], pFOCUS, pHOVER, tbTooltip, tbSpr, tbInd); - if(b == 2) tb[3]( { x: x + tbx - ui(14), y: y + tby - ui(14) } ); + if(b == 2) tbActive( { x: x + tbx - ui(14), y: y + tby - ui(14) } ); tbx += ui(32); } diff --git a/scripts/shader_functions/shader_functions.gml b/scripts/shader_functions/shader_functions.gml index 16e4dcae4..199d975d1 100644 --- a/scripts/shader_functions/shader_functions.gml +++ b/scripts/shader_functions/shader_functions.gml @@ -51,12 +51,14 @@ function shader_set_uniform_f_array_safe(uniform, array, max_length = 128) { shader_set_uniform_f_array(uniform, array); } -function shader_set_surface(sampler, surface) { +function shader_set_surface(sampler, surface, linear = false, _repeat = false) { var shader = shader_current(); if(!is_surface(surface)) return; var t = shader_get_sampler_index(shader, sampler); texture_set_stage(t, surface_get_texture(surface)); + gpu_set_tex_filter_ext(t, linear); + gpu_set_tex_repeat_ext(t, _repeat); } function shader_set_surface_dimension(uniform, surface) { diff --git a/scripts/surface_functions/surface_functions.gml b/scripts/surface_functions/surface_functions.gml index f3711ea2b..eb14a39fa 100644 --- a/scripts/surface_functions/surface_functions.gml +++ b/scripts/surface_functions/surface_functions.gml @@ -129,10 +129,10 @@ function surface_verify(surf, w, h, format = surface_rgba8unorm) { gml_pragma("forceinline"); w = round(w); h = round(h); + var s = is_surface(surf); - if(!is_surface(surf)) - return surface_create_valid(w, h, format); - return surface_size_to(surf, w, h, format); + if(!s) return surface_create_valid(w, h, format); + return surface_size_to(surf, w, h, format, true); } //get @@ -251,22 +251,23 @@ function surface_size_lim(surface, width, height) { return s; } -function surface_size_to(surface, width, height, format = noone) { - if(!is_surface(surface)) return surface; +function surface_size_to(surface, width, height, format = noone, skipCheck = false) { + if(!skipCheck && !is_surface(surface)) return surface; if(width < 1 && height < 1) return surface; if(format != noone && format != surface_get_format(surface)) { surface_free(surface); - return surface_create_valid(width, height, format); + return surface_create(width, height, format); } width = surface_valid_size(width); height = surface_valid_size(height); - var ww = surface_get_width(surface); - var hh = surface_get_height(surface); + var ww = surface_get_width(surface); + var hh = surface_get_height(surface); if(ww == width && hh == height) return surface; + //print($"Reset surface {ww}, {width} | {hh}, {height}"); surface_resize(surface, width, height); surface_clear(surface); diff --git a/scripts/value_snap/value_snap.gml b/scripts/value_snap/value_snap.gml index e5440a451..cf7a8140c 100644 --- a/scripts/value_snap/value_snap.gml +++ b/scripts/value_snap/value_snap.gml @@ -1,4 +1,14 @@ function value_snap(val, snap = 1) { - if(snap == 0) return val; - return round(val / snap) * snap; + gml_pragma("forceinline") + + if(!is_array(val)) { + if(snap == 0) + return val; + return round(val / snap) * snap; + } + + var _val = []; + for( var i = 0, n = array_length(val); i < n; i++ ) + _val[i] = snap == 0? val[i] : round(val[i] / snap) * snap; + return _val; } \ No newline at end of file diff --git a/shaders/sh_channel_R2A/sh_channel_R2A.fsh b/shaders/sh_channel_R2A/sh_channel_R2A.fsh new file mode 100644 index 000000000..cc8977e8e --- /dev/null +++ b/shaders/sh_channel_R2A/sh_channel_R2A.fsh @@ -0,0 +1,10 @@ +// +// Simple passthrough fragment shader +// +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() { + vec4 col = texture2D( gm_BaseTexture, v_vTexcoord ); + gl_FragColor = vec4(0., 0., 0., col.r); +} diff --git a/shaders/sh_channel_R2A/sh_channel_R2A.vsh b/shaders/sh_channel_R2A/sh_channel_R2A.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_channel_R2A/sh_channel_R2A.vsh @@ -0,0 +1,19 @@ +// +// Simple passthrough vertex shader +// +attribute vec3 in_Position; // (x,y,z) +//attribute vec3 in_Normal; // (x,y,z) unused in this shader. +attribute vec4 in_Colour; // (r,g,b,a) +attribute vec2 in_TextureCoord; // (u,v) + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() +{ + vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); + gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; + + v_vColour = in_Colour; + v_vTexcoord = in_TextureCoord; +} diff --git a/shaders/sh_channel_R2A/sh_channel_R2A.yy b/shaders/sh_channel_R2A/sh_channel_R2A.yy new file mode 100644 index 000000000..bfd9299ea --- /dev/null +++ b/shaders/sh_channel_R2A/sh_channel_R2A.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_channel_R2A", + "parent": { + "name": "channels", + "path": "folders/shader/channels.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_channel_R2B/sh_channel_R2B.fsh b/shaders/sh_channel_R2B/sh_channel_R2B.fsh new file mode 100644 index 000000000..025d6426f --- /dev/null +++ b/shaders/sh_channel_R2B/sh_channel_R2B.fsh @@ -0,0 +1,10 @@ +// +// Simple passthrough fragment shader +// +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() { + vec4 col = texture2D( gm_BaseTexture, v_vTexcoord ); + gl_FragColor = vec4(0., 0., col.r, 0.); +} diff --git a/shaders/sh_channel_R2B/sh_channel_R2B.vsh b/shaders/sh_channel_R2B/sh_channel_R2B.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_channel_R2B/sh_channel_R2B.vsh @@ -0,0 +1,19 @@ +// +// Simple passthrough vertex shader +// +attribute vec3 in_Position; // (x,y,z) +//attribute vec3 in_Normal; // (x,y,z) unused in this shader. +attribute vec4 in_Colour; // (r,g,b,a) +attribute vec2 in_TextureCoord; // (u,v) + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() +{ + vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); + gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; + + v_vColour = in_Colour; + v_vTexcoord = in_TextureCoord; +} diff --git a/shaders/sh_channel_R2B/sh_channel_R2B.yy b/shaders/sh_channel_R2B/sh_channel_R2B.yy new file mode 100644 index 000000000..140785c78 --- /dev/null +++ b/shaders/sh_channel_R2B/sh_channel_R2B.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_channel_R2B", + "parent": { + "name": "channels", + "path": "folders/shader/channels.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_channel_R2G/sh_channel_R2G.fsh b/shaders/sh_channel_R2G/sh_channel_R2G.fsh new file mode 100644 index 000000000..b895a24fa --- /dev/null +++ b/shaders/sh_channel_R2G/sh_channel_R2G.fsh @@ -0,0 +1,10 @@ +// +// Simple passthrough fragment shader +// +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() { + vec4 col = texture2D( gm_BaseTexture, v_vTexcoord ); + gl_FragColor = vec4(0., col.r, 0., 0.); +} diff --git a/shaders/sh_channel_R2G/sh_channel_R2G.vsh b/shaders/sh_channel_R2G/sh_channel_R2G.vsh new file mode 100644 index 000000000..3900c20f4 --- /dev/null +++ b/shaders/sh_channel_R2G/sh_channel_R2G.vsh @@ -0,0 +1,19 @@ +// +// Simple passthrough vertex shader +// +attribute vec3 in_Position; // (x,y,z) +//attribute vec3 in_Normal; // (x,y,z) unused in this shader. +attribute vec4 in_Colour; // (r,g,b,a) +attribute vec2 in_TextureCoord; // (u,v) + +varying vec2 v_vTexcoord; +varying vec4 v_vColour; + +void main() +{ + vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); + gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; + + v_vColour = in_Colour; + v_vTexcoord = in_TextureCoord; +} diff --git a/shaders/sh_channel_R2G/sh_channel_R2G.yy b/shaders/sh_channel_R2G/sh_channel_R2G.yy new file mode 100644 index 000000000..6e9298481 --- /dev/null +++ b/shaders/sh_channel_R2G/sh_channel_R2G.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_channel_R2G", + "parent": { + "name": "channels", + "path": "folders/shader/channels.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_d3d_default/sh_d3d_default.fsh b/shaders/sh_d3d_default/sh_d3d_default.fsh index 29c4b5187..c21fd144d 100644 --- a/shaders/sh_d3d_default/sh_d3d_default.fsh +++ b/shaders/sh_d3d_default/sh_d3d_default.fsh @@ -5,59 +5,186 @@ varying vec2 v_vTexcoord; varying vec4 v_vColour; varying vec3 v_vNormal; -varying vec3 v_worldPosition; +varying vec4 v_worldPosition; #region ---- light ---- uniform vec4 light_ambient; - + uniform float shadowBias; + #define LIGHT_DIR_LIMIT 16 uniform int light_dir_count; uniform vec3 light_dir_direction[LIGHT_DIR_LIMIT]; uniform vec4 light_dir_color[LIGHT_DIR_LIMIT]; uniform float light_dir_intensity[LIGHT_DIR_LIMIT]; - + + uniform mat4 light_dir_view[LIGHT_DIR_LIMIT]; + uniform mat4 light_dir_proj[LIGHT_DIR_LIMIT]; + uniform int light_dir_shadow_active[LIGHT_DIR_LIMIT]; + uniform sampler2D light_dir_shadowmap_0; + uniform sampler2D light_dir_shadowmap_1; + uniform sampler2D light_dir_shadowmap_2; + uniform sampler2D light_dir_shadowmap_3; + #define LIGHT_PNT_LIMIT 16 uniform int light_pnt_count; uniform vec3 light_pnt_position[LIGHT_PNT_LIMIT]; uniform vec4 light_pnt_color[LIGHT_PNT_LIMIT]; uniform float light_pnt_intensity[LIGHT_PNT_LIMIT]; uniform float light_pnt_radius[LIGHT_PNT_LIMIT]; + + uniform mat4 light_pnt_view[96]; + uniform mat4 light_pnt_proj[LIGHT_PNT_LIMIT]; + uniform int light_pnt_shadow_active[LIGHT_PNT_LIMIT]; + uniform sampler2D light_pnt_shadowmap_0; + uniform sampler2D light_pnt_shadowmap_1; + uniform sampler2D light_pnt_shadowmap_2; + uniform sampler2D light_pnt_shadowmap_3; + uniform sampler2D light_pnt_shadowmap_4; + uniform sampler2D light_pnt_shadowmap_5; + uniform sampler2D light_pnt_shadowmap_6; + uniform sampler2D light_pnt_shadowmap_7; #endregion +#region ---- rendering ---- + uniform int gammaCorrection; +#endregion + +#region ---- matrix ---- + float matrixGet(mat4 matrix, int index) { + if(index < 0 || index > 15) return 0.; + + int _x = int(floor(float(index) / 4.)); + int _y = int(mod(float(index), 4.)); + return matrix[_x][_y]; + } + + mat4 matrixSet(mat4 matrix, int index, float value) { + if(index < 0 || index > 15) return matrix; + + int _x = int(floor(float(index) / 4.)); + int _y = int(mod(float(index), 4.)); + matrix[_x][_y] = value; + return matrix; + } +#endregion + +float sampleDirShadowMap(int index, vec2 position) { + if(index == 0) return texture2D(light_dir_shadowmap_0, position).r; + if(index == 1) return texture2D(light_dir_shadowmap_1, position).r; + if(index == 2) return texture2D(light_dir_shadowmap_2, position).r; + if(index == 3) return texture2D(light_dir_shadowmap_3, position).r; + return 0.; +} + +float samplePntShadowMap(int index, vec2 position, int side) { + position.x /= 2.; + if(side >= 3) { + position.x += 0.5; + side -= 3; + } + + if(index == 0) return texture2D(light_pnt_shadowmap_0, position)[side]; + if(index == 1) return texture2D(light_pnt_shadowmap_1, position)[side]; + if(index == 2) return texture2D(light_pnt_shadowmap_2, position)[side]; + if(index == 3) return texture2D(light_pnt_shadowmap_3, position)[side]; + return 0.; +} + void main() { vec4 final_color = texture2D( gm_BaseTexture, v_vTexcoord ); final_color *= v_vColour; + gl_FragColor = vec4(0.); #region ++++ light ++++ + int shadow_map_index = 0; vec3 light_effect = light_ambient.rgb; + float val = 0.; - for(int i = 0; i < light_dir_count; i++) { - float light_dir_strength = dot(normalize(v_vNormal), normalize(light_dir_direction[i])); - if(light_dir_strength < 0.) - continue; + #region ---- directional ---- + float light_dir_strength; + float light_map_depth; + float lightDistance; + float shadow_culled; + + shadow_map_index = 0; + for(int i = 0; i < light_dir_count; i++) { + light_dir_strength = dot(normalize(v_vNormal), normalize(light_dir_direction[i])); + if(light_dir_strength < 0.) + continue; + + if(light_dir_shadow_active[i] == 1) { + vec4 cameraSpace = light_dir_view[i] * v_worldPosition; + vec4 screenSpace = light_dir_proj[i] * cameraSpace; + + float v_lightDistance = screenSpace.z / screenSpace.w; + vec2 lightMapPosition = (screenSpace.xy / screenSpace.w * 0.5) + 0.5; - light_dir_strength = max(light_dir_strength * light_dir_intensity[i], 0.); - light_effect += light_dir_color[i].rgb * light_dir_strength; - } + light_map_depth = sampleDirShadowMap(shadow_map_index, lightMapPosition); + shadow_map_index++; + lightDistance = v_lightDistance; + + if(lightDistance > light_map_depth + shadowBias) + continue; + } + + light_dir_strength = max(light_dir_strength * light_dir_intensity[i], 0.); + light_effect += light_dir_color[i].rgb * light_dir_strength; + } + #endregion + #region ---- point ---- + float light_pnt_strength; + float light_distance; + float light_attenuation; - for(int i = 0; i < light_pnt_count; i++) { - float light_pnt_strength = dot(normalize(v_vNormal), normalize(light_pnt_position[i] - v_worldPosition)); - if(light_pnt_strength < 0.) - continue; + shadow_map_index = 0; + for(int i = 0; i < light_pnt_count; i++) { + light_pnt_strength = dot(normalize(v_vNormal), normalize(light_pnt_position[i] - v_worldPosition.xyz)); + if(light_pnt_strength < 0.) + continue; - float light_distance = distance(light_pnt_position[i], v_worldPosition); - if(light_distance > light_pnt_radius[i]) - continue; + light_distance = distance(light_pnt_position[i], v_worldPosition.xyz); + if(light_distance > light_pnt_radius[i]) + continue; - float light_attenuation = 1. - pow(light_distance / light_pnt_radius[i], 2.); + if(light_pnt_shadow_active[i] == 1) { + vec3 dir = v_worldPosition.xyz - light_pnt_position[i]; + vec3 dirAbs = abs(dir); + int side = dirAbs.x > dirAbs.y ? + (dirAbs.x > dirAbs.z ? 0 : 2) : + (dirAbs.y > dirAbs.z ? 1 : 2); + side *= 2; + if(side == 0 && dir.x < 0.) side += 1; + else if(side == 2 && dir.y < 0.) side += 1; + else if(side == 4 && dir.z < 0.) side += 1; + + vec4 cameraSpace = light_pnt_view[i * 6 + side] * v_worldPosition; + vec4 screenSpace = light_pnt_proj[i] * cameraSpace; + float v_lightDistance = screenSpace.z / screenSpace.w; + vec2 lightMapPosition = (screenSpace.xy / screenSpace.w * 0.5) + 0.5; + + light_map_depth = samplePntShadowMap(shadow_map_index, lightMapPosition, side); + shadow_map_index++; + + if(v_lightDistance > light_map_depth + shadowBias) + continue; + } - light_pnt_strength = max(light_pnt_strength * light_pnt_intensity[i] * light_attenuation, 0.); - light_effect += light_pnt_color[i].rgb * light_pnt_strength; - } + light_attenuation = 1. - pow(light_distance / light_pnt_radius[i], 2.); + + light_pnt_strength = max(light_pnt_strength * light_pnt_intensity[i] * light_attenuation, 0.); + light_effect += light_pnt_color[i].rgb * light_pnt_strength; + } + #endregion light_effect = max(light_effect, 0.); final_color.rgb *= light_effect; #endregion - gl_FragColor = final_color; + if(gammaCorrection == 1) { + final_color.r = pow(final_color.r, 1. / 2.2); + final_color.g = pow(final_color.g, 1. / 2.2); + final_color.b = pow(final_color.b, 1. / 2.2); + } + + gl_FragColor = final_color; } diff --git a/shaders/sh_d3d_default/sh_d3d_default.vsh b/shaders/sh_d3d_default/sh_d3d_default.vsh index 50ac57604..860fe48f4 100644 --- a/shaders/sh_d3d_default/sh_d3d_default.vsh +++ b/shaders/sh_d3d_default/sh_d3d_default.vsh @@ -10,14 +10,13 @@ varying vec2 v_vTexcoord; varying vec4 v_vColour; varying vec3 v_vNormal; -varying vec3 v_worldPosition; +varying vec4 v_worldPosition; -void main() -{ +void main() { vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; - v_worldPosition = (gm_Matrices[MATRIX_WORLD] * object_space_pos).xyz; + v_worldPosition = (gm_Matrices[MATRIX_WORLD] * object_space_pos); v_vColour = in_Colour; v_vTexcoord = in_TextureCoord; diff --git a/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.fsh b/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.fsh new file mode 100644 index 000000000..a0253f6f5 --- /dev/null +++ b/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.fsh @@ -0,0 +1,13 @@ +varying vec2 v_vTexcoord; + +varying float v_LightDepth_0; +varying float v_LightDepth_1; +varying float v_LightDepth_2; +varying float v_LightDepth_3; +varying float v_LightDepth_4; +varying float v_LightDepth_5; + +void main() { + gl_FragData[0] = vec4(v_LightDepth_0, v_LightDepth_1, v_LightDepth_2, 1.); + gl_FragData[1] = vec4(v_LightDepth_3, v_LightDepth_4, v_LightDepth_5, 1.); +} diff --git a/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.vsh b/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.vsh new file mode 100644 index 000000000..984d215bd --- /dev/null +++ b/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.vsh @@ -0,0 +1,42 @@ +attribute vec3 in_Position; +attribute vec3 in_Normal; +attribute vec4 in_Colour; +attribute vec2 in_TextureCoord; + +varying vec2 v_vTexcoord; +varying float v_LightDepth_0; +varying float v_LightDepth_1; +varying float v_LightDepth_2; +varying float v_LightDepth_3; +varying float v_LightDepth_4; +varying float v_LightDepth_5; + +uniform mat4 viewMat[6]; +uniform mat4 projMat; + +void main() { + v_vTexcoord = in_TextureCoord; + + vec4 object_space_pos = vec4( in_Position, 1.0); + gl_Position = vec4(0., 0., 1., 1.); + + vec4 worldPos = gm_Matrices[MATRIX_WORLD] * object_space_pos; + + vec4 proj0 = projMat * (viewMat[0] * object_space_pos); + v_LightDepth_0 = proj0.z / proj0.w; + + vec4 proj1 = projMat * (viewMat[1] * object_space_pos); + v_LightDepth_1 = proj1.z / proj1.w; + + vec4 proj2 = projMat * (viewMat[2] * object_space_pos); + v_LightDepth_2 = proj2.z / proj2.w; + + vec4 proj3 = projMat * (viewMat[3] * object_space_pos); + v_LightDepth_3 = proj3.z / proj3.w; + + vec4 proj4 = projMat * (viewMat[4] * object_space_pos); + v_LightDepth_4 = proj4.z / proj4.w; + + vec4 proj5 = projMat * (viewMat[5] * object_space_pos); + v_LightDepth_5 = proj5.z / proj5.w; +} diff --git a/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.yy b/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.yy new file mode 100644 index 000000000..343a9880e --- /dev/null +++ b/shaders/sh_d3d_shadow_cube_depth/sh_d3d_shadow_cube_depth.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_d3d_shadow_cube_depth", + "parent": { + "name": "3d", + "path": "folders/shader/3d.yy", + }, + "type": 1, +} \ No newline at end of file diff --git a/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.fsh b/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.fsh new file mode 100644 index 000000000..ee4037620 --- /dev/null +++ b/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.fsh @@ -0,0 +1,5 @@ +varying float v_LightDepth; + +void main() { + gl_FragColor = vec4(v_LightDepth, v_LightDepth, v_LightDepth, 1.); +} diff --git a/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.vsh b/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.vsh new file mode 100644 index 000000000..0a495022e --- /dev/null +++ b/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.vsh @@ -0,0 +1,13 @@ +attribute vec3 in_Position; +attribute vec3 in_Normal; +attribute vec4 in_Colour; +attribute vec2 in_TextureCoord; + +varying float v_LightDepth; + +void main() { + vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); + gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; + + v_LightDepth = gl_Position.z / gl_Position.w; +} diff --git a/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.yy b/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.yy new file mode 100644 index 000000000..8e5251bb2 --- /dev/null +++ b/shaders/sh_d3d_shadow_depth/sh_d3d_shadow_depth.yy @@ -0,0 +1,10 @@ +{ + "resourceType": "GMShader", + "resourceVersion": "1.0", + "name": "sh_d3d_shadow_depth", + "parent": { + "name": "3d", + "path": "folders/shader/3d.yy", + }, + "type": 1, +} \ No newline at end of file