Hexagon mosaic, implosion, shockwave

This commit is contained in:
Marinho Brandao 2023-12-14 08:33:49 +01:00
parent e3e1929394
commit fbc3a59652
11 changed files with 353 additions and 68 deletions

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=15 format=3 uid="uid://c051w6upl0t16"]
[gd_scene load_steps=16 format=3 uid="uid://c051w6upl0t16"]
[ext_resource type="PackedScene" uid="uid://bydyult2k5rcb" path="res://addons/kenney_prototype_tools/scenes/green/green_01.tscn" id="1_61jfr"]
[ext_resource type="PackedScene" uid="uid://bjupt5nu14hth" path="res://addons/kenney_prototype_tools/scenes/dark/dark_05.tscn" id="2_xlmfj"]
@ -11,6 +11,7 @@
[ext_resource type="PackedScene" uid="uid://ds5xw2us1br3q" path="res://camera-effects/vignette.tscn" id="9_q1phu"]
[ext_resource type="PackedScene" uid="uid://dv3o1u4hc11vn" path="res://camera-effects/sepia.tscn" id="10_rqewe"]
[ext_resource type="PackedScene" uid="uid://cf1adbox8xy7e" path="res://camera-effects/grain_noise.tscn" id="11_3qobw"]
[ext_resource type="PackedScene" uid="uid://dwppksddt4t0x" path="res://camera-effects/hexagon_mosaic.tscn" id="12_uvrob"]
[sub_resource type="Environment" id="Environment_tln01"]
glow_blend_mode = 4
@ -165,3 +166,6 @@ visible = false
visible = false
[node name="Grain Noise" parent="CanvasLayer" instance=ExtResource("11_3qobw")]
visible = false
[node name="Hexagon Mosaic" parent="CanvasLayer" instance=ExtResource("12_uvrob")]

View File

