├── 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 | ![6510b67353083112835344](https://github.com/dip000/my-godotshaders/assets/58742147/251039c9-ba47-41dd-92c2-ac030c50304b) 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 | ![65120d357891c748369480](https://github.com/dip000/my-godotshaders/assets/58742147/5f9147dd-699e-4021-8eda-6015be9b7c5c) 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 | ![6528490401dfb292982739](https://github.com/dip000/my-godotshaders/assets/58742147/635d6665-c63f-463a-8880-65b2d8b30a55) 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 | ![preview](https://github.com/dip000/my-godotshaders/assets/58742147/4f7bb752-f074-4818-b0bc-5b37b480728c) 24 | 25 | ## WindTrailWithLoops 26 | Wind trails using a single mesh and GPUParticles3D. Though the particle avoidance is kind of wacky.. 27 | ![68798a3da0857038899566](https://github.com/user-attachments/assets/21e9fbbc-22cf-4787-a09b-b386452483d5) 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 | 16 | 35 | 37 | 42 | 50 | 51 | 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 | 16 | 35 | 37 | 42 | 45 | 53 | 61 | 62 | 63 | 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 | 16 | 35 | 37 | 41 | 49 | 55 | 61 | 67 | 73 | 79 | 85 | 91 | 92 | 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/ubj8AAEDAAACAwJOSEj8AAADAAACAwJOSEj8AAADAAABAwO/ubj8AAEDAAABAwOXkZD8AAADAAACAwJOSEj8AAADAAABAwOXkZD8AAADAAACAwNHQ0D4AAIC/AACAwNHQ0D4AAIC/AABAwOXkZD8AAADAAABAwLu6Oj8AAIC/AACAwNHQ0D4AAIC/AABAwLu6Oj8AAIC/AACAwL28vD4AAAAAAACAwL28vD4AAAAAAABAwLu6Oj8AAIC/AABAwKuqKj8AAAAAAACAwL28vD4AAAAAAABAwKuqKj8AAAAAAACAwIWEhD4AAIA/AACAwIWEhD4AAIA/AABAwKuqKj8AAAAAAABAwNHQ0D4AAIA/AACAwIWEhD4AAIA/AABAwNHQ0D4AAIA/AACAwKWkpD4AAABAAACAwKWkpD4AAABAAABAwNHQ0D4AAIA/AABAwNHQ0D4AAABAAACAwKWkpD4AAABAAABAwNHQ0D4AAABAAACAwI2MjD4AAEBAAACAwI2MjD4AAEBAAABAwNHQ0D4AAABAAABAwNHQ0D4AAEBAAACAwI2MjD4AAEBAAABAwNHQ0D4AAEBAAACAwIGAADwAAIBAAACAwIGAADwAAIBAAABAwNHQ0D4AAEBAAABAwOnoaD4AAIBAAACAwIGAADwAAIBAAABAwOnoaD4AAIBAAACAwIGAgDwAAKBAAACAwIGAgDwAAKBAAABAwOnoaD4AAIBAAABAwJGQkD0AAKBAAABAwIGAAD8AAKDAAAAAwIWEBD8AAKDAAABAwL28PD8AAIDAAABAwL28PD8AAIDAAAAAwIWEBD8AAKDAAAAAwIKBgT8AAIDAAABAwL28PD8AAIDAAAAAwIKBgT8AAIDAAABAwO/ubj8AAEDAAABAwO/ubj8AAEDAAAAAwIKBgT8AAIDAAAAAwJKRkT8AAEDAAABAwO/ubj8AAEDAAAAAwJKRkT8AAEDAAABAwOXkZD8AAADAAABAwOXkZD8AAADAAAAAwJKRkT8AAEDAAAAAwOfmZj8AAADAAABAwOXkZD8AAADAAAAAwOfmZj8AAADAAABAwLu6Oj8AAIC/AABAwLu6Oj8AAIC/AAAAwOfmZj8AAADAAAAAwNXUVD8AAIC/AABAwLu6Oj8AAIC/AAAAwNXUVD8AAIC/AABAwKuqKj8AAAAAAABAwKuqKj8AAAAAAAAAwNXUVD8AAIC/AAAAwIWEhD8AAAAAAABAwKuqKj8AAAAAAAAAwIWEhD8AAAAAAABAwNHQ0D4AAIA/AABAwNHQ0D4AAIA/AAAAwIWEhD8AAAAAAAAAwO/ubj8AAIA/AABAwNHQ0D4AAIA/AAAAwO/ubj8AAIA/AABAwNHQ0D4AAABAAABAwNHQ0D4AAABAAAAAwO/ubj8AAIA/AAAAwNHQ0D4AAABAAABAwNHQ0D4AAABAAAAAwNHQ0D4AAABAAABAwNHQ0D4AAEBAAABAwNHQ0D4AAEBAAAAAwNHQ0D4AAABAAAAAwNHQ0D4AAEBAAABAwNHQ0D4AAEBAAAAAwNHQ0D4AAEBAAABAwOnoaD4AAIBAAABAwOnoaD4AAIBAAAAAwNHQ0D4AAEBAAAAAwJ2cnD4AAIBAAABAwOnoaD4AAIBAAAAAwJ2cnD4AAIBAAABAwJGQkD0AAKBAAABAwJGQkD0AAKBAAAAAwJ2cnD4AAIBAAAAAwMHAQD4AAKBAAAAAwIWEBD8AAKDAAACAv8nIyD4AAKDAAAAAwIKBgT8AAIDAAAAAwIKBgT8AAIDAAACAv8nIyD4AAKDAAACAv4+ODj8AAIDAAAAAwIKBgT8AAIDAAACAv4+ODj8AAIDAAAAAwJKRkT8AAEDAAAAAwJKRkT8AAEDAAACAv4+ODj8AAIDAAACAv9vaWj8AAEDAAAAAwJKRkT8AAEDAAACAv9vaWj8AAEDAAAAAwOfmZj8AAADAAAAAwOfmZj8AAADAAACAv9vaWj8AAEDAAACAv83MTD8AAADAAAAAwOfmZj8AAADAAACAv83MTD8AAADAAAAAwNXUVD8AAIC/AAAAwNXUVD8AAIC/AACAv83MTD8AAADAAACAv4qJiT8AAIC/AAAAwNXUVD8AAIC/AACAv4qJiT8AAIC/AAAAwIWEhD8AAAAAAAAAwIWEhD8AAAAAAACAv4qJiT8AAIC/AACAv6Oioj8AAAAAAAAAwIWEhD8AAAAAAACAv6Oioj8AAAAAAAAAwO/ubj8AAIA/AAAAwO/ubj8AAIA/AACAv6Oioj8AAAAAAACAv6qpqT8AAIA/AAAAwO/ubj8AAIA/AACAv6qpqT8AAIA/AAAAwNHQ0D4AAABAAAAAwNHQ0D4AAABAAACAv6qpqT8AAIA/AACAv+/ubj8AAABAAAAAwNHQ0D4AAABAAACAv+/ubj8AAABAAAAAwNHQ0D4AAEBAAAAAwNHQ0D4AAEBAAACAv+/ubj8AAABAAACAv9HQ0D4AAEBAAAAAwNHQ0D4AAEBAAACAv9HQ0D4AAEBAAAAAwJ2cnD4AAIBAAAAAwJ2cnD4AAIBAAACAv9HQ0D4AAEBAAACAv728vD4AAIBAAAAAwJ2cnD4AAIBAAACAv728vD4AAIBAAAAAwMHAQD4AAKBAAAAAwMHAQD4AAKBAAACAv728vD4AAIBAAACAv42MjD4AAKBAAACAv8nIyD4AAKDAAAAAAOHgYD4AAKDAAACAv4+ODj8AAIDAAACAv4+ODj8AAIDAAAAAAOHgYD4AAKDAAAAAAPn4eD4AAIDAAACAv4+ODj8AAIDAAAAAAPn4eD4AAIDAAACAv9vaWj8AAEDAAACAv9vaWj8AAEDAAAAAAPn4eD4AAIDAAAAAAM3MzD4AAEDAAACAv9vaWj8AAEDAAAAAAM3MzD4AAEDAAACAv83MTD8AAADAAACAv83MTD8AAADAAAAAAM3MzD4AAEDAAAAAAJWUFD8AAADAAACAv83MTD8AAADAAAAAAJWUFD8AAADAAACAv4qJiT8AAIC/AACAv4qJiT8AAIC/AAAAAJWUFD8AAADAAAAAAImIiD8AAIC/AACAv4qJiT8AAIC/AAAAAImIiD8AAIC/AACAv6Oioj8AAAAAAACAv6Oioj8AAAAAAAAAAImIiD8AAIC/AAAAAKGgoD8AAAAAAACAv6Oioj8AAAAAAAAAAKGgoD8AAAAAAACAv6qpqT8AAIA/AACAv6qpqT8AAIA/AAAAAKGgoD8AAAAAAAAAAJ2cnD8AAIA/AACAv6qpqT8AAIA/AAAAAJ2cnD8AAIA/AACAv+/ubj8AAABAAACAv+/ubj8AAABAAAAAAJ2cnD8AAIA/AAAAAIeGhj8AAABAAACAv+/ubj8AAABAAAAAAIeGhj8AAABAAACAv9HQ0D4AAEBAAACAv9HQ0D4AAEBAAAAAAIeGhj8AAABAAAAAAPHw8D4AAEBAAACAv9HQ0D4AAEBAAAAAAPHw8D4AAEBAAACAv728vD4AAIBAAACAv728vD4AAIBAAAAAAPHw8D4AAEBAAAAAAIWEhD4AAIBAAACAv728vD4AAIBAAAAAAIWEhD4AAIBAAACAv42MjD4AAKBAAACAv42MjD4AAKBAAAAAAIWEhD4AAIBAAAAAAJWUlD4AAKBAAAAAAOHgYD4AAKDAAACAP/HwcD4AAKDAAAAAAPn4eD4AAIDAAAAAAPn4eD4AAIDAAACAP/HwcD4AAKDAAACAP+noaD4AAIDAAAAAAPn4eD4AAIDAAACAP+noaD4AAIDAAAAAAM3MzD4AAEDAAAAAAM3MzD4AAEDAAACAP+noaD4AAIDAAACAP5mYGD4AAEDAAAAAAM3MzD4AAEDAAACAP5mYGD4AAEDAAAAAAJWUFD8AAADAAAAAAJWUFD8AAADAAACAP5mYGD4AAEDAAACAPwAAAAAAAADAAAAAAJWUFD8AAADAAACAPwAAAAAAAADAAAAAAImIiD8AAIC/AAAAAImIiD8AAIC/AACAPwAAAAAAAADAAACAP/X09D4AAIC/AAAAAImIiD8AAIC/AACAP/X09D4AAIC/AAAAAKGgoD8AAAAAAAAAAKGgoD8AAAAAAACAP/X09D4AAIC/AACAP5WUlD8AAAAAAAAAAKGgoD8AAAAAAACAP5WUlD8AAAAAAAAAAJ2cnD8AAIA/AAAAAJ2cnD8AAIA/AACAP5WUlD8AAAAAAACAP6Oioj8AAIA/AAAAAJ2cnD8AAIA/AACAP6Oioj8AAIA/AAAAAIeGhj8AAABAAAAAAIeGhj8AAABAAACAP6Oioj8AAIA/AACAP9HQUD8AAABAAAAAAIeGhj8AAABAAACAP9HQUD8AAABAAAAAAPHw8D4AAEBAAAAAAPHw8D4AAEBAAACAP9HQUD8AAABAAACAP52cnD4AAEBAAAAAAPHw8D4AAEBAAACAP52cnD4AAEBAAAAAAIWEhD4AAIBAAAAAAIWEhD4AAIBAAACAP52cnD4AAEBAAACAP8XExD4AAIBAAAAAAIWEhD4AAIBAAACAP8XExD4AAIBAAAAAAJWUlD4AAKBAAAAAAJWUlD4AAKBAAACAP8XExD4AAIBAAACAP9HQ0D4AAKBAAACAP/HwcD4AAKDAAAAAQIWEhD4AAKDAAACAP+noaD4AAIDAAACAP+noaD4AAIDAAAAAQIWEhD4AAKDAAAAAQN3c3D4AAIDAAACAP+noaD4AAIDAAAAAQN3c3D4AAIDAAACAP5mYGD4AAEDAAACAP5mYGD4AAEDAAAAAQN3c3D4AAIDAAAAAQNXU1D4AAEDAAACAP5mYGD4AAEDAAAAAQNXU1D4AAEDAAACAPwAAAAAAAADAAACAPwAAAAAAAADAAAAAQNXU1D4AAEDAAAAAQNnYWD4AAADAAACAPwAAAAAAAADAAAAAQNnYWD4AAADAAACAP/X09D4AAIC/AACAP/X09D4AAIC/AAAAQNnYWD4AAADAAAAAQOHgYD4AAIC/AACAP/X09D4AAIC/AAAAQOHgYD4AAIC/AACAP5WUlD8AAAAAAACAP5WUlD8AAAAAAAAAQOHgYD4AAIC/AAAAQK2sLD8AAAAAAACAP5WUlD8AAAAAAAAAQK2sLD8AAAAAAACAP6Oioj8AAIA/AACAP6Oioj8AAIA/AAAAQK2sLD8AAAAAAAAAQNHQUD8AAIA/AACAP6Oioj8AAIA/AAAAQNHQUD8AAIA/AACAP9HQUD8AAABAAACAP9HQUD8AAABAAAAAQNHQUD8AAIA/AAAAQJ2cnD4AAABAAACAP9HQUD8AAABAAAAAQJ2cnD4AAABAAACAP52cnD4AAEBAAACAP52cnD4AAEBAAAAAQJ2cnD4AAABAAAAAQOHg4D4AAEBAAACAP52cnD4AAEBAAAAAQOHg4D4AAEBAAACAP8XExD4AAIBAAACAP8XExD4AAIBAAAAAQOHg4D4AAEBAAAAAQKGgID8AAIBAAACAP8XExD4AAIBAAAAAQKGgID8AAIBAAACAP9HQ0D4AAKBAAACAP9HQ0D4AAKBAAAAAQKGgID8AAIBAAAAAQNHQ0D4AAKBAAAAAQIWEhD4AAKDAAABAQO3s7D4AAKDAAAAAQN3c3D4AAIDAAAAAQN3c3D4AAIDAAABAQO3s7D4AAKDAAABAQJOSEj8AAIDAAAAAQN3c3D4AAIDAAABAQJOSEj8AAIDAAAAAQNXU1D4AAEDAAAAAQNXU1D4AAEDAAABAQJOSEj8AAIDAAABAQO3s7D4AAEDAAAAAQNXU1D4AAEDAAABAQO3s7D4AAEDAAAAAQNnYWD4AAADAAAAAQNnYWD4AAADAAABAQO3s7D4AAEDAAABAQI2MDD8AAADAAAAAQNnYWD4AAADAAABAQI2MDD8AAADAAAAAQOHgYD4AAIC/AAAAQOHgYD4AAIC/AABAQI2MDD8AAADAAABAQPHw8D0AAIC/AAAAQOHgYD4AAIC/AABAQPHw8D0AAIC/AAAAQK2sLD8AAAAAAAAAQK2sLD8AAAAAAABAQPHw8D0AAIC/AABAQMHAQD4AAAAAAAAAQK2sLD8AAAAAAABAQMHAQD4AAAAAAAAAQNHQUD8AAIA/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 | --------------------------------------------------------------------------------