From 968b2e4f9c1dbdc699a4af2077080b0b7d993424 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Wed, 5 Feb 2025 11:18:39 +0700 Subject: [PATCH] New 3D Mesh Extrude node. --- PixelComposer.resource_order | 19 ++-- PixelComposer.yyp | 4 + datafiles/data/Nodes/Internal.zip | Bin 9100580 -> 9100898 bytes .../3D/Node_3D_Mesh_Extrude_Mesh/info.json | 11 +++ datafiles/data/Nodes/display_data.json | 1 + scripts/__mesh/__mesh.gml | 43 +++++---- scripts/__shapes/__shapes.gml | 24 ++--- .../d3d_mesh_extrude_mesh.gml | 80 ++++++++++++++++ .../d3d_mesh_extrude_mesh.yy | 14 +++ .../node_3d_mesh_extrude_mesh.gml | 60 ++++++++++++ .../node_3d_mesh_extrude_mesh.yy | 14 +++ scripts/node_data/node_data.gml | 3 +- scripts/node_text/node_text.gml | 9 +- .../da92e7b3-db50-40f4-9094-49208c57e5bf.png | Bin 0 -> 3250 bytes .../4f3c6aa7-fabf-466c-8391-90f525bd768a.png | Bin 0 -> 3250 bytes .../s_node_3d_mesh_extrude_mesh.yy | 90 ++++++++++++++++++ 16 files changed, 334 insertions(+), 38 deletions(-) create mode 100644 datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Extrude_Mesh/info.json create mode 100644 scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.gml create mode 100644 scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.yy create mode 100644 scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.gml create mode 100644 scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.yy create mode 100644 sprites/s_node_3d_mesh_extrude_mesh/da92e7b3-db50-40f4-9094-49208c57e5bf.png create mode 100644 sprites/s_node_3d_mesh_extrude_mesh/layers/da92e7b3-db50-40f4-9094-49208c57e5bf/4f3c6aa7-fabf-466c-8391-90f525bd768a.png create mode 100644 sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 993ba2183..e4a160521 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -547,9 +547,10 @@ {"name":"d3d_light_directional","order":1,"path":"scripts/d3d_light_directional/d3d_light_directional.yy",}, {"name":"d3d_light_point","order":2,"path":"scripts/d3d_light_point/d3d_light_point.yy",}, {"name":"d3d_material","order":5,"path":"scripts/d3d_material/d3d_material.yy",}, + {"name":"d3d_mesh_extrude_mesh","order":19,"path":"scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.yy",}, {"name":"d3d_object_instancer","order":6,"path":"scripts/d3d_object_instancer/d3d_object_instancer.yy",}, {"name":"d3d_object","order":2,"path":"scripts/d3d_object/d3d_object.yy",}, - {"name":"d3d_path_extrude","order":22,"path":"scripts/d3d_path_extrude/d3d_path_extrude.yy",}, + {"name":"d3d_path_extrude","order":24,"path":"scripts/d3d_path_extrude/d3d_path_extrude.yy",}, {"name":"d3d_plane_bend_mesh","order":16,"path":"scripts/d3d_plane_bend_mesh/d3d_plane_bend_mesh.yy",}, {"name":"d3d_plane_mesh","order":14,"path":"scripts/d3d_plane_mesh/d3d_plane_mesh.yy",}, {"name":"d3d_plane","order":2,"path":"scripts/d3d_plane/d3d_plane.yy",}, @@ -557,12 +558,12 @@ {"name":"d3d_rot3","order":3,"path":"scripts/d3d_rot3/d3d_rot3.yy",}, {"name":"d3d_scene","order":3,"path":"scripts/d3d_scene/d3d_scene.yy",}, {"name":"d3d_surface_extrude","order":18,"path":"scripts/d3d_surface_extrude/d3d_surface_extrude.yy",}, - {"name":"d3d_terrain","order":20,"path":"scripts/d3d_terrain/d3d_terrain.yy",}, - {"name":"d3d_torus","order":24,"path":"scripts/d3d_torus/d3d_torus.yy",}, + {"name":"d3d_terrain","order":22,"path":"scripts/d3d_terrain/d3d_terrain.yy",}, + {"name":"d3d_torus","order":26,"path":"scripts/d3d_torus/d3d_torus.yy",}, {"name":"d3d_transformation","order":12,"path":"scripts/d3d_transformation/d3d_transformation.yy",}, {"name":"d3d_uvsphere","order":8,"path":"scripts/d3d_uvsphere/d3d_uvsphere.yy",}, {"name":"d3d_vertex","order":10,"path":"scripts/d3d_vertex/d3d_vertex.yy",}, - {"name":"d3d_wall_builder","order":26,"path":"scripts/d3d_wall_builder/d3d_wall_builder.yy",}, + {"name":"d3d_wall_builder","order":28,"path":"scripts/d3d_wall_builder/d3d_wall_builder.yy",}, {"name":"debug","order":42,"path":"scripts/debug/debug.yy",}, {"name":"delaunay","order":1,"path":"scripts/delaunay/delaunay.yy",}, {"name":"dialog_management","order":2,"path":"scripts/dialog_management/dialog_management.yy",}, @@ -683,17 +684,18 @@ {"name":"node_3d_mesh_cube","order":2,"path":"scripts/node_3d_mesh_cube/node_3d_mesh_cube.yy",}, {"name":"node_3d_mesh_cylinder","order":5,"path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",}, {"name":"node_3d_mesh_export","order":15,"path":"scripts/node_3d_mesh_export/node_3d_mesh_export.yy",}, + {"name":"node_3d_mesh_extrude_mesh","order":18,"path":"scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.yy",}, {"name":"node_3d_mesh_extrude","order":17,"path":"scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.yy",}, {"name":"node_3d_mesh_obj","order":4,"path":"scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy",}, - {"name":"node_3d_mesh_path_extrude","order":21,"path":"scripts/node_3d_mesh_path_extrude/node_3d_mesh_path_extrude.yy",}, + {"name":"node_3d_mesh_path_extrude","order":23,"path":"scripts/node_3d_mesh_path_extrude/node_3d_mesh_path_extrude.yy",}, {"name":"node_3d_mesh_plane_bend","order":15,"path":"scripts/node_3d_mesh_plane_bend/node_3d_mesh_plane_bend.yy",}, {"name":"node_3d_mesh_plane","order":13,"path":"scripts/node_3d_mesh_plane/node_3d_mesh_plane.yy",}, {"name":"node_3d_mesh_sphere_ico","order":9,"path":"scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.yy",}, {"name":"node_3d_mesh_sphere_uv","order":7,"path":"scripts/node_3d_mesh_sphere_uv/node_3d_mesh_sphere_uv.yy",}, {"name":"node_3d_mesh_stack_slice","order":7,"path":"scripts/node_3d_mesh_stack_slice/node_3d_mesh_stack_slice.yy",}, - {"name":"node_3d_mesh_terrain","order":19,"path":"scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.yy",}, - {"name":"node_3d_mesh_torus","order":23,"path":"scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy",}, - {"name":"node_3d_mesh_wall_builder","order":25,"path":"scripts/node_3d_mesh_wall_builder/node_3d_mesh_wall_builder.yy",}, + {"name":"node_3d_mesh_terrain","order":21,"path":"scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.yy",}, + {"name":"node_3d_mesh_torus","order":25,"path":"scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy",}, + {"name":"node_3d_mesh_wall_builder","order":27,"path":"scripts/node_3d_mesh_wall_builder/node_3d_mesh_wall_builder.yy",}, {"name":"node_3d_point_affector","order":13,"path":"scripts/node_3d_point_affector/node_3d_point_affector.yy",}, {"name":"node_3d_repeat","order":1,"path":"scripts/node_3d_repeat/node_3d_repeat.yy",}, {"name":"node_3d_round_vertex","order":1,"path":"scripts/node_3d_round_vertex/node_3d_round_vertex.yy",}, @@ -1903,6 +1905,7 @@ {"name":"s_node_3d_mesh_cone","order":9,"path":"sprites/s_node_3d_mesh_cone/s_node_3d_mesh_cone.yy",}, {"name":"s_node_3d_mesh_cylinder","order":1,"path":"sprites/s_node_3d_mesh_cylinder/s_node_3d_mesh_cylinder.yy",}, {"name":"s_node_3d_mesh_export","order":31,"path":"sprites/s_node_3d_mesh_export/s_node_3d_mesh_export.yy",}, + {"name":"s_node_3d_mesh_extrude_mesh","order":39,"path":"sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy",}, {"name":"s_node_3d_mesh_extrude","order":2,"path":"sprites/s_node_3d_mesh_extrude/s_node_3d_mesh_extrude.yy",}, {"name":"s_node_3d_mesh_obj","order":3,"path":"sprites/s_node_3d_mesh_obj/s_node_3d_mesh_obj.yy",}, {"name":"s_node_3d_mesh_path_extrude","order":32,"path":"sprites/s_node_3d_mesh_path_extrude/s_node_3d_mesh_path_extrude.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index bac749565..755e4968c 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -519,6 +519,7 @@ {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Cube","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Cylinder","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Export","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, + {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Extrude_Mesh","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Extrude","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Obj","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"info.json","CopyToMask":-1,"filePath":"datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Path_Extrude","name":"info.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, @@ -1690,6 +1691,7 @@ {"id":{"name":"d3d_light_point","path":"scripts/d3d_light_point/d3d_light_point.yy",},}, {"id":{"name":"d3d_light","path":"scripts/d3d_light/d3d_light.yy",},}, {"id":{"name":"d3d_material","path":"scripts/d3d_material/d3d_material.yy",},}, + {"id":{"name":"d3d_mesh_extrude_mesh","path":"scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.yy",},}, {"id":{"name":"d3d_object_instancer","path":"scripts/d3d_object_instancer/d3d_object_instancer.yy",},}, {"id":{"name":"d3d_object","path":"scripts/d3d_object/d3d_object.yy",},}, {"id":{"name":"d3d_path_extrude","path":"scripts/d3d_path_extrude/d3d_path_extrude.yy",},}, @@ -1846,6 +1848,7 @@ {"id":{"name":"node_3d_mesh_cube","path":"scripts/node_3d_mesh_cube/node_3d_mesh_cube.yy",},}, {"id":{"name":"node_3d_mesh_cylinder","path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",},}, {"id":{"name":"node_3d_mesh_export","path":"scripts/node_3d_mesh_export/node_3d_mesh_export.yy",},}, + {"id":{"name":"node_3d_mesh_extrude_mesh","path":"scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.yy",},}, {"id":{"name":"node_3d_mesh_extrude","path":"scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.yy",},}, {"id":{"name":"node_3d_mesh_obj","path":"scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy",},}, {"id":{"name":"node_3d_mesh_path_extrude","path":"scripts/node_3d_mesh_path_extrude/node_3d_mesh_path_extrude.yy",},}, @@ -3233,6 +3236,7 @@ {"id":{"name":"s_node_3d_mesh_cube","path":"sprites/s_node_3d_mesh_cube/s_node_3d_mesh_cube.yy",},}, {"id":{"name":"s_node_3d_mesh_cylinder","path":"sprites/s_node_3d_mesh_cylinder/s_node_3d_mesh_cylinder.yy",},}, {"id":{"name":"s_node_3d_mesh_export","path":"sprites/s_node_3d_mesh_export/s_node_3d_mesh_export.yy",},}, + {"id":{"name":"s_node_3d_mesh_extrude_mesh","path":"sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy",},}, {"id":{"name":"s_node_3d_mesh_extrude","path":"sprites/s_node_3d_mesh_extrude/s_node_3d_mesh_extrude.yy",},}, {"id":{"name":"s_node_3d_mesh_obj","path":"sprites/s_node_3d_mesh_obj/s_node_3d_mesh_obj.yy",},}, {"id":{"name":"s_node_3d_mesh_path_extrude","path":"sprites/s_node_3d_mesh_path_extrude/s_node_3d_mesh_path_extrude.yy",},}, diff --git a/datafiles/data/Nodes/Internal.zip b/datafiles/data/Nodes/Internal.zip index 2588f221c25b73fcbf2af367987710f5b9b33188..2e914807dcf7c03816172b4d4c59eda9ef55c70f 100644 GIT binary patch delta 15781 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 KqjY$N_x}Kx=f~p! delta 15765 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

