Merge branch 'develop'
This commit is contained in:
commit
fc3825067f
1251 changed files with 130295 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
# Godot 4+ specific ignores
|
# Godot 4+ specific ignores
|
||||||
.godot/
|
.godot/
|
||||||
/android/
|
/android/
|
||||||
|
*.tmp
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_AnotherPlanet_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_AnotherPlanet_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://cmp5aqolgq5ja"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_AnotherPlanet_Equirect.png-f472fa93928210007749533fa1259b6c.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_AnotherPlanet_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_AnotherPlanet_Equirect.png-f472fa93928210007749533fa1259b6c.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_CartoonNightSky_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_CartoonNightSky_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://0frng64ju3dh"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_CartoonNightSky_Equirect.png-52fdbf942dfee97a08abb221c309d17c.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_CartoonNightSky_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_CartoonNightSky_Equirect.png-52fdbf942dfee97a08abb221c309d17c.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_ClearBlueSky_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_ClearBlueSky_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://ehqdf2ka4fhy"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_ClearBlueSky_Equirect.png-a2ed175d45de374cad502841e1011c08.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_ClearBlueSky_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_ClearBlueSky_Equirect.png-a2ed175d45de374cad502841e1011c08.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_ColdNight_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_ColdNight_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
34
Assets/skybox/AllSkyFree_Sky_ColdNight_Equirect.png.import
Normal file
34
Assets/skybox/AllSkyFree_Sky_ColdNight_Equirect.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://cqyng2l1ccgjt"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_ColdNight_Equirect.png-a10084bc767271a8d80fa9267f2d9dec.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_ColdNight_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_ColdNight_Equirect.png-a10084bc767271a8d80fa9267f2d9dec.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_ColdSunset_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_ColdSunset_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
34
Assets/skybox/AllSkyFree_Sky_ColdSunset_Equirect.png.import
Normal file
34
Assets/skybox/AllSkyFree_Sky_ColdSunset_Equirect.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dwv4jlwoq1cev"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_ColdSunset_Equirect.png-f98f8d38f7987c0a591d330dabb4ae25.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_ColdSunset_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_ColdSunset_Equirect.png-f98f8d38f7987c0a591d330dabb4ae25.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_DeepDusk_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_DeepDusk_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
34
Assets/skybox/AllSkyFree_Sky_DeepDusk_Equirect.png.import
Normal file
34
Assets/skybox/AllSkyFree_Sky_DeepDusk_Equirect.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bnufkjiwlsbsn"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_DeepDusk_Equirect.png-26348cbfe859edd490f712b86c6dd925.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_DeepDusk_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_DeepDusk_Equirect.png-26348cbfe859edd490f712b86c6dd925.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_EpicBlueSunset_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_EpicBlueSunset_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bge2mlo15mqqy"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_EpicBlueSunset_Equirect.png-40d922c511b94cccba391065ac64678e.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_EpicBlueSunset_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_EpicBlueSunset_Equirect.png-40d922c511b94cccba391065ac64678e.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_EpicGloriousPink_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_EpicGloriousPink_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dysuqxmmas0iv"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_EpicGloriousPink_Equirect.png-e7689b4364b44d277fab8c9a857ac0f1.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_EpicGloriousPink_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_EpicGloriousPink_Equirect.png-e7689b4364b44d277fab8c9a857ac0f1.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_MoonBurst_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_MoonBurst_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
34
Assets/skybox/AllSkyFree_Sky_MoonBurst_Equirect.png.import
Normal file
34
Assets/skybox/AllSkyFree_Sky_MoonBurst_Equirect.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://b216qsrdyb16u"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_MoonBurst_Equirect.png-90a4bc136c7b26273ec17f8d5a25eb50.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_MoonBurst_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_MoonBurst_Equirect.png-90a4bc136c7b26273ec17f8d5a25eb50.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/skybox/AllSkyFree_Sky_OvercastLow_Equirect.png
(Stored with Git LFS)
Normal file
BIN
Assets/skybox/AllSkyFree_Sky_OvercastLow_Equirect.png
(Stored with Git LFS)
Normal file
Binary file not shown.
34
Assets/skybox/AllSkyFree_Sky_OvercastLow_Equirect.png.import
Normal file
34
Assets/skybox/AllSkyFree_Sky_OvercastLow_Equirect.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://c01sjk702vkj8"
|
||||||
|
path="res://.godot/imported/AllSkyFree_Sky_OvercastLow_Equirect.png-e32c14c480aaf52f9f03d4d5e0b6e597.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/skybox/AllSkyFree_Sky_OvercastLow_Equirect.png"
|
||||||
|
dest_files=["res://.godot/imported/AllSkyFree_Sky_OvercastLow_Equirect.png-e32c14c480aaf52f9f03d4d5e0b6e597.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
Assets/temp_models/Textures/colormap.png
(Stored with Git LFS)
Normal file
BIN
Assets/temp_models/Textures/colormap.png
(Stored with Git LFS)
Normal file
Binary file not shown.
35
Assets/temp_models/Textures/colormap.png.import
Normal file
35
Assets/temp_models/Textures/colormap.png.import
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://m3jsjukytaqy"
|
||||||
|
path.s3tc="res://.godot/imported/colormap.png-ba57e54e3743a282f3d81dcd3a2fa8c2.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/temp_models/Textures/colormap.png"
|
||||||
|
dest_files=["res://.godot/imported/colormap.png-ba57e54e3743a282f3d81dcd3a2fa8c2.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
BIN
Assets/temp_models/flowers-tall.glb
Normal file
BIN
Assets/temp_models/flowers-tall.glb
Normal file
Binary file not shown.
37
Assets/temp_models/flowers-tall.glb.import
Normal file
37
Assets/temp_models/flowers-tall.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://c5squxlbapts8"
|
||||||
|
path="res://.godot/imported/flowers-tall.glb-f244b44beee32be4bca978c256b9b6a3.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/temp_models/flowers-tall.glb"
|
||||||
|
dest_files=["res://.godot/imported/flowers-tall.glb-f244b44beee32be4bca978c256b9b6a3.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Assets/temp_models/flowers.glb
Normal file
BIN
Assets/temp_models/flowers.glb
Normal file
Binary file not shown.
37
Assets/temp_models/flowers.glb.import
Normal file
37
Assets/temp_models/flowers.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://10c6aovvh80f"
|
||||||
|
path="res://.godot/imported/flowers.glb-643d814f11eac4de9f7fc76085d3adac.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/temp_models/flowers.glb"
|
||||||
|
dest_files=["res://.godot/imported/flowers.glb-643d814f11eac4de9f7fc76085d3adac.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Assets/temp_models/grass.glb
Normal file
BIN
Assets/temp_models/grass.glb
Normal file
Binary file not shown.
37
Assets/temp_models/grass.glb.import
Normal file
37
Assets/temp_models/grass.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://cltv073ea1df6"
|
||||||
|
path="res://.godot/imported/grass.glb-7e581c773d5cf661e4fb13652143204c.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/temp_models/grass.glb"
|
||||||
|
dest_files=["res://.godot/imported/grass.glb-7e581c773d5cf661e4fb13652143204c.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Assets/temp_models/mushrooms.glb
Normal file
BIN
Assets/temp_models/mushrooms.glb
Normal file
Binary file not shown.
37
Assets/temp_models/mushrooms.glb.import
Normal file
37
Assets/temp_models/mushrooms.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://7pg0hhklawxb"
|
||||||
|
path="res://.godot/imported/mushrooms.glb-3620553a4f83af03e1259fecf477bba9.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/temp_models/mushrooms.glb"
|
||||||
|
dest_files=["res://.godot/imported/mushrooms.glb-3620553a4f83af03e1259fecf477bba9.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Assets/temp_models/plant.glb
Normal file
BIN
Assets/temp_models/plant.glb
Normal file
Binary file not shown.
37
Assets/temp_models/plant.glb.import
Normal file
37
Assets/temp_models/plant.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://dpsdijnn33q12"
|
||||||
|
path="res://.godot/imported/plant.glb-339d9b8108b82f10d7e228e28ae0b50b.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/temp_models/plant.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant.glb-339d9b8108b82f10d7e228e28ae0b50b.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
63
Common/animations/Mixamo BoneMap.tres
Normal file
63
Common/animations/Mixamo BoneMap.tres
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
[gd_resource type="BoneMap" load_steps=2 format=3 uid="uid://jsmvf7l3e2tg"]
|
||||||
|
|
||||||
|
[sub_resource type="SkeletonProfileHumanoid" id="SkeletonProfileHumanoid_eq0yh"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
profile = SubResource("SkeletonProfileHumanoid_eq0yh")
|
||||||
|
bonemap = null
|
||||||
|
bone_map/Root = &""
|
||||||
|
bone_map/Hips = &"mixamorig_Hips"
|
||||||
|
bone_map/Spine = &"mixamorig_Spine"
|
||||||
|
bone_map/Chest = &"mixamorig_Spine1"
|
||||||
|
bone_map/UpperChest = &"mixamorig_Spine2"
|
||||||
|
bone_map/Neck = &"mixamorig_Neck"
|
||||||
|
bone_map/Head = &"mixamorig_Head"
|
||||||
|
bone_map/LeftEye = &""
|
||||||
|
bone_map/RightEye = &""
|
||||||
|
bone_map/Jaw = &""
|
||||||
|
bone_map/LeftShoulder = &"mixamorig_LeftShoulder"
|
||||||
|
bone_map/LeftUpperArm = &"mixamorig_LeftArm"
|
||||||
|
bone_map/LeftLowerArm = &"mixamorig_LeftForeArm"
|
||||||
|
bone_map/LeftHand = &"mixamorig_LeftHand"
|
||||||
|
bone_map/LeftThumbMetacarpal = &"mixamorig_LeftHandThumb2"
|
||||||
|
bone_map/LeftThumbProximal = &"mixamorig_LeftHandThumb3"
|
||||||
|
bone_map/LeftThumbDistal = &"mixamorig_LeftHandThumb4"
|
||||||
|
bone_map/LeftIndexProximal = &"mixamorig_LeftHandIndex2"
|
||||||
|
bone_map/LeftIndexIntermediate = &"mixamorig_LeftHandIndex3"
|
||||||
|
bone_map/LeftIndexDistal = &"mixamorig_LeftHandIndex4"
|
||||||
|
bone_map/LeftMiddleProximal = &"mixamorig_LeftHandMiddle2"
|
||||||
|
bone_map/LeftMiddleIntermediate = &"mixamorig_LeftHandMiddle3"
|
||||||
|
bone_map/LeftMiddleDistal = &"mixamorig_LeftHandMiddle4"
|
||||||
|
bone_map/LeftRingProximal = &"mixamorig_LeftHandRing2"
|
||||||
|
bone_map/LeftRingIntermediate = &"mixamorig_LeftHandRing3"
|
||||||
|
bone_map/LeftRingDistal = &"mixamorig_LeftHandRing4"
|
||||||
|
bone_map/LeftLittleProximal = &"mixamorig_LeftHandPinky2"
|
||||||
|
bone_map/LeftLittleIntermediate = &"mixamorig_LeftHandPinky3"
|
||||||
|
bone_map/LeftLittleDistal = &"mixamorig_LeftHandPinky4"
|
||||||
|
bone_map/RightShoulder = &"mixamorig_RightShoulder"
|
||||||
|
bone_map/RightUpperArm = &"mixamorig_RightArm"
|
||||||
|
bone_map/RightLowerArm = &"mixamorig_RightForeArm"
|
||||||
|
bone_map/RightHand = &"mixamorig_RightHand"
|
||||||
|
bone_map/RightThumbMetacarpal = &"mixamorig_RightHandThumb2"
|
||||||
|
bone_map/RightThumbProximal = &"mixamorig_RightHandThumb3"
|
||||||
|
bone_map/RightThumbDistal = &"mixamorig_RightHandThumb4"
|
||||||
|
bone_map/RightIndexProximal = &"mixamorig_RightHandIndex2"
|
||||||
|
bone_map/RightIndexIntermediate = &"mixamorig_RightHandIndex3"
|
||||||
|
bone_map/RightIndexDistal = &"mixamorig_RightHandIndex4"
|
||||||
|
bone_map/RightMiddleProximal = &"mixamorig_RightHandMiddle2"
|
||||||
|
bone_map/RightMiddleIntermediate = &"mixamorig_RightHandMiddle3"
|
||||||
|
bone_map/RightMiddleDistal = &"mixamorig_RightHandMiddle4"
|
||||||
|
bone_map/RightRingProximal = &"mixamorig_RightHandRing2"
|
||||||
|
bone_map/RightRingIntermediate = &"mixamorig_RightHandRing3"
|
||||||
|
bone_map/RightRingDistal = &"mixamorig_RightHandRing4"
|
||||||
|
bone_map/RightLittleProximal = &"mixamorig_RightHandPinky2"
|
||||||
|
bone_map/RightLittleIntermediate = &"mixamorig_RightHandPinky3"
|
||||||
|
bone_map/RightLittleDistal = &"mixamorig_RightHandPinky4"
|
||||||
|
bone_map/LeftUpperLeg = &"mixamorig_LeftUpLeg"
|
||||||
|
bone_map/LeftLowerLeg = &"mixamorig_LeftLeg"
|
||||||
|
bone_map/LeftFoot = &"mixamorig_LeftFoot"
|
||||||
|
bone_map/LeftToes = &"mixamorig_LeftToeBase"
|
||||||
|
bone_map/RightUpperLeg = &"mixamorig_RightUpLeg"
|
||||||
|
bone_map/RightLowerLeg = &"mixamorig_RightLeg"
|
||||||
|
bone_map/RightFoot = &"mixamorig_RightFoot"
|
||||||
|
bone_map/RightToes = &"mixamorig_RightToeBase"
|
||||||
BIN
Common/animations/YbotPacked.glb
Normal file
BIN
Common/animations/YbotPacked.glb
Normal file
Binary file not shown.
43
Common/animations/YbotPacked.glb.import
Normal file
43
Common/animations/YbotPacked.glb.import
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://cpfj1pxueabmh"
|
||||||
|
path="res://.godot/imported/YbotPacked.glb-130f94c236840a667089df3d8e3daf02.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Common/animations/YbotPacked.glb"
|
||||||
|
dest_files=["res://.godot/imported/YbotPacked.glb-130f94c236840a667089df3d8e3daf02.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={
|
||||||
|
"nodes": {
|
||||||
|
"PATH:Armature/Skeleton3D": {
|
||||||
|
"retarget/bone_map": Resource("res://common/animations/Mixamo BoneMap.tres")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Common/animations/basic-movement.res
Normal file
BIN
Common/animations/basic-movement.res
Normal file
Binary file not shown.
59
Common/shaders/grass.gdshader
Normal file
59
Common/shaders/grass.gdshader
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
shader_type spatial;
|
||||||
|
render_mode cull_disabled, diffuse_toon, specular_schlick_ggx;
|
||||||
|
// Nice Shader by @_Malido ^^
|
||||||
|
|
||||||
|
uniform vec3 top_color: source_color;
|
||||||
|
uniform vec3 bottom_color: source_color;
|
||||||
|
uniform float ambient_occlusion_factor: hint_range(0.0, 1.0, 0.01) = 0.3;
|
||||||
|
uniform float specular_strength: hint_range(0.0, 1.0, 0.01) = 0.4;
|
||||||
|
uniform float player_displacement_strength: hint_range(0.0, 1.0, 0.01) = 0.4;
|
||||||
|
uniform float player_displacement_size: hint_range(0.0, 2.0, 0.01) = 1.0;
|
||||||
|
|
||||||
|
global uniform vec3 wind_direction; // Use a negative y component to give it an extra touch (For displacement effect and noise scroll direction)
|
||||||
|
global uniform float wind_strength;
|
||||||
|
uniform sampler2D wind_noise; // Periln FBM Noise looks Best
|
||||||
|
global uniform float wind_noise_size; // high values dont work well
|
||||||
|
global uniform float wind_noise_speed;
|
||||||
|
|
||||||
|
// Instance the Player Position through a GDScript in the _physics_process
|
||||||
|
global uniform vec3 player_position;
|
||||||
|
|
||||||
|
void vertex() {
|
||||||
|
vec3 world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||||
|
|
||||||
|
vec3 wind_texture = texture(wind_noise, world_position.xz * wind_noise_size + normalize(-wind_direction.xz) * (TIME + UV.y / 2.5) * wind_noise_speed).rgb;
|
||||||
|
vec3 wind_vector = (vec4(wind_texture * normalize(wind_direction) * wind_strength, 0.0) * MODEL_MATRIX).xyz;
|
||||||
|
|
||||||
|
float player_height = smoothstep(1.0, 0.0, length(player_position.y - world_position.y + 0.3));
|
||||||
|
vec3 push_direction = vec3(world_position - player_position) * vec3(1 , -0.3 ,1);
|
||||||
|
float player_position_factor = smoothstep(player_displacement_size, 0.0, length(push_direction));
|
||||||
|
|
||||||
|
vec3 player_push_vector = (vec4(normalize(push_direction), 0.0) * MODEL_MATRIX).xyz;
|
||||||
|
|
||||||
|
// Apply Player Position displacement
|
||||||
|
VERTEX += player_push_vector * (1.0 - UV.y) * player_position_factor * player_displacement_strength * player_height;
|
||||||
|
// Apply Wind displacement linearly
|
||||||
|
VERTEX += wind_vector * (1.0 - UV.y) * (1.0 - player_position_factor * 0.7);
|
||||||
|
|
||||||
|
// A new normal correction, which aligns the normals of the mesh facing upwards no matter the original direction.
|
||||||
|
NORMAL = vec3(0.0, 1.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec3 color = mix(bottom_color, top_color, 1.0 - UV.y);
|
||||||
|
|
||||||
|
// Add fake ambient occlusion by darkening the base of the mesh
|
||||||
|
float ao_fallof = pow(UV.y, 5.0);
|
||||||
|
vec3 ao_color = bottom_color * (1.0 - ambient_occlusion_factor);
|
||||||
|
|
||||||
|
ALBEDO = mix(color, ao_color, ao_fallof);
|
||||||
|
ROUGHNESS = 0.4;
|
||||||
|
|
||||||
|
// Increase the Specular with Grass Height
|
||||||
|
SPECULAR *= (1.0 - UV.y) * specular_strength;
|
||||||
|
|
||||||
|
// Just removing some funny shading
|
||||||
|
if (!FRONT_FACING) {
|
||||||
|
NORMAL = -NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
1
Common/shaders/grass.gdshader.uid
Normal file
1
Common/shaders/grass.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dbduq0qcaxmyi
|
||||||
23
Common/shaders/leaves.gdshader
Normal file
23
Common/shaders/leaves.gdshader
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
shader_type spatial;
|
||||||
|
uniform vec4 base_color : source_color = vec4(0.2, 0.6, 0.1, 1.0);
|
||||||
|
uniform vec4 variation_color : source_color = vec4(0.4, 0.8, 0.2, 1.0);
|
||||||
|
uniform float gradient_height : hint_range(0.1, 5.0) = 2.0;
|
||||||
|
uniform float gradient_offset : hint_range(-2.0, 2.0) = 0.0;
|
||||||
|
|
||||||
|
varying vec3 world_position;
|
||||||
|
|
||||||
|
void vertex() {
|
||||||
|
world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
// Use world Y position instead of UV
|
||||||
|
float gradient_factor = (world_position.y + gradient_offset) / gradient_height;
|
||||||
|
gradient_factor = clamp(gradient_factor, 0.0, 1.0);
|
||||||
|
|
||||||
|
vec3 final_color = mix(base_color.rgb, variation_color.rgb, gradient_factor);
|
||||||
|
|
||||||
|
ALBEDO = final_color;
|
||||||
|
ROUGHNESS = 0.8;
|
||||||
|
METALLIC = 0.0;
|
||||||
|
}
|
||||||
1
Common/shaders/leaves.gdshader.uid
Normal file
1
Common/shaders/leaves.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://d0e60a0hdk02j
|
||||||
13
Common/shaders/outline.gdshader
Normal file
13
Common/shaders/outline.gdshader
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
shader_type spatial;
|
||||||
|
render_mode cull_front, unshaded;
|
||||||
|
|
||||||
|
uniform vec3 color : source_color = vec3(0,0,0);
|
||||||
|
uniform float thickness : hint_range(0.0, 1.0, 0.01) = 0.01;
|
||||||
|
|
||||||
|
void vertex() {
|
||||||
|
VERTEX += thickness*NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
ALBEDO = color;
|
||||||
|
}
|
||||||
1
Common/shaders/outline.gdshader.uid
Normal file
1
Common/shaders/outline.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://c67ldhbce6ro7
|
||||||
90
Common/shaders/pixel_outline.gdshader
Normal file
90
Common/shaders/pixel_outline.gdshader
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
shader_type spatial;
|
||||||
|
render_mode unshaded;
|
||||||
|
|
||||||
|
uniform sampler2D screen_texture : source_color, hint_screen_texture, filter_nearest;
|
||||||
|
uniform sampler2D depth_texture : source_color, hint_depth_texture, filter_nearest;
|
||||||
|
uniform sampler2D normal_texture : source_color, hint_normal_roughness_texture, filter_nearest;
|
||||||
|
|
||||||
|
uniform float depth_threshold : hint_range(0, 1) = 0.05;
|
||||||
|
uniform float reverse_depth_threshold : hint_range(0, 1) = 0.25;
|
||||||
|
uniform float normal_threshold : hint_range(0, 1) = 0.6;
|
||||||
|
|
||||||
|
uniform float darken_amount : hint_range(0, 1, 0.01) = 0.3;
|
||||||
|
uniform float lighten_amount : hint_range(0, 10, 0.01) = 1.5;
|
||||||
|
|
||||||
|
uniform vec3 normal_edge_bias = vec3(1, 1, 1);
|
||||||
|
global uniform vec3 light_direction;
|
||||||
|
|
||||||
|
float get_depth(vec2 screen_uv, mat4 inv_projection_matrix) {
|
||||||
|
float depth = texture(depth_texture, screen_uv).r;
|
||||||
|
vec3 ndc = vec3(screen_uv * 2.0 - 1.0, depth);
|
||||||
|
vec4 view = inv_projection_matrix * vec4(ndc, 1.0);
|
||||||
|
view.xyz /= view.w;
|
||||||
|
return -view.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vertex() {
|
||||||
|
POSITION = vec4(VERTEX.xy, 1.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
float depth = get_depth(SCREEN_UV, INV_PROJECTION_MATRIX);
|
||||||
|
vec3 normal = texture(normal_texture, SCREEN_UV).xyz * 2.0 - 1.0;
|
||||||
|
vec2 texel_size = 1.0 / VIEWPORT_SIZE.xy;
|
||||||
|
|
||||||
|
vec2 uvs[4];
|
||||||
|
uvs[0] = vec2(SCREEN_UV.x, min(1.0 - 0.001, SCREEN_UV.y + texel_size.y));
|
||||||
|
uvs[1] = vec2(SCREEN_UV.x, max(0.0, SCREEN_UV.y - texel_size.y));
|
||||||
|
uvs[2] = vec2(min(1.0 - 0.001, SCREEN_UV.x + texel_size.x), SCREEN_UV.y);
|
||||||
|
uvs[3] = vec2(max(0.0, SCREEN_UV.x - texel_size.x), SCREEN_UV.y);
|
||||||
|
|
||||||
|
float depth_diff = 0.0;
|
||||||
|
float depth_diff_reversed = 0.0;
|
||||||
|
float nearest_depth = depth;
|
||||||
|
vec2 nearest_uv = SCREEN_UV;
|
||||||
|
|
||||||
|
float normal_sum = 0.0;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
float d = get_depth(uvs[i], INV_PROJECTION_MATRIX);
|
||||||
|
depth_diff += depth - d;
|
||||||
|
depth_diff_reversed += d - depth;
|
||||||
|
|
||||||
|
if (d < nearest_depth) {
|
||||||
|
nearest_depth = d;
|
||||||
|
nearest_uv = uvs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 n = texture(normal_texture, uvs[i]).xyz * 2.0 - 1.0;
|
||||||
|
vec3 normal_diff = normal - n;
|
||||||
|
|
||||||
|
// Edge pixels should yield to the normal closest to the bias direction
|
||||||
|
float normal_bias_diff = dot(normal_diff, normal_edge_bias);
|
||||||
|
float normal_indicator = smoothstep(-0.01, 0.01, normal_bias_diff);
|
||||||
|
|
||||||
|
normal_sum += dot(normal_diff, normal_diff) * normal_indicator;
|
||||||
|
}
|
||||||
|
float depth_edge = step(depth_threshold, depth_diff);
|
||||||
|
|
||||||
|
// The reverse depth sum produces depth lines inside of the object, but they don't look as nice as the normal depth_diff
|
||||||
|
// Instead, we can use this value to mask the normal edge along the outside of the object
|
||||||
|
float reverse_depth_edge = step(reverse_depth_threshold, depth_diff_reversed);
|
||||||
|
|
||||||
|
float indicator = sqrt(normal_sum);
|
||||||
|
float normal_edge = step(normal_threshold, indicator - reverse_depth_edge);
|
||||||
|
|
||||||
|
vec3 original = texture(screen_texture, SCREEN_UV).rgb;
|
||||||
|
vec3 nearest = texture(screen_texture, nearest_uv).rgb;
|
||||||
|
|
||||||
|
mat3 view_to_world_normal_mat = mat3(
|
||||||
|
INV_VIEW_MATRIX[0].xyz,
|
||||||
|
INV_VIEW_MATRIX[1].xyz,
|
||||||
|
INV_VIEW_MATRIX[2].xyz
|
||||||
|
);
|
||||||
|
float ld = dot((view_to_world_normal_mat * normal), normalize(light_direction));
|
||||||
|
|
||||||
|
vec3 depth_col = nearest * darken_amount;
|
||||||
|
vec3 normal_col = original * (ld > 0.0 ? darken_amount : lighten_amount);
|
||||||
|
vec3 edge_mix = mix(normal_col, depth_col, depth_edge);
|
||||||
|
|
||||||
|
ALBEDO = mix(original, edge_mix, (depth_edge > 0.0 ? depth_edge : normal_edge));
|
||||||
|
}
|
||||||
1
Common/shaders/pixel_outline.gdshader.uid
Normal file
1
Common/shaders/pixel_outline.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bsemnmdracd4m
|
||||||
156
Config/Globals.gd
Normal file
156
Config/Globals.gd
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
class_name Globals
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
var map_height: int = 200
|
||||||
|
var map_width: int = 200
|
||||||
|
var _map_data: Array
|
||||||
|
var _biome_data: Dictionary = {}
|
||||||
|
var _camp_data: Dictionary = {}
|
||||||
|
var spawn_point: Vector3 = Vector3(0, 0, 0)
|
||||||
|
|
||||||
|
# Property for map_data with logging
|
||||||
|
var map_data: Array:
|
||||||
|
get:
|
||||||
|
return _map_data
|
||||||
|
set(value):
|
||||||
|
_map_data = value
|
||||||
|
Log.pr("Map data updated")
|
||||||
|
|
||||||
|
# Property for biome_data with logging
|
||||||
|
var biome_data: Dictionary:
|
||||||
|
get:
|
||||||
|
return _biome_data
|
||||||
|
set(value):
|
||||||
|
_biome_data = value
|
||||||
|
_log_biome_update()
|
||||||
|
|
||||||
|
func _init() -> void:
|
||||||
|
_map_data.resize(map_height)
|
||||||
|
for y in range(map_height):
|
||||||
|
_map_data[y] = []
|
||||||
|
_map_data[y].resize(map_width)
|
||||||
|
Log.pr("Globals initialized with map size: %d x %d" % [map_width, map_height])
|
||||||
|
|
||||||
|
# Helper methods for updating specific parts of the data
|
||||||
|
func set_map_cell(x: int, y: int, value) -> void:
|
||||||
|
if x >= 0 and x < map_width and y >= 0 and y < map_height:
|
||||||
|
_map_data[y][x] = value
|
||||||
|
Log.pr("Map cell updated at (%d, %d)" % [x, y])
|
||||||
|
|
||||||
|
func update_biome(key: String, value) -> void:
|
||||||
|
_biome_data[key] = value
|
||||||
|
Log.pr("Biome data updated for key: %s" % key)
|
||||||
|
|
||||||
|
# Internal logging function for biome updates
|
||||||
|
func _log_biome_update() -> void:
|
||||||
|
var details = []
|
||||||
|
for key in _biome_data.keys():
|
||||||
|
var value = _biome_data[key]
|
||||||
|
if value is Image:
|
||||||
|
var img = value as Image
|
||||||
|
details.append("%s: Image[%dx%d]" % [key, img.get_width(), img.get_height()])
|
||||||
|
else:
|
||||||
|
details.append("%s: %s" % [key, str(value)])
|
||||||
|
Log.pr("Biome data updated: { %s }" % ", ".join(details))
|
||||||
|
display_all_noise_maps()
|
||||||
|
|
||||||
|
# Display visual representation of noise map
|
||||||
|
func display_noise_map(key: String, scale: int = 4) -> void:
|
||||||
|
if not _biome_data.has(key):
|
||||||
|
Log.pr("No biome data found for key: %s" % key)
|
||||||
|
return
|
||||||
|
|
||||||
|
var img = _biome_data[key]
|
||||||
|
if not img is Image:
|
||||||
|
Log.pr("Data for key '%s' is not an image" % key)
|
||||||
|
return
|
||||||
|
|
||||||
|
var image = img as Image
|
||||||
|
var width = image.get_width()
|
||||||
|
var height = image.get_height()
|
||||||
|
|
||||||
|
# Sample the image at lower resolution for console display
|
||||||
|
var display_width = min(width / scale, 50) # Max 50 chars wide
|
||||||
|
var display_height = min(height / scale, 25) # Max 25 lines tall
|
||||||
|
|
||||||
|
Log.pr("=== %s Noise Map (%dx%d) ===" % [key.capitalize(), width, height])
|
||||||
|
|
||||||
|
for y in range(display_height):
|
||||||
|
var line = ""
|
||||||
|
for x in range(display_width):
|
||||||
|
# Sample from the original image
|
||||||
|
var sample_x = int(x * scale)
|
||||||
|
var sample_y = int(y * scale)
|
||||||
|
|
||||||
|
# Get pixel color (assuming grayscale or we'll use red channel)
|
||||||
|
var pixel = image.get_pixel(sample_x, sample_y)
|
||||||
|
var intensity = pixel.r # Use red channel as intensity
|
||||||
|
|
||||||
|
# Convert intensity to colored circle
|
||||||
|
line += _get_colored_circle(intensity)
|
||||||
|
|
||||||
|
Log.pr(line)
|
||||||
|
|
||||||
|
Log.pr("Scale: 1 character = %dx%d pixels" % [scale, scale])
|
||||||
|
|
||||||
|
# Convert intensity value to colored circle character
|
||||||
|
func _get_colored_circle(intensity: float) -> String:
|
||||||
|
# ANSI color codes for red > yellow > green gradient
|
||||||
|
var color_code: String
|
||||||
|
var circle = "●"
|
||||||
|
|
||||||
|
if intensity < 0.1:
|
||||||
|
color_code = "[color=maroon]" # Dark red
|
||||||
|
elif intensity < 0.2:
|
||||||
|
color_code = "[color=red]" # Red
|
||||||
|
elif intensity < 0.3:
|
||||||
|
color_code = "[color=#FF4500]" # Orange red
|
||||||
|
elif intensity < 0.4:
|
||||||
|
color_code = "[color=orange]" # Orange
|
||||||
|
elif intensity < 0.5:
|
||||||
|
color_code = "[color=#FFD700]" # Gold
|
||||||
|
elif intensity < 0.6:
|
||||||
|
color_code = "[color=yellow]" # Yellow
|
||||||
|
elif intensity < 0.7:
|
||||||
|
color_code = "[color=#ADFF2F]" # Green yellow
|
||||||
|
elif intensity < 0.8:
|
||||||
|
color_code = "[color=lime]" # Lime
|
||||||
|
elif intensity < 0.9:
|
||||||
|
color_code = "[color=green]" # Green
|
||||||
|
else:
|
||||||
|
color_code = "[color=darkgreen]" # Dark green
|
||||||
|
|
||||||
|
return color_code + circle + "[/color]"
|
||||||
|
|
||||||
|
# Display all biome maps
|
||||||
|
func display_all_noise_maps(scale: int = 4) -> void:
|
||||||
|
for key in _biome_data.keys():
|
||||||
|
if _biome_data[key] is Image:
|
||||||
|
display_noise_map(key, scale)
|
||||||
|
Log.pr("") # Empty line between maps
|
||||||
|
|
||||||
|
# Helper function to get detailed biome info
|
||||||
|
func log_biome_details() -> void:
|
||||||
|
Log.pr("=== Biome Data Details ===")
|
||||||
|
for key in _biome_data.keys():
|
||||||
|
var value = _biome_data[key]
|
||||||
|
if value is Image:
|
||||||
|
var img = value as Image
|
||||||
|
Log.pr("%s: Image [%dx%d, Format: %s]" % [key, img.get_width(), img.get_height(), _get_format_name(img.get_format())])
|
||||||
|
else:
|
||||||
|
Log.pr("%s: %s" % [key, str(value)])
|
||||||
|
|
||||||
|
# Helper to convert image format enum to readable string
|
||||||
|
func _get_format_name(format: Image.Format) -> String:
|
||||||
|
match format:
|
||||||
|
Image.FORMAT_L8: return "L8"
|
||||||
|
Image.FORMAT_LA8: return "LA8"
|
||||||
|
Image.FORMAT_R8: return "R8"
|
||||||
|
Image.FORMAT_RG8: return "RG8"
|
||||||
|
Image.FORMAT_RGB8: return "RGB8"
|
||||||
|
Image.FORMAT_RGBA8: return "RGBA8"
|
||||||
|
Image.FORMAT_RF: return "RF"
|
||||||
|
Image.FORMAT_RGF: return "RGF"
|
||||||
|
Image.FORMAT_RGBF: return "RGBF"
|
||||||
|
Image.FORMAT_RGBAF: return "RGBAF"
|
||||||
|
_: return "Unknown (%d)" % format
|
||||||
1
Config/Globals.gd.uid
Normal file
1
Config/Globals.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://durxtdlwqp4pf
|
||||||
BIN
Entities/Bush/assets/bush_large.res
Normal file
BIN
Entities/Bush/assets/bush_large.res
Normal file
Binary file not shown.
BIN
Entities/Bush/assets/bush_small.res
Normal file
BIN
Entities/Bush/assets/bush_small.res
Normal file
Binary file not shown.
BIN
Entities/Bush/assets/plant_bush.glb
Normal file
BIN
Entities/Bush/assets/plant_bush.glb
Normal file
Binary file not shown.
37
Entities/Bush/assets/plant_bush.glb.import
Normal file
37
Entities/Bush/assets/plant_bush.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://c3objh5he4fv7"
|
||||||
|
path="res://.godot/imported/plant_bush.glb-4eaf384fbf61c7e3b82505202bc9874e.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Bush/assets/plant_bush.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant_bush.glb-4eaf384fbf61c7e3b82505202bc9874e.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Bush/assets/plant_bushDetailed.glb
Normal file
BIN
Entities/Bush/assets/plant_bushDetailed.glb
Normal file
Binary file not shown.
48
Entities/Bush/assets/plant_bushDetailed.glb.import
Normal file
48
Entities/Bush/assets/plant_bushDetailed.glb.import
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://cefyfwcx88gn8"
|
||||||
|
path="res://.godot/imported/plant_bushDetailed.glb-8633db2639023d65ffc045b449119f56.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Bush/assets/plant_bushDetailed.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant_bushDetailed.glb-8633db2639023d65ffc045b449119f56.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={
|
||||||
|
"meshes": {
|
||||||
|
"plant_bushDetailed_Mesh plant_bushDetailed": {
|
||||||
|
"generate/lightmap_uv": 0,
|
||||||
|
"generate/lods": 0,
|
||||||
|
"generate/shadow_meshes": 0,
|
||||||
|
"lods/normal_merge_angle": 60.0,
|
||||||
|
"save_to_file/enabled": true,
|
||||||
|
"save_to_file/path": "res://Entities/Bush/assets/bush_large.res"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Bush/assets/plant_bushLarge.glb
Normal file
BIN
Entities/Bush/assets/plant_bushLarge.glb
Normal file
Binary file not shown.
37
Entities/Bush/assets/plant_bushLarge.glb.import
Normal file
37
Entities/Bush/assets/plant_bushLarge.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://bqh742nyfy67t"
|
||||||
|
path="res://.godot/imported/plant_bushLarge.glb-034f46e010fc48537badbba708af03b9.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Bush/assets/plant_bushLarge.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant_bushLarge.glb-034f46e010fc48537badbba708af03b9.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Bush/assets/plant_bushLargeTriangle.glb
Normal file
BIN
Entities/Bush/assets/plant_bushLargeTriangle.glb
Normal file
Binary file not shown.
37
Entities/Bush/assets/plant_bushLargeTriangle.glb.import
Normal file
37
Entities/Bush/assets/plant_bushLargeTriangle.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://xj45kysvl047"
|
||||||
|
path="res://.godot/imported/plant_bushLargeTriangle.glb-4c2a6e5fedd13bffdd9cfb0a212c89c8.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Bush/assets/plant_bushLargeTriangle.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant_bushLargeTriangle.glb-4c2a6e5fedd13bffdd9cfb0a212c89c8.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Bush/assets/plant_bushSmall.glb
Normal file
BIN
Entities/Bush/assets/plant_bushSmall.glb
Normal file
Binary file not shown.
48
Entities/Bush/assets/plant_bushSmall.glb.import
Normal file
48
Entities/Bush/assets/plant_bushSmall.glb.import
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://cjoyr61xdo3hx"
|
||||||
|
path="res://.godot/imported/plant_bushSmall.glb-2218874f9d8b685dac1fd79232f82be8.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Bush/assets/plant_bushSmall.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant_bushSmall.glb-2218874f9d8b685dac1fd79232f82be8.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={
|
||||||
|
"meshes": {
|
||||||
|
"plant_bushSmall_Mesh plant_bushSmall": {
|
||||||
|
"generate/lightmap_uv": 0,
|
||||||
|
"generate/lods": 0,
|
||||||
|
"generate/shadow_meshes": 0,
|
||||||
|
"lods/normal_merge_angle": 60.0,
|
||||||
|
"save_to_file/enabled": true,
|
||||||
|
"save_to_file/path": "res://Entities/Bush/assets/bush_small.res"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Bush/assets/plant_bushTriangle.glb
Normal file
BIN
Entities/Bush/assets/plant_bushTriangle.glb
Normal file
Binary file not shown.
37
Entities/Bush/assets/plant_bushTriangle.glb.import
Normal file
37
Entities/Bush/assets/plant_bushTriangle.glb.import
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://dsch27pqxgud5"
|
||||||
|
path="res://.godot/imported/plant_bushTriangle.glb-518273ba96c29be659e875adddc31676.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Bush/assets/plant_bushTriangle.glb"
|
||||||
|
dest_files=["res://.godot/imported/plant_bushTriangle.glb-518273ba96c29be659e875adddc31676.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Grass/assets/grass.res
Normal file
BIN
Entities/Grass/assets/grass.res
Normal file
Binary file not shown.
BIN
Entities/Grass/assets/grass2_mesh.res
Normal file
BIN
Entities/Grass/assets/grass2_mesh.res
Normal file
Binary file not shown.
16
Entities/GroundTile/GroundTile.gdshader
Normal file
16
Entities/GroundTile/GroundTile.gdshader
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
shader_type spatial;
|
||||||
|
|
||||||
|
uniform sampler2D noise_texture : filter_linear_mipmap;
|
||||||
|
uniform sampler2D gradient_texture : filter_linear;
|
||||||
|
uniform float noise_scale : hint_range(0.1, 10.0) = 1.0;
|
||||||
|
uniform float roughness_value : hint_range(0.0, 1.0) = 0.8;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec2 noise_uv = UV * noise_scale;
|
||||||
|
float noise_val = texture(noise_texture, noise_uv).r;
|
||||||
|
|
||||||
|
vec4 earth_color = texture(gradient_texture, vec2(noise_val, 0.0));
|
||||||
|
|
||||||
|
ALBEDO = earth_color.rgb;
|
||||||
|
ROUGHNESS = roughness_value;
|
||||||
|
}
|
||||||
1
Entities/GroundTile/GroundTile.gdshader.uid
Normal file
1
Entities/GroundTile/GroundTile.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://cuew4u0k6md1v
|
||||||
101
Entities/GroundTile/GroundTile.tscn
Normal file
101
Entities/GroundTile/GroundTile.tscn
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
[gd_scene load_steps=16 format=3 uid="uid://bwcevwwphdvq"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bq7hia2dit80y" path="res://Entities/GroundTile/scripts/ground_tile.gd" id="1_uwxqs"]
|
||||||
|
[ext_resource type="Script" uid="uid://cacp8ncwuofuj" path="res://Entities/GroundTile/scripts/grass.gd" id="3_224hx"]
|
||||||
|
[ext_resource type="Material" uid="uid://b1miqvl8lus75" path="res://Stages/Test3D/GrassMaterialOverride.tres" id="3_f37ob"]
|
||||||
|
[ext_resource type="Script" uid="uid://btju6b83mvgvk" path="res://Entities/GroundTile/scripts/grass_multimesh.gd" id="4_3wpcb"]
|
||||||
|
[ext_resource type="Script" uid="uid://bt67yhdkwtqy5" path="res://Entities/GroundTile/scripts/bushes.gd" id="6_224hx"]
|
||||||
|
[ext_resource type="Script" uid="uid://cqko4m7cbxsfb" path="res://Entities/GroundTile/scripts/trees.gd" id="7_7lc7k"]
|
||||||
|
[ext_resource type="Script" uid="uid://dri5tubavplji" path="res://Entities/GroundTile/scripts/bush_multimesh.gd" id="7_jysav"]
|
||||||
|
[ext_resource type="Script" uid="uid://d3s0u7rm1y7i6" path="res://Entities/GroundTile/scripts/flower_multimesh.gd" id="8_jysav"]
|
||||||
|
[ext_resource type="Script" uid="uid://18vxtm3ua4x0" path="res://Entities/GroundTile/scripts/flowers.gd" id="8_q0r4p"]
|
||||||
|
|
||||||
|
[sub_resource type="ViewportTexture" id="ViewportTexture_h4g11"]
|
||||||
|
viewport_path = NodePath("DebugText/DebugTextViewport")
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f37ob"]
|
||||||
|
albedo_color = Color(0.196078, 0.392157, 0.196078, 1)
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_oqd8f"]
|
||||||
|
|
||||||
|
[sub_resource type="BoxShape3D" id="BoxShape3D_h4g11"]
|
||||||
|
size = Vector3(2, 2, 2)
|
||||||
|
|
||||||
|
[sub_resource type="MultiMesh" id="MultiMesh_3wpcb"]
|
||||||
|
transform_format = 1
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_f37ob"]
|
||||||
|
flip_faces = true
|
||||||
|
|
||||||
|
[node name="GroundTile" type="Node3D"]
|
||||||
|
script = ExtResource("1_uwxqs")
|
||||||
|
|
||||||
|
[node name="DebugText" type="Node3D" parent="."]
|
||||||
|
visible = false
|
||||||
|
|
||||||
|
[node name="DebugTextViewport" type="SubViewport" parent="DebugText"]
|
||||||
|
size = Vector2i(50, 50)
|
||||||
|
|
||||||
|
[node name="DebugTextLabel" type="Label" parent="DebugText/DebugTextViewport"]
|
||||||
|
offset_right = 40.0
|
||||||
|
offset_bottom = 23.0
|
||||||
|
text = "Hello world"
|
||||||
|
|
||||||
|
[node name="DebugTextBillboard" type="Sprite3D" parent="DebugText"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0461426, 0.199493, 0.0660986)
|
||||||
|
texture = SubResource("ViewportTexture_h4g11")
|
||||||
|
|
||||||
|
[node name="Ground" type="MeshInstance3D" parent="."]
|
||||||
|
material_override = SubResource("StandardMaterial3D_f37ob")
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_oqd8f")
|
||||||
|
|
||||||
|
[node name="GroundCollision" type="StaticBody3D" parent="Ground"]
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground/GroundCollision"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||||
|
shape = SubResource("BoxShape3D_h4g11")
|
||||||
|
|
||||||
|
[node name="Grass" type="Node3D" parent="."]
|
||||||
|
script = ExtResource("3_224hx")
|
||||||
|
|
||||||
|
[node name="GrassMultimesh" type="MultiMeshInstance3D" parent="Grass"]
|
||||||
|
material_override = ExtResource("3_f37ob")
|
||||||
|
cast_shadow = 0
|
||||||
|
multimesh = SubResource("MultiMesh_3wpcb")
|
||||||
|
script = ExtResource("4_3wpcb")
|
||||||
|
|
||||||
|
[node name="GrassTarget" type="MeshInstance3D" parent="Grass"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0111763, 0)
|
||||||
|
mesh = SubResource("PlaneMesh_f37ob")
|
||||||
|
|
||||||
|
[node name="Bushes" type="Node3D" parent="."]
|
||||||
|
script = ExtResource("6_224hx")
|
||||||
|
|
||||||
|
[node name="BushMultimesh" type="MultiMeshInstance3D" parent="Bushes"]
|
||||||
|
cast_shadow = 0
|
||||||
|
multimesh = SubResource("MultiMesh_3wpcb")
|
||||||
|
script = ExtResource("7_jysav")
|
||||||
|
|
||||||
|
[node name="BushTarget" type="MeshInstance3D" parent="Bushes"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0111763, 0)
|
||||||
|
mesh = SubResource("PlaneMesh_f37ob")
|
||||||
|
|
||||||
|
[node name="Flowers" type="Node3D" parent="."]
|
||||||
|
script = ExtResource("8_q0r4p")
|
||||||
|
|
||||||
|
[node name="FlowerMultimesh" type="MultiMeshInstance3D" parent="Flowers"]
|
||||||
|
cast_shadow = 0
|
||||||
|
multimesh = SubResource("MultiMesh_3wpcb")
|
||||||
|
script = ExtResource("8_jysav")
|
||||||
|
|
||||||
|
[node name="FloewerTarget" type="MeshInstance3D" parent="Flowers"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0111763, 0)
|
||||||
|
mesh = SubResource("PlaneMesh_f37ob")
|
||||||
|
|
||||||
|
[node name="Trees" type="Node3D" parent="."]
|
||||||
|
script = ExtResource("7_7lc7k")
|
||||||
|
|
||||||
|
[node name="Special" type="Node3D" parent="."]
|
||||||
|
|
||||||
|
[node name="Rocks" type="Node3D" parent="Special"]
|
||||||
BIN
Entities/GroundTile/assets/Dirt_05-256x256.png
(Stored with Git LFS)
Normal file
BIN
Entities/GroundTile/assets/Dirt_05-256x256.png
(Stored with Git LFS)
Normal file
Binary file not shown.
35
Entities/GroundTile/assets/Dirt_05-256x256.png.import
Normal file
35
Entities/GroundTile/assets/Dirt_05-256x256.png.import
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://b8pca7c2vlwaa"
|
||||||
|
path.s3tc="res://.godot/imported/Dirt_05-256x256.png-df3829dddfb4eeab82c63b0845e8a300.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/GroundTile/assets/Dirt_05-256x256.png"
|
||||||
|
dest_files=["res://.godot/imported/Dirt_05-256x256.png-df3829dddfb4eeab82c63b0845e8a300.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
56
Entities/GroundTile/scripts/bush_multimesh.gd
Normal file
56
Entities/GroundTile/scripts/bush_multimesh.gd
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
extends MultiMeshInstance3D
|
||||||
|
var mm: MultiMesh
|
||||||
|
var parent_node: BushController
|
||||||
|
static var bush_mesh: Mesh = null
|
||||||
|
var material: ShaderMaterial
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
parent_node = get_parent() as BushController
|
||||||
|
if parent_node == null:
|
||||||
|
Log.pr("Error: Parent node is not a BushController!")
|
||||||
|
|
||||||
|
# Load mesh once and reuse
|
||||||
|
if bush_mesh == null:
|
||||||
|
bush_mesh = load("res://Entities/Bush/assets/bush_large.res")
|
||||||
|
|
||||||
|
func setup_multimesh() -> void:
|
||||||
|
if parent_node == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
if bush_mesh == null:
|
||||||
|
Log.pr("Error: Could not load bush mesh")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Reuse existing MultiMesh if possible, or create new one
|
||||||
|
if mm == null:
|
||||||
|
mm = MultiMesh.new()
|
||||||
|
mm.transform_format = MultiMesh.TRANSFORM_3D
|
||||||
|
mm.mesh = bush_mesh
|
||||||
|
|
||||||
|
material = ColorData.get_random_bush_material(Season.current)
|
||||||
|
mm.mesh.surface_set_material(0, material)
|
||||||
|
|
||||||
|
# Configure instance count
|
||||||
|
mm.instance_count = parent_node.bush_instance_range
|
||||||
|
|
||||||
|
# Get shared RNG from GroundTile
|
||||||
|
var rng = parent_node.parent_node.get_rng()
|
||||||
|
|
||||||
|
# Generate positions using shared RNG
|
||||||
|
for i in range(mm.instance_count):
|
||||||
|
var random_pos = Vector3(
|
||||||
|
rng.randf_range(-1.0, 1.0),
|
||||||
|
0.0,
|
||||||
|
rng.randf_range(-1.0, 1.0)
|
||||||
|
)
|
||||||
|
|
||||||
|
var random_rotation = rng.randf_range(0.0, TAU)
|
||||||
|
var basis = Basis(Vector3.UP, random_rotation)
|
||||||
|
|
||||||
|
var random_scale = rng.randf_range(0.3, 0.9)
|
||||||
|
basis = basis.scaled(Vector3(random_scale, random_scale, random_scale))
|
||||||
|
|
||||||
|
var tx = Transform3D(basis, random_pos)
|
||||||
|
mm.set_instance_transform(i, tx)
|
||||||
|
|
||||||
|
multimesh = mm
|
||||||
1
Entities/GroundTile/scripts/bush_multimesh.gd.uid
Normal file
1
Entities/GroundTile/scripts/bush_multimesh.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dri5tubavplji
|
||||||
36
Entities/GroundTile/scripts/bushes.gd
Normal file
36
Entities/GroundTile/scripts/bushes.gd
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# GrassController.gd
|
||||||
|
extends Node3D
|
||||||
|
class_name BushController
|
||||||
|
|
||||||
|
@onready var bush_multimesh: MultiMeshInstance3D = $BushMultimesh
|
||||||
|
var parent_node: GroundTile = null
|
||||||
|
var bush_density: float = 0.5
|
||||||
|
var bush_instance_range: int = 10
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
parent_node = get_parent() as GroundTile
|
||||||
|
|
||||||
|
func spawn_bushes_for_cell(value):
|
||||||
|
if value == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
bush_density = value.vegetation_density
|
||||||
|
update_bush_density()
|
||||||
|
|
||||||
|
if bush_multimesh and bush_multimesh.has_method("setup_multimesh"):
|
||||||
|
bush_multimesh.setup_multimesh()
|
||||||
|
|
||||||
|
func update_bush_density() -> void:
|
||||||
|
if parent_node == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
var rng = parent_node.get_rng()
|
||||||
|
|
||||||
|
if bush_density > 0.8:
|
||||||
|
bush_instance_range = rng.randi_range(5, 10)
|
||||||
|
elif bush_density > 0.6:
|
||||||
|
bush_instance_range = rng.randi_range(2, 7)
|
||||||
|
elif bush_density > 0.3:
|
||||||
|
bush_instance_range = rng.randi_range(0, 1)
|
||||||
|
else:
|
||||||
|
bush_instance_range = rng.randi_range(0, 0)
|
||||||
1
Entities/GroundTile/scripts/bushes.gd.uid
Normal file
1
Entities/GroundTile/scripts/bushes.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bt67yhdkwtqy5
|
||||||
59
Entities/GroundTile/scripts/flower_multimesh.gd
Normal file
59
Entities/GroundTile/scripts/flower_multimesh.gd
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
extends MultiMeshInstance3D
|
||||||
|
|
||||||
|
var mm: MultiMesh
|
||||||
|
var parent_node: FlowerController
|
||||||
|
static var flower_mesh: Mesh = null
|
||||||
|
var material: StandardMaterial3D
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
parent_node = get_parent() as FlowerController
|
||||||
|
if parent_node == null:
|
||||||
|
Log.pr("Error: Parent node is not a FlowerController!")
|
||||||
|
|
||||||
|
# Load mesh once and reuse
|
||||||
|
if flower_mesh == null:
|
||||||
|
flower_mesh = load("res://Entities/Plant/assets/flower_tall.res")
|
||||||
|
|
||||||
|
func setup_multimesh() -> void:
|
||||||
|
if parent_node == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
if flower_mesh == null:
|
||||||
|
Log.pr("Error: Could not load flower mesh")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Reuse existing MultiMesh if possible, or create new one
|
||||||
|
if mm == null:
|
||||||
|
mm = MultiMesh.new()
|
||||||
|
mm.transform_format = MultiMesh.TRANSFORM_3D
|
||||||
|
mm.mesh = flower_mesh
|
||||||
|
|
||||||
|
var flower_material = ColorData.flower_materials[Season.current]["flower"]
|
||||||
|
var stem_material = ColorData.flower_materials[Season.current]["stem"]
|
||||||
|
mm.mesh.surface_set_material(0, stem_material)
|
||||||
|
mm.mesh.surface_set_material(1, flower_material)
|
||||||
|
|
||||||
|
# Configure instance count
|
||||||
|
mm.instance_count = parent_node.flower_instance_range
|
||||||
|
|
||||||
|
# Get shared RNG from GroundTile
|
||||||
|
var rng = parent_node.parent_node.get_rng()
|
||||||
|
|
||||||
|
# Generate positions using shared RNG
|
||||||
|
for i in range(mm.instance_count):
|
||||||
|
var random_pos = Vector3(
|
||||||
|
rng.randf_range(-1.0, 1.0),
|
||||||
|
0.0,
|
||||||
|
rng.randf_range(-1.0, 1.0)
|
||||||
|
)
|
||||||
|
|
||||||
|
var random_rotation = rng.randf_range(0.0, TAU)
|
||||||
|
var basis = Basis(Vector3.UP, random_rotation)
|
||||||
|
|
||||||
|
var random_scale = rng.randf_range(0.2, 0.4)
|
||||||
|
basis = basis.scaled(Vector3(random_scale, random_scale, random_scale))
|
||||||
|
|
||||||
|
var tx = Transform3D(basis, random_pos)
|
||||||
|
mm.set_instance_transform(i, tx)
|
||||||
|
|
||||||
|
multimesh = mm
|
||||||
1
Entities/GroundTile/scripts/flower_multimesh.gd.uid
Normal file
1
Entities/GroundTile/scripts/flower_multimesh.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://d3s0u7rm1y7i6
|
||||||
36
Entities/GroundTile/scripts/flowers.gd
Normal file
36
Entities/GroundTile/scripts/flowers.gd
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# GrassController.gd
|
||||||
|
extends Node3D
|
||||||
|
class_name FlowerController
|
||||||
|
|
||||||
|
@onready var flower_multimesh: MultiMeshInstance3D = $FlowerMultimesh
|
||||||
|
var parent_node: GroundTile = null
|
||||||
|
var flower_density: float = 0.5
|
||||||
|
var flower_instance_range: int = 10
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
parent_node = get_parent() as GroundTile
|
||||||
|
|
||||||
|
func spawn_flowers_for_cell(value):
|
||||||
|
if value == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
flower_density = value.vegetation_density
|
||||||
|
update_flower_density()
|
||||||
|
|
||||||
|
if flower_multimesh and flower_multimesh.has_method("setup_multimesh"):
|
||||||
|
flower_multimesh.setup_multimesh()
|
||||||
|
|
||||||
|
func update_flower_density() -> void:
|
||||||
|
if parent_node == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
var rng = parent_node.get_rng()
|
||||||
|
|
||||||
|
if flower_density > 0.8:
|
||||||
|
flower_instance_range = rng.randi_range(1, 3)
|
||||||
|
elif flower_density > 0.6:
|
||||||
|
flower_instance_range = rng.randi_range(3, 4)
|
||||||
|
elif flower_density > 0.3:
|
||||||
|
flower_instance_range = rng.randi_range(4, 7)
|
||||||
|
else:
|
||||||
|
flower_instance_range = rng.randi_range(5, 10)
|
||||||
1
Entities/GroundTile/scripts/flowers.gd.uid
Normal file
1
Entities/GroundTile/scripts/flowers.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://18vxtm3ua4x0
|
||||||
36
Entities/GroundTile/scripts/grass.gd
Normal file
36
Entities/GroundTile/scripts/grass.gd
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# GrassController.gd
|
||||||
|
extends Node3D
|
||||||
|
class_name GrassController
|
||||||
|
|
||||||
|
@onready var grass_multimesh: MultiMeshInstance3D = $GrassMultimesh
|
||||||
|
var parent_node: GroundTile = null
|
||||||
|
var grass_density: float = 0.5
|
||||||
|
var grass_instance_range: int = 10
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
parent_node = get_parent() as GroundTile
|
||||||
|
|
||||||
|
func spawn_grass_for_cell(value):
|
||||||
|
if value == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
grass_density = value.vegetation_density
|
||||||
|
update_grass_density()
|
||||||
|
|
||||||
|
if grass_multimesh and grass_multimesh.has_method("setup_multimesh"):
|
||||||
|
grass_multimesh.setup_multimesh()
|
||||||
|
|
||||||
|
func update_grass_density() -> void:
|
||||||
|
if parent_node == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
var rng = parent_node.get_rng()
|
||||||
|
|
||||||
|
if grass_density > 0.8:
|
||||||
|
grass_instance_range = rng.randi_range(100, 500)
|
||||||
|
elif grass_density > 0.6:
|
||||||
|
grass_instance_range = rng.randi_range(30, 50)
|
||||||
|
elif grass_density > 0.3:
|
||||||
|
grass_instance_range = rng.randi_range(5, 20)
|
||||||
|
else:
|
||||||
|
grass_instance_range = rng.randi_range(0, 1)
|
||||||
1
Entities/GroundTile/scripts/grass.gd.uid
Normal file
1
Entities/GroundTile/scripts/grass.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://cacp8ncwuofuj
|
||||||
70
Entities/GroundTile/scripts/grass_multimesh.gd
Normal file
70
Entities/GroundTile/scripts/grass_multimesh.gd
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
extends MultiMeshInstance3D
|
||||||
|
var mm: MultiMesh
|
||||||
|
var parent_node: GrassController
|
||||||
|
static var grass_mesh: Mesh = null
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
parent_node = get_parent() as GrassController
|
||||||
|
if parent_node == null:
|
||||||
|
Log.pr("Error: Parent node is not a GrassController!")
|
||||||
|
|
||||||
|
# Load mesh once and reuse
|
||||||
|
if grass_mesh == null:
|
||||||
|
grass_mesh = load("res://Entities/Grass/assets/grass2_mesh.res")
|
||||||
|
|
||||||
|
func setup_multimesh() -> void:
|
||||||
|
if parent_node == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
if grass_mesh == null:
|
||||||
|
Log.pr("Error: Could not load grass mesh")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Reuse existing MultiMesh if possible, or create new one
|
||||||
|
if mm == null:
|
||||||
|
mm = MultiMesh.new()
|
||||||
|
mm.transform_format = MultiMesh.TRANSFORM_3D
|
||||||
|
mm.mesh = grass_mesh
|
||||||
|
update_shader_parameter('top_color', ColorData.grass_materials[Season.current]['top'])
|
||||||
|
update_shader_parameter('bottom_color', ColorData.grass_materials[Season.current]['base'])
|
||||||
|
|
||||||
|
# Configure instance count
|
||||||
|
mm.instance_count = parent_node.grass_instance_range
|
||||||
|
|
||||||
|
# Get shared RNG from GroundTile
|
||||||
|
var rng = parent_node.parent_node.get_rng()
|
||||||
|
|
||||||
|
# Generate positions using shared RNG
|
||||||
|
for i in range(mm.instance_count):
|
||||||
|
var random_pos = Vector3(
|
||||||
|
rng.randf_range(-1.0, 1.0),
|
||||||
|
0.0,
|
||||||
|
rng.randf_range(-1.0, 1.0)
|
||||||
|
)
|
||||||
|
|
||||||
|
var random_rotation = rng.randf_range(0.0, TAU)
|
||||||
|
var basis = Basis(Vector3.UP, random_rotation)
|
||||||
|
|
||||||
|
var random_scale = rng.randf_range(0.05, 0.3)
|
||||||
|
basis = basis.scaled(Vector3(random_scale, random_scale, random_scale))
|
||||||
|
|
||||||
|
var tx = Transform3D(basis, random_pos)
|
||||||
|
mm.set_instance_transform(i, tx)
|
||||||
|
|
||||||
|
multimesh = mm
|
||||||
|
cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF
|
||||||
|
|
||||||
|
|
||||||
|
func update_shader_parameter(param_name: String, value) -> void:
|
||||||
|
if material_override == null:
|
||||||
|
Log.pr("Error: No material override found")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check if it's a ShaderMaterial
|
||||||
|
if material_override is ShaderMaterial:
|
||||||
|
var shader_material = material_override as ShaderMaterial
|
||||||
|
shader_material.set_shader_parameter(param_name, value)
|
||||||
|
else:
|
||||||
|
Log.pr("Error: Material override is not a ShaderMaterial")
|
||||||
|
|
||||||
|
return
|
||||||
1
Entities/GroundTile/scripts/grass_multimesh.gd.uid
Normal file
1
Entities/GroundTile/scripts/grass_multimesh.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://btju6b83mvgvk
|
||||||
59
Entities/GroundTile/scripts/ground_tile.gd
Normal file
59
Entities/GroundTile/scripts/ground_tile.gd
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
class_name GroundTile
|
||||||
|
extends Node3D
|
||||||
|
@onready var debug_text: Label = $DebugText/DebugTextViewport/DebugTextLabel
|
||||||
|
@onready var tree_spawner = $Trees
|
||||||
|
@onready var grass_spawner = $Grass
|
||||||
|
@onready var bush_spawner = $Bushes
|
||||||
|
@onready var flower_spawner = $Flowers
|
||||||
|
@onready var ground = $Ground
|
||||||
|
var grid_x: int
|
||||||
|
var grid_z: int
|
||||||
|
var cell_info: CellDataResource = null
|
||||||
|
var spawners_ready: bool = false
|
||||||
|
var cached_rng: RandomClass = null
|
||||||
|
|
||||||
|
# 326432 229379
|
||||||
|
# Grass - 1a7761 1f6051
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
spawners_ready = true
|
||||||
|
|
||||||
|
if cell_info != null:
|
||||||
|
spawn_content()
|
||||||
|
update_text_label()
|
||||||
|
|
||||||
|
ground.material_override.albedo_color = ColorData.grass_materials[Season.current]['base']
|
||||||
|
|
||||||
|
func get_rng() -> RandomClass:
|
||||||
|
if cached_rng == null and cell_info:
|
||||||
|
cached_rng = RandomClass.get_seeded_instance(cell_info.cell_seed)
|
||||||
|
elif cached_rng == null:
|
||||||
|
cached_rng = RandomClass.get_shared_instance()
|
||||||
|
|
||||||
|
return cached_rng
|
||||||
|
|
||||||
|
func set_grid_location(x, z) -> void:
|
||||||
|
grid_x = x
|
||||||
|
grid_z = z
|
||||||
|
cell_info = MapData.get_map_data(grid_x, grid_z)
|
||||||
|
|
||||||
|
# Only spawn if spawners are ready
|
||||||
|
if spawners_ready and cell_info != null:
|
||||||
|
spawn_content()
|
||||||
|
|
||||||
|
func spawn_content():
|
||||||
|
if cell_info == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
if tree_spawner and cell_info.should_spawn_trees():
|
||||||
|
tree_spawner.spawn_trees_for_cell(cell_info)
|
||||||
|
if grass_spawner and cell_info.should_spawn_grass():
|
||||||
|
grass_spawner.spawn_grass_for_cell(cell_info)
|
||||||
|
if bush_spawner and cell_info.should_spawn_bushes():
|
||||||
|
bush_spawner.spawn_bushes_for_cell(cell_info)
|
||||||
|
if flower_spawner and cell_info.should_spawn_flowers():
|
||||||
|
flower_spawner.spawn_flowers_for_cell(cell_info)
|
||||||
|
|
||||||
|
|
||||||
|
func update_text_label() -> void:
|
||||||
|
debug_text.text = str(cell_info.vegetation_density)
|
||||||
1
Entities/GroundTile/scripts/ground_tile.gd.uid
Normal file
1
Entities/GroundTile/scripts/ground_tile.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bq7hia2dit80y
|
||||||
75
Entities/GroundTile/scripts/trees.gd
Normal file
75
Entities/GroundTile/scripts/trees.gd
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
extends Node3D
|
||||||
|
|
||||||
|
@export var spawn_area_size: Vector2 = Vector2(2.0, 2.0)
|
||||||
|
@export var min_distance: float = 0.5
|
||||||
|
|
||||||
|
var spawned_positions: Array[Vector3] = []
|
||||||
|
var parent_ground_tile: GroundTile
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
parent_ground_tile = get_parent() as GroundTile
|
||||||
|
|
||||||
|
func spawn_trees_for_cell(cell_info: CellDataResource):
|
||||||
|
if not cell_info:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not parent_ground_tile:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Clear existing trees WITHOUT queue_free()
|
||||||
|
for child in get_children():
|
||||||
|
child.free() # Immediate cleanup instead of queue_free()
|
||||||
|
spawned_positions.clear()
|
||||||
|
|
||||||
|
# Spawn each tree in the array
|
||||||
|
var spawned_count = 0
|
||||||
|
var attempts = 0
|
||||||
|
var max_attempts = cell_info.trees.size() * 10
|
||||||
|
|
||||||
|
for tree_resource in cell_info.trees:
|
||||||
|
if attempts >= max_attempts:
|
||||||
|
Log.pr("Reached max attempts, could only spawn %d of %d trees" % [spawned_count, cell_info.trees.size()])
|
||||||
|
break
|
||||||
|
|
||||||
|
var pos = get_random_position()
|
||||||
|
|
||||||
|
if is_position_valid(pos):
|
||||||
|
spawn_tree_at_position(pos, tree_resource as TreeDataResource)
|
||||||
|
spawned_positions.append(pos)
|
||||||
|
spawned_count += 1
|
||||||
|
|
||||||
|
attempts += 1
|
||||||
|
|
||||||
|
#Log.pr("Spawned %d of %d trees in cell" % [spawned_count, cell_info.trees.size()])
|
||||||
|
|
||||||
|
func get_random_position() -> Vector3:
|
||||||
|
var rng = parent_ground_tile.get_rng()
|
||||||
|
var x = rng.randf_range(-spawn_area_size.x / 2, spawn_area_size.x / 2)
|
||||||
|
var z = rng.randf_range(-spawn_area_size.y / 2, spawn_area_size.y / 2)
|
||||||
|
return Vector3(x, 0, z)
|
||||||
|
|
||||||
|
func spawn_tree_at_position(pos: Vector3, tree_resource: TreeDataResource):
|
||||||
|
if not tree_resource:
|
||||||
|
Log.pr("No tree resource provided")
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
var tree_scene = preload("res://Entities/Tree/Tree.tscn")
|
||||||
|
var tree_instance = tree_scene.instantiate()
|
||||||
|
add_child(tree_instance)
|
||||||
|
tree_instance.position = pos
|
||||||
|
|
||||||
|
var rng = parent_ground_tile.get_rng()
|
||||||
|
tree_instance.rotation.y = rng.randf() * TAU
|
||||||
|
|
||||||
|
# Pass the TreeDataResource to the Tree instance
|
||||||
|
if tree_instance.has_method("set_tree_data"):
|
||||||
|
tree_instance.set_tree_data(tree_resource)
|
||||||
|
else:
|
||||||
|
Log.pr("Tree instance doesn't have set_tree_data() method")
|
||||||
|
|
||||||
|
func is_position_valid(pos: Vector3) -> bool:
|
||||||
|
for existing_pos in spawned_positions:
|
||||||
|
if pos.distance_to(existing_pos) < min_distance:
|
||||||
|
return false
|
||||||
|
return true
|
||||||
1
Entities/GroundTile/scripts/trees.gd.uid
Normal file
1
Entities/GroundTile/scripts/trees.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://cqko4m7cbxsfb
|
||||||
BIN
Entities/Plant/assets/flower.res
Normal file
BIN
Entities/Plant/assets/flower.res
Normal file
Binary file not shown.
BIN
Entities/Plant/assets/flower_tall.glb
Normal file
BIN
Entities/Plant/assets/flower_tall.glb
Normal file
Binary file not shown.
48
Entities/Plant/assets/flower_tall.glb.import
Normal file
48
Entities/Plant/assets/flower_tall.glb.import
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://c8kl0a1nstbuc"
|
||||||
|
path="res://.godot/imported/flower_tall.glb-105aa1c03f7501793bbf8ad0e150a0ed.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Plant/assets/flower_tall.glb"
|
||||||
|
dest_files=["res://.godot/imported/flower_tall.glb-105aa1c03f7501793bbf8ad0e150a0ed.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={
|
||||||
|
"meshes": {
|
||||||
|
"flower_tall_Mesh flower_purpleB": {
|
||||||
|
"generate/lightmap_uv": 0,
|
||||||
|
"generate/lods": 0,
|
||||||
|
"generate/shadow_meshes": 0,
|
||||||
|
"lods/normal_merge_angle": 60.0,
|
||||||
|
"save_to_file/enabled": true,
|
||||||
|
"save_to_file/path": "res://Entities/Plant/assets/flower.res"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
BIN
Entities/Plant/assets/flower_tall.res
Normal file
BIN
Entities/Plant/assets/flower_tall.res
Normal file
Binary file not shown.
591
Entities/Player/Player.tscn
Normal file
591
Entities/Player/Player.tscn
Normal file
File diff suppressed because one or more lines are too long
BIN
Entities/Player/assets/PlayerCharacter.glb
Normal file
BIN
Entities/Player/assets/PlayerCharacter.glb
Normal file
Binary file not shown.
53
Entities/Player/assets/PlayerCharacter.glb.import
Normal file
53
Entities/Player/assets/PlayerCharacter.glb.import
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://b8eo2wxpmpsn3"
|
||||||
|
path="res://.godot/imported/PlayerCharacter.glb-4183cc8dd55ffc9d207c3c8910d89126.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Player/assets/PlayerCharacter.glb"
|
||||||
|
dest_files=["res://.godot/imported/PlayerCharacter.glb-4183cc8dd55ffc9d207c3c8910d89126.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={
|
||||||
|
"meshes": {
|
||||||
|
"PlayerCharacter_mergedBlocksmesh": {
|
||||||
|
"generate/lightmap_uv": 0,
|
||||||
|
"generate/lods": 0,
|
||||||
|
"generate/shadow_meshes": 0,
|
||||||
|
"lods/normal_merge_angle": 60.0,
|
||||||
|
"save_to_file/enabled": true,
|
||||||
|
"save_to_file/path": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nodes": {
|
||||||
|
"PATH:Armature/Skeleton3D": {
|
||||||
|
"retarget/bone_map": Resource("res://common/animations/Mixamo BoneMap.tres")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gltf/naming_version=1
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
53
Entities/Player/scripts/player.gd
Normal file
53
Entities/Player/scripts/player.gd
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
extends CharacterBody3D
|
||||||
|
|
||||||
|
@export var speed = 2
|
||||||
|
@export var fall_acceleration = 75
|
||||||
|
|
||||||
|
var target_velocity = Vector3.ZERO
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
position = Global.spawn_point
|
||||||
|
%Camp.position = Global.spawn_point
|
||||||
|
|
||||||
|
func _physics_process(delta):
|
||||||
|
RenderingServer.global_shader_parameter_set("player_position", position)
|
||||||
|
|
||||||
|
%TileGround.update_chunks(position)
|
||||||
|
|
||||||
|
# We create a local variable to store the input direction.
|
||||||
|
var direction = Vector3.ZERO
|
||||||
|
|
||||||
|
# We check for each move input and update the direction accordingly.
|
||||||
|
if Input.is_action_pressed("move_right"):
|
||||||
|
direction.x += 1
|
||||||
|
if Input.is_action_pressed("move_left"):
|
||||||
|
direction.x -= 1
|
||||||
|
if Input.is_action_pressed("move_back"):
|
||||||
|
# Notice how we are working with the vector's x and z axes.
|
||||||
|
# In 3D, the XZ plane is the ground plane.
|
||||||
|
direction.z += 1
|
||||||
|
if Input.is_action_pressed("move_forward"):
|
||||||
|
direction.z -= 1
|
||||||
|
|
||||||
|
if direction != Vector3.ZERO:
|
||||||
|
direction = direction.normalized()
|
||||||
|
# Setting the basis property will affect the rotation of the node.
|
||||||
|
$Pivot.basis = Basis.looking_at(-direction)
|
||||||
|
|
||||||
|
# Ground Velocity
|
||||||
|
target_velocity.x = direction.x * speed
|
||||||
|
target_velocity.z = direction.z * speed
|
||||||
|
|
||||||
|
# Vertical Velocity
|
||||||
|
if not is_on_floor(): # If in the air, fall towards the floor. Literally gravity
|
||||||
|
target_velocity.y = target_velocity.y - (fall_acceleration * delta)
|
||||||
|
|
||||||
|
# Moving the Character
|
||||||
|
velocity = target_velocity
|
||||||
|
|
||||||
|
if direction != Vector3.ZERO:
|
||||||
|
%PlayerAnimationPlayer.play('basic-movement/walk')
|
||||||
|
else:
|
||||||
|
%PlayerAnimationPlayer.play('basic-movement/idle')
|
||||||
|
|
||||||
|
move_and_slide()
|
||||||
1
Entities/Player/scripts/player.gd.uid
Normal file
1
Entities/Player/scripts/player.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bwed2dwogfmxv
|
||||||
38
Entities/Tree/Tree.tscn
Normal file
38
Entities/Tree/Tree.tscn
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
[gd_scene load_steps=5 format=3 uid="uid://c27fogucecn0r"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://lcedx3lau6v5" path="res://Entities/Tree/scripts/tree.gd" id="1_702jv"]
|
||||||
|
|
||||||
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s6kdm"]
|
||||||
|
radius = 0.2
|
||||||
|
height = 0.5
|
||||||
|
|
||||||
|
[sub_resource type="SphereShape3D" id="SphereShape3D_702jv"]
|
||||||
|
|
||||||
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_702jv"]
|
||||||
|
radius = 0.6
|
||||||
|
height = 2.5
|
||||||
|
|
||||||
|
[node name="Tree" type="Node3D"]
|
||||||
|
script = ExtResource("1_702jv")
|
||||||
|
|
||||||
|
[node name="TreeCollision" type="StaticBody3D" parent="." groups=["tree"]]
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="TreeCollision"]
|
||||||
|
shape = SubResource("CapsuleShape3D_s6kdm")
|
||||||
|
|
||||||
|
[node name="InteractRange" type="Area3D" parent="."]
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractRange"]
|
||||||
|
shape = SubResource("SphereShape3D_702jv")
|
||||||
|
|
||||||
|
[node name="VisibilityArea" type="StaticBody3D" parent="." groups=["tree_visibility"]]
|
||||||
|
collision_layer = 2
|
||||||
|
collision_mask = 2
|
||||||
|
|
||||||
|
[node name="VisibilityShape" type="CollisionShape3D" parent="VisibilityArea"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.616604, 0)
|
||||||
|
shape = SubResource("CapsuleShape3D_702jv")
|
||||||
|
debug_color = Color(0.837648, 0.364145, 0.346694, 0.42)
|
||||||
|
|
||||||
|
[node name="LastBlocked" type="Timer" parent="."]
|
||||||
|
wait_time = 0.5
|
||||||
BIN
Entities/Tree/assets/Textures/colormap.png
(Stored with Git LFS)
Normal file
BIN
Entities/Tree/assets/Textures/colormap.png
(Stored with Git LFS)
Normal file
Binary file not shown.
35
Entities/Tree/assets/Textures/colormap.png.import
Normal file
35
Entities/Tree/assets/Textures/colormap.png.import
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://v50x7hoiyguq"
|
||||||
|
path.s3tc="res://.godot/imported/colormap.png-540ab81ce65a030f551beee068cf0950.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Tree/assets/Textures/colormap.png"
|
||||||
|
dest_files=["res://.godot/imported/colormap.png-540ab81ce65a030f551beee068cf0950.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://m2m6dc4so845"
|
||||||
|
path.s3tc="res://.godot/imported/colormap.png-6d658b554c420448394e4d9ad962a5e1.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://stages/test3d/assets/Textures/colormap.png"
|
||||||
|
dest_files=["res://.godot/imported/colormap.png-6d658b554c420448394e4d9ad962a5e1.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
BIN
Entities/Tree/assets/Textures/texture.png
(Stored with Git LFS)
Normal file
BIN
Entities/Tree/assets/Textures/texture.png
(Stored with Git LFS)
Normal file
Binary file not shown.
35
Entities/Tree/assets/Textures/texture.png.import
Normal file
35
Entities/Tree/assets/Textures/texture.png.import
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dhajcn6k04poe"
|
||||||
|
path.s3tc="res://.godot/imported/texture.png-27d352bfc378434578d288ba141a0d45.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Entities/Tree/assets/Textures/texture.png"
|
||||||
|
dest_files=["res://.godot/imported/texture.png-27d352bfc378434578d288ba141a0d45.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
BIN
Entities/Tree/assets/stump_squareDetailedWide.glb
Normal file
BIN
Entities/Tree/assets/stump_squareDetailedWide.glb
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue