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 2588f221c..2e914807d 100644 Binary files a/datafiles/data/Nodes/Internal.zip and b/datafiles/data/Nodes/Internal.zip differ 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 000000000..6778b4889 Binary files /dev/null and b/sprites/s_node_3d_mesh_extrude_mesh/da92e7b3-db50-40f4-9094-49208c57e5bf.png differ diff --git a/sprites/s_node_3d_mesh_extrude_mesh/layers/da92e7b3-db50-40f4-9094-49208c57e5bf/4f3c6aa7-fabf-466c-8391-90f525bd768a.png b/sprites/s_node_3d_mesh_extrude_mesh/layers/da92e7b3-db50-40f4-9094-49208c57e5bf/4f3c6aa7-fabf-466c-8391-90f525bd768a.png new file mode 100644 index 000000000..6778b4889 Binary files /dev/null and b/sprites/s_node_3d_mesh_extrude_mesh/layers/da92e7b3-db50-40f4-9094-49208c57e5bf/4f3c6aa7-fabf-466c-8391-90f525bd768a.png differ diff --git a/sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy b/sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy new file mode 100644 index 000000000..6d9edeb10 --- /dev/null +++ b/sprites/s_node_3d_mesh_extrude_mesh/s_node_3d_mesh_extrude_mesh.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_3d_mesh_extrude_mesh", + "bboxMode":0, + "bbox_bottom":56, + "bbox_left":4, + "bbox_right":57, + "bbox_top":6, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"da92e7b3-db50-40f4-9094-49208c57e5bf","name":"da92e7b3-db50-40f4-9094-49208c57e5bf","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"4f3c6aa7-fabf-466c-8391-90f525bd768a","blendMode":0,"displayName":"default","isLocked":false,"name":"4f3c6aa7-fabf-466c-8391-90f525bd768a","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_3d_mesh_extrude_mesh", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"3D", + "path":"folders/nodes/icons/3D.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_node_3d_mesh_extrude_mesh", + "autoRecord":true, + "backdropHeight":768, + "backdropImageOpacity":0.5, + "backdropImagePath":"", + "backdropWidth":1366, + "backdropXOffset":0.0, + "backdropYOffset":0.0, + "events":{ + "$KeyframeStore":"", + "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