From 6a56d1e4dc5997239cd5b1550a67cc47c7d08aec Mon Sep 17 00:00:00 2001 From: Tanasart Date: Fri, 20 Dec 2024 14:56:46 +0700 Subject: [PATCH] [Stack] Add blend mode property. --- PixelComposer.resource_order | 23 ++++--- PixelComposer.yyp | 1 + scripts/d3d_plane_mesh/d3d_plane_mesh.gml | 3 +- scripts/node_3d_bend/node_3d_bend.gml | 69 +++++++++++++++++++ scripts/node_3d_bend/node_3d_bend.yy | 14 ++++ scripts/node_3d_displace/node_3d_displace.gml | 2 +- scripts/node_stack/node_stack.gml | 52 +++++++------- shaders/sh_draw_surface/sh_draw_surface.fsh | 3 - 8 files changed, 126 insertions(+), 41 deletions(-) create mode 100644 scripts/node_3d_bend/node_3d_bend.gml create mode 100644 scripts/node_3d_bend/node_3d_bend.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 6594bc410..07df11c2b 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -75,7 +75,6 @@ {"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":8,"path":"folders/nodes/data/3D/raymarching.yy",}, @@ -667,30 +666,32 @@ {"name":"mouse_input","order":1,"path":"scripts/mouse_input/mouse_input.yy",}, {"name":"mtl_reader","order":6,"path":"scripts/mtl_reader/mtl_reader.yy",}, {"name":"network_data","order":22,"path":"scripts/network_data/network_data.yy",}, + {"name":"node_3d_bend","order":9,"path":"scripts/node_3d_bend/node_3d_bend.yy",}, {"name":"node_3d_camera_set","order":1,"path":"scripts/node_3d_camera_set/node_3d_camera_set.yy",}, {"name":"node_3d_depth","order":4,"path":"scripts/node_3d_depth/node_3d_depth.yy",}, {"name":"node_3d_displace","order":8,"path":"scripts/node_3d_displace/node_3d_displace.yy",}, {"name":"node_3d_instancer","order":3,"path":"scripts/node_3d_instancer/node_3d_instancer.yy",}, {"name":"node_3d_light_point","order":2,"path":"scripts/node_3d_light_point/node_3d_light_point.yy",}, {"name":"node_3d_material","order":11,"path":"scripts/node_3d_material/node_3d_material.yy",}, - {"name":"node_3d_mesh_cone","order":6,"path":"scripts/node_3d_mesh_cone/node_3d_mesh_cone.yy",}, - {"name":"node_3d_mesh_cylinder","order":3,"path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",}, + {"name":"node_3d_mesh_cone","order":7,"path":"scripts/node_3d_mesh_cone/node_3d_mesh_cone.yy",}, + {"name":"node_3d_mesh_cube","order":2,"path":"scripts/node_3d_mesh_cube/node_3d_mesh_cube.yy",}, + {"name":"node_3d_mesh_cylinder","order":4,"path":"scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.yy",}, {"name":"node_3d_mesh_export","order":14,"path":"scripts/node_3d_mesh_export/node_3d_mesh_export.yy",}, - {"name":"node_3d_mesh_extrude","order":8,"path":"scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.yy",}, - {"name":"node_3d_mesh_obj","order":2,"path":"scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy",}, - {"name":"node_3d_mesh_path_extrude","order":10,"path":"scripts/node_3d_mesh_path_extrude/node_3d_mesh_path_extrude.yy",}, - {"name":"node_3d_mesh_plane","order":7,"path":"scripts/node_3d_mesh_plane/node_3d_mesh_plane.yy",}, - {"name":"node_3d_mesh_sphere_ico","order":5,"path":"scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.yy",}, - {"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_extrude","order":9,"path":"scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.yy",}, + {"name":"node_3d_mesh_obj","order":3,"path":"scripts/node_3d_mesh_obj/node_3d_mesh_obj.yy",}, + {"name":"node_3d_mesh_path_extrude","order":11,"path":"scripts/node_3d_mesh_path_extrude/node_3d_mesh_path_extrude.yy",}, + {"name":"node_3d_mesh_plane","order":8,"path":"scripts/node_3d_mesh_plane/node_3d_mesh_plane.yy",}, + {"name":"node_3d_mesh_sphere_ico","order":6,"path":"scripts/node_3d_mesh_sphere_ico/node_3d_mesh_sphere_ico.yy",}, + {"name":"node_3d_mesh_sphere_uv","order":5,"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_terrain","order":10,"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_mesh_wall_builder","order":13,"path":"scripts/node_3d_mesh_wall_builder/node_3d_mesh_wall_builder.yy",}, {"name":"node_3d_point_affector","order":12,"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",}, {"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_subdivide","order":10,"path":"scripts/node_3d_subdivide/node_3d_subdivide.yy",}, {"name":"node_3d_transform_image","order":13,"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",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 00f5256b0..4da71f50a 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1168,6 +1168,7 @@ {"id":{"name":"mtl_reader","path":"scripts/mtl_reader/mtl_reader.yy",},}, {"id":{"name":"network_data","path":"scripts/network_data/network_data.yy",},}, {"id":{"name":"node_2d_light","path":"scripts/node_2d_light/node_2d_light.yy",},}, + {"id":{"name":"node_3d_bend","path":"scripts/node_3d_bend/node_3d_bend.yy",},}, {"id":{"name":"node_3d_camera_set","path":"scripts/node_3d_camera_set/node_3d_camera_set.yy",},}, {"id":{"name":"node_3d_camera","path":"scripts/node_3d_camera/node_3d_camera.yy",},}, {"id":{"name":"node_3d_depth","path":"scripts/node_3d_depth/node_3d_depth.yy",},}, diff --git a/scripts/d3d_plane_mesh/d3d_plane_mesh.gml b/scripts/d3d_plane_mesh/d3d_plane_mesh.gml index e585f6af2..d53c10063 100644 --- a/scripts/d3d_plane_mesh/d3d_plane_mesh.gml +++ b/scripts/d3d_plane_mesh/d3d_plane_mesh.gml @@ -2,8 +2,7 @@ function __3dPlane() : __3dObject() constructor { VF = global.VF_POS_NORM_TEX_COL; render_type = pr_trianglelist; - self.normal = 0; - + normal = 0; two_side = false; static initModel = function() { diff --git a/scripts/node_3d_bend/node_3d_bend.gml b/scripts/node_3d_bend/node_3d_bend.gml new file mode 100644 index 000000000..e43dd35cf --- /dev/null +++ b/scripts/node_3d_bend/node_3d_bend.gml @@ -0,0 +1,69 @@ +function Node_3D_Bend(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _group) constructor { + name = "Bend Mesh"; + + var i = in_mesh; + newInput(i+0, nodeValue_Enum_Button("Axis", self, 0, [ "X", "Y", "Z"])); + + newInput(i+1, nodeValue_Float("Radius", self, 1)); + + newInput(i+2, nodeValue_Float("Amount", self, 1)); + + newInput(i+3, nodeValue_Vec3("Origin", self, [ 0, 0, 0 ])); + + newInput(i+4, nodeValue_Bool("Recalculate normal", self, true)); + + input_display_list = [ + ["Mesh", false], 0, + ["Bend", false], i+0, i+3, i+1, i+2, i+4, + ]; + + static processData = function(_output, _data, _output_index, _array_index = 0) { + var _obj = _data[0]; + var _axs = _data[in_mesh + 0]; + var _rad = _data[in_mesh + 1]; + var _amo = _data[in_mesh + 2]; + var _ori = _data[in_mesh + 3]; + var _nrm = _data[in_mesh + 4]; + + if(!is_instanceof(_obj, __3dObject)) return noone; + + var _res = _obj.clone(); + var _vlen = array_length(_res.vertex); + var _tarr = array_create_ext(_vlen, function(i) /*=>*/ {return i}); + + 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(_vt); j < m; j++ ) { + var _v = _vt[j]; + + _v.x += 1; + _v.y += 1; + _v.z += 1; + } + + 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(); + return _res; + } +} \ No newline at end of file diff --git a/scripts/node_3d_bend/node_3d_bend.yy b/scripts/node_3d_bend/node_3d_bend.yy new file mode 100644 index 000000000..73c77d38c --- /dev/null +++ b/scripts/node_3d_bend/node_3d_bend.yy @@ -0,0 +1,14 @@ +{ + "$GMScript":"v1", + "%Name":"node_3d_bend", + "isCompatibility":false, + "isDnD":false, + "name":"node_3d_bend", + "parent":{ + "name":"d3d_modifier", + "path":"folders/nodes/data/3D/d3d_modifier.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", + "tags":[], +} \ No newline at end of file diff --git a/scripts/node_3d_displace/node_3d_displace.gml b/scripts/node_3d_displace/node_3d_displace.gml index 0df1e5193..9fffcc349 100644 --- a/scripts/node_3d_displace/node_3d_displace.gml +++ b/scripts/node_3d_displace/node_3d_displace.gml @@ -1,5 +1,5 @@ function Node_3D_Displace(_x, _y, _group = noone) : Node_3D_Modifier(_x, _y, _group) constructor { - name = "Displace vertex"; + name = "Displace Vertex"; newInput(in_mesh + 0, nodeValue_D3Material("Displace Texture", self, new __d3dMaterial())) .setVisible(true, true); diff --git a/scripts/node_stack/node_stack.gml b/scripts/node_stack/node_stack.gml index f958d4161..ba0cc567a 100644 --- a/scripts/node_stack/node_stack.gml +++ b/scripts/node_stack/node_stack.gml @@ -15,11 +15,20 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { newInput(3, nodeValue_Padding("Padding", self, [ 0, 0, 0, 0 ])) .rejectArray(); + newInput(4, nodeValue_Enum_Scroll("Blend Mode", self, 0, BLEND_TYPES)) + .rejectArray(); + newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone)); newOutput(1, nodeValue_Output("Atlas data", self, VALUE_TYPE.atlas, [])); - temp_surface = [ noone, noone ]; + input_display_list = [ + ["Stack", false], 0, 1, 2, 3, + ["Render", false], 4, + ["Surfaces", false], + ] + + temp_surface = [ noone, noone, noone ]; static createNewInput = function() { var index = array_length(inputs); @@ -31,18 +40,19 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { attribute_surface_depth(); - static step = function() { #region + static step = function() { var _axis = getInputData(0); inputs[1].setVisible(_axis != 2); inputs[2].setVisible(_axis != 2); - } #endregion + } - static update = function(frame = CURRENT_FRAME) { #region + static update = function(frame = CURRENT_FRAME) { var _axis = getInputData(0); var _alig = getInputData(1); var _spac = getInputData(2); var _padd = getInputData(3); + var _blnd = getInputData(4); var ww = 0; var hh = 0; @@ -78,11 +88,9 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { var _outSurf = outputs[0].getValue(); _outSurf = surface_verify(_outSurf, ow, oh, attrDepth()); - temp_surface[0] = surface_verify(temp_surface[0], ow, oh, attrDepth()); - temp_surface[1] = surface_verify(temp_surface[1], ow, oh, attrDepth()); - - surface_clear(temp_surface[0]); - surface_clear(temp_surface[1]); + for( var i = 0, n = array_length(temp_surface); i < n; i++ ) + temp_surface[i] = surface_verify(temp_surface[i], ow, oh, attrDepth()); + blend_temp_surface = temp_surface[2]; var atlas = []; var ppind = 0; @@ -103,35 +111,31 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { case fa_center: sy = hh / 2 - sh / 2; break; case fa_right: sy = hh - sh; break; } + } else if(_axis == 1) { switch(_alig) { case fa_left: sx = 0; break; case fa_center: sx = ww / 2 - sw / 2; break; case fa_right: sx = ww - sw; break; } + } else if(_axis == 2) { sx = ww / 2 - sw / 2; sy = hh / 2 - sh / 2; } + var px = sx + _padd[PADDING.left]; + var py = sy + _padd[PADDING.top] + array_push(atlas, new SurfaceAtlas(_surf[j], sx, sy)); - surface_set_shader(temp_surface[!ppind], sh_draw_surface); - DRAW_CLEAR - BLEND_OVERRIDE - shader_set_f("dimension", ow, oh); - - shader_set_surface("fore", _surf[j]); - shader_set_f("fdimension", sw, sh); - shader_set_f("position", sx + _padd[PADDING.left], sy + _padd[PADDING.top]); - - draw_surface_safe(temp_surface[ppind]); - - BLEND_NORMAL + + surface_set_shader(temp_surface[!ppind], noone, true, BLEND.over); + draw_surface_blend_ext(temp_surface[ppind], _surf[j], px, py, 1, 1, 0, c_white, 1, _blnd); surface_reset_shader(); - + ppind = !ppind; - if(_axis == 0) sx += sw + _spac; + if(_axis == 0) sx += sw + _spac; else if(_axis == 1) sy += sh + _spac; } } @@ -147,6 +151,6 @@ function Node_Stack(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { outputs[0].setValue(_outSurf); outputs[1].setValue(atlas); - } #endregion + } } diff --git a/shaders/sh_draw_surface/sh_draw_surface.fsh b/shaders/sh_draw_surface/sh_draw_surface.fsh index 88c685023..0561dd901 100644 --- a/shaders/sh_draw_surface/sh_draw_surface.fsh +++ b/shaders/sh_draw_surface/sh_draw_surface.fsh @@ -1,6 +1,3 @@ -// -// Simple passthrough fragment shader -// varying vec2 v_vTexcoord; varying vec4 v_vColour;