- New Diffuse node.

This commit is contained in:
Tanasart 2024-01-19 20:39:26 +07:00
parent fc0bf1d8b5
commit 8380e460f0
27 changed files with 481 additions and 26 deletions

View file

@ -222,9 +222,7 @@
{"name":"filter","order":4,"path":"folders/shader/filter.yy",},
{"name":"color","order":53,"path":"folders/shader/filter/color.yy",},
{"name":"shadow caster","order":46,"path":"folders/shader/filter/shadow caster.yy",},
{"name":"FLIP","order":23,"path":"folders/shader/FLIP.yy",},
{"name":"flood fill","order":11,"path":"folders/shader/flood fill.yy",},
{"name":"fluid","order":20,"path":"folders/shader/fluid.yy",},
{"name":"generator","order":1,"path":"folders/shader/generator.yy",},
{"name":"blinker","order":30,"path":"folders/shader/generator/blinker.yy",},
{"name":"cell","order":31,"path":"folders/shader/generator/cell.yy",},
@ -243,6 +241,9 @@
{"name":"morph","order":17,"path":"folders/shader/morph.yy",},
{"name":"pixel builder","order":18,"path":"folders/shader/pixel builder.yy",},
{"name":"shape seperator","order":5,"path":"folders/shader/shape seperator.yy",},
{"name":"simulation","order":24,"path":"folders/shader/simulation.yy",},
{"name":"diffuse","order":3,"path":"folders/shader/simulation/diffuse.yy",},
{"name":"fluid","order":1,"path":"folders/shader/simulation/fluid.yy",},
{"name":"sprites","order":2,"path":"folders/shader/sprites.yy",},
{"name":"surface replace","order":16,"path":"folders/shader/surface replace.yy",},
{"name":"transition","order":15,"path":"folders/shader/transition.yy",},
@ -892,6 +893,7 @@
{"name":"node_boolean","order":17,"path":"scripts/node_boolean/node_boolean.yy",},
{"name":"node_grid_tri","order":3,"path":"scripts/node_grid_tri/node_grid_tri.yy",},
{"name":"node_average","order":5,"path":"scripts/node_average/node_average.yy",},
{"name":"sh_diffuse_flow","order":1,"path":"shaders/sh_diffuse_flow/sh_diffuse_flow.yy",},
{"name":"node_mesh_transform","order":2,"path":"scripts/node_mesh_transform/node_mesh_transform.yy",},
{"name":"node_fluid_turbulence","order":10,"path":"scripts/node_fluid_turbulence/node_fluid_turbulence.yy",},
{"name":"sh_sdf","order":1,"path":"shaders/sh_sdf/sh_sdf.yy",},
@ -959,6 +961,7 @@
{"name":"node_path_builder","order":9,"path":"scripts/node_path_builder/node_path_builder.yy",},
{"name":"o_dialog_gradient","order":1,"path":"objects/o_dialog_gradient/o_dialog_gradient.yy",},
{"name":"sh_channel_R_grey","order":7,"path":"shaders/sh_channel_R_grey/sh_channel_R_grey.yy",},
{"name":"s_node_diffuse","order":63,"path":"sprites/s_node_diffuse/s_node_diffuse.yy",},
{"name":"node_array_sample","order":18,"path":"scripts/node_array_sample/node_array_sample.yy",},
{"name":"sh_blend_subtract","order":5,"path":"shaders/sh_blend_subtract/sh_blend_subtract.yy",},
{"name":"BBMOD_Vec4","order":6,"path":"scripts/BBMOD_Vec4/BBMOD_Vec4.yy",},
@ -1070,6 +1073,7 @@
{"name":"s_node_dynasurf","order":3,"path":"sprites/s_node_dynasurf/s_node_dynasurf.yy",},
{"name":"obj_reader","order":2,"path":"scripts/obj_reader/obj_reader.yy",},
{"name":"sh_invert","order":17,"path":"shaders/sh_invert/sh_invert.yy",},
{"name":"node_diffuse","order":26,"path":"scripts/node_diffuse/node_diffuse.yy",},
{"name":"preview_overlay_puppet","order":4,"path":"scripts/preview_overlay_puppet/preview_overlay_puppet.yy",},
{"name":"s_icon_64","order":2,"path":"sprites/s_icon_64/s_icon_64.yy",},
{"name":"panel_graph_export_image","order":4,"path":"scripts/panel_graph_export_image/panel_graph_export_image.yy",},
@ -1471,6 +1475,7 @@
{"name":"sh_noise_wavelet","order":12,"path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",},
{"name":"node_cache_base","order":18,"path":"scripts/node_cache_base/node_cache_base.yy",},
{"name":"fd_rectangle_set_velocity_dissipation_type","order":13,"path":"scripts/fd_rectangle_set_velocity_dissipation_type/fd_rectangle_set_velocity_dissipation_type.yy",},
{"name":"sh_diffuse_post","order":2,"path":"shaders/sh_diffuse_post/sh_diffuse_post.yy",},
{"name":"node_color_replacement","order":3,"path":"scripts/node_color_replacement/node_color_replacement.yy",},
{"name":"path_reader","order":5,"path":"scripts/path_reader/path_reader.yy",},
{"name":"__node_3d_repeat","order":6,"path":"scripts/__node_3d_repeat/__node_3d_repeat.yy",},

