diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 0fe47aaff..287c59d6e 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -716,6 +716,7 @@ {"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",}, {"name":"node_3d_set_material","order":2,"path":"scripts/node_3d_set_material/node_3d_set_material.yy",}, + {"name":"node_3d_subdivide","order":9,"path":"scripts/node_3d_subdivide/node_3d_subdivide.yy",}, {"name":"node_3d_transform_image","order":12,"path":"scripts/node_3d_transform_image/node_3d_transform_image.yy",}, {"name":"node_3d_transform_scene","order":4,"path":"scripts/node_3d_transform_scene/node_3d_transform_scene.yy",}, {"name":"node_3d_transform","order":6,"path":"scripts/node_3d_transform/node_3d_transform.yy",}, @@ -2082,6 +2083,7 @@ {"name":"s_node_3d_sphere_uv","order":16,"path":"sprites/s_node_3d_sphere_uv/s_node_3d_sphere_uv.yy",}, {"name":"s_node_3d_sphere","order":8,"path":"sprites/s_node_3d_sphere/s_node_3d_sphere.yy",}, {"name":"s_node_3d_stack_slice","order":32,"path":"sprites/s_node_3d_stack_slice/s_node_3d_stack_slice.yy",}, + {"name":"s_node_3d_subdivide","order":37,"path":"sprites/s_node_3d_subdivide/s_node_3d_subdivide.yy",}, {"name":"s_node_3d_torus","order":35,"path":"sprites/s_node_3d_torus/s_node_3d_torus.yy",}, {"name":"s_node_3d_transform_scene","order":22,"path":"sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy",}, {"name":"s_node_3d_transform","order":4,"path":"sprites/s_node_3d_transform/s_node_3d_transform.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index a19a383f7..2d89f4e51 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1259,6 +1259,7 @@ {"id":{"name":"node_3d_round_vertex","path":"scripts/node_3d_round_vertex/node_3d_round_vertex.yy",},}, {"id":{"name":"node_3d_scene","path":"scripts/node_3d_scene/node_3d_scene.yy",},}, {"id":{"name":"node_3d_set_material","path":"scripts/node_3d_set_material/node_3d_set_material.yy",},}, + {"id":{"name":"node_3d_subdivide","path":"scripts/node_3d_subdivide/node_3d_subdivide.yy",},}, {"id":{"name":"node_3d_transform_image","path":"scripts/node_3d_transform_image/node_3d_transform_image.yy",},}, {"id":{"name":"node_3d_transform_scene","path":"scripts/node_3d_transform_scene/node_3d_transform_scene.yy",},}, {"id":{"name":"node_3d_transform","path":"scripts/node_3d_transform/node_3d_transform.yy",},}, @@ -2798,6 +2799,7 @@ {"id":{"name":"s_node_3d_sphere_uv","path":"sprites/s_node_3d_sphere_uv/s_node_3d_sphere_uv.yy",},}, {"id":{"name":"s_node_3d_sphere","path":"sprites/s_node_3d_sphere/s_node_3d_sphere.yy",},}, {"id":{"name":"s_node_3d_stack_slice","path":"sprites/s_node_3d_stack_slice/s_node_3d_stack_slice.yy",},}, + {"id":{"name":"s_node_3d_subdivide","path":"sprites/s_node_3d_subdivide/s_node_3d_subdivide.yy",},}, {"id":{"name":"s_node_3d_torus","path":"sprites/s_node_3d_torus/s_node_3d_torus.yy",},}, {"id":{"name":"s_node_3d_transform_scene","path":"sprites/s_node_3d_transform_scene/s_node_3d_transform_scene.yy",},}, {"id":{"name":"s_node_3d_transform","path":"sprites/s_node_3d_transform/s_node_3d_transform.yy",},}, diff --git a/objects/o_dialog_l_system/Create_0.gml b/objects/o_dialog_l_system/Create_0.gml index 834f87b3b..23ecac138 100644 --- a/objects/o_dialog_l_system/Create_0.gml +++ b/objects/o_dialog_l_system/Create_0.gml @@ -22,6 +22,9 @@ event_inherited(); ["-", "Rotate to the right"], ["[", "Save current state in a stack."], ["]", "Restore state from the top of the stack."], + + ["*", "Rotate the secondary angle positively"], + ["/", "Rotate the secondary angle negatively"], ], "Move distance and turn angle is fixed.", "Rules is generate by repeatedly replace a letter with another letter/string. For example.", diff --git a/scripts/__vector/__vector.gml b/scripts/__vector/__vector.gml index 3792466d4..9f34d23fe 100644 --- a/scripts/__vector/__vector.gml +++ b/scripts/__vector/__vector.gml @@ -11,9 +11,18 @@ function d3_normalize(vec) { function d3_cross_product(a, b) { var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2]; + var result = []; result[0] = ay * bz - az * by; result[1] = az * bx - ax * bz; result[2] = ax * by - ay * bx; return result; } + +function d3_cross_product_element(x1, y1, z1, x2, y2, z2) { + return [ + y1 * z2 - z1 * y2, + z1 * x2 - x1 * z2, + x1 * y2 - y1 * x2, + ] +} diff --git a/scripts/d3d_cube/d3d_cube.gml b/scripts/d3d_cube/d3d_cube.gml index f4d80ff0e..3dc29e036 100644 --- a/scripts/d3d_cube/d3d_cube.gml +++ b/scripts/d3d_cube/d3d_cube.gml @@ -2,64 +2,65 @@ function __3dCube() : __3dObject() constructor { VF = global.VF_POS_NORM_TEX_COL; render_type = pr_trianglelist; - static initModel = function(size) { - size /= 2; + static initModel = function() { - vertex = [[ - new __vertex(-size, -size, size).setNormal(0, 0, 1).setUV(1, 1), - new __vertex( size, size, size).setNormal(0, 0, 1).setUV(0, 0), - new __vertex( size, -size, size).setNormal(0, 0, 1).setUV(0, 1), - - new __vertex(-size, -size, size).setNormal(0, 0, 1).setUV(1, 1), - new __vertex(-size, size, size).setNormal(0, 0, 1).setUV(1, 0), - new __vertex( size, size, size).setNormal(0, 0, 1).setUV(0, 0), - - - new __vertex(-size, -size, -size).setNormal(0, 0, -1).setUV(1, 1), - new __vertex( size, -size, -size).setNormal(0, 0, -1).setUV(0, 1), - new __vertex( size, size, -size).setNormal(0, 0, -1).setUV(0, 0), - - new __vertex(-size, -size, -size).setNormal(0, 0, -1).setUV(1, 1), - new __vertex( size, size, -size).setNormal(0, 0, -1).setUV(0, 0), - new __vertex(-size, size, -size).setNormal(0, 0, -1).setUV(1, 0), - - - new __vertex(-size, -size, size).setNormal(-1, 0, 0).setUV(1, 0), - new __vertex(-size, size, -size).setNormal(-1, 0, 0).setUV(0, 1), - new __vertex(-size, size, size).setNormal(-1, 0, 0).setUV(0, 0), - - new __vertex(-size, -size, size).setNormal(-1, 0, 0).setUV(1, 0), - new __vertex(-size, -size, -size).setNormal(-1, 0, 0).setUV(1, 1), - new __vertex(-size, size, -size).setNormal(-1, 0, 0).setUV(0, 1), - - - new __vertex( size, -size, size).setNormal(1, 0, 0).setUV(0, 0), - new __vertex( size, size, size).setNormal(1, 0, 0).setUV(1, 0), - new __vertex( size, size, -size).setNormal(1, 0, 0).setUV(1, 1), - - new __vertex( size, -size, size).setNormal(1, 0, 0).setUV(0, 0), - new __vertex( size, size, -size).setNormal(1, 0, 0).setUV(1, 1), - new __vertex( size, -size, -size).setNormal(1, 0, 0).setUV(0, 1), - - - new __vertex(-size, size, size).setNormal(0, 1, 0).setUV(1, 0), - new __vertex( size, size, -size).setNormal(0, 1, 0).setUV(0, 1), - new __vertex( size, size, size).setNormal(0, 1, 0).setUV(0, 0), - - new __vertex(-size, size, size).setNormal(0, 1, 0).setUV(1, 0), - new __vertex(-size, size, -size).setNormal(0, 1, 0).setUV(1, 1), - new __vertex( size, size, -size).setNormal(0, 1, 0).setUV(0, 1), - - - new __vertex(-size, -size, size).setNormal(0, -1, 0).setUV(0, 0), - new __vertex( size, -size, size).setNormal(0, -1, 0).setUV(1, 0), - new __vertex( size, -size, -size).setNormal(0, -1, 0).setUV(1, 1), - - new __vertex(-size, -size, size).setNormal(0, -1, 0).setUV(0, 0), - new __vertex( size, -size, -size).setNormal(0, -1, 0).setUV(1, 1), - new __vertex(-size, -size, -size).setNormal(0, -1, 0).setUV(0, 1), - ]]; + vertex = [ + [ + new __vertex(-.5, -.5, .5).setNormal(0, 0, 1).setUV(1, 1), + new __vertex( .5, .5, .5).setNormal(0, 0, 1).setUV(0, 0), + new __vertex( .5, -.5, .5).setNormal(0, 0, 1).setUV(0, 1), + + new __vertex(-.5, -.5, .5).setNormal(0, 0, 1).setUV(1, 1), + new __vertex(-.5, .5, .5).setNormal(0, 0, 1).setUV(1, 0), + new __vertex( .5, .5, .5).setNormal(0, 0, 1).setUV(0, 0), + + + new __vertex(-.5, -.5, -.5).setNormal(0, 0, -1).setUV(1, 1), + new __vertex( .5, -.5, -.5).setNormal(0, 0, -1).setUV(0, 1), + new __vertex( .5, .5, -.5).setNormal(0, 0, -1).setUV(0, 0), + + new __vertex(-.5, -.5, -.5).setNormal(0, 0, -1).setUV(1, 1), + new __vertex( .5, .5, -.5).setNormal(0, 0, -1).setUV(0, 0), + new __vertex(-.5, .5, -.5).setNormal(0, 0, -1).setUV(1, 0), + + + new __vertex(-.5, -.5, .5).setNormal(-1, 0, 0).setUV(1, 0), + new __vertex(-.5, .5, -.5).setNormal(-1, 0, 0).setUV(0, 1), + new __vertex(-.5, .5, .5).setNormal(-1, 0, 0).setUV(0, 0), + + new __vertex(-.5, -.5, .5).setNormal(-1, 0, 0).setUV(1, 0), + new __vertex(-.5, -.5, -.5).setNormal(-1, 0, 0).setUV(1, 1), + new __vertex(-.5, .5, -.5).setNormal(-1, 0, 0).setUV(0, 1), + + + new __vertex( .5, -.5, .5).setNormal(1, 0, 0).setUV(0, 0), + new __vertex( .5, .5, .5).setNormal(1, 0, 0).setUV(1, 0), + new __vertex( .5, .5, -.5).setNormal(1, 0, 0).setUV(1, 1), + + new __vertex( .5, -.5, .5).setNormal(1, 0, 0).setUV(0, 0), + new __vertex( .5, .5, -.5).setNormal(1, 0, 0).setUV(1, 1), + new __vertex( .5, -.5, -.5).setNormal(1, 0, 0).setUV(0, 1), + + + new __vertex(-.5, .5, .5).setNormal(0, 1, 0).setUV(1, 0), + new __vertex( .5, .5, -.5).setNormal(0, 1, 0).setUV(0, 1), + new __vertex( .5, .5, .5).setNormal(0, 1, 0).setUV(0, 0), + + new __vertex(-.5, .5, .5).setNormal(0, 1, 0).setUV(1, 0), + new __vertex(-.5, .5, -.5).setNormal(0, 1, 0).setUV(1, 1), + new __vertex( .5, .5, -.5).setNormal(0, 1, 0).setUV(0, 1), + + + new __vertex(-.5, -.5, .5).setNormal(0, -1, 0).setUV(0, 0), + new __vertex( .5, -.5, .5).setNormal(0, -1, 0).setUV(1, 0), + new __vertex( .5, -.5, -.5).setNormal(0, -1, 0).setUV(1, 1), + + new __vertex(-.5, -.5, .5).setNormal(0, -1, 0).setUV(0, 0), + new __vertex( .5, -.5, -.5).setNormal(0, -1, 0).setUV(1, 1), + new __vertex(-.5, -.5, -.5).setNormal(0, -1, 0).setUV(0, 1), + ] + ]; VB = build(); - } initModel(1); + } initModel(); } \ No newline at end of file diff --git a/scripts/d3d_cube_faces/d3d_cube_faces.gml b/scripts/d3d_cube_faces/d3d_cube_faces.gml index 241693012..a1374c2d1 100644 --- a/scripts/d3d_cube_faces/d3d_cube_faces.gml +++ b/scripts/d3d_cube_faces/d3d_cube_faces.gml @@ -3,66 +3,65 @@ function __3dCubeFaces() : __3dObject() constructor { render_type = pr_trianglelist; object_counts = 6; - static initModel = function(size) { - size /= 2; + static initModel = function() { vertex = [ [ - new __vertex(-size, -size, size).setNormal(0, 0, 1).setUV(1, 1), - new __vertex( size, size, size).setNormal(0, 0, 1).setUV(0, 0), - new __vertex( size, -size, size).setNormal(0, 0, 1).setUV(0, 1), + new __vertex(-.5, -.5, .5).setNormal(0, 0, 1).setUV(1, 1), + new __vertex( .5, .5, .5).setNormal(0, 0, 1).setUV(0, 0), + new __vertex( .5, -.5, .5).setNormal(0, 0, 1).setUV(0, 1), - new __vertex(-size, -size, size).setNormal(0, 0, 1).setUV(1, 1), - new __vertex(-size, size, size).setNormal(0, 0, 1).setUV(1, 0), - new __vertex( size, size, size).setNormal(0, 0, 1).setUV(0, 0), + new __vertex(-.5, -.5, .5).setNormal(0, 0, 1).setUV(1, 1), + new __vertex(-.5, .5, .5).setNormal(0, 0, 1).setUV(1, 0), + new __vertex( .5, .5, .5).setNormal(0, 0, 1).setUV(0, 0), ], [ - new __vertex(-size, -size, -size).setNormal(0, 0, -1).setUV(1, 1), - new __vertex( size, -size, -size).setNormal(0, 0, -1).setUV(0, 1), - new __vertex( size, size, -size).setNormal(0, 0, -1).setUV(0, 0), + new __vertex(-.5, -.5, -.5).setNormal(0, 0, -1).setUV(1, 1), + new __vertex( .5, -.5, -.5).setNormal(0, 0, -1).setUV(0, 1), + new __vertex( .5, .5, -.5).setNormal(0, 0, -1).setUV(0, 0), - new __vertex(-size, -size, -size).setNormal(0, 0, -1).setUV(1, 1), - new __vertex( size, size, -size).setNormal(0, 0, -1).setUV(0, 0), - new __vertex(-size, size, -size).setNormal(0, 0, -1).setUV(1, 0), + new __vertex(-.5, -.5, -.5).setNormal(0, 0, -1).setUV(1, 1), + new __vertex( .5, .5, -.5).setNormal(0, 0, -1).setUV(0, 0), + new __vertex(-.5, .5, -.5).setNormal(0, 0, -1).setUV(1, 0), ], [ - new __vertex(-size, -size, size).setNormal(-1, 0, 0).setUV(1, 0), - new __vertex(-size, size, -size).setNormal(-1, 0, 0).setUV(0, 1), - new __vertex(-size, size, size).setNormal(-1, 0, 0).setUV(0, 0), + new __vertex(-.5, -.5, .5).setNormal(-1, 0, 0).setUV(1, 0), + new __vertex(-.5, .5, -.5).setNormal(-1, 0, 0).setUV(0, 1), + new __vertex(-.5, .5, .5).setNormal(-1, 0, 0).setUV(0, 0), - new __vertex(-size, -size, size).setNormal(-1, 0, 0).setUV(1, 0), - new __vertex(-size, -size, -size).setNormal(-1, 0, 0).setUV(1, 1), - new __vertex(-size, size, -size).setNormal(-1, 0, 0).setUV(0, 1), + new __vertex(-.5, -.5, .5).setNormal(-1, 0, 0).setUV(1, 0), + new __vertex(-.5, -.5, -.5).setNormal(-1, 0, 0).setUV(1, 1), + new __vertex(-.5, .5, -.5).setNormal(-1, 0, 0).setUV(0, 1), ], [ - new __vertex( size, -size, size).setNormal(1, 0, 0).setUV(0, 0), - new __vertex( size, size, size).setNormal(1, 0, 0).setUV(1, 0), - new __vertex( size, size, -size).setNormal(1, 0, 0).setUV(1, 1), + new __vertex( .5, -.5, .5).setNormal(1, 0, 0).setUV(0, 0), + new __vertex( .5, .5, .5).setNormal(1, 0, 0).setUV(1, 0), + new __vertex( .5, .5, -.5).setNormal(1, 0, 0).setUV(1, 1), - new __vertex( size, -size, size).setNormal(1, 0, 0).setUV(0, 0), - new __vertex( size, size, -size).setNormal(1, 0, 0).setUV(1, 1), - new __vertex( size, -size, -size).setNormal(1, 0, 0).setUV(0, 1), + new __vertex( .5, -.5, .5).setNormal(1, 0, 0).setUV(0, 0), + new __vertex( .5, .5, -.5).setNormal(1, 0, 0).setUV(1, 1), + new __vertex( .5, -.5, -.5).setNormal(1, 0, 0).setUV(0, 1), ], [ - new __vertex(-size, size, size).setNormal(0, 1, 0).setUV(1, 0), - new __vertex( size, size, -size).setNormal(0, 1, 0).setUV(0, 1), - new __vertex( size, size, size).setNormal(0, 1, 0).setUV(0, 0), + new __vertex(-.5, .5, .5).setNormal(0, 1, 0).setUV(1, 0), + new __vertex( .5, .5, -.5).setNormal(0, 1, 0).setUV(0, 1), + new __vertex( .5, .5, .5).setNormal(0, 1, 0).setUV(0, 0), - new __vertex(-size, size, size).setNormal(0, 1, 0).setUV(1, 0), - new __vertex(-size, size, -size).setNormal(0, 1, 0).setUV(1, 1), - new __vertex( size, size, -size).setNormal(0, 1, 0).setUV(0, 1), + new __vertex(-.5, .5, .5).setNormal(0, 1, 0).setUV(1, 0), + new __vertex(-.5, .5, -.5).setNormal(0, 1, 0).setUV(1, 1), + new __vertex( .5, .5, -.5).setNormal(0, 1, 0).setUV(0, 1), ], [ - new __vertex(-size, -size, size).setNormal(0, -1, 0).setUV(0, 0), - new __vertex( size, -size, size).setNormal(0, -1, 0).setUV(1, 0), - new __vertex( size, -size, -size).setNormal(0, -1, 0).setUV(1, 1), + new __vertex(-.5, -.5, .5).setNormal(0, -1, 0).setUV(0, 0), + new __vertex( .5, -.5, .5).setNormal(0, -1, 0).setUV(1, 0), + new __vertex( .5, -.5, -.5).setNormal(0, -1, 0).setUV(1, 1), - new __vertex(-size, -size, size).setNormal(0, -1, 0).setUV(0, 0), - new __vertex( size, -size, -size).setNormal(0, -1, 0).setUV(1, 1), - new __vertex(-size, -size, -size).setNormal(0, -1, 0).setUV(0, 1), + new __vertex(-.5, -.5, .5).setNormal(0, -1, 0).setUV(0, 0), + new __vertex( .5, -.5, -.5).setNormal(0, -1, 0).setUV(1, 1), + new __vertex(-.5, -.5, -.5).setNormal(0, -1, 0).setUV(0, 1), ] ]; VB = build(); - } initModel(1); + } initModel(); } \ 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 d757e95f5..e585f6af2 100644 --- a/scripts/d3d_plane_mesh/d3d_plane_mesh.gml +++ b/scripts/d3d_plane_mesh/d3d_plane_mesh.gml @@ -2,7 +2,6 @@ function __3dPlane() : __3dObject() constructor { VF = global.VF_POS_NORM_TEX_COL; render_type = pr_trianglelist; - self.side = 0.5; self.normal = 0; two_side = false; @@ -15,35 +14,37 @@ function __3dPlane() : __3dObject() constructor { switch(normal) { case 0 : vertex[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, -.5, -.5).setNormal(1, 0, 0).setUV(0, 1), + new __vertex(0, .5, .5).setNormal(1, 0, 0).setUV(1, 0), + new __vertex(0, .5, -.5).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), + new __vertex(0, -.5, -.5).setNormal(1, 0, 0).setUV(0, 1), + new __vertex(0, -.5, .5).setNormal(1, 0, 0).setUV(0, 0), + new __vertex(0, .5, .5).setNormal(1, 0, 0).setUV(1, 0), ]; break; + case 1 : vertex[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(0, 0), + new __vertex(-.5, 0, -.5).setNormal(0, 1, 0).setUV(1, 1), + new __vertex( .5, 0, -.5).setNormal(0, 1, 0).setUV(0, 1), + new __vertex( .5, 0, .5).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, 0), - new __vertex(-side, 0, side).setNormal(0, 1, 0).setUV(1, 0), + new __vertex(-.5, 0, -.5).setNormal(0, 1, 0).setUV(1, 1), + new __vertex( .5, 0, .5).setNormal(0, 1, 0).setUV(0, 0), + new __vertex(-.5, 0, .5).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(0, 1), + new __vertex(-.5, -.5, 0).setNormal(0, 0, 1).setUV(0, 0), + new __vertex( .5, .5, 0).setNormal(0, 0, 1).setUV(1, 1), + new __vertex( .5, -.5, 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(1, 0), - new __vertex( side, side, 0).setNormal(0, 0, 1).setUV(1, 1), + new __vertex(-.5, -.5, 0).setNormal(0, 0, 1).setUV(0, 0), + new __vertex(-.5, .5, 0).setNormal(0, 0, 1).setUV(1, 0), + new __vertex( .5, .5, 0).setNormal(0, 0, 1).setUV(1, 1), ]; break; } diff --git a/scripts/node_3d_displace/node_3d_displace.gml b/scripts/node_3d_displace/node_3d_displace.gml index 8a70577b4..0df1e5193 100644 --- a/scripts/node_3d_displace/node_3d_displace.gml +++ b/scripts/node_3d_displace/node_3d_displace.gml @@ -8,9 +8,11 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _gr newInput(in_mesh + 2, nodeValue_Float("Subobjects", self, -1)); + newInput(in_mesh + 3, nodeValue_Bool("Recalculate normal", self, true)); + input_display_list = [ ["Mesh", false], 0, in_mesh + 2, - ["Displace", false], in_mesh + 0, in_mesh + 1, + ["Displace", false], in_mesh + 0, in_mesh + 1, in_mesh + 3 ]; static processData = function(_output, _data, _output_index, _array_index = 0) { @@ -18,6 +20,7 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _gr var _tex = _data[in_mesh + 0]; var _hei = _data[in_mesh + 1]; var _trg = _data[in_mesh + 2]; + var _nrm = _data[in_mesh + 3]; if(!is_instanceof(_obj, __3dObject)) return noone; if(!is_instanceof(_tex, __d3dMaterial)) return noone; @@ -40,9 +43,10 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _gr for( var i = 0, n = array_length(_tarr); i < n; i++ ) { var _vi = _tarr[i]; + var _vt = _res.vertex[_vi]; - for( var j = 0, m = array_length(_res.vertex[_vi]); j < m; j++ ) { - var _v = _res.vertex[_vi][j]; + for( var j = 0, m = array_length(_vt); j < m; j++ ) { + var _v = _vt[j]; var _vu = frac(clamp(_v.u, 0, 0.9999) * _tsc[0] + _tif[0]); var _vv = frac(clamp(_v.v, 0, 0.9999) * _tsc[1] + _tif[1]); @@ -59,6 +63,25 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _gr _v.y += _v.ny * _hh; _v.z += _v.nz * _hh; } + + if(_nrm) + for( var j = 0, m = array_length(_vt); j < m; j += 3 ) { + var _v0 = _vt[j + 0]; + var _v1 = _vt[j + 1]; + var _v2 = _vt[j + 2]; + + var _nres = d3_cross_product_element(_v1.x - _v0.x, _v1.y - _v0.y, _v1.z - _v0.z, + _v0.x - _v2.x, _v0.y - _v2.y, _v0.z - _v2.z); + + var _nnl = sqrt(_nres[0] * _nres[0] + _nres[1] * _nres[1] + _nres[2] * _nres[2]); + _nres[0] /= _nnl; + _nres[1] /= _nnl; + _nres[2] /= _nnl; + + _v0.nx = _nres[0]; _v0.ny = _nres[1]; _v0.nz = _nres[2]; + _v1.nx = _nres[0]; _v1.ny = _nres[1]; _v1.nz = _nres[2]; + _v2.nx = _nres[0]; _v2.ny = _nres[1]; _v2.nz = _nres[2]; + } } _res.VB = _res.build(); diff --git a/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml b/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml index a456f0274..028de2959 100644 --- a/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml +++ b/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml @@ -25,7 +25,7 @@ function Node_3D_Mesh_Plane(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _grou inputs[in_mesh + 3].setVisible(_both, _both); } - static processData = function(_output, _data, _output_index, _array_index = 0) { #region + static processData = function(_output, _data, _output_index, _array_index = 0) { var _mat = _data[in_mesh + 0]; var _axs = _data[in_mesh + 1]; var _both = _data[in_mesh + 2]; @@ -38,7 +38,7 @@ function Node_3D_Mesh_Plane(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _grou setTransform(object, _data); return object; - } #endregion + } static getPreviewValues = function() { return getSingleValue(in_mesh + 0); } } \ No newline at end of file diff --git a/scripts/node_3d_subdivide/node_3d_subdivide.gml b/scripts/node_3d_subdivide/node_3d_subdivide.gml new file mode 100644 index 000000000..efc712aa3 --- /dev/null +++ b/scripts/node_3d_subdivide/node_3d_subdivide.gml @@ -0,0 +1,76 @@ +function Node_3D_Subdivide(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _group) constructor { + name = "3D Subdivide"; + + newInput(in_mesh + 0, nodeValue_Float("Subobjects", self, -1)); + + newInput(in_mesh + 1, nodeValue_Int("Level", self, 1)); + + input_display_list = [ + ["Mesh", false], 0, in_mesh + 0, + ["Subdivide", false], in_mesh + 1, + ]; + + static processData = function(_output, _data, _output_index, _array_index = 0) { + var _obj = _data[0]; + var _trg = _data[in_mesh + 0]; + var _sub = _data[in_mesh + 1]; + + if(!is_instanceof(_obj, __3dObject)) return noone; + + var _res = _obj.clone(); + + var _vlen = array_length(_res.vertex); + var _tarr = _trg == -1? array_create_ext(_vlen, function(i) /*=>*/ {return i}) : [ clamp(_trg, 0, _vlen - 1) ]; + + if(_sub > 8) noti_warning("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + + repeat(_sub) + for( var i = 0, n = array_length(_tarr); i < n; i++ ) { + var _vi = _tarr[i]; + var _vt = _res.vertex[_vi]; + var _svt = array_create(array_length(_vt) * 4); + var _ind = 0; + + for( var j = 0, m = array_length(_vt); j < m; j += 3 ) { + var _v0 = _vt[j + 0]; + var _v1 = _vt[j + 1]; + var _v2 = _vt[j + 2]; + + var _v01 = new __vertex().set((_v0.x + _v1.x) / 2, (_v0.y + _v1.y) / 2, (_v0.z + _v1.z) / 2, + (_v0.nx + _v1.nx) / 2, (_v0.ny + _v1.ny) / 2, (_v0.nz + _v1.nz) / 2, + (_v0.u + _v1.u) / 2, (_v0.v + _v1.v) / 2); + + var _v02 = new __vertex().set((_v0.x + _v2.x) / 2, (_v0.y + _v2.y) / 2, (_v0.z + _v2.z) / 2, + (_v0.nx + _v2.nx) / 2, (_v0.ny + _v2.ny) / 2, (_v0.nz + _v2.nz) / 2, + (_v0.u + _v2.u) / 2, (_v0.v + _v2.v) / 2); + + var _v12 = new __vertex().set((_v2.x + _v1.x) / 2, (_v2.y + _v1.y) / 2, (_v2.z + _v1.z) / 2, + (_v2.nx + _v1.nx) / 2, (_v2.ny + _v1.ny) / 2, (_v2.nz + _v1.nz) / 2, + (_v2.u + _v1.u) / 2, (_v2.v + _v1.v) / 2); + + _svt[_ind++] = _v0; + _svt[_ind++] = _v01; + _svt[_ind++] = _v02; + + _svt[_ind++] = _v01; + _svt[_ind++] = _v1; + _svt[_ind++] = _v12; + + _svt[_ind++] = _v02; + _svt[_ind++] = _v12; + _svt[_ind++] = _v2; + + _svt[_ind++] = _v01; + _svt[_ind++] = _v12; + _svt[_ind++] = _v02; + + } + + _res.vertex[_vi] = _svt; + } + + _res.VB = _res.build(); + + return _res; + } +} \ No newline at end of file diff --git a/scripts/node_3d_subdivide/node_3d_subdivide.yy b/scripts/node_3d_subdivide/node_3d_subdivide.yy new file mode 100644 index 000000000..7a55aa8bc --- /dev/null +++ b/scripts/node_3d_subdivide/node_3d_subdivide.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"node_3d_subdivide", + "isCompatibility":false, + "isDnD":false, + "name":"node_3d_subdivide", + "parent":{ + "name":"d3d_modifier", + "path":"folders/nodes/data/3D/d3d_modifier.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_3d_subdivide/node_counter.yy b/scripts/node_3d_subdivide/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_subdivide/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_base_convert/node_base_convert.gml b/scripts/node_base_convert/node_base_convert.gml index fc583d6f8..ebd3b5ea7 100644 --- a/scripts/node_base_convert/node_base_convert.gml +++ b/scripts/node_base_convert/node_base_convert.gml @@ -30,7 +30,7 @@ function Node_Base_Convert(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro var b1 = BBOX().fromPoints(bbox.x0, bbox.y0, bbox.xc - _s * 8, bbox.y1); var b2 = BBOX().fromPoints(bbox.xc + _s * 8, bbox.y0, bbox.x1, bbox.y1); - draw_sprite_ext(THEME.arrow, 0, bbox.xc, bbox.yc + 1 * _s, .5 * _s, .5 * _s, 0, COLORS._main_icon, 1); + draw_sprite_ext(THEME.arrow, 0, bbox.xc, bbox.yc - 2 * _s, _s, _s, 0, COLORS._main_accent, 1); draw_text_bbox(b1, baseFrom); draw_text_bbox(b2, baseTo); } diff --git a/scripts/node_path_l_system/node_path_l_system.gml b/scripts/node_path_l_system/node_path_l_system.gml index ffc51ee62..e1251f335 100644 --- a/scripts/node_path_l_system/node_path_l_system.gml +++ b/scripts/node_path_l_system/node_path_l_system.gml @@ -1,13 +1,18 @@ -function L_Turtle(x = 0, y = 0, ang = 90, w = 1, color = c_white, itr = 0) constructor { +function L_Turtle(x = 0, y = 0, z = 0, ang = 90, w = 1, color = c_white, itr = 0) constructor { self.x = x; self.y = y; + self.z = z; self.ang = ang; + self.vang = 0; self.w = w; self.color = color; - self.itr = itr; - static clone = function() { return new L_Turtle(x, y, ang, w, color, itr); } + static clone = function() { + var t = new L_Turtle(x, y, z, ang, w, color, itr); + t.vang = vang; + return t; + } } function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor { @@ -31,10 +36,20 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr newInput(7, nodeValue_Int("Seed", self, seed_random(6))) .setDisplay(VALUE_DISPLAY._default, { side_button : button(function() { randomize(); inputs[7].setValue(seed_random(6)); }).setIcon(THEME.icon_random, 0, COLORS._main_icon) }); + newInput(8, nodeValue_Bool("3D", self, false)); + + newInput(9, nodeValue_Enum_Button("Forward", self, 1, [ "X", "Y", "Z" ])); + + newInput(10, nodeValue_Vec3("Starting position", self, [ 0, 0, 0 ])); + + newInput(11, nodeValue_Rotation("Subangle", self, 45)); + static createNewInput = function() { var index = array_length(inputs); - newInput(index + 0, nodeValue_Text("Name " + string(index - input_fix_len), self, "" )); - newInput(index + 1, nodeValue_Text("Rule " + string(index - input_fix_len), self, "" )); + var _idx = index - input_fix_len; + + newInput(index + 0, nodeValue_Text($"Name {_idx}", self, "" )); + newInput(index + 1, nodeValue_Text($"Rule {_idx}", self, "" )); return inputs[index + 0]; } @@ -42,7 +57,7 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr setDynamicInput(2, false); if(!LOADING && !APPENDING) createNewInput(); - newOutput(0, nodeValue_Output("Path", self, VALUE_TYPE.pathnode, self)); + newOutput(0, nodeValue_Output("Path", self, VALUE_TYPE.pathnode, noone)); rule_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { rule_renderer.x = _x; @@ -77,6 +92,7 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr return hh; }, + function(parent = noone) { for( var i = input_fix_len; i < array_length(inputs); i += data_length ) { var _name = inputs[i + 0]; @@ -88,9 +104,10 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr }); input_display_list = [ - ["Origin", false], 2, 6, - ["Properties", false], 0, 1, 7, - ["Rules", false], 3, 4, rule_renderer, 5, + ["Origin", false], 2, 10, 6, + ["Properties", false], 0, 1, 7, + ["3D", false, 8], 9, 11, + ["Rules", false], 3, 4, rule_renderer, 5, ]; attributes.rule_length_limit = 10000; @@ -102,13 +119,14 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr triggerRender(); }) ]); + path_3d = false; cache_data = { start : "", rules : {}, end_rule : "", iteration : 0, seed : 0, - result : "" + result : "", } static refreshDynamicInput = function() { @@ -166,12 +184,49 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr } } + static drawOverlay3D = function(active, params, _mx, _my, _snx, _sny, _panel) { + + var _out = getSingleValue(0, preview_index, true); + if(!is_struct(_out)) return; + + var _qinv = new BBMOD_Quaternion().FromAxisAngle(new BBMOD_Vec3(1, 0, 0), 90); + + var _camera = params.camera; + var _qview = new BBMOD_Quaternion().FromEuler(_camera.focus_angle_y, -_camera.focus_angle_x, 0); + var ray = _camera.viewPointToWorldRay(_mx, _my); + + var _v3 = new __vec3(); + var _ox = 0, _oy = 0; + var _nx = 0, _ny = 0; + + draw_set_color(COLORS._main_accent); + for( var i = 0, n = array_length(_out.lines); i < n; i++ ) { + var p0 = _out.lines[i][0]; + var p1 = _out.lines[i][1]; + + _v3.x = p0[0]; + _v3.y = p0[1]; + _v3.z = p0[2]; + + var _posView = _camera.worldPointToViewPoint(_v3); + _nx = _posView.x; + _ny = _posView.y; + + if(i) draw_line(_ox, _oy, _nx, _ny); + + _ox = _nx; + _oy = _ny; + } + + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function Path_LSystem() constructor { lines = []; current_length = 0; boundary = new BoundingBox(); + path_3d = false; static getLineCount = function() { return array_length(lines); } static getSegmentCount = function() { return 1; } @@ -190,11 +245,12 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr if(!is_array(_p0) || array_length(_p0) < 2) return 1; if(!is_array(_p1) || array_length(_p1) < 2) return 1; - return lerp(_p0[2], _p1[2], _rat); + return lerp(_p0[3], _p1[3], _rat); } static getPointRatio = function(_rat, _ind = 0, out = undefined) { - if(out == undefined) out = new __vec2(); else { out.x = 0; out.y = 0; } + if(out == undefined) out = path_3d? new __vec3() : new __vec2(); + else { out.x = 0; out.y = 0; if(path_3d) out.z = 0; } var _p0 = lines[_ind][0]; var _p1 = lines[_ind][1]; @@ -205,6 +261,8 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr out.x = lerp(_p0[0], _p1[0], _rat); out.y = lerp(_p0[1], _p1[1], _rat); + if(path_3d) out.z = lerp(_p0[2], _p1[2], _rat); + return out; } @@ -270,19 +328,28 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr __curr_path = noone; static processData = function(_outSurf, _data, _output_index, _array_index) { - var _len = _data[0]; - var _ang = _data[1]; - var _pos = _data[2]; - var _itr = _data[3]; - var _sta = _data[4]; - var _end = _data[5]; - var _san = _data[6]; - var _sad = _data[7]; + var _len = _data[0]; + var _ang = _data[1]; + var _itr = _data[3]; + var _sta = _data[4]; + var _end = _data[5]; + var _san = _data[6]; + var _sad = _data[7]; + path_3d = _data[8]; + var _for = _data[9]; + var _pos = path_3d? _data[10] : _data[2]; + var _vang = _data[11]; + + inputs[ 2].setVisible(!path_3d); + inputs[10].setVisible( path_3d); + + is_3D = path_3d? NODE_3D.polygon : NODE_3D.none; lineq = ds_queue_create(); random_set_seed(_sad); __curr_path = new Path_LSystem(); __curr_path.current_length = _len; + __curr_path.path_3d = path_3d; if(array_length(inputs) < input_fix_len + 2) return __curr_path; @@ -301,46 +368,97 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr l_system(_sta, rules, _end, _itr, _sad); itr = _itr; ang = _ang; + vang = _vang; len = _len; + forw = _for; st = ds_stack_create(); - t = new L_Turtle(_pos[0], _pos[1], _san); + t = new L_Turtle(_pos[0], _pos[1], path_3d? _pos[2] : 0, _san); maxItr = 0; + var nx, ny, nz; + _llen = _len / 25; + string_foreach(cache_data.result, function(_ch, _) { switch(_ch) { case "F": - var nx = t.x + lengthdir_x(len, t.ang); - var ny = t.y + lengthdir_y(len, t.ang); - - ds_queue_enqueue(lineq, [ [ t.x, t.y, t.w, t.itr ], [ nx, ny, t.w, t.itr + 1 ] ]); + if(path_3d) { + nx = t.x + _llen * dcos(t.vang) * dcos(t.ang); + ny = t.y + _llen * dcos(t.vang) * dsin(t.ang); + nz = t.z + _llen * dsin(t.vang); + + switch(forw) { + case 0 : ds_queue_enqueue(lineq, [ [ t.y, t.x, t.z, t.w, t.itr ], [ ny, nx, nz, t.w, t.itr + 1 ] ]); break; + case 1 : ds_queue_enqueue(lineq, [ [ t.x, t.y, t.z, t.w, t.itr ], [ nx, ny, nz, t.w, t.itr + 1 ] ]); break; + case 2 : ds_queue_enqueue(lineq, [ [ t.x, t.z, t.y, t.w, t.itr ], [ nx, nz, ny, t.w, t.itr + 1 ] ]); break; + } + + } else { + nx = t.x + lengthdir_x(len, t.ang); + ny = t.y + lengthdir_y(len, t.ang); + nz = t.z; + ds_queue_enqueue(lineq, [ [ t.x, t.y, t.z, t.w, t.itr ], [ nx, ny, nz, t.w, t.itr + 1 ] ]); + + } t.x = nx; t.y = ny; + t.z = nz; t.itr++; maxItr = max(maxItr, t.itr); break; case "G": - t.x = t.x + lengthdir_x(len, t.ang); - t.y = t.y + lengthdir_y(len, t.ang); - break; - - case "f": - var nx = t.x + lengthdir_x(len * frac(itr), t.ang); - var ny = t.y + lengthdir_y(len * frac(itr), t.ang); - - ds_queue_enqueue(lineq, [ [ t.x, t.y, t.w, t.itr ], [ nx, ny, t.w, t.itr + 1 ] ]); + if(path_3d) { + nx = t.x + _llen * dcos(t.vang) * dcos(t.ang); + ny = t.y + _llen * dcos(t.vang) * dsin(t.ang); + nz = t.z + _llen * dsin(t.vang); + + } else { + nx = t.x + lengthdir_x(len, t.ang); + ny = t.y + lengthdir_y(len, t.ang); + nz = t.z; + } t.x = nx; t.y = ny; + break; + + case "f": + var _ll = _llen * frac(itr); + + if(path_3d) { + nx = t.x + _ll * dcos(t.vang) * dcos(t.ang); + ny = t.y + _ll * dcos(t.vang) * dsin(t.ang); + nz = t.z + _ll * dsin(t.vang); + + switch(forw) { + case 0 : ds_queue_enqueue(lineq, [ [ t.y, t.x, t.z, t.w, t.itr ], [ ny, nx, nz, t.w, t.itr + 1 ] ]); break; + case 1 : ds_queue_enqueue(lineq, [ [ t.x, t.y, t.z, t.w, t.itr ], [ nx, ny, nz, t.w, t.itr + 1 ] ]); break; + case 2 : ds_queue_enqueue(lineq, [ [ t.x, t.z, t.y, t.w, t.itr ], [ nx, nz, ny, t.w, t.itr + 1 ] ]); break; + } + + } else { + nx = t.x + lengthdir_x(_ll, t.ang); + ny = t.y + lengthdir_y(_ll, t.ang); + nz = t.z; + ds_queue_enqueue(lineq, [ [ t.x, t.y, t.z, t.w, t.itr ], [ nx, ny, nz, t.w, t.itr + 1 ] ]); + + } + + t.x = nx; + t.y = ny; + t.z = nz; t.itr++; maxItr = max(maxItr, t.itr); break; - case "+": t.ang += ang; break; - case "-": t.ang -= ang; break; - case "|": t.ang += 180; break; + case "+": t.ang += ang; break; + case "-": t.ang -= ang; break; + case "|": t.ang += 180; break; + + case "*": t.vang += vang; break; + case "/": t.vang -= vang; break; case "[": ds_stack_push(st, t.clone()); break; case "]": @@ -351,7 +469,6 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr case ">": t.w += 0.1; break; case "<": t.w -= 0.1; break; - // default : noti_warning($"L-system: Invalid rule '{_ch}'"); } }); @@ -379,4 +496,9 @@ function Node_Path_L_System(_x, _y, _group = noone) : Node_Processor(_x, _y, _gr var bbox = drawGetBbox(xx, yy, _s); draw_sprite_fit(s_node_path_l_system, 0, bbox.xc, bbox.yc, bbox.w, bbox.h); } + + static getPreviewObject = function() { return noone; } + static getPreviewObjects = function() { return []; } + static getPreviewObjectOutline = function() { return []; } + } \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index d60a8fb9d..fecc533a7 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -724,6 +724,7 @@ function __initNodes() { ds_list_add(d3d, "Modify"); addNodeObject(d3d, "Discretize vertex", s_node_3d_discretize, "Node_3D_Round_Vertex", [1, Node_3D_Round_Vertex],, "Round out vertex position to a specified step.").setVersion(11560); addNodeObject(d3d, "3D Displace", s_node_3d_displace, "Node_3D_Displace", [1, Node_3D_Displace],, "").setVersion(1_18_01_0); + addNodeObject(d3d, "3D Subdivide", s_node_3d_subdivide, "Node_3D_Subdivide", [1, Node_3D_Subdivide],, "").setVersion(1_18_03_0); addNodeObject(d3d, "Set Material", s_node_3d_set_material, "Node_3D_Set_Material", [1, Node_3D_Set_Material],, "Replace mesh material with a new one.").setVersion(11560); addNodeObject(d3d, "Transform", s_node_3d_transform, "Node_3D_Transform", [1, Node_3D_Transform],, "Transform 3D object.").setVersion(11570); addNodeObject(d3d, "Transform Scene", s_node_3d_transform_scene, "Node_3D_Transform_Scene", [1, Node_3D_Transform_Scene],, "Transform 3D scene, accepts array of transformations for each objects.").setVersion(11570); diff --git a/scripts/node_string_split/node_string_split.gml b/scripts/node_string_split/node_string_split.gml index fb1bb4153..ff2670610 100644 --- a/scripts/node_string_split/node_string_split.gml +++ b/scripts/node_string_split/node_string_split.gml @@ -8,41 +8,84 @@ function Node_String_Split(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro newInput(1, nodeValue_Text("Delimiter", self, " ", "Character that used to split text,\nleave blank to create character array.")); inputs[1].editWidget.format = TEXT_AREA_FORMAT.delimiter; + newInput(2, nodeValue_Enum_Scroll("Mode", self, 0, [ "Delimiter", "Periordic" ])) + + newInput(3, nodeValue_Int("Period", self, 1)); + newOutput(0, nodeValue_Output("Text", self, VALUE_TYPE.text, "")); + input_display_list = [ 0, + 2, 1, 3, + ]; + static processData = function(_output, _data, _index = 0) { - if(_data[1] == "") - return string_to_array(_data[0]); + var _text = _data[0]; + var _deli = _data[1]; + var _mode = _data[2]; + var _peri = max(1, _data[3]); + + inputs[1].setVisible(_mode == 0); + inputs[3].setVisible(_mode == 1); + + if(_deli == "") return string_to_array(_text); - var delim = _data[1]; - delim = string_replace_all(delim, "\\n", "\n"); - delim = string_replace_all(delim, "\\t", "\t"); - return string_splice(_data[0], delim); + if(_mode == 0) { + _deli = string_replace_all(_deli, "\\n", "\n"); + _deli = string_replace_all(_deli, "\\t", "\t"); + return string_splice(_text, _deli); + + } else if(_mode == 1) { + var _len = string_length(_text); + var _amo = ceil(_len / _peri); + var _arr = array_create(_amo); + + for( var i = 0; i < _amo; i++ ) { + var _st = 1 + i * _peri; + var _ed = min(_st + _peri, _len + 1); + + _arr[i] = string_copy(_text, _st, _ed - _st); + } + // print($"{_amo}: {_arr}"); + + return _arr; + + } + + return [ _text ]; } static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { - var str = getInputData(1); var bbox = drawGetBbox(xx, yy, _s); var cx = bbox.xc; var cy = bbox.yc; - if(string_length(str) == 0) { - draw_set_text(f_sdf, fa_center, fa_center, COLORS._main_text_sub); - draw_text_bbox(bbox, __txt("None")); - return; + var _deli = getInputData(1); + var _mode = getInputData(2); + var _peri = getInputData(3); + + if(_mode == 0) { + if(string_length(_deli) == 0) { + draw_set_text(f_sdf, fa_center, fa_center, COLORS._main_text_sub); + draw_text_bbox(bbox, __txt("None")); + return; + } + + _s *= 0.5; + + draw_set_text(f_sdf, fa_center, fa_center, COLORS._main_text); + _deli = string_cut(_deli, bbox.w - _s * 32, "...", _s); + draw_text_add(cx, cy, _deli, _s); + + var ww = (string_width(_deli) / 2) * _s; + draw_set_text(f_sdf, fa_right, fa_center, COLORS._main_text_sub); + draw_text_transformed(cx - ww, cy, "|", _s, _s, 0); + + draw_set_halign(fa_left); + draw_text_transformed(cx + ww, cy, "|", _s, _s, 0); + + } else if(_mode == 1) { + + } - - _s *= 0.5; - - draw_set_text(f_sdf, fa_center, fa_center, COLORS._main_text); - str = string_cut(str, bbox.w - _s * 32, "...", _s); - draw_text_add(cx, cy, str, _s); - - var ww = (string_width(str) / 2) * _s; - draw_set_text(f_sdf, fa_right, fa_center, COLORS._main_text_sub); - draw_text_transformed(cx - ww, cy, "|", _s, _s, 0); - - draw_set_halign(fa_left); - draw_text_transformed(cx + ww, cy, "|", _s, _s, 0); } } \ No newline at end of file diff --git a/scripts/panel_preview/panel_preview.gml b/scripts/panel_preview/panel_preview.gml index b95be267d..fc1977954 100644 --- a/scripts/panel_preview/panel_preview.gml +++ b/scripts/panel_preview/panel_preview.gml @@ -1041,11 +1041,14 @@ function Panel_Preview() : PanelContent() constructor { sample_x = floor((mx - canvas_x) / canvas_s); sample_y = floor((my - canvas_y) / canvas_s); var surf = getNodePreviewSurface(); - sample_color_raw = surface_getpixel_ext(surf, sample_x, sample_y); - sample_color = is_array(sample_color_raw)? make_color_rgba(clamp(sample_color_raw[0] * 255, 0, 255), - clamp(sample_color_raw[1] * 255, 0, 255), - clamp(sample_color_raw[2] * 255, 0, 255), - clamp(sample_color_raw[3] * 255, 0, 255)) : sample_color_raw; + + if(is_surface(surf)) { + sample_color_raw = surface_getpixel_ext(surf, sample_x, sample_y); + sample_color = is_array(sample_color_raw)? make_color_rgba(clamp(sample_color_raw[0] * 255, 0, 255), + clamp(sample_color_raw[1] * 255, 0, 255), + clamp(sample_color_raw[2] * 255, 0, 255), + clamp(sample_color_raw[3] * 255, 0, 255)) : sample_color_raw; + } } } diff --git a/sprites/s_node_3d_subdivide/daffd462-b1cb-4336-b10e-50faf1aa62f9.png b/sprites/s_node_3d_subdivide/daffd462-b1cb-4336-b10e-50faf1aa62f9.png new file mode 100644 index 000000000..2b304b25d Binary files /dev/null and b/sprites/s_node_3d_subdivide/daffd462-b1cb-4336-b10e-50faf1aa62f9.png differ diff --git a/sprites/s_node_3d_subdivide/layers/daffd462-b1cb-4336-b10e-50faf1aa62f9/3efeaa52-14bc-4c86-96fe-3122954e5358.png b/sprites/s_node_3d_subdivide/layers/daffd462-b1cb-4336-b10e-50faf1aa62f9/3efeaa52-14bc-4c86-96fe-3122954e5358.png new file mode 100644 index 000000000..2b304b25d Binary files /dev/null and b/sprites/s_node_3d_subdivide/layers/daffd462-b1cb-4336-b10e-50faf1aa62f9/3efeaa52-14bc-4c86-96fe-3122954e5358.png differ diff --git a/sprites/s_node_3d_subdivide/s_node_3d_subdivide.yy b/sprites/s_node_3d_subdivide/s_node_3d_subdivide.yy new file mode 100644 index 000000000..37e850d0a --- /dev/null +++ b/sprites/s_node_3d_subdivide/s_node_3d_subdivide.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_node_3d_subdivide", + "bboxMode":0, + "bbox_bottom":61, + "bbox_left":6, + "bbox_right":57, + "bbox_top":2, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"daffd462-b1cb-4336-b10e-50faf1aa62f9","name":"daffd462-b1cb-4336-b10e-50faf1aa62f9","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"3efeaa52-14bc-4c86-96fe-3122954e5358","blendMode":0,"displayName":"default","isLocked":false,"name":"3efeaa52-14bc-4c86-96fe-3122954e5358","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_node_3d_subdivide", + "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_subdivide", + "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_subdivide", + "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":"daffd462-b1cb-4336-b10e-50faf1aa62f9","path":"sprites/s_node_3d_subdivide/s_node_3d_subdivide.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"bbce277a-9b0c-434f-b1c4-91548682b904","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