From 97c291540681df1eba14351cb5539384b9f3f094 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Thu, 16 Nov 2023 20:22:38 +0700 Subject: [PATCH] 3D image transform node. --- PixelComposer.resource_order | 20 ++-- PixelComposer.yyp | 2 + scripts/__node_3d_object/__node_3d_object.gml | 4 + scripts/globals/globals.gml | 6 +- scripts/node_3d_camera/node_3d_camera.gml | 32 ++--- .../node_3d_mesh_plane.gml | 43 +++++++ .../node_3d_transform_image.gml | 110 ++++++++++++++++++ .../node_3d_transform_image.yy | 11 ++ .../node_3d_transform_image/node_counter.yy | 12 ++ scripts/node_data/node_data.gml | 3 +- .../node_palette_extract.gml | 2 +- scripts/node_registry/node_registry.gml | 11 +- .../fd1959b6-75b9-42a3-b449-4ec476e5d3b7.png | Bin 0 -> 1930 bytes .../6ab7e1e4-082d-417e-a93e-4ae569a8492c.png | Bin 0 -> 1930 bytes .../s_node_image_transform_3d.yy | 74 ++++++++++++ 15 files changed, 296 insertions(+), 34 deletions(-) create mode 100644 scripts/node_3d_transform_image/node_3d_mesh_plane.gml create mode 100644 scripts/node_3d_transform_image/node_3d_transform_image.gml create mode 100644 scripts/node_3d_transform_image/node_3d_transform_image.yy create mode 100644 scripts/node_3d_transform_image/node_counter.yy create mode 100644 sprites/s_node_image_transform_3d/fd1959b6-75b9-42a3-b449-4ec476e5d3b7.png create mode 100644 sprites/s_node_image_transform_3d/layers/fd1959b6-75b9-42a3-b449-4ec476e5d3b7/6ab7e1e4-082d-417e-a93e-4ae569a8492c.png create mode 100644 sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 4e6084a46..ebff0f259 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -96,12 +96,12 @@ {"name":"3D","order":20,"path":"folders/nodes/data/3D.yy",}, {"name":"primitive","order":9,"path":"folders/nodes/data/3D/__legacy/primitive.yy",}, {"name":"2d effects","order":1,"path":"folders/nodes/data/3D/2d effects.yy",}, - {"name":"d3d camera","order":12,"path":"folders/nodes/data/3D/d3d camera.yy",}, - {"name":"d3d compose","order":8,"path":"folders/nodes/data/3D/d3d compose.yy",}, - {"name":"d3d light","order":6,"path":"folders/nodes/data/3D/d3d light.yy",}, - {"name":"d3d mesh","order":4,"path":"folders/nodes/data/3D/d3d mesh.yy",}, - {"name":"d3d modifier","order":9,"path":"folders/nodes/data/3D/d3d modifier.yy",}, - {"name":"d3d particle","order":10,"path":"folders/nodes/data/3D/d3d particle.yy",}, + {"name":"d3d camera","order":11,"path":"folders/nodes/data/3D/d3d camera.yy",}, + {"name":"d3d compose","order":7,"path":"folders/nodes/data/3D/d3d compose.yy",}, + {"name":"d3d light","order":5,"path":"folders/nodes/data/3D/d3d light.yy",}, + {"name":"d3d mesh","order":3,"path":"folders/nodes/data/3D/d3d mesh.yy",}, + {"name":"d3d modifier","order":8,"path":"folders/nodes/data/3D/d3d modifier.yy",}, + {"name":"d3d particle","order":9,"path":"folders/nodes/data/3D/d3d particle.yy",}, {"name":"animation","order":6,"path":"folders/nodes/data/animation.yy",}, {"name":"compose","order":11,"path":"folders/nodes/data/compose.yy",}, {"name":"armature","order":3,"path":"folders/nodes/data/compose/armature.yy",}, @@ -274,7 +274,7 @@ {"name":"__node_process_template","order":18,"path":"scripts/__node_process_template/__node_process_template.yy",}, {"name":"__node_3d_obj","order":4,"path":"scripts/__node_3d_obj/__node_3d_obj.yy",}, {"name":"__path","order":1,"path":"scripts/__path/__path.yy",}, - {"name":"node_3d_point_affector","order":11,"path":"scripts/node_3d_point_affector/node_3d_point_affector.yy",}, + {"name":"node_3d_point_affector","order":10,"path":"scripts/node_3d_point_affector/node_3d_point_affector.yy",}, {"name":"draw_text_path","order":25,"path":"scripts/draw_text_path/draw_text_path.yy",}, {"name":"sh_brush_outline","order":7,"path":"shaders/sh_brush_outline/sh_brush_outline.yy",}, {"name":"s_node_grid_tri_noise","order":22,"path":"sprites/s_node_grid_tri_noise/s_node_grid_tri_noise.yy",}, @@ -483,7 +483,7 @@ {"name":"byte_writer","order":8,"path":"scripts/byte_writer/byte_writer.yy",}, {"name":"checkboxGroup","order":28,"path":"scripts/checkboxGroup/checkboxGroup.yy",}, {"name":"node_FXAA","order":8,"path":"scripts/node_FXAA/node_FXAA.yy",}, - {"name":"__node_3d_object","order":5,"path":"scripts/__node_3d_object/__node_3d_object.yy",}, + {"name":"__node_3d_object","order":4,"path":"scripts/__node_3d_object/__node_3d_object.yy",}, {"name":"s_node_pixel_find","order":13,"path":"sprites/s_node_pixel_find/s_node_pixel_find.yy",}, {"name":"s_biterator_canvas_cover","order":16,"path":"sprites/s_biterator_canvas_cover/s_biterator_canvas_cover.yy",}, {"name":"sh_noise_grid_tri","order":3,"path":"shaders/sh_noise_grid_tri/sh_noise_grid_tri.yy",}, @@ -501,6 +501,7 @@ {"name":"s_node_HSV_combine","order":44,"path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",}, {"name":"Obj_FirebaseFirestore_Collection_Query_GreaterEqual","order":5,"path":"objects/Obj_FirebaseFirestore_Collection_Query_GreaterEqual/Obj_FirebaseFirestore_Collection_Query_GreaterEqual.yy",}, {"name":"s_node_pb_box_contract","order":25,"path":"sprites/s_node_pb_box_contract/s_node_pb_box_contract.yy",}, + {"name":"s_node_image_transform_3d","order":25,"path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",}, {"name":"node_normal_light","order":2,"path":"scripts/node_normal_light/node_normal_light.yy",}, {"name":"o_dialog_release_note","order":8,"path":"objects/o_dialog_release_note/o_dialog_release_note.yy",}, {"name":"sh_fd_advect_material_rgba_16_glsl","order":4,"path":"shaders/sh_fd_advect_material_rgba_16_glsl/sh_fd_advect_material_rgba_16_glsl.yy",}, @@ -785,7 +786,7 @@ {"name":"draw_sprite_ext_override","order":9,"path":"scripts/draw_sprite_ext_override/draw_sprite_ext_override.yy",}, {"name":"node_array_add","order":6,"path":"scripts/node_array_add/node_array_add.yy",}, {"name":"o_dialog_textbox_function_guide","order":8,"path":"objects/o_dialog_textbox_function_guide/o_dialog_textbox_function_guide.yy",}, - {"name":"node_3d_material","order":7,"path":"scripts/node_3d_material/node_3d_material.yy",}, + {"name":"node_3d_material","order":6,"path":"scripts/node_3d_material/node_3d_material.yy",}, {"name":"pcx_server","order":2,"path":"scripts/pcx_server/pcx_server.yy",}, {"name":"s_node_array_set","order":9,"path":"sprites/s_node_array_set/s_node_array_set.yy",}, {"name":"node_dust","order":19,"path":"scripts/node_dust/node_dust.yy",}, @@ -1714,6 +1715,7 @@ {"name":"node_iterator_sort_input","order":1,"path":"scripts/node_iterator_sort_input/node_iterator_sort_input.yy",}, {"name":"draw_corner","order":19,"path":"scripts/draw_corner/draw_corner.yy",}, {"name":"o_dialog_preference","order":7,"path":"objects/o_dialog_preference/o_dialog_preference.yy",}, + {"name":"node_3d_transform_image","order":12,"path":"scripts/node_3d_transform_image/node_3d_transform_image.yy",}, {"name":"node_wrap","order":2,"path":"scripts/node_wrap/node_wrap.yy",}, {"name":"__node_3d_prim_sphere","order":3,"path":"scripts/__node_3d_prim_sphere/__node_3d_prim_sphere.yy",}, {"name":"tooltip_selector_object","order":1,"path":"scripts/tooltip_selector_object/tooltip_selector_object.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 2c86ba583..ed670a66a 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1098,6 +1098,7 @@ {"id":{"name":"s_node_HSV_combine","path":"sprites/s_node_HSV_combine/s_node_HSV_combine.yy",},}, {"id":{"name":"Obj_FirebaseFirestore_Collection_Query_GreaterEqual","path":"objects/Obj_FirebaseFirestore_Collection_Query_GreaterEqual/Obj_FirebaseFirestore_Collection_Query_GreaterEqual.yy",},}, {"id":{"name":"s_node_pb_box_contract","path":"sprites/s_node_pb_box_contract/s_node_pb_box_contract.yy",},}, + {"id":{"name":"s_node_image_transform_3d","path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",},}, {"id":{"name":"node_normal_light","path":"scripts/node_normal_light/node_normal_light.yy",},}, {"id":{"name":"o_dialog_release_note","path":"objects/o_dialog_release_note/o_dialog_release_note.yy",},}, {"id":{"name":"sh_fd_advect_material_rgba_16_glsl","path":"shaders/sh_fd_advect_material_rgba_16_glsl/sh_fd_advect_material_rgba_16_glsl.yy",},}, @@ -2493,6 +2494,7 @@ {"id":{"name":"o_dialog_preference","path":"objects/o_dialog_preference/o_dialog_preference.yy",},}, {"id":{"name":"node_pb_fx","path":"scripts/node_pb_fx/node_pb_fx.yy",},}, {"id":{"name":"s_node_smokeSim_render_output","path":"sprites/s_node_smokeSim_render_output/s_node_smokeSim_render_output.yy",},}, + {"id":{"name":"node_3d_transform_image","path":"scripts/node_3d_transform_image/node_3d_transform_image.yy",},}, {"id":{"name":"node_wrap","path":"scripts/node_wrap/node_wrap.yy",},}, {"id":{"name":"__node_3d_prim_sphere","path":"scripts/__node_3d_prim_sphere/__node_3d_prim_sphere.yy",},}, {"id":{"name":"o_dialog_about","path":"objects/o_dialog_about/o_dialog_about.yy",},}, diff --git a/scripts/__node_3d_object/__node_3d_object.gml b/scripts/__node_3d_object/__node_3d_object.gml index 38ac411d2..0736fa6cb 100644 --- a/scripts/__node_3d_object/__node_3d_object.gml +++ b/scripts/__node_3d_object/__node_3d_object.gml @@ -594,8 +594,12 @@ function Node_3D_Object(_x, _y, _group = noone) : Node_3D(_x, _y, _group) constr drag_axis = noone; UNDO_HOLDING = false; } + + if(onDrawOverlay3D != 0) onDrawOverlay3D(active, params, _mx, _my, _snx, _sny, _panel); } #endregion + static onDrawOverlay3D = 0; + static setTransform = function(object, _data) { #region if(object == noone) return; var _pos = _data[0]; diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index aeacf76de..0d0324130 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -25,10 +25,10 @@ globalvar VERSION, SAVE_VERSION, VERSION_STRING, BUILD_NUMBER; - VERSION = 11571; + VERSION = 11600; SAVE_VERSION = 11570; - VERSION_STRING = "1.15.7.1"; - BUILD_NUMBER = 11571; + VERSION_STRING = "1.16rc1"; + BUILD_NUMBER = 11600; globalvar APPEND_MAP; APPEND_MAP = ds_map_create(); diff --git a/scripts/node_3d_camera/node_3d_camera.gml b/scripts/node_3d_camera/node_3d_camera.gml index d00f6b9b3..ddd39494d 100644 --- a/scripts/node_3d_camera/node_3d_camera.gml +++ b/scripts/node_3d_camera/node_3d_camera.gml @@ -129,25 +129,27 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) UNDO_HOLDING = false; } - var _outSurf = outputs[| 0].getValue(); - if(is_array(_outSurf)) _outSurf = array_safe_get(_outSurf, 0); - if(!is_surface(_outSurf)) return; + #region draw result + var _outSurf = outputs[| 0].getValue(); + if(is_array(_outSurf)) _outSurf = array_safe_get(_outSurf, 0); + if(!is_surface(_outSurf)) return; - var _w = _panel.w; - var _h = _panel.h - _panel.toolbar_height; - var _pw = surface_get_width_safe(_outSurf); - var _ph = surface_get_height_safe(_outSurf); - var _ps = min(128 / _ph, 160 / _pw); + var _w = _panel.w; + var _h = _panel.h - _panel.toolbar_height; + var _pw = surface_get_width_safe(_outSurf); + var _ph = surface_get_height_safe(_outSurf); + var _ps = min(128 / _ph, 160 / _pw); - var _pws = _pw * _ps; - var _phs = _ph * _ps; + var _pws = _pw * _ps; + var _phs = _ph * _ps; - var _px = _w - 16 - _pws; - var _py = _h - 16 - _phs; + var _px = _w - 16 - _pws; + var _py = _h - 16 - _phs; - draw_surface_ext_safe(_outSurf, _px, _py, _ps, _ps); - draw_set_color(COLORS._main_icon); - draw_rectangle(_px, _py, _px + _pws, _py + _phs, true); + draw_surface_ext_safe(_outSurf, _px, _py, _ps, _ps); + draw_set_color(COLORS._main_icon); + draw_rectangle(_px, _py, _px + _pws, _py + _phs, true); + #endregion } #endregion static onValueUpdate = function(index) { #region diff --git a/scripts/node_3d_transform_image/node_3d_mesh_plane.gml b/scripts/node_3d_transform_image/node_3d_mesh_plane.gml new file mode 100644 index 000000000..55538a0b0 --- /dev/null +++ b/scripts/node_3d_transform_image/node_3d_mesh_plane.gml @@ -0,0 +1,43 @@ +function Node_3D_Mesh_Plane(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "3D Plane"; + + object_class = __3dPlane; + + inputs[| in_mesh + 0] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); + + inputs[| in_mesh + 1] = nodeValue("Normal", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 2 ) + .setDisplay(VALUE_DISPLAY.enum_button, [ "X", "Y", "Z" ]); + + inputs[| in_mesh + 2] = nodeValue("Both side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ) + + inputs[| in_mesh + 3] = nodeValue("Back Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + + input_display_list = [ + __d3d_input_list_mesh, in_mesh + 1, + __d3d_input_list_transform, + ["Material", false], in_mesh + 2, in_mesh + 0, in_mesh + 3, + ] + + static step = function() { + var _both = getSingleValue(in_mesh + 2); + inputs[| in_mesh + 3].setVisible(_both, _both); + } + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var _mat = _data[in_mesh + 0]; + var _axs = _data[in_mesh + 1]; + var _both = _data[in_mesh + 2]; + var _bmat = _data[in_mesh + 3]; + + var object = getObject(_array_index); + object.checkParameter({ normal: _axs, two_side: _both }); + object.materials = _both? [ _mat, _bmat ] : [ _mat ]; + + setTransform(object, _data); + + return object; + } #endregion + + static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 0, noone); } +} \ No newline at end of file diff --git a/scripts/node_3d_transform_image/node_3d_transform_image.gml b/scripts/node_3d_transform_image/node_3d_transform_image.gml new file mode 100644 index 000000000..059437d6c --- /dev/null +++ b/scripts/node_3d_transform_image/node_3d_transform_image.gml @@ -0,0 +1,110 @@ +function Node_3D_Transform_Image(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "Transform 3D"; + + preview_channel = 1; + object = new __3dPlane(); + object.checkParameter({ normal: 2 }); + + objectPreview = new __3dPlane(); + objectPreview.checkParameter({ normal: 2 }); + materialPreview = new __d3dMaterial(); + objectPreview.materials[0] = materialPreview; + + camera = camera_create(); + viewMat = matrix_build_lookat(0, 0, 1, + 0, 0, 0, + 1, 0, 0); + + projMat = matrix_build_projection_ortho(1, 1, 0.001, 10); + + + inputs[| in_mesh + 0] = nodeValue("Surface", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ) + .setVisible(true, true); + + input_display_list = [ + ["Material", false], in_mesh + 0, + __d3d_input_list_transform, + ] + + outputs[| 0].setVisible(false); + outputs[| 1] = nodeValue("Rendered", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); + + output_display_list = [ 1 ] + + static onDrawOverlay3D = function(active, params, _mx, _my, _snx, _sny, _panel) { + #region draw result + var _outSurf = outputs[| 1].getValue(); + if(is_array(_outSurf)) _outSurf = array_safe_get(_outSurf, preview_index); + if(!is_surface(_outSurf)) return; + + var _w = _panel.w; + var _h = _panel.h - _panel.toolbar_height; + var _pw = surface_get_width_safe(_outSurf); + var _ph = surface_get_height_safe(_outSurf); + var _ps = min(128 / _ph, 160 / _pw); + + var _pws = _pw * _ps; + var _phs = _ph * _ps; + + var _px = _w - 16 - _pws; + var _py = _h - 16 - _phs; + + draw_surface_ext_safe(_outSurf, _px, _py, _ps, _ps); + draw_set_color(COLORS._main_icon); + draw_rectangle(_px, _py, _px + _pws, _py + _phs, true); + #endregion + } + + static processData = function(_output, _data, _output_index, _array_index = 0) { #region + var _surf = _data[in_mesh + 0]; + if(!is_surface(_surf)) return 0; + + if(_output_index == 0) { + object.materials = [ new __d3dMaterial(_surf) ]; + setTransform(object, _data); + + if(_array_index == preview_index) { + materialPreview.surface = _surf; + setTransform(objectPreview, _data); + } + return object; + } + + if(_output_index == 1) { + _output = surface_verify(_output, surface_get_width_safe(_surf), surface_get_height_safe(_surf)); + surface_set_target(_output); + DRAW_CLEAR + camera_set_view_mat(camera, viewMat); + camera_set_proj_mat(camera, projMat); + camera_apply(camera); + + object.transform.submitMatrix(); + matrix_set(matrix_world, matrix_stack_top()); + + vertex_submit(object.VB[0], pr_trianglelist, surface_get_texture(_surf)); + + object.transform.clearMatrix(); + matrix_set(matrix_world, matrix_build_identity()); + + camera_apply(0); + surface_reset_target(); + + return _output; + } + + return 0; + } #endregion + + static getPreviewObject = function() { return objectPreview; } + + static getPreviewValues = function() { return array_safe_get(all_inputs, in_mesh + 0, noone); } + + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover = false, _focus = false) { #region + var _surf = outputs[| 1].getValue(); + if(is_array(_surf)) _surf = array_safe_get(_surf[preview_index]); + if(!is_surface(_surf)) return; + + var bbox = drawGetBbox(xx, yy, _s); + draw_surface_bbox(_surf, bbox); + } #endregion +} \ No newline at end of file diff --git a/scripts/node_3d_transform_image/node_3d_transform_image.yy b/scripts/node_3d_transform_image/node_3d_transform_image.yy new file mode 100644 index 000000000..caa74e3c2 --- /dev/null +++ b/scripts/node_3d_transform_image/node_3d_transform_image.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "node_3d_transform_image", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "3D", + "path": "folders/nodes/data/3D.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_3d_transform_image/node_counter.yy b/scripts/node_3d_transform_image/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_transform_image/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_data/node_data.gml b/scripts/node_data/node_data.gml index ddf11f988..c21a93130 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -295,6 +295,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x var _hi = ui(junction_draw_pad_y); var _ho = ui(junction_draw_pad_y); + var _prev_surf = previewable && (preview_channel < ds_list_size(outputs) && outputs[| preview_channel].type == VALUE_TYPE.surface); for( var i = 0; i < ds_list_size(inputs); i++ ) { var _inp = inputs[| i]; @@ -308,7 +309,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x for( var i = 0; i < ds_list_size(outputs); i++ ) if(outputs[| i].isVisible()) _ho += 24; - h = max(min_h, previewable * 128, _hi, _ho); + h = max(min_h, _prev_surf * 128, _hi, _ho); } run_in(1, function() { setHeight(); }); #endregion static setDisplayName = function(_name) { #region diff --git a/scripts/node_palette_extract/node_palette_extract.gml b/scripts/node_palette_extract/node_palette_extract.gml index b3b18df14..0ba8157a0 100644 --- a/scripts/node_palette_extract/node_palette_extract.gml +++ b/scripts/node_palette_extract/node_palette_extract.gml @@ -11,7 +11,7 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node(_x, _y, _group) con .rejectArray(); inputs[| 3] = nodeValue("Algorithm", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) - .setDisplay(VALUE_DISPLAY.enum_scroll, [ "K-mean", "Frequency", "All colors" ]) + .setDisplay(VALUE_DISPLAY.enum_scroll, { data: [ "K-mean", "Frequency", "All colors" ], update_hover: false }) .rejectArray(); outputs[| 0] = nodeValue("Palette", self, JUNCTION_CONNECT.output, VALUE_TYPE.color, [ ]) diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index de6943752..85827436b 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -498,11 +498,12 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio addNodeObject(d3d, "Sprite Stack", s_node_stack, "Node_Sprite_Stack", [1, Node_Sprite_Stack],, "Create sprite stack either from repeating a single image or stacking different images using array."); ds_list_add(d3d, "3D"); - addNodeObject(d3d, "3D Camera", s_node_3d_camera, "Node_3D_Camera", [1, Node_3D_Camera]).setVersion(11510); - addNodeObject(d3d, "3D Camera Set", s_node_3d_camera_set, "Node_3D_Camera_Set", [1, Node_3D_Camera_Set]).setVersion(11571); - addNodeObject(d3d, "3D Material", s_node_3d_meterial, "Node_3D_Material", [1, Node_3D_Material]).setVersion(11510); - addNodeObject(d3d, "3D Scene", s_node_3d_scene, "Node_3D_Scene", [1, Node_3D_Scene]).setVersion(11510); - addNodeObject(d3d, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat]).setVersion(11510); + addNodeObject(d3d, "3D Camera", s_node_3d_camera, "Node_3D_Camera", [1, Node_3D_Camera]).setVersion(11510); + addNodeObject(d3d, "3D Camera Set", s_node_3d_camera_set, "Node_3D_Camera_Set", [1, Node_3D_Camera_Set]).setVersion(11571); + addNodeObject(d3d, "3D Material", s_node_3d_meterial, "Node_3D_Material", [1, Node_3D_Material]).setVersion(11510); + addNodeObject(d3d, "3D Scene", s_node_3d_scene, "Node_3D_Scene", [1, Node_3D_Scene]).setVersion(11510); + addNodeObject(d3d, "3D Repeat", s_node_3d_array, "Node_3D_Repeat", [1, Node_3D_Repeat]).setVersion(11510); + addNodeObject(d3d, "Transform 3D", s_node_image_transform_3d, "Node_3D_Transform_Image", [1, Node_3D_Transform_Image],, "Transform image in 3D space").setVersion(11600); ds_list_add(d3d, "Mesh"); addNodeObject(d3d, "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.").setVersion(11510); diff --git a/sprites/s_node_image_transform_3d/fd1959b6-75b9-42a3-b449-4ec476e5d3b7.png b/sprites/s_node_image_transform_3d/fd1959b6-75b9-42a3-b449-4ec476e5d3b7.png new file mode 100644 index 0000000000000000000000000000000000000000..0bceda88513bdcd598029f44f1f1ec47bc5547dc GIT binary patch literal 1930 zcmZ{ldpHwpAII$7f~DXg!kstl&lSn*NKvcFU&8=k`_Vy8<5~br|vQqYof7bf& zrBJ{Dr#rY}86Vr6yk^R$9;sAUiodAS$D$!m!9hV^(|oeoqTUK8iOPx&&htSH;vXCA z>n{47*0<-VJn^PLaJ02S5roT5hY?m!9G1EHK2d9x$D2vE&1y_3p&@PIlG-E&TZKkf zyqwFMuYkTu#{19es!9XY0n46_7v@38EoL0ezkWQS^VbRBby^Nb*zpIJ@+wFeecEJg zrS5o(q3mf}w_QJ+JOI-QZRNa}W?VKoc}9%S{;HJ9;bS?fID(Ix&45P9&ZYCSyq(J8 za_IW*@MS6RPB(V))6I@5>l^gf3fuKIQ%T+sS@QGws)Zo=e`#xHtwVLYv3C$aU*VyB zQwZl~P;G_^FL zEgZ~WQEUwA9%ZJ8@oK;Ab4APKZ7J9gV?3V_bZMJ1VoV3DVe4XJ zc{`CYIwW?kV>57+laXo)K3(2X6<{87BT|z;oC*FN8F{ZKr2AYz(xBFu$q3d4c@jTu z(O?sTxnM15MO5!?uQ{`LrZL7MFSJ-Ac045N$y|XqYcLx9dSkgL+UmrqxDcptgTiQS zJqIRuf@F;4j@kkB{V_HM&fg2|+@2tCmHf`=y%E#m;ET=G7rSO44*dgNeh~%Qp}r6G z+t+-zg4I^GQO+G`iLHg!XEkMp?b)GMvA`@XrK_2_@W`iobV9+0yuT`Uf z`)xLPG^!^jzcRXPiqulq8%R*^yedqOt5rm6md)@hA$+R@?vMz5SC#EA-w9oE#SkeN zMeX{ii7mNj3nA_FN5@xYGh0e_>@Ba7285A0&;EY0?QpMgCF`U#GJb-}pPDwg-Rqd~ z25gu5SgEBT5R8nyqAn5bb?JGme$hKp_GOWX%`vaAxs!d&(bELLtk*+1k5KFZE2|qH zN^hrnc@MmOxG*Dlo5k65YF7#3K^Ug4Vw`_0Y)GRmVKDwyE;?!d6gFh$;iTEIuQ`X? zRZ4aNMooVy?4|rOLhYzuK(O~DH$MhlBB|lGx8nEkb!e+fNf2P1Cw%{eT$a?dFd|W0yExb4y=m2XWnE(&Y~4ZxecIt5OcmES^-(m9)UptLaaN{Xf+j!HT=7 z<4=0O3M<6;N`B71a;^f7V4p#u>S%8H9y;nSaV!w@Yih2T*8o2Mo{J!(QRQ6f#}9ad ztGrVJCSY`Qw|(Ht^i9X_lTHUeecN|{?z;oP#N{%kPEWDL&!c``hxV|9%hf#Yqx9qR z$4t)Xx27TME)JH9}GZ*(*B(E4}YWgLf23r!_`Q~Y&D$W zz+OUb;0|sXawX%n=}ob&=d10E952Zn%n>FQCPJ*&80Y`ipYplxU2C{RyPIF<3iOxt z?%-D*l-79sUg5W)o|6Yr#$>xSc^iOj*k3@d-pX@&0{s5ks3K1J2lQ;8n#rUR^N!?e zg40}xv?@HAk}$yC#mBkcF)Zc3%nxei literal 0 HcmV?d00001 diff --git a/sprites/s_node_image_transform_3d/layers/fd1959b6-75b9-42a3-b449-4ec476e5d3b7/6ab7e1e4-082d-417e-a93e-4ae569a8492c.png b/sprites/s_node_image_transform_3d/layers/fd1959b6-75b9-42a3-b449-4ec476e5d3b7/6ab7e1e4-082d-417e-a93e-4ae569a8492c.png new file mode 100644 index 0000000000000000000000000000000000000000..0bceda88513bdcd598029f44f1f1ec47bc5547dc GIT binary patch literal 1930 zcmZ{ldpHwpAII$7f~DXg!kstl&lSn*NKvcFU&8=k`_Vy8<5~br|vQqYof7bf& zrBJ{Dr#rY}86Vr6yk^R$9;sAUiodAS$D$!m!9hV^(|oeoqTUK8iOPx&&htSH;vXCA z>n{47*0<-VJn^PLaJ02S5roT5hY?m!9G1EHK2d9x$D2vE&1y_3p&@PIlG-E&TZKkf zyqwFMuYkTu#{19es!9XY0n46_7v@38EoL0ezkWQS^VbRBby^Nb*zpIJ@+wFeecEJg zrS5o(q3mf}w_QJ+JOI-QZRNa}W?VKoc}9%S{;HJ9;bS?fID(Ix&45P9&ZYCSyq(J8 za_IW*@MS6RPB(V))6I@5>l^gf3fuKIQ%T+sS@QGws)Zo=e`#xHtwVLYv3C$aU*VyB zQwZl~P;G_^FL zEgZ~WQEUwA9%ZJ8@oK;Ab4APKZ7J9gV?3V_bZMJ1VoV3DVe4XJ zc{`CYIwW?kV>57+laXo)K3(2X6<{87BT|z;oC*FN8F{ZKr2AYz(xBFu$q3d4c@jTu z(O?sTxnM15MO5!?uQ{`LrZL7MFSJ-Ac045N$y|XqYcLx9dSkgL+UmrqxDcptgTiQS zJqIRuf@F;4j@kkB{V_HM&fg2|+@2tCmHf`=y%E#m;ET=G7rSO44*dgNeh~%Qp}r6G z+t+-zg4I^GQO+G`iLHg!XEkMp?b)GMvA`@XrK_2_@W`iobV9+0yuT`Uf z`)xLPG^!^jzcRXPiqulq8%R*^yedqOt5rm6md)@hA$+R@?vMz5SC#EA-w9oE#SkeN zMeX{ii7mNj3nA_FN5@xYGh0e_>@Ba7285A0&;EY0?QpMgCF`U#GJb-}pPDwg-Rqd~ z25gu5SgEBT5R8nyqAn5bb?JGme$hKp_GOWX%`vaAxs!d&(bELLtk*+1k5KFZE2|qH zN^hrnc@MmOxG*Dlo5k65YF7#3K^Ug4Vw`_0Y)GRmVKDwyE;?!d6gFh$;iTEIuQ`X? zRZ4aNMooVy?4|rOLhYzuK(O~DH$MhlBB|lGx8nEkb!e+fNf2P1Cw%{eT$a?dFd|W0yExb4y=m2XWnE(&Y~4ZxecIt5OcmES^-(m9)UptLaaN{Xf+j!HT=7 z<4=0O3M<6;N`B71a;^f7V4p#u>S%8H9y;nSaV!w@Yih2T*8o2Mo{J!(QRQ6f#}9ad ztGrVJCSY`Qw|(Ht^i9X_lTHUeecN|{?z;oP#N{%kPEWDL&!c``hxV|9%hf#Yqx9qR z$4t)Xx27TME)JH9}GZ*(*B(E4}YWgLf23r!_`Q~Y&D$W zz+OUb;0|sXawX%n=}ob&=d10E952Zn%n>FQCPJ*&80Y`ipYplxU2C{RyPIF<3iOxt z?%-D*l-79sUg5W)o|6Yr#$>xSc^iOj*k3@d-pX@&0{s5ks3K1J2lQ;8n#rUR^N!?e zg40}xv?@HAk}$yC#mBkcF)Zc3%nxei literal 0 HcmV?d00001 diff --git a/sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy b/sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy new file mode 100644 index 000000000..6d087aa8a --- /dev/null +++ b/sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy @@ -0,0 +1,74 @@ +{ + "resourceType": "GMSprite", + "resourceVersion": "1.0", + "name": "s_node_image_transform_3d", + "bbox_bottom": 62, + "bbox_left": 13, + "bbox_right": 50, + "bbox_top": 1, + "bboxMode": 0, + "collisionKind": 1, + "collisionTolerance": 0, + "DynamicTexturePage": false, + "edgeFiltering": false, + "For3D": false, + "frames": [ + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"fd1959b6-75b9-42a3-b449-4ec476e5d3b7",}, + ], + "gridX": 0, + "gridY": 0, + "height": 64, + "HTile": false, + "layers": [ + {"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"6ab7e1e4-082d-417e-a93e-4ae569a8492c","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_image_transform_3d", + "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":"fd1959b6-75b9-42a3-b449-4ec476e5d3b7","path":"sprites/s_node_image_transform_3d/s_node_image_transform_3d.yy",},},},"Disabled":false,"id":"1f916d17-4fe4-4671-8559-36a8c909095f","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