View file

@ -254,9 +254,7 @@
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"filter","folderPath":"folders/shader/filter.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"color","folderPath":"folders/shader/filter/color.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"shadow caster","folderPath":"folders/shader/filter/shadow caster.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"FLIP","folderPath":"folders/shader/FLIP.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"flood fill","folderPath":"folders/shader/flood fill.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"fluid","folderPath":"folders/shader/fluid.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"generator","folderPath":"folders/shader/generator.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"blinker","folderPath":"folders/shader/generator/blinker.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"cell","folderPath":"folders/shader/generator/cell.yy",},
@ -275,6 +273,10 @@
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"morph","folderPath":"folders/shader/morph.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"pixel builder","folderPath":"folders/shader/pixel builder.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"shape seperator","folderPath":"folders/shader/shape seperator.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"simulation","folderPath":"folders/shader/simulation.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"diffuse","folderPath":"folders/shader/simulation/diffuse.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"FLIP","folderPath":"folders/shader/simulation/FLIP.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"fluid","folderPath":"folders/shader/simulation/fluid.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"sprites","folderPath":"folders/shader/sprites.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"surface replace","folderPath":"folders/shader/surface replace.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"transition","folderPath":"folders/shader/transition.yy",},
@ -1169,6 +1171,7 @@
{"id":{"name":"node_boolean","path":"scripts/node_boolean/node_boolean.yy",},},
{"id":{"name":"node_grid_tri","path":"scripts/node_grid_tri/node_grid_tri.yy",},},
{"id":{"name":"node_average","path":"scripts/node_average/node_average.yy",},},
{"id":{"name":"sh_diffuse_flow","path":"shaders/sh_diffuse_flow/sh_diffuse_flow.yy",},},
{"id":{"name":"node_mesh_transform","path":"scripts/node_mesh_transform/node_mesh_transform.yy",},},
{"id":{"name":"node_fluid_turbulence","path":"scripts/node_fluid_turbulence/node_fluid_turbulence.yy",},},
{"id":{"name":"sh_sdf","path":"shaders/sh_sdf/sh_sdf.yy",},},
@ -1248,6 +1251,7 @@
{"id":{"name":"node_path_builder","path":"scripts/node_path_builder/node_path_builder.yy",},},
{"id":{"name":"o_dialog_gradient","path":"objects/o_dialog_gradient/o_dialog_gradient.yy",},},
{"id":{"name":"sh_channel_R_grey","path":"shaders/sh_channel_R_grey/sh_channel_R_grey.yy",},},
{"id":{"name":"s_node_diffuse","path":"sprites/s_node_diffuse/s_node_diffuse.yy",},},
{"id":{"name":"node_array_sample","path":"scripts/node_array_sample/node_array_sample.yy",},},
{"id":{"name":"sh_blend_subtract","path":"shaders/sh_blend_subtract/sh_blend_subtract.yy",},},
{"id":{"name":"BBMOD_Vec4","path":"scripts/BBMOD_Vec4/BBMOD_Vec4.yy",},},
@ -1370,6 +1374,7 @@
{"id":{"name":"s_node_dynasurf","path":"sprites/s_node_dynasurf/s_node_dynasurf.yy",},},
{"id":{"name":"obj_reader","path":"scripts/obj_reader/obj_reader.yy",},},
{"id":{"name":"sh_invert","path":"shaders/sh_invert/sh_invert.yy",},},
{"id":{"name":"node_diffuse","path":"scripts/node_diffuse/node_diffuse.yy",},},
{"id":{"name":"preview_overlay_puppet","path":"scripts/preview_overlay_puppet/preview_overlay_puppet.yy",},},
{"id":{"name":"__mesh","path":"scripts/__mesh/__mesh.yy",},},
{"id":{"name":"s_icon_64","path":"sprites/s_icon_64/s_icon_64.yy",},},
@ -1617,6 +1622,7 @@
{"id":{"name":"s_node_path_shift","path":"sprites/s_node_path_shift/s_node_path_shift.yy",},},
{"id":{"name":"node_rigid_group","path":"scripts/node_rigid_group/node_rigid_group.yy",},},
{"id":{"name":"sh_slice_spritesheet_empty_scan","path":"shaders/sh_slice_spritesheet_empty_scan/sh_slice_spritesheet_empty_scan.yy",},},
{"id":{"name":"sh_diffuse_dissipate","path":"shaders/sh_diffuse_dissipate/sh_diffuse_dissipate.yy",},},
{"id":{"name":"s_node_grid_tri","path":"sprites/s_node_grid_tri/s_node_grid_tri.yy",},},
{"id":{"name":"s_node_local_analyze","path":"sprites/s_node_local_analyze/s_node_local_analyze.yy",},},
{"id":{"name":"_f_p0b","path":"fonts/_f_p0b/_f_p0b.yy",},},
@ -1829,6 +1835,7 @@
{"id":{"name":"sh_noise_wavelet","path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",},},
{"id":{"name":"node_cache_base","path":"scripts/node_cache_base/node_cache_base.yy",},},
{"id":{"name":"fd_rectangle_set_velocity_dissipation_type","path":"scripts/fd_rectangle_set_velocity_dissipation_type/fd_rectangle_set_velocity_dissipation_type.yy",},},
{"id":{"name":"sh_diffuse_post","path":"shaders/sh_diffuse_post/sh_diffuse_post.yy",},},
{"id":{"name":"node_color_replacement","path":"scripts/node_color_replacement/node_color_replacement.yy",},},
{"id":{"name":"path_reader","path":"scripts/path_reader/path_reader.yy",},},
{"id":{"name":"__node_3d_repeat","path":"scripts/__node_3d_repeat/__node_3d_repeat.yy",},},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -0,0 +1,90 @@
function Node_Diffuse(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
name = "Diffuse";
inputs[| 0] = nodeValue("Density field", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone );
inputs[| 1] = nodeValue("Dissipation", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.05)
.setDisplay(VALUE_DISPLAY.slider, { range: [ -0.2, 0.2, 0.001] });
inputs[| 2] = nodeValue("Scale", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 4)
inputs[| 3] = nodeValue("Randomness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 100)
inputs[| 4] = nodeValue("Flow rate", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1)
.setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 0.2, 0.001] });
inputs[| 5] = nodeValue("Thershold", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0.5, 0.7 ])
.setDisplay(VALUE_DISPLAY.slider_range);
inputs[| 6] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, seed_random())
inputs[| 7] = nodeValue("External", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone );
inputs[| 8] = nodeValue("External strength", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.3)
.setDisplay(VALUE_DISPLAY.slider, { range: [ -1, 1, 0.01] });
inputs[| 9] = nodeValue("Detail", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1)
outputs[| 0] = nodeValue("Result", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone);
input_display_list = [ 0, 6,
["Diffuse", false], 1,
["Flow", false], 2, 9, 3, 4,
["Forces", false], 7, 8,
["Rendering", false], 5,
]
temp_surface = [ surface_create(1, 1), surface_create(1, 1) ];
static update = function() {
var _surf = getInputData(0);
var _diss = getInputData(1);
var _scal = getInputData(2);
var _rand = getInputData(3);
var _flow = getInputData(4);
var _thre = getInputData(5);
var _seed = getInputData(6);
var _forc = getInputData(7);
var _fstr = getInputData(8);
var _detl = getInputData(9);
if(!is_surface(_surf)) return;
var _sw = surface_get_width_safe(_surf);
var _sh = surface_get_height_safe(_surf);
var _outSurf = outputs[| 0].getValue();
_outSurf = surface_verify(_outSurf, _sw, _sh);
temp_surface[0] = surface_verify(temp_surface[0], _sw, _sh);
temp_surface[1] = surface_verify(temp_surface[1], _sw, _sh);
surface_set_shader(temp_surface[0], sh_diffuse_dissipate);
shader_set_f("dimension", _sw, _sh);
shader_set_f("dissipation", 1 - _diss);
draw_surface_safe(_surf);
surface_reset_shader();
surface_set_shader(temp_surface[1], sh_diffuse_flow);
shader_set_f("dimension", _sw, _sh);
shader_set_f("scale", _scal);
shader_set_i("detail", _detl);
shader_set_f("flowRate", _flow);
shader_set_f("seed", _seed + CURRENT_FRAME / _rand);
shader_set_i("useExternal", is_surface(_forc));
shader_set_f("externalStrength", _fstr);
shader_set_surface("externalForce", _forc);
draw_surface_safe(temp_surface[0]);
surface_reset_shader();
surface_set_shader(_outSurf, sh_diffuse_post);
shader_set_f("dimension", _sw, _sh);
shader_set_f("threshold", _thre);
draw_surface_safe(temp_surface[1]);
surface_reset_shader();
outputs[| 0].setValue(_outSurf);
}
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "node_diffuse",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "generator",
"path": "folders/nodes/data/generator.yy",
},
}

