Compare commits

...

10 commits

Author SHA1 Message Date
4182eea3ac Add DungeonGate asset, Blender MCP config und Claude settings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 15:14:53 +02:00
08c506a3a8 World: Medieval Town + Fantasy Door Gate, alte Platzhalter entfernt
- medieval_town.glb als Stadt-Asset eingefügt (4% Skalierung)
- fantasy_door_model.glb ersetzt das alte CSG-DungeonGate
- Boden-Shader entfernt (Stadt hat eigenen Boden)
- Unsichtbarer Kollisionsboden (2500x2500) hinzugefügt
- WorldEnvironment mit Sky, Fog, SSAO, Glow aus Szene statt Code
- Alte CSG-Objekte entfernt (Mountain, Rocks, Trees)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 13:06:26 +01:00
d77dc6d3da Audio: Finale SFX hinzugefügt, alte MusicGen-Tests entfernt
Neue Sounds (48kHz, getrimmt):
- auto_attack_002_48000hz.wav
- heavy_strike_003_48000hz.wav

Alte unbenannte MusicGen-Testdateien entfernt.
Intro7.mp3 bleibt als Menü-Musik.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 20:55:23 +01:00
f7c4922784 Menü-Musik spielt bis Spielstart weiter
Musik-Player wird beim Klick auf Spielen an den World-Node
übergeben statt gestoppt. Erst bei Klassenauswahl wird die
Musik beendet. So läuft die Intro-Musik auch während der
Charakterauswahl.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 20:40:54 +01:00
8743133c43 AudioManager: Auto-Refresh nach jeder Generierung
Dateiliste wird jetzt per API (/audiocraft/list) geladen
statt über Node-Execution. Aktualisiert sich automatisch
nach jeder Generierung. Refresh-Button für manuelles Update.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 20:26:34 +01:00
b90b816063 AudioGen: Auto-Trim Stille für besseres Looping
Neue Option 'trim_silence' (Ja/Nein) im AudioGen Node.
Schneidet automatisch Stille am Anfang und Ende ab
(Threshold -40dB, 10ms Padding). Default: Ja.
Besseres Loop-Verhalten da keine Pause mehr am Anfang.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 19:52:45 +01:00
8768edc16c AudioManager: Einzelne Dateien löschen per X-Button
API-Endpoint /audiocraft/delete im Backend. Löscht die Datei
und die zugehörige upsampled Version. Gelöschte Zeilen werden
ausgegraut. Stoppt Wiedergabe falls die Datei gerade spielt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 19:46:50 +01:00
5481a1e92f AudioManager: Loop-Toggle und globaler Audio-Stop
Loop AN/AUS Button in der Header-Leiste. Wenn Loop aktiv,
wird der angeklickte Sound endlos wiederholt (zum Testen
ob z.B. Wirbelwind sauber loopt). Nur ein Sound spielt
gleichzeitig - neuer Klick stoppt den vorherigen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 19:43:14 +01:00
5766fdb757 Fix: AudioManager zeigt jetzt alle Dateien an
Node vergrößert sich dynamisch je nach Dateianzahl.
Download-Button pro Datei hinzugefügt. Play-Button
wird rot beim Abspielen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 19:42:08 +01:00
5b326e2de6 Name-Feld mit fortlaufender Nummer für alle Audio-Nodes
Alle Generierungs-Nodes (MusicGen, MusicGenLong, AudioGen)
haben jetzt ein 'name' Feld. Dateien werden als
name_001.wav, name_002.wav, etc. gespeichert statt mit
Timestamp. z.B. heavy_strike_001.wav

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 18:08:29 +01:00
83 changed files with 4418 additions and 492 deletions

25
.claude/settings.json Normal file
View file

@ -0,0 +1,25 @@
{
"permissions": {
"allow": [
"Bash(where python3:*)",
"Bash(where py:*)",
"Bash(ls /c/Python*/python.exe)",
"Read(//c/Users/sandr/AppData/Local/Programs/**)",
"Bash(where node:*)",
"Bash(where npm:*)",
"Read(//c/Program Files/nodejs/**)",
"Read(//c/Users/sandr/AppData/Roaming/**)",
"Bash(\"/c/Program Files/nodejs/node.exe\" -v)",
"Bash(cmd.exe /c \"where node\")",
"Bash(powershell.exe -Command \"Get-Command node -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source\")",
"Bash(powershell.exe -Command \"Get-Command python -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source\")",
"Bash(powershell.exe -Command \"Get-ChildItem -Path ''C:\\\\Program Files'',''C:\\\\Program Files \\(x86\\)'',''C:\\\\Users\\\\sandr\\\\AppData\\\\Local\\\\Programs'' -Filter ''python.exe'' -Recurse -ErrorAction SilentlyContinue | Select-Object -First 5 -ExpandProperty FullName\")",
"Bash(command -v uvx)",
"Bash(command -v uv)",
"Bash(where uvx:*)",
"Bash(where uv:*)",
"Bash(cmd.exe /c \"where uvx\")",
"Read(//c/Users/sandr/.claude/**)"
]
}
}

9
.mcp.json Normal file
View file

@ -0,0 +1,9 @@
{
"mcpServers": {
"blender-mcp": {
"type": "stdio",
"command": "uvx",
"args": ["blender-mcp"]
}
}
}

BIN
assets/DungeonGate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

View file

