From 19133ca97fb78634f7855cb8e5148a4acb1c0bc5 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Thu, 9 Nov 2023 19:27:16 +0700 Subject: [PATCH] - New transform scene node - New UV remap node --- PixelComposer.resource_order | 4 + PixelComposer.yyp | 4 + .../Create_0.gml | 2 +- .../Create_0.gml | 2 +- .../__node_3d_modifier/__node_3d_modifier.gml | 28 +++++ scripts/d3d_gizmo_plane/d3d_gizmo_plane.gml | 9 ++ scripts/d3d_group/d3d_group.gml | 12 ++ scripts/d3d_object/d3d_object.gml | 20 +++- scripts/d3d_plane/d3d_plane.gml | 25 ++++ scripts/d3d_plane_mesh/d3d_plane_mesh.gml | 30 ++--- .../d3d_transformation/d3d_transformation.gml | 7 ++ scripts/node_3d_repeat/node_3d_repeat.gml | 25 ++-- .../node_3d_transform/node_3d_transform.gml | 92 ++++++++++++++ .../node_3d_transform/node_3d_transform.yy | 11 ++ scripts/node_3d_transform/node_counter.yy | 12 ++ scripts/node_3d_uv_remap/node_3d_uv_remap.gml | 113 ++++++++++++++++++ scripts/node_3d_uv_remap/node_3d_uv_remap.yy | 11 ++ scripts/node_3d_uv_remap/node_counter.yy | 12 ++ scripts/node_registry/node_registry.gml | 6 +- scripts/textArea/textArea.gml | 79 ++++++------ .../031cf87d-4ed8-41be-a3bc-de418b818944.png | Bin 0 -> 2631 bytes .../9069c1ea-e01a-426d-83f7-ec3a5af24830.png | Bin 0 -> 2631 bytes .../s_node_3d_transform_scene.yy | 74 ++++++++++++ .../e3bedd7f-13ed-4e53-8d17-b78d1d4d9d6a.png | Bin 0 -> 2473 bytes .../17ddd817-fea4-4904-9284-497fe30aa436.png | Bin 0 -> 2473 bytes sprites/s_node_uv_remap/s_node_uv_remap.yy | 74 ++++++++++++ 26 files changed, 581 insertions(+), 71 deletions(-) create mode 100644 scripts/node_3d_transform/node_3d_transform.gml create mode 100644 scripts/node_3d_transform/node_3d_transform.yy create mode 100644 scripts/node_3d_transform/node_counter.yy create mode 100644 scripts/node_3d_uv_remap/node_3d_uv_remap.gml create mode 100644 scripts/node_3d_uv_remap/node_3d_uv_remap.yy create mode 100644 scripts/node_3d_uv_remap/node_counter.yy create mode 100644 sprites/s_node_3d_transform_scene/031cf87d-4ed8-41be-a3bc-de418b818944.png create mode 100644 sprites/s_node_3d_transform_scene/layers/031cf87d-4ed8-41be-a3bc-de418b818944/9069c1ea-e01a-426d-83f7-ec3a5af24830.png create mode 100644 sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy create mode 100644 sprites/s_node_uv_remap/e3bedd7f-13ed-4e53-8d17-b78d1d4d9d6a.png create mode 100644 sprites/s_node_uv_remap/layers/e3bedd7f-13ed-4e53-8d17-b78d1d4d9d6a/17ddd817-fea4-4904-9284-497fe30aa436.png create mode 100644 sprites/s_node_uv_remap/s_node_uv_remap.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 816c8f506..fa3384364 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -307,6 +307,7 @@ {"name":"s_node_loop_input","order":14,"path":"sprites/s_node_loop_input/s_node_loop_input.yy",}, {"name":"node_strand_length_adjust","order":11,"path":"scripts/node_strand_length_adjust/node_strand_length_adjust.yy",}, {"name":"node_blinker","order":17,"path":"scripts/node_blinker/node_blinker.yy",}, + {"name":"s_node_3d_transform_scene","order":22,"path":"sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy",}, {"name":"fd_rectangle_add_material_surface","order":25,"path":"scripts/fd_rectangle_add_material_surface/fd_rectangle_add_material_surface.yy",}, {"name":"perlin_noise","order":5,"path":"scripts/perlin_noise/perlin_noise.yy",}, {"name":"fd_rectangle_replace_material","order":14,"path":"scripts/fd_rectangle_replace_material/fd_rectangle_replace_material.yy",}, @@ -512,6 +513,7 @@ {"name":"text_file","order":5,"path":"scripts/text_file/text_file.yy",}, {"name":"node_armature_pose","order":3,"path":"scripts/node_armature_pose/node_armature_pose.yy",}, {"name":"s_node_pb_draw_diamond","order":29,"path":"sprites/s_node_pb_draw_diamond/s_node_pb_draw_diamond.yy",}, + {"name":"node_3d_transform","order":4,"path":"scripts/node_3d_transform/node_3d_transform.yy",}, {"name":"sh_trail_filler_pass1","order":49,"path":"shaders/sh_trail_filler_pass1/sh_trail_filler_pass1.yy",}, {"name":"s_node_vfx_wind","order":3,"path":"sprites/s_node_vfx_wind/s_node_vfx_wind.yy",}, {"name":"s_node_pb_fx_strip","order":26,"path":"sprites/s_node_pb_fx_strip/s_node_pb_fx_strip.yy",}, @@ -968,6 +970,7 @@ {"name":"fd_rectangle_get_velocity_surface","order":24,"path":"scripts/fd_rectangle_get_velocity_surface/fd_rectangle_get_velocity_surface.yy",}, {"name":"s_node_text_char_get","order":2,"path":"sprites/s_node_text_char_get/s_node_text_char_get.yy",}, {"name":"o_dialog_group_output_order","order":4,"path":"objects/o_dialog_group_output_order/o_dialog_group_output_order.yy",}, + {"name":"node_3d_uv_remap","order":5,"path":"scripts/node_3d_uv_remap/node_3d_uv_remap.yy",}, {"name":"fd_rectangle_get_initial_value_pressure","order":7,"path":"scripts/fd_rectangle_get_initial_value_pressure/fd_rectangle_get_initial_value_pressure.yy",}, {"name":"node_timeline_preview","order":2,"path":"scripts/node_timeline_preview/node_timeline_preview.yy",}, {"name":"__polygon","order":2,"path":"scripts/__polygon/__polygon.yy",}, @@ -1194,6 +1197,7 @@ {"name":"node_pb_box_mirror","order":10,"path":"scripts/node_pb_box_mirror/node_pb_box_mirror.yy",}, {"name":"s_node_text_length","order":9,"path":"sprites/s_node_text_length/s_node_text_length.yy",}, {"name":"s_node_grid_hex","order":4,"path":"sprites/s_node_grid_hex/s_node_grid_hex.yy",}, + {"name":"s_node_uv_remap","order":23,"path":"sprites/s_node_uv_remap/s_node_uv_remap.yy",}, {"name":"sh_fd_visualize_colorize_glsl","order":13,"path":"shaders/sh_fd_visualize_colorize_glsl/sh_fd_visualize_colorize_glsl.yy",}, {"name":"node_3d_light_point","order":2,"path":"scripts/node_3d_light_point/node_3d_light_point.yy",}, {"name":"s_node_pb_draw_fill","order":14,"path":"sprites/s_node_pb_draw_fill/s_node_pb_draw_fill.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index e8e847852..205127ba3 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -879,6 +879,7 @@ {"id":{"name":"s_node_loop_input","path":"sprites/s_node_loop_input/s_node_loop_input.yy",},}, {"id":{"name":"node_strand_length_adjust","path":"scripts/node_strand_length_adjust/node_strand_length_adjust.yy",},}, {"id":{"name":"node_blinker","path":"scripts/node_blinker/node_blinker.yy",},}, + {"id":{"name":"s_node_3d_transform_scene","path":"sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy",},}, {"id":{"name":"fd_rectangle_add_material_surface","path":"scripts/fd_rectangle_add_material_surface/fd_rectangle_add_material_surface.yy",},}, {"id":{"name":"perlin_noise","path":"scripts/perlin_noise/perlin_noise.yy",},}, {"id":{"name":"fd_rectangle_replace_material","path":"scripts/fd_rectangle_replace_material/fd_rectangle_replace_material.yy",},}, @@ -1114,6 +1115,7 @@ {"id":{"name":"text_file","path":"scripts/text_file/text_file.yy",},}, {"id":{"name":"node_armature_pose","path":"scripts/node_armature_pose/node_armature_pose.yy",},}, {"id":{"name":"s_node_pb_draw_diamond","path":"sprites/s_node_pb_draw_diamond/s_node_pb_draw_diamond.yy",},}, + {"id":{"name":"node_3d_transform","path":"scripts/node_3d_transform/node_3d_transform.yy",},}, {"id":{"name":"sh_trail_filler_pass1","path":"shaders/sh_trail_filler_pass1/sh_trail_filler_pass1.yy",},}, {"id":{"name":"s_node_vfx_wind","path":"sprites/s_node_vfx_wind/s_node_vfx_wind.yy",},}, {"id":{"name":"s_node_pb_fx_strip","path":"sprites/s_node_pb_fx_strip/s_node_pb_fx_strip.yy",},}, @@ -1639,6 +1641,7 @@ {"id":{"name":"fd_rectangle_get_velocity_surface","path":"scripts/fd_rectangle_get_velocity_surface/fd_rectangle_get_velocity_surface.yy",},}, {"id":{"name":"s_node_text_char_get","path":"sprites/s_node_text_char_get/s_node_text_char_get.yy",},}, {"id":{"name":"o_dialog_group_output_order","path":"objects/o_dialog_group_output_order/o_dialog_group_output_order.yy",},}, + {"id":{"name":"node_3d_uv_remap","path":"scripts/node_3d_uv_remap/node_3d_uv_remap.yy",},}, {"id":{"name":"fd_rectangle_get_initial_value_pressure","path":"scripts/fd_rectangle_get_initial_value_pressure/fd_rectangle_get_initial_value_pressure.yy",},}, {"id":{"name":"node_timeline_preview","path":"scripts/node_timeline_preview/node_timeline_preview.yy",},}, {"id":{"name":"__polygon","path":"scripts/__polygon/__polygon.yy",},}, @@ -1892,6 +1895,7 @@ {"id":{"name":"node_pb_box_mirror","path":"scripts/node_pb_box_mirror/node_pb_box_mirror.yy",},}, {"id":{"name":"s_node_text_length","path":"sprites/s_node_text_length/s_node_text_length.yy",},}, {"id":{"name":"s_node_grid_hex","path":"sprites/s_node_grid_hex/s_node_grid_hex.yy",},}, + {"id":{"name":"s_node_uv_remap","path":"sprites/s_node_uv_remap/s_node_uv_remap.yy",},}, {"id":{"name":"sh_fd_visualize_colorize_glsl","path":"shaders/sh_fd_visualize_colorize_glsl/sh_fd_visualize_colorize_glsl.yy",},}, {"id":{"name":"node_3d_light_point","path":"scripts/node_3d_light_point/node_3d_light_point.yy",},}, {"id":{"name":"s_node_pb_draw_fill","path":"sprites/s_node_pb_draw_fill/s_node_pb_draw_fill.yy",},}, diff --git a/objects/o_dialog_textbox_autocomplete/Create_0.gml b/objects/o_dialog_textbox_autocomplete/Create_0.gml index 3793acc92..cc11e9c4b 100644 --- a/objects/o_dialog_textbox_autocomplete/Create_0.gml +++ b/objects/o_dialog_textbox_autocomplete/Create_0.gml @@ -17,7 +17,7 @@ event_inherited(); destroy_on_escape = false; destroy_on_click_out = false; - function activate(textbox) { + function activate(textbox) { return; INLINE self.textbox = textbox; self.selecting = 0; diff --git a/objects/o_dialog_textbox_function_guide/Create_0.gml b/objects/o_dialog_textbox_function_guide/Create_0.gml index e705e181a..b0e05f0b2 100644 --- a/objects/o_dialog_textbox_function_guide/Create_0.gml +++ b/objects/o_dialog_textbox_function_guide/Create_0.gml @@ -11,7 +11,7 @@ prompt = ""; index = 0; - function activate(textbox) { + function activate(textbox) { return; INLINE self.textbox = textbox; } diff --git a/scripts/__node_3d_modifier/__node_3d_modifier.gml b/scripts/__node_3d_modifier/__node_3d_modifier.gml index 27e6a7f0c..e407e03d8 100644 --- a/scripts/__node_3d_modifier/__node_3d_modifier.gml +++ b/scripts/__node_3d_modifier/__node_3d_modifier.gml @@ -8,4 +8,32 @@ function Node_3D_Modifier(_x, _y, _group = noone) : Node_3D(_x, _y, _group) cons outputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Mesh, noone); + static modify_object = function(_object, _data, _matrix) { #region + return _object; + } #endregion + + static modify_group = function(_group, _data, _matrix) { #region + var _gr = new __3dGroup(); + + _gr.transform = _group.transform.clone(); + _gr.transform.submitMatrix(); + _gr.transform.clearMatrix(); + _matrix = _matrix.Mul(_gr.transform.matrix); + + for( var i = 0, n = array_length(_group.objects); i < n; i++ ) + _gr.objects[i] = modify(_group.objects[i], _data, _matrix); + + return _gr; + } #endregion + + static modify = function(_object, _data, _matrix = new BBMOD_Matrix()) { #region + if(is_instanceof(_object, __3dObject)) return modify_object(_object, _data, _matrix); + if(is_instanceof(_object, __3dGroup)) return modify_group(_object, _data, _matrix); + + return noone; + } #endregion + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + return modify(_data[0], _data); + } #endregion } \ No newline at end of file diff --git a/scripts/d3d_gizmo_plane/d3d_gizmo_plane.gml b/scripts/d3d_gizmo_plane/d3d_gizmo_plane.gml index 5d8a790b2..06420b2a9 100644 --- a/scripts/d3d_gizmo_plane/d3d_gizmo_plane.gml +++ b/scripts/d3d_gizmo_plane/d3d_gizmo_plane.gml @@ -1,10 +1,19 @@ function __3dGizmoPlane(radius = 0.5, color = c_white, alpha = 1) : __3dGizmo() constructor { + object_counts = 2; + vertex = [ [ new __vertex( -radius, -radius, 0, color, alpha ), new __vertex( -radius, radius, 0, color, alpha ), + + new __vertex( -radius, radius, 0, color, alpha ), + new __vertex( radius, radius, 0, color, alpha ), + new __vertex( radius, radius, 0, color, alpha ), new __vertex( radius, -radius, 0, color, alpha ), + + new __vertex( radius, -radius, 0, color, alpha ), + new __vertex( -radius, -radius, 0, color, alpha ), ], [ new __vertex( 0, 0, 0, color, alpha ), diff --git a/scripts/d3d_group/d3d_group.gml b/scripts/d3d_group/d3d_group.gml index 3555161f3..2efbb23b9 100644 --- a/scripts/d3d_group/d3d_group.gml +++ b/scripts/d3d_group/d3d_group.gml @@ -90,4 +90,16 @@ function __3dGroup() constructor { for( var i = 0, n = array_length(objects); i < n; i++ ) callback(objects[i], scene); } #endregion + + static clone = function(vertex = true, cloneBuffer = false) { #region + var _new = new __3dGroup(); + + _new.transform = transform.clone(); + _new.objects = array_create(array_length(objects)); + + for( var i = 0, n = array_length(objects); i < n; i++ ) + _new.objects[i] = objects[i].clone(vertex, cloneBuffer); + + return _new; + } #endregion } \ No newline at end of file diff --git a/scripts/d3d_object/d3d_object.gml b/scripts/d3d_object/d3d_object.gml index 8574a1100..a5f621e49 100644 --- a/scripts/d3d_object/d3d_object.gml +++ b/scripts/d3d_object/d3d_object.gml @@ -10,6 +10,7 @@ vertex_format_add_texcoord(); vertex_format_add_color(); global.VF_POS_NORM_TEX_COL = vertex_format_end(); + global.VF_POS_NORM_TEX_COL_size = 36; #endregion function __3dObject() constructor { @@ -82,7 +83,7 @@ function __3dObject() constructor { } } vertex_end(_buffer); - vertex_freeze(_buffer); + //vertex_freeze(_buffer); return _buffer; } #endregion @@ -193,7 +194,7 @@ function __3dObject() constructor { } #endregion - static clone = function(_vertex = true) { #region + static clone = function(_vertex = true, cloneBuffer = false) { #region var _obj = new __3dObject(); if(_vertex) { @@ -206,6 +207,21 @@ function __3dObject() constructor { } } + if(cloneBuffer) { + _obj.VB = array_create(array_length(VB)); + + for( var i = 0, n = array_length(VB); i < n; i++ ) { + var _vnum = vertex_get_number(VB[i]); + var _buff = buffer_create(1, buffer_grow, 1); + buffer_copy_from_vertex_buffer(VB[i], 0, _vnum - 1, _buff, 0); + + _obj.VB[i] = vertex_create_buffer_from_buffer(_buff, VF); + } + } else { + _obj.VB = VB; + } + + _obj.NVB = NVB; _obj.VF = VF; _obj.render_type = render_type; _obj.custom_shader = custom_shader; diff --git a/scripts/d3d_plane/d3d_plane.gml b/scripts/d3d_plane/d3d_plane.gml index 8978134cd..112fadaf7 100644 --- a/scripts/d3d_plane/d3d_plane.gml +++ b/scripts/d3d_plane/d3d_plane.gml @@ -29,4 +29,29 @@ function __plane(origin, normal) constructor { var _distance = _dot / point_distance_3d(0, 0, 0, plane_normal[0], plane_normal[1], plane_normal[2]); return _distance; } + + function d3d_point_project_plane_uv(plane_origin, plane_normal, point, plane_x_axis, plane_y_axis) { + var distance = d3d_point_to_plane(plane_origin, plane_normal, point); + var projected_point = [ + point[0] - plane_normal[0] * distance, + point[1] - plane_normal[1] * distance, + point[2] - plane_normal[2] * distance + ]; + + var local_x = dot_product_3d( + projected_point[0] - plane_origin[0], + projected_point[1] - plane_origin[1], + projected_point[2] - plane_origin[2], + plane_x_axis[0], plane_x_axis[1], plane_x_axis[2] + ); + + var local_y = dot_product_3d( + projected_point[0] - plane_origin[0], + projected_point[1] - plane_origin[1], + projected_point[2] - plane_origin[2], + plane_y_axis[0], plane_y_axis[1], plane_y_axis[2] + ); + + return [ local_x, local_y ]; + } #endregion \ No newline at end of file diff --git a/scripts/d3d_plane_mesh/d3d_plane_mesh.gml b/scripts/d3d_plane_mesh/d3d_plane_mesh.gml index b1045b140..d757e95f5 100644 --- a/scripts/d3d_plane_mesh/d3d_plane_mesh.gml +++ b/scripts/d3d_plane_mesh/d3d_plane_mesh.gml @@ -15,34 +15,34 @@ function __3dPlane() : __3dObject() constructor { switch(normal) { case 0 : vertex[0] = [ - new __vertex(0, -side, -side).setNormal(1, 0, 0).setUV(0, 0), - new __vertex(0, side, side).setNormal(1, 0, 0).setUV(1, 1), - new __vertex(0, side, -side).setNormal(1, 0, 0).setUV(1, 0), + new __vertex(0, -side, -side).setNormal(1, 0, 0).setUV(0, 1), + new __vertex(0, side, side).setNormal(1, 0, 0).setUV(1, 0), + new __vertex(0, side, -side).setNormal(1, 0, 0).setUV(1, 1), - new __vertex(0, -side, -side).setNormal(1, 0, 0).setUV(0, 0), - new __vertex(0, -side, side).setNormal(1, 0, 0).setUV(0, 1), - new __vertex(0, side, side).setNormal(1, 0, 0).setUV(1, 1), + new __vertex(0, -side, -side).setNormal(1, 0, 0).setUV(0, 1), + new __vertex(0, -side, side).setNormal(1, 0, 0).setUV(0, 0), + new __vertex(0, side, side).setNormal(1, 0, 0).setUV(1, 0), ]; break; case 1 : vertex[0] = [ - new __vertex(-side, 0, -side).setNormal(0, 1, 0).setUV(0, 0), - new __vertex( side, 0, -side).setNormal(0, 1, 0).setUV(1, 0), - new __vertex( side, 0, side).setNormal(0, 1, 0).setUV(1, 1), + new __vertex(-side, 0, -side).setNormal(0, 1, 0).setUV(1, 1), + new __vertex( side, 0, -side).setNormal(0, 1, 0).setUV(0, 1), + new __vertex( side, 0, side).setNormal(0, 1, 0).setUV(0, 0), - new __vertex(-side, 0, -side).setNormal(0, 1, 0).setUV(0, 0), - new __vertex( side, 0, side).setNormal(0, 1, 0).setUV(1, 1), - new __vertex(-side, 0, side).setNormal(0, 1, 0).setUV(0, 1), + new __vertex(-side, 0, -side).setNormal(0, 1, 0).setUV(1, 1), + new __vertex( side, 0, side).setNormal(0, 1, 0).setUV(0, 0), + new __vertex(-side, 0, side).setNormal(0, 1, 0).setUV(1, 0), ]; break; case 2 : vertex[0] = [ new __vertex(-side, -side, 0).setNormal(0, 0, 1).setUV(0, 0), new __vertex( side, side, 0).setNormal(0, 0, 1).setUV(1, 1), - new __vertex( side, -side, 0).setNormal(0, 0, 1).setUV(1, 0), - + new __vertex( side, -side, 0).setNormal(0, 0, 1).setUV(0, 1), + new __vertex(-side, -side, 0).setNormal(0, 0, 1).setUV(0, 0), - new __vertex(-side, side, 0).setNormal(0, 0, 1).setUV(0, 1), + new __vertex(-side, side, 0).setNormal(0, 0, 1).setUV(1, 0), new __vertex( side, side, 0).setNormal(0, 0, 1).setUV(1, 1), ]; break; diff --git a/scripts/d3d_transformation/d3d_transformation.gml b/scripts/d3d_transformation/d3d_transformation.gml index 52911a3d5..02cd02a3e 100644 --- a/scripts/d3d_transformation/d3d_transformation.gml +++ b/scripts/d3d_transformation/d3d_transformation.gml @@ -6,6 +6,8 @@ function __transform() constructor { rotation = new BBMOD_Quaternion(); scale = new __vec3(1); + matrix = new BBMOD_Matrix(); + static submitMatrix = function() { if(parent) parent.submitMatrix(); @@ -24,6 +26,11 @@ function __transform() constructor { matrix_stack_push(rot); matrix_stack_push(sca); matrix_stack_push(anc); + + matrix = new BBMOD_Matrix().Mul(new BBMOD_Matrix().FromArray(pos)) + .Mul(new BBMOD_Matrix().FromArray(rot)) + .Mul(new BBMOD_Matrix().FromArray(sca)) + .Mul(new BBMOD_Matrix().FromArray(anc)) } static clearMatrix = function() { diff --git a/scripts/node_3d_repeat/node_3d_repeat.gml b/scripts/node_3d_repeat/node_3d_repeat.gml index 0e030837f..292d5d80c 100644 --- a/scripts/node_3d_repeat/node_3d_repeat.gml +++ b/scripts/node_3d_repeat/node_3d_repeat.gml @@ -38,6 +38,8 @@ function Node_3D_Repeat(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr inputs[| 11] = nodeValue("Scales", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [] ) .setArrayDepth(2); + inputs[| 12] = nodeValue("Use Instance", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true ) + outputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Scene, noone); input_display_list = [ @@ -57,17 +59,18 @@ function Node_3D_Repeat(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr static processData = function(_output, _data, _output_index, _array_index = 0) { #region var _object = _data[0]; - var _mode = _data[1]; - var _Spos = _data[3]; - var _Srot = _data[4]; - var _Ssca = _data[5]; - var _Rpos = _data[6]; - var _Rrot = _data[7]; - var _Rsca = _data[8]; + var _mode = _data[1]; + var _Spos = _data[3]; + var _Srot = _data[4]; + var _Ssca = _data[5]; + var _Rpos = _data[6]; + var _Rrot = _data[7]; + var _Rsca = _data[8]; - var _Apos = _data[ 9]; - var _Arot = _data[10]; - var _Asca = _data[11]; + var _Apos = _data[ 9]; + var _Arot = _data[10]; + var _Asca = _data[11]; + var _inst = _data[12]; if(_mode == 1 && !is_array(_object)) return noone; var _amo = _mode == 1? array_length(_object) : _data[2]; @@ -78,6 +81,8 @@ function Node_3D_Repeat(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr var _obj = _mode == 1? _object[i] : _object; if(_obj == noone) continue; + //if(!_inst) _obj = _obj.clone(false, true); + var _apos = array_safe_get(_Apos, i); var _arot = array_safe_get(_Arot, i); var _asca = array_safe_get(_Asca, i); diff --git a/scripts/node_3d_transform/node_3d_transform.gml b/scripts/node_3d_transform/node_3d_transform.gml new file mode 100644 index 000000000..baefaa0ef --- /dev/null +++ b/scripts/node_3d_transform/node_3d_transform.gml @@ -0,0 +1,92 @@ +function Node_3D_Transform_Scene(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constructor { + name = "Transform Scene"; + + inputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Scene, noone) + .setVisible(true, true); + + inputs[| 1] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) + .setArrayDepth(2); + + inputs[| 2] = nodeValue("Rotation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) + .setArrayDepth(2); + + inputs[| 3] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, []) + .setArrayDepth(2); + + inputs[| 4] = nodeValue("Positioning type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Override" ]); + + inputs[| 5] = nodeValue("Rotating type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Override" ]); + + inputs[| 6] = nodeValue("Scaling type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Additive", "Multiplicative", "Override" ]); + + outputs[| 0] = nodeValue("Scene", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Scene, noone); + + input_display_list = [ 0, + ["Transform", false], 1, 2, 3, + ["Settings", true], 4, 5, 6, + ]; + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var _scn = _data[0]; + if(!is_instanceof(_scn, __3dGroup)) return noone; + + var _nscn = _scn.clone(false); + + _temp_data = _data; + array_foreach(_nscn.objects, function(_object, _index) { + + var _pos = array_safe_get(_temp_data[1], _index, 0); + if(is_array(_pos)) { + if(_temp_data[4] == 0) { + _object.transform.position.x += _pos[0]; + _object.transform.position.y += _pos[1]; + _object.transform.position.z += _pos[2]; + } else if(_temp_data[4] == 1) { + _object.transform.position.x = _pos[0]; + _object.transform.position.y = _pos[1]; + _object.transform.position.z = _pos[2]; + } + } + + var _rot = array_safe_get(_temp_data[2], _index, 0); + if(is_array(_rot)) { + var _rotQ = new BBMOD_Quaternion().FromEuler(_rot[0], _rot[1], _rot[2]); + + if(_temp_data[5] == 0) + _object.transform.rotation = _object.transform.rotation.Mul(_rotQ); + else if(_temp_data[5] == 1) + _object.transform.rotation = _rotQ; + } + + var _sca = array_safe_get(_temp_data[3], _index, 0); + if(is_array(_sca)) { + if(_temp_data[6] == 0) { + _object.transform.scale.x += _sca[0]; + _object.transform.scale.y += _sca[1]; + _object.transform.scale.z += _sca[2]; + } else if(_temp_data[6] == 1) { + _object.transform.scale.x *= _sca[0]; + _object.transform.scale.y *= _sca[1]; + _object.transform.scale.z *= _sca[2]; + } else if(_temp_data[6] == 2) { + _object.transform.scale.x = _sca[0]; + _object.transform.scale.y = _sca[1]; + _object.transform.scale.z = _sca[2]; + } + } + }); + + return _nscn; + } #endregion + + static getPreviewObject = function() { #region + var _obj = outputs[| 0].getValue(); + if(is_array(_obj)) _obj = array_safe_get(_obj, preview_index, noone); + + return _obj; + } #endregion + +} \ No newline at end of file diff --git a/scripts/node_3d_transform/node_3d_transform.yy b/scripts/node_3d_transform/node_3d_transform.yy new file mode 100644 index 000000000..dce8255be --- /dev/null +++ b/scripts/node_3d_transform/node_3d_transform.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_transform", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "d3d modifier", + "path": "folders/nodes/data/3D/d3d modifier.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_transform/node_counter.yy b/scripts/node_3d_transform/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_transform/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_uv_remap/node_3d_uv_remap.gml b/scripts/node_3d_uv_remap/node_3d_uv_remap.gml new file mode 100644 index 000000000..5cb69bb9a --- /dev/null +++ b/scripts/node_3d_uv_remap/node_3d_uv_remap.gml @@ -0,0 +1,113 @@ +function Node_3D_UV_Remap(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) constructor { + name = "UV Remap"; + gizmo = new __3dGizmoPlane(); + + inputs[| in_d3d + 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Mesh, noone) + .setVisible(true, true); + + outputs[| 0] = nodeValue("Mesh", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Mesh, noone); + + input_display_list = [ + ["Transform", false], 0, 1, 2, + in_d3d + 0, + ]; + + remap_position = [ 0, 0, 0 ]; + remap_normal = [ 0, 0, 0 ]; + remap_normal_x = [ 0, 0, 0 ]; + remap_normal_y = [ 0, 0, 0 ]; + remap_scale = [ 1, 1, 1 ]; + + static modify_object = function(_object, _data, _matrix) { #region + if(_object.VF != global.VF_POS_NORM_TEX_COL) return _object; + + var _obj = _object.clone(false, false); + _obj.VB = []; + _obj.transform.submitMatrix(); + _obj.transform.clearMatrix(); + + var _mat = _matrix.Mul(_obj.transform.matrix); + + for( var i = 0, n = array_length(_object.VB); i < n; i++ ) { + var vb = _object.VB[i]; + var len = vertex_get_number(vb); + var buff = buffer_create_from_vertex_buffer(vb, buffer_grow, 1); + buffer_seek(buff, buffer_seek_start, 0); + + for( var j = 0; j < len; j++ ) { + var _x = buffer_read(buff, buffer_f32); // 4 + var _y = buffer_read(buff, buffer_f32); // 4 + var _z = buffer_read(buff, buffer_f32); // 4 + + var _nx = buffer_read(buff, buffer_f32); // 4 + var _ny = buffer_read(buff, buffer_f32); // 4 + var _nz = buffer_read(buff, buffer_f32); // 4 + + var _u = buffer_read(buff, buffer_f32); // 4 + var _v = buffer_read(buff, buffer_f32); // 4 + + var _r = buffer_read(buff, buffer_u8); // 1 + var _g = buffer_read(buff, buffer_u8); // 1 + var _b = buffer_read(buff, buffer_u8); // 1 + var _a = buffer_read(buff, buffer_u8); // 1 + + var _v4 = new BBMOD_Vec4(_x, _y, _z, 1); + var _vt = _mat.Transform(_v4); + + var _posOnMap = d3d_point_project_plane_uv(remap_position, remap_normal, [_vt.X, _vt.Y, _vt.Z], remap_normal_x, remap_normal_y); + _posOnMap[0] = _posOnMap[0] / remap_scale[0] + 0.5; + _posOnMap[1] = _posOnMap[1] / remap_scale[1] + 0.5; + + buffer_seek(buff, buffer_seek_relative, -12); + + buffer_write(buff, buffer_f32, _posOnMap[0]); + buffer_write(buff, buffer_f32, _posOnMap[1]); + + buffer_seek(buff, buffer_seek_relative, 4); + } + + _obj.VB[i] = vertex_create_buffer_from_buffer(buff, global.VF_POS_NORM_TEX_COL); + } + + return _obj; + } #endregion + + static modify_group = function(_group, _data, _matrix) { #region + var _gr = new __3dGroup(); + + _gr.transform = _group.transform.clone(); + _gr.transform.submitMatrix(); + _gr.transform.clearMatrix(); + _matrix = _matrix.Mul(_gr.transform.matrix); + + for( var i = 0, n = array_length(_group.objects); i < n; i++ ) + _gr.objects[i] = modify(_group.objects[i], _data, _matrix); + + return _gr; + } #endregion + + static modify = function(_object, _data, _matrix = new BBMOD_Matrix()) { #region + if(is_instanceof(_object, __3dObject)) return modify_object(_object, _data, _matrix); + if(is_instanceof(_object, __3dGroup)) return modify_group(_object, _data, _matrix); + + return noone; + } #endregion + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + setTransform(gizmo, _data); + + var _rot = _data[1]; + var _prot = new BBMOD_Quaternion(_rot[0], _rot[1], _rot[2], _rot[3]); + remap_normal = _prot.Rotate(new BBMOD_Vec3(0, 0, 1)).ToArray(); + remap_normal_x = _prot.Rotate(new BBMOD_Vec3(1, 0, 0)).ToArray(); + remap_normal_y = _prot.Rotate(new BBMOD_Vec3(0, -1, 0)).ToArray(); + + remap_position = _data[0]; + remap_scale = _data[2]; + + return modify(_data[in_d3d + 0], _data); + } #endregion + + static getPreviewObjects = function() { return [ getPreviewObject(), gizmo ]; } + static getPreviewObjectOutline = function() { return [ gizmo ]; } +} \ No newline at end of file diff --git a/scripts/node_3d_uv_remap/node_3d_uv_remap.yy b/scripts/node_3d_uv_remap/node_3d_uv_remap.yy new file mode 100644 index 000000000..b223f85d9 --- /dev/null +++ b/scripts/node_3d_uv_remap/node_3d_uv_remap.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_uv_remap", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "d3d modifier", + "path": "folders/nodes/data/3D/d3d modifier.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_uv_remap/node_counter.yy b/scripts/node_3d_uv_remap/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_uv_remap/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_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 0c3d048d8..61c98634c 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -421,8 +421,10 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio addNodeObject(d3d, "Point Light", s_node_3d_light_point, "Node_3D_Light_Point", [1, Node_3D_Light_Point]).setVersion(11510); ds_list_add(d3d, "Modify"); - addNodeObject(d3d, "Discretize vertex", s_node_3d_discretize, "Node_3D_Round_Vertex", [1, Node_3D_Round_Vertex]).setVersion(11560); - addNodeObject(d3d, "Set Material", s_node_3d_set_material, "Node_3D_Set_Material", [1, Node_3D_Set_Material]).setVersion(11560); + addNodeObject(d3d, "Discretize vertex", s_node_3d_discretize, "Node_3D_Round_Vertex", [1, Node_3D_Round_Vertex]).setVersion(11560); + addNodeObject(d3d, "Set Material", s_node_3d_set_material, "Node_3D_Set_Material", [1, Node_3D_Set_Material]).setVersion(11560); + addNodeObject(d3d, "Transform Scene", s_node_3d_transform_scene, "Node_3D_Transform_Scene", [1, Node_3D_Transform_Scene]).setVersion(11570); + addNodeObject(d3d, "UV Remap", s_node_uv_remap, "Node_3D_UV_Remap", [1, Node_3D_UV_Remap]).setVersion(11570); ///**/ addNodeObject(d3d, "3D Instancer", s_node_3d_set_material, "Node_3D_Instancer", [1, Node_3D_Instancer]).setVersion(11560); ///**/ addNodeObject(d3d, "3D Particle", s_node_3d_set_material, "Node_3D_Particle", [1, Node_3D_Particle]).setVersion(11560); diff --git a/scripts/textArea/textArea.gml b/scripts/textArea/textArea.gml index 5cbf283d5..31f04b212 100644 --- a/scripts/textArea/textArea.gml +++ b/scripts/textArea/textArea.gml @@ -34,6 +34,7 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor cursor_pos_y = 0; cursor_pos_y_to = 0; cursor_line = 0; + cursor_selecting = false; char_run = 0 @@ -70,7 +71,7 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor cursor_pos_x = 0; cursor_pos_y = 0; - click_block = 1; + click_block = 1; KEYBOARD_STRING = ""; keyboard_lastkey = -1; @@ -529,16 +530,13 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor } } #endregion - static display_text = function(_x, _y, _text, _mx = -1, _my = -1) { #region + static display_text = function(_x, _y, _text, _mx = -1, _my = -1, _hover = false) { #region _text = string_real(_text); if(line_width != _prev_width) { _prev_width = line_width; cut_line(); } - var _xx = _x, _ch, _chw; - var target = -999; - draw_set_text(font, fa_left, fa_top, color); draw_set_alpha(0.5 + 0.5 * interactable); @@ -546,14 +544,6 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor var ch_y = _y; var _str; - //print("=========="); - //print(_text); - //print(">>>>"); - //print(_input_text); - //print("----"); - //print(_input_text_line); - //print($"cursor: {cursor}"); - if(_input_text != _text) { _input_text = _text; cut_line(); @@ -587,56 +577,72 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor draw_set_alpha(1); - if(_mx != -1 && _my != -1) { + var target = undefined; + + if(_hover) { + target = 0; var char_run = 0, _l, _ch_w, _ch_h, _str, _chr; - var sx = _x; - var ch_x = sx; + var sx = _x; + var ch_x = sx; var ch_cxo = sx; var ch_cxn = sx; - var ch_y = _y; + var ch_y = _y; + var _found_char = false; for( var i = 0, n = array_length(_input_text_line); i < n; i++ ) { _str = string_trim_end(_input_text_line[i]); - _l = string_length(_str); - _ch_h = line_get_height(); + _l = string_length(_str); + _ch_h = line_get_height(); ch_cxo = sx; - ch_x = sx; + ch_x = sx; - if(ch_y <= _my && ch_y + _ch_h >= _my) { - target = char_run + _l; - - for( var j = 0; j < string_length(_str); j++ ) { + //draw_set_color(c_white); + //draw_rectangle(ch_x, ch_y, ch_x + 100, ch_y + _ch_h, false); + + if((i == 0 || ch_y <= _my) && (i == n - 1 || _my < ch_y + _ch_h)) { + for( var j = 0; j < _l; j++ ) { _chr = string_char_at(_str, j + 1); _ch_w = string_width(_chr); ch_cxn = ch_x + _ch_w / 2; - if(ch_cxo <= _mx && _mx <= ch_cxn) { + if(_mx <= ch_cxn) { target = char_run + j; + _found_char = true; break; } ch_x += _ch_w; ch_cxo = ch_cxn; } + + if(!_found_char) target = char_run + _l; + _found_char = true; break; } char_run += string_length(_input_text_line[i]); ch_y += _ch_h; } + + if(ch_y <= _my && !_found_char) target = char_run - 1; } - if(target != -999 && HOVER != o_dialog_textbox_autocomplete.id) { - if(mouse_press(mb_left, active) && !click_block) { + if(target != undefined) { + if(mouse_press(mb_left, active) && !click_block && (HOVER != o_dialog_textbox_autocomplete.id || cursor_selecting)) { + cursor_selecting = true; cursor_select = target; - cursor = target; - } else if(mouse_click(mb_left, active) && cursor != target) { cursor = target; - } + + o_dialog_textbox_autocomplete.deactivate(self); + } - if(mouse_press(mb_left, active)) - click_block = false; + if(mouse_click(mb_left, active)) + cursor = target; + click_block = false; } + + if(mouse_release(mb_left)) + cursor_selecting = false; } #endregion static drawParam = function(params) { #region @@ -772,14 +778,7 @@ function textArea(_input, _onModify) : textInput(_input, _onModify) constructor cursor_pos_y = cursor_pos_y == 0? cursor_pos_y_to : lerp_float(cursor_pos_y, cursor_pos_y_to, 2); #endregion - var _mx = -1; - var _my = -1; - if(hover && hoverRect) { - _mx = _m[0]; - _my = _m[1]; - } - - display_text(tx, _y + ui(7), _input_text, _mx, _my); + display_text(tx, _y + ui(7), _input_text, _m[0], _m[1], (hover && hoverRect) || cursor_selecting); if(cursor_pos_y != 0 && cursor_pos_x != 0) { draw_set_color(COLORS._main_text_accent); diff --git a/sprites/s_node_3d_transform_scene/031cf87d-4ed8-41be-a3bc-de418b818944.png b/sprites/s_node_3d_transform_scene/031cf87d-4ed8-41be-a3bc-de418b818944.png new file mode 100644 index 0000000000000000000000000000000000000000..9029585dd96a72f184949d8014d81817188f1116 GIT binary patch literal 2631 zcmZ{mc{CKnX;UmlW?s$=JN2vSXSG|N|l}P#pb|f_nH?s7pCQP~BI&EJk(vEDQ-q`nU+7-BseE{` z9gT35xY_@~LeRtzz#s2=^sIf++$>%gnIzO!1DN~H?CyJL7*+mOv6wQwbB3Ngu{$r9 zMa}LmJiW;_C^)xdoTtRJE1E2zFo{quQ}1~q#@V?B75RLhz9FD7?P1gxUYs#_@^OSd z?)G`t#ejf-k80U}XNi|knDXmCJ47U?!4&H=`64C@ag$;nw6<>#CiO&KoP2pF+q&Fb zBJADkN3YuQeI)YL7GJ6-4lQwq7hj?j28Jxq-jGI@(?mVrtsb1Z`U5vnFsxQy%KVPK zd?6qQkQ_Bdk1jV}>)-yA(VWRhEfq?_1aA+$+-D+(YnKH0lDAo3gF&O_HT)gIai_Xy zF*C&rlZHG zQ3?RnKMs`RI$FG<5LX4_8aTS5(rLzc=a*l?-9f&2H&m>EE%h z%lh+dw_p0tuSK3kc@_B1vY9IMYr{?Q-So*@;iZn>VJ=*PI=RHRFlLjOvlI1(snewV zU#b4-EX?zvn!O^shl!Qb=8LE#tS^)}bJ2H>iGdQyFbw>~-*4#6CZKbEQQ+`+ zI6P}uR*JtPV)39}%hI^xLTxU0yLw7aDFWY;?i?fHFj|YUwLG|(iuKhTF9d8@^DxK?b%oz)3;7w5A-yvQtq2%RO+nHH zOGF*7fIoOofym6tTbqyAq4XNIZ+C#`j1@n=rsHEV37)RdR*t}?BVKl)t;rolL3gZzYwzPjHY0pvh9Pdmw9j2_;vh?8XI(-{L%m@YFmn zDcGwawHvzI>i$ zZW0oDwn(X*Zi>4VR+-SnD%<^aTA*s;OT&1Dqq;MAVM`MS?R57cpZc6CdyTDMte+`l zsrI?-iW22L<2Y&Wn)i6YsB`?j*rwqfQv-R+V~lc}k`wFRx@xbnmD56Ctla0!{pHC$ z8jZZ6^*#{rCM&*hD_Gx-iNj}H#wiGWC<@+D1ui$?N)}kVuW>%`eVCo)DMXr__6>by zB^56%Ug7z>=W^5fR?ziDTxZL6Q|}HKjtpOx9KT6+XNBkj~+?id7 zfz2M4ra*J>)Nt$)V8j4BYi?q$+NFxi8|XN#GeM_copO0vRmD|O6q;Q#r*HciDN!r* zLF+mVIH_PO&QinJ?5v~e%O$1Zwz!rT$h|{jA1%feLOA)PZ>(kHtl~7k64zL;vH_m1YZbkdWORUs=wSkDR>^4<3J*AxLB{3bS*y`vEz{ zD?!JSVSwe~`}Jfkj9~JV{fvW-UMV?TIH^b=9%-kZdsFeHe4TQD#L<}&-VI-rG!_7t zI)l}jT^gM75CwYPq5((%_n^=M8olnfHN+A!m>8aUBP=gnG(TqKSe zdk!-!AHa34S$N``KLTMvf3ObQ<_wC=-HEl*`h4psXnry@2lwD?=OIFY6u6SRcR=Hf z399c#rV{&Kr5tMR9O{J$^@d|Zyx9VDwRKNu>F8)_8#wCd!gclF+NU(Mwc*;@b{&=W y{|5vFdHMN7{5N1!D7VB0j{Wb3P`?0gLMSHS`hPQicZ^Q38DM2@YgS|G5&sV|<-pef literal 0 HcmV?d00001 diff --git a/sprites/s_node_3d_transform_scene/layers/031cf87d-4ed8-41be-a3bc-de418b818944/9069c1ea-e01a-426d-83f7-ec3a5af24830.png b/sprites/s_node_3d_transform_scene/layers/031cf87d-4ed8-41be-a3bc-de418b818944/9069c1ea-e01a-426d-83f7-ec3a5af24830.png new file mode 100644 index 0000000000000000000000000000000000000000..9029585dd96a72f184949d8014d81817188f1116 GIT binary patch literal 2631 zcmZ{mc{CKnX;UmlW?s$=JN2vSXSG|N|l}P#pb|f_nH?s7pCQP~BI&EJk(vEDQ-q`nU+7-BseE{` z9gT35xY_@~LeRtzz#s2=^sIf++$>%gnIzO!1DN~H?CyJL7*+mOv6wQwbB3Ngu{$r9 zMa}LmJiW;_C^)xdoTtRJE1E2zFo{quQ}1~q#@V?B75RLhz9FD7?P1gxUYs#_@^OSd z?)G`t#ejf-k80U}XNi|knDXmCJ47U?!4&H=`64C@ag$;nw6<>#CiO&KoP2pF+q&Fb zBJADkN3YuQeI)YL7GJ6-4lQwq7hj?j28Jxq-jGI@(?mVrtsb1Z`U5vnFsxQy%KVPK zd?6qQkQ_Bdk1jV}>)-yA(VWRhEfq?_1aA+$+-D+(YnKH0lDAo3gF&O_HT)gIai_Xy zF*C&rlZHG zQ3?RnKMs`RI$FG<5LX4_8aTS5(rLzc=a*l?-9f&2H&m>EE%h z%lh+dw_p0tuSK3kc@_B1vY9IMYr{?Q-So*@;iZn>VJ=*PI=RHRFlLjOvlI1(snewV zU#b4-EX?zvn!O^shl!Qb=8LE#tS^)}bJ2H>iGdQyFbw>~-*4#6CZKbEQQ+`+ zI6P}uR*JtPV)39}%hI^xLTxU0yLw7aDFWY;?i?fHFj|YUwLG|(iuKhTF9d8@^DxK?b%oz)3;7w5A-yvQtq2%RO+nHH zOGF*7fIoOofym6tTbqyAq4XNIZ+C#`j1@n=rsHEV37)RdR*t}?BVKl)t;rolL3gZzYwzPjHY0pvh9Pdmw9j2_;vh?8XI(-{L%m@YFmn zDcGwawHvzI>i$ zZW0oDwn(X*Zi>4VR+-SnD%<^aTA*s;OT&1Dqq;MAVM`MS?R57cpZc6CdyTDMte+`l zsrI?-iW22L<2Y&Wn)i6YsB`?j*rwqfQv-R+V~lc}k`wFRx@xbnmD56Ctla0!{pHC$ z8jZZ6^*#{rCM&*hD_Gx-iNj}H#wiGWC<@+D1ui$?N)}kVuW>%`eVCo)DMXr__6>by zB^56%Ug7z>=W^5fR?ziDTxZL6Q|}HKjtpOx9KT6+XNBkj~+?id7 zfz2M4ra*J>)Nt$)V8j4BYi?q$+NFxi8|XN#GeM_copO0vRmD|O6q;Q#r*HciDN!r* zLF+mVIH_PO&QinJ?5v~e%O$1Zwz!rT$h|{jA1%feLOA)PZ>(kHtl~7k64zL;vH_m1YZbkdWORUs=wSkDR>^4<3J*AxLB{3bS*y`vEz{ zD?!JSVSwe~`}Jfkj9~JV{fvW-UMV?TIH^b=9%-kZdsFeHe4TQD#L<}&-VI-rG!_7t zI)l}jT^gM75CwYPq5((%_n^=M8olnfHN+A!m>8aUBP=gnG(TqKSe zdk!-!AHa34S$N``KLTMvf3ObQ<_wC=-HEl*`h4psXnry@2lwD?=OIFY6u6SRcR=Hf z399c#rV{&Kr5tMR9O{J$^@d|Zyx9VDwRKNu>F8)_8#wCd!gclF+NU(Mwc*;@b{&=W y{|5vFdHMN7{5N1!D7VB0j{Wb3P`?0gLMSHS`hPQicZ^Q38DM2@YgS|G5&sV|<-pef literal 0 HcmV?d00001 diff --git a/sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy b/sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy new file mode 100644 index 000000000..355fc744a --- /dev/null +++ b/sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy @@ -0,0 +1,74 @@ +{ + "resourceType": "GMSprite", + "resourceVersion": "1.0", + "name": "s_node_3d_transform_scene", + "bbox_bottom": 57, + "bbox_left": 0, + "bbox_right": 63, + "bbox_top": 5, + "bboxMode": 0, + "collisionKind": 1, + "collisionTolerance": 0, + "DynamicTexturePage": false, + "edgeFiltering": false, + "For3D": false, + "frames": [ + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"031cf87d-4ed8-41be-a3bc-de418b818944",}, + ], + "gridX": 0, + "gridY": 0, + "height": 64, + "HTile": false, + "layers": [ + {"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"9069c1ea-e01a-426d-83f7-ec3a5af24830","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,}, + ], + "nineSlice": null, + "origin": 4, + "parent": { + "name": "3D", + "path": "folders/nodes/icons/3D.yy", + }, + "preMultiplyAlpha": false, + "sequence": { + "resourceType": "GMSequence", + "resourceVersion": "1.4", + "name": "s_node_3d_transform_scene", + "autoRecord": true, + "backdropHeight": 768, + "backdropImageOpacity": 0.5, + "backdropImagePath": "", + "backdropWidth": 1366, + "backdropXOffset": 0.0, + "backdropYOffset": 0.0, + "events": {"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[],}, + "eventStubScript": null, + "eventToFunction": {}, + "length": 1.0, + "lockOrigin": false, + "moments": {"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[],}, + "playback": 1, + "playbackSpeed": 30.0, + "playbackSpeedType": 0, + "showBackdrop": true, + "showBackdropImage": false, + "timeUnits": 1, + "tracks": [ + {"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[ + {"resourceType":"Keyframe","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"031cf87d-4ed8-41be-a3bc-de418b818944","path":"sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy",},},},"Disabled":false,"id":"48459f52-10f0-45e8-a728-0984d9fbe750","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,}, + ],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange": null, + "volume": 1.0, + "xorigin": 32, + "yorigin": 32, + }, + "swatchColours": null, + "swfPrecision": 2.525, + "textureGroupId": { + "name": "Default", + "path": "texturegroups/Default", + }, + "type": 0, + "VTile": false, + "width": 64, +} \ No newline at end of file diff --git a/sprites/s_node_uv_remap/e3bedd7f-13ed-4e53-8d17-b78d1d4d9d6a.png b/sprites/s_node_uv_remap/e3bedd7f-13ed-4e53-8d17-b78d1d4d9d6a.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab39569770127a534566c0806432185eef76bfa GIT binary patch literal 2473 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 vhX#","resourceVersion":"1.0","Keyframes":[],}, + "eventStubScript": null, + "eventToFunction": {}, + "length": 1.0, + "lockOrigin": false, + "moments": {"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[],}, + "playback": 1, + "playbackSpeed": 30.0, + "playbackSpeedType": 0, + "showBackdrop": true, + "showBackdropImage": false, + "timeUnits": 1, + "tracks": [ + {"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[ + {"resourceType":"Keyframe","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"e3bedd7f-13ed-4e53-8d17-b78d1d4d9d6a","path":"sprites/s_node_uv_remap/s_node_uv_remap.yy",},},},"Disabled":false,"id":"17e2963e-5d4c-4b4f-98cd-1931a1665e93","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,}, + ],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange": null, + "volume": 1.0, + "xorigin": 32, + "yorigin": 32, + }, + "swatchColours": null, + "swfPrecision": 2.525, + "textureGroupId": { + "name": "Default", + "path": "texturegroups/Default", + }, + "type": 0, + "VTile": false, + "width": 64, +} \ No newline at end of file