RK{qq>p6N5x=JP-h&A)ZG(Y6W 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 diff --git a/datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Extrude_Mesh/info.json b/datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Extrude_Mesh/info.json new file mode 100644 index 000000000..3f7eb521e --- /dev/null +++ b/datafiles/data/Nodes/Internal/3D/Node_3D_Mesh_Extrude_Mesh/info.json @@ -0,0 +1,11 @@ +{ + "name":"Mesh Extrude", + "tooltip":"Extrude mesh data into 3D object.", + "spr":"s_node_3d_mesh_extrude_mesh", + "pxc_version":118080, + "baseNode":"Node_3D_Mesh_Extrude_Mesh", + "io":[ + "d3Mesh", + "mesh" + ], +} \ No newline at end of file diff --git a/datafiles/data/Nodes/display_data.json b/datafiles/data/Nodes/display_data.json index 5d35e3bfa..be7674770 100644 --- a/datafiles/data/Nodes/display_data.json +++ b/datafiles/data/Nodes/display_data.json @@ -482,6 +482,7 @@ "Node_3D_Mesh_Terrain", "Node_3D_Mesh_Wall_Builder", "Node_3D_Mesh_Extrude", + "Node_3D_Mesh_Extrude_Mesh", "Node_3D_Mesh_Path_Extrude", { "label": "/Exporters" }, "Node_3D_Mesh_Export", diff --git a/scripts/__mesh/__mesh.gml b/scripts/__mesh/__mesh.gml index 4d15d4678..43492ad4a 100644 --- a/scripts/__mesh/__mesh.gml +++ b/scripts/__mesh/__mesh.gml @@ -1,6 +1,7 @@ function Mesh() constructor { triangles = []; center = [ 0, 0 ]; + bbox = [ 0, 0, 1, 1 ]; static getRandomPoint = function(seed) { random_set_seed(seed); @@ -41,11 +42,11 @@ function Mesh() constructor { return false; } - static mergePath = function() { + static mergePath = function(_conn = true) { if(array_length(triangles) == 0) return []; var segments = []; - var pointsPairs = ds_map_create(); + var pointsPairs = {}; for( var i = 0, n = array_length(triangles); i < n; i++ ) { var t = triangles[i]; @@ -73,28 +74,27 @@ function Mesh() constructor { } } + if(!_conn) return segments; + for( var i = 0, n = array_length(segments); i < n; i++ ) { - var s0 = string(segments[i][0]); - var s1 = string(segments[i][1]); - - if(!ds_map_exists(pointsPairs, s0)) pointsPairs[? s0] = []; - if(!ds_map_exists(pointsPairs, s1)) pointsPairs[? s1] = []; - - array_push(pointsPairs[? s0], segments[i][1]); - array_push(pointsPairs[? s1], segments[i][0]); + var _s = segments[i]; + pointsPairs[$ _s[0]] = _s[1]; + pointsPairs[$ _s[1]] = _s[0]; } var path = [ segments[0][0], segments[0][1] ]; + var indx = 1; for( var i = 0, n = array_length(segments); i < n; i++ ) { - var end_point = path[array_length(path) - 1]; - var next_point = array_pop(pointsPairs[? string(end_point) ]); + var last_point = path[indx]; + var next_point = pointsPairs[$ last_point]; + if(next_point == undefined) break; - array_remove(pointsPairs[? string(next_point)], end_point); + struct_remove(pointsPairs, last_point); array_push(path, next_point); + indx++; } - ds_map_destroy(pointsPairs); return path; } @@ -115,8 +115,13 @@ function Mesh() constructor { } static calcCoM = function() { - var _ax = 0, _ay = 0; - var _p = 0; + var _ax = 0; + var _ay = 0; + var _p = 0; + var _minx = infinity; + var _miny = infinity; + var _maxx = -infinity; + var _maxy = -infinity; for( var i = 0, n = array_length(triangles); i < n; i++ ) { var _tr = triangles[i]; @@ -124,6 +129,11 @@ function Mesh() constructor { for( var j = 0; j < 3; j++ ) { _ax += _tr[j].x; _ay += _tr[j].y; + + _minx = min(_minx, _tr[j].x); + _miny = min(_miny, _tr[j].y); + _maxx = max(_maxx, _tr[j].x); + _maxy = max(_maxy, _tr[j].y); _p++; } } @@ -132,6 +142,7 @@ function Mesh() constructor { if(_p == 0) return; center = [ _ax / _p, _ay / _p ]; + bbox = [ _minx, _miny, _maxx, _maxy ]; } static serialize = function() { return ""; } diff --git a/scripts/__shapes/__shapes.gml b/scripts/__shapes/__shapes.gml index 2c5aed171..3b31b637f 100644 --- a/scripts/__shapes/__shapes.gml +++ b/scripts/__shapes/__shapes.gml @@ -8,7 +8,7 @@ enum SHAPE_TYPE { function SHAPE_rectangle(_sca) { var triangles = [ - [ new __vec2(-_sca[0], -_sca[1]), new __vec2( _sca[0], -_sca[1]), new __vec2(-_sca[0], _sca[1]), c_white ], + [ new __vec2(-_sca[0], -_sca[1]), new __vec2(-_sca[0], _sca[1]), new __vec2( _sca[0], -_sca[1]), c_white ], [ new __vec2( _sca[0], -_sca[1]), new __vec2(-_sca[0], _sca[1]), new __vec2( _sca[0], _sca[1]), c_white ], ]; var segment = [ new __vec2(-_sca[0], -_sca[1]), new __vec2( _sca[0], -_sca[1]), @@ -71,7 +71,7 @@ function SHAPE_star(_sca, data = {}) { var inx = lengthdir_x(inner / 2, (i - 0.5) / prec * 360) * _sca[0] * 2; var iny = lengthdir_y(inner / 2, (i - 0.5) / prec * 360) * _sca[1] * 2; - array_push(triangles, [ new __vec2(0, 0), new __vec2(otx, oty), new __vec2(inx, iny), c_white ]); + array_push(triangles, [ new __vec2(0, 0), new __vec2(inx, iny), new __vec2(otx, oty), c_white ]); array_push(segment, new __vec2(inx, iny)); array_push(segment, new __vec2(otx, oty)); @@ -93,8 +93,8 @@ function SHAPE_capsule(_sca, data = {}) { array_push(segment, new __vec2(-_sca[0] + _sca[1], _sca[1]), new __vec2( _sca[0] - hh, hh)); var triangles = [ - [ new __vec2(-_sca[0] + _sca[1], -_sca[1]), new __vec2( _sca[0] - hh, -hh), new __vec2(-_sca[0] + _sca[1], _sca[1]), c_white ], - [ new __vec2( _sca[0] - hh, -hh), new __vec2(-_sca[0] + _sca[1], _sca[1]), new __vec2( _sca[0] - hh, hh), c_white ], + [ new __vec2(-_sca[0] + _sca[1], -_sca[1]), new __vec2(-_sca[0] + _sca[1], _sca[1]), new __vec2(_sca[0] - hh, -hh), c_white ], + [ new __vec2(_sca[0] - hh, -hh), new __vec2(-_sca[0] + _sca[1], _sca[1]), new __vec2(_sca[0] - hh, hh), c_white ], ]; shapes[0] = { type: SHAPE_TYPE.rectangle, triangles: triangles }; @@ -108,7 +108,7 @@ function SHAPE_capsule(_sca, data = {}) { ny = cy + lengthdir_y(_sca[1], na); if(i) { - array_push(triangles, [ new __vec2(cx, cy), new __vec2(ox, oy), new __vec2(nx, ny), c_white ]); + array_push(triangles, [ new __vec2(cx, cy), new __vec2(nx, ny), new __vec2(ox, oy), c_white ]); array_push(segment, new __vec2(ox, oy)); } array_push(segment, new __vec2(nx, ny)); @@ -223,8 +223,8 @@ function SHAPE_gear(_sca, data = {}) { var tx1 = nx1 + lengthdir_x(teth, (i + 0.5 + teethT) / prec * 360) * _sca[0] * 2; var ty1 = ny1 + lengthdir_y(teth, (i + 0.5 + teethT) / prec * 360) * _sca[1] * 2; - array_push(triangles, [ new __vec2(tx0, ty0), new __vec2(nx0, ny0), new __vec2(nx1, ny1), c_white ]); - array_push(triangles, [ new __vec2(tx0, ty0), new __vec2(nx1, ny1), new __vec2(tx1, ty1), c_white ]); + array_push(triangles, [ new __vec2(tx0, ty0), new __vec2(nx1, ny1), new __vec2(nx0, ny0), c_white ]); + array_push(triangles, [ new __vec2(tx0, ty0), new __vec2(tx1, ty1), new __vec2(nx1, ny1), c_white ]); array_push(segment, new __vec2(tx0, ty0)); array_push(segment, new __vec2(tx1, ty1)); @@ -246,28 +246,28 @@ function SHAPE_cross(_sca, data = {}) { var side = min(_sca[0], _sca[1]) * inner; array_push(triangles, - [ new __vec2(-side, -side), new __vec2( side, -side), new __vec2(-side, side), c_white ], + [ new __vec2(-side, -side), new __vec2(-side, side), new __vec2( side, -side), c_white ], [ new __vec2( side, -side), new __vec2(-side, side), new __vec2( side, side), c_white ], ); array_push(triangles, //top [ new __vec2(-side, -side), new __vec2( side, -side), new __vec2(-side, -_sca[1]), c_white ], - [ new __vec2( side, -side), new __vec2(-side, -_sca[1]), new __vec2( side, -_sca[1]), c_white ], + [ new __vec2( side, -side), new __vec2( side, -_sca[1]), new __vec2(-side, -_sca[1]), c_white ], ); array_push(triangles, //bottom [ new __vec2(-side, _sca[1]), new __vec2( side, _sca[1]), new __vec2(-side, side), c_white ], - [ new __vec2( side, _sca[1]), new __vec2(-side, side), new __vec2( side, side), c_white ], + [ new __vec2( side, _sca[1]), new __vec2( side, side), new __vec2(-side, side), c_white ], ); array_push(triangles, //left [ new __vec2( -side, -side), new __vec2(-_sca[0], -side), new __vec2(-side, side), c_white ], - [ new __vec2(-_sca[0], -side), new __vec2(-side, side), new __vec2(-_sca[0], side), c_white ], + [ new __vec2(-_sca[0], -side), new __vec2(-_sca[0], side), new __vec2(-side, side), c_white ], ); array_push(triangles, //right [ new __vec2(_sca[0], -side), new __vec2( side, -side), new __vec2(_sca[0], side), c_white ], - [ new __vec2( side, -side), new __vec2(_sca[0], side), new __vec2( side, side), c_white ], + [ new __vec2( side, -side), new __vec2( side, side), new __vec2(_sca[0], side), c_white ], ); array_push(segment, new __vec2(-side, -side), new __vec2(-side, -_sca[1]), new __vec2( side, -_sca[1]), new __vec2(side, -side) ); diff --git a/scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.gml b/scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.gml new file mode 100644 index 000000000..f60ad64f1 --- /dev/null +++ b/scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.gml @@ -0,0 +1,80 @@ +function __3dMeshExtrude() : __3dObject() constructor { + VF = global.VF_POS_NORM_TEX_COL; + render_type = pr_trianglelist; + + object_counts = 3; + mesh = noone; + height = 1; + + static initModel = function() { + if(mesh == noone) return; + + var _tris = mesh.triangles; + var _bbox = mesh.bbox; + var _minx = _bbox[0], _miny = _bbox[1]; + var _maxx = _bbox[2], _maxy = _bbox[3]; + var _boxw = _maxx - _minx; + var _boxh = _maxy - _miny; + + var _tria = array_length(_tris); + if(_tria == 0) return; + + var v0 = array_create(3 * _tria); + var v1 = array_create(3 * _tria); + var _h = height / 2; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + for( var i = 0; i < _tria; i++ ) { // caps + var _tri = _tris[i]; + var p0 = _tri[0]; + var p1 = _tri[1]; + var p2 = _tri[2]; + + var p0u = (p0.x - _minx) / _boxw; + var p0v = (p0.y - _miny) / _boxh; + var p1u = (p1.x - _minx) / _boxw; + var p1v = (p1.y - _miny) / _boxh; + var p2u = (p2.x - _minx) / _boxw; + var p2v = (p2.y - _miny) / _boxh; + + v0[i * 3 + 0] = new __vertex(p0u * 2 - 1, p0v * 2 - 1, _h).setNormal(0, 0, 1).setUV(p0u, p0v); + v0[i * 3 + 1] = new __vertex(p1u * 2 - 1, p1v * 2 - 1, _h).setNormal(0, 0, 1).setUV(p1u, p1v); + v0[i * 3 + 2] = new __vertex(p2u * 2 - 1, p2v * 2 - 1, _h).setNormal(0, 0, 1).setUV(p2u, p2v); + + v1[i * 3 + 0] = new __vertex(p0u * 2 - 1, p0v * 2 - 1, -_h).setNormal(0, 0, -1).setUV(p0u, p0v); + v1[i * 3 + 1] = new __vertex(p2u * 2 - 1, p2v * 2 - 1, -_h).setNormal(0, 0, -1).setUV(p2u, p2v); + v1[i * 3 + 2] = new __vertex(p1u * 2 - 1, p1v * 2 - 1, -_h).setNormal(0, 0, -1).setUV(p1u, p1v); + } + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + var br = mesh.mergePath(false); + var vs = array_create(3 * array_length(br) * 2); + + for( var i = 0, n = array_length(br); i < n; i++ ) { + var p0 = br[i][0]; + var p1 = br[i][1]; + + var p0u = (p0.x - _minx) / _boxw; + var p0v = (p0.y - _miny) / _boxh; + var p1u = (p1.x - _minx) / _boxw; + var p1v = (p1.y - _miny) / _boxh; + + var nrm = d3_cross_product([0, 0, 1], [p1.x - p0.x, p1.y - p0.y, 0]); + + vs[i * 6 + 0] = new __vertex(p0u * 2 - 1, p0v * 2 - 1, _h).setNormal(nrm[0], nrm[1], nrm[2]).setUV(0, 0); + vs[i * 6 + 1] = new __vertex(p0u * 2 - 1, p0v * 2 - 1, -_h).setNormal(nrm[0], nrm[1], nrm[2]).setUV(0, 1); + vs[i * 6 + 2] = new __vertex(p1u * 2 - 1, p1v * 2 - 1, _h).setNormal(nrm[0], nrm[1], nrm[2]).setUV(1, 0); + + vs[i * 6 + 3] = new __vertex(p1u * 2 - 1, p1v * 2 - 1, _h).setNormal(nrm[0], nrm[1], nrm[2]).setUV(1, 0); + vs[i * 6 + 4] = new __vertex(p0u * 2 - 1, p0v * 2 - 1, -_h).setNormal(nrm[0], nrm[1], nrm[2]).setUV(0, 1); + vs[i * 6 + 5] = new __vertex(p1u * 2 - 1, p1v * 2 - 1, -_h).setNormal(nrm[0], nrm[1], nrm[2]).setUV(1, 1); + } + + vertex = [ v0, v1, vs ]; + VB = build(); + } initModel(); + + static onParameterUpdate = initModel; +} \ No newline at end of file diff --git a/scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.yy b/scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.yy new file mode 100644 index 000000000..72bc62f2c --- /dev/null +++ b/scripts/d3d_mesh_extrude_mesh/d3d_mesh_extrude_mesh.yy @@ -0,0 +1,14 @@ +{ + "$GMScript":"v1", + "%Name":"d3d_mesh_extrude_mesh", + "isCompatibility":false, + "isDnD":false, + "name":"d3d_mesh_extrude_mesh", + "parent":{ + "name":"d3d_mesh", + "path":"folders/nodes/data/3D/d3d_mesh.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", + "tags":[], +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.gml b/scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.gml new file mode 100644 index 000000000..96b50e41f --- /dev/null +++ b/scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.gml @@ -0,0 +1,60 @@ +function Node_3D_Mesh_Extrude_Mesh(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "Mesh Extrude"; + object_class = __3dMeshExtrude; + + newInput(in_mesh + 0, nodeValue("Mesh", self, CONNECT_TYPE.input, VALUE_TYPE.mesh, noone)) + .setVisible(true, true); + + newInput(in_mesh + 1, nodeValue_Float("Thickness", self, 1)); + + newInput(in_mesh + 2, nodeValue_Bool("Smooth", self, false)) + + newInput(in_mesh + 3, nodeValue_Bool("Always update", self, false)); + + newInput(in_mesh + 4, nodeValue_D3Material("Face Texture", self, new __d3dMaterial())) + .setVisible(true, true); + + newInput(in_mesh + 5, nodeValue_D3Material("Side Texture", self, new __d3dMaterial())) + .setVisible(true, true); + + newInput(in_mesh + 6, nodeValue_D3Material("Back Texture", self, new __d3dMaterial())) + .setVisible(true, true); + + input_display_list = [ in_mesh + 3, + __d3d_input_list_mesh, + __d3d_input_list_transform, + ["Mesh", false], in_mesh + 0, in_mesh + 1, in_mesh + 2, + ["Render", false], in_mesh + 3, in_mesh + 4, in_mesh + 5, in_mesh + 6, + ] + + temp_surface = [ noone, noone ]; + + setTrigger(1, "Refresh", [ THEME.refresh_20, 0, COLORS._main_value_positive ], function() /*=>*/ { for(var i = 0; i < process_amount; i++) getObject(i).initModel(); }); + + static processData = function(_output, _data, _output_index, _array_index = 0) { + var _mesh = _data[in_mesh + 0]; + var _hght = _data[in_mesh + 1]; + var _smt = _data[in_mesh + 2]; + var _updt = _data[in_mesh + 3]; + + var _tex_crs = _data[in_mesh + 4]; + var _tex_sid = _data[in_mesh + 5]; + var _tex_bck = _data[in_mesh + 6]; + + if(!is(_mesh, Mesh)) return noone; + + var _object = getObject(_array_index); + _object.checkParameter( { + mesh : _mesh, + height : _hght, + }, _updt); + + _object.materials = [ _tex_crs, _tex_bck, _tex_sid ]; + + setTransform(_object, _data); + + return _object; + } + + static getPreviewValues = function() { return getSingleValue(in_mesh + 0); } +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.yy b/scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.yy new file mode 100644 index 000000000..3ef1f3243 --- /dev/null +++ b/scripts/node_3d_mesh_extrude_mesh/node_3d_mesh_extrude_mesh.yy @@ -0,0 +1,14 @@ +{ + "$GMScript":"v1", + "%Name":"node_3d_mesh_extrude_mesh", + "isCompatibility":false, + "isDnD":false, + "name":"node_3d_mesh_extrude_mesh", + "parent":{ + "name":"d3d_mesh", + "path":"folders/nodes/data/3D/d3d_mesh.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", + "tags":[], +} \ No newline at end of file diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index eebe58a7d..177dfcd4e 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -1407,7 +1407,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { static getNodeChildList = function(_node) { if(__getNodeChildList_cacheId != project.nodeTopoID) __getNodeChildList_cache = {}; - + if(struct_has(__getNodeChildList_cache, _node)) return __getNodeChildList_cache[$ _node]; var _ind_self = array_find(project.nodeTopo, self); @@ -1419,6 +1419,7 @@ function Node(_x, _y, _group = noone) : __Node_Base(_x, _y) constructor { if(_reach == false) _arr = noone; __getNodeChildList_cache[$ _node] = _arr; + __getNodeChildList_cacheId = project.nodeTopoID; return _arr; } diff --git a/scripts/node_text/node_text.gml b/scripts/node_text/node_text.gml index 212c81dc2..26c9dd479 100644 --- a/scripts/node_text/node_text.gml +++ b/scripts/node_text/node_text.gml @@ -217,7 +217,7 @@ function Node_Text(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons if(edit_cursor_sel != noone && i >= _crmin && i < _crmax) { draw_set_color(COLORS.widget_text_highlight); draw_set_alpha(0.5); - draw_rectangle(_tbx0, _tby0, _tbx1, _tby1, false); + draw_rectangle(_tbx0, _tby0, _tbx1 - 1, _tby1 - 1, false); draw_set_alpha(1); } @@ -290,6 +290,13 @@ function Node_Text(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons } else if(KEYBOARD_PRESSED == vk_delete) { _currStr = string_delete(_currStr, edit_cursor + 1, 1); _edit = true; + + } else if(KEYBOARD_PRESSED == vk_enter) { + _currStr = string_insert("\n", _currStr, edit_cursor + 1); + _edit = true; + + edit_cursor += 1; + KEYBOARD_STRING = ""; } else if(KEYBOARD_STRING != "") { _currStr = string_insert(KEYBOARD_STRING, _currStr, edit_cursor + 1); diff --git a/sprites/s_node_3d_mesh_extrude_mesh/da92e7b3-db50-40f4-9094-49208c57e5bf.png b/sprites/s_node_3d_mesh_extrude_mesh/da92e7b3-db50-40f4-9094-49208c57e5bf.png new file mode 100644 index 0000000000000000000000000000000000000000..6778b488976ef6969e63e93c728dfe76c4e89b71 GIT binary patch literal 3250 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":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "eventStubScript":null, + "eventToFunction":{}, + "length":1.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_node_3d_mesh_extrude_mesh", + "playback":1, + "playbackSpeed":30.0, + "playbackSpeedType":0, + "resourceType":"GMSequence", + "resourceVersion":"2.0", + "showBackdrop":true, + "showBackdropImage":false, + "timeUnits":1, + "tracks":[ + {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"da92e7b3-db50-40f4-9094-49208c57e5bf","path":"sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"a010b26d-298e-4357-a684-15f946c6a155","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + ],"resourceType":"KeyframeStore","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange":null, + "volume":1.0, + "xorigin":32, + "yorigin":32, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":64, +} \ No newline at end of file