@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b426p2ebu8ob1"
path="res://.godot/imported/fantasy_door_model.glb-6e9f76bbd64a39e4fb1fd7612ebc085e.scn"
[deps]
source_file="res://assets/environment/fantasy_door_model.glb"
dest_files=["res://.godot/imported/fantasy_door_model.glb-6e9f76bbd64a39e4fb1fd7612ebc085e.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cok5b7b8m1noa"
path.s3tc="res://.godot/imported/fantasy_door_model_0.png-cef538c44ba18837ba7eed8fbdd3f02c.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "bdecde9ffec112bcbc9dcfaf30854281"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_0.png"
dest_files=["res://.godot/imported/fantasy_door_model_0.png-cef538c44ba18837ba7eed8fbdd3f02c.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://gb8fpallr0c7"
path.s3tc="res://.godot/imported/fantasy_door_model_1.png-ad975a9caa75a201144bdb5d0d4a2c15.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "e73569426b731840227df92e20fd21f9"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_1.png"
dest_files=["res://.godot/imported/fantasy_door_model_1.png-ad975a9caa75a201144bdb5d0d4a2c15.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/environment/fantasy_door_model_1.png"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dwgtky6bqlwlp"
path.s3tc="res://.godot/imported/fantasy_door_model_10.png-140135e471df0cd6eeaaa1d8e1a5fae9.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "fe811ce55c3fa0ee6a0de43b5907826d"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_10.png"
dest_files=["res://.godot/imported/fantasy_door_model_10.png-140135e471df0cd6eeaaa1d8e1a5fae9.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bmpvmm6y8qvae"
path.s3tc="res://.godot/imported/fantasy_door_model_11.png-d7ebdc8b0c79e9ca7ccad48f21c53024.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "5f1bf4e41bd5be017da585383fba31af"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_11.png"
dest_files=["res://.godot/imported/fantasy_door_model_11.png-d7ebdc8b0c79e9ca7ccad48f21c53024.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/environment/fantasy_door_model_11.png"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://vuk267guct4h"
path.s3tc="res://.godot/imported/fantasy_door_model_2.png-9629efc552b580bc0571e0cf1bc363d4.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "bcd0358549bc66c883d55bd4d1c52f00"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_2.png"
dest_files=["res://.godot/imported/fantasy_door_model_2.png-9629efc552b580bc0571e0cf1bc363d4.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c3rsfo3xwentp"
path.s3tc="res://.godot/imported/fantasy_door_model_3.png-6584fb7a2475576700d102422a503bf9.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "f282f5dcd09b28e10078ebf9d5557c2d"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_3.png"
dest_files=["res://.godot/imported/fantasy_door_model_3.png-6584fb7a2475576700d102422a503bf9.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/environment/fantasy_door_model_3.png"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dkj4akbhv103u"
path.s3tc="res://.godot/imported/fantasy_door_model_4.png-3ec4359eaee1a91078a5aa8c97d53b73.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "d21ff5eeae0097a85537b2ff8e5e5d80"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_4.png"
dest_files=["res://.godot/imported/fantasy_door_model_4.png-3ec4359eaee1a91078a5aa8c97d53b73.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bl1assxu60pru"
path.s3tc="res://.godot/imported/fantasy_door_model_5.png-b3b471161dff554f0845b10a1d1bc40b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "63cd1c2a9266944bcfac9e405f5e115d"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_5.png"
dest_files=["res://.godot/imported/fantasy_door_model_5.png-b3b471161dff554f0845b10a1d1bc40b.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/environment/fantasy_door_model_5.png"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c2cq453f1bjtr"
path.s3tc="res://.godot/imported/fantasy_door_model_6.png-d0a7e6f5bd4cb0aadb10aa66bff88f78.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "03d98ca85389b7c1eb3801d98dee7d32"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_6.png"
dest_files=["res://.godot/imported/fantasy_door_model_6.png-d0a7e6f5bd4cb0aadb10aa66bff88f78.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cm3reln1f3eyn"
path.s3tc="res://.godot/imported/fantasy_door_model_7.png-302b0f18508c47876a52774bc8b62539.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "83d799cbcb585594f5c2cb0370b42774"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_7.png"
dest_files=["res://.godot/imported/fantasy_door_model_7.png-302b0f18508c47876a52774bc8b62539.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/environment/fantasy_door_model_7.png"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bd6lp41v0hlq3"
path.s3tc="res://.godot/imported/fantasy_door_model_8.png-4958758ac22f3c64f4d78ae8cb3f6aee.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "6d1c2d42b370249e2e276a1e6f729343"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_8.png"
dest_files=["res://.godot/imported/fantasy_door_model_8.png-4958758ac22f3c64f4d78ae8cb3f6aee.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ndr13p67gq51"
path.s3tc="res://.godot/imported/fantasy_door_model_9.png-977eb7209c4b501fdd40e6eb5c6defdb.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "82246b7c0e3d2d8efb428c024f0fd82c"
}
[deps]
source_file="res://assets/environment/fantasy_door_model_9.png"
dest_files=["res://.godot/imported/fantasy_door_model_9.png-977eb7209c4b501fdd40e6eb5c6defdb.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/environment/fantasy_door_model_9.png"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View file

@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dawbdtnyiha0m"
path="res://.godot/imported/medieval_town.glb-d3c74ef868325655c5dbd5fa52c233be.scn"
[deps]
source_file="res://assets/environment/medieval_town.glb"
dest_files=["res://.godot/imported/medieval_town.glb-d3c74ef868325655c5dbd5fa52c233be.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chp1anuoioygy"
path.s3tc="res://.godot/imported/medieval_town_0.jpg-795400c6555dd8e1984679def748e2fd.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "dffc9f8f45a8bb0f52800a8bcb0da1da"
}
[deps]
source_file="res://assets/environment/medieval_town_0.jpg"
dest_files=["res://.godot/imported/medieval_town_0.jpg-795400c6555dd8e1984679def748e2fd.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chhi53re2i6pe"
path.s3tc="res://.godot/imported/medieval_town_1.jpg-01e7610777bcac0ecd34e9e3c0a15ca6.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "e67a38cd94d22088fbee0da62dd1b03f"
}
[deps]
source_file="res://assets/environment/medieval_town_1.jpg"
dest_files=["res://.godot/imported/medieval_town_1.jpg-01e7610777bcac0ecd34e9e3c0a15ca6.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cwov4o7co6m05"
path.s3tc="res://.godot/imported/medieval_town_10.jpg-8033940c2011052d780b53def34d11bb.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "a8e5eb4e7298f2c09b15023d30ce394a"
}
[deps]
source_file="res://assets/environment/medieval_town_10.jpg"
dest_files=["res://.godot/imported/medieval_town_10.jpg-8033940c2011052d780b53def34d11bb.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dloouolk6sa87"
path.s3tc="res://.godot/imported/medieval_town_11.jpg-4f0b4d7169e3b1a3c27c5b1bb1d7e56e.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "83b18a710fea843fffbfa8bf4fcb6bf2"
}
[deps]
source_file="res://assets/environment/medieval_town_11.jpg"
dest_files=["res://.godot/imported/medieval_town_11.jpg-4f0b4d7169e3b1a3c27c5b1bb1d7e56e.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cs1dppk2kdjjb"
path.s3tc="res://.godot/imported/medieval_town_12.jpg-a260d4fa7762d283afb93f7a4f45aa88.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "cf395b056542753e4a73b49ed61583dc"
}
[deps]
source_file="res://assets/environment/medieval_town_12.jpg"
dest_files=["res://.godot/imported/medieval_town_12.jpg-a260d4fa7762d283afb93f7a4f45aa88.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cuglyr8ug8g3v"
path.s3tc="res://.godot/imported/medieval_town_13.png-56977327eae0a35eb90b53d61d727e5e.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "6bbf0349f160418571a3926369585bc1"
}
[deps]
source_file="res://assets/environment/medieval_town_13.png"
dest_files=["res://.godot/imported/medieval_town_13.png-56977327eae0a35eb90b53d61d727e5e.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ddg7av2alxqbr"
path.s3tc="res://.godot/imported/medieval_town_14.jpg-22995a216164135b69cd566f5a8196a1.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "91dc26628925eef209fa915819dae934"
}
[deps]
source_file="res://assets/environment/medieval_town_14.jpg"
dest_files=["res://.godot/imported/medieval_town_14.jpg-22995a216164135b69cd566f5a8196a1.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b871b0hqkmqvm"
path.s3tc="res://.godot/imported/medieval_town_15.jpg-d68f0e1296aa68022de7cd2d1d623d99.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "549944b6881184ab299981eee02a819b"
}
[deps]
source_file="res://assets/environment/medieval_town_15.jpg"
dest_files=["res://.godot/imported/medieval_town_15.jpg-d68f0e1296aa68022de7cd2d1d623d99.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://drkby4stgjyes"
path.s3tc="res://.godot/imported/medieval_town_16.jpg-4917b597f49865c5f20410cd96922dc5.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "9eddb07e6e0d0aa879fa9d6bdf532744"
}
[deps]
source_file="res://assets/environment/medieval_town_16.jpg"
dest_files=["res://.godot/imported/medieval_town_16.jpg-4917b597f49865c5f20410cd96922dc5.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bab3g6clcf071"
path.s3tc="res://.godot/imported/medieval_town_2.jpg-533fa51b684c9a31f7543cbc0ff4c27f.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "e67a38cd94d22088fbee0da62dd1b03f"
}
[deps]
source_file="res://assets/environment/medieval_town_2.jpg"
dest_files=["res://.godot/imported/medieval_town_2.jpg-533fa51b684c9a31f7543cbc0ff4c27f.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0gdoefu362q6"
path.s3tc="res://.godot/imported/medieval_town_3.jpg-a80b5bf183c45bf0565abd1f9c176f53.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "df27e921252215c91a5fea6eb92157ed"
}
[deps]
source_file="res://assets/environment/medieval_town_3.jpg"
dest_files=["res://.godot/imported/medieval_town_3.jpg-a80b5bf183c45bf0565abd1f9c176f53.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bnmy0r5h8h6c0"
path.s3tc="res://.godot/imported/medieval_town_4.jpg-6634ca8e2a1b14b3c6d791e8ab76cc22.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "cd180ff03a059bda507276946133b2cb"
}
[deps]
source_file="res://assets/environment/medieval_town_4.jpg"
dest_files=["res://.godot/imported/medieval_town_4.jpg-6634ca8e2a1b14b3c6d791e8ab76cc22.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://drrg0bi2ann05"
path.s3tc="res://.godot/imported/medieval_town_5.jpg-84119507ada1339a98a7f72bf53c4fd5.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "c5d00703de61f5ed6821bb582da5ef8c"
}
[deps]
source_file="res://assets/environment/medieval_town_5.jpg"
dest_files=["res://.godot/imported/medieval_town_5.jpg-84119507ada1339a98a7f72bf53c4fd5.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://s777oib7nwbd"
path.s3tc="res://.godot/imported/medieval_town_6.jpg-747e57e080740cd299ca7be5c1de681e.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "b6dfcb1d08ca5b50d0ffb38f3b28c947"
}
[deps]
source_file="res://assets/environment/medieval_town_6.jpg"
dest_files=["res://.godot/imported/medieval_town_6.jpg-747e57e080740cd299ca7be5c1de681e.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dkbyemxdwvv1o"
path.s3tc="res://.godot/imported/medieval_town_7.jpg-d5ecaa3b78d78ae669c4d4eea44e783a.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "977753c4a37f673350bc99898dffa635"
}
[deps]
source_file="res://assets/environment/medieval_town_7.jpg"
dest_files=["res://.godot/imported/medieval_town_7.jpg-d5ecaa3b78d78ae669c4d4eea44e783a.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clcdtfy8hagnn"
path.s3tc="res://.godot/imported/medieval_town_8.jpg-dab5542dadb03a63dce742cba77c66da.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "6f679f9c7e316f2c3c24d10a9129f805"
}
[deps]
source_file="res://assets/environment/medieval_town_8.jpg"
dest_files=["res://.godot/imported/medieval_town_8.jpg-dab5542dadb03a63dce742cba77c66da.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d0uh0odep1wde"
path.s3tc="res://.godot/imported/medieval_town_9.jpg-76b513737f93e9d4137bfd410ede6645.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "6f679f9c7e316f2c3c24d10a9129f805"
}
[deps]
source_file="res://assets/environment/medieval_town_9.jpg"
dest_files=["res://.godot/imported/medieval_town_9.jpg-76b513737f93e9d4137bfd410ede6645.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dvre4c83afg5w"
path="res://.godot/imported/auto_attack_002_48000hz.wav-ec4500651841ce207533ed5225efbbbe.sample"
[deps]
source_file="res://assets/sounds/auto_attack_002_48000hz.wav"
dest_files=["res://.godot/imported/auto_attack_002_48000hz.wav-ec4500651841ce207533ed5225efbbbe.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c4mnesvupqhhe"
path="res://.godot/imported/heavy_strike_003_48000hz.wav-33b848f7c4eab400b2691d3ba63aaa83.sample"
[deps]
source_file="res://assets/sounds/heavy_strike_003_48000hz.wav"
dest_files=["res://.godot/imported/heavy_strike_003_48000hz.wav-33b848f7c4eab400b2691d3ba63aaa83.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View file

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bsexsl3nv1kxr"
path="res://.godot/imported/musicgen_1774098786.wav-bfb26ce071082853446c7d95b3369f0a.sample"
[deps]
source_file="res://assets/sounds/musicgen_1774098786.wav"
dest_files=["res://.godot/imported/musicgen_1774098786.wav-bfb26ce071082853446c7d95b3369f0a.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View file

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cqke0ox8h83l5"
path="res://.godot/imported/musicgen_1774099814_48000hz.wav-7c1b1b2d197eb35a731b7c5b9e96c952.sample"
[deps]
source_file="res://assets/sounds/musicgen_1774099814_48000hz.wav"
dest_files=["res://.godot/imported/musicgen_1774099814_48000hz.wav-7c1b1b2d197eb35a731b7c5b9e96c952.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View file

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://d3c172wut4k4o"
path="res://.godot/imported/musicgen_1774101118_48000hz.wav-af0e145277d62a99afaaf71342a8d895.sample"
[deps]
source_file="res://assets/sounds/musicgen_1774101118_48000hz.wav"
dest_files=["res://.godot/imported/musicgen_1774101118_48000hz.wav-af0e145277d62a99afaaf71342a8d895.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

2650
blender-mcp.py Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,51 @@
from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
import os
from aiohttp import web
import server
WEB_DIRECTORY = "./web" WEB_DIRECTORY = "./web"
# API-Endpoint zum Löschen einzelner Audio-Dateien
@server.PromptServer.instance.routes.post("/audiocraft/delete")
async def delete_audio_file(request):
data = await request.json()
filename = data.get("filename", "")
if not filename or ".." in filename or "/" in filename or "\\" in filename:
return web.json_response({"error": "Ungueltiger Dateiname"}, status=400)
audio_dir = "/app/ComfyUI/output/audio"
filepath = os.path.join(audio_dir, filename)
if not os.path.exists(filepath):
return web.json_response({"error": "Datei nicht gefunden"}, status=404)
os.remove(filepath)
# Auch die zugehörige upsampled Version löschen falls vorhanden
base = filename.replace(".wav", "")
for f in os.listdir(audio_dir):
if f.startswith(base) and f != filename and f.endswith(".wav"):
os.remove(os.path.join(audio_dir, f))
return web.json_response({"ok": True, "deleted": filename})
# API-Endpoint zum Auflisten aller Audio-Dateien
@server.PromptServer.instance.routes.get("/audiocraft/list")
async def list_audio_files(request):
audio_dir = "/app/ComfyUI/output/audio"
if not os.path.exists(audio_dir):
return web.json_response({"files": [], "summary": "Kein Audio-Ordner"})
files = []
total_size = 0
for f in sorted(os.listdir(audio_dir)):
if f.endswith(".wav"):
fpath = os.path.join(audio_dir, f)
size = os.path.getsize(fpath)
total_size += size
files.append({"name": f, "size_mb": round(size / 1024 / 1024, 2)})
summary = f"{len(files)} Dateien | {total_size / 1024 / 1024:.1f} MB"
return web.json_response({"files": files, "summary": summary})
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] __all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]

View file

@ -2,6 +2,8 @@ import torch
import torchaudio import torchaudio
import os import os
import time import time
import glob as globmod
import re
class MusicGenNode: class MusicGenNode:
@ -10,6 +12,7 @@ class MusicGenNode:
return { return {
"required": { "required": {
"prompt": ("STRING", {"multiline": True, "default": "dark dungeon ambience, slow, mysterious"}), "prompt": ("STRING", {"multiline": True, "default": "dark dungeon ambience, slow, mysterious"}),
"name": ("STRING", {"default": "music"}),
"duration": ("FLOAT", {"default": 10.0, "min": 1.0, "max": 120.0, "step": 1.0}), "duration": ("FLOAT", {"default": 10.0, "min": 1.0, "max": 120.0, "step": 1.0}),
"model": (["facebook/musicgen-stereo-medium", "facebook/musicgen-stereo-large", "facebook/musicgen-medium", "facebook/musicgen-large", "facebook/musicgen-small"],), "model": (["facebook/musicgen-stereo-medium", "facebook/musicgen-stereo-large", "facebook/musicgen-medium", "facebook/musicgen-large", "facebook/musicgen-small"],),
"seed": ("INT", {"default": 0, "min": 0, "max": 2**32 - 1}), "seed": ("INT", {"default": 0, "min": 0, "max": 2**32 - 1}),
@ -26,7 +29,7 @@ class MusicGenNode:
CATEGORY = "AudioCraft" CATEGORY = "AudioCraft"
OUTPUT_NODE = True OUTPUT_NODE = True
def generate(self, prompt, duration, model, seed, temperature, cfg_coef, top_k, extend_stride): def generate(self, prompt, name, duration, model, seed, temperature, cfg_coef, top_k, extend_stride):
from audiocraft.models import MusicGen from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write from audiocraft.data.audio import audio_write
@ -49,9 +52,12 @@ class MusicGenNode:
output_dir = "/app/ComfyUI/output/audio" output_dir = "/app/ComfyUI/output/audio"
os.makedirs(output_dir, exist_ok=True) os.makedirs(output_dir, exist_ok=True)
filename = f"musicgen_{int(time.time())}" base_name = re.sub(r'[^\w\-]', '_', name.strip().lower())
num = _next_number(output_dir, base_name)
filename = f"{base_name}_{num:03d}"
out_path = os.path.join(output_dir, filename) out_path = os.path.join(output_dir, filename)
audio_write(out_path, wav[0].cpu(), mg.sample_rate, strategy="loudness") audio_write(out_path, wav[0].cpu(), mg.sample_rate, strategy="loudness")
print(f"[MusicGen] Saved: {filename}.wav")
return (out_path + ".wav",) return (out_path + ".wav",)
@ -63,6 +69,7 @@ class MusicGenLongNode:
return { return {
"required": { "required": {
"prompt": ("STRING", {"multiline": True, "default": "dark fantasy orchestral music, deep cello, french horn, slow war drums, mysterious ambient"}), "prompt": ("STRING", {"multiline": True, "default": "dark fantasy orchestral music, deep cello, french horn, slow war drums, mysterious ambient"}),
"name": ("STRING", {"default": "music_long"}),
"total_duration": ("FLOAT", {"default": 90.0, "min": 10.0, "max": 300.0, "step": 5.0}), "total_duration": ("FLOAT", {"default": 90.0, "min": 10.0, "max": 300.0, "step": 5.0}),
"segment_duration": ("FLOAT", {"default": 30.0, "min": 10.0, "max": 30.0, "step": 5.0}), "segment_duration": ("FLOAT", {"default": 30.0, "min": 10.0, "max": 30.0, "step": 5.0}),
"context_seconds": ("FLOAT", {"default": 5.0, "min": 1.0, "max": 10.0, "step": 0.5}), "context_seconds": ("FLOAT", {"default": 5.0, "min": 1.0, "max": 10.0, "step": 0.5}),
@ -80,7 +87,7 @@ class MusicGenLongNode:
CATEGORY = "AudioCraft" CATEGORY = "AudioCraft"
OUTPUT_NODE = True OUTPUT_NODE = True
def generate_long(self, prompt, total_duration, segment_duration, context_seconds, model, seed, temperature, cfg_coef, top_k): def generate_long(self, prompt, name, total_duration, segment_duration, context_seconds, model, seed, temperature, cfg_coef, top_k):
from audiocraft.models import MusicGen from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write from audiocraft.data.audio import audio_write
@ -128,24 +135,56 @@ class MusicGenLongNode:
output_dir = "/app/ComfyUI/output/audio" output_dir = "/app/ComfyUI/output/audio"
os.makedirs(output_dir, exist_ok=True) os.makedirs(output_dir, exist_ok=True)
filename = f"musicgen_long_{int(time.time())}" base_name = re.sub(r'[^\w\-]', '_', name.strip().lower())
num = _next_number(output_dir, base_name)
filename = f"{base_name}_{num:03d}"
out_path = os.path.join(output_dir, filename) out_path = os.path.join(output_dir, filename)
audio_write(out_path, result, sample_rate, strategy="loudness") audio_write(out_path, result, sample_rate, strategy="loudness")
print(f"[MusicGenLong] Fertig: {out_path}.wav ({result.shape[1]/sample_rate:.1f}s)") print(f"[MusicGenLong] Fertig: {filename}.wav ({result.shape[1]/sample_rate:.1f}s)")
return (out_path + ".wav",) return (out_path + ".wav",)
def _trim_silence(wav, sample_rate, threshold_db=-40.0, pad_ms=10):
"""Schneidet Stille am Anfang und Ende ab"""
threshold = 10 ** (threshold_db / 20.0)
# Mono oder Stereo: max über alle Kanäle
amplitude = wav.abs().max(dim=0).values
above = (amplitude > threshold).nonzero(as_tuple=True)[0]
if len(above) == 0:
return wav
start = max(0, above[0].item() - int(pad_ms * sample_rate / 1000))
end = min(wav.shape[1], above[-1].item() + int(pad_ms * sample_rate / 1000))
trimmed = wav[:, start:end]
if trimmed.shape[1] != wav.shape[1]:
print(f"[Trim] {wav.shape[1]/sample_rate:.2f}s → {trimmed.shape[1]/sample_rate:.2f}s (Stille entfernt)")
return trimmed
def _next_number(output_dir, base_name):
"""Findet die nächste fortlaufende Nummer für einen Dateinamen"""
pattern = os.path.join(output_dir, f"{base_name}_*.wav")
existing = globmod.glob(pattern)
max_num = 0
for f in existing:
match = re.search(rf"{re.escape(base_name)}_(\d+)", os.path.basename(f))
if match:
max_num = max(max_num, int(match.group(1)))
return max_num + 1
class AudioGenNode: class AudioGenNode:
@classmethod @classmethod
def INPUT_TYPES(cls): def INPUT_TYPES(cls):
return { return {
"required": { "required": {
"prompt": ("STRING", {"multiline": True, "default": "sword clash metal sound effect"}), "prompt": ("STRING", {"multiline": True, "default": "sword clash metal sound effect"}),
"name": ("STRING", {"default": "sfx"}),
"duration": ("FLOAT", {"default": 3.0, "min": 0.5, "max": 30.0, "step": 0.5}), "duration": ("FLOAT", {"default": 3.0, "min": 0.5, "max": 30.0, "step": 0.5}),
"seed": ("INT", {"default": 0, "min": 0, "max": 2**32 - 1}), "seed": ("INT", {"default": 0, "min": 0, "max": 2**32 - 1}),
"temperature": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 2.0, "step": 0.05}), "temperature": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 2.0, "step": 0.05}),
"cfg_coef": ("FLOAT", {"default": 3.0, "min": 0.5, "max": 10.0, "step": 0.5}), "cfg_coef": ("FLOAT", {"default": 3.0, "min": 0.5, "max": 10.0, "step": 0.5}),
"top_k": ("INT", {"default": 250, "min": 1, "max": 1000}), "top_k": ("INT", {"default": 250, "min": 1, "max": 1000}),
"trim_silence": (["Ja", "Nein"], {"default": "Ja"}),
} }
} }
@ -155,7 +194,7 @@ class AudioGenNode:
CATEGORY = "AudioCraft" CATEGORY = "AudioCraft"
OUTPUT_NODE = True OUTPUT_NODE = True
def generate(self, prompt, duration, seed, temperature, cfg_coef, top_k): def generate(self, prompt, name, duration, seed, temperature, cfg_coef, top_k, trim_silence):
from audiocraft.models import AudioGen from audiocraft.models import AudioGen
from audiocraft.data.audio import audio_write from audiocraft.data.audio import audio_write
@ -173,12 +212,19 @@ class AudioGenNode:
print(f"[AudioGen] Generating: {prompt}") print(f"[AudioGen] Generating: {prompt}")
wav = ag.generate([prompt]) wav = ag.generate([prompt])
result = wav[0].cpu()
if trim_silence == "Ja":
result = _trim_silence(result, ag.sample_rate)
output_dir = "/app/ComfyUI/output/audio" output_dir = "/app/ComfyUI/output/audio"
os.makedirs(output_dir, exist_ok=True) os.makedirs(output_dir, exist_ok=True)
filename = f"audiogen_{int(time.time())}" base_name = re.sub(r'[^\w\-]', '_', name.strip().lower())
num = _next_number(output_dir, base_name)
filename = f"{base_name}_{num:03d}"
out_path = os.path.join(output_dir, filename) out_path = os.path.join(output_dir, filename)
audio_write(out_path, wav[0].cpu(), ag.sample_rate, strategy="loudness") audio_write(out_path, result, ag.sample_rate, strategy="loudness")
print(f"[AudioGen] Saved: {filename}.wav ({result.shape[1]/ag.sample_rate:.2f}s)")
return (out_path + ".wav",) return (out_path + ".wav",)

View file

@ -1,95 +1,208 @@
import { app } from "../../../scripts/app.js"; import { app } from "../../../scripts/app.js";
import { api } from "../../../scripts/api.js"; import { api } from "../../../scripts/api.js";
let loopEnabled = false;
let activeAudio = null;
let activeBtn = null;
function stopActive() {
if (activeAudio) {
activeAudio.pause();
activeAudio = null;
}
if (activeBtn) {
activeBtn.textContent = "\u25B6";
activeBtn.style.color = "#8f8";
activeBtn = null;
}
}
async function refreshFileList(node) {
try {
const resp = await api.fetchApi("/audiocraft/list");
const data = await resp.json();
const container = node._managerContainer;
container.innerHTML = "";
buildContent(container, data.summary, data.files);
const listHeight = Math.min(40 + data.files.length * 26, 800);
node._managerWidget.computeSize = () => [node.size[0], listHeight];
node.setSize([Math.max(node.size[0], 500), listHeight + 80]);
app.graph.setDirtyCanvas(true);
} catch (e) {
console.error("Refresh failed:", e);
}
}
app.registerExtension({ app.registerExtension({
name: "AudioCraft.AudioManager", name: "AudioCraft.AudioManager",
async beforeRegisterNodeDef(nodeType, nodeData, app) { async beforeRegisterNodeDef(nodeType, nodeData, app) {
if (nodeData.name === "AudioManager") { if (nodeData.name === "AudioManager") {
const origOnNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function () {
origOnNodeCreated?.apply(this, arguments);
const container = document.createElement("div");
container.style.cssText = "padding:4px;overflow-y:auto;";
const loadingMsg = document.createElement("div");
loadingMsg.textContent = "Klicke \u21BB Refresh um Dateien zu laden";
loadingMsg.style.cssText = "color:#888;font-size:12px;padding:8px;";
container.appendChild(loadingMsg);
this._managerContainer = container;
this._managerWidget = this.addDOMWidget("audio_manager", "dom", container, {
serialize: false,
hideOnZoom: false,
});
this._managerWidget.computeSize = () => [this.size[0], 60];
// Auto-refresh on creation
setTimeout(() => refreshFileList(this), 500);
};
// Also refresh when node is executed via Queue
const onExecuted = nodeType.prototype.onExecuted; const onExecuted = nodeType.prototype.onExecuted;
nodeType.prototype.onExecuted = function (message) { nodeType.prototype.onExecuted = function (message) {
onExecuted?.apply(this, arguments); onExecuted?.apply(this, arguments);
refreshFileList(this);
if (!message?.text) return;
const summary = message.text[0]?.content || "";
const files = message.files || [];
if (this._managerWidget) {
// Update existing widget content
this._managerContainer.innerHTML = "";
buildContent(this._managerContainer, summary, files);
const h = Math.min(60 + files.length * 22, 500);
this._managerWidget.computeSize = () => [this.size[0], h];
this.setSize([this.size[0], h + 80]);
} else {
const container = document.createElement("div");
container.style.cssText = "padding:4px;overflow-y:auto;max-height:450px;";
buildContent(container, summary, files);
this._managerContainer = container;
this._managerWidget = this.addDOMWidget("audio_manager", "dom", container, {
serialize: false,
hideOnZoom: false,
});
const h = Math.min(60 + files.length * 22, 500);
this._managerWidget.computeSize = () => [this.size[0], h];
this.setSize([this.size[0], h + 80]);
}
app.graph.setDirtyCanvas(true);
}; };
} }
}, },
}); });
// Listen for any prompt execution to auto-refresh AudioManager nodes
api.addEventListener("executed", (event) => {
// After any node executes, refresh all AudioManager nodes
if (event?.detail?.node) {
const nodes = app.graph._nodes.filter(n => n.type === "AudioManager");
for (const node of nodes) {
if (node._managerContainer) {
refreshFileList(node);
}
}
}
});
function buildContent(container, summary, files) { function buildContent(container, summary, files) {
const header = document.createElement("div"); const headerRow = document.createElement("div");
header.textContent = summary; headerRow.style.cssText = "display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;padding:4px;background:#333;border-radius:4px;gap:4px;";
header.style.cssText = "font-weight:bold;margin-bottom:6px;color:#fff;font-size:12px;";
container.appendChild(header); const headerText = document.createElement("span");
headerText.textContent = summary;
headerText.style.cssText = "font-weight:bold;color:#fff;font-size:12px;white-space:nowrap;";
const btnGroup = document.createElement("div");
btnGroup.style.cssText = "display:flex;gap:4px;";
const refreshBtn = document.createElement("button");
refreshBtn.textContent = "\u21BB Refresh";
refreshBtn.style.cssText = "background:#2a3a5a;border:none;color:#8cf;cursor:pointer;padding:3px 8px;border-radius:3px;font-size:11px;white-space:nowrap;";
refreshBtn.onclick = () => {
const node = app.graph._nodes.find(n => n._managerContainer === container.parentElement || n._managerContainer === container);
if (node) refreshFileList(node);
};
const loopBtn = document.createElement("button");
loopBtn.textContent = loopEnabled ? "\uD83D\uDD01 Loop AN" : "\uD83D\uDD01 Loop";
loopBtn.style.cssText = `background:${loopEnabled ? "#2a5a2a" : "#444"};border:none;color:${loopEnabled ? "#8f8" : "#888"};cursor:pointer;padding:3px 8px;border-radius:3px;font-size:11px;white-space:nowrap;`;
loopBtn.onclick = () => {
loopEnabled = !loopEnabled;
loopBtn.textContent = loopEnabled ? "\uD83D\uDD01 Loop AN" : "\uD83D\uDD01 Loop";
loopBtn.style.background = loopEnabled ? "#2a5a2a" : "#444";
loopBtn.style.color = loopEnabled ? "#8f8" : "#888";
if (activeAudio) activeAudio.loop = loopEnabled;
};
btnGroup.appendChild(refreshBtn);
btnGroup.appendChild(loopBtn);
headerRow.appendChild(headerText);
headerRow.appendChild(btnGroup);
container.appendChild(headerRow);
if (files.length === 0) return; if (files.length === 0) return;
for (const f of files) { for (const f of files) {
const row = document.createElement("div"); const row = document.createElement("div");
row.style.cssText = "display:flex;justify-content:space-between;padding:2px 0;font-size:11px;color:#ccc;border-bottom:1px solid #333;align-items:center;"; row.style.cssText = "display:flex;align-items:center;padding:3px 2px;font-size:11px;color:#ccc;border-bottom:1px solid #333;min-height:22px;";
const name = document.createElement("span"); const name = document.createElement("span");
name.textContent = f.name; name.textContent = f.name;
name.style.cssText = "overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;margin-right:8px;"; name.style.cssText = "overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;margin-right:6px;";
const size = document.createElement("span"); const size = document.createElement("span");
size.textContent = f.size_mb + " MB"; size.textContent = f.size_mb + " MB";
size.style.cssText = "color:#8cf;min-width:60px;text-align:right;margin-right:8px;"; size.style.cssText = "color:#8cf;min-width:55px;text-align:right;margin-right:6px;font-size:10px;";
const playBtn = document.createElement("button"); const playBtn = document.createElement("button");
playBtn.textContent = "\u25B6"; playBtn.textContent = "\u25B6";
playBtn.style.cssText = "background:#444;border:none;color:#8f8;cursor:pointer;padding:1px 6px;border-radius:3px;font-size:10px;"; playBtn.title = "Abspielen";
playBtn.style.cssText = "background:#444;border:none;color:#8f8;cursor:pointer;padding:2px 8px;border-radius:3px;font-size:11px;margin-right:4px;";
const audioSrc = api.apiURL( const audioSrc = api.apiURL(
`/view?filename=${encodeURIComponent(f.name)}&subfolder=audio&type=output` `/view?filename=${encodeURIComponent(f.name)}&subfolder=audio&type=output`
); );
let currentAudio = null; const dlBtn = document.createElement("a");
dlBtn.href = audioSrc;
dlBtn.download = f.name;
dlBtn.textContent = "\u2B07";
dlBtn.title = "Download";
dlBtn.style.cssText = "color:#8cf;text-decoration:none;font-size:13px;padding:0 4px;";
const delBtn = document.createElement("button");
delBtn.textContent = "\u2716";
delBtn.title = "Loeschen";
delBtn.style.cssText = "background:#533;border:none;color:#f66;cursor:pointer;padding:2px 6px;border-radius:3px;font-size:11px;margin-left:4px;";
delBtn.onclick = async () => {
if (activeBtn === playBtn) stopActive();
try {
const resp = await api.fetchApi("/audiocraft/delete", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({filename: f.name}),
});
if (resp.ok) {
row.style.opacity = "0.3";
row.style.pointerEvents = "none";
delBtn.textContent = "\u2714";
delBtn.style.color = "#888";
}
} catch (e) {
console.error("Delete failed:", e);
}
};
playBtn.onclick = () => { playBtn.onclick = () => {
if (currentAudio) { if (activeBtn === playBtn) {
currentAudio.pause(); stopActive();
currentAudio = null;
playBtn.textContent = "\u25B6";
return; return;
} }
currentAudio = new Audio(audioSrc); stopActive();
currentAudio.play();
const audio = new Audio(audioSrc);
audio.loop = loopEnabled;
audio.play();
activeAudio = audio;
activeBtn = playBtn;
playBtn.textContent = "\u25A0"; playBtn.textContent = "\u25A0";
currentAudio.onended = () => { playBtn.style.color = "#f88";
playBtn.textContent = "\u25B6";
currentAudio = null; audio.onended = () => {
if (!audio.loop) {
playBtn.textContent = "\u25B6";
playBtn.style.color = "#8f8";
activeAudio = null;
activeBtn = null;
}
}; };
}; };
row.appendChild(name); row.appendChild(name);
row.appendChild(size); row.appendChild(size);
row.appendChild(playBtn); row.appendChild(playBtn);
row.appendChild(dlBtn);
row.appendChild(delBtn);
container.appendChild(row); container.appendChild(row);
} }
} }

View file

@ -17,12 +17,14 @@
"properties": {"Node name for S&R": "AudioGen"}, "properties": {"Node name for S&R": "AudioGen"},
"widgets_values": [ "widgets_values": [
"fast metal sword swing whoosh close range", "fast metal sword swing whoosh close range",
"heavy_strike",
1.5, 1.5,
0, 0,
"fixed", "fixed",
0.8, 0.8,
4.5, 4.5,
200 200,
"Ja"
] ]
}, },
{ {
@ -72,12 +74,14 @@
"properties": {"Node name for S&R": "AudioGen"}, "properties": {"Node name for S&R": "AudioGen"},
"widgets_values": [ "widgets_values": [
"magical energy charging electric crackling buildup impact", "magical energy charging electric crackling buildup impact",
"spell_effect",
2.5, 2.5,
0, 0,
"fixed", "fixed",
1.0, 1.0,
3.5, 3.5,
250 250,
"Ja"
] ]
}, },
{ {
@ -127,12 +131,14 @@
"properties": {"Node name for S&R": "AudioGen"}, "properties": {"Node name for S&R": "AudioGen"},
"widgets_values": [ "widgets_values": [
"wind blowing through dark stone dungeon corridor echoing", "wind blowing through dark stone dungeon corridor echoing",
"dungeon_ambient",
8.0, 8.0,
0, 0,
"fixed", "fixed",
1.0, 1.0,
3.0, 3.0,
250 250,
"Ja"
] ]
}, },
{ {

View file

@ -169,8 +169,10 @@ func _on_music_finished():
_music_player.play() _music_player.play()
func _on_play(): func _on_play():
# Musik-Player an Parent übergeben damit er weiterspielt
if _music_player: if _music_player:
_music_player.stop() remove_child(_music_player)
get_parent().add_child(_music_player)
start_game.emit() start_game.emit()
get_tree().paused = false get_tree().paused = false
queue_free() queue_free()

View file

@ -37,7 +37,7 @@ const MIN_ROOM_SIZE = 4
const MAX_ROOM_SIZE = 9 const MAX_ROOM_SIZE = 9
@onready var player = $Player @onready var player = $Player
@onready var floor_mesh = $Boden/MeshInstance3D @onready var world_env = $WorldEnvironment
@onready var gate_area = $DungeonGate/GateArea @onready var gate_area = $DungeonGate/GateArea
@onready var gate_label = $DungeonGate/GateLabel @onready var gate_label = $DungeonGate/GateLabel
@ -63,7 +63,6 @@ var dungeon_rooms: Array = []
var saved_dungeons: Dictionary = {} var saved_dungeons: Dictionary = {}
func _ready(): func _ready():
_setup_floor_material()
_setup_sky() _setup_sky()
# Hauptmenü anzeigen # Hauptmenü anzeigen
var main_menu = MAIN_MENU.instantiate() var main_menu = MAIN_MENU.instantiate()
@ -71,72 +70,9 @@ func _ready():
main_menu.start_game.connect(_on_start_game) main_menu.start_game.connect(_on_start_game)
func _setup_sky(): func _setup_sky():
var sky_mat = ProceduralSkyMaterial.new() overworld_env = world_env
sky_mat.sky_top_color = Color(0.15, 0.35, 0.75) overworld_env_resource = world_env.environment
sky_mat.sky_horizon_color = Color(0.55, 0.75, 1.0)
sky_mat.ground_horizon_color = Color(0.35, 0.30, 0.25)
sky_mat.ground_bottom_color = Color(0.1, 0.1, 0.1)
sky_mat.sun_angle_max = 30.0
sky_mat.sun_curve = 0.15
var sky = Sky.new()
sky.sky_material = sky_mat
var env = Environment.new()
env.background_mode = Environment.BG_SKY
env.sky = sky
env.ambient_light_source = Environment.AMBIENT_SOURCE_SKY
env.ambient_light_energy = 0.6
env.tonemap_mode = Environment.TONE_MAPPER_FILMIC
overworld_env = WorldEnvironment.new()
overworld_env.name = "OverworldEnv"
overworld_env.environment = env
add_child(overworld_env)
func _setup_floor_material():
var shader = Shader.new()
shader.code = """
shader_type spatial;
uniform vec4 grass_color_a : source_color = vec4(0.18, 0.42, 0.12, 1.0);
uniform vec4 grass_color_b : source_color = vec4(0.22, 0.50, 0.15, 1.0);
uniform vec4 dirt_color : source_color = vec4(0.35, 0.25, 0.15, 1.0);
uniform float noise_scale : hint_range(0.01, 0.5) = 0.08;
uniform float dirt_threshold : hint_range(0.0, 1.0) = 0.72;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
}
float noise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
f = f * f * (3.0 - 2.0 * f);
float a = hash(i);
float b = hash(i + vec2(1.0, 0.0));
float c = hash(i + vec2(0.0, 1.0));
float d = hash(i + vec2(1.0, 1.0));
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}
void fragment() {
vec3 world_pos = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
vec2 uv = world_pos.xz * noise_scale;
float n1 = noise(uv * 3.0);
float n2 = noise(uv * 7.0 + vec2(50.0));
float n3 = noise(uv * 15.0 + vec2(100.0));
float combined = n1 * 0.5 + n2 * 0.35 + n3 * 0.15;
vec3 grass = mix(grass_color_a.rgb, grass_color_b.rgb, n2);
vec3 col = mix(grass, dirt_color.rgb, step(dirt_threshold, combined));
ALBEDO = col;
ROUGHNESS = 0.92;
METALLIC = 0.0;
NORMAL_MAP = vec3(n2 * 0.3, n3 * 0.3, 1.0);
}
"""
var mat = ShaderMaterial.new()
mat.shader = shader
floor_mesh.material_override = mat
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
# PROCESS # PROCESS
@ -754,6 +690,12 @@ func _on_start_game():
# Klasse ausgewählt: Spieler initialisieren # Klasse ausgewählt: Spieler initialisieren
func _on_class_selected(character_class: CharacterClass): func _on_class_selected(character_class: CharacterClass):
# Menü-Musik stoppen und entfernen
for child in get_children():
if child is AudioStreamPlayer:
child.stop()
child.queue_free()
player.character_class = character_class player.character_class = character_class
# Skills klassenabhängig aufbauen # Skills klassenabhängig aufbauen

View file

@ -2,55 +2,67 @@
[ext_resource type="PackedScene" uid="uid://dniyuebl8yhtv" path="res://player.tscn" id="1_f3sb7"] [ext_resource type="PackedScene" uid="uid://dniyuebl8yhtv" path="res://player.tscn" id="1_f3sb7"]
[ext_resource type="Script" uid="uid://cx56h588mfsk0" path="res://world.gd" id="1_tlwt5"] [ext_resource type="Script" uid="uid://cx56h588mfsk0" path="res://world.gd" id="1_tlwt5"]
[ext_resource type="PackedScene" uid="uid://cvojaeanxugfj" path="res://enemy.tscn" id="3_enemy"] [ext_resource type="PackedScene" uid="uid://dawbdtnyiha0m" path="res://assets/environment/medieval_town.glb" id="4_town"]
[ext_resource type="PackedScene" uid="uid://b426p2ebu8ob1" path="res://assets/environment/fantasy_door_model.glb" id="5_door"]
[sub_resource type="ProceduralSkyMaterial" id="sky_mat"]
sky_top_color = Color(0.35, 0.5, 0.75, 1)
sky_horizon_color = Color(0.65, 0.7, 0.78, 1)
ground_bottom_color = Color(0.2, 0.18, 0.15, 1)
ground_horizon_color = Color(0.55, 0.52, 0.48, 1)
[sub_resource type="Sky" id="sky"]
sky_material = SubResource("sky_mat")
[sub_resource type="Environment" id="env"]
background_mode = 2
sky = SubResource("sky")
ambient_light_source = 2
ambient_light_color = Color(0.6, 0.58, 0.55, 1)
ambient_light_energy = 0.3
tonemap_mode = 2
ssao_enabled = true
glow_enabled = true
fog_enabled = true
fog_light_color = Color(0.7, 0.68, 0.62, 1)
fog_density = 0.002
[sub_resource type="BoxShape3D" id="BoxShape3D_floor"] [sub_resource type="BoxShape3D" id="BoxShape3D_floor"]
size = Vector3(200, 0.5, 200) size = Vector3(2500, 0.5, 2500)
[sub_resource type="BoxMesh" id="BoxMesh_floor"] [sub_resource type="StandardMaterial3D" id="mat_floor"]
size = Vector3(200, 0.5, 200) albedo_color = Color(0.28, 0.35, 0.18, 1)
[sub_resource type="NavigationMesh" id="NavigationMesh_fj7yv"]
[sub_resource type="StandardMaterial3D" id="mat_rock"]
albedo_color = Color(0.4, 0.38, 0.35, 1)
roughness = 0.95 roughness = 0.95
[sub_resource type="StandardMaterial3D" id="mat_stone"] [sub_resource type="BoxMesh" id="BoxMesh_floor"]
albedo_color = Color(0.3, 0.28, 0.25, 1) size = Vector3(2500, 0.5, 2500)
roughness = 0.9
[sub_resource type="StandardMaterial3D" id="mat_entrance"] [sub_resource type="NavigationMesh" id="NavigationMesh_fj7yv"]
albedo_color = Color(0.02, 0.02, 0.02, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_gate"] [sub_resource type="BoxShape3D" id="BoxShape3D_gate"]
size = Vector3(5, 4, 4) size = Vector3(5, 4, 4)
[sub_resource type="StandardMaterial3D" id="mat_rock_small"]
albedo_color = Color(0.45, 0.42, 0.38, 1)
roughness = 0.95
[sub_resource type="StandardMaterial3D" id="mat_trunk"]
albedo_color = Color(0.35, 0.22, 0.1, 1)
roughness = 0.9
[sub_resource type="StandardMaterial3D" id="mat_leaf"]
albedo_color = Color(0.15, 0.45, 0.12, 1)
roughness = 0.85
[node name="World" type="Node3D" unique_id=1518976304] [node name="World" type="Node3D" unique_id=1518976304]
script = ExtResource("1_tlwt5") script = ExtResource("1_tlwt5")
[node name="Boden" type="StaticBody3D" parent="." unique_id=1937472568] [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=801100654]
environment = SubResource("env")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Boden" unique_id=1499976920] [node name="Boden" type="StaticBody3D" parent="." unique_id=839662005]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.28, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Boden" unique_id=334777163]
shape = SubResource("BoxShape3D_floor") shape = SubResource("BoxShape3D_floor")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Boden" unique_id=1316024844] [node name="MeshInstance3D" type="MeshInstance3D" parent="Boden" unique_id=1590278465]
material_override = SubResource("mat_floor")
mesh = SubResource("BoxMesh_floor") mesh = SubResource("BoxMesh_floor")
[node name="MedievalTown" parent="." unique_id=1511860358 instance=ExtResource("4_town")]
transform = Transform3D(0.04, 0, 0, 0, 0.04, 0, 0, 0, 0.04, 0, 0, 0)
[node name="Player" parent="." unique_id=841198255 instance=ExtResource("1_f3sb7")] [node name="Player" parent="." unique_id=841198255 instance=ExtResource("1_f3sb7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.435, 0) transform = Transform3D(-0.70710677, 0, 0.70710677, 0, 1, 0, -0.70710677, 0, -0.70710677, -299, 0.43499756, 332)
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1642167272] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1642167272]
transform = Transform3D(-45, 0, 0, 0, -45, 0, 0, 0, -45, 0, 0, 0) transform = Transform3D(-45, 0, 0, 0, -45, 0, 0, 0, -45, 0, 0, 0)
@ -58,66 +70,11 @@ transform = Transform3D(-45, 0, 0, 0, -45, 0, 0, 0, -45, 0, 0, 0)
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="." unique_id=1093030835] [node name="NavigationRegion3D" type="NavigationRegion3D" parent="." unique_id=1093030835]
navigation_mesh = SubResource("NavigationMesh_fj7yv") navigation_mesh = SubResource("NavigationMesh_fj7yv")
[node name="enemy" parent="." unique_id=1435537835 instance=ExtResource("3_enemy")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.388, -36)
[node name="Mountain" type="CSGCombiner3D" parent="." unique_id=677409308]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -80)
use_collision = true
[node name="MainBody" type="CSGSphere3D" parent="Mountain" unique_id=578990011]
transform = Transform3D(1.5, 0, 0, 0, 0.6, 0, 0, 0, 1, 0, -5, 0)
radius = 30.0
radial_segments = 24
rings = 16
material = SubResource("mat_rock")
[node name="Peak" type="CSGSphere3D" parent="Mountain" unique_id=1930092098]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0)
radius = 15.0
radial_segments = 16
rings = 12
material = SubResource("mat_rock")
[node name="LeftHill" type="CSGSphere3D" parent="Mountain" unique_id=1517453171]
transform = Transform3D(1.2, 0, 0, 0, 0.5, 0, 0, 0, 0.8, -25, -8, 5)
radius = 20.0
radial_segments = 16
rings = 12
material = SubResource("mat_rock")
[node name="RightHill" type="CSGSphere3D" parent="Mountain" unique_id=334184404]
transform = Transform3D(1, 0, 0, 0, 0.45, 0, 0, 0, 0.9, 22, -8, 8)
radius = 18.0
radial_segments = 16
rings = 12
material = SubResource("mat_rock")
[node name="DungeonGate" type="Node3D" parent="." unique_id=1787139888] [node name="DungeonGate" type="Node3D" parent="." unique_id=1787139888]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -45) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -296, 0, 370)
[node name="LeftPillar" type="CSGBox3D" parent="DungeonGate" unique_id=975630240] [node name="DoorModel" parent="DungeonGate" unique_id=1071858485 instance=ExtResource("5_door")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 3, 0) transform = Transform3D(-100, 0, 8.742278e-06, 0, 100, 0, -8.742278e-06, 0, -100, 0, 4, 0)
use_collision = true
size = Vector3(1.5, 6, 1.5)
material = SubResource("mat_stone")
[node name="RightPillar" type="CSGBox3D" parent="DungeonGate" unique_id=682177996]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 3, 0)
use_collision = true
size = Vector3(1.5, 6, 1.5)
material = SubResource("mat_stone")
[node name="TopBar" type="CSGBox3D" parent="DungeonGate" unique_id=1917431148]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.6, 0)
use_collision = true
size = Vector3(6.5, 1.2, 1.5)
material = SubResource("mat_stone")
[node name="Entrance" type="CSGBox3D" parent="DungeonGate" unique_id=782262731]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.75, -0.5)
size = Vector3(3.5, 5.5, 2)
material = SubResource("mat_entrance")
[node name="GateArea" type="Area3D" parent="DungeonGate" unique_id=1947692918] [node name="GateArea" type="Area3D" parent="DungeonGate" unique_id=1947692918]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 2)
@ -132,209 +89,3 @@ billboard = 1
modulate = Color(1, 0.85, 0.3, 1) modulate = Color(1, 0.85, 0.3, 1)
text = "Dungeon betreten [E]" text = "Dungeon betreten [E]"
font_size = 48 font_size = 48
[node name="Rock1" type="CSGSphere3D" parent="." unique_id=427636709]
transform = Transform3D(1.1, 0, 0, 0, 0.5, 0, 0, 0, 0.9, 15, 0.5, -20)
radius = 1.8
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock2" type="CSGSphere3D" parent="." unique_id=176525307]
transform = Transform3D(0.9, 0, 0, 0, 0.6, 0, 0, 0, 1.1, -18, 0.4, -15)
radius = 1.4
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock3" type="CSGSphere3D" parent="." unique_id=1182279621]
transform = Transform3D(1.2, 0, 0, 0, 0.45, 0, 0, 0, 0.8, 25, 0.7, 10)
radius = 2.2
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock4" type="CSGSphere3D" parent="." unique_id=1966368230]
transform = Transform3D(0.8, 0, 0, 0, 0.55, 0, 0, 0, 1, -22, 0.3, 25)
radius = 1.0
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock5" type="CSGSphere3D" parent="." unique_id=48323199]
transform = Transform3D(1.3, 0, 0, 0, 0.5, 0, 0, 0, 0.9, 30, 0.6, -40)
radius = 2.0
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock6" type="CSGSphere3D" parent="." unique_id=604365640]
transform = Transform3D(1, 0, 0, 0, 0.7, 0, 0, 0, 1.2, -28, 0.5, -45)
radius = 1.6
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock7" type="CSGSphere3D" parent="." unique_id=1821485412]
transform = Transform3D(0.9, 0, 0, 0, 0.4, 0, 0, 0, 1, 12, 0.3, 30)
radius = 1.2
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock8" type="CSGSphere3D" parent="." unique_id=1387702407]
transform = Transform3D(1.1, 0, 0, 0, 0.6, 0, 0, 0, 0.85, -10, 0.6, -50)
radius = 2.4
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Rock9" type="CSGSphere3D" parent="." unique_id=1450102956]
transform = Transform3D(1, 0, 0, 0, 0.5, 0, 0, 0, 1.1, 35, 0.4, -25)
radius = 1.5
radial_segments = 8
material = SubResource("mat_rock_small")
[node name="Tree1" type="Node3D" parent="." unique_id=618772270]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, -10)
[node name="Trunk" type="CSGCylinder3D" parent="Tree1" unique_id=1186519127]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.75, 0)
radius = 0.3
height = 5.5
material = SubResource("mat_trunk")
[node name="Crown1" type="CSGSphere3D" parent="Tree1" unique_id=2089075716]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 4.2, -0.2)
radius = 2.2
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown2" type="CSGSphere3D" parent="Tree1" unique_id=2070989054]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 5.4, 0.3)
radius = 2.0
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Tree2" type="Node3D" parent="." unique_id=1889546293]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0, -30)
[node name="Trunk" type="CSGCylinder3D" parent="Tree2" unique_id=997380154]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.25, 0)
radius = 0.3
height = 6.5
material = SubResource("mat_trunk")
[node name="Crown1" type="CSGSphere3D" parent="Tree2" unique_id=809808235]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 5, 0.2)
radius = 2.5
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown2" type="CSGSphere3D" parent="Tree2" unique_id=481648384]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, 6.2, -0.4)
radius = 2.2
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown3" type="CSGSphere3D" parent="Tree2" unique_id=184574046]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1, 7.4, 0.1)
radius = 1.8
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Tree3" type="Node3D" parent="." unique_id=1385340799]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 28, 0, 20)
[node name="Trunk" type="CSGCylinder3D" parent="Tree3" unique_id=387398909]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25, 0)
radius = 0.3
height = 4.5
material = SubResource("mat_trunk")
[node name="Crown1" type="CSGSphere3D" parent="Tree3" unique_id=1139907459]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.2, 3.5, 0.5)
radius = 2.0
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown2" type="CSGSphere3D" parent="Tree3" unique_id=391069386]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 4.7, -0.3)
radius = 2.3
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Tree4" type="Node3D" parent="." unique_id=613675839]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -25, 0, 15)
[node name="Trunk" type="CSGCylinder3D" parent="Tree4" unique_id=220117087]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0)
radius = 0.3
height = 6.0
material = SubResource("mat_trunk")
[node name="Crown1" type="CSGSphere3D" parent="Tree4" unique_id=129254377]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 4.5, -0.1)
radius = 2.4
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown2" type="CSGSphere3D" parent="Tree4" unique_id=929192645]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 5.7, 0.4)
radius = 2.1
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Tree5" type="Node3D" parent="." unique_id=94347379]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 35)
[node name="Trunk" type="CSGCylinder3D" parent="Tree5" unique_id=199856993]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.5, 0)
radius = 0.3
height = 7.0
material = SubResource("mat_trunk")
[node name="Crown1" type="CSGSphere3D" parent="Tree5" unique_id=1965121271]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, 5.3, 0.6)
radius = 2.6
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown2" type="CSGSphere3D" parent="Tree5" unique_id=1961694117]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 6.5, -0.2)
radius = 2.3
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown3" type="CSGSphere3D" parent="Tree5" unique_id=1346853660]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7.7, 0.3)
radius = 1.9
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Tree6" type="Node3D" parent="." unique_id=1309473387]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, -10)
[node name="Trunk" type="CSGCylinder3D" parent="Tree6" unique_id=1889196546]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0)
radius = 0.3
height = 5.0
material = SubResource("mat_trunk")
[node name="Crown1" type="CSGSphere3D" parent="Tree6" unique_id=1159575861]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, 3.8, -0.4)
radius = 2.1
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")
[node name="Crown2" type="CSGSphere3D" parent="Tree6" unique_id=2073540260]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 5, 0.2)
radius = 2.4
radial_segments = 10
rings = 8
material = SubResource("mat_leaf")