├── BloodyPool
├── .gitignore
├── hearth.glb
├── .gitattributes
├── Images
│ ├── floor_albedo.png
│ ├── floor_height.png
│ ├── floor_roughness.png
│ ├── blood_splash_custom.png
│ ├── floor_albedo.png.import
│ ├── floor_height.png.import
│ ├── floor_roughness.png.import
│ └── blood_splash_custom.png.import
├── project.godot
├── hearth.glb.import
├── icon.svg
├── icon.svg.import
├── example_use.gd
├── blood_pool.gd
├── bloody_pool.tres
└── Main.tscn
├── Paint, but worse
├── .gitignore
├── .gitattributes
├── Images
│ ├── base_texture.png
│ ├── splash_texture.png
│ ├── splash_end_mask.png
│ ├── base_texture.png.import
│ ├── splash_texture.png.import
│ └── splash_end_mask.png.import
├── project.godot
├── icon.svg
├── paint_surface.gdshader
├── icon.svg.import
├── example_of_use.gd
├── ExampleOfUse.tscn
└── paint_surface.gd
├── WindTrailWithLoops
├── wind_trail_mesh.gdshader.uid
├── wind_trail_particles.gdshader.uid
├── .editorconfig
├── .gitignore
├── .gitattributes
├── project.godot
├── icon.svg
├── icon.svg.import
├── wind_trail_particles.gdshader
├── wind_trail_mesh.gdshader
└── demo.tscn
├── CarTracksOnSnowOrSand
├── .gitignore
├── car.glb
├── .gitattributes
├── Images
│ ├── snow_albedo.png
│ ├── snow_height.png
│ ├── snow_height.png.import
│ └── snow_albedo.png.import
├── project.godot
├── car.glb.import
├── icon.svg
├── icon.svg.import
├── car_tracks.tres
├── car_tracks_exaple_of_use.gd
└── Main.tscn
├── StylizedCartoonGrass
├── .gitignore
├── .gitattributes
├── landscaper
│ ├── grass_texture.png
│ ├── terrain_texture.png
│ ├── terrain_material.tres
│ ├── grass_mesh.tres
│ ├── grass_texture.png.import
│ ├── terrain_texture.png.import
│ ├── default_grass_v0.svg.import
│ ├── default_grass_v2.svg.import
│ ├── default_grass_v1.svg.import
│ ├── grass_material.tres
│ ├── default_grass_v1.svg
│ ├── default_grass_v0.svg
│ ├── grass_shader.gdshader
│ ├── default_grass_v2.svg
│ └── terrain_mesh.tres
├── project.godot
├── icon.svg
└── icon.svg.import
├── LICENSE
└── README.md
/BloodyPool/.gitignore:
--------------------------------------------------------------------------------
1 | # Godot 4+ specific ignores
2 | .godot/
3 |
--------------------------------------------------------------------------------
/Paint, but worse/.gitignore:
--------------------------------------------------------------------------------
1 | # Godot 4+ specific ignores
2 | .godot/
3 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/wind_trail_mesh.gdshader.uid:
--------------------------------------------------------------------------------
1 | uid://bl1mtt0sej2y7
2 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/.gitignore:
--------------------------------------------------------------------------------
1 | # Godot 4+ specific ignores
2 | .godot/
3 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/.gitignore:
--------------------------------------------------------------------------------
1 | # Godot 4+ specific ignores
2 | .godot/
3 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/wind_trail_particles.gdshader.uid:
--------------------------------------------------------------------------------
1 | uid://bhr2ihyy0k6sx
2 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/.gitignore:
--------------------------------------------------------------------------------
1 | # Godot 4+ specific ignores
2 | .godot/
3 | /android/
4 |
--------------------------------------------------------------------------------
/BloodyPool/hearth.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/BloodyPool/hearth.glb
--------------------------------------------------------------------------------
/BloodyPool/.gitattributes:
--------------------------------------------------------------------------------
1 | # Normalize EOL for all files that Git considers text files.
2 | * text=auto eol=lf
3 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/car.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/CarTracksOnSnowOrSand/car.glb
--------------------------------------------------------------------------------
/Paint, but worse/.gitattributes:
--------------------------------------------------------------------------------
1 | # Normalize EOL for all files that Git considers text files.
2 | * text=auto eol=lf
3 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/.gitattributes:
--------------------------------------------------------------------------------
1 | # Normalize EOL for all files that Git considers text files.
2 | * text=auto eol=lf
3 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/.gitattributes:
--------------------------------------------------------------------------------
1 | # Normalize EOL for all files that Git considers text files.
2 | * text=auto eol=lf
3 |
--------------------------------------------------------------------------------
/BloodyPool/Images/floor_albedo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/BloodyPool/Images/floor_albedo.png
--------------------------------------------------------------------------------
/BloodyPool/Images/floor_height.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/BloodyPool/Images/floor_height.png
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/.gitattributes:
--------------------------------------------------------------------------------
1 | # Normalize EOL for all files that Git considers text files.
2 | * text=auto eol=lf
3 |
--------------------------------------------------------------------------------
/BloodyPool/Images/floor_roughness.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/BloodyPool/Images/floor_roughness.png
--------------------------------------------------------------------------------
/Paint, but worse/Images/base_texture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/Paint, but worse/Images/base_texture.png
--------------------------------------------------------------------------------
/BloodyPool/Images/blood_splash_custom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/BloodyPool/Images/blood_splash_custom.png
--------------------------------------------------------------------------------
/Paint, but worse/Images/splash_texture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/Paint, but worse/Images/splash_texture.png
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/Images/snow_albedo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/CarTracksOnSnowOrSand/Images/snow_albedo.png
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/Images/snow_height.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/CarTracksOnSnowOrSand/Images/snow_height.png
--------------------------------------------------------------------------------
/Paint, but worse/Images/splash_end_mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/Paint, but worse/Images/splash_end_mask.png
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/grass_texture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/StylizedCartoonGrass/landscaper/grass_texture.png
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/terrain_texture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dip000/my-godotshaders/HEAD/StylizedCartoonGrass/landscaper/terrain_texture.png
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/terrain_material.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://gl76s02g8jku"]
2 |
3 | [ext_resource type="Texture2D" uid="uid://vfgl4nian7t8" path="res://landscaper/terrain_texture.png" id="1_eqqib"]
4 |
5 | [resource]
6 | shading_mode = 0
7 | albedo_texture = ExtResource("1_eqqib")
8 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/grass_mesh.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="QuadMesh" load_steps=2 format=3 uid="uid://cgf18gvsp6ste"]
2 |
3 | [ext_resource type="Material" uid="uid://c0ml2mwg50l7c" path="res://landscaper/grass_material.tres" id="1_vh8td"]
4 |
5 | [resource]
6 | material = ExtResource("1_vh8td")
7 | size = Vector2(0.3, 0.3)
8 | subdivide_depth = 3
9 | center_offset = Vector3(0, 0.15, 0)
10 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/project.godot:
--------------------------------------------------------------------------------
1 | ; Engine configuration file.
2 | ; It's best edited using the editor UI and not directly,
3 | ; since the parameters that go here are not all obvious.
4 | ;
5 | ; Format:
6 | ; [section] ; section goes between []
7 | ; param=value ; assign values to parameters
8 |
9 | config_version=5
10 |
11 | [application]
12 |
13 | config/name="WindTrailWithLoops"
14 | config/features=PackedStringArray("4.4", "Mobile")
15 | config/icon="res://icon.svg"
16 |
17 | [rendering]
18 |
19 | renderer/rendering_method="mobile"
20 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/project.godot:
--------------------------------------------------------------------------------
1 | ; Engine configuration file.
2 | ; It's best edited using the editor UI and not directly,
3 | ; since the parameters that go here are not all obvious.
4 | ;
5 | ; Format:
6 | ; [section] ; section goes between []
7 | ; param=value ; assign values to parameters
8 |
9 | config_version=5
10 |
11 | [application]
12 |
13 | config/name="StylizedCartoonGrass"
14 | config/tags=PackedStringArray("test")
15 | config/features=PackedStringArray("4.3", "Mobile")
16 | config/icon="res://icon.svg"
17 |
18 | [rendering]
19 |
20 | renderer/rendering_method="mobile"
21 |
--------------------------------------------------------------------------------
/BloodyPool/project.godot:
--------------------------------------------------------------------------------
1 | ; Engine configuration file.
2 | ; It's best edited using the editor UI and not directly,
3 | ; since the parameters that go here are not all obvious.
4 | ;
5 | ; Format:
6 | ; [section] ; section goes between []
7 | ; param=value ; assign values to parameters
8 |
9 | config_version=5
10 |
11 | [application]
12 |
13 | config/name="BloodyPool"
14 | run/main_scene="res://Main.tscn"
15 | config/features=PackedStringArray("4.1", "GL Compatibility")
16 | config/icon="res://icon.svg"
17 |
18 | [rendering]
19 |
20 | renderer/rendering_method="gl_compatibility"
21 | renderer/rendering_method.mobile="gl_compatibility"
22 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/project.godot:
--------------------------------------------------------------------------------
1 | ; Engine configuration file.
2 | ; It's best edited using the editor UI and not directly,
3 | ; since the parameters that go here are not all obvious.
4 | ;
5 | ; Format:
6 | ; [section] ; section goes between []
7 | ; param=value ; assign values to parameters
8 |
9 | config_version=5
10 |
11 | [application]
12 |
13 | config/name="CarTracksOnSnowOrSand"
14 | config/tags=PackedStringArray("godotshaders.com")
15 | run/main_scene="res://Main.tscn"
16 | config/features=PackedStringArray("4.1", "GL Compatibility")
17 | config/icon="res://icon.svg"
18 |
19 | [rendering]
20 |
21 | renderer/rendering_method="mobile"
22 | renderer/rendering_method.mobile="gl_compatibility"
23 |
--------------------------------------------------------------------------------
/Paint, but worse/project.godot:
--------------------------------------------------------------------------------
1 | ; Engine configuration file.
2 | ; It's best edited using the editor UI and not directly,
3 | ; since the parameters that go here are not all obvious.
4 | ;
5 | ; Format:
6 | ; [section] ; section goes between []
7 | ; param=value ; assign values to parameters
8 |
9 | config_version=5
10 |
11 | [application]
12 |
13 | config/name="Paint, but worse"
14 | config/tags=PackedStringArray("godotshaders.com")
15 | run/main_scene="res://ExampleOfUse.tscn"
16 | config/features=PackedStringArray("4.1", "GL Compatibility")
17 | config/icon="res://icon.svg"
18 |
19 | [rendering]
20 |
21 | renderer/rendering_method="gl_compatibility"
22 | renderer/rendering_method.mobile="gl_compatibility"
23 |
--------------------------------------------------------------------------------
/BloodyPool/hearth.glb.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="scene"
4 | importer_version=1
5 | type="PackedScene"
6 | uid="uid://orwpssgatan0"
7 | path="res://.godot/imported/hearth.glb-2c0827103ecce36f2f9135b7d20cef28.scn"
8 |
9 | [deps]
10 |
11 | source_file="res://hearth.glb"
12 | dest_files=["res://.godot/imported/hearth.glb-2c0827103ecce36f2f9135b7d20cef28.scn"]
13 |
14 | [params]
15 |
16 | nodes/root_type="Node3D"
17 | nodes/root_name="Scene Root"
18 | nodes/apply_root_scale=true
19 | nodes/root_scale=1.0
20 | meshes/ensure_tangents=true
21 | meshes/generate_lods=true
22 | meshes/create_shadow_meshes=true
23 | meshes/light_baking=1
24 | meshes/lightmap_texel_size=0.2
25 | skins/use_named_skins=true
26 | animation/import=true
27 | animation/fps=30
28 | animation/trimming=false
29 | animation/remove_immutable_tracks=true
30 | import_script/path=""
31 | _subresources={}
32 | gltf/embedded_image_handling=1
33 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/car.glb.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="scene"
4 | importer_version=1
5 | type="PackedScene"
6 | uid="uid://blroyoyd0uuc5"
7 | path="res://.godot/imported/car.glb-23df84fca2ae7f779e3c65dedf141b84.scn"
8 |
9 | [deps]
10 |
11 | source_file="res://car.glb"
12 | dest_files=["res://.godot/imported/car.glb-23df84fca2ae7f779e3c65dedf141b84.scn"]
13 |
14 | [params]
15 |
16 | nodes/root_type="Node3D"
17 | nodes/root_name="Scene Root"
18 | nodes/apply_root_scale=true
19 | nodes/root_scale=1.0
20 | meshes/ensure_tangents=true
21 | meshes/generate_lods=true
22 | meshes/create_shadow_meshes=true
23 | meshes/light_baking=1
24 | meshes/lightmap_texel_size=0.2
25 | skins/use_named_skins=true
26 | animation/import=true
27 | animation/fps=30
28 | animation/trimming=false
29 | animation/remove_immutable_tracks=true
30 | import_script/path=""
31 | _subresources={}
32 | gltf/embedded_image_handling=1
33 |
--------------------------------------------------------------------------------
/BloodyPool/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Paint, but worse/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Paint, but worse/Images/base_texture.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://bqhlpkcnb4k34"
6 | path="res://.godot/imported/base_texture.png-8f869c0edb05aeb262fe83ba92df0643.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://Images/base_texture.png"
14 | dest_files=["res://.godot/imported/base_texture.png-8f869c0edb05aeb262fe83ba92df0643.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=3
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=0
35 |
--------------------------------------------------------------------------------
/Paint, but worse/Images/splash_texture.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://8mqtjhv7jyw"
6 | path="res://.godot/imported/splash_texture.png-e478cba8c87541217e02f6560b6eb75a.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://Images/splash_texture.png"
14 | dest_files=["res://.godot/imported/splash_texture.png-e478cba8c87541217e02f6560b6eb75a.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=3
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=0
35 |
--------------------------------------------------------------------------------
/Paint, but worse/Images/splash_end_mask.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://bjd1e00gmpdkg"
6 | path="res://.godot/imported/splash_end_mask.png-3d7f1615e458af435d84e008b1a60b76.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://Images/splash_end_mask.png"
14 | dest_files=["res://.godot/imported/splash_end_mask.png-3d7f1615e458af435d84e008b1a60b76.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=3
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=0
35 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/BloodyPool/Images/floor_albedo.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://djf80bihgjaxq"
6 | path.s3tc="res://.godot/imported/floor_albedo.png-794c7b1687912a542f63e1551352f804.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://Images/floor_albedo.png"
15 | dest_files=["res://.godot/imported/floor_albedo.png-794c7b1687912a542f63e1551352f804.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/BloodyPool/Images/floor_height.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://donpg7umcw5r5"
6 | path.s3tc="res://.godot/imported/floor_height.png-98e1624ac0766d2b76e6039e475d5993.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://Images/floor_height.png"
15 | dest_files=["res://.godot/imported/floor_height.png-98e1624ac0766d2b76e6039e475d5993.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/Images/snow_height.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://1cujdx38cxxa"
6 | path.s3tc="res://.godot/imported/snow_height.png-ff65ee253cb6b87b553882e9e3031205.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://Images/snow_height.png"
15 | dest_files=["res://.godot/imported/snow_height.png-ff65ee253cb6b87b553882e9e3031205.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/Images/snow_albedo.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://dna0pxa4867pe"
6 | path.s3tc="res://.godot/imported/snow_albedo.png-974f5a78129911f465f22a7edea46fee.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://Images/snow_albedo.png"
15 | dest_files=["res://.godot/imported/snow_albedo.png-974f5a78129911f465f22a7edea46fee.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/Paint, but worse/paint_surface.gdshader:
--------------------------------------------------------------------------------
1 | shader_type spatial;
2 | render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_toon,specular_toon,unshaded,shadows_disabled,ambient_light_disabled;
3 |
4 | group_uniforms SetTheseParameters;
5 | uniform sampler2D splash_texture:repeat_disable;
6 | uniform sampler2D base_texture;
7 | group_uniforms;
8 |
9 | group_uniforms ExternallySetted;
10 | uniform vec2 position;
11 | uniform float scale;
12 | uniform vec4 color;
13 | uniform float reveal_factor;
14 | group_uniforms;
15 |
16 |
17 | vec2 scale_from_center(vec2 uv, float s){
18 | s = 1.0 / s;
19 | return ((uv - 0.5) * s) + 0.5;
20 | }
21 |
22 | void fragment(){
23 | vec2 uv_transformed = scale_from_center( UV - position, scale );
24 | float splash_pixel = texture( splash_texture, uv_transformed ).r;
25 |
26 | bool splash = (splash_pixel > (1.0-reveal_factor));
27 | vec3 base = texture( base_texture, UV ).rgb;
28 |
29 | // Alpha blend
30 | ALBEDO = splash ? mix(color.rgb, base, 1.0-color.a) : base;
31 | }
32 |
33 |
--------------------------------------------------------------------------------
/BloodyPool/Images/floor_roughness.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://cy44h2lf4pvxc"
6 | path.s3tc="res://.godot/imported/floor_roughness.png-ff783d97bfd5fa34cbbe9b52f84cd003.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://Images/floor_roughness.png"
15 | dest_files=["res://.godot/imported/floor_roughness.png-ff783d97bfd5fa34cbbe9b52f84cd003.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/BloodyPool/icon.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://c3vn4lvjiooer"
6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://icon.svg"
14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=0
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=1
35 | svg/scale=1.0
36 | editor/scale_with_editor_scale=false
37 | editor/convert_colors_with_editor_theme=false
38 |
--------------------------------------------------------------------------------
/Paint, but worse/icon.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://biltkdl7qe0br"
6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://icon.svg"
14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=0
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=1
35 | svg/scale=1.0
36 | editor/scale_with_editor_scale=false
37 | editor/convert_colors_with_editor_theme=false
38 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/icon.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://bfory5kne1e6u"
6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://icon.svg"
14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=0
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=1
35 | svg/scale=1.0
36 | editor/scale_with_editor_scale=false
37 | editor/convert_colors_with_editor_theme=false
38 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/icon.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://b2ujo7yrvd3j0"
6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://icon.svg"
14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=0
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=1
35 | svg/scale=1.0
36 | editor/scale_with_editor_scale=false
37 | editor/convert_colors_with_editor_theme=false
38 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/icon.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://b2c1qymmpe1hj"
6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
7 | metadata={
8 | "vram_texture": false
9 | }
10 |
11 | [deps]
12 |
13 | source_file="res://icon.svg"
14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
15 |
16 | [params]
17 |
18 | compress/mode=0
19 | compress/high_quality=false
20 | compress/lossy_quality=0.7
21 | compress/hdr_compression=1
22 | compress/normal_map=0
23 | compress/channel_pack=0
24 | mipmaps/generate=false
25 | mipmaps/limit=-1
26 | roughness/mode=0
27 | roughness/src_normal=""
28 | process/fix_alpha_border=true
29 | process/premult_alpha=false
30 | process/normal_map_invert_y=false
31 | process/hdr_as_srgb=false
32 | process/hdr_clamp_exposure=false
33 | process/size_limit=0
34 | detect_3d/compress_to=1
35 | svg/scale=1.0
36 | editor/scale_with_editor_scale=false
37 | editor/convert_colors_with_editor_theme=false
38 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/grass_texture.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://be7i4tf1y3a6v"
6 | path.s3tc="res://.godot/imported/grass_texture.png-8e5ec6d1ca6149d430eea22ba6806dee.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://landscaper/grass_texture.png"
15 | dest_files=["res://.godot/imported/grass_texture.png-8e5ec6d1ca6149d430eea22ba6806dee.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/BloodyPool/Images/blood_splash_custom.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://bli26ctfp7vd8"
6 | path.s3tc="res://.godot/imported/blood_splash_custom.png-781adf0b0c8e1a438d82bcc702d184e2.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://Images/blood_splash_custom.png"
15 | dest_files=["res://.godot/imported/blood_splash_custom.png-781adf0b0c8e1a438d82bcc702d184e2.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=false
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/terrain_texture.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://vfgl4nian7t8"
6 | path.s3tc="res://.godot/imported/terrain_texture.png-997d2b9f059d0dd37df7eaf7a0548edf.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://landscaper/terrain_texture.png"
15 | dest_files=["res://.godot/imported/terrain_texture.png-997d2b9f059d0dd37df7eaf7a0548edf.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Adrián
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/default_grass_v0.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://m77kx8np7uxw"
6 | path.s3tc="res://.godot/imported/default_grass_v0.svg-326d91f459bc982799abc8b23c81784e.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://landscaper/default_grass_v0.svg"
15 | dest_files=["res://.godot/imported/default_grass_v0.svg-326d91f459bc982799abc8b23c81784e.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=false
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 | svg/scale=1.0
37 | editor/scale_with_editor_scale=false
38 | editor/convert_colors_with_editor_theme=false
39 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/default_grass_v2.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://75v3htafttix"
6 | path.s3tc="res://.godot/imported/default_grass_v2.svg-4d5fe65c9dfed26dbea3750529917e5f.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://landscaper/default_grass_v2.svg"
15 | dest_files=["res://.godot/imported/default_grass_v2.svg-4d5fe65c9dfed26dbea3750529917e5f.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=false
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 | svg/scale=1.0
37 | editor/scale_with_editor_scale=false
38 | editor/convert_colors_with_editor_theme=false
39 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/default_grass_v1.svg.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="CompressedTexture2D"
5 | uid="uid://cciwddrj8g86g"
6 | path.s3tc="res://.godot/imported/default_grass_v1.svg-d6f848a96f73905d168d92280a0a71d0.s3tc.ctex"
7 | metadata={
8 | "imported_formats": ["s3tc_bptc"],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://landscaper/default_grass_v1.svg"
15 | dest_files=["res://.godot/imported/default_grass_v1.svg-d6f848a96f73905d168d92280a0a71d0.s3tc.ctex"]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/high_quality=false
21 | compress/lossy_quality=0.7
22 | compress/hdr_compression=1
23 | compress/normal_map=0
24 | compress/channel_pack=0
25 | mipmaps/generate=true
26 | mipmaps/limit=-1
27 | roughness/mode=0
28 | roughness/src_normal=""
29 | process/fix_alpha_border=false
30 | process/premult_alpha=false
31 | process/normal_map_invert_y=false
32 | process/hdr_as_srgb=false
33 | process/hdr_clamp_exposure=false
34 | process/size_limit=0
35 | detect_3d/compress_to=0
36 | svg/scale=1.0
37 | editor/scale_with_editor_scale=false
38 | editor/convert_colors_with_editor_theme=false
39 |
--------------------------------------------------------------------------------
/Paint, but worse/example_of_use.gd:
--------------------------------------------------------------------------------
1 | # EXAMPLE OF USE
2 | # This script will only find the mouse position in PaintSurface and call 'splash_at()'
3 | # Refer to PaintSurface for shader logic
4 | extends Node3D
5 |
6 | @export var splash_color:Color ## Use alpha to blend with paint surface
7 | @onready var cam:Camera3D = $Camera3D
8 | @onready var paint_surface:PaintSurface = $PaintSurface
9 | @onready var space_state:PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
10 |
11 | const INTERACT_RADIUS:int = 15
12 | var query := PhysicsRayQueryParameters3D.new()
13 |
14 |
15 | func _ready():
16 | query.set_collide_with_areas(true)
17 |
18 | func _input(event):
19 | if event is InputEventMouseButton and event.is_pressed():
20 | var result:Dictionary = _detect_from_cam_to_mouse()
21 | if result:
22 | var pos:Vector2 = Vector2(result.position.x, result.position.z) / paint_surface.mesh.size
23 | paint_surface.splash_at( pos, 0.3, splash_color )
24 |
25 | func _detect_from_cam_to_mouse() -> Dictionary:
26 | query.from = cam.global_position
27 | query.to = query.from + _get_world_mouse_ray()
28 | return space_state.intersect_ray(query)
29 |
30 | func _get_world_mouse_ray() -> Vector3:
31 | var mouse_pos:Vector2 = get_viewport().get_mouse_position()
32 | return cam.project_ray_normal(mouse_pos) * INTERACT_RADIUS
33 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Collection of all my godot shaders playthings for godotshaders.com
2 |
3 | ## Bloody Pool (GDScript-animated)
4 | Blood Trail paired with GDScript logic that manages blood drop animations
5 |
6 | 
7 |
8 |
9 | ## Car Tracks On Snow Or Sand (ViewportTexture-animated)
10 | Using a SubViewport and particle systems, it renders a ViewportTexture that is fed into the shader displacing the terrain where the particles are passing creating tracks behind the car
11 |
12 | 
13 |
14 | ## Paint, but worse (Texture-baked)
15 | Bakes a splash image over the surface texture so the shader doesn't need to keep infinite elements drawn
16 |
17 | 
18 |
19 | ## Stylized Cartoon Grass
20 | Another grass shader. But prettier, optimized, and cartoon-looking
21 | See the plug-in used to make this scene https://github.com/dip000/godot-landscaper
22 |
23 | 
24 |
25 | ## WindTrailWithLoops
26 | Wind trails using a single mesh and GPUParticles3D. Though the particle avoidance is kind of wacky..
27 | 
28 |
29 |
30 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/car_tracks.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="Shader" format=3 uid="uid://lappm6o7lj1m"]
2 |
3 | [resource]
4 | code = "shader_type spatial;
5 |
6 | group_uniforms SetupTheseValues;
7 | uniform sampler2D viewport_texture; // Set it as: \"New ViewportTexture\" and select your SubViewport Node in the scene tree
8 | uniform sampler2D floor_texture:hint_default_white;
9 | uniform sampler2D floor_heightmap:hint_default_white;
10 | uniform vec3 trail_color:source_color = vec3(0.0);
11 | uniform vec3 ground_modulate:source_color = vec3(1.0); // Same as it usually wors with modulate property in Sprites and such
12 | uniform float ditch_height:hint_range(0.0, 1.0) = 0.2;
13 | group_uniforms;
14 |
15 |
16 | void fragment() {
17 | float trail = texture(viewport_texture, UV).r;
18 | vec3 ground = texture(floor_texture, UV).rgb;
19 |
20 | // This changes all blacks and grays into a darkened floor_recolor-scale but leaves whites as whites
21 | vec3 trail_recolored = 1.0 - (1.0-trail) * (1.0-trail_color);
22 |
23 | // Multipliyng the base colors with the darker colors of the trail will darken the resulting ditch smoothly
24 | ALBEDO = ground*ground_modulate * trail_recolored;
25 | }
26 |
27 | void vertex() {
28 | // If heighmap is gray in average, multiplying it by a black trail will create ditches in the ground
29 | // So it might not look right with mostly-black heightmaps
30 | float trail = texture(viewport_texture, UV).r;
31 | VERTEX.y = texture(floor_heightmap, UV).r * ditch_height * trail;
32 |
33 | // Honestly I don't know about normals nearly enough to know if I'm doing it right..
34 | NORMAL = normalize(vec3(NORMAL.x, VERTEX.y, NORMAL.z));
35 | }
36 | "
37 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/car_tracks_exaple_of_use.gd:
--------------------------------------------------------------------------------
1 | # EXAMPLE SCRIPT
2 | # The car will move where the mouse pointer goes
3 | # Make sure the particles are following your car by either appending them as children or using a RemoteTransform3D
4 | extends Node3D
5 | class_name CarExampleOfUse
6 |
7 | @onready var cam:Camera3D = $"../Camera3D"
8 | @onready var wheels:Array[Node3D] = [$WheelFR, $WheelFL, $WheelBR, $WheelBL]
9 | @onready var space_state:PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
10 |
11 | const INTERACT_RADIUS:int = 15
12 | var query := PhysicsRayQueryParameters3D.new()
13 | var mouse_position:Vector3
14 |
15 |
16 | func _ready():
17 | query.set_collide_with_areas(true)
18 |
19 | func _physics_process(delta:float):
20 | # Save the world position from where the mouse is pointing
21 | var result:Dictionary = _detect_from_cam_to_mouse()
22 | if result:
23 | mouse_position = result.position
24 |
25 | # Move and rotate car towards point continuously
26 | global_position = lerp(global_position, mouse_position, delta)
27 | var speed:float = (global_position - mouse_position).length()
28 | if speed > 0.01:
29 | look_at(mouse_position)
30 |
31 | # Animate wheels according to car's speed
32 | for wheel in wheels:
33 | wheel.rotate(Vector3.LEFT, delta*speed*5.0)
34 |
35 |
36 | func _detect_from_cam_to_mouse() -> Dictionary:
37 | query.from = cam.global_position
38 | query.to = query.from + _get_world_mouse_ray()
39 | return space_state.intersect_ray(query)
40 |
41 | func _get_world_mouse_ray() -> Vector3:
42 | var mouse_pos:Vector2 = get_viewport().get_mouse_position()
43 | return cam.project_ray_normal(mouse_pos) * INTERACT_RADIUS
44 |
45 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/grass_material.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="ShaderMaterial" load_steps=9 format=3 uid="uid://c0ml2mwg50l7c"]
2 |
3 | [ext_resource type="Texture2D" uid="uid://vfgl4nian7t8" path="res://landscaper/terrain_texture.png" id="1_1mdot"]
4 | [ext_resource type="Shader" path="res://landscaper/grass_shader.gdshader" id="1_5kvm2"]
5 | [ext_resource type="Texture2D" uid="uid://be7i4tf1y3a6v" path="res://landscaper/grass_texture.png" id="2_7gx8c"]
6 | [ext_resource type="Texture2D" uid="uid://m77kx8np7uxw" path="res://landscaper/default_grass_v0.svg" id="4_ktpq3"]
7 | [ext_resource type="Texture2D" uid="uid://cciwddrj8g86g" path="res://landscaper/default_grass_v1.svg" id="5_l82ry"]
8 | [ext_resource type="Texture2D" uid="uid://75v3htafttix" path="res://landscaper/default_grass_v2.svg" id="6_cl3p8"]
9 |
10 | [sub_resource type="Gradient" id="Gradient_86gnx"]
11 |
12 | [sub_resource type="GradientTexture2D" id="GradientTexture2D_mfo8e"]
13 | gradient = SubResource("Gradient_86gnx")
14 | fill_from = Vector2(0, 1)
15 | fill_to = Vector2(0, 0)
16 |
17 | [resource]
18 | render_priority = 0
19 | shader = ExtResource("1_5kvm2")
20 | shader_parameter/enable_details = true
21 | shader_parameter/billboard_y = false
22 | shader_parameter/detail_color = Color(0.470588, 0.376471, 0.309804, 1)
23 | shader_parameter/world_size = Vector2(10, 10)
24 | shader_parameter/world_position = Vector2(0.5, 0.5)
25 | shader_parameter/grass_color = ExtResource("2_7gx8c")
26 | shader_parameter/terrain_color = ExtResource("1_1mdot")
27 | shader_parameter/gradient_mask = SubResource("GradientTexture2D_mfo8e")
28 | shader_parameter/variants = Array[Texture2D]([ExtResource("4_ktpq3"), ExtResource("5_l82ry"), ExtResource("6_cl3p8"), null])
29 |
--------------------------------------------------------------------------------
/Paint, but worse/ExampleOfUse.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=9 format=3 uid="uid://cbrgorm7a61e"]
2 |
3 | [ext_resource type="Script" path="res://example_of_use.gd" id="1_83m4u"]
4 | [ext_resource type="Shader" path="res://paint_surface.gdshader" id="2_8rwds"]
5 | [ext_resource type="Texture2D" uid="uid://bqhlpkcnb4k34" path="res://Images/base_texture.png" id="3_3s8xv"]
6 | [ext_resource type="Script" path="res://paint_surface.gd" id="3_duyfa"]
7 | [ext_resource type="Texture2D" uid="uid://8mqtjhv7jyw" path="res://Images/splash_texture.png" id="4_s4fvu"]
8 |
9 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_iwkdf"]
10 | render_priority = 0
11 | shader = ExtResource("2_8rwds")
12 | shader_parameter/position = null
13 | shader_parameter/scale = 0.3
14 | shader_parameter/color = null
15 | shader_parameter/reveal_factor = 0.0
16 | shader_parameter/splash_texture = ExtResource("4_s4fvu")
17 | shader_parameter/base_texture = ExtResource("3_3s8xv")
18 |
19 | [sub_resource type="PlaneMesh" id="PlaneMesh_5jdrg"]
20 | material = SubResource("ShaderMaterial_iwkdf")
21 | subdivide_width = 100
22 | subdivide_depth = 100
23 |
24 | [sub_resource type="BoxShape3D" id="BoxShape3D_jpwgr"]
25 | size = Vector3(2, 0.05, 2)
26 |
27 | [node name="ExampleOfUse" type="Node3D"]
28 | script = ExtResource("1_83m4u")
29 | splash_color = Color(0.0470588, 0.282353, 1, 0.694118)
30 |
31 | [node name="PaintSurface" type="MeshInstance3D" parent="."]
32 | mesh = SubResource("PlaneMesh_5jdrg")
33 | script = ExtResource("3_duyfa")
34 |
35 | [node name="Area3D" type="Area3D" parent="PaintSurface"]
36 |
37 | [node name="CollisionShape3D" type="CollisionShape3D" parent="PaintSurface/Area3D"]
38 | shape = SubResource("BoxShape3D_jpwgr")
39 |
40 | [node name="Camera3D" type="Camera3D" parent="."]
41 | transform = Transform3D(1, 0, 0, 0, 0.516533, 0.856267, 0, -0.856267, 0.516533, 0, 0.831, 0.924)
42 |
--------------------------------------------------------------------------------
/BloodyPool/example_use.gd:
--------------------------------------------------------------------------------
1 | # EXAMPLE SCRIPT
2 | # Refer to 'BloodPool' class which has all of the shader-related logic
3 | # This class only moves the hearth where you point over the mouse cursor
4 | # In a practical situation you'd just add 'bloody_pool_mesh.drop_at(global_position)' on your character
5 |
6 | extends Node3D
7 | class_name ExampleOfUse
8 |
9 | @export var drip_time:float = 0.15 ## The time between each drop of blod. BloodPool will stop working momentarily if this value is too low (although it might look cooler)
10 | @onready var bloody_pool_mesh:BloodPool = $BloodPool
11 | @onready var bloody_cam:Camera3D = $Camera3D
12 | @onready var bloody_hearth:Node3D = $hearth
13 | @onready var bloody_space_state:PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
14 |
15 | const BLOODY_INTERACT_RADIUS:int = 3
16 | var query := PhysicsRayQueryParameters3D.new()
17 | var timer:SceneTreeTimer
18 |
19 |
20 | func _ready():
21 | query.set_collide_with_areas(true)
22 |
23 | # Juice up the heart
24 | var bloody_dance:Tween = create_tween().set_loops()
25 | bloody_dance.tween_property(bloody_hearth, "rotation_degrees", Vector3.UP*45.0, 0.5)
26 | bloody_dance.tween_property(bloody_hearth, "rotation_degrees", Vector3.ZERO, 0.5)
27 |
28 | # Drip blood under heart position every 'drip_time' seconds
29 | while true:
30 | var pos:Vector2 = Vector2(bloody_hearth.global_position.x, bloody_hearth.global_position.z)
31 | bloody_pool_mesh.drop_at(pos*0.5)
32 | await get_tree().create_timer(drip_time).timeout
33 |
34 |
35 | func _input(event):
36 | # Updates 'bloody_hearth' position on mouse pointer
37 | if event is InputEventMouseMotion:
38 | var result:Dictionary = _detect_from_cam_to_mouse()
39 | if result:
40 | bloody_hearth.global_position.x = result.position.x
41 | bloody_hearth.global_position.z = result.position.z
42 |
43 | func _detect_from_cam_to_mouse() -> Dictionary:
44 | query.from = bloody_cam.global_position
45 | query.to = query.from + _get_world_mouse_position()
46 | return bloody_space_state.intersect_ray(query)
47 |
48 | func _get_world_mouse_position() -> Vector3:
49 | var mouse_pos:Vector2 = get_viewport().get_mouse_position()
50 | return bloody_cam.project_ray_normal(mouse_pos) * BLOODY_INTERACT_RADIUS
51 |
52 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/default_grass_v1.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
52 |
--------------------------------------------------------------------------------
/BloodyPool/blood_pool.gd:
--------------------------------------------------------------------------------
1 | # SHADER LOGIC
2 | # This script animates the individual blood drops in the shader using uniforms 'positions' and 'scales'
3 | # Make sure you don't call 'drop_at()' too often or it will flood the pool until 'drying_time' finishes
4 |
5 | extends MeshInstance3D
6 | class_name BloodPool
7 |
8 | @export var pool_size:int = 64 ## This value MUST match the constant 'TOTAL_BLOOD_DROPS' in shader or it will throw index out-of-reach errors
9 | @export var growing_time:float = 0.2 ## Time the blood drop will grow in size, usually fast
10 | @export var drying_time:float = 4 ## Time the blod drop will start drying, usually slow
11 | @export var delay_until_drying_starts:float = 0.2 ## Time the blod drop will remain idle when is fully grown
12 |
13 | @onready var _mat:ShaderMaterial = get_active_material(0)
14 | var _bloody_pool:Array[BloodDrop]
15 |
16 |
17 | func _ready():
18 | # Fill up shader variables. They will not be immediately visible because all 'scales' are initialized as 0.0
19 | var positions:PackedVector2Array = []
20 | positions.resize(pool_size)
21 | _mat.set_shader_parameter("positions", positions)
22 |
23 | var scales:PackedFloat32Array = []
24 | scales.resize(pool_size)
25 | _mat.set_shader_parameter("scales", scales)
26 |
27 | # Setup '_bloody_pool' to manage and animate all active blood drops
28 | BloodDrop.mat = _mat
29 | for i in pool_size:
30 | _bloody_pool.append( BloodDrop.new(i) )
31 |
32 |
33 | func drop_at(pos:Vector2):
34 | # Find any 'BloodDrop' inactive to use it
35 | # The tween will make it inactive again when animations finishes, so it can be reused
36 | for blod_drop in _bloody_pool:
37 | if not blod_drop.active:
38 | blod_drop.start(pos)
39 | var tween:Tween = get_tree().create_tween()
40 | tween.tween_method(blod_drop.animate, 0.0, growing_time, growing_time)
41 | tween.tween_method(blod_drop.animate, growing_time, 0.0, drying_time).set_delay(delay_until_drying_starts)
42 | tween.finished.connect(blod_drop.end)
43 | break
44 |
45 |
46 | class BloodDrop:
47 | var active:bool
48 | var _index:int
49 | static var mat:ShaderMaterial
50 |
51 | func _init(index:int):
52 | _index = index
53 |
54 | func start(pos:Vector2):
55 | active = true
56 | mat["shader_parameter/positions"][_index] = pos
57 |
58 | func animate(value:float):
59 | mat["shader_parameter/scales"][_index] = value
60 |
61 | func end():
62 | active = false
63 |
--------------------------------------------------------------------------------
/BloodyPool/bloody_pool.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="Shader" format=3 uid="uid://cjnutuh4ax5sr"]
2 |
3 | [resource]
4 | code = "shader_type spatial;
5 |
6 |
7 | const int TOTAL_BLOOD_DROPS = 64;
8 | const float BLOOD_ROUGHNESS = 0.05;
9 | const float HEIGHTMAP_STRENGHT = 0.2;
10 | const float BLOOD_DENSITY_STRENGHT = 5.0; // honestly, this is just a magic number depending on the heightmap..
11 | const float BLOOD_BLENDING = 0.15; // Blend between floor texture and blood
12 |
13 | group_uniforms SetupTheseVariables;
14 | uniform sampler2D floor_texture:hint_default_white;
15 | uniform sampler2D floor_heightmap:hint_default_black;
16 | uniform sampler2D floor_roughnessmap:hint_default_black;
17 | uniform sampler2D blood_texture:repeat_disable; // Radial-centered GradientTexture2D or any shape as long as it is blurred and has a white margin (also disable mipmaps from import settings)
18 | uniform vec3 blood_color:source_color;
19 | uniform float blood_merge_factor:hint_range(0.0, 1.0) = 0.2; // Example 0.6: 60% of 'blood_texture' is the actual blood. 40% is the merging area (coalescence effect). Set it depending on your grayscaled 'blood_texture'
20 | uniform bool blood_density_on_heightmap = true; // Lightens peaks, darkens valleys
21 | group_uniforms;
22 |
23 | group_uniforms ExternallySetted;
24 | uniform vec2 positions[TOTAL_BLOOD_DROPS];
25 | uniform float scales[TOTAL_BLOOD_DROPS];
26 | group_uniforms;
27 |
28 |
29 | vec2 scale_from_center(vec2 uv, float s){
30 | return ((uv - 0.5) * 1.0/s) + 0.5;
31 | }
32 |
33 | void fragment(){
34 | // Draw base PBR properties
35 | ALBEDO = texture( floor_texture, UV ).rgb;
36 | ROUGHNESS = texture(floor_roughnessmap, UV).x;
37 |
38 | float blended_pixel = 1.0;
39 |
40 | // This will blend every drop of blod first so it looks more realistic
41 | for(int i=0; i
2 |
3 |
4 |
64 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/grass_shader.gdshader:
--------------------------------------------------------------------------------
1 | shader_type spatial;
2 | render_mode unshaded, shadows_disabled, cull_disabled; //Use 'cull_back' if billboard Y
3 |
4 |
5 | // Internally capped at 16
6 | const int TOTAL_GRASS_VARIANTS = 4;
7 |
8 | uniform bool enable_details = true;
9 | uniform bool billboard_y = false;
10 | uniform vec3 detail_color:source_color = vec3(0.2);
11 | uniform vec2 world_size = vec2(10.0);
12 | uniform vec2 world_position = vec2(0);
13 |
14 | // Colors of all of the grass instanced from a MultiMesh as seen from the top
15 | uniform sampler2D grass_color:source_color,filter_linear_mipmap,repeat_disable;
16 | uniform sampler2D terrain_color:source_color,filter_linear_mipmap,repeat_disable;
17 |
18 | // This must be in gray scale. Usually a GradientTexture2D but can be anything you want, even empty for plain color
19 | uniform sampler2D gradient_mask:source_color,filter_linear_mipmap,repeat_disable,hint_default_black;
20 | uniform sampler2D variants[TOTAL_GRASS_VARIANTS];
21 |
22 | // 'instance' keyword is only for Vulkan rendering drivers and allows multiple grass variants with the same material
23 | instance uniform int variant_index;
24 |
25 |
26 | void vertex(){
27 | // Wind sway
28 | float root = (1.0 - UV.y);
29 | vec3 sway;
30 | sway.x = sin(NODE_POSITION_WORLD.x + TIME * 1.25 + UV.y) * root * 0.10;
31 | sway.y = sin(NODE_POSITION_WORLD.x + TIME * 0.6 + UV.y) * root * 0.08;
32 | sway.z = cos(NODE_POSITION_WORLD.z + TIME * 0.45 + UV.y) * root * 0.15;
33 |
34 | if(billboard_y){
35 | VERTEX += sway;
36 | MODELVIEW_MATRIX = VIEW_MATRIX * mat4(vec4(normalize(cross(vec3(0.0, 1.0, 0.0), INV_VIEW_MATRIX[2].xyz)), 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(normalize(cross(INV_VIEW_MATRIX[0].xyz, vec3(0.0, 1.0, 0.0))), 0.0), MODEL_MATRIX[3]);
37 | }
38 | else{
39 | VERTEX += (vec4(sway, 1.0) * MODEL_MATRIX).xyz;
40 | }
41 |
42 | // Vertex to world space (from center of texture)
43 | vec2 world_space = world_position + (MODEL_MATRIX * vec4(VERTEX, 1.0)).xz / world_size;
44 |
45 | // Coloring the mesh vertices will look exactly the same as coloring the pixels but more performant (asuming there are enough subdivisions along z-axis)
46 | vec3 recolor_top = texture(grass_color, world_space).rgb;
47 | vec3 recolor_root = texture(terrain_color, world_space).rgb;
48 | float mask = texture(gradient_mask, UV).r;
49 |
50 | // Mask the top of the grass with one color, mask the root with another, and add them
51 | COLOR.rgb = recolor_top * mask;
52 | COLOR.rgb += recolor_root * (1.0-mask);
53 | }
54 |
55 | void fragment() {
56 | // Apply vertex color to albedo
57 | ALBEDO = COLOR.rgb;
58 |
59 | vec4 detail_mask = texture(variants[variant_index], UV);
60 |
61 | // Details will look awfull if you try to vertex-color it, so is better to process it here
62 | if(enable_details){
63 | ALBEDO = mix(detail_color, ALBEDO, detail_mask.r);
64 | }
65 |
66 | // Enables alpha scissor
67 | ALPHA = detail_mask.a;
68 | ALPHA_SCISSOR_THRESHOLD = 0.8;
69 | }
--------------------------------------------------------------------------------
/BloodyPool/Main.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=15 format=3 uid="uid://bsif5pyo2s2e2"]
2 |
3 | [ext_resource type="Script" path="res://example_use.gd" id="1_dfam4"]
4 | [ext_resource type="Shader" uid="uid://cjnutuh4ax5sr" path="res://bloody_pool.tres" id="1_gjjxa"]
5 | [ext_resource type="Texture2D" uid="uid://bli26ctfp7vd8" path="res://Images/blood_splash_custom.png" id="3_3owig"]
6 | [ext_resource type="Texture2D" uid="uid://donpg7umcw5r5" path="res://Images/floor_height.png" id="4_htya4"]
7 | [ext_resource type="Texture2D" uid="uid://cy44h2lf4pvxc" path="res://Images/floor_roughness.png" id="5_a2uem"]
8 | [ext_resource type="Script" path="res://blood_pool.gd" id="6_5sn80"]
9 | [ext_resource type="Texture2D" uid="uid://djf80bihgjaxq" path="res://Images/floor_albedo.png" id="6_8kpuf"]
10 | [ext_resource type="PackedScene" uid="uid://orwpssgatan0" path="res://hearth.glb" id="7_ahlj3"]
11 |
12 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_ea65x"]
13 | render_priority = 0
14 | shader = ExtResource("1_gjjxa")
15 | shader_parameter/blood_color = Color(0.74902, 0, 0, 1)
16 | shader_parameter/blood_merge_factor = 0.2
17 | shader_parameter/blood_density_on_heightmap = true
18 | shader_parameter/floor_texture = ExtResource("6_8kpuf")
19 | shader_parameter/floor_heightmap = ExtResource("4_htya4")
20 | shader_parameter/floor_roughnessmap = ExtResource("5_a2uem")
21 | shader_parameter/blood_texture = ExtResource("3_3owig")
22 | shader_parameter/positions = PackedVector2Array()
23 | shader_parameter/scales = PackedFloat32Array()
24 |
25 | [sub_resource type="PlaneMesh" id="PlaneMesh_d1pfq"]
26 | material = SubResource("ShaderMaterial_ea65x")
27 | subdivide_width = 32
28 | subdivide_depth = 32
29 |
30 | [sub_resource type="BoxShape3D" id="BoxShape3D_nqflr"]
31 | size = Vector3(2, 0.1, 2)
32 |
33 | [sub_resource type="Environment" id="Environment_ki01q"]
34 | background_mode = 1
35 | background_color = Color(0.160784, 0, 0, 1)
36 | ambient_light_source = 2
37 | ambient_light_color = Color(1, 1, 1, 1)
38 |
39 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6gd7l"]
40 | transparency = 1
41 | albedo_color = Color(0.631373, 0.0941176, 0.0862745, 1)
42 | billboard_mode = 3
43 | particles_anim_h_frames = 1
44 | particles_anim_v_frames = 1
45 | particles_anim_loop = false
46 |
47 | [sub_resource type="QuadMesh" id="QuadMesh_uxyhy"]
48 | material = SubResource("StandardMaterial3D_6gd7l")
49 | size = Vector2(0.01, 0.085)
50 |
51 | [node name="ExampleOfUse" type="Node3D"]
52 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1)
53 | script = ExtResource("1_dfam4")
54 |
55 | [node name="BloodPool" type="MeshInstance3D" parent="."]
56 | mesh = SubResource("PlaneMesh_d1pfq")
57 | script = ExtResource("6_5sn80")
58 |
59 | [node name="Area3D" type="Area3D" parent="BloodPool"]
60 |
61 | [node name="CollisionShape3D" type="CollisionShape3D" parent="BloodPool/Area3D"]
62 | shape = SubResource("BoxShape3D_nqflr")
63 |
64 | [node name="Camera3D" type="Camera3D" parent="."]
65 | transform = Transform3D(1, 0, 0, 0, 0.62932, 0.777146, 0, -0.777146, 0.62932, 0, 0.728, 1.039)
66 | environment = SubResource("Environment_ki01q")
67 |
68 | [node name="hearth" parent="." instance=ExtResource("7_ahlj3")]
69 | transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0, 0.245, 0)
70 |
71 | [node name="CPUParticles3D" type="CPUParticles3D" parent="hearth"]
72 | local_coords = true
73 | mesh = SubResource("QuadMesh_uxyhy")
74 | emission_shape = 1
75 | emission_sphere_radius = 0.25
76 |
77 | [node name="OmniLight3D" type="OmniLight3D" parent="."]
78 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.838217, 1.24, 0.976432)
79 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/default_grass_v2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
93 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/wind_trail_particles.gdshader:
--------------------------------------------------------------------------------
1 | /**
2 | * WIND STRIP SHADER by DIP
3 | 1. Add a new TubeTrailMesh with a small radius, unitary length, and a bell-shaped curve.
4 | 2. Rotate the MeshInstance3D to your preference (TubeTrailMeshes are only vertical for some reason)
5 | 3. Set custom_aabb.h = 20 to prevent off-camera pop-out.
6 | 4. Use instance_shader_parameters/extra_offset_time and other extra instance parameters to create simultaneous, unique wind trails without needing to make individual resources.
7 | */
8 | shader_type spatial;
9 | render_mode unshaded;
10 |
11 | group_uniforms Global;
12 | /**
13 | Wind color. Can use alpha values*/
14 | uniform vec4 color:source_color = vec4(1.0);
15 | /**
16 | The [b]fade_in_out[/b] time in seconds*/
17 | uniform float fade_time = 5.0;
18 | /**
19 | General speed of time. Affects every time calculation*/
20 | uniform float time_scale = 3.0;
21 |
22 | group_uniforms Wave;
23 | /**
24 | Width of the straight-travel wave animation*/
25 | uniform float wave_amplitude = 0.1;
26 | /**
27 | Speed of the straight-travel wave animation*/
28 | uniform float wave_frequency = 1.0;
29 | /**
30 | Length of each wave*/
31 | uniform float wave_length = 2.0;
32 | /**
33 | How many waves of straight-travel before a loop happens. Only makes sense if [b]loop_count > 0[/b]*/
34 | uniform float wave_count:hint_range(0.0, 10.0, 1.0) = 1.0;
35 |
36 | group_uniforms Twist;
37 | /**
38 | Width of the back-forth twist animation*/
39 | uniform float twist_amplitude = 0.1;
40 | /**
41 | Speed of the back-forth twist animation*/
42 | uniform float twist_frequency = 1.0;
43 |
44 | group_uniforms Loop;
45 | /**
46 | Size of the full circle animation. Set to zero to disable*/
47 | uniform float loop_radius = 1.0;
48 | /**
49 | How many times the wind will make a full circle at the same time*/
50 | uniform float loop_count = 0.5;
51 |
52 |
53 | // Add variety from Inspector > GeometryInstance3D > Instance Shader Parameters
54 | instance uniform float extra_offset_time = 0.0;
55 | instance uniform float extra_wave_length = 0.0;
56 | instance uniform float extra_loop_radius = 0.0;
57 |
58 | float rand(vec2 uv){
59 | return fract(sin(dot(uv.xy ,vec2(12.9898,78.233))) * 43758.5453);
60 | }
61 |
62 | void vertex() {
63 | float scaled_time = TIME * time_scale + extra_offset_time;
64 |
65 | vec3 wave = vec3(
66 | VERTEX.x + sin(VERTEX.y * twist_frequency + scaled_time) * twist_amplitude,
67 | VERTEX.y * (wave_length + extra_wave_length),
68 | VERTEX.z + sin(VERTEX.y * wave_frequency + scaled_time) * wave_amplitude
69 | );
70 |
71 | float loop_angle = VERTEX.y * TAU * loop_count + scaled_time;
72 | vec3 loop = vec3(
73 | VERTEX.x,
74 | sin(loop_angle) * (loop_radius+extra_loop_radius),
75 | cos(loop_angle) * (loop_radius+extra_loop_radius)
76 | );
77 |
78 | float period = TAU; //the animation period is given by the loop, assuming a 1 meter long mesh at 1m/s, that's 1*2*PI = TAU seconds
79 | float offset_time = period*0.5; //so the transitions don't bend akwardly at the wrong moment (if akwardness persists, set loop_count to a fraction, like 0.5)
80 | float hold_time = wave_count * period;
81 | float total_time = hold_time + 2.0*period;
82 | float t = mod(scaled_time + offset_time, total_time); //timer that counts up to total_time, then restarts
83 | float factor; //from 0.0 (wave animation), to 0.5 (loop-wave animation mix)
84 |
85 | if (t < hold_time) {
86 | factor = 0.0; //wave
87 | } else if (t < hold_time + period) {
88 | factor = ((t - hold_time) / period) * 0.5; //wave to loop-wave
89 | } else {
90 | factor = (1.0 - (t - hold_time - period) / period) * 0.5; // loop-wave to wave
91 | }
92 |
93 | VERTEX = mix(wave, loop, factor); //most satisfying line ever :D
94 | //VERTEX.y += t; //particles have their own movement
95 |
96 | COLOR *= color; //vertex color enable
97 |
98 | if (t < fade_time) {
99 | COLOR.a *= t / fade_time;
100 | } else if (t > total_time - fade_time) {
101 | COLOR.a *= (total_time - t) / fade_time;
102 | }
103 | }
104 |
105 | void fragment(){
106 | ALBEDO = COLOR.rgb;
107 | ALPHA = COLOR.a;
108 | }
109 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/wind_trail_mesh.gdshader:
--------------------------------------------------------------------------------
1 | /**
2 | * WIND STRIP SHADER by DIP
3 | 1. Add a new TubeTrailMesh with a small radius, unitary length, and a bell-shaped curve.
4 | 2. Rotate the MeshInstance3D to your preference (TubeTrailMeshes are only vertical for some reason)
5 | 3. Set custom_aabb.h = 20 to prevent off-camera pop-out.
6 | 4. Use instance_shader_parameters/extra_offset_time and other extra instance parameters to create simultaneous, unique wind trails without needing to make individual resources.
7 | */
8 | shader_type spatial;
9 | render_mode unshaded;
10 |
11 | group_uniforms Global;
12 | /**
13 | Wind color. Can use alpha values*/
14 | uniform vec4 color:source_color = vec4(1.0);
15 | /**
16 | The [b]fade_in_out[/b] time in seconds*/
17 | uniform float fade_time = 5.0;
18 | /**
19 | General speed of time. Affects every time calculation*/
20 | uniform float time_scale = 3.0;
21 |
22 | group_uniforms Wave;
23 | /**
24 | Width of the straight-travel wave animation*/
25 | uniform float wave_amplitude = 0.1;
26 | /**
27 | Speed of the straight-travel wave animation*/
28 | uniform float wave_frequency = 1.0;
29 | /**
30 | Length of each wave*/
31 | uniform float wave_length = 2.0;
32 | /**
33 | How many waves of straight-travel before a loop happens. Only makes sense if [b]loop_count > 0[/b]*/
34 | uniform float wave_count:hint_range(0.0, 10.0, 1.0) = 1.0;
35 |
36 | group_uniforms Twist;
37 | /**
38 | Width of the back-forth twist animation*/
39 | uniform float twist_amplitude = 0.1;
40 | /**
41 | Speed of the back-forth twist animation*/
42 | uniform float twist_frequency = 1.0;
43 |
44 | group_uniforms Loop;
45 | /**
46 | Size of the full circle animation. Set to zero to disable*/
47 | uniform float loop_radius = 1.0;
48 | /**
49 | How many times the wind will make a full circle at the same time*/
50 | uniform float loop_count = 0.5;
51 |
52 |
53 | // Add variety from Inspector > GeometryInstance3D > Instance Shader Parameters
54 | instance uniform float extra_offset_time = 0.0;
55 | instance uniform float extra_wave_length = 0.0;
56 | instance uniform float extra_loop_radius = 0.0;
57 |
58 | float rand(vec2 uv){
59 | return fract(sin(dot(uv.xy ,vec2(12.9898,78.233))) * 43758.5453);
60 | }
61 |
62 | void vertex() {
63 | float scaled_time = TIME * time_scale + extra_offset_time;
64 |
65 | vec3 wave = vec3(
66 | VERTEX.x + sin(VERTEX.y * twist_frequency + scaled_time) * twist_amplitude,
67 | VERTEX.y * (wave_length + extra_wave_length),
68 | VERTEX.z + sin(VERTEX.y * wave_frequency + scaled_time) * wave_amplitude
69 | );
70 |
71 | float loop_angle = VERTEX.y * TAU * loop_count + scaled_time;
72 | vec3 loop = vec3(
73 | VERTEX.x,
74 | sin(loop_angle) * (loop_radius+extra_loop_radius),
75 | cos(loop_angle) * (loop_radius+extra_loop_radius)
76 | );
77 |
78 | float period = TAU; //the animation period is given by the loop, assuming a 1 meter long mesh at 1m/s, that's 1*2*PI = TAU seconds
79 | float offset_time = period*0.5; //so the transitions don't bend akwardly at the wrong moment (if akwardness persists, set loop_count to a fraction, like 0.5)
80 | float hold_time = wave_count * period;
81 | float total_time = hold_time + 2.0*period;
82 | float t = mod(scaled_time + offset_time, total_time); //timer that counts up to total_time, then restarts
83 | float factor; //from 0.0 (wave animation), to 0.5 (loop-wave animation mix)
84 |
85 | if (t < hold_time) {
86 | factor = 0.0; //wave
87 | } else if (t < hold_time + period) {
88 | factor = ((t - hold_time) / period) * 0.5; //wave to loop-wave
89 | } else {
90 | factor = (1.0 - (t - hold_time - period) / period) * 0.5; // loop-wave to wave
91 | }
92 |
93 | VERTEX = mix(wave, loop, factor); //most satisfying line ever :D
94 | VERTEX.y += t; //travel along y-axis (trail meshes can only be vertical for some reason)
95 |
96 | COLOR *= color; //vertex color enable
97 |
98 | if (t < fade_time) {
99 | COLOR.a *= t / fade_time;
100 | } else if (t > total_time - fade_time) {
101 | COLOR.a *= (total_time - t) / fade_time;
102 | }
103 | }
104 |
105 | void fragment(){
106 | ALBEDO = COLOR.rgb;
107 | ALPHA = COLOR.a;
108 | }
109 |
--------------------------------------------------------------------------------
/CarTracksOnSnowOrSand/Main.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=16 format=3 uid="uid://dtkptpruv1ay6"]
2 |
3 | [ext_resource type="Script" path="res://car_tracks_exaple_of_use.gd" id="2_bwx1l"]
4 | [ext_resource type="Texture2D" uid="uid://1cujdx38cxxa" path="res://Images/snow_height.png" id="3_8neod"]
5 | [ext_resource type="Shader" uid="uid://lappm6o7lj1m" path="res://car_tracks.tres" id="3_tho10"]
6 | [ext_resource type="PackedScene" uid="uid://blroyoyd0uuc5" path="res://car.glb" id="5_r7oxn"]
7 |
8 | [sub_resource type="Environment" id="Environment_i3pvo"]
9 | background_mode = 1
10 | background_color = Color(0, 0.298039, 0.298039, 1)
11 | ambient_light_source = 2
12 | ambient_light_color = Color(1, 1, 1, 1)
13 |
14 | [sub_resource type="ViewportTexture" id="ViewportTexture_xa88w"]
15 | viewport_path = NodePath("SubViewport")
16 |
17 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_ctokp"]
18 | resource_local_to_scene = true
19 | render_priority = 0
20 | shader = ExtResource("3_tho10")
21 | shader_parameter/trail_color = Color(0, 0.447059, 0.447059, 1)
22 | shader_parameter/ground_modulate = Color(0.756863, 1, 1, 1)
23 | shader_parameter/ditch_height = 0.325
24 | shader_parameter/viewport_texture = SubResource("ViewportTexture_xa88w")
25 | shader_parameter/floor_texture = ExtResource("3_8neod")
26 | shader_parameter/floor_heightmap = ExtResource("3_8neod")
27 |
28 | [sub_resource type="PlaneMesh" id="PlaneMesh_8muh3"]
29 | resource_local_to_scene = true
30 | material = SubResource("ShaderMaterial_ctokp")
31 | size = Vector2(10, 10)
32 | subdivide_width = 256
33 | subdivide_depth = 256
34 |
35 | [sub_resource type="BoxShape3D" id="BoxShape3D_0v47j"]
36 | size = Vector3(10.0605, 0.1, 10.0717)
37 |
38 | [sub_resource type="Environment" id="Environment_ms5u6"]
39 | background_mode = 1
40 | background_color = Color(1, 1, 1, 1)
41 |
42 | [sub_resource type="Gradient" id="Gradient_suej4"]
43 | offsets = PackedFloat32Array(0, 0.476744)
44 | colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
45 |
46 | [sub_resource type="GradientTexture2D" id="GradientTexture2D_xgya4"]
47 | gradient = SubResource("Gradient_suej4")
48 | fill = 1
49 | fill_from = Vector2(0.5, 0.5)
50 |
51 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_64uqg"]
52 | transparency = 1
53 | vertex_color_use_as_albedo = true
54 | albedo_texture = SubResource("GradientTexture2D_xgya4")
55 |
56 | [sub_resource type="QuadMesh" id="QuadMesh_arh4n"]
57 | material = SubResource("StandardMaterial3D_64uqg")
58 | size = Vector2(0.29, 0.63)
59 |
60 | [sub_resource type="Gradient" id="Gradient_5n4dt"]
61 | offsets = PackedFloat32Array(0, 0.982301, 1)
62 | colors = PackedColorArray(0, 0, 0, 1, 0.946903, 0.946903, 0.946903, 0.0530974, 1, 1, 1, 0)
63 |
64 | [node name="Main" type="Node3D"]
65 |
66 | [node name="NOTES" type="Label3D" parent="."]
67 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.17429, 0)
68 | text = "Notes
69 | 0. Anything being rendered inside the SubViewport camera is being sent to the shader on real time
70 | 1. Camera inside SubViewport must only have cull mask in layer2
71 | 2. Every VisualInstance inside SubViewport must be in layer2
72 | 3. Actual game camera must NOT have cullmask in layer2
73 | 4. Every VisualInstance outside SubViewport must NOT be in layer2"
74 |
75 | [node name="Camera3D" type="Camera3D" parent="."]
76 | transform = Transform3D(0.704016, 0.42987, -0.565308, 0, 0.796003, 0.605293, 0.710184, -0.426136, 0.560398, -4.14, 1.126, 4.01)
77 | cull_mask = 1048573
78 | environment = SubResource("Environment_i3pvo")
79 |
80 | [node name="OmniLight3D" type="OmniLight3D" parent="."]
81 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.86431, 4.69709, 3.92687)
82 | light_energy = 7.297
83 | light_cull_mask = 4294967293
84 | omni_range = 7.838
85 |
86 | [node name="car" parent="." instance=ExtResource("5_r7oxn")]
87 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.830201)
88 | script = ExtResource("2_bwx1l")
89 |
90 | [node name="RemoteTransform3D" type="RemoteTransform3D" parent="car"]
91 | remote_path = NodePath("../../SubViewport/RemoteParticles")
92 |
93 | [node name="Label3D" type="Label3D" parent="car"]
94 | transform = Transform3D(0.6, 0, 1.04907e-07, 0, 0.6, 0, -1.04907e-07, 0, 0.6, 0, 0.405047, 1.39287)
95 | text = "Car (LowPoly)
96 | by Rafael Rodrigues
97 | is licensed under
98 | Creative Commons Attribution"
99 | font_size = 13
100 | outline_size = 6
101 |
102 | [node name="Floor" type="MeshInstance3D" parent="."]
103 | mesh = SubResource("PlaneMesh_8muh3")
104 |
105 | [node name="Area3D" type="Area3D" parent="Floor"]
106 |
107 | [node name="CollisionShape3D" type="CollisionShape3D" parent="Floor/Area3D"]
108 | shape = SubResource("BoxShape3D_0v47j")
109 |
110 | [node name="SubViewport" type="SubViewport" parent="."]
111 |
112 | [node name="Camera3D" type="Camera3D" parent="SubViewport"]
113 | transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 6.66, 0)
114 | cull_mask = 1047554
115 | environment = SubResource("Environment_ms5u6")
116 |
117 | [node name="RemoteParticles" type="Node3D" parent="SubViewport"]
118 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.830201)
119 |
120 | [node name="FrontLeft" type="CPUParticles3D" parent="SubViewport/RemoteParticles"]
121 | transform = Transform3D(-0.997109, -0.0759882, -3.32155e-09, 0, -4.37114e-08, 1, -0.0759882, 0.997109, 4.3585e-08, 0.39994, 0.063, -0.474836)
122 | layers = 2
123 | amount = 100
124 | lifetime = 8.0
125 | mesh = SubResource("QuadMesh_arh4n")
126 | direction = Vector3(0, 0, 0)
127 | gravity = Vector3(0, 0, 0)
128 | color = Color(0, 0, 0, 1)
129 | color_ramp = SubResource("Gradient_5n4dt")
130 |
131 | [node name="FrontRight" type="CPUParticles3D" parent="SubViewport/RemoteParticles"]
132 | transform = Transform3D(-0.997109, -0.0759882, -3.32155e-09, 0, -4.37114e-08, 1, -0.0759882, 0.997109, 4.3585e-08, -0.397128, 0.0634864, -0.480409)
133 | layers = 2
134 | amount = 100
135 | lifetime = 8.0
136 | mesh = SubResource("QuadMesh_arh4n")
137 | direction = Vector3(0, 0, 0)
138 | gravity = Vector3(0, 0, 0)
139 | color = Color(0, 0, 0, 1)
140 | color_ramp = SubResource("Gradient_5n4dt")
141 |
142 | [node name="BackLeftt" type="CPUParticles3D" parent="SubViewport/RemoteParticles"]
143 | transform = Transform3D(-1, -8.74228e-08, -3.82137e-15, 0, -4.37114e-08, 1, -8.74228e-08, 1, 4.37114e-08, 0.393684, 0.0634864, 0.917897)
144 | layers = 2
145 | amount = 100
146 | lifetime = 8.0
147 | mesh = SubResource("QuadMesh_arh4n")
148 | direction = Vector3(0, 0, 0)
149 | gravity = Vector3(0, 0, 0)
150 | color = Color(0, 0, 0, 1)
151 | color_ramp = SubResource("Gradient_5n4dt")
152 |
153 | [node name="BackRight" type="CPUParticles3D" parent="SubViewport/RemoteParticles"]
154 | transform = Transform3D(-1, -8.74228e-08, -3.82137e-15, 0, -4.37114e-08, 1, -8.74228e-08, 1, 4.37114e-08, -0.401391, 0.0634864, 0.917897)
155 | layers = 2
156 | amount = 100
157 | lifetime = 8.0
158 | mesh = SubResource("QuadMesh_arh4n")
159 | direction = Vector3(0, 0, 0)
160 | gravity = Vector3(0, 0, 0)
161 | color = Color(0, 0, 0, 1)
162 | color_ramp = SubResource("Gradient_5n4dt")
163 |
--------------------------------------------------------------------------------
/WindTrailWithLoops/demo.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=16 format=3 uid="uid://bkr68bgsk4t1y"]
2 |
3 | [ext_resource type="Shader" uid="uid://bl1mtt0sej2y7" path="res://wind_trail_mesh.gdshader" id="1_5hfv0"]
4 | [ext_resource type="Shader" uid="uid://bhr2ihyy0k6sx" path="res://wind_trail_particles.gdshader" id="2_0bhed"]
5 |
6 | [sub_resource type="Curve" id="Curve_fr1sm"]
7 | _data = [Vector2(0, 0), 0.0, 0.748692, 0, 1, Vector2(0.502688, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
8 | point_count = 3
9 |
10 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_0bhed"]
11 | render_priority = 0
12 | shader = ExtResource("1_5hfv0")
13 | shader_parameter/color = Color(1, 1, 1, 1)
14 | shader_parameter/fade_time = 5.0
15 | shader_parameter/time_scale = 3.0
16 | shader_parameter/wave_amplitude = 0.1
17 | shader_parameter/wave_frequency = 1.0
18 | shader_parameter/wave_length = 2.0
19 | shader_parameter/wave_count = 1.0
20 | shader_parameter/twist_amplitude = 0.1
21 | shader_parameter/twist_frequency = 1.0
22 | shader_parameter/loop_radius = 1.5
23 | shader_parameter/loop_count = 0.5
24 |
25 | [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_m0rpm"]
26 | material = SubResource("ShaderMaterial_0bhed")
27 | custom_aabb = AABB(0, 0, 0, 0, 20, 0)
28 | radius = 0.05
29 | cap_top = false
30 | cap_bottom = false
31 | curve = SubResource("Curve_fr1sm")
32 |
33 | [sub_resource type="Curve" id="Curve_c6xj6"]
34 | _data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.526144, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
35 | point_count = 3
36 |
37 | [sub_resource type="CurveTexture" id="CurveTexture_6bw2v"]
38 | curve = SubResource("Curve_c6xj6")
39 |
40 | [sub_resource type="Curve" id="Curve_kem5a"]
41 | _data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
42 | point_count = 2
43 |
44 | [sub_resource type="CurveTexture" id="CurveTexture_gxmxl"]
45 | curve = SubResource("Curve_kem5a")
46 |
47 | [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_n4w22"]
48 | emission_shape = 1
49 | emission_sphere_radius = 1.0
50 | direction = Vector3(0, 1, 0)
51 | spread = 0.0
52 | initial_velocity_min = 2.0
53 | initial_velocity_max = 4.0
54 | gravity = Vector3(0, 0, 0)
55 | alpha_curve = SubResource("CurveTexture_6bw2v")
56 | turbulence_noise_speed_random = 4.0
57 | turbulence_influence_min = 0.968
58 | turbulence_influence_max = 1.0
59 | turbulence_initial_displacement_min = 60.1
60 | turbulence_initial_displacement_max = 73.6
61 | turbulence_influence_over_life = SubResource("CurveTexture_gxmxl")
62 | collision_mode = 2
63 |
64 | [sub_resource type="Curve" id="Curve_6bw2v"]
65 | _data = [Vector2(0, 0), 0.0, 0.748692, 0, 1, Vector2(0.502688, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
66 | point_count = 3
67 |
68 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_kem5a"]
69 | render_priority = 0
70 | shader = ExtResource("2_0bhed")
71 | shader_parameter/color = Color(1, 1, 1, 1)
72 | shader_parameter/fade_time = 5.0
73 | shader_parameter/time_scale = 3.0
74 | shader_parameter/wave_amplitude = 0.1
75 | shader_parameter/wave_frequency = 1.0
76 | shader_parameter/wave_length = 2.0
77 | shader_parameter/wave_count = 1.0
78 | shader_parameter/twist_amplitude = 0.1
79 | shader_parameter/twist_frequency = 1.0
80 | shader_parameter/loop_radius = 1.0
81 | shader_parameter/loop_count = 0.5
82 |
83 | [sub_resource type="TubeTrailMesh" id="TubeTrailMesh_gxmxl"]
84 | material = SubResource("ShaderMaterial_kem5a")
85 | custom_aabb = AABB(0, 0, 0, 0, 20, 0)
86 | radius = 0.05
87 | cap_top = false
88 | cap_bottom = false
89 | curve = SubResource("Curve_6bw2v")
90 |
91 | [sub_resource type="CapsuleMesh" id="CapsuleMesh_gdsc3"]
92 |
93 | [sub_resource type="BoxMesh" id="BoxMesh_0bhed"]
94 | size = Vector3(4, 0.2, 4)
95 |
96 | [node name="Demo" type="Node3D"]
97 |
98 | [node name="WindMesh" type="Node3D" parent="."]
99 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, 0)
100 |
101 | [node name="Label3D" type="Label3D" parent="WindMesh"]
102 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.18975, 0)
103 | billboard = 1
104 | text = "USING A MESH
105 | * Single trail
106 | * Not interactive"
107 |
108 | [node name="WindTrail" type="MeshInstance3D" parent="WindMesh"]
109 | transform = Transform3D(1, 1.06581e-14, -4.02341e-21, 0, -4.37114e-08, -1, -1.06581e-14, 1, -4.37114e-08, 0, 0, 0)
110 | mesh = SubResource("TubeTrailMesh_m0rpm")
111 | skeleton = NodePath("../..")
112 |
113 | [node name="WindParticles" type="Node3D" parent="."]
114 | transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -4, 0, 0)
115 |
116 | [node name="Label3D" type="Label3D" parent="WindParticles"]
117 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -4.37114e-08, -1)
118 | billboard = 1
119 | text = "USING PARTICLES
120 | *Works with GPUParticlesAttractors/Colliders!
121 | *Not easy to offset time over just one GPUParticles3D"
122 |
123 | [node name="GPUParticles3D" type="GPUParticles3D" parent="WindParticles"]
124 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
125 | amount = 1
126 | lifetime = 8.0
127 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
128 | process_material = SubResource("ParticleProcessMaterial_n4w22")
129 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
130 |
131 | [node name="GPUParticles3D2" type="GPUParticles3D" parent="WindParticles"]
132 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
133 | instance_shader_parameters/extra_offset_time = 1.0
134 | amount = 1
135 | lifetime = 8.0
136 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
137 | process_material = SubResource("ParticleProcessMaterial_n4w22")
138 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
139 |
140 | [node name="GPUParticles3D3" type="GPUParticles3D" parent="WindParticles"]
141 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
142 | instance_shader_parameters/extra_offset_time = 2.0
143 | amount = 1
144 | lifetime = 8.0
145 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
146 | process_material = SubResource("ParticleProcessMaterial_n4w22")
147 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
148 |
149 | [node name="GPUParticles3D4" type="GPUParticles3D" parent="WindParticles"]
150 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
151 | instance_shader_parameters/extra_offset_time = 3.0
152 | amount = 1
153 | lifetime = 8.0
154 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
155 | process_material = SubResource("ParticleProcessMaterial_n4w22")
156 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
157 |
158 | [node name="GPUParticles3D5" type="GPUParticles3D" parent="WindParticles"]
159 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
160 | instance_shader_parameters/extra_offset_time = 4.0
161 | amount = 1
162 | lifetime = 8.0
163 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
164 | process_material = SubResource("ParticleProcessMaterial_n4w22")
165 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
166 |
167 | [node name="GPUParticles3D6" type="GPUParticles3D" parent="WindParticles"]
168 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
169 | instance_shader_parameters/extra_offset_time = 5.0
170 | amount = 1
171 | lifetime = 8.0
172 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
173 | process_material = SubResource("ParticleProcessMaterial_n4w22")
174 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
175 |
176 | [node name="GPUParticles3D7" type="GPUParticles3D" parent="WindParticles"]
177 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -8.74228e-08, 0)
178 | instance_shader_parameters/extra_offset_time = 6.0
179 | amount = 1
180 | lifetime = 8.0
181 | visibility_aabb = AABB(-9.73, -4, -10.12, 20, 50, 20)
182 | process_material = SubResource("ParticleProcessMaterial_n4w22")
183 | draw_pass_1 = SubResource("TubeTrailMesh_gxmxl")
184 |
185 | [node name="Character" type="MeshInstance3D" parent="WindParticles"]
186 | transform = Transform3D(-4.37114e-08, 8.74228e-08, 1, 1, 4.37114e-08, 4.37114e-08, -4.37114e-08, 1, -8.74228e-08, -2.30171, 7.98448, 0.0165795)
187 | mesh = SubResource("CapsuleMesh_gdsc3")
188 | skeleton = NodePath("GPUParticlesAttractorBox3D")
189 |
190 | [node name="GPUParticlesAttractorBox3D" type="GPUParticlesAttractorBox3D" parent="WindParticles/Character"]
191 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.14082, 0.0136864, 0.148346)
192 | strength = -5.0
193 | size = Vector3(3.29405, 1.9686, 2.74213)
194 |
195 | [node name="Wall" type="MeshInstance3D" parent="WindParticles"]
196 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.41777, 9.44268, -4.12753e-07)
197 | mesh = SubResource("BoxMesh_0bhed")
198 |
199 | [node name="GPUParticlesCollisionBox3D" type="GPUParticlesCollisionBox3D" parent="WindParticles/Wall"]
200 | size = Vector3(4, 0.2, 4)
201 |
--------------------------------------------------------------------------------
/StylizedCartoonGrass/landscaper/terrain_mesh.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="ArrayMesh" load_steps=2 format=4 uid="uid://c7qk0ij15418q"]
2 |
3 | [ext_resource type="Material" uid="uid://gl76s02g8jku" path="res://landscaper/terrain_material.tres" id="1_a8afu"]
4 |
5 | [resource]
6 | _surfaces = [{
7 | "aabb": AABB(-5, 0, -5, 10, 1.32549, 10),
8 | "attribute_data": PackedByteArray("AAAAAAAAAADNzMw9AAAAAAAAAADNzMw9AAAAAM3MzD3NzMw9AAAAAM3MzD3NzMw9AAAAAM3MzD3NzMw9zczMPQAAAADNzEw+AAAAAM3MTD7NzMw9zczMPc3MzD3NzEw+AAAAAM3MTD7NzMw9zcxMPgAAAACamZk+AAAAAJqZmT7NzMw9zcxMPs3MzD2amZk+AAAAAJqZmT7NzMw9mpmZPgAAAADNzMw+AAAAAM3MzD7NzMw9mpmZPs3MzD3NzMw+AAAAAM3MzD7NzMw9zczMPgAAAAAAAAA/AAAAAAAAAD/NzMw9zczMPs3MzD0AAAA/AAAAAAAAAD/NzMw9AAAAPwAAAACamRk/AAAAAJqZGT/NzMw9AAAAP83MzD2amRk/AAAAAJqZGT/NzMw9mpkZPwAAAAAzMzM/AAAAADMzMz/NzMw9mpkZP83MzD0zMzM/AAAAADMzMz/NzMw9MzMzPwAAAADNzEw/AAAAAM3MTD/NzMw9MzMzP83MzD3NzEw/AAAAAM3MTD/NzMw9zcxMPwAAAABmZmY/AAAAAGZmZj/NzMw9zcxMP83MzD1mZmY/AAAAAGZmZj/NzMw9ZmZmPwAAAAAAAIA/AAAAAAAAgD/NzMw9ZmZmP83MzD0AAIA/zczMPQAAAADNzEw+AAAAAM3MzD3NzMw9zczMPc3MzD3NzEw+AAAAAM3MTD7NzMw9zczMPc3MzD3NzEw+zczMPc3MzD3NzEw+zczMPc3MTD7NzEw+zczMPc3MTD7NzEw+zczMPc3MTD7NzEw+zcxMPs3MzD2amZk+zczMPZqZmT7NzEw+zcxMPs3MTD6amZk+zczMPZqZmT7NzEw+mpmZPs3MzD3NzMw+zczMPc3MzD7NzEw+mpmZPs3MTD7NzMw+zczMPc3MzD7NzEw+zczMPs3MzD0AAAA/zczMPQAAAD/NzEw+zczMPs3MTD4AAAA/zczMPQAAAD/NzEw+AAAAP83MzD2amRk/zczMPZqZGT/NzEw+AAAAP83MTD6amRk/zczMPZqZGT/NzEw+mpkZP83MzD0zMzM/zczMPTMzMz/NzEw+mpkZP83MTD4zMzM/zczMPTMzMz/NzEw+MzMzP83MzD3NzEw/zczMPc3MTD/NzEw+MzMzP83MTD7NzEw/zczMPc3MTD/NzEw+zcxMP83MzD1mZmY/zczMPWZmZj/NzEw+zcxMP83MTD5mZmY/zczMPWZmZj/NzEw+ZmZmP83MzD0AAIA/zczMPQAAgD/NzEw+ZmZmP83MTD4AAIA/zcxMPgAAAACamZk+AAAAAM3MTD7NzMw9zcxMPs3MzD2amZk+AAAAAJqZmT7NzMw9zcxMPs3MzD2amZk+zczMPc3MTD7NzEw+zcxMPs3MTD6amZk+zczMPZqZmT7NzEw+zcxMPs3MTD6amZk+zcxMPs3MTD6amZk+zcxMPpqZmT6amZk+zcxMPpqZmT6amZk+zcxMPpqZmT6amZk+mpmZPs3MTD7NzMw+zcxMPs3MzD6amZk+mpmZPpqZmT7NzMw+zcxMPs3MzD6amZk+zczMPs3MTD4AAAA/zcxMPgAAAD+amZk+zczMPpqZmT4AAAA/zcxMPgAAAD+amZk+AAAAP83MTD6amRk/zcxMPpqZGT+amZk+AAAAP5qZmT6amRk/zcxMPpqZGT+amZk+mpkZP83MTD4zMzM/zcxMPjMzMz+amZk+mpkZP5qZmT4zMzM/zcxMPjMzMz+amZk+MzMzP83MTD7NzEw/zcxMPs3MTD+amZk+MzMzP5qZmT7NzEw/zcxMPs3MTD+amZk+zcxMP83MTD5mZmY/zcxMPmZmZj+amZk+zcxMP5qZmT5mZmY/zcxMPmZmZj+amZk+ZmZmP83MTD4AAIA/zcxMPgAAgD+amZk+ZmZmP5qZmT4AAIA/mpmZPgAAAADNzMw+AAAAAJqZmT7NzMw9mpmZPs3MzD3NzMw+AAAAAM3MzD7NzMw9mpmZPs3MzD3NzMw+zczMPZqZmT7NzEw+mpmZPs3MTD7NzMw+zczMPc3MzD7NzEw+mpmZPs3MTD7NzMw+zcxMPpqZmT6amZk+mpmZPpqZmT7NzMw+zcxMPs3MzD6amZk+mpmZPpqZmT7NzMw+mpmZPpqZmT7NzMw+mpmZPs3MzD7NzMw+mpmZPs3MzD7NzMw+mpmZPs3MzD7NzMw+zczMPpqZmT4AAAA/mpmZPgAAAD/NzMw+zczMPs3MzD4AAAA/mpmZPgAAAD/NzMw+AAAAP5qZmT6amRk/mpmZPpqZGT/NzMw+AAAAP83MzD6amRk/mpmZPpqZGT/NzMw+mpkZP5qZmT4zMzM/mpmZPjMzMz/NzMw+mpkZP83MzD4zMzM/mpmZPjMzMz/NzMw+MzMzP5qZmT7NzEw/mpmZPs3MTD/NzMw+MzMzP83MzD7NzEw/mpmZPs3MTD/NzMw+zcxMP5qZmT5mZmY/mpmZPmZmZj/NzMw+zcxMP83MzD5mZmY/mpmZPmZmZj/NzMw+ZmZmP5qZmT4AAIA/mpmZPgAAgD/NzMw+ZmZmP83MzD4AAIA/zczMPgAAAAAAAAA/AAAAAM3MzD7NzMw9zczMPs3MzD0AAAA/AAAAAAAAAD/NzMw9zczMPs3MzD0AAAA/zczMPc3MzD7NzEw+zczMPs3MTD4AAAA/zczMPQAAAD/NzEw+zczMPs3MTD4AAAA/zcxMPs3MzD6amZk+zczMPpqZmT4AAAA/zcxMPgAAAD+amZk+zczMPpqZmT4AAAA/mpmZPs3MzD7NzMw+zczMPs3MzD4AAAA/mpmZPgAAAD/NzMw+zczMPs3MzD4AAAA/zczMPs3MzD4AAAA/zczMPgAAAD8AAAA/zczMPgAAAD8AAAA/zczMPgAAAD8AAAA/AAAAP83MzD6amRk/zczMPpqZGT8AAAA/AAAAPwAAAD+amRk/zczMPpqZGT8AAAA/mpkZP83MzD4zMzM/zczMPjMzMz8AAAA/mpkZPwAAAD8zMzM/zczMPjMzMz8AAAA/MzMzP83MzD7NzEw/zczMPs3MTD8AAAA/MzMzPwAAAD/NzEw/zczMPs3MTD8AAAA/zcxMP83MzD5mZmY/zczMPmZmZj8AAAA/zcxMPwAAAD9mZmY/zczMPmZmZj8AAAA/ZmZmP83MzD4AAIA/zczMPgAAgD8AAAA/ZmZmPwAAAD8AAIA/AAAAPwAAAACamRk/AAAAAAAAAD/NzMw9AAAAP83MzD2amRk/AAAAAJqZGT/NzMw9AAAAP83MzD2amRk/zczMPQAAAD/NzEw+AAAAP83MTD6amRk/zczMPZqZGT/NzEw+AAAAP83MTD6amRk/zcxMPgAAAD+amZk+AAAAP5qZmT6amRk/zcxMPpqZGT+amZk+AAAAP5qZmT6amRk/mpmZPgAAAD/NzMw+AAAAP83MzD6amRk/mpmZPpqZGT/NzMw+AAAAP83MzD6amRk/zczMPgAAAD8AAAA/AAAAPwAAAD+amRk/zczMPpqZGT8AAAA/AAAAPwAAAD+amRk/AAAAPwAAAD+amRk/AAAAP5qZGT+amRk/AAAAP5qZGT+amRk/AAAAP5qZGT+amRk/mpkZPwAAAD8zMzM/AAAAPzMzMz+amRk/mpkZP5qZGT8zMzM/AAAAPzMzMz+amRk/MzMzPwAAAD/NzEw/AAAAP83MTD+amRk/MzMzP5qZGT/NzEw/AAAAP83MTD+amRk/zcxMPwAAAD9mZmY/AAAAP2ZmZj+amRk/zcxMP5qZGT9mZmY/AAAAP2ZmZj+amRk/ZmZmPwAAAD8AAIA/AAAAPwAAgD+amRk/ZmZmP5qZGT8AAIA/mpkZPwAAAAAzMzM/AAAAAJqZGT/NzMw9mpkZP83MzD0zMzM/AAAAADMzMz/NzMw9mpkZP83MzD0zMzM/zczMPZqZGT/NzEw+mpkZP83MTD4zMzM/zczMPTMzMz/NzEw+mpkZP83MTD4zMzM/zcxMPpqZGT+amZk+mpkZP5qZmT4zMzM/zcxMPjMzMz+amZk+mpkZP5qZmT4zMzM/mpmZPpqZGT/NzMw+mpkZP83MzD4zMzM/mpmZPjMzMz/NzMw+mpkZP83MzD4zMzM/zczMPpqZGT8AAAA/mpkZPwAAAD8zMzM/zczMPjMzMz8AAAA/mpkZPwAAAD8zMzM/AAAAP5qZGT+amRk/mpkZP5qZGT8zMzM/AAAAPzMzMz+amRk/mpkZP5qZGT8zMzM/mpkZP5qZGT8zMzM/mpkZPzMzMz8zMzM/mpkZPzMzMz8zMzM/mpkZPzMzMz8zMzM/MzMzP5qZGT/NzEw/mpkZP83MTD8zMzM/MzMzPzMzMz/NzEw/mpkZP83MTD8zMzM/zcxMP5qZGT9mZmY/mpkZP2ZmZj8zMzM/zcxMPzMzMz9mZmY/mpkZP2ZmZj8zMzM/ZmZmP5qZGT8AAIA/mpkZPwAAgD8zMzM/ZmZmPzMzMz8AAIA/MzMzPwAAAADNzEw/AAAAADMzMz/NzMw9MzMzP83MzD3NzEw/AAAAAM3MTD/NzMw9MzMzP83MzD3NzEw/zczMPTMzMz/NzEw+MzMzP83MTD7NzEw/zczMPc3MTD/NzEw+MzMzP83MTD7NzEw/zcxMPjMzMz+amZk+MzMzP5qZmT7NzEw/zcxMPs3MTD+amZk+MzMzP5qZmT7NzEw/mpmZPjMzMz/NzMw+MzMzP83MzD7NzEw/mpmZPs3MTD/NzMw+MzMzP83MzD7NzEw/zczMPjMzMz8AAAA/MzMzPwAAAD/NzEw/zczMPs3MTD8AAAA/MzMzPwAAAD/NzEw/AAAAPzMzMz+amRk/MzMzP5qZGT/NzEw/AAAAP83MTD+amRk/MzMzP5qZGT/NzEw/mpkZPzMzMz8zMzM/MzMzPzMzMz/NzEw/mpkZP83MTD8zMzM/MzMzPzMzMz/NzEw/MzMzPzMzMz/NzEw/MzMzP83MTD/NzEw/MzMzP83MTD/NzEw/MzMzP83MTD/NzEw/zcxMPzMzMz9mZmY/MzMzP2ZmZj/NzEw/zcxMP83MTD9mZmY/MzMzP2ZmZj/NzEw/ZmZmPzMzMz8AAIA/MzMzPwAAgD/NzEw/ZmZmP83MTD8AAIA/zcxMPwAAAABmZmY/AAAAAM3MTD/NzMw9zcxMP83MzD1mZmY/AAAAAGZmZj/NzMw9zcxMP83MzD1mZmY/zczMPc3MTD/NzEw+zcxMP83MTD5mZmY/zczMPWZmZj/NzEw+zcxMP83MTD5mZmY/zcxMPs3MTD+amZk+zcxMP5qZmT5mZmY/zcxMPmZmZj+amZk+zcxMP5qZmT5mZmY/mpmZPs3MTD/NzMw+zcxMP83MzD5mZmY/mpmZPmZmZj/NzMw+zcxMP83MzD5mZmY/zczMPs3MTD8AAAA/zcxMPwAAAD9mZmY/zczMPmZmZj8AAAA/zcxMPwAAAD9mZmY/AAAAP83MTD+amRk/zcxMP5qZGT9mZmY/AAAAP2ZmZj+amRk/zcxMP5qZGT9mZmY/mpkZP83MTD8zMzM/zcxMPzMzMz9mZmY/mpkZP2ZmZj8zMzM/zcxMPzMzMz9mZmY/MzMzP83MTD/NzEw/zcxMP83MTD9mZmY/MzMzP2ZmZj/NzEw/zcxMP83MTD9mZmY/zcxMP83MTD9mZmY/zcxMP2ZmZj9mZmY/zcxMP2ZmZj9mZmY/zcxMP2ZmZj9mZmY/ZmZmP83MTD8AAIA/zcxMPwAAgD9mZmY/ZmZmP2ZmZj8AAIA/ZmZmPwAAAAAAAIA/AAAAAGZmZj/NzMw9ZmZmP83MzD0AAIA/AAAAAAAAgD/NzMw9ZmZmP83MzD0AAIA/zczMPWZmZj/NzEw+ZmZmP83MTD4AAIA/zczMPQAAgD/NzEw+ZmZmP83MTD4AAIA/zcxMPmZmZj+amZk+ZmZmP5qZmT4AAIA/zcxMPgAAgD+amZk+ZmZmP5qZmT4AAIA/mpmZPmZmZj/NzMw+ZmZmP83MzD4AAIA/mpmZPgAAgD/NzMw+ZmZmP83MzD4AAIA/zczMPmZmZj8AAAA/ZmZmPwAAAD8AAIA/zczMPgAAgD8AAAA/ZmZmPwAAAD8AAIA/AAAAP2ZmZj+amRk/ZmZmP5qZGT8AAIA/AAAAPwAAgD+amRk/ZmZmP5qZGT8AAIA/mpkZP2ZmZj8zMzM/ZmZmPzMzMz8AAIA/mpkZPwAAgD8zMzM/ZmZmPzMzMz8AAIA/MzMzP2ZmZj/NzEw/ZmZmP83MTD8AAIA/MzMzPwAAgD/NzEw/ZmZmP83MTD8AAIA/zcxMP2ZmZj9mZmY/ZmZmP2ZmZj8AAIA/zcxMPwAAgD9mZmY/ZmZmP2ZmZj8AAIA/ZmZmP2ZmZj8AAIA/ZmZmPwAAgD8AAIA/ZmZmPwAAgD8AAIA/"),
9 | "format": 34359738385,
10 | "material": ExtResource("1_a8afu"),
11 | "primitive": 3,
12 | "uv_scale": Vector4(0, 0, 0, 0),
13 | "vertex_count": 600,
14 | "vertex_data": PackedByteArray("AACgwIWEBD8AAKDAAACAwIeGBj8AAKDAAACgwKmoKD8AAIDAAACgwKmoKD8AAIDAAACAwIeGBj8AAKDAAACAwKOiIj8AAIDAAACgwKmoKD8AAIDAAACAwKOiIj8AAIDAAACgwJOSEj8AAEDAAACgwJOSEj8AAEDAAACAwKOiIj8AAIDAAACAwNvaWj8AAEDAAACgwJOSEj8AAEDAAACAwNvaWj8AAEDAAACgwJOSEj8AAADAAACgwJOSEj8AAADAAACAwNvaWj8AAEDAAACAwJOSEj8AAADAAACgwJOSEj8AAADAAACAwJOSEj8AAADAAACgwNHQ0D4AAIC/AACgwNHQ0D4AAIC/AACAwJOSEj8AAADAAACAwNHQ0D4AAIC/AACgwNHQ0D4AAIC/AACAwNHQ0D4AAIC/AACgwNHQ0D4AAAAAAACgwNHQ0D4AAAAAAACAwNHQ0D4AAIC/AACAwL28vD4AAAAAAACgwNHQ0D4AAAAAAACAwL28vD4AAAAAAACgwI2MjD4AAIA/AACgwI2MjD4AAIA/AACAwL28vD4AAAAAAACAwIWEhD4AAIA/AACgwI2MjD4AAIA/AACAwIWEhD4AAIA/AACgwOnoaD4AAABAAACgwOnoaD4AAABAAACAwIWEhD4AAIA/AACAwKWkpD4AAABAAACgwOnoaD4AAABAAACAwKWkpD4AAABAAACgwMHAwD0AAEBAAACgwMHAwD0AAEBAAACAwKWkpD4AAABAAACAwI2MjD4AAEBAAACgwMHAwD0AAEBAAACAwI2MjD4AAEBAAACgwOHgYD0AAIBAAACgwOHgYD0AAIBAAACAwI2MjD4AAEBAAACAwIGAADwAAIBAAACgwOHgYD0AAIBAAACAwIGAADwAAIBAAACgwAAAAAAAAKBAAACgwAAAAAAAAKBAAACAwIGAADwAAIBAAACAwIGAgDwAAKBAAACAwIeGBj8AAKDAAABAwIGAAD8AAKDAAACAwKOiIj8AAIDAAACAwKOiIj8AAIDAAABAwIGAAD8AAKDAAABAwL28PD8AAIDAAACAwKOiIj8AAIDAAABAwL28PD8AAIDAAACAwNvaWj8AAEDAAACAwNvaWj8AAEDAAABAwL28PD8AAIDAAABAwO/ubj8AAEDAAACAwNvaWj8AAEDAAABAwO/ubj8AAEDAAACAwJOSEj8AAADA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AAAAQK2sLD8AAAAAAABAQMHAQD4AAAAAAAAAQNHQUD8AAIA/AAAAQNHQUD8AAIA/AABAQMHAQD4AAAAAAABAQKWkpD4AAIA/AAAAQNHQUD8AAIA/AABAQKWkpD4AAIA/AAAAQJ2cnD4AAABAAAAAQJ2cnD4AAABAAABAQKWkpD4AAIA/AABAQPHw8D4AAABAAAAAQJ2cnD4AAABAAABAQPHw8D4AAABAAAAAQOHg4D4AAEBAAAAAQOHg4D4AAEBAAABAQPHw8D4AAABAAABAQP38/D4AAEBAAAAAQOHg4D4AAEBAAABAQP38/D4AAEBAAAAAQKGgID8AAIBAAAAAQKGgID8AAIBAAABAQP38/D4AAEBAAABAQIWEBD8AAIBAAAAAQKGgID8AAIBAAABAQIWEBD8AAIBAAAAAQNHQ0D4AAKBAAAAAQNHQ0D4AAKBAAABAQIWEBD8AAIBAAABAQJOSEj8AAKBAAABAQO3s7D4AAKDAAACAQKGgID8AAKDAAABAQJOSEj8AAIDAAABAQJOSEj8AAIDAAACAQKGgID8AAKDAAACAQK2sLD8AAIDAAABAQJOSEj8AAIDAAACAQK2sLD8AAIDAAABAQO3s7D4AAEDAAABAQO3s7D4AAEDAAACAQK2sLD8AAIDAAACAQMXERD8AAEDAAABAQO3s7D4AAEDAAACAQMXERD8AAEDAAABAQI2MDD8AAADAAABAQI2MDD8AAADAAACAQMXERD8AAEDAAACAQKGgID8AAADAAABAQI2MDD8AAADAAACAQKGgID8AAADAAABAQPHw8D0AAIC/AABAQPHw8D0AAIC/AACAQKGgID8AAADAAACAQIGAAD8AAIC/AABAQPHw8D0AAIC/AACAQIGAAD8AAIC/AABAQMHAQD4AAAAAAABAQMHAQD4AAAAAAACAQIGAAD8AAIC/AACAQJmYGD4AAAAAAABAQMHAQD4AAAAAAACAQJmYGD4AAAAAAABAQKWkpD4AAIA/AABAQKWkpD4AAIA/AACAQJmYGD4AAAAAAACAQNHQUD4AAIA/AABAQKWkpD4AAIA/AACAQNHQUD4AAIA/AABAQPHw8D4AAABAAABAQPHw8D4AAABAAACAQNHQUD4AAIA/AACAQK2sLD8AAABAAABAQPHw8D4AAABAAACAQK2sLD8AAABAAABAQP38/D4AAEBAAABAQP38/D4AAEBAAACAQK2sLD8AAABAAACAQImICD8AAEBAAABAQP38/D4AAEBAAACAQImICD8AAEBAAABAQIWEBD8AAIBAAABAQIWEBD8AAIBAAACAQImICD8AAEBAAACAQNHQ0D4AAIBAAABAQIWEBD8AAIBAAACAQNHQ0D4AAIBAAABAQJOSEj8AAKBAAABAQJOSEj8AAKBAAACAQNHQ0D4AAIBAAACAQJWUFD8AAKBAAACAQKGgID8AAKDAAACgQLm4OD8AAKDAAACAQK2sLD8AAIDAAACAQK2sLD8AAIDAAACgQLm4OD8AAKDAAACgQMXERD8AAIDAAACAQK2sLD8AAIDAAACgQMXERD8AAIDAAACAQMXERD8AAEDAAACAQMXERD8AAEDAAACgQMXERD8AAIDAAACgQKGgID8AAEDAAACAQMXERD8AAEDAAACgQKGgID8AAEDAAACAQKGgID8AAADAAACAQKGgID8AAADAAACgQKGgID8AAEDAAACgQKGgID8AAADAAACAQKGgID8AAADAAACgQKGgID8AAADAAACAQIGAAD8AAIC/AACAQIGAAD8AAIC/AACgQKGgID8AAADAAACgQNHQ0D4AAIC/AACAQIGAAD8AAIC/AACgQNHQ0D4AAIC/AACAQJmYGD4AAAAAAACAQJmYGD4AAAAAAACgQNHQ0D4AAIC/AACgQJ2cnD4AAAAAAACAQJmYGD4AAAAAAACgQJ2cnD4AAAAAAACAQNHQUD4AAIA/AACAQNHQUD4AAIA/AACgQJ2cnD4AAAAAAACgQLW0tD4AAIA/AACAQNHQUD4AAIA/AACgQLW0tD4AAIA/AACAQK2sLD8AAABAAACAQK2sLD8AAABAAACgQLW0tD4AAIA/AACgQIWEBD8AAABAAACAQK2sLD8AAABAAACgQIWEBD8AAABAAACAQImICD8AAEBAAACAQImICD8AAEBAAACgQIWEBD8AAABAAACgQJWUFD8AAEBAAACAQImICD8AAEBAAACgQJWUFD8AAEBAAACAQNHQ0D4AAIBAAACAQNHQ0D4AAIBAAACgQJWUFD8AAEBAAACgQJeWFj8AAIBAAACAQNHQ0D4AAIBAAACgQJeWFj8AAIBAAACAQJWUFD8AAKBAAACAQJWUFD8AAKBAAACgQJeWFj8AAIBAAACgQJOSEj8AAKBA")
15 | }]
16 |
--------------------------------------------------------------------------------