View file

@ -492,7 +492,7 @@ function __initNodes() {
addNodeObject(filter, "RGBA Combine", s_node_RGB_combine, "Node_Combine_RGB", [1, Node_Combine_RGB],, "Combine 4 image in to one. Each image use to control RGBA channel.").setVersion(1070);
addNodeObject(filter, "HSV Combine", s_node_HSV_combine, "Node_Combine_HSV", [1, Node_Combine_HSV],, "Combine 4 image in to one. Each image use to control HSVA channel.").setVersion(1070);
addNodeObject(filter, "Override Channel", s_node_ovreride_channel, "Node_Override_Channel", [1, Node_Override_Channel],, "Replace RGBA value of one surface with anothers.").setVersion(11640);
ds_list_add(filter, "Blurs");
addNodeObject(filter, "Blur", s_node_blur, "Node_Blur", [1, Node_Blur], ["gaussian blur"], "Blur image smoothly.");
addNodeObject(filter, "Simple Blur", s_node_blur_simple, "Node_Blur_Simple", [1, Node_Blur_Simple],, "Blur image using simpler algorithm. Allowing for variable blur strength.").setVersion(1070);
@ -502,7 +502,7 @@ function __initNodes() {
addNodeObject(filter, "Lens Blur", s_node_bokeh, "Node_Blur_Bokeh", [1, Node_Blur_Bokeh], ["bokeh"], "Create bokeh effect. Blur lighter color in a lens-like manner.").setVersion(1110);
addNodeObject(filter, "Contrast Blur", s_node_blur_contrast, "Node_Blur_Contrast", [1, Node_Blur_Contrast],, "Blur only pixel of a similiar color.");
addNodeObject(filter, "Average", s_node_average, "Node_Average", [1, Node_Average],, "Average color of every pixels in the image.").setVersion(1110);
ds_list_add(filter, "Warps");
addNodeObject(filter, "Mirror", s_node_mirror, "Node_Mirror", [1, Node_Mirror],, "Reflect the image along a reflection line.").setVersion(1070);
addNodeObject(filter, "Twirl", s_node_twirl, "Node_Twirl", [1, Node_Twirl], ["twist"], "Twist the image around a mid point.");
@ -660,6 +660,7 @@ function __initNodes() {
addNodeObject(generator, "FLIP Fluid", s_node_fluidSim_group, "Node_FLIP_Group_Inline", [1, Node_FLIP_Group_Inline],, "Create group for fluid simulation.").setVersion(11620);
addNodeObject(generator, "SmokeSim", s_node_smokeSim_group, "Node_Fluid_Group_Inline", [1, Node_Fluid_Group_Inline],, "Create group for smoke simulation.").setVersion(1120);
addNodeObject(generator, "StrandSim", s_node_strandSim, "Node_Strand_Group_Inline", [1, Node_Strand_Group_Inline], ["Hair"], "Create group for hair simulation.").setVersion(1140);
addNodeObject(generator, "Diffuse", s_node_diffuse, "Node_Diffuse", [1, Node_Diffuse],, "Simulate diffusion like simulation.").setVersion(11640);
addNodeObject(generator, "Reaction Diffusion", s_node_reaction_diffusion, "Node_RD", [1, Node_RD],, "Simulate reaction diffusion effect.").setVersion(11630);
ds_list_add(generator, "Region");

View file

@ -1,4 +1,4 @@
enum NODE_SHAPE_TYPE { rectangle, elipse, regular, star, arc, teardrop, cross, leaf, crescent }
enum NODE_SHAPE_TYPE { rectangle, elipse, regular, star, arc, teardrop, cross, leaf, crescent, donut }
function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
name = "Shape";
@ -9,7 +9,7 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
inputs[| 1] = nodeValue("Background", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false);
inputs[| 2] = nodeValue("Shape", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Rectangle", "Ellipse", "Regular polygon", "Star", "Arc", "Teardrop", "Cross", "Leaf", "Crescent" ]);
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Rectangle", "Ellipse", "Regular polygon", "Star", "Arc", "Teardrop", "Cross", "Leaf", "Crescent", "Donut" ]);
onSurfaceSize = function() { return getInputData(0, DEF_SURF); };
inputs[| 3] = nodeValue("Position", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ DEF_SURF_W / 2, DEF_SURF_H / 2, DEF_SURF_W / 2, DEF_SURF_H / 2, AREA_SHAPE.rectangle ])
@ -275,12 +275,21 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con
break;
case NODE_SHAPE_TYPE.crescent :
inputs[| 5].setVisible(true);
inputs[| 7].setVisible(true);
inputs[| 13].setVisible(true);
inputs[| 5].name = "Shift";
inputs[| 13].name = "Inner circle";
shader_set_f("outer", _data[ 5]);
shader_set_f("angle", -degtorad(_data[7]));
shader_set_f("inner", _data[13]);
break;
case NODE_SHAPE_TYPE.donut :
inputs[| 13].setVisible(true);
inputs[| 13].name = "Inner circle";
shader_set_f("inner", _data[13]);
break;
} #endregion

View file

@ -1088,7 +1088,7 @@ function Panel_Preview() : PanelContent() constructor {
var overlayHover = tool_hovering == noone && !overlay_hovering;
overlayHover &= active && isHover;
overlayHover &= point_in_rectangle(mx, my, toolbar_width, toolbar_height, w, h - toolbar_height);
overlayHover &= point_in_rectangle(mx, my, (_node.tools != -1) * toolbar_width, toolbar_height, w, h - toolbar_height);
overlayHover &= !key_mod_press(CTRL);
var params = { w, h, toolbar_height };

View file

@ -4,7 +4,7 @@
"name": "sh_FLIP_draw_droplet",
"parent": {
"name": "FLIP",
"path": "folders/shader/FLIP.yy",
"path": "folders/shader/simulation/FLIP.yy",
},
"type": 1,
}

View file

@ -4,7 +4,7 @@
"name": "sh_FLIP_render_threshold",
"parent": {
"name": "FLIP",
"path": "folders/shader/FLIP.yy",
"path": "folders/shader/simulation/FLIP.yy",
},
"type": 1,
}

View file

@ -0,0 +1,24 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform float dissipation;
void main() {
vec2 tx = 1. / dimension;
vec4 f0 = texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, -tx.y) );
vec4 f1 = texture2D( gm_BaseTexture, v_vTexcoord + vec2( 0., -tx.y) );
vec4 f2 = texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, -tx.y) );
vec4 f3 = texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, 0.) );
vec4 f4 = texture2D( gm_BaseTexture, v_vTexcoord + vec2( 0., 0.) );
vec4 f5 = texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, 0.) );
vec4 f6 = texture2D( gm_BaseTexture, v_vTexcoord + vec2(-tx.x, tx.y) );
vec4 f7 = texture2D( gm_BaseTexture, v_vTexcoord + vec2( 0., tx.y) );
vec4 f8 = texture2D( gm_BaseTexture, v_vTexcoord + vec2( tx.x, tx.y) );
vec4 clr = (f0 + f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8) / 9.;
gl_FragColor = vec4(clr.rgb * dissipation, clr.a);
}

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,10 @@
{
"resourceType": "GMShader",
"resourceVersion": "1.0",
"name": "sh_diffuse_dissipate",
"parent": {
"name": "diffuse",
"path": "folders/shader/simulation/diffuse.yy",
},
"type": 1,
}