@ -0,0 +1,25 @@
shader_type canvas_item;
// source: https://docs.godotengine.org/en/4.0/tutorials/shaders/custom_postprocessing.html
uniform vec2 size = vec2(32.0, 28.0);
uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest;
void fragment() {
vec2 norm_size = size * SCREEN_PIXEL_SIZE;
bool half = mod(SCREEN_UV.y / 2.0, norm_size.y) / norm_size.y < 0.5;
vec2 uv = SCREEN_UV + vec2(norm_size.x * 0.5 * float(half), 0.0);
vec2 center_uv = floor(uv / norm_size) * norm_size;
vec2 norm_uv = mod(uv, norm_size) / norm_size;
center_uv += mix(vec2(0.0, 0.0),
mix(mix(vec2(norm_size.x, -norm_size.y),
vec2(0.0, -norm_size.y),
float(norm_uv.x < 0.5)),
mix(vec2(0.0, -norm_size.y),
vec2(-norm_size.x, -norm_size.y),
float(norm_uv.x < 0.5)),
float(half)),
float(norm_uv.y < 0.3333333) * float(norm_uv.y / 0.3333333 < (abs(norm_uv.x - 0.5) * 2.0)));
COLOR = textureLod(screen_texture, center_uv, 0.0);
}

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=3 format=3 uid="uid://dwppksddt4t0x"]
[ext_resource type="Shader" path="res://camera-effects/hexagon-mosaic.gdshader" id="1_mlp7a"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_wpu0h"]
shader = ExtResource("1_mlp7a")
shader_parameter/size = Vector2(16, 14)
[node name="Hexagon Mosaic" type="ColorRect"]
material = SubResource("ShaderMaterial_wpu0h")
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2

View File

@ -3,6 +3,7 @@
[resource]
background_mode = 1
glow_enabled = true
glow_blend_mode = 4
glow_strength = 1.1
glow_blend_mode = 0
fog_light_energy = 0.82
fog_sun_scatter = 0.15

View File

@ -0,0 +1,9 @@
<Project Sdk="Godot.NET.Sdk/4.2.0">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net7.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'ios' ">net8.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>godotvisualeffects</RootNamespace>
</PropertyGroup>
</Project>

19
godot-visual-effects.sln Normal file
View File

@ -0,0 +1,19 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "godot-visual-effects", "godot-visual-effects.csproj", "{480A32A8-1426-4EFE-9E53-145C2A6D2882}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
ExportDebug|Any CPU = ExportDebug|Any CPU
ExportRelease|Any CPU = ExportRelease|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{480A32A8-1426-4EFE-9E53-145C2A6D2882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{480A32A8-1426-4EFE-9E53-145C2A6D2882}.Debug|Any CPU.Build.0 = Debug|Any CPU
{480A32A8-1426-4EFE-9E53-145C2A6D2882}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
{480A32A8-1426-4EFE-9E53-145C2A6D2882}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
{480A32A8-1426-4EFE-9E53-145C2A6D2882}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
{480A32A8-1426-4EFE-9E53-145C2A6D2882}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
EndGlobalSection
EndGlobal

View File

@ -1,14 +1,16 @@
[gd_scene load_steps=12 format=3 uid="uid://chomobsn1vdo4"]
[gd_scene load_steps=14 format=3 uid="uid://chomobsn1vdo4"]
[ext_resource type="Environment" uid="uid://dxrk0u62aekxt" path="res://environments/black-environment.tres" id="1_k1rat"]
[ext_resource type="PackedScene" uid="uid://cxj4cf67il71y" path="res://particles/smoke.tscn" id="1_vs4eb"]
[ext_resource type="PackedScene" uid="uid://c4g1wgyk5ynef" path="res://particles/fire.tscn" id="2_ua5o7"]
[ext_resource type="PackedScene" uid="uid://bdwxckix3vslo" path="res://particles/hurricane.tscn" id="3_1jf4n"]
[ext_resource type="PackedScene" uid="uid://ce6advdj56x0c" path="res://particles/hyperdrive.tscn" id="4_waeec"]
[ext_resource type="PackedScene" path="res://particles/hyperdrive.tscn" id="4_waeec"]
[ext_resource type="PackedScene" uid="uid://b2dthk7xytysh" path="res://particles/shield.tscn" id="5_iqqai"]
[ext_resource type="PackedScene" uid="uid://ck5vuhi3tffgl" path="res://particles/sparks.tscn" id="6_n8y86"]
[ext_resource type="PackedScene" uid="uid://1p0djdxytw42" path="res://particles/sparks.tscn" id="6_n8y86"]
[ext_resource type="PackedScene" uid="uid://1nbihtdf4hnv" path="res://particles/rain.tscn" id="8_pqidy"]
[ext_resource type="PackedScene" uid="uid://jyk4uwcupa50" path="res://particles/impact.tscn" id="9_x76w5"]
[ext_resource type="PackedScene" uid="uid://brf0ftux0hwy8" path="res://particles/shockwave.tscn" id="10_e5e8r"]
[ext_resource type="PackedScene" uid="uid://10u16dtnpupt" path="res://particles/implosion.tscn" id="11_df01b"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_njwlo"]
shading_mode = 0
@ -23,7 +25,6 @@ size = Vector2(10, 10)
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(0.707107, -0.40558, 0.579228, 0, 0.819152, 0.573576, -0.707107, -0.40558, 0.579228, 30, 30, 30)
environment = ExtResource("1_k1rat")
projection = 1
current = true
fov = 3.8
size = 3.0
@ -57,18 +58,18 @@ visible = false
visible = false
[node name="Sparks" parent="." instance=ExtResource("6_n8y86")]
visible = false
[node name="Rain" parent="." instance=ExtResource("8_pqidy")]
visible = false
[node name="Impact" parent="." instance=ExtResource("9_x76w5")]
visible = false
[node name="Shockwave" type="Node3D" parent="."]
[node name="Shockwave" parent="." instance=ExtResource("10_e5e8r")]
visible = false
[node name="Implosion" parent="." instance=ExtResource("11_df01b")]
visible = false
[node name="Electricity" type="Node3D" parent="."]
visible = false
[node name="Implosion" type="Node3D" parent="."]
visible = false

128
particles/implosion.tscn Normal file
View File

@ -0,0 +1,128 @@
[gd_scene load_steps=23 format=3 uid="uid://10u16dtnpupt"]
[ext_resource type="Script" path="res://scripts/MultiParticles.cs" id="1_weson"]
[ext_resource type="Texture2D" uid="uid://b8yqiftn6q2ij" path="res://addons/kenney_particle_pack/circle_05.png" id="2_qtlvw"]
[sub_resource type="Curve" id="Curve_tpndr"]
_data = [Vector2(0.782074, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_wtgks"]
curve = SubResource("Curve_tpndr")
[sub_resource type="Curve" id="Curve_7t07v"]
min_value = -5.0
max_value = 5.0
_data = [Vector2(0, -5), 0.0, 0.0, 0, 0, Vector2(0.495606, -5), 0.0, 0.0, 0, 0, Vector2(1, 0.00593328), 0.0, 0.0, 0, 0]
point_count = 3
[sub_resource type="CurveTexture" id="CurveTexture_8froe"]
curve = SubResource("Curve_7t07v")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_50j2f"]
emission_shape = 2
emission_sphere_radius = 3.0
gravity = Vector3(2.08165e-12, 2.08165e-12, 2.08165e-12)
radial_accel_min = 0.2
radial_accel_max = 0.2
radial_accel_curve = SubResource("CurveTexture_8froe")
color = Color(0, 0.564706, 1, 1)
alpha_curve = SubResource("CurveTexture_wtgks")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_blklt"]
transparency = 1
vertex_color_use_as_albedo = true
albedo_texture = ExtResource("2_qtlvw")
emission_enabled = true
emission = Color(0, 0.741176, 1, 1)
emission_energy_multiplier = 5.0
rim_enabled = true
billboard_mode = 3
billboard_keep_scale = true
particles_anim_h_frames = 1
particles_anim_v_frames = 1
particles_anim_loop = false
[sub_resource type="QuadMesh" id="QuadMesh_lxuhl"]
material = SubResource("StandardMaterial3D_blklt")
size = Vector2(0.1, 0.1)
[sub_resource type="Curve" id="Curve_0jmg7"]
_data = [Vector2(0.251318, 1), 0.0, 0.0, 0, 0, Vector2(0.991213, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_gf3su"]
curve = SubResource("Curve_0jmg7")
[sub_resource type="Gradient" id="Gradient_vj4no"]
offsets = PackedFloat32Array(0.448141, 0.636008)
colors = PackedColorArray(0, 0.894118, 1, 1, 0, 0.564706, 1, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_8k4ey"]
gradient = SubResource("Gradient_vj4no")
[sub_resource type="Curve" id="Curve_iutvr"]
_data = [Vector2(0.490334, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_ga1td"]
curve = SubResource("Curve_iutvr")
[sub_resource type="Curve" id="Curve_yuhne"]
max_value = 5.0
_data = [Vector2(0, 0.169831), 0.0, 0.0, 0, 0, Vector2(0.625659, 0.729012), 0.0, 0.0, 0, 0, Vector2(1, 4.63364), 0.0, 0.0, 0, 0]
point_count = 3
[sub_resource type="CurveTexture" id="CurveTexture_nfm8j"]
curve = SubResource("Curve_yuhne")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_t7lly"]
gravity = Vector3(2.08165e-12, 2.08165e-12, 2.08165e-12)
scale_curve = SubResource("CurveTexture_nfm8j")
color_ramp = SubResource("GradientTexture1D_8k4ey")
alpha_curve = SubResource("CurveTexture_gf3su")
emission_curve = SubResource("CurveTexture_ga1td")
[sub_resource type="Gradient" id="Gradient_30bhn"]
offsets = PackedFloat32Array(0.506744, 0.689788)
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_1pmsb"]
gradient = SubResource("Gradient_30bhn")
width = 256
height = 256
fill = 1
fill_from = Vector2(0.5, 0.5)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_k5esa"]
transparency = 1
blend_mode = 1
vertex_color_use_as_albedo = true
albedo_texture = SubResource("GradientTexture2D_1pmsb")
billboard_mode = 3
billboard_keep_scale = true
particles_anim_h_frames = 1
particles_anim_v_frames = 1
particles_anim_loop = false
[sub_resource type="QuadMesh" id="QuadMesh_gvf03"]
material = SubResource("StandardMaterial3D_k5esa")
[node name="Implosion" type="Node3D" node_paths=PackedStringArray("Particles")]
script = ExtResource("1_weson")
Particles = [NodePath("Bits"), NodePath("Sphere")]
[node name="Bits" type="GPUParticles3D" parent="."]
amount = 64
lifetime = 4.0
explosiveness = 1.0
fixed_fps = 60
process_material = SubResource("ParticleProcessMaterial_50j2f")
draw_pass_1 = SubResource("QuadMesh_lxuhl")
[node name="Sphere" type="GPUParticles3D" parent="."]
amount = 1
lifetime = 4.0
fixed_fps = 60
process_material = SubResource("ParticleProcessMaterial_t7lly")
draw_pass_1 = SubResource("QuadMesh_gvf03")

87
particles/shockwave.tscn Normal file
View File

@ -0,0 +1,87 @@
[gd_scene load_steps=17 format=3 uid="uid://brf0ftux0hwy8"]
[ext_resource type="Script" path="res://scripts/MultiParticles.cs" id="1_yvu1a"]
[ext_resource type="Texture2D" uid="uid://bd2arrqo7xw7c" path="res://addons/kenney_particle_pack/circle_01.png" id="2_s6tl6"]
[sub_resource type="Curve" id="Curve_jaxyf"]
_data = [Vector2(0.381371, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.0937408), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_qx1ma"]
curve = SubResource("Curve_jaxyf")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_dbh2b"]
gravity = Vector3(2.08165e-12, 2.08165e-12, 2.08165e-12)
scale_curve = SubResource("CurveTexture_qx1ma")
[sub_resource type="Gradient" id="Gradient_2mquu"]
offsets = PackedFloat32Array(0.506744, 0.689788)
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_fmsbu"]
gradient = SubResource("Gradient_2mquu")
width = 256
height = 256
fill = 1
fill_from = Vector2(0.5, 0.5)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_82lug"]
transparency = 1
blend_mode = 1
vertex_color_use_as_albedo = true
albedo_texture = SubResource("GradientTexture2D_fmsbu")
billboard_mode = 3
billboard_keep_scale = true
particles_anim_h_frames = 1
particles_anim_v_frames = 1
particles_anim_loop = false
[sub_resource type="QuadMesh" id="QuadMesh_vwe5g"]
material = SubResource("StandardMaterial3D_82lug")
[sub_resource type="Curve" id="Curve_q71c2"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_5xkdf"]
curve = SubResource("Curve_q71c2")
[sub_resource type="Curve" id="Curve_0s8ld"]
max_value = 3.0
_data = [Vector2(0, 0.0927029), 0.0, 0.0, 0, 0, Vector2(1, 3), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_406ad"]
curve = SubResource("Curve_0s8ld")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_aak2r"]
gravity = Vector3(2.08165e-12, 2.08165e-12, 2.08165e-12)
scale_curve = SubResource("CurveTexture_406ad")
alpha_curve = SubResource("CurveTexture_5xkdf")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_y7i1b"]
transparency = 1
vertex_color_use_as_albedo = true
albedo_texture = ExtResource("2_s6tl6")
rim_enabled = true
[sub_resource type="PlaneMesh" id="PlaneMesh_iktve"]
material = SubResource("StandardMaterial3D_y7i1b")
[node name="Shockwave" type="Node3D" node_paths=PackedStringArray("Particles")]
script = ExtResource("1_yvu1a")
Particles = [NodePath("Sphere"), NodePath("Ripple")]
[node name="Sphere" type="GPUParticles3D" parent="."]
amount = 1
lifetime = 3.0
fixed_fps = 60
process_material = SubResource("ParticleProcessMaterial_dbh2b")
draw_pass_1 = SubResource("QuadMesh_vwe5g")
[node name="Ripple" type="GPUParticles3D" parent="."]
amount = 3
lifetime = 3.0
explosiveness = 0.8
process_material = SubResource("ParticleProcessMaterial_aak2r")
draw_pass_1 = SubResource("PlaneMesh_iktve")

View File

@ -1,10 +1,10 @@
[gd_scene load_steps=7 format=3 uid="uid://ck5vuhi3tffgl"]
[gd_scene load_steps=7 format=3 uid="uid://1p0djdxytw42"]
[ext_resource type="Texture2D" uid="uid://iupf6jfowd7a" path="res://addons/kenney_particle_pack/trace_01.png" id="1_au4er"]
[sub_resource type="Gradient" id="Gradient_206ev"]
offsets = PackedFloat32Array(0, 0.209386)
colors = PackedColorArray(1, 0.8, 0, 1, 1, 0, 0, 1)
offsets = PackedFloat32Array(0, 0.385519, 0.866928)
colors = PackedColorArray(1, 0.8, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_lfvhw"]
gradient = SubResource("Gradient_206ev")
@ -23,15 +23,16 @@ scale_min = 0.8
color_ramp = SubResource("GradientTexture1D_lfvhw")
collision_mode = 1
collision_friction = 0.2
collision_bounce = 0.5
collision_bounce = 0.8
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vihpm"]
transparency = 1
blend_mode = 1
vertex_color_use_as_albedo = true
albedo_texture = ExtResource("1_au4er")
emission = Color(1, 1, 0, 1)
emission_energy_multiplier = 8.05
emission_enabled = true
emission = Color(1, 0.0705882, 0, 1)
emission_energy_multiplier = 2.0
rim_enabled = true
[sub_resource type="QuadMesh" id="QuadMesh_wyolc"]
@ -41,7 +42,7 @@ size = Vector2(0.5, 0.5)
[node name="Sparks" type="GPUParticles3D"]
transform = Transform3D(0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 0, 0, 1, 0, 0, 0)
amount = 48
lifetime = 3.0
lifetime = 5.0
speed_scale = 1.5
randomness = 0.3
fixed_fps = 60

View File

@ -1,65 +1,60 @@
using System;
using Godot;
using System;
/**
* MultiParticles : Node3D
*
* This class turns possible to control multiple particles in sync.
* Inspired by https://www.reddit.com/r/godot/comments/181ui9c/comment/kaewcca/?context=3
*/
public partial class MultiParticles : Node3D
{
[Export]
public bool Emitting = true;
[Export]
public bool Emitting = true;
[Export]
public bool OneShot = false;
[Export]
public bool OneShot = false;
[Export]
public Godot.Collections.Array<GpuParticles3D> Particles;
[Export]
public Godot.Collections.Array<GpuParticles3D> Particles;
double Lifetime = 0.0f;
double Lifetime = 0.0f;
public override void _Ready()
{
if (Emitting)
{
StartEmitters();
}
}
public override void _Ready()
{
if (Emitting)
{
StartEmitters();
}
}
void GetLifetime()
{
foreach (var particle in Particles)
{
if (particle.Lifetime > Lifetime)
{
Lifetime = particle.Lifetime;
}
}
}
void GetLifetime()
{
foreach (var particle in Particles)
{
if (particle.Lifetime > Lifetime)
{
Lifetime = particle.Lifetime;
}
}
}
public async void StartEmitters()
{
GetLifetime();
public async void StartEmitters()
{
GetLifetime();
foreach (var particle in Particles)
particle.Emitting = true;
foreach (var particle in Particles)
particle.Emitting = true;
await ToSignal(GetTree().CreateTimer(Lifetime), SceneTreeTimer.SignalName.Timeout);
DisposeOfEmitters();
await ToSignal(GetTree().CreateTimer(Lifetime), SceneTreeTimer.SignalName.Timeout);
DisposeOfEmitters();
if (!OneShot)
{
StartEmitters();
}
}
if (!OneShot)
{
StartEmitters();
}
}
void DisposeOfEmitters()
{
foreach (var particle in Particles)
{
particle.Emitting = false;
}
}
void DisposeOfEmitters()
{
foreach (var particle in Particles)
{
particle.Emitting = false;
}
}
}