From 86ce836d686dddd12894e5417acd6467efa1bacb Mon Sep 17 00:00:00 2001 From: Tanasart Date: Sat, 5 Oct 2024 07:49:33 +0700 Subject: [PATCH] torus --- PixelComposer.resource_order | 5 +- PixelComposer.yyp | 5 +- scripts/d3d_cone/d3d_cone.yy | 2 +- scripts/d3d_cube/d3d_cube.yy | 2 +- scripts/d3d_cube_faces/d3d_cube_faces.yy | 2 +- scripts/d3d_cylinder/d3d_cylinder.yy | 2 +- .../d3d_cylinder_nocaps.yy | 2 +- scripts/d3d_icosphere/d3d_icosphere.yy | 2 +- scripts/d3d_material/d3d_material.gml | 4 + scripts/d3d_object/d3d_object.gml | 7 +- scripts/d3d_path_extrude/d3d_path_extrude.yy | 2 +- scripts/d3d_plane_mesh/d3d_plane_mesh.yy | 2 +- .../d3d_surface_extrude.yy | 2 +- scripts/d3d_terrain/d3d_terrain.yy | 2 +- scripts/d3d_torus/d3d_torus.gml | 113 ++++++++++++++++++ scripts/d3d_torus/d3d_torus.yy | 13 ++ scripts/d3d_uvsphere/d3d_uvsphere.yy | 2 +- scripts/globals/globals.gml | 2 +- scripts/node_3d_material/node_3d_material.gml | 13 +- .../node_3d_mesh_cone/node_3d_mesh_cone.gml | 4 +- .../node_3d_mesh_cylinder.gml | 4 +- .../node_3d_mesh_sphere_ico.gml | 4 +- .../node_3d_mesh_sphere_uv.gml | 4 +- .../node_3d_mesh_torus/node_3d_mesh_torus.gml | 61 ++++++++++ .../node_3d_mesh_torus/node_3d_mesh_torus.yy | 13 ++ scripts/node_3d_mesh_torus/node_counter.yy | 12 ++ scripts/node_registry/node_registry.gml | 1 + shaders/sh_d3d_default/sh_d3d_default.fsh | 3 + .../503138db-2536-496a-b5cc-51e32ad597e3.png | Bin 0 -> 3817 bytes .../4e9d715f-43f0-4ffd-a842-0e4d79699ee0.png | Bin 0 -> 3817 bytes sprites/s_node_3d_torus/s_node_3d_torus.yy | 90 ++++++++++++++ 31 files changed, 352 insertions(+), 28 deletions(-) create mode 100644 scripts/d3d_torus/d3d_torus.gml create mode 100644 scripts/d3d_torus/d3d_torus.yy create mode 100644 scripts/node_3d_mesh_torus/node_3d_mesh_torus.gml create mode 100644 scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy create mode 100644 scripts/node_3d_mesh_torus/node_counter.yy create mode 100644 sprites/s_node_3d_torus/503138db-2536-496a-b5cc-51e32ad597e3.png create mode 100644 sprites/s_node_3d_torus/layers/503138db-2536-496a-b5cc-51e32ad597e3/4e9d715f-43f0-4ffd-a842-0e4d79699ee0.png create mode 100644 sprites/s_node_3d_torus/s_node_3d_torus.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 22698d394..f4fe0418f 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -20,7 +20,6 @@ {"name":"camera","order":7,"path":"folders/functions/3d/camera.yy",}, {"name":"gizmo","order":8,"path":"folders/functions/3d/gizmo.yy",}, {"name":"light","order":9,"path":"folders/functions/3d/light.yy",}, - {"name":"mesh","order":10,"path":"folders/functions/3d/mesh.yy",}, {"name":"util","order":11,"path":"folders/functions/3d/util.yy",}, {"name":"dynaSurf","order":20,"path":"folders/functions/draw/dynaSurf.yy",}, {"name":"API","order":5,"path":"folders/functions/smokesim/API.yy",}, @@ -42,6 +41,7 @@ {"name":"d3d_compose","order":3,"path":"folders/nodes/data/3D/d3d_compose.yy",}, {"name":"d3d_light","order":4,"path":"folders/nodes/data/3D/d3d_light.yy",}, {"name":"d3d_mesh","order":5,"path":"folders/nodes/data/3D/d3d_mesh.yy",}, + {"name":"mesh","order":11,"path":"folders/nodes/data/3D/d3d_mesh/mesh.yy",}, {"name":"d3d_modifier","order":6,"path":"folders/nodes/data/3D/d3d_modifier.yy",}, {"name":"d3d_particle","order":7,"path":"folders/nodes/data/3D/d3d_particle.yy",}, {"name":"raymarching","order":13,"path":"folders/nodes/data/3D/raymarching.yy",}, @@ -502,6 +502,7 @@ {"name":"d3d_scene","order":2,"path":"scripts/d3d_scene/d3d_scene.yy",}, {"name":"d3d_surface_extrude","order":7,"path":"scripts/d3d_surface_extrude/d3d_surface_extrude.yy",}, {"name":"d3d_terrain","order":8,"path":"scripts/d3d_terrain/d3d_terrain.yy",}, + {"name":"d3d_torus","order":11,"path":"scripts/d3d_torus/d3d_torus.yy",}, {"name":"d3d_transformation","order":12,"path":"scripts/d3d_transformation/d3d_transformation.yy",}, {"name":"d3d_uvsphere","order":3,"path":"scripts/d3d_uvsphere/d3d_uvsphere.yy",}, {"name":"d3d_vertex","order":10,"path":"scripts/d3d_vertex/d3d_vertex.yy",}, @@ -698,6 +699,7 @@ {"name":"node_3d_mesh_sphere_uv","order":4,"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":9,"path":"scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.yy",}, + {"name":"node_3d_mesh_torus","order":12,"path":"scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy",}, {"name":"node_3d_point_affector","order":11,"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",}, @@ -2033,6 +2035,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_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",}, {"name":"s_node_ace","order":61,"path":"sprites/s_node_ace/s_node_ace.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 376908389..e5987d2f5 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -56,7 +56,6 @@ {"$GMFolder":"","%Name":"camera","folderPath":"folders/functions/3d/camera.yy","name":"camera","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"gizmo","folderPath":"folders/functions/3d/gizmo.yy","name":"gizmo","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"light","folderPath":"folders/functions/3d/light.yy","name":"light","resourceType":"GMFolder","resourceVersion":"2.0",}, - {"$GMFolder":"","%Name":"mesh","folderPath":"folders/functions/3d/mesh.yy","name":"mesh","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"util","folderPath":"folders/functions/3d/util.yy","name":"util","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"action","folderPath":"folders/functions/action.yy","name":"action","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"animation","folderPath":"folders/functions/animation.yy","name":"animation","resourceType":"GMFolder","resourceVersion":"2.0",}, @@ -130,6 +129,7 @@ {"$GMFolder":"","%Name":"d3d_compose","folderPath":"folders/nodes/data/3D/d3d_compose.yy","name":"d3d_compose","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"d3d_light","folderPath":"folders/nodes/data/3D/d3d_light.yy","name":"d3d_light","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"d3d_mesh","folderPath":"folders/nodes/data/3D/d3d_mesh.yy","name":"d3d_mesh","resourceType":"GMFolder","resourceVersion":"2.0",}, + {"$GMFolder":"","%Name":"mesh","folderPath":"folders/nodes/data/3D/d3d_mesh/mesh.yy","name":"mesh","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"d3d_modifier","folderPath":"folders/nodes/data/3D/d3d_modifier.yy","name":"d3d_modifier","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"d3d_particle","folderPath":"folders/nodes/data/3D/d3d_particle.yy","name":"d3d_particle","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"raymarching","folderPath":"folders/nodes/data/3D/raymarching.yy","name":"raymarching","resourceType":"GMFolder","resourceVersion":"2.0",}, @@ -1013,6 +1013,7 @@ {"id":{"name":"d3d_scene","path":"scripts/d3d_scene/d3d_scene.yy",},}, {"id":{"name":"d3d_surface_extrude","path":"scripts/d3d_surface_extrude/d3d_surface_extrude.yy",},}, {"id":{"name":"d3d_terrain","path":"scripts/d3d_terrain/d3d_terrain.yy",},}, + {"id":{"name":"d3d_torus","path":"scripts/d3d_torus/d3d_torus.yy",},}, {"id":{"name":"d3d_transformation","path":"scripts/d3d_transformation/d3d_transformation.yy",},}, {"id":{"name":"d3d_uvsphere","path":"scripts/d3d_uvsphere/d3d_uvsphere.yy",},}, {"id":{"name":"d3d_vertex","path":"scripts/d3d_vertex/d3d_vertex.yy",},}, @@ -1240,6 +1241,7 @@ {"id":{"name":"node_3d_mesh_sphere_uv","path":"scripts/node_3d_mesh_sphere_uv/node_3d_mesh_sphere_uv.yy",},}, {"id":{"name":"node_3d_mesh_stack_slice","path":"scripts/node_3d_mesh_stack_slice/node_3d_mesh_stack_slice.yy",},}, {"id":{"name":"node_3d_mesh_terrain","path":"scripts/node_3d_mesh_terrain/node_3d_mesh_terrain.yy",},}, + {"id":{"name":"node_3d_mesh_torus","path":"scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy",},}, {"id":{"name":"node_3d_particle","path":"scripts/node_3d_particle/node_3d_particle.yy",},}, {"id":{"name":"node_3d_point_affector","path":"scripts/node_3d_point_affector/node_3d_point_affector.yy",},}, {"id":{"name":"node_3d_repeat","path":"scripts/node_3d_repeat/node_3d_repeat.yy",},}, @@ -2748,6 +2750,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_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",},}, {"id":{"name":"s_node_9patch","path":"sprites/s_node_9patch/s_node_9patch.yy",},}, diff --git a/scripts/d3d_cone/d3d_cone.yy b/scripts/d3d_cone/d3d_cone.yy index 8f0bc2b0f..ca0c62360 100644 --- a/scripts/d3d_cone/d3d_cone.yy +++ b/scripts/d3d_cone/d3d_cone.yy @@ -6,7 +6,7 @@ "name":"d3d_cone", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_cube/d3d_cube.yy b/scripts/d3d_cube/d3d_cube.yy index 6d055d248..64b3211d4 100644 --- a/scripts/d3d_cube/d3d_cube.yy +++ b/scripts/d3d_cube/d3d_cube.yy @@ -6,7 +6,7 @@ "name":"d3d_cube", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_cube_faces/d3d_cube_faces.yy b/scripts/d3d_cube_faces/d3d_cube_faces.yy index 09fecd0e5..7b82d3fc5 100644 --- a/scripts/d3d_cube_faces/d3d_cube_faces.yy +++ b/scripts/d3d_cube_faces/d3d_cube_faces.yy @@ -6,7 +6,7 @@ "name":"d3d_cube_faces", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_cylinder/d3d_cylinder.yy b/scripts/d3d_cylinder/d3d_cylinder.yy index 0a7a57496..fb9a126c0 100644 --- a/scripts/d3d_cylinder/d3d_cylinder.yy +++ b/scripts/d3d_cylinder/d3d_cylinder.yy @@ -6,7 +6,7 @@ "name":"d3d_cylinder", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_cylinder_nocaps/d3d_cylinder_nocaps.yy b/scripts/d3d_cylinder_nocaps/d3d_cylinder_nocaps.yy index 1c896bdda..1cf74cce8 100644 --- a/scripts/d3d_cylinder_nocaps/d3d_cylinder_nocaps.yy +++ b/scripts/d3d_cylinder_nocaps/d3d_cylinder_nocaps.yy @@ -6,7 +6,7 @@ "name":"d3d_cylinder_nocaps", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_icosphere/d3d_icosphere.yy b/scripts/d3d_icosphere/d3d_icosphere.yy index 37dafb07a..814feabf6 100644 --- a/scripts/d3d_icosphere/d3d_icosphere.yy +++ b/scripts/d3d_icosphere/d3d_icosphere.yy @@ -6,7 +6,7 @@ "name":"d3d_icosphere", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_material/d3d_material.gml b/scripts/d3d_material/d3d_material.gml index a5e0f17e0..d3f9eae71 100644 --- a/scripts/d3d_material/d3d_material.gml +++ b/scripts/d3d_material/d3d_material.gml @@ -5,6 +5,8 @@ function __d3dMaterial(surface = noone) constructor { specular = 0; metalic = false; shine = 1; + texScale = [ 1, 1 ]; + texShift = [ 0, 0 ]; normal = noone; normalStr = 1; @@ -28,6 +30,8 @@ function __d3dMaterial(surface = noone) constructor { shader_set_f("mat_specular", specular ); shader_set_f("mat_shine", shine ); shader_set_i("mat_metalic", metalic ); + shader_set_f("mat_texScale", texScale ); + shader_set_f("mat_texShift", texShift ); shader_set_f("mat_reflective", reflective); gpu_set_tex_filter(texFilter); diff --git a/scripts/d3d_object/d3d_object.gml b/scripts/d3d_object/d3d_object.gml index 3737bcdca..c3c7a12f1 100644 --- a/scripts/d3d_object/d3d_object.gml +++ b/scripts/d3d_object/d3d_object.gml @@ -174,14 +174,13 @@ function __3dObject() constructor { shader_set_f("mat_shine", 1); shader_set_i("mat_metalic", 0); shader_set_f("mat_reflective", 0); + shader_set_f("mat_texScale", [ 1, 1 ] ); } vertex_submit(VB[i], render_type, _tex); } else if(_shader == sh_d3d_geometry) { - if(_useMat) - _mat.submitGeometry(); - else - shader_set_i("use_normal", 0); + if(_useMat) _mat.submitGeometry(); + else shader_set_i("use_normal", 0); vertex_submit(VB[i], render_type, _tex); } else diff --git a/scripts/d3d_path_extrude/d3d_path_extrude.yy b/scripts/d3d_path_extrude/d3d_path_extrude.yy index c2bb988d6..f3be293ac 100644 --- a/scripts/d3d_path_extrude/d3d_path_extrude.yy +++ b/scripts/d3d_path_extrude/d3d_path_extrude.yy @@ -6,7 +6,7 @@ "name":"d3d_path_extrude", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_plane_mesh/d3d_plane_mesh.yy b/scripts/d3d_plane_mesh/d3d_plane_mesh.yy index 7c44a5d57..b08b93afb 100644 --- a/scripts/d3d_plane_mesh/d3d_plane_mesh.yy +++ b/scripts/d3d_plane_mesh/d3d_plane_mesh.yy @@ -6,7 +6,7 @@ "name":"d3d_plane_mesh", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_surface_extrude/d3d_surface_extrude.yy b/scripts/d3d_surface_extrude/d3d_surface_extrude.yy index 880e15304..88d9d5465 100644 --- a/scripts/d3d_surface_extrude/d3d_surface_extrude.yy +++ b/scripts/d3d_surface_extrude/d3d_surface_extrude.yy @@ -6,7 +6,7 @@ "name":"d3d_surface_extrude", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_terrain/d3d_terrain.yy b/scripts/d3d_terrain/d3d_terrain.yy index a80d8af6b..f692d78a0 100644 --- a/scripts/d3d_terrain/d3d_terrain.yy +++ b/scripts/d3d_terrain/d3d_terrain.yy @@ -6,7 +6,7 @@ "name":"d3d_terrain", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/d3d_torus/d3d_torus.gml b/scripts/d3d_torus/d3d_torus.gml new file mode 100644 index 000000000..9f5151b1f --- /dev/null +++ b/scripts/d3d_torus/d3d_torus.gml @@ -0,0 +1,113 @@ +function __3dTorus(radT = 1, radP = .2, sideT = 16, sideP = 8, smooth = false) : __3dObject() constructor { + VF = global.VF_POS_NORM_TEX_COL; + render_type = pr_trianglelist; + object_counts = 1; + + self.radT = radT; + self.radP = radP; + self.sideT = sideT; + self.sideP = sideP; + self.smooth = smooth; + angT = 0; + angP = 0; + + static initModel = function() { + var vs = []//array_create(sideT * sideP * 2); + var ix = 0; + + for( var i = 0; i < sideT; i++ ) { + var aT0 = (i + 0) / sideT * 360 + angT; + var aT1 = (i + 1) / sideT * 360 + angT; + + var _lt0_x = lengthdir_x(1, aT0); + var _lt0_y = lengthdir_y(1, aT0); + var _lt1_x = lengthdir_x(1, aT1); + var _lt1_y = lengthdir_y(1, aT1); + + var xT0 = _lt0_x * radT; + var yT0 = _lt0_y * radT; + var xT1 = _lt1_x * radT; + var yT1 = _lt1_y * radT; + + for( var j = 0; j < sideP; j++ ) { + var aP0 = (j + 0) / sideP * 360 + angP; + var aP1 = (j + 1) / sideP * 360 + angP; + + var xP0 = lengthdir_x(radP, aP0); + var xP1 = lengthdir_x(radP, aP1); + + var x0 = _lt0_x * (radT + xP0); + var y0 = _lt0_y * (radT + xP0); + var z0 = lengthdir_y(radP, aP0); + + var x1 = _lt1_x * (radT + xP0); + var y1 = _lt1_y * (radT + xP0); + var z1 = z0; + + var x2 = _lt1_x * (radT + xP1); + var y2 = _lt1_y * (radT + xP1); + var z2 = lengthdir_y(radP, aP1); + + var x3 = _lt0_x * (radT + xP1); + var y3 = _lt0_y * (radT + xP1); + var z3 = z2; + + var ux0 = 1 - (i + 0) / sideT; + var ux1 = 1 - (i + 1) / sideT; + var uy0 = 1 - (j + 0) / sideP; + var uy1 = 1 - (j + 1) / sideP; + + if(smooth) { + var nx0 = x0 - xT0; + var ny0 = y0 - yT0; + var nz0 = z0; + + var nx1 = x1 - xT1; + var ny1 = y1 - yT1; + var nz1 = z1; + + var nx2 = x2 - xT1; + var ny2 = y2 - yT1; + var nz2 = z2; + + var nx3 = x3 - xT0; + var ny3 = y3 - yT0; + var nz3 = z3; + + } else { + var nx0 = (x0 + x1 + x2 + x3) / 4 - (xT0 + xT1) / 2; + var ny0 = (y0 + y1 + y2 + y3) / 4 - (yT0 + yT1) / 2; + var nz0 = (z0 + z1 + z2 + z3) / 4; + + var nx1 = nx0; + var ny1 = ny0; + var nz1 = nz0; + + var nx2 = nx0; + var ny2 = ny0; + var nz2 = nz0; + + var nx3 = nx0; + var ny3 = ny0; + var nz3 = nz0; + + } + + vs[ix++] = new __vertex(x0, y0, z0).setNormal(nx0, ny0, nz0).setUV(ux0, uy0); + vs[ix++] = new __vertex(x2, y2, z2).setNormal(nx2, ny2, nz2).setUV(ux1, uy1); + vs[ix++] = new __vertex(x1, y1, z1).setNormal(nx1, ny1, nz1).setUV(ux1, uy0); + + vs[ix++] = new __vertex(x0, y0, z0).setNormal(nx0, ny0, nz0).setUV(ux0, uy0); + vs[ix++] = new __vertex(x3, y3, z3).setNormal(nx3, ny3, nz3).setUV(ux0, uy1); + vs[ix++] = new __vertex(x2, y2, z2).setNormal(nx2, ny2, nz2).setUV(ux1, uy1); + } + } + + vertex = [ vs ]; + VB = build(); + } + + initModel(); + + static onParameterUpdate = initModel; +} \ No newline at end of file diff --git a/scripts/d3d_torus/d3d_torus.yy b/scripts/d3d_torus/d3d_torus.yy new file mode 100644 index 000000000..839077902 --- /dev/null +++ b/scripts/d3d_torus/d3d_torus.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"d3d_torus", + "isCompatibility":false, + "isDnD":false, + "name":"d3d_torus", + "parent":{ + "name":"mesh", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/d3d_uvsphere/d3d_uvsphere.yy b/scripts/d3d_uvsphere/d3d_uvsphere.yy index 86da35f78..083a65522 100644 --- a/scripts/d3d_uvsphere/d3d_uvsphere.yy +++ b/scripts/d3d_uvsphere/d3d_uvsphere.yy @@ -6,7 +6,7 @@ "name":"d3d_uvsphere", "parent":{ "name":"mesh", - "path":"folders/functions/3d/mesh.yy", + "path":"folders/nodes/data/3D/d3d_mesh/mesh.yy", }, "resourceType":"GMScript", "resourceVersion":"2.0", diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index b1085b2b5..a35069f56 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -39,7 +39,7 @@ globalvar VERSION, SAVE_VERSION, VERSION_STRING, BUILD_NUMBER, LATEST_VERSION; globalvar HOTKEYS, HOTKEY_CONTEXT; - LATEST_VERSION = 1_18_00; + LATEST_VERSION = 1_18_00_0; VERSION = 1_18_01_0; SAVE_VERSION = 1_18_00_0; VERSION_STRING = MAC? "1.18.003m" : "1.18.1.004"; diff --git a/scripts/node_3d_material/node_3d_material.gml b/scripts/node_3d_material/node_3d_material.gml index 47178842a..8f194b5f0 100644 --- a/scripts/node_3d_material/node_3d_material.gml +++ b/scripts/node_3d_material/node_3d_material.gml @@ -25,11 +25,16 @@ function Node_3D_Material(_x, _y, _group = noone) : Node_3D(_x, _y, _group) cons newInput(8, nodeValue_Bool("Anti aliasing", self, false )); + newInput(9, nodeValue_Vec2("Scale", self, [ 1, 1 ] )); + + newInput(10, nodeValue_Vec2("Shift", self, [ 0, 0 ] )); + newOutput(0, nodeValue_Output("Material", self, VALUE_TYPE.d3Material, noone)); - input_display_list = [ 0, 8, + input_display_list = [ + ["Texture", false], 0, 8, 9, 10, ["Properties", false], 1, 2, 3, 4, 7, - ["Normal", false], 5, 6, + ["Normal", false], 5, 6, ]; static processData = function(_output, _data, _output_index, _array_index = 0) { @@ -42,6 +47,8 @@ function Node_3D_Material(_x, _y, _group = noone) : Node_3D(_x, _y, _group) cons var _norS = _data[6]; var _roug = _data[7]; var _aa = _data[8]; + var _scal = _data[9]; + var _shft = _data[10]; if(!is_surface(_surf)) { solid_surf = surface_verify(solid_surf, 1, 1); @@ -54,6 +61,8 @@ function Node_3D_Material(_x, _y, _group = noone) : Node_3D(_x, _y, _group) cons _mat.shine = _shin; _mat.metalic = _metl; _mat.texFilter = _aa; + _mat.texScale = _scal; + _mat.texShift = _shft; _mat.normal = _nor; _mat.normalStr = _norS; diff --git a/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml b/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml index 3b8528e13..d38975393 100644 --- a/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml +++ b/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml @@ -15,9 +15,9 @@ function Node_3D_Mesh_Cone(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group newInput(in_mesh + 3, nodeValue_Bool("Smooth Side", self, false )); input_display_list = [ - __d3d_input_list_mesh, in_mesh + 0, in_mesh + 3, + __d3d_input_list_mesh, in_mesh + 0, __d3d_input_list_transform, - ["Material", false], in_mesh + 1, in_mesh + 2, + ["Material", false], in_mesh + 3, in_mesh + 1, in_mesh + 2, ] static processData = function(_output, _data, _output_index, _array_index = 0) { #region diff --git a/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml index 1c1c589cc..2982a6c8e 100644 --- a/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml +++ b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml @@ -20,9 +20,9 @@ function Node_3D_Mesh_Cylinder(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _g newInput(in_mesh + 5, nodeValue_Bool("End caps", self, true )); input_display_list = [ - __d3d_input_list_mesh, in_mesh + 0, in_mesh + 4, in_mesh + 5, + __d3d_input_list_mesh, in_mesh + 0, in_mesh + 5, __d3d_input_list_transform, - ["Material", false], in_mesh + 1, in_mesh + 2, in_mesh + 3, + ["Material", false], in_mesh + 4, in_mesh + 1, in_mesh + 2, in_mesh + 3, ] static step = function() { #region diff --git a/scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.gml b/scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.gml index 0a302214f..efe5e68e7 100644 --- a/scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.gml +++ b/scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.gml @@ -12,9 +12,9 @@ function Node_3D_Mesh_Sphere_Ico(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, newInput(in_mesh + 2, nodeValue_Bool("Smooth Normal", self, false )); input_display_list = [ - __d3d_input_list_mesh, in_mesh + 0, in_mesh + 2, + __d3d_input_list_mesh, in_mesh + 0, __d3d_input_list_transform, - ["Material", false], in_mesh + 1, + ["Material", false], in_mesh + 2, in_mesh + 1, ] static processData = function(_output, _data, _output_index, _array_index = 0) { #region diff --git a/scripts/node_3d_mesh_sphere_uv/node_3d_mesh_sphere_uv.gml b/scripts/node_3d_mesh_sphere_uv/node_3d_mesh_sphere_uv.gml index 105afb456..c88dc524b 100644 --- a/scripts/node_3d_mesh_sphere_uv/node_3d_mesh_sphere_uv.gml +++ b/scripts/node_3d_mesh_sphere_uv/node_3d_mesh_sphere_uv.gml @@ -15,9 +15,9 @@ function Node_3D_Mesh_Sphere_UV(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _ newInput(in_mesh + 3, nodeValue_Bool("Smooth Normal", self, false )); input_display_list = [ - __d3d_input_list_mesh, in_mesh + 0, in_mesh + 1, in_mesh + 3, + __d3d_input_list_mesh, in_mesh + 0, in_mesh + 1, __d3d_input_list_transform, - ["Material", false], in_mesh + 2, + ["Material", false], in_mesh + 3, in_mesh + 2, ] static processData = function(_output, _data, _output_index, _array_index = 0) { #region diff --git a/scripts/node_3d_mesh_torus/node_3d_mesh_torus.gml b/scripts/node_3d_mesh_torus/node_3d_mesh_torus.gml new file mode 100644 index 000000000..29bdc251b --- /dev/null +++ b/scripts/node_3d_mesh_torus/node_3d_mesh_torus.gml @@ -0,0 +1,61 @@ +function Node_3D_Mesh_Torus(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group) constructor { + name = "3D torus"; + + object_class = __3dTorus; + + newInput(in_mesh + 0, nodeValue_Int("Toroidal Slices", self, 16 )) + .setValidator(VV_min(3)); + + newInput(in_mesh + 1, nodeValue_Int("Poloidal Slices", self, 8 )) + .setValidator(VV_min(3)); + + newInput(in_mesh + 2, nodeValue_Float("Toroidal Radius", self, 1 )); + + newInput(in_mesh + 3, nodeValue_Float("Poloidal Radius", self, .2 )) + .setDisplay(VALUE_DISPLAY.slider); + + newInput(in_mesh + 4, nodeValue_D3Material("Material", self, new __d3dMaterial())) + .setVisible(true, true); + + newInput(in_mesh + 5, nodeValue_Bool("Smooth Normal", self, false )); + + newInput(in_mesh + 6, nodeValue_Rotation("Toroidal Angle", self, 0 )); + + newInput(in_mesh + 7, nodeValue_Rotation("Poloidal Angle", self, 0 )); + + input_display_list = [ + __d3d_input_list_mesh, in_mesh + 0, in_mesh + 1, in_mesh + 2, in_mesh + 3, in_mesh + 6, in_mesh + 7, + __d3d_input_list_transform, + ["Material", false], in_mesh + 5, in_mesh + 4, + ] + + static processData = function(_output, _data, _output_index, _array_index = 0) { + var _sideT = _data[in_mesh + 0]; + var _sideP = _data[in_mesh + 1]; + var _radT = _data[in_mesh + 2]; + var _radP = _data[in_mesh + 3]; + var _angT = _data[in_mesh + 6]; + var _angP = _data[in_mesh + 7]; + + var _smt = _data[in_mesh + 5]; + var _mat = _data[in_mesh + 4]; + + var object = getObject(_array_index); + object.checkParameter({ + sideT : _sideT, + sideP : _sideP, + radT : _radT, + radP : _radP, + angT : _angT, + angP : _angP, + smooth : _smt, + }); + object.materials = [ _mat ]; + + setTransform(object, _data); + + return object; + } + + static getPreviewValues = function() { return getSingleValue(in_mesh + 4); } +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy b/scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy new file mode 100644 index 000000000..0ba36bceb --- /dev/null +++ b/scripts/node_3d_mesh_torus/node_3d_mesh_torus.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"node_3d_mesh_torus", + "isCompatibility":false, + "isDnD":false, + "name":"node_3d_mesh_torus", + "parent":{ + "name":"d3d_mesh", + "path":"folders/nodes/data/3D/d3d_mesh.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_3d_mesh_torus/node_counter.yy b/scripts/node_3d_mesh_torus/node_counter.yy new file mode 100644 index 000000000..10832a0b0 --- /dev/null +++ b/scripts/node_3d_mesh_torus/node_counter.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "variable", + "path": "folders/nodes/data/variable.yy", + }, + "resourceVersion": "1.0", + "name": "node_counter", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 856d08790..60a4f2e26 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -703,6 +703,7 @@ function __initNodes() { addNodeObject(d3d, "3D UV Sphere", s_node_3d_sphere_uv, "Node_3D_Mesh_Sphere_UV", [1, Node_3D_Mesh_Sphere_UV]).setVersion(11510); addNodeObject(d3d, "3D Icosphere", s_node_3d_sphere_ico, "Node_3D_Mesh_Sphere_Ico", [1, Node_3D_Mesh_Sphere_Ico]).setVersion(11510); addNodeObject(d3d, "3D Cone", s_node_3d_cone, "Node_3D_Mesh_Cone", [1, Node_3D_Mesh_Cone]).setVersion(11510); + addNodeObject(d3d, "3D Torus", s_node_3d_torus, "Node_3D_Mesh_Torus", [1, Node_3D_Mesh_Torus]).setVersion(1_18_01_0); addNodeObject(d3d, "3D Terrain", s_node_3d_displace, "Node_3D_Mesh_Terrain", [1, Node_3D_Mesh_Terrain],, "Create 3D terrain from height map.").setVersion(11560); addNodeObject(d3d, "Surface Extrude", s_node_3d_extrude, "Node_3D_Mesh_Extrude", [1, Node_3D_Mesh_Extrude],, "Extrude 2D image into 3D object.").setVersion(11510); addNodeObject(d3d, "Path Extrude", s_node_3d_path_extrude, "Node_3D_Mesh_Path_Extrude",[1, Node_3D_Mesh_Path_Extrude],, "Extrude path into 3D object.").setVersion(11750); diff --git a/shaders/sh_d3d_default/sh_d3d_default.fsh b/shaders/sh_d3d_default/sh_d3d_default.fsh index a90d3596d..ea041555a 100644 --- a/shaders/sh_d3d_default/sh_d3d_default.fsh +++ b/shaders/sh_d3d_default/sh_d3d_default.fsh @@ -65,6 +65,8 @@ uniform int use_8bit; uniform float mat_shine; uniform int mat_metalic; uniform float mat_reflective; + uniform vec2 mat_texScale; + uniform vec2 mat_texShift; uniform int mat_defer_normal; uniform float mat_normal_strength; @@ -174,6 +176,7 @@ void main() { vec2 uv_coord = v_vTexcoord; if(mat_flip == 1) uv_coord.y = -uv_coord.y; + uv_coord = fract(uv_coord * mat_texScale + mat_texShift); mat_baseColor = texture2D( gm_BaseTexture, uv_coord ); mat_baseColor *= v_vColour; diff --git a/sprites/s_node_3d_torus/503138db-2536-496a-b5cc-51e32ad597e3.png b/sprites/s_node_3d_torus/503138db-2536-496a-b5cc-51e32ad597e3.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cd9c05c93c0bbfb9c7b957226ebfa7d11c53ec GIT binary patch literal 3817 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 l{Qv^w{yPKC%g;Rs=j@05-":"", + "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_torus", + "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":"503138db-2536-496a-b5cc-51e32ad597e3","path":"sprites/s_node_3d_torus/s_node_3d_torus.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"94d991bf-2ece-4ef4-af43-db030f5742a2","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