View file

@ -0,0 +1,134 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform float seed;
uniform float scale;
uniform int detail;
uniform float flowRate;
uniform int useExternal;
uniform float externalStrength;
uniform sampler2D externalForce;
float random (in vec2 st) { return fract(sin(dot(st.xy + vec2(21.456, 46.856), vec2(12.989, 78.233))) * 43758.545); }
float grey (vec4 col) { return (col.r + col.g + col.b) / 3.; }
vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
vec4 permute(vec4 x) { return mod289(((x * 34.0) + 10.0) * x); }
vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }
float snoise(vec3 vec) { #region
vec3 v = vec * 4.;
const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
// First corner
vec3 i = floor(v + dot(v, C.yyy));
vec3 x0 = v - i + dot(i, C.xxx);
// Other corners
vec3 g = step(x0.yzx, x0.xyz);
vec3 l = 1.0 - g;
vec3 i1 = min( g.xyz, l.zxy );
vec3 i2 = max( g.xyz, l.zxy );
// x0 = x0 - 0.0 + 0.0 * C.xxx;
// x1 = x0 - i1 + 1.0 * C.xxx;
// x2 = x0 - i2 + 2.0 * C.xxx;
// x3 = x0 - 1.0 + 3.0 * C.xxx;
vec3 x1 = x0 - i1 + C.xxx;
vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y
// Permutations
i = mod289(i);
vec4 p = permute( permute( permute(
i.z + vec4(0.0, i1.z, i2.z, 1.0 ))
+ i.y + vec4(0.0, i1.y, i2.y, 1.0 ))
+ i.x + vec4(0.0, i1.x, i2.x, 1.0 ));
// Gradients: 7x7 points over a square, mapped onto an octahedron.
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
float n_ = 0.142857142857; // 1.0/7.0
vec3 ns = n_ * D.wyz - D.xzx;
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)
vec4 x_ = floor(j * ns.z);
vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)
vec4 x = x_ * ns.x + ns.yyyy;
vec4 y = y_ * ns.x + ns.yyyy;
vec4 h = 1.0 - abs(x) - abs(y);
vec4 b0 = vec4( x.xy, y.xy );
vec4 b1 = vec4( x.zw, y.zw );
//vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
//vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
vec4 s0 = floor(b0) * 2.0 + 1.0;
vec4 s1 = floor(b1) * 2.0 + 1.0;
vec4 sh = -step(h, vec4(0.0));
vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy ;
vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww ;
vec3 p0 = vec3(a0.xy, h.x);
vec3 p1 = vec3(a0.zw, h.y);
vec3 p2 = vec3(a1.xy, h.z);
vec3 p3 = vec3(a1.zw, h.w);
//Normalise gradients
vec4 norm = taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
p0 *= norm.x;
p1 *= norm.y;
p2 *= norm.z;
p3 *= norm.w;
// Mix final noise value
vec4 m = max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
m = m * m;
float n = 105.0 * dot( m * m, vec4( dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3) ) );
n = mix(0.0, 0.5 + 0.5 * n, smoothstep(0.0, 0.003, vec.z));
return n;
} #endregion
float simplex(in vec2 st, in int itr) { #region
vec2 p = st * 2.0 - 1.0;
vec3 xyz = vec3(p, seed);
float amp = pow(2., float(itr) - 1.) / (pow(2., float(itr)) - 1.);
float n = 0.;
for(int i = 0; i < 32; i++) {
if(i >= itr) break;
n += snoise(xyz) * amp;
amp *= .5;
xyz *= 2.;
}
return n;
} #endregion
void main() {
vec2 tx = 1. / dimension;
float x0 = simplex((v_vTexcoord + vec2(-tx.x, 0.)) / scale, detail);
float x1 = simplex((v_vTexcoord + vec2( tx.x, 0.)) / scale, detail);
float y0 = simplex((v_vTexcoord + vec2(0., -tx.y)) / scale, detail);
float y1 = simplex((v_vTexcoord + vec2(0., tx.y)) / scale, detail);
vec2 flow = vec2(x1 - x0, y1 - y0);
if(useExternal == 1) {
vec4 _forc = texture2D( externalForce, v_vTexcoord );
flow -= (_forc.xy - 0.5) * 2. * externalStrength;
}
gl_FragColor = texture2D( gm_BaseTexture, v_vTexcoord - flow * flowRate );
}

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,10 @@
{
"resourceType": "GMShader",
"resourceVersion": "1.0",
"name": "sh_diffuse_flow",
"parent": {
"name": "diffuse",
"path": "folders/shader/simulation/diffuse.yy",
},
"type": 1,
}

View file

@ -0,0 +1,12 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform vec2 dimension;
uniform vec2 threshold;
void main() {
vec4 c = texture2D( gm_BaseTexture, v_vTexcoord );
float a = (c.r + c.g + c.b) / 3.;
gl_FragColor = vec4(vec3(smoothstep(threshold[0], threshold[1], a)), 1.);
}

View file

@ -0,0 +1,19 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View file

@ -0,0 +1,10 @@
{
"resourceType": "GMShader",
"resourceVersion": "1.0",
"name": "sh_diffuse_post",
"parent": {
"name": "diffuse",
"path": "folders/shader/simulation/diffuse.yy",
},
"type": 1,
}

View file

@ -4,7 +4,7 @@
"name": "sh_fluid_bleach",
"parent": {
"name": "fluid",
"path": "folders/shader/fluid.yy",
"path": "folders/shader/simulation/fluid.yy",
},
"type": 1,
}

View file

@ -109,9 +109,16 @@ float sdVesica(vec2 p, float r, float d) { #region
: length(p-vec2(-d,0.0))-r;
} #endregion
float sdCrescent(vec2 p, float s, float c) { #region
float sdCrescent(vec2 p, float s, float c, float a) { #region
float o = length(p) - 1.;
float i = length(p - vec2(1. - s * c, 0.)) / s - 1.;
float i = length(p - vec2(cos(a) * (1. - s * c), sin(a) * (1. - s * c))) / s - 1.;
return max(o, -i);
} #endregion
float sdDonut(vec2 p, float s) { #region
float o = length(p) - 1.;
float i = length(p) / s - 1.;
return max(o, -i);
} #endregion
@ -135,19 +142,13 @@ void main() {
} else if(shape == 3) {
d = sdStar( coord, 0.9 - corner, sides, 2. + inner * (float(sides) - 2.), angle );
d -= corner;
} else if(shape == 4) {
d = sdArc( coord, vec2(sin(angle), cos(angle)), angle_range, 0.9 - inner, inner );
} else if(shape == 5) {
d = sdTearDrop( coord + vec2(0., 0.5), stRad, edRad, 1. );
} else if(shape == 6) {
d = sdCross( coord, vec2(1. + corner, outer), corner );
} else if(shape == 7) {
d = sdVesica( coord, inner, outer );
} else if(shape == 8) {
d = sdCrescent( coord, inner, outer );
}
} else if(shape == 4) d = sdArc( coord, vec2(sin(angle), cos(angle)), angle_range, 0.9 - inner, inner );
else if(shape == 5) d = sdTearDrop( coord + vec2(0., 0.5), stRad, edRad, 1. );
else if(shape == 6) d = sdCross( coord, vec2(1. + corner, outer), corner );
else if(shape == 7) d = sdVesica( coord, inner, outer );
else if(shape == 8) d = sdCrescent( coord, inner, outer, angle );
else if(shape == 9) d = sdDonut( coord, inner );
//d = d;
if(drawDF == 1)
color = -d;
else if(aa == 0)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,74 @@
{
"resourceType": "GMSprite",
"resourceVersion": "1.0",
"name": "s_node_diffuse",
"bbox_bottom": 63,
"bbox_left": 0,
"bbox_right": 63,
"bbox_top": 0,
"bboxMode": 0,
"collisionKind": 1,
"collisionTolerance": 0,
"DynamicTexturePage": false,
"edgeFiltering": false,
"For3D": false,
"frames": [
{"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"d1e85f96-d61b-4899-8e77-6ea2e64c5d6d",},
],
"gridX": 0,
"gridY": 0,
"height": 64,
"HTile": false,
"layers": [
{"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"97939aed-8fe8-4d7a-b6cb-3a8e69c6a402","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,},
],
"nineSlice": null,
"origin": 4,
"parent": {
"name": "filter",
"path": "folders/nodes/icons/filter.yy",
},
"preMultiplyAlpha": false,
"sequence": {
"resourceType": "GMSequence",
"resourceVersion": "1.4",
"name": "s_node_diffuse",
"autoRecord": true,
"backdropHeight": 768,
"backdropImageOpacity": 0.5,
"backdropImagePath": "",
"backdropWidth": 1366,
"backdropXOffset": 0.0,
"backdropYOffset": 0.0,
"events": {"resourceType":"KeyframeStore<MessageEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"eventStubScript": null,
"eventToFunction": {},
"length": 1.0,
"lockOrigin": false,
"moments": {"resourceType":"KeyframeStore<MomentsEventKeyframe>","resourceVersion":"1.0","Keyframes":[],},
"playback": 1,
"playbackSpeed": 30.0,
"playbackSpeedType": 0,
"showBackdrop": true,
"showBackdropImage": false,
"timeUnits": 1,
"tracks": [
{"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"1.0","Keyframes":[
{"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"d1e85f96-d61b-4899-8e77-6ea2e64c5d6d","path":"sprites/s_node_diffuse/s_node_diffuse.yy",},},},"Disabled":false,"id":"fa33f3e1-5206-4403-8ae9-a15881009356","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,},
],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
],
"visibleRange": null,
"volume": 1.0,
"xorigin": 32,
"yorigin": 32,
},
"swatchColours": null,
"swfPrecision": 2.525,
"textureGroupId": {
"name": "Default",
"path": "texturegroups/Default",
},
"type": 0,
"VTile": false,
"width": 64,
}