diff --git a/examples/mystery_sand/node_2d.tscn b/examples/mystery_sand/node_2d.tscn new file mode 100644 index 0000000..53d2265 --- /dev/null +++ b/examples/mystery_sand/node_2d.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=3 uid="uid://kgubng073jgd"] + +[ext_resource type="Script" path="res://addons/compute_shader_studio/compute_shader_studio_2d.gd" id="1_pm5r1"] +[ext_resource type="Texture2D" uid="uid://demftcowdd5c6" path="res://examples/icon.svg" id="2_truio"] + +[sub_resource type="GDScript" id="GDScript_p6fp7"] +script/source = "extends Sprite2D + +var compute_shader_material +# Called when the node enters the scene tree for the first time. +func _ready(): + pass; + + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass; + +" + +[node name="Node2D" type="Node2D"] +metadata/_edit_horizontal_guides_ = [-262.0] + +[node name="ComputeShaderStudio2D" type="Node" parent="." node_paths=PackedStringArray("data")] +script = ExtResource("1_pm5r1") +glsl_file = "res://examples/2dFluidSimulation/shader.cpp" +GLSL_code = "" +data = [NodePath("../Icon")] + +[node name="Icon" type="Sprite2D" parent="."] +texture_filter = 1 +position = Vector2(574.5, 327.5) +scale = Vector2(8.97656, 5.14844) +texture = ExtResource("2_truio") +script = SubResource("GDScript_p6fp7") diff --git a/examples/mystery_sand/shader.cpp b/examples/mystery_sand/shader.cpp new file mode 100644 index 0000000..fa7aa4e --- /dev/null +++ b/examples/mystery_sand/shader.cpp @@ -0,0 +1,141 @@ + +// Write your code HERE +int mouseClicked = 0; + + +void main() { + + uint x = gl_GlobalInvocationID.x; + uint y = gl_GlobalInvocationID.y; + uint p = x + y * WSX; + + //initialisation + if(step == 0){ + if(x>50 && x<70 && y>50 && y<80){ + data_0[p] = 0xFF00FF00; //fluide initial + } + else if(y>120){ + data_0[p] = 0xFFFFFFFF; //sol + } + else if(x>125 || x < 3){ + data_0[p] = 0xFFFFFFFF; + } + else{ + data_0[p] = 0x00000000; //backround + } + } + //boucle principale + else{ + //mouse left + if(x == mousex && y==mousey && mouse_button == 1){ + data_0[p] = 0xFFFFFFFF; + data_0[p+1] = 0xFFFFFFFF; + data_0[p-1] = 0xFFFFFFFF; + data_0[p+WSX] = 0xFFFFFFFF; + data_0[p+WSX+1] = 0xFFFFFFFF; + data_0[p+WSX-1] = 0xFFFFFFFF; + } + if(x == mousex && y==mousey && mouse_button == 0){ + data_0[p] = 0xFF0000FF; + } + //mouse left + if(x == mousex && y==mousey && mouse_button == 2){ + data_0[p] = 0xFF00FF00; + } + //both at the same time + if(x == mousex && y==mousey && mouse_button == 3){ + data_0[p] = 0xFFFF0000; + } + //si le pixel est non vide et non sol + if(data_0[p] != 0xFFFFFFFF && data_0[p]!= 0x00000000){ + //il tombe + if(data_0[p+WSX] == 0x00000000){ + data_0[p+WSX] = data_0[p]; + data_0[p] = 0x00000000; + } + //l'eau va sur les cotes + + //vide a gauche en bas + else if(data_0[p-1+WSX] == 0x00000000){ + data_0[p-1+WSX] = data_0[p]; + data_0[p] = 0x00000000; + } + + //vide a droite en bas + else if(data_0[p+1+WSX] == 0x00000000){ + data_0[p+1+WSX] = data_0[p]; + data_0[p] = 0x00000000; + } + + //il y a un pixel en bas/gacuhe/droit + else{ + if(y<120){ + + if(data_0[p]!=0xFFFFFFFF && data_0[p+WSX]!=0xFFFFFFFF && data_0[p+WSX+1]!=0xFFFFFFFF && data_0[p+WSX-1]!=0xFFFFFFFF ){ + + int rouge1 =(data_0[p] & 0x000000FF); + int green1 =((data_0[p] & 0x0000FF00)>>8); + int blue1 = (data_0[p] & 0x00FF0000)>>16; + + int rouge2 =(data_0[p+WSX] & 0x000000FF); + int green2 =((data_0[p+WSX] & 0x0000FF00)>>8); + int blue2 = (data_0[p+WSX] & 0x00FF0000)>>16; + + int rouge3 =(data_0[p+WSX-1] & 0x000000FF); + int green3 =((data_0[p+WSX-1] & 0x0000FF00)>>8); + int blue3 = (data_0[p+WSX-1] & 0x00FF0000)>>16; + + int rouge4 =(data_0[p+WSX+1] & 0x000000FF); + int green4 =((data_0[p+WSX+1] & 0x0000FF00)>>8); + int blue4 = (data_0[p+WSX+1] & 0x00FF0000)>>16; + + int rouge = (rouge1 + rouge2 + rouge3 + rouge4)/4; + int green = (green1 + green2 + green3 + green4)/4; + int blue = (blue1 + blue2 + blue3 + blue4)/4; + + + int couleur = (0xFF << 24) + (blue<<16) + (green << 8) +rouge ; + + data_0[p+WSX] = couleur; + data_0[p] = couleur; + + ///?? + //if(sin(step/30) >= 0){ + data_0[p+WSX+1] = couleur; + data_0[p+WSX-1] = couleur; + //}else{ + data_0[p+WSX-1] = couleur; + data_0[p+WSX+1] = couleur; + //} + + + + } + + + + + + } + + } + + + + + + } + + + + } + + + + + // + //data_0[p] = 0xFFF00FFF - int(p)*(step+1); + + + +}