diff --git a/addons/terrain_3d/LICENSE.txt b/addons/terrain_3d/LICENSE.txt
new file mode 100644
index 0000000..b4293b7
--- /dev/null
+++ b/addons/terrain_3d/LICENSE.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Cory Petkovsek, Roope Palmroos, and Contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/addons/terrain_3d/README.md b/addons/terrain_3d/README.md
new file mode 100644
index 0000000..47f2953
--- /dev/null
+++ b/addons/terrain_3d/README.md
@@ -0,0 +1,56 @@
+
+
+# Terrain3D
+A high performance, editable terrain system for Godot 4.
+
+## Features
+* Written in C++ as a GDExtension addon, which works with official engine builds
+* Can be accessed by GDScript, C#, and any language Godot supports
+* Geometric Clipmap Mesh Terrain, as used in The Witcher 3. See [System Architecture](https://terrain3d.readthedocs.io/en/stable/docs/system_architecture.html)
+* Up to 16k x 16k in 1k regions (imagine multiple islands without paying for 16k^2 vram)
+* Up to 32 textures
+* Up to 10 levels of detail
+* Foliage instancing
+* Sculpting, holes, texture painting, texture detiling, painting colors and wetness
+* Imports heightmaps from [HTerrain](https://github.com/Zylann/godot_heightmap_plugin/), WorldMachine, Unity, Unreal and any tool that can export a heightmap (raw/r16/exr/+). See [importing data](https://terrain3d.readthedocs.io/en/stable/docs/import_export.html)
+
+See [Project Status](https://terrain3d.readthedocs.io/en/stable/docs/project_status.html) for details.
+
+## Getting Started
+
+1. Read the [Installation & Upgrades](https://terrain3d.readthedocs.io/en/stable/docs/installation.html) instructions.
+
+2. For support, read [Getting Help](https://terrain3d.readthedocs.io/en/stable/docs/getting_help.html) or join our [Discord server](https://tokisan.com/discord).
+
+3. Watch the tutorial videos:
+
+**Installation, Setup, Basic Usage**
+
+[](https://youtu.be/oV8c9alXVwU)
+
+**Texture Painting, Holes, Navigation, Advanced Usage**
+
+[](https://youtu.be/YtiAI2F6Xkk)
+
+
+## Credit
+Developed for the Godot community by:
+
+|||
+|--|--|
+| **Cory Petkovsek, Tokisan Games** | [
](https://twitter.com/TokisanGames) [
](https://github.com/TokisanGames) [
](https://tokisan.com/) [
](https://tokisan.com/discord) [
](https://www.youtube.com/@TokisanGames)|
+| **Roope Palmroos, Outobugi Games** | [
](https://twitter.com/outobugi) [
](https://github.com/outobugi) [
](https://outobugi.com/) [
](https://www.youtube.com/@outobugi)|
+
+And other contributors displayed on the right of the github page and in [AUTHORS.md](https://github.com/TokisanGames/Terrain3D/blob/main/AUTHORS.md).
+
+Geometry clipmap mesh code created by [Mike J. Savage](https://mikejsavage.co.uk/blog/geometry-clipmaps.html). Blog and repository code released under the MIT license per email communication with Mike.
+
+## Contributing
+
+Please see [CONTRIBUTING.md](https://github.com/TokisanGames/Terrain3D/blob/main/CONTRIBUTING.md) if you would like to help make Terrain3D the best terrain system for Godot.
+
+
+## License
+
+This addon has been released under the [MIT License](https://github.com/TokisanGames/Terrain3D/blob/main/LICENSE.txt).
+
diff --git a/addons/terrain_3d/bin/libterrain.android.debug.arm32.so b/addons/terrain_3d/bin/libterrain.android.debug.arm32.so
new file mode 100644
index 0000000..4429d13
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.debug.arm32.so differ
diff --git a/addons/terrain_3d/bin/libterrain.android.debug.arm64.so b/addons/terrain_3d/bin/libterrain.android.debug.arm64.so
new file mode 100644
index 0000000..1e2905f
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.debug.arm64.so differ
diff --git a/addons/terrain_3d/bin/libterrain.android.release.arm32.so b/addons/terrain_3d/bin/libterrain.android.release.arm32.so
new file mode 100644
index 0000000..8e6ba2f
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.release.arm32.so differ
diff --git a/addons/terrain_3d/bin/libterrain.android.release.arm64.so b/addons/terrain_3d/bin/libterrain.android.release.arm64.so
new file mode 100644
index 0000000..6ff140b
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.release.arm64.so differ
diff --git a/addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib b/addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib
new file mode 100644
index 0000000..58c56bc
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib differ
diff --git a/addons/terrain_3d/bin/libterrain.ios.release.universal.dylib b/addons/terrain_3d/bin/libterrain.ios.release.universal.dylib
new file mode 100644
index 0000000..be5b107
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.ios.release.universal.dylib differ
diff --git a/addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so b/addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so
new file mode 100644
index 0000000..e78a649
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so differ
diff --git a/addons/terrain_3d/bin/libterrain.linux.release.x86_64.so b/addons/terrain_3d/bin/libterrain.linux.release.x86_64.so
new file mode 100644
index 0000000..8f8756c
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.linux.release.x86_64.so differ
diff --git a/addons/terrain_3d/bin/libterrain.macos.debug.framework/libterrain.macos.debug b/addons/terrain_3d/bin/libterrain.macos.debug.framework/libterrain.macos.debug
new file mode 100644
index 0000000..d340a95
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.macos.debug.framework/libterrain.macos.debug differ
diff --git a/addons/terrain_3d/bin/libterrain.macos.release.framework/libterrain.macos.release b/addons/terrain_3d/bin/libterrain.macos.release.framework/libterrain.macos.release
new file mode 100644
index 0000000..9d39905
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.macos.release.framework/libterrain.macos.release differ
diff --git a/addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll b/addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll
new file mode 100644
index 0000000..1904d12
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll differ
diff --git a/addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll b/addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll
new file mode 100644
index 0000000..ed84c94
Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll differ
diff --git a/addons/terrain_3d/brushes/.gdignore b/addons/terrain_3d/brushes/.gdignore
new file mode 100644
index 0000000..e69de29
diff --git a/addons/terrain_3d/brushes/acrylic1.exr b/addons/terrain_3d/brushes/acrylic1.exr
new file mode 100644
index 0000000..14b66d6
Binary files /dev/null and b/addons/terrain_3d/brushes/acrylic1.exr differ
diff --git a/addons/terrain_3d/brushes/circle0.exr b/addons/terrain_3d/brushes/circle0.exr
new file mode 100644
index 0000000..78937f1
Binary files /dev/null and b/addons/terrain_3d/brushes/circle0.exr differ
diff --git a/addons/terrain_3d/brushes/circle1.exr b/addons/terrain_3d/brushes/circle1.exr
new file mode 100644
index 0000000..e91d97e
Binary files /dev/null and b/addons/terrain_3d/brushes/circle1.exr differ
diff --git a/addons/terrain_3d/brushes/circle2.exr b/addons/terrain_3d/brushes/circle2.exr
new file mode 100644
index 0000000..f6931ba
Binary files /dev/null and b/addons/terrain_3d/brushes/circle2.exr differ
diff --git a/addons/terrain_3d/brushes/circle3.exr b/addons/terrain_3d/brushes/circle3.exr
new file mode 100644
index 0000000..477ab7e
Binary files /dev/null and b/addons/terrain_3d/brushes/circle3.exr differ
diff --git a/addons/terrain_3d/brushes/circle4.exr b/addons/terrain_3d/brushes/circle4.exr
new file mode 100644
index 0000000..b466f92
Binary files /dev/null and b/addons/terrain_3d/brushes/circle4.exr differ
diff --git a/addons/terrain_3d/brushes/hill1.exr b/addons/terrain_3d/brushes/hill1.exr
new file mode 100644
index 0000000..a668ab6
Binary files /dev/null and b/addons/terrain_3d/brushes/hill1.exr differ
diff --git a/addons/terrain_3d/brushes/hill2.exr b/addons/terrain_3d/brushes/hill2.exr
new file mode 100644
index 0000000..068e22b
Binary files /dev/null and b/addons/terrain_3d/brushes/hill2.exr differ
diff --git a/addons/terrain_3d/brushes/mountain1.exr b/addons/terrain_3d/brushes/mountain1.exr
new file mode 100644
index 0000000..be71748
Binary files /dev/null and b/addons/terrain_3d/brushes/mountain1.exr differ
diff --git a/addons/terrain_3d/brushes/mountain2.exr b/addons/terrain_3d/brushes/mountain2.exr
new file mode 100644
index 0000000..ca30373
Binary files /dev/null and b/addons/terrain_3d/brushes/mountain2.exr differ
diff --git a/addons/terrain_3d/brushes/mountain3.exr b/addons/terrain_3d/brushes/mountain3.exr
new file mode 100644
index 0000000..ca07a1e
Binary files /dev/null and b/addons/terrain_3d/brushes/mountain3.exr differ
diff --git a/addons/terrain_3d/brushes/mountain4.exr b/addons/terrain_3d/brushes/mountain4.exr
new file mode 100644
index 0000000..f8197fe
Binary files /dev/null and b/addons/terrain_3d/brushes/mountain4.exr differ
diff --git a/addons/terrain_3d/brushes/peak1.exr b/addons/terrain_3d/brushes/peak1.exr
new file mode 100644
index 0000000..49d341e
Binary files /dev/null and b/addons/terrain_3d/brushes/peak1.exr differ
diff --git a/addons/terrain_3d/brushes/peak2.exr b/addons/terrain_3d/brushes/peak2.exr
new file mode 100644
index 0000000..db74297
Binary files /dev/null and b/addons/terrain_3d/brushes/peak2.exr differ
diff --git a/addons/terrain_3d/brushes/peak3.exr b/addons/terrain_3d/brushes/peak3.exr
new file mode 100644
index 0000000..9383681
Binary files /dev/null and b/addons/terrain_3d/brushes/peak3.exr differ
diff --git a/addons/terrain_3d/brushes/ring1.exr b/addons/terrain_3d/brushes/ring1.exr
new file mode 100644
index 0000000..6396804
Binary files /dev/null and b/addons/terrain_3d/brushes/ring1.exr differ
diff --git a/addons/terrain_3d/brushes/smoke.exr b/addons/terrain_3d/brushes/smoke.exr
new file mode 100644
index 0000000..021947b
Binary files /dev/null and b/addons/terrain_3d/brushes/smoke.exr differ
diff --git a/addons/terrain_3d/brushes/square1.exr b/addons/terrain_3d/brushes/square1.exr
new file mode 100644
index 0000000..3aff9cd
Binary files /dev/null and b/addons/terrain_3d/brushes/square1.exr differ
diff --git a/addons/terrain_3d/brushes/square2.exr b/addons/terrain_3d/brushes/square2.exr
new file mode 100644
index 0000000..230113c
Binary files /dev/null and b/addons/terrain_3d/brushes/square2.exr differ
diff --git a/addons/terrain_3d/brushes/square3.exr b/addons/terrain_3d/brushes/square3.exr
new file mode 100644
index 0000000..6da88b8
Binary files /dev/null and b/addons/terrain_3d/brushes/square3.exr differ
diff --git a/addons/terrain_3d/brushes/square4.exr b/addons/terrain_3d/brushes/square4.exr
new file mode 100644
index 0000000..350cd7d
Binary files /dev/null and b/addons/terrain_3d/brushes/square4.exr differ
diff --git a/addons/terrain_3d/brushes/square5.exr b/addons/terrain_3d/brushes/square5.exr
new file mode 100644
index 0000000..f0832e0
Binary files /dev/null and b/addons/terrain_3d/brushes/square5.exr differ
diff --git a/addons/terrain_3d/brushes/stones.exr b/addons/terrain_3d/brushes/stones.exr
new file mode 100644
index 0000000..7ef5977
Binary files /dev/null and b/addons/terrain_3d/brushes/stones.exr differ
diff --git a/addons/terrain_3d/brushes/terrain1.exr b/addons/terrain_3d/brushes/terrain1.exr
new file mode 100644
index 0000000..8366b52
Binary files /dev/null and b/addons/terrain_3d/brushes/terrain1.exr differ
diff --git a/addons/terrain_3d/brushes/terrain2.exr b/addons/terrain_3d/brushes/terrain2.exr
new file mode 100644
index 0000000..d11a069
Binary files /dev/null and b/addons/terrain_3d/brushes/terrain2.exr differ
diff --git a/addons/terrain_3d/brushes/terrain3.exr b/addons/terrain_3d/brushes/terrain3.exr
new file mode 100644
index 0000000..61bfe0f
Binary files /dev/null and b/addons/terrain_3d/brushes/terrain3.exr differ
diff --git a/addons/terrain_3d/brushes/terrain4.exr b/addons/terrain_3d/brushes/terrain4.exr
new file mode 100644
index 0000000..e8f4ce4
Binary files /dev/null and b/addons/terrain_3d/brushes/terrain4.exr differ
diff --git a/addons/terrain_3d/brushes/terrain5.exr b/addons/terrain_3d/brushes/terrain5.exr
new file mode 100644
index 0000000..ad3fe5b
Binary files /dev/null and b/addons/terrain_3d/brushes/terrain5.exr differ
diff --git a/addons/terrain_3d/brushes/terrain6.exr b/addons/terrain_3d/brushes/terrain6.exr
new file mode 100644
index 0000000..0a15419
Binary files /dev/null and b/addons/terrain_3d/brushes/terrain6.exr differ
diff --git a/addons/terrain_3d/brushes/texture1.exr b/addons/terrain_3d/brushes/texture1.exr
new file mode 100644
index 0000000..f456b77
Binary files /dev/null and b/addons/terrain_3d/brushes/texture1.exr differ
diff --git a/addons/terrain_3d/brushes/texture2.exr b/addons/terrain_3d/brushes/texture2.exr
new file mode 100644
index 0000000..2624d3b
Binary files /dev/null and b/addons/terrain_3d/brushes/texture2.exr differ
diff --git a/addons/terrain_3d/brushes/texture3.exr b/addons/terrain_3d/brushes/texture3.exr
new file mode 100644
index 0000000..690fe5e
Binary files /dev/null and b/addons/terrain_3d/brushes/texture3.exr differ
diff --git a/addons/terrain_3d/brushes/texture4.exr b/addons/terrain_3d/brushes/texture4.exr
new file mode 100644
index 0000000..a2d96aa
Binary files /dev/null and b/addons/terrain_3d/brushes/texture4.exr differ
diff --git a/addons/terrain_3d/brushes/texture5.exr b/addons/terrain_3d/brushes/texture5.exr
new file mode 100644
index 0000000..62aad60
Binary files /dev/null and b/addons/terrain_3d/brushes/texture5.exr differ
diff --git a/addons/terrain_3d/brushes/vegetation1.exr b/addons/terrain_3d/brushes/vegetation1.exr
new file mode 100644
index 0000000..d65bc6e
Binary files /dev/null and b/addons/terrain_3d/brushes/vegetation1.exr differ
diff --git a/addons/terrain_3d/editor.gd b/addons/terrain_3d/editor.gd
new file mode 100644
index 0000000..14062ef
--- /dev/null
+++ b/addons/terrain_3d/editor.gd
@@ -0,0 +1,299 @@
+@tool
+extends EditorPlugin
+#class_name Terrain3DEditorPlugin Cannot be named until Godot #75388
+
+
+# Includes
+const UI: Script = preload("res://addons/terrain_3d/src/ui.gd")
+const RegionGizmo: Script = preload("res://addons/terrain_3d/src/region_gizmo.gd")
+const ASSET_DOCK: String = "res://addons/terrain_3d/src/asset_dock.tscn"
+const PS_DOCK_POSITION: String = "terrain3d/config/dock_position"
+const PS_DOCK_PINNED: String = "terrain3d/config/dock_pinned"
+
+var terrain: Terrain3D
+var _last_terrain: Terrain3D
+var nav_region: NavigationRegion3D
+
+var editor: Terrain3DEditor
+var ui: Node # Terrain3DUI see Godot #75388
+var asset_dock: PanelContainer
+var region_gizmo: RegionGizmo
+var visible: bool
+var current_region_position: Vector2
+var mouse_global_position: Vector3 = Vector3.ZERO
+
+# Track negative input (CTRL)
+var _negative_input: bool = false
+# Track state prior to pressing CTRL: -1 not tracked, 0 false, 1 true
+var _prev_enable_state: int = -1
+
+
+func _enter_tree() -> void:
+ editor = Terrain3DEditor.new()
+ ui = UI.new()
+ ui.plugin = self
+ add_child(ui)
+
+ region_gizmo = RegionGizmo.new()
+
+ scene_changed.connect(_on_scene_changed)
+
+ asset_dock = load(ASSET_DOCK).instantiate()
+ asset_dock.initialize(self)
+
+
+func _exit_tree() -> void:
+ asset_dock.remove_dock(true)
+ asset_dock.queue_free()
+ ui.queue_free()
+ editor.free()
+
+ scene_changed.disconnect(_on_scene_changed)
+
+
+func _handles(p_object: Object) -> bool:
+ if p_object is Terrain3D:
+ return true
+
+ # Terrain3DObjects requires access to EditorUndoRedoManager. The only way to make sure it
+ # always has it, is to pass it in here. _edit is NOT called if the node is cut and pasted.
+ if p_object is Terrain3DObjects:
+ p_object.editor_setup(self)
+ elif p_object is Node3D and p_object.get_parent() is Terrain3DObjects:
+ p_object.get_parent().editor_setup(self)
+
+ if is_instance_valid(_last_terrain) and _last_terrain.is_inside_tree() and p_object is NavigationRegion3D:
+ return true
+
+ return false
+
+
+func _edit(p_object: Object) -> void:
+ if !p_object:
+ _clear()
+
+ if p_object is Terrain3D:
+ if p_object == terrain:
+ return
+ terrain = p_object
+ _last_terrain = terrain
+ editor.set_terrain(terrain)
+ region_gizmo.set_node_3d(terrain)
+ terrain.add_gizmo(region_gizmo)
+ terrain.set_plugin(self)
+
+ # Connect to new Assets resource
+ if not terrain.assets_changed.is_connected(asset_dock.update_assets):
+ terrain.assets_changed.connect(asset_dock.update_assets)
+ asset_dock.update_assets()
+ # Connect to new Storage resource
+ if not terrain.storage_changed.is_connected(_load_storage):
+ terrain.storage_changed.connect(_load_storage)
+ _load_storage()
+ else:
+ _clear()
+
+ if is_instance_valid(_last_terrain) and _last_terrain.is_inside_tree():
+ if p_object is NavigationRegion3D:
+ nav_region = p_object
+ else:
+ nav_region = null
+
+
+func _make_visible(p_visible: bool, p_redraw: bool = false) -> void:
+ visible = p_visible
+ ui.set_visible(visible)
+ update_region_grid()
+ asset_dock.update_dock(visible)
+
+
+func _clear() -> void:
+ if is_terrain_valid():
+ terrain.storage_changed.disconnect(_load_storage)
+
+ terrain.clear_gizmos()
+ terrain = null
+ editor.set_terrain(null)
+
+ ui.clear_picking()
+
+ region_gizmo.clear()
+
+
+func _forward_3d_gui_input(p_viewport_camera: Camera3D, p_event: InputEvent) -> int:
+ if not is_terrain_valid():
+ return AFTER_GUI_INPUT_PASS
+
+ ## Track negative input (CTRL)
+ if p_event is InputEventKey and not p_event.echo and p_event.keycode == KEY_CTRL:
+ if p_event.is_pressed():
+ _negative_input = true
+ _prev_enable_state = int(ui.toolbar_settings.get_setting("enable"))
+ ui.toolbar_settings.set_setting("enable", false)
+ else:
+ _negative_input = false
+ ui.toolbar_settings.set_setting("enable", bool(_prev_enable_state))
+ _prev_enable_state = -1
+
+ ## Handle mouse movement
+ if p_event is InputEventMouseMotion:
+ if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
+ return AFTER_GUI_INPUT_PASS
+
+ if _prev_enable_state >= 0 and not Input.is_key_pressed(KEY_CTRL):
+ _negative_input = false
+ ui.toolbar_settings.set_setting("enable", bool(_prev_enable_state))
+ _prev_enable_state = -1
+
+ ## Setup for active camera & viewport
+
+ # Snap terrain to current camera
+ terrain.set_camera(p_viewport_camera)
+
+ # Detect if viewport is set to half_resolution
+ # Structure is: Node3DEditorViewportContainer/Node3DEditorViewport(4)/SubViewportContainer/SubViewport/Camera3D
+ var editor_vpc: SubViewportContainer = p_viewport_camera.get_parent().get_parent()
+ var full_resolution: bool = false if editor_vpc.stretch_shrink == 2 else true
+
+ ## Get mouse location on terrain
+
+ # Project 2D mouse position to 3D position and direction
+ var mouse_pos: Vector2 = p_event.position if full_resolution else p_event.position/2
+ var camera_pos: Vector3 = p_viewport_camera.project_ray_origin(mouse_pos)
+ var camera_dir: Vector3 = p_viewport_camera.project_ray_normal(mouse_pos)
+
+ # If region tool, grab mouse position without considering height
+ if editor.get_tool() == Terrain3DEditor.REGION:
+ var t = -Vector3(0, 1, 0).dot(camera_pos) / Vector3(0, 1, 0).dot(camera_dir)
+ mouse_global_position = (camera_pos + t * camera_dir)
+ else:
+ # Else look for intersection with terrain
+ var intersection_point: Vector3 = terrain.get_intersection(camera_pos, camera_dir)
+ if intersection_point.z > 3.4e38 or is_nan(intersection_point.z): # max double or nan
+ return AFTER_GUI_INPUT_STOP
+ mouse_global_position = intersection_point
+
+ ## Update decal
+ ui.decal.global_position = mouse_global_position
+ ui.decal.albedo_mix = 1.0
+ if ui.decal_timer.is_stopped():
+ ui.update_decal()
+ else:
+ ui.decal_timer.start()
+
+ ## Update region highlight
+ var region_size = terrain.get_storage().get_region_size()
+ var region_position: Vector2 = ( Vector2(mouse_global_position.x, mouse_global_position.z) \
+ / (region_size * terrain.get_mesh_vertex_spacing()) ).floor()
+ if current_region_position != region_position:
+ current_region_position = region_position
+ update_region_grid()
+
+ if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and editor.is_operating():
+ editor.operate(mouse_global_position, p_viewport_camera.rotation.y)
+ return AFTER_GUI_INPUT_STOP
+
+ elif p_event is InputEventMouseButton:
+ ui.update_decal()
+
+ if p_event.get_button_index() == MOUSE_BUTTON_LEFT:
+ if p_event.is_pressed():
+ if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
+ return AFTER_GUI_INPUT_STOP
+
+ # If picking
+ if ui.is_picking():
+ ui.pick(mouse_global_position)
+ if not ui.operation_builder or not ui.operation_builder.is_ready():
+ return AFTER_GUI_INPUT_STOP
+
+ # If adjusting regions
+ if editor.get_tool() == Terrain3DEditor.REGION:
+ # Skip regions that already exist or don't
+ var has_region: bool = terrain.get_storage().has_region(mouse_global_position)
+ var op: int = editor.get_operation()
+ if ( has_region and op == Terrain3DEditor.ADD) or \
+ ( not has_region and op == Terrain3DEditor.SUBTRACT ):
+ return AFTER_GUI_INPUT_STOP
+
+ # If an automatic operation is ready to go (e.g. gradient)
+ if ui.operation_builder and ui.operation_builder.is_ready():
+ ui.operation_builder.apply_operation(editor, mouse_global_position, p_viewport_camera.rotation.y)
+ return AFTER_GUI_INPUT_STOP
+
+ # Mouse clicked, start editing
+ editor.start_operation(mouse_global_position)
+ editor.operate(mouse_global_position, p_viewport_camera.rotation.y)
+ return AFTER_GUI_INPUT_STOP
+
+ elif editor.is_operating():
+ # Mouse released, save undo data
+ editor.stop_operation()
+ return AFTER_GUI_INPUT_STOP
+
+ return AFTER_GUI_INPUT_PASS
+
+
+func _load_storage() -> void:
+ if terrain:
+ update_region_grid()
+
+
+func update_region_grid() -> void:
+ if not region_gizmo:
+ return
+
+ region_gizmo.set_hidden(not visible)
+
+ if is_terrain_valid():
+ region_gizmo.show_rect = editor.get_tool() == Terrain3DEditor.REGION
+ region_gizmo.use_secondary_color = editor.get_operation() == Terrain3DEditor.SUBTRACT
+ region_gizmo.region_position = current_region_position
+ region_gizmo.region_size = terrain.get_storage().get_region_size() * terrain.get_mesh_vertex_spacing()
+ region_gizmo.grid = terrain.get_storage().get_region_offsets()
+
+ terrain.update_gizmos()
+ return
+
+ region_gizmo.show_rect = false
+ region_gizmo.region_size = 1024
+ region_gizmo.grid = [Vector2i.ZERO]
+
+
+func _on_scene_changed(scene_root: Node) -> void:
+ if not scene_root:
+ return
+
+ for node in scene_root.find_children("", "Terrain3DObjects"):
+ node.editor_setup(self)
+
+ asset_dock.update_assets()
+ await get_tree().create_timer(2).timeout
+ asset_dock.update_thumbnails()
+
+
+func is_terrain_valid(p_terrain: Terrain3D = null) -> bool:
+ var t: Terrain3D
+ if p_terrain:
+ t = p_terrain
+ else:
+ t = terrain
+ if is_instance_valid(t) and t.is_inside_tree() and t.get_storage():
+ return true
+ return false
+
+
+func is_selected() -> bool:
+ var selected: Array[Node] = get_editor_interface().get_selection().get_selected_nodes()
+ for node in selected:
+ if node.get_instance_id() == _last_terrain.get_instance_id():
+ return true
+
+ return false
+
+
+func select_terrain() -> void:
+ if is_instance_valid(_last_terrain) and is_terrain_valid(_last_terrain) and not is_selected():
+ var es: EditorSelection = get_editor_interface().get_selection()
+ es.clear()
+ es.add_node(_last_terrain)
diff --git a/addons/terrain_3d/extras/import_sgt.gd b/addons/terrain_3d/extras/import_sgt.gd
new file mode 100644
index 0000000..b8b45aa
--- /dev/null
+++ b/addons/terrain_3d/extras/import_sgt.gd
@@ -0,0 +1,41 @@
+## Import From SimpleGrassTextured
+#
+# This script demonstrates how to import transforms from SimpleGrassTextured. To use it:
+#
+# 1. Setup the mesh asset you wish to use in the asset dock.
+# 1. Select your Terrain3D node.
+# 1. In the inspector, click Script (very bottom) and Quick Load import_sgt.gd.
+# 1. At the very top, assign your SimpleGrassTextured node.
+# 1. Input the desired mesh asset ID.
+# 1. Click import. The output window and console will report when finished.
+# 1. Clear the script from your Terrain3D node, and save your scene.
+#
+# The instance transforms are now stored in your Storage resource.
+#
+# Use clear_instances to erase all instances that match the assign_mesh_id.
+#
+# The add_transforms function (called by add_multimesh) applies the height_offset specified in the
+# Terrain3DMeshAsset.
+# Once the transforms are imported, you can reassign any mesh you like into this mesh slot.
+
+@tool
+extends Terrain3D
+
+@export var simple_grass_textured: MultiMeshInstance3D
+@export var assign_mesh_id: int
+@export var import: bool = false : set = import_sgt
+@export var clear_instances: bool = false : set = clear_multimeshes
+
+
+func clear_multimeshes(value: bool) -> void:
+ get_instancer().clear_by_mesh(assign_mesh_id)
+
+
+func import_sgt(value: bool) -> void:
+ var sgt_mm: MultiMesh = simple_grass_textured.multimesh
+ var global_xform: Transform3D = simple_grass_textured.global_transform
+ print("Starting to import %d instances from SimpleGrassTextured using mesh id %d" % [ sgt_mm.instance_count, assign_mesh_id])
+ var time: int = Time.get_ticks_msec()
+ get_instancer().add_multimesh(assign_mesh_id, sgt_mm, simple_grass_textured.global_transform)
+ print("Import complete in %.2f seconds" % [ float(Time.get_ticks_msec() - time)/1000. ])
+
diff --git a/addons/terrain_3d/extras/minimum.gdshader b/addons/terrain_3d/extras/minimum.gdshader
new file mode 100644
index 0000000..1cedd32
--- /dev/null
+++ b/addons/terrain_3d/extras/minimum.gdshader
@@ -0,0 +1,146 @@
+// This shader is the minimum needed to allow the terrain to function, without any texturing.
+
+shader_type spatial;
+render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx;
+
+// Private uniforms
+uniform float _region_size = 1024.0;
+uniform float _region_texel_size = 0.0009765625; // = 1/1024
+uniform float _mesh_vertex_spacing = 1.0;
+uniform float _mesh_vertex_density = 1.0; // = 1/_mesh_vertex_spacing
+uniform int _region_map_size = 16;
+uniform int _region_map[256];
+uniform vec2 _region_offsets[256];
+uniform sampler2DArray _height_maps : repeat_disable;
+uniform usampler2DArray _control_maps : repeat_disable;
+uniform sampler2DArray _color_maps : source_color, filter_linear_mipmap_anisotropic, repeat_disable;
+uniform sampler2DArray _texture_array_albedo : source_color, filter_linear_mipmap_anisotropic, repeat_enable;
+uniform sampler2DArray _texture_array_normal : hint_normal, filter_linear_mipmap_anisotropic, repeat_enable;
+
+uniform float _texture_uv_scale_array[32];
+uniform float _texture_uv_rotation_array[32];
+uniform vec4 _texture_color_array[32];
+uniform uint _background_mode = 1u; // NONE = 0, FLAT = 1, NOISE = 2
+uniform uint _mouse_layer = 0x80000000u; // Layer 32
+
+varying flat vec2 v_uv_offset;
+varying flat vec2 v_uv2_offset;
+
+////////////////////////
+// Vertex
+////////////////////////
+
+// Takes in UV world space coordinates, returns ivec3 with:
+// XY: (0 to _region_size) coordinates within a region
+// Z: layer index used for texturearrays, -1 if not in a region
+ivec3 get_region_uv(vec2 uv) {
+ uv *= _region_texel_size;
+ ivec2 pos = ivec2(floor(uv)) + (_region_map_size / 2);
+ int bounds = int(pos.x>=0 && pos.x<_region_map_size && pos.y>=0 && pos.y<_region_map_size);
+ int layer_index = _region_map[ pos.y * _region_map_size + pos.x ] * bounds - 1;
+ return ivec3(ivec2((uv - _region_offsets[layer_index]) * _region_size), layer_index);
+}
+
+// Takes in UV2 region space coordinates, returns vec3 with:
+// XY: (0 to 1) coordinates within a region
+// Z: layer index used for texturearrays, -1 if not in a region
+vec3 get_region_uv2(vec2 uv) {
+ // Vertex function added half a texel to UV2, to center the UV's. vertex(), fragment() and get_height()
+ // call this with reclaimed versions of UV2, so to keep the last row/column within the correct
+ // window, take back the half pixel before the floor().
+ ivec2 pos = ivec2(floor(uv - vec2(_region_texel_size * 0.5))) + (_region_map_size / 2);
+ int bounds = int(pos.x>=0 && pos.x<_region_map_size && pos.y>=0 && pos.y<_region_map_size);
+ int layer_index = _region_map[ pos.y * _region_map_size + pos.x ] * bounds - 1;
+ // The return value is still texel-centered.
+ return vec3(uv - _region_offsets[layer_index], float(layer_index));
+}
+
+// 1 lookup
+float get_height(vec2 uv) {
+ highp float height = 0.0;
+ vec3 region = get_region_uv2(uv);
+ if (region.z >= 0.) {
+ height = texture(_height_maps, region).r;
+ }
+ return height;
+}
+
+void vertex() {
+ // Get vertex of flat plane in world coordinates and set world UV
+ vec3 vertex = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
+
+ // UV coordinates in world space. Values are 0 to _region_size within regions
+ UV = round(vertex.xz * _mesh_vertex_density);
+
+ // Discard vertices for Holes. 1 lookup
+ ivec3 region = get_region_uv(UV);
+ uint control = texelFetch(_control_maps, region, 0).r;
+ bool hole = bool(control >>2u & 0x1u);
+ // Show holes to all cameras except mouse camera (on exactly 1 layer)
+ if ( !(CAMERA_VISIBLE_LAYERS == _mouse_layer) &&
+ (hole || (_background_mode == 0u && region.z < 0)) ) {
+ VERTEX.x = 0./0.;
+ } else {
+ // UV coordinates in region space + texel offset. Values are 0 to 1 within regions
+ UV2 = (UV + vec2(0.5)) * _region_texel_size;
+
+ // Get final vertex location and save it
+ VERTEX.y = get_height(UV2);
+ }
+
+ // Transform UVs to local to avoid poor precision during varying interpolation.
+ v_uv_offset = MODEL_MATRIX[3].xz * _mesh_vertex_density;
+ UV -= v_uv_offset;
+ v_uv2_offset = v_uv_offset * _region_texel_size;
+ UV2 -= v_uv2_offset;
+}
+
+////////////////////////
+// Fragment
+////////////////////////
+
+// 3 lookups
+vec3 get_normal(vec2 uv, out vec3 tangent, out vec3 binormal) {
+ // Get the height of the current vertex
+ float height = get_height(uv);
+
+ // Get the heights to the right and in front, but because of hardware
+ // interpolation on the edges of the heightmaps, the values are off
+ // causing the normal map to look weird. So, near the edges of the map
+ // get the heights to the left or behind instead. Hacky solution that
+ // reduces the artifact, but doesn't fix it entirely. See #185.
+ float u, v;
+ if(mod(uv.y*_region_size, _region_size) > _region_size-2.) {
+ v = get_height(uv + vec2(0, -_region_texel_size)) - height;
+ } else {
+ v = height - get_height(uv + vec2(0, _region_texel_size));
+ }
+ if(mod(uv.x*_region_size, _region_size) > _region_size-2.) {
+ u = get_height(uv + vec2(-_region_texel_size, 0)) - height;
+ } else {
+ u = height - get_height(uv + vec2(_region_texel_size, 0));
+ }
+
+ vec3 normal = vec3(u, _mesh_vertex_spacing, v);
+ normal = normalize(normal);
+ tangent = cross(normal, vec3(0, 0, 1));
+ binormal = cross(normal, tangent);
+ return normal;
+}
+
+void fragment() {
+ // Recover UVs
+ vec2 uv = UV + v_uv_offset;
+ vec2 uv2 = UV2 + v_uv2_offset;
+
+ // Calculate Terrain Normals. 4 lookups
+ vec3 w_tangent, w_binormal;
+ vec3 w_normal = get_normal(uv2, w_tangent, w_binormal);
+ NORMAL = mat3(VIEW_MATRIX) * w_normal;
+ TANGENT = mat3(VIEW_MATRIX) * w_tangent;
+ BINORMAL = mat3(VIEW_MATRIX) * w_binormal;
+
+ // Apply PBR
+ ALBEDO=vec3(.2);
+}
+
diff --git a/addons/terrain_3d/extras/project_on_terrain3d.gd b/addons/terrain_3d/extras/project_on_terrain3d.gd
new file mode 100644
index 0000000..976fd4f
--- /dev/null
+++ b/addons/terrain_3d/extras/project_on_terrain3d.gd
@@ -0,0 +1,90 @@
+# This script is an addon for HungryProton's Scatter https://github.com/HungryProton/scatter
+# It provides a `Project on Terrain3D` modifier, which allows Scatter
+# to detect the terrain height from Terrain3D without using collision.
+# Copy this file into /addons/proton_scatter/src/modifiers
+# Then uncomment everything below
+# In the editor, add this modifier to Scatter, then set your Terrain3D node
+
+# This script is an addon for HungryProton's Scatter https://github.com/HungryProton/scatter
+# It allows Scatter to detect the terrain height from Terrain3D
+# Copy this file into /addons/proton_scatter/src/modifiers
+# Then uncomment everything below (select, press CTRL+K)
+# In the editor, add this modifier, then set your Terrain3D node
+
+#@tool
+#extends "base_modifier.gd"
+#
+#
+#signal projection_completed
+#
+#
+#@export var terrain_node : NodePath
+#@export var align_with_collision_normal := false
+#
+#var _terrain: Terrain3D
+#
+#
+#func _init() -> void:
+ #display_name = "Project On Terrain3D"
+ #category = "Edit"
+ #can_restrict_height = false
+ #global_reference_frame_available = true
+ #local_reference_frame_available = true
+ #individual_instances_reference_frame_available = true
+ #use_global_space_by_default()
+#
+ #documentation.add_paragraph(
+ #"This is a duplicate of `Project on Colliders` that queries the terrain system
+ #for height and sets the transform height appropriately.
+#
+ #This modifier must have terrain_node set to a Terrain3D node.")
+#
+ #var p := documentation.add_parameter("Terrain Node")
+ #p.set_type("NodePath")
+ #p.set_description("Set your Terrain3D node.")
+ #
+ #p = documentation.add_parameter("Align with collision normal")
+ #p.set_type("bool")
+ #p.set_description(
+ #"Rotate the transform to align it with the collision normal in case
+ #the ray cast hit a collider.")
+#
+#
+#func _process_transforms(transforms, domain, _seed) -> void:
+ #if transforms.is_empty():
+ #return
+#
+ #if terrain_node:
+ #_terrain = domain.get_root().get_node_or_null(terrain_node)
+#
+ #if not _terrain:
+ #warning += """No Terrain3D node found"""
+ #return
+#
+ #if not _terrain.storage:
+ #warning += """Terrain3D storage is not initialized"""
+ #return
+#
+ ## Get global transform
+ #var gt: Transform3D = domain.get_global_transform()
+ #var gt_inverse := gt.affine_inverse()
+ #for i in transforms.list.size():
+ #var location: Vector3 = (gt * transforms.list[i]).origin
+ #var height: float = _terrain.storage.get_height(location)
+ #var normal: Vector3 = _terrain.storage.get_normal(location)
+ #
+ #if align_with_collision_normal and not is_nan(normal.x):
+ #transforms.list[i].basis.y = normal
+ #transforms.list[i].basis.x = -transforms.list[i].basis.z.cross(normal)
+ #transforms.list[i].basis = transforms.list[i].basis.orthonormalized()
+#
+ #transforms.list[i].origin.y = gt.origin.y if is_nan(height) else height - gt.origin.y
+#
+ #if transforms.is_empty():
+ #warning += """Every point has been removed. Possible reasons include: \n
+ #+ No collider is close enough to the shapes.
+ #+ Ray length is too short.
+ #+ Ray direction is incorrect.
+ #+ Collision mask is not set properly.
+ #+ Max slope is too low.
+ #"""
diff --git a/addons/terrain_3d/icons/autoshader.svg b/addons/terrain_3d/icons/autoshader.svg
new file mode 100644
index 0000000..5e6ee1a
--- /dev/null
+++ b/addons/terrain_3d/icons/autoshader.svg
@@ -0,0 +1,194 @@
+
+
diff --git a/addons/terrain_3d/icons/autoshader.svg.import b/addons/terrain_3d/icons/autoshader.svg.import
new file mode 100644
index 0000000..1551553
--- /dev/null
+++ b/addons/terrain_3d/icons/autoshader.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdwolwswwy8wr"
+path="res://.godot/imported/autoshader.svg-9998e61bbc6afd5b134b767acd17a425.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/autoshader.svg"
+dest_files=["res://.godot/imported/autoshader.svg-9998e61bbc6afd5b134b767acd17a425.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/color_paint.svg b/addons/terrain_3d/icons/color_paint.svg
new file mode 100644
index 0000000..317b742
--- /dev/null
+++ b/addons/terrain_3d/icons/color_paint.svg
@@ -0,0 +1,175 @@
+
+
diff --git a/addons/terrain_3d/icons/color_paint.svg.import b/addons/terrain_3d/icons/color_paint.svg.import
new file mode 100644
index 0000000..56d0d5d
--- /dev/null
+++ b/addons/terrain_3d/icons/color_paint.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://krrmpalen8xu"
+path="res://.godot/imported/color_paint.svg-2a416ebf35da04135017e5c6ef53ea57.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/color_paint.svg"
+dest_files=["res://.godot/imported/color_paint.svg-2a416ebf35da04135017e5c6ef53ea57.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_add.svg b/addons/terrain_3d/icons/height_add.svg
new file mode 100644
index 0000000..299a1b8
--- /dev/null
+++ b/addons/terrain_3d/icons/height_add.svg
@@ -0,0 +1,28 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_add.svg.import b/addons/terrain_3d/icons/height_add.svg.import
new file mode 100644
index 0000000..e1bbbad
--- /dev/null
+++ b/addons/terrain_3d/icons/height_add.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bcmbqryggekg1"
+path="res://.godot/imported/height_add.svg-9e680ce71fa4c541748e081b99167369.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_add.svg"
+dest_files=["res://.godot/imported/height_add.svg-9e680ce71fa4c541748e081b99167369.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_div.svg b/addons/terrain_3d/icons/height_div.svg
new file mode 100644
index 0000000..79a6111
--- /dev/null
+++ b/addons/terrain_3d/icons/height_div.svg
@@ -0,0 +1,196 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_div.svg.import b/addons/terrain_3d/icons/height_div.svg.import
new file mode 100644
index 0000000..c894274
--- /dev/null
+++ b/addons/terrain_3d/icons/height_div.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://danh7tb2v6rx7"
+path="res://.godot/imported/height_div.svg-449a465f9fdd11ab59f2f1c78815408c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_div.svg"
+dest_files=["res://.godot/imported/height_div.svg-449a465f9fdd11ab59f2f1c78815408c.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_flat.svg b/addons/terrain_3d/icons/height_flat.svg
new file mode 100644
index 0000000..98973fe
--- /dev/null
+++ b/addons/terrain_3d/icons/height_flat.svg
@@ -0,0 +1,28 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_flat.svg.import b/addons/terrain_3d/icons/height_flat.svg.import
new file mode 100644
index 0000000..fd0e685
--- /dev/null
+++ b/addons/terrain_3d/icons/height_flat.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crj0xfyiyr45u"
+path="res://.godot/imported/height_flat.svg-be726a006bf06e05a7a8867510f3996e.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_flat.svg"
+dest_files=["res://.godot/imported/height_flat.svg-be726a006bf06e05a7a8867510f3996e.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_mul.svg b/addons/terrain_3d/icons/height_mul.svg
new file mode 100644
index 0000000..ef4f92e
--- /dev/null
+++ b/addons/terrain_3d/icons/height_mul.svg
@@ -0,0 +1,201 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_mul.svg.import b/addons/terrain_3d/icons/height_mul.svg.import
new file mode 100644
index 0000000..b20aadc
--- /dev/null
+++ b/addons/terrain_3d/icons/height_mul.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bu3q0645kb3el"
+path="res://.godot/imported/height_mul.svg-2dca20fa42a85408713e9bfe411f3c79.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_mul.svg"
+dest_files=["res://.godot/imported/height_mul.svg-2dca20fa42a85408713e9bfe411f3c79.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_slope.svg b/addons/terrain_3d/icons/height_slope.svg
new file mode 100644
index 0000000..fe2903d
--- /dev/null
+++ b/addons/terrain_3d/icons/height_slope.svg
@@ -0,0 +1,105 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_slope.svg.import b/addons/terrain_3d/icons/height_slope.svg.import
new file mode 100644
index 0000000..ed55b14
--- /dev/null
+++ b/addons/terrain_3d/icons/height_slope.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://0cd7so4kw7da"
+path="res://.godot/imported/height_slope.svg-e20540c5538d0c57a9d229a772b3d1b3.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_slope.svg"
+dest_files=["res://.godot/imported/height_slope.svg-e20540c5538d0c57a9d229a772b3d1b3.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_smooth.svg b/addons/terrain_3d/icons/height_smooth.svg
new file mode 100644
index 0000000..81154c3
--- /dev/null
+++ b/addons/terrain_3d/icons/height_smooth.svg
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_smooth.svg.import b/addons/terrain_3d/icons/height_smooth.svg.import
new file mode 100644
index 0000000..eef9e53
--- /dev/null
+++ b/addons/terrain_3d/icons/height_smooth.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://chrbx4xnxyiel"
+path="res://.godot/imported/height_smooth.svg-d8fc43572f5984eef64c886a49988c06.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_smooth.svg"
+dest_files=["res://.godot/imported/height_smooth.svg-d8fc43572f5984eef64c886a49988c06.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/height_sub.svg b/addons/terrain_3d/icons/height_sub.svg
new file mode 100644
index 0000000..bb0d2a7
--- /dev/null
+++ b/addons/terrain_3d/icons/height_sub.svg
@@ -0,0 +1,28 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/height_sub.svg.import b/addons/terrain_3d/icons/height_sub.svg.import
new file mode 100644
index 0000000..4dc17eb
--- /dev/null
+++ b/addons/terrain_3d/icons/height_sub.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://mo3hnbk3ffjs"
+path="res://.godot/imported/height_sub.svg-1a14a9bb856f3db0faa02dba3c807b50.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/height_sub.svg"
+dest_files=["res://.godot/imported/height_sub.svg-1a14a9bb856f3db0faa02dba3c807b50.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/holes.svg b/addons/terrain_3d/icons/holes.svg
new file mode 100644
index 0000000..da639d9
--- /dev/null
+++ b/addons/terrain_3d/icons/holes.svg
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/holes.svg.import b/addons/terrain_3d/icons/holes.svg.import
new file mode 100644
index 0000000..8117195
--- /dev/null
+++ b/addons/terrain_3d/icons/holes.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bsmaxekrmnuy2"
+path="res://.godot/imported/holes.svg-a7cb97bb50d7879cd274646e207b9213.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/holes.svg"
+dest_files=["res://.godot/imported/holes.svg-a7cb97bb50d7879cd274646e207b9213.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/layers.svg b/addons/terrain_3d/icons/layers.svg
new file mode 100644
index 0000000..5c9c4c9
--- /dev/null
+++ b/addons/terrain_3d/icons/layers.svg
@@ -0,0 +1,102 @@
+
+
diff --git a/addons/terrain_3d/icons/layers.svg.import b/addons/terrain_3d/icons/layers.svg.import
new file mode 100644
index 0000000..559cd21
--- /dev/null
+++ b/addons/terrain_3d/icons/layers.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cs1la1mashf2e"
+path="res://.godot/imported/layers.svg-4a679bb626c5179d3773f33e77e4a5e4.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/layers.svg"
+dest_files=["res://.godot/imported/layers.svg-4a679bb626c5179d3773f33e77e4a5e4.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/multimesh.svg b/addons/terrain_3d/icons/multimesh.svg
new file mode 100644
index 0000000..a62e5f9
--- /dev/null
+++ b/addons/terrain_3d/icons/multimesh.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/addons/terrain_3d/icons/multimesh.svg.import b/addons/terrain_3d/icons/multimesh.svg.import
new file mode 100644
index 0000000..1493feb
--- /dev/null
+++ b/addons/terrain_3d/icons/multimesh.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cjlcl5lf20ve0"
+path="res://.godot/imported/multimesh.svg-5487b93b04ddbaae37b5d3e91f10750b.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/multimesh.svg"
+dest_files=["res://.godot/imported/multimesh.svg-5487b93b04ddbaae37b5d3e91f10750b.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/navigation.svg b/addons/terrain_3d/icons/navigation.svg
new file mode 100644
index 0000000..1056202
--- /dev/null
+++ b/addons/terrain_3d/icons/navigation.svg
@@ -0,0 +1,42 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/navigation.svg.import b/addons/terrain_3d/icons/navigation.svg.import
new file mode 100644
index 0000000..d8ac263
--- /dev/null
+++ b/addons/terrain_3d/icons/navigation.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://f3po5pogkv2b"
+path="res://.godot/imported/navigation.svg-1e4cf210c589be8d2911c522d4a17d78.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/navigation.svg"
+dest_files=["res://.godot/imported/navigation.svg-1e4cf210c589be8d2911c522d4a17d78.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/picker.svg b/addons/terrain_3d/icons/picker.svg
new file mode 100644
index 0000000..0ce7af4
--- /dev/null
+++ b/addons/terrain_3d/icons/picker.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/addons/terrain_3d/icons/picker.svg.import b/addons/terrain_3d/icons/picker.svg.import
new file mode 100644
index 0000000..4a7369e
--- /dev/null
+++ b/addons/terrain_3d/icons/picker.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c11ip32w7ln4v"
+path="res://.godot/imported/picker.svg-0ed48f8d7e66014d2aac4b303bc65df6.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/picker.svg"
+dest_files=["res://.godot/imported/picker.svg-0ed48f8d7e66014d2aac4b303bc65df6.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/picker_checked.svg b/addons/terrain_3d/icons/picker_checked.svg
new file mode 100644
index 0000000..653d57e
--- /dev/null
+++ b/addons/terrain_3d/icons/picker_checked.svg
@@ -0,0 +1,43 @@
+
+
diff --git a/addons/terrain_3d/icons/picker_checked.svg.import b/addons/terrain_3d/icons/picker_checked.svg.import
new file mode 100644
index 0000000..ff53b15
--- /dev/null
+++ b/addons/terrain_3d/icons/picker_checked.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bg8x6o32ggt88"
+path="res://.godot/imported/picker_checked.svg-81f35b6ae38bccc8aa9e7ae22b530168.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/picker_checked.svg"
+dest_files=["res://.godot/imported/picker_checked.svg-81f35b6ae38bccc8aa9e7ae22b530168.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/region_add.svg b/addons/terrain_3d/icons/region_add.svg
new file mode 100644
index 0000000..56d7c92
--- /dev/null
+++ b/addons/terrain_3d/icons/region_add.svg
@@ -0,0 +1,95 @@
+
+
diff --git a/addons/terrain_3d/icons/region_add.svg.import b/addons/terrain_3d/icons/region_add.svg.import
new file mode 100644
index 0000000..e50c30b
--- /dev/null
+++ b/addons/terrain_3d/icons/region_add.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c0tn453fsckv5"
+path="res://.godot/imported/region_add.svg-a05dc161a452dd3e024f9835a737d9f0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/region_add.svg"
+dest_files=["res://.godot/imported/region_add.svg-a05dc161a452dd3e024f9835a737d9f0.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/region_remove.svg b/addons/terrain_3d/icons/region_remove.svg
new file mode 100644
index 0000000..315657d
--- /dev/null
+++ b/addons/terrain_3d/icons/region_remove.svg
@@ -0,0 +1,102 @@
+
+
diff --git a/addons/terrain_3d/icons/region_remove.svg.import b/addons/terrain_3d/icons/region_remove.svg.import
new file mode 100644
index 0000000..6ded856
--- /dev/null
+++ b/addons/terrain_3d/icons/region_remove.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cbpo5eamf3bx2"
+path="res://.godot/imported/region_remove.svg-5710e8aeb34f1eaa06e637634f4a7d16.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/region_remove.svg"
+dest_files=["res://.godot/imported/region_remove.svg-5710e8aeb34f1eaa06e637634f4a7d16.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/terrain3d.svg b/addons/terrain_3d/icons/terrain3d.svg
new file mode 100644
index 0000000..ca8c661
--- /dev/null
+++ b/addons/terrain_3d/icons/terrain3d.svg
@@ -0,0 +1,153 @@
+
+
diff --git a/addons/terrain_3d/icons/terrain3d.svg.import b/addons/terrain_3d/icons/terrain3d.svg.import
new file mode 100644
index 0000000..c077de1
--- /dev/null
+++ b/addons/terrain_3d/icons/terrain3d.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnsydn4jkyeyn"
+path="res://.godot/imported/terrain3d.svg-eb45756f1a003759fda81eaa1db10769.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/terrain3d.svg"
+dest_files=["res://.godot/imported/terrain3d.svg-eb45756f1a003759fda81eaa1db10769.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/texture_paint.svg b/addons/terrain_3d/icons/texture_paint.svg
new file mode 100644
index 0000000..908d3f4
--- /dev/null
+++ b/addons/terrain_3d/icons/texture_paint.svg
@@ -0,0 +1,151 @@
+
+
diff --git a/addons/terrain_3d/icons/texture_paint.svg.import b/addons/terrain_3d/icons/texture_paint.svg.import
new file mode 100644
index 0000000..8a09d92
--- /dev/null
+++ b/addons/terrain_3d/icons/texture_paint.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://duo8valena3a2"
+path="res://.godot/imported/texture_paint.svg-72da4fd2096377e625a8fe09cdacb0e4.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/texture_paint.svg"
+dest_files=["res://.godot/imported/texture_paint.svg-72da4fd2096377e625a8fe09cdacb0e4.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/texture_spray.svg b/addons/terrain_3d/icons/texture_spray.svg
new file mode 100644
index 0000000..bfc3e82
--- /dev/null
+++ b/addons/terrain_3d/icons/texture_spray.svg
@@ -0,0 +1,165 @@
+
+
diff --git a/addons/terrain_3d/icons/texture_spray.svg.import b/addons/terrain_3d/icons/texture_spray.svg.import
new file mode 100644
index 0000000..c4acc6f
--- /dev/null
+++ b/addons/terrain_3d/icons/texture_spray.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://16yfxe7xe703"
+path="res://.godot/imported/texture_spray.svg-326fee11cf418653e621bc222a470861.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/texture_spray.svg"
+dest_files=["res://.godot/imported/texture_spray.svg-326fee11cf418653e621bc222a470861.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/icons/wetness.svg b/addons/terrain_3d/icons/wetness.svg
new file mode 100644
index 0000000..90c3d03
--- /dev/null
+++ b/addons/terrain_3d/icons/wetness.svg
@@ -0,0 +1,41 @@
+
+
+
+
diff --git a/addons/terrain_3d/icons/wetness.svg.import b/addons/terrain_3d/icons/wetness.svg.import
new file mode 100644
index 0000000..9379330
--- /dev/null
+++ b/addons/terrain_3d/icons/wetness.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bcgg0srmqsh3n"
+path="res://.godot/imported/wetness.svg-9b2ddec096ab7734492b77b20c75c82b.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/terrain_3d/icons/wetness.svg"
+dest_files=["res://.godot/imported/wetness.svg-9b2ddec096ab7734492b77b20c75c82b.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
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/terrain_3d/plugin.cfg b/addons/terrain_3d/plugin.cfg
new file mode 100644
index 0000000..b738b1d
--- /dev/null
+++ b/addons/terrain_3d/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Terrain3D"
+description="A high performance, editable terrain system for Godot 4."
+author="Cory Petkovsek & Roope Palmroos"
+version="0.9.2"
+script="editor.gd"
diff --git a/addons/terrain_3d/src/asset_dock.gd b/addons/terrain_3d/src/asset_dock.gd
new file mode 100644
index 0000000..b4fea39
--- /dev/null
+++ b/addons/terrain_3d/src/asset_dock.gd
@@ -0,0 +1,832 @@
+@tool
+extends PanelContainer
+#class_name Terrain3DAssetDock
+
+signal confirmation_closed
+signal confirmation_confirmed
+signal confirmation_canceled
+
+const PS_DOCK_SLOT: String = "terrain3d/config/dock_slot"
+const PS_DOCK_TILE_SIZE: String = "terrain3d/config/dock_tile_size"
+const PS_DOCK_FLOATING: String = "terrain3d/config/dock_floating"
+const PS_DOCK_PINNED: String = "terrain3d/config/dock_always_on_top"
+const PS_DOCK_WINDOW_POSITION: String = "terrain3d/config/dock_window_position"
+const PS_DOCK_WINDOW_SIZE: String = "terrain3d/config/dock_window_size"
+
+var texture_list: ListContainer
+var mesh_list: ListContainer
+var _current_list: ListContainer
+var _last_thumb_update_time: int = 0
+const MAX_UPDATE_TIME: int = 1000
+
+var placement_opt: OptionButton
+var floating_btn: Button
+var pinned_btn: Button
+var size_slider: HSlider
+var box: BoxContainer
+var buttons: BoxContainer
+var textures_btn: Button
+var meshes_btn: Button
+var asset_container: ScrollContainer
+var confirm_dialog: ConfirmationDialog
+var _confirmed: bool = false
+
+# Used only for editor, so change to single visible/hiddden
+enum {
+ HIDDEN = -1,
+ SIDEBAR = 0,
+ BOTTOM = 1,
+ WINDOWED = 2,
+}
+var state: int = HIDDEN
+
+var window: Window
+var _godot_editor_window: Window # The main Godot Editor window
+var _godot_last_state: Window.Mode = Window.MODE_FULLSCREEN
+
+enum {
+ POS_LEFT_UL = 0,
+ POS_LEFT_BL = 1,
+ POS_LEFT_UR = 2,
+ POS_LEFT_BR = 3,
+ POS_RIGHT_UL = 4,
+ POS_RIGHT_BL = 5,
+ POS_RIGHT_UR = 6,
+ POS_RIGHT_BR = 7,
+ POS_BOTTOM = 8,
+ POS_MAX = 9,
+}
+var slot: int = POS_RIGHT_BR
+var _initialized: bool = false
+var plugin: EditorPlugin
+var editor_settings: EditorSettings
+
+
+func initialize(p_plugin: EditorPlugin) -> void:
+ if p_plugin:
+ plugin = p_plugin
+
+ # Get editor window. Structure is root:Window/EditorNode/Base Control
+ _godot_editor_window = plugin.get_editor_interface().get_base_control().get_parent().get_parent()
+ _godot_last_state = _godot_editor_window.mode
+
+ placement_opt = $Box/Buttons/PlacementOpt
+ pinned_btn = $Box/Buttons/Pinned
+ floating_btn = $Box/Buttons/Floating
+ floating_btn.owner = null
+ size_slider = $Box/Buttons/SizeSlider
+ size_slider.owner = null
+ box = $Box
+ buttons = $Box/Buttons
+ textures_btn = $Box/Buttons/TexturesBtn
+ meshes_btn = $Box/Buttons/MeshesBtn
+ asset_container = $Box/ScrollContainer
+
+ texture_list = ListContainer.new()
+ texture_list.plugin = plugin
+ texture_list.type = Terrain3DAssets.TYPE_TEXTURE
+ asset_container.add_child(texture_list)
+ mesh_list = ListContainer.new()
+ mesh_list.plugin = plugin
+ mesh_list.type = Terrain3DAssets.TYPE_MESH
+ mesh_list.visible = false
+ asset_container.add_child(mesh_list)
+ _current_list = texture_list
+
+ editor_settings = EditorInterface.get_editor_settings()
+ load_editor_settings()
+
+ # Connect signals
+ resized.connect(update_layout)
+ textures_btn.pressed.connect(_on_textures_pressed)
+ meshes_btn.pressed.connect(_on_meshes_pressed)
+ placement_opt.item_selected.connect(set_slot)
+ floating_btn.pressed.connect(make_dock_float)
+ pinned_btn.toggled.connect(_on_pin_changed)
+ pinned_btn.visible = false
+ size_slider.value_changed.connect(_on_slider_changed)
+ plugin.ui.toolbar.tool_changed.connect(_on_tool_changed)
+
+ meshes_btn.add_theme_font_size_override("font_size", 16 * EditorInterface.get_editor_scale())
+ textures_btn.add_theme_font_size_override("font_size", 16 * EditorInterface.get_editor_scale())
+
+ _initialized = true
+ update_dock(plugin.visible)
+ update_layout()
+
+
+func _ready() -> void:
+ if not _initialized:
+ return
+
+ # Setup styles
+ set("theme_override_styles/panel", get_theme_stylebox("panel", "Panel"))
+ # Avoid saving icon resources in tscn when editing w/ a tool script
+ if plugin.get_editor_interface().get_edited_scene_root() != self:
+ pinned_btn.icon = get_theme_icon("Pin", "EditorIcons")
+ pinned_btn.text = ""
+ floating_btn.icon = get_theme_icon("MakeFloating", "EditorIcons")
+ floating_btn.text = ""
+
+ update_thumbnails()
+ confirm_dialog = ConfirmationDialog.new()
+ add_child(confirm_dialog)
+ confirm_dialog.hide()
+ confirm_dialog.confirmed.connect(func(): _confirmed = true; \
+ emit_signal("confirmation_closed"); \
+ emit_signal("confirmation_confirmed") )
+ confirm_dialog.canceled.connect(func(): _confirmed = false; \
+ emit_signal("confirmation_closed"); \
+ emit_signal("confirmation_canceled") )
+
+
+func get_current_list() -> ListContainer:
+ return _current_list
+
+
+## Dock placement
+
+func set_slot(p_slot: int) -> void:
+ p_slot = clamp(p_slot, 0, POS_MAX-1)
+
+ if slot != p_slot:
+ slot = p_slot
+ placement_opt.selected = slot
+ save_editor_settings()
+ plugin.select_terrain()
+ update_dock(plugin.visible)
+
+
+func remove_dock(p_force: bool = false) -> void:
+ if state == SIDEBAR:
+ plugin.remove_control_from_docks(self)
+ state = HIDDEN
+
+ elif state == BOTTOM:
+ plugin.remove_control_from_bottom_panel(self)
+ state = HIDDEN
+
+ # If windowed and destination is not window or final exit, otherwise leave
+ elif state == WINDOWED and p_force:
+ if not window:
+ return
+ var parent: Node = get_parent()
+ if parent:
+ parent.remove_child(self)
+ _godot_editor_window.mouse_entered.disconnect(_on_godot_window_entered)
+ _godot_editor_window.focus_entered.disconnect(_on_godot_focus_entered)
+ _godot_editor_window.focus_exited.disconnect(_on_godot_focus_exited)
+ window.hide()
+ window.queue_free()
+ window = null
+ floating_btn.button_pressed = false
+ floating_btn.visible = true
+ pinned_btn.visible = false
+ placement_opt.visible = true
+ state = HIDDEN
+ update_dock(plugin.visible) # return window to side/bottom
+
+
+func update_dock(p_visible: bool) -> void:
+ update_assets()
+ if not _initialized:
+ return
+
+ if window:
+ return
+ elif floating_btn.button_pressed:
+ # No window, but floating button pressed, occurs when from editor settings
+ make_dock_float()
+ return
+
+ remove_dock()
+ # Add dock to new destination
+ # Sidebar
+ if slot < POS_BOTTOM:
+ state = SIDEBAR
+ plugin.add_control_to_dock(slot, self)
+ elif slot == POS_BOTTOM:
+ state = BOTTOM
+ plugin.add_control_to_bottom_panel(self, "Terrain3D")
+ if p_visible:
+ plugin.make_bottom_panel_item_visible(self)
+
+
+func update_layout() -> void:
+ if not _initialized:
+ return
+
+ # Detect if we have a new window from Make floating, grab it so we can free it properly
+ if not window and get_parent() and get_parent().get_parent() is Window:
+ window = get_parent().get_parent()
+ make_dock_float()
+ return # Will call this function again upon display
+
+ var size_parent: Control = size_slider.get_parent()
+ # Vertical layout in window / sidebar
+ if window or slot < POS_BOTTOM:
+ box.vertical = true
+ buttons.vertical = false
+
+ if size.x >= 500 and size_parent != buttons:
+ size_slider.reparent(buttons)
+ buttons.move_child(size_slider, 3)
+ elif size.x < 500 and size_parent != box:
+ size_slider.reparent(box)
+ box.move_child(size_slider, 1)
+ floating_btn.reparent(buttons)
+ buttons.move_child(floating_btn, 4)
+
+ # Wide layout on bottom bar
+ else:
+ size_slider.reparent(buttons)
+ buttons.move_child(size_slider, 3)
+ floating_btn.reparent(box)
+ box.vertical = false
+ buttons.vertical = true
+
+ save_editor_settings()
+
+
+func update_thumbnails() -> void:
+ if not is_instance_valid(plugin.terrain):
+ return
+ if _current_list.type == Terrain3DAssets.TYPE_MESH and \
+ Time.get_ticks_msec() - _last_thumb_update_time > MAX_UPDATE_TIME:
+ plugin.terrain.assets.create_mesh_thumbnails()
+ _last_thumb_update_time = Time.get_ticks_msec()
+ for mesh_asset in mesh_list.entries:
+ mesh_asset.queue_redraw()
+## Dock Button handlers
+
+
+func _on_pin_changed(toggled: bool) -> void:
+ if window:
+ window.always_on_top = pinned_btn.button_pressed
+ save_editor_settings()
+
+
+func _on_slider_changed(value: float) -> void:
+ if texture_list:
+ texture_list.set_entry_width(value)
+ if mesh_list:
+ mesh_list.set_entry_width(value)
+ save_editor_settings()
+
+
+func _on_textures_pressed() -> void:
+ _current_list = texture_list
+ texture_list.update_asset_list()
+ texture_list.visible = true
+ mesh_list.visible = false
+ textures_btn.button_pressed = true
+ meshes_btn.button_pressed = false
+ texture_list.set_selected_id(texture_list.selected_id)
+ plugin.get_editor_interface().edit_node(plugin.terrain)
+
+
+func _on_meshes_pressed() -> void:
+ _current_list = mesh_list
+ mesh_list.update_asset_list()
+ mesh_list.visible = true
+ texture_list.visible = false
+ meshes_btn.button_pressed = true
+ textures_btn.button_pressed = false
+ mesh_list.set_selected_id(mesh_list.selected_id)
+ plugin.get_editor_interface().edit_node(plugin.terrain)
+ update_thumbnails()
+
+
+func _on_tool_changed(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation) -> void:
+ if p_tool == Terrain3DEditor.INSTANCER:
+ _on_meshes_pressed()
+ elif p_tool == Terrain3DEditor.TEXTURE:
+ _on_textures_pressed()
+
+
+## Update Dock Contents
+
+
+func update_assets() -> void:
+ if not _initialized:
+ return
+
+ # Verify signals to individual lists
+ if plugin.is_terrain_valid() and plugin.terrain.assets:
+ if not plugin.terrain.assets.textures_changed.is_connected(texture_list.update_asset_list):
+ plugin.terrain.assets.textures_changed.connect(texture_list.update_asset_list)
+ if not plugin.terrain.assets.meshes_changed.is_connected(mesh_list.update_asset_list):
+ plugin.terrain.assets.meshes_changed.connect(mesh_list.update_asset_list)
+
+ _current_list.update_asset_list()
+
+## Window Management
+
+
+func make_dock_float() -> void:
+ # If already created (eg from editor Make Floating)
+ if not window:
+ remove_dock()
+ create_window()
+
+ state = WINDOWED
+ pinned_btn.visible = true
+ floating_btn.visible = false
+ placement_opt.visible = false
+ window.title = "Terrain3D Asset Dock"
+ window.always_on_top = pinned_btn.button_pressed
+ window.close_requested.connect(remove_dock.bind(true))
+ visible = true # Is hidden when pops off of bottom. ??
+ _godot_editor_window.grab_focus()
+
+
+func create_window() -> void:
+ window = Window.new()
+ window.wrap_controls = true
+ var mc := MarginContainer.new()
+ mc.set_anchors_preset(PRESET_FULL_RECT, false)
+ mc.add_child(self)
+ window.add_child(mc)
+ window.set_transient(false)
+ window.set_size(get_setting(PS_DOCK_WINDOW_SIZE, Vector2i(512, 512)))
+ window.set_position(get_setting(PS_DOCK_WINDOW_POSITION, Vector2i(704, 284)))
+ plugin.add_child(window)
+ window.show()
+ window.window_input.connect(_on_window_input)
+ window.focus_exited.connect(_on_window_focus_exited)
+ _godot_editor_window.mouse_entered.connect(_on_godot_window_entered)
+ _godot_editor_window.focus_entered.connect(_on_godot_focus_entered)
+ _godot_editor_window.focus_exited.connect(_on_godot_focus_exited)
+
+
+func _on_window_input(event: InputEvent) -> void:
+ # Capture CTRL+S when doc focused to save scene)
+ if event is InputEventKey and event.keycode == KEY_S and event.pressed and event.is_command_or_control_pressed():
+ save_editor_settings()
+ plugin.get_editor_interface().save_scene()
+
+
+func _on_window_focus_exited() -> void:
+ # Capture window position w/o other changes
+ save_editor_settings()
+
+
+func _on_godot_window_entered() -> void:
+ if is_instance_valid(window) and window.has_focus():
+ _godot_editor_window.grab_focus()
+
+
+func _on_godot_focus_entered() -> void:
+ # If asset dock is windowed, and Godot was minimized, and now is not, restore asset dock window
+ if is_instance_valid(window):
+ if _godot_last_state == Window.MODE_MINIMIZED and _godot_editor_window.mode != Window.MODE_MINIMIZED:
+ window.show()
+ _godot_last_state = _godot_editor_window.mode
+ _godot_editor_window.grab_focus()
+
+
+func _on_godot_focus_exited() -> void:
+ if is_instance_valid(window) and _godot_editor_window.mode == Window.MODE_MINIMIZED:
+ window.hide()
+ _godot_last_state = _godot_editor_window.mode
+
+
+## Manage Editor Settings
+
+
+func get_setting(p_str: String, p_default: Variant) -> Variant:
+ if editor_settings.has_setting(p_str):
+ return editor_settings.get_setting(p_str)
+ else:
+ return p_default
+
+
+func load_editor_settings() -> void:
+ floating_btn.button_pressed = get_setting(PS_DOCK_FLOATING, false)
+ pinned_btn.button_pressed = get_setting(PS_DOCK_PINNED, true)
+ size_slider.value = get_setting(PS_DOCK_TILE_SIZE, 83)
+ set_slot(get_setting(PS_DOCK_SLOT, POS_BOTTOM))
+ _on_slider_changed(size_slider.value)
+ # Window pos/size set on window creation in update_dock
+ update_dock(plugin.visible)
+
+
+func save_editor_settings() -> void:
+ if not _initialized:
+ return
+ editor_settings.set_setting(PS_DOCK_SLOT, slot)
+ editor_settings.set_setting(PS_DOCK_TILE_SIZE, size_slider.value)
+ editor_settings.set_setting(PS_DOCK_FLOATING, floating_btn.button_pressed)
+ editor_settings.set_setting(PS_DOCK_PINNED, pinned_btn.button_pressed)
+ if window:
+ editor_settings.set_setting(PS_DOCK_WINDOW_SIZE, window.size)
+ editor_settings.set_setting(PS_DOCK_WINDOW_POSITION, window.position)
+
+
+##############################################################
+## class ListContainer
+##############################################################
+
+
+class ListContainer extends Container:
+ var plugin: EditorPlugin
+ var type := Terrain3DAssets.TYPE_TEXTURE
+ var entries: Array[ListEntry]
+ var selected_id: int = 0
+ var height: float = 0
+ var width: float = 83
+ var focus_style: StyleBox
+
+
+ func _ready() -> void:
+ set_v_size_flags(SIZE_EXPAND_FILL)
+ set_h_size_flags(SIZE_EXPAND_FILL)
+ focus_style = get_theme_stylebox("focus", "Button").duplicate()
+ focus_style.set_border_width_all(2)
+ focus_style.set_border_color(Color(1, 1, 1, .67))
+
+
+ func clear() -> void:
+ for e in entries:
+ e.get_parent().remove_child(e)
+ e.queue_free()
+ entries.clear()
+
+
+ func update_asset_list() -> void:
+ clear()
+
+ # Grab terrain
+ var t: Terrain3D
+ if plugin.is_terrain_valid():
+ t = plugin.terrain
+ elif is_instance_valid(plugin._last_terrain) and plugin.is_terrain_valid(plugin._last_terrain):
+ t = plugin._last_terrain
+ else:
+ return
+
+ if not t.assets:
+ return
+
+ if type == Terrain3DAssets.TYPE_TEXTURE:
+ var texture_count: int = t.assets.get_texture_count()
+ for i in texture_count:
+ var texture: Terrain3DTextureAsset = t.assets.get_texture(i)
+ add_item(texture)
+ if texture_count < Terrain3DAssets.MAX_TEXTURES:
+ add_item()
+ else:
+ var mesh_count: int = t.assets.get_mesh_count()
+ for i in mesh_count:
+ var mesh: Terrain3DMeshAsset = t.assets.get_mesh_asset(i)
+ add_item(mesh, t.assets)
+ if mesh_count < Terrain3DAssets.MAX_MESHES:
+ add_item()
+ if selected_id >= mesh_count or selected_id < 0:
+ set_selected_id(0)
+
+
+ func add_item(p_resource: Resource = null, p_assets: Terrain3DAssets = null) -> void:
+ var entry: ListEntry = ListEntry.new()
+ entry.focus_style = focus_style
+ var id: int = entries.size()
+
+ entry.set_edited_resource(p_resource)
+ entry.hovered.connect(_on_resource_hovered.bind(id))
+ entry.selected.connect(set_selected_id.bind(id))
+ entry.inspected.connect(_on_resource_inspected)
+ entry.changed.connect(_on_resource_changed.bind(id))
+ entry.type = type
+ entry.asset_list = p_assets
+ add_child(entry)
+ entries.push_back(entry)
+
+ if p_resource:
+ entry.set_selected(id == selected_id)
+ if not p_resource.id_changed.is_connected(set_selected_after_swap):
+ p_resource.id_changed.connect(set_selected_after_swap)
+
+
+ func _on_resource_hovered(p_id: int):
+ if type == Terrain3DAssets.TYPE_MESH:
+ if plugin.terrain:
+ plugin.terrain.assets.create_mesh_thumbnails(p_id)
+
+
+ func set_selected_after_swap(p_type: Terrain3DAssets.AssetType, p_old_id: int, p_new_id: int) -> void:
+ set_selected_id(clamp(p_new_id, 0, entries.size() - 2))
+
+
+ func set_selected_id(p_id: int) -> void:
+ selected_id = p_id
+
+ for i in entries.size():
+ var entry: ListEntry = entries[i]
+ entry.set_selected(i == selected_id)
+
+ plugin.select_terrain()
+
+ # Select Paint tool if clicking a texture
+ if type == Terrain3DAssets.TYPE_TEXTURE and plugin.editor.get_tool() != Terrain3DEditor.TEXTURE:
+ var paint_btn: Button = plugin.ui.toolbar.get_node_or_null("PaintBaseTexture")
+ if paint_btn:
+ paint_btn.set_pressed(true)
+ plugin.ui._on_tool_changed(Terrain3DEditor.TEXTURE, Terrain3DEditor.REPLACE)
+
+ elif type == Terrain3DAssets.TYPE_MESH and plugin.editor.get_tool() != Terrain3DEditor.INSTANCER:
+ var instancer_btn: Button = plugin.ui.toolbar.get_node_or_null("InstanceMeshes")
+ if instancer_btn:
+ instancer_btn.set_pressed(true)
+ plugin.ui._on_tool_changed(Terrain3DEditor.INSTANCER, Terrain3DEditor.ADD)
+
+ # Update editor with selected brush
+ plugin.ui._on_setting_changed()
+
+
+ func _on_resource_inspected(p_resource: Resource) -> void:
+ await get_tree().create_timer(.01).timeout
+ plugin.get_editor_interface().edit_resource(p_resource)
+
+
+ func _on_resource_changed(p_resource: Resource, p_id: int) -> void:
+ if not p_resource:
+ var asset_dock: Control = get_parent().get_parent().get_parent()
+ if type == Terrain3DAssets.TYPE_TEXTURE:
+ asset_dock.confirm_dialog.dialog_text = "Are you sure you want to clear this texture?"
+ else:
+ asset_dock.confirm_dialog.dialog_text = "Are you sure you want to clear this mesh and delete all instances?"
+ asset_dock.confirm_dialog.popup_centered()
+ await asset_dock.confirmation_closed
+ if not asset_dock._confirmed:
+ update_asset_list()
+ return
+
+ if not plugin.is_terrain_valid():
+ plugin.select_terrain()
+ await get_tree().create_timer(.01).timeout
+
+ if plugin.is_terrain_valid():
+ if type == Terrain3DAssets.TYPE_TEXTURE:
+ plugin.terrain.get_assets().set_texture(p_id, p_resource)
+ else:
+ plugin.terrain.get_assets().set_mesh_asset(p_id, p_resource)
+ await get_tree().create_timer(.01).timeout
+ plugin.terrain.assets.create_mesh_thumbnails(p_id)
+
+ # If removing an entry, clear inspector
+ if not p_resource:
+ plugin.get_editor_interface().inspect_object(null)
+
+ # If null resource, remove last
+ if not p_resource:
+ var last_offset: int = 2
+ if p_id == entries.size()-2:
+ last_offset = 3
+ set_selected_id(clamp(selected_id, 0, entries.size() - last_offset))
+
+ # Update editor with selected brush
+ plugin.ui._on_setting_changed()
+
+
+ func get_selected_id() -> int:
+ return selected_id
+
+
+
+ func set_entry_width(value: float) -> void:
+ width = clamp(value, 56, 230)
+ redraw()
+
+
+ func get_entry_width() -> float:
+ return width
+
+
+ func redraw() -> void:
+ height = 0
+ var id: int = 0
+ var separation: float = 4
+ var columns: int = 3
+ columns = clamp(size.x / width, 1, 100)
+
+ for c in get_children():
+ if is_instance_valid(c):
+ c.size = Vector2(width, width) - Vector2(separation, separation)
+ c.position = Vector2(id % columns, id / columns) * width + \
+ Vector2(separation / columns, separation / columns)
+ height = max(height, c.position.y + width)
+ id += 1
+
+
+ # Needed to enable ScrollContainer scroll bar
+ func _get_minimum_size() -> Vector2:
+ return Vector2(0, height)
+
+
+ func _notification(p_what) -> void:
+ if p_what == NOTIFICATION_SORT_CHILDREN:
+ redraw()
+
+
+##############################################################
+## class ListEntry
+##############################################################
+
+
+class ListEntry extends VBoxContainer:
+ signal hovered()
+ signal selected()
+ signal changed(resource: Resource)
+ signal inspected(resource: Resource)
+
+ var resource: Resource
+ var type := Terrain3DAssets.TYPE_TEXTURE
+ var _thumbnail: Texture2D
+ var drop_data: bool = false
+ var is_hovered: bool = false
+ var is_selected: bool = false
+ var asset_list: Terrain3DAssets
+
+ var button_clear: TextureButton
+ var button_edit: TextureButton
+ var name_label: Label
+
+ @onready var add_icon: Texture2D = get_theme_icon("Add", "EditorIcons")
+ @onready var clear_icon: Texture2D = get_theme_icon("Close", "EditorIcons")
+ @onready var edit_icon: Texture2D = get_theme_icon("Edit", "EditorIcons")
+ @onready var background: StyleBox = get_theme_stylebox("pressed", "Button")
+ var focus_style: StyleBox
+
+
+ func _ready() -> void:
+ var icon_size: Vector2 = Vector2(12, 12)
+
+ button_clear = TextureButton.new()
+ button_clear.set_texture_normal(clear_icon)
+ button_clear.set_custom_minimum_size(icon_size)
+ button_clear.set_h_size_flags(Control.SIZE_SHRINK_END)
+ button_clear.set_visible(resource != null)
+ button_clear.pressed.connect(clear)
+ add_child(button_clear)
+
+ button_edit = TextureButton.new()
+ button_edit.set_texture_normal(edit_icon)
+ button_edit.set_custom_minimum_size(icon_size)
+ button_edit.set_h_size_flags(Control.SIZE_SHRINK_END)
+ button_edit.set_visible(resource != null)
+ button_edit.pressed.connect(edit)
+ add_child(button_edit)
+
+ name_label = Label.new()
+ add_child(name_label, true)
+ name_label.visible = false
+ name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
+ name_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM
+ name_label.size_flags_vertical = Control.SIZE_EXPAND_FILL
+ name_label.add_theme_color_override("font_shadow_color", Color.BLACK)
+ name_label.add_theme_constant_override("shadow_offset_x", 1)
+ name_label.add_theme_constant_override("shadow_offset_y", 1)
+ name_label.add_theme_font_size_override("font_size", 15)
+ name_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
+ name_label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS
+ if type == Terrain3DAssets.TYPE_TEXTURE:
+ name_label.text = "Add Texture"
+ else:
+ name_label.text = "Add Mesh"
+
+
+ func _notification(p_what) -> void:
+ match p_what:
+ NOTIFICATION_DRAW:
+ var rect: Rect2 = Rect2(Vector2.ZERO, get_size())
+ if !resource:
+ draw_style_box(background, rect)
+ draw_texture(add_icon, (get_size() / 2) - (add_icon.get_size() / 2))
+ else:
+ if type == Terrain3DAssets.TYPE_TEXTURE:
+ name_label.text = (resource as Terrain3DTextureAsset).get_name()
+ self_modulate = resource.get_albedo_color()
+ _thumbnail = resource.get_albedo_texture()
+ if _thumbnail:
+ draw_texture_rect(_thumbnail, rect, false)
+ texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST_WITH_MIPMAPS
+ else:
+ name_label.text = (resource as Terrain3DMeshAsset).get_name()
+ var id: int = (resource as Terrain3DMeshAsset).get_id()
+ _thumbnail = resource.get_thumbnail()
+ if _thumbnail:
+ draw_texture_rect(_thumbnail, rect, false)
+ texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS
+ else:
+ draw_rect(rect, Color(.15, .15, .15, 1.))
+ name_label.add_theme_font_size_override("font_size", 4 + rect.size.x/10)
+ if drop_data:
+ draw_style_box(focus_style, rect)
+ if is_hovered:
+ draw_rect(rect, Color(1, 1, 1, 0.2))
+ if is_selected:
+ draw_style_box(focus_style, rect)
+ NOTIFICATION_MOUSE_ENTER:
+ is_hovered = true
+ name_label.visible = true
+ emit_signal("hovered")
+ queue_redraw()
+ NOTIFICATION_MOUSE_EXIT:
+ is_hovered = false
+ name_label.visible = false
+ drop_data = false
+ queue_redraw()
+
+
+ func _gui_input(p_event: InputEvent) -> void:
+ if p_event is InputEventMouseButton:
+ if p_event.is_pressed():
+ match p_event.get_button_index():
+ MOUSE_BUTTON_LEFT:
+ # If `Add new` is clicked
+ if !resource:
+ if type == Terrain3DAssets.TYPE_TEXTURE:
+ set_edited_resource(Terrain3DTextureAsset.new(), false)
+ else:
+ set_edited_resource(Terrain3DMeshAsset.new(), false)
+ edit()
+ else:
+ emit_signal("selected")
+ MOUSE_BUTTON_RIGHT:
+ if resource:
+ edit()
+ MOUSE_BUTTON_MIDDLE:
+ if resource:
+ clear()
+
+
+ func _can_drop_data(p_at_position: Vector2, p_data: Variant) -> bool:
+ drop_data = false
+ if typeof(p_data) == TYPE_DICTIONARY:
+ if p_data.files.size() == 1:
+ queue_redraw()
+ drop_data = true
+ return drop_data
+
+
+ func _drop_data(p_at_position: Vector2, p_data: Variant) -> void:
+ if typeof(p_data) == TYPE_DICTIONARY:
+ var res: Resource = load(p_data.files[0])
+ if res is Texture2D and type == Terrain3DAssets.TYPE_TEXTURE:
+ var ta := Terrain3DTextureAsset.new()
+ if resource is Terrain3DTextureAsset:
+ ta.id = resource.id
+ ta.set_albedo_texture(res)
+ set_edited_resource(ta, false)
+ resource = ta
+ elif res is Terrain3DTextureAsset and type == Terrain3DAssets.TYPE_TEXTURE:
+ if resource is Terrain3DTextureAsset:
+ res.id = resource.id
+ set_edited_resource(res, false)
+ elif res is PackedScene and type == Terrain3DAssets.TYPE_MESH:
+ var ma := Terrain3DMeshAsset.new()
+ if resource is Terrain3DMeshAsset:
+ ma.id = resource.id
+ ma.set_scene_file(res)
+ set_edited_resource(ma, false)
+ resource = ma
+ elif res is Terrain3DMeshAsset and type == Terrain3DAssets.TYPE_MESH:
+ if resource is Terrain3DMeshAsset:
+ res.id = resource.id
+ set_edited_resource(res, false)
+ emit_signal("selected")
+ emit_signal("inspected", resource)
+
+
+
+ func set_edited_resource(p_res: Resource, p_no_signal: bool = true) -> void:
+ resource = p_res
+ if resource:
+ resource.setting_changed.connect(_on_resource_changed)
+ resource.file_changed.connect(_on_resource_changed)
+
+ if button_clear:
+ button_clear.set_visible(resource != null)
+
+ queue_redraw()
+ if !p_no_signal:
+ emit_signal("changed", resource)
+
+
+ func _on_resource_changed() -> void:
+ emit_signal("changed", resource)
+
+
+ func set_selected(value: bool) -> void:
+ is_selected = value
+ queue_redraw()
+
+
+ func clear() -> void:
+ if resource:
+ set_edited_resource(null, false)
+
+
+ func edit() -> void:
+ emit_signal("selected")
+ emit_signal("inspected", resource)
diff --git a/addons/terrain_3d/src/asset_dock.tscn b/addons/terrain_3d/src/asset_dock.tscn
new file mode 100644
index 0000000..16a0586
--- /dev/null
+++ b/addons/terrain_3d/src/asset_dock.tscn
@@ -0,0 +1,93 @@
+[gd_scene load_steps=2 format=3 uid="uid://dkb6hii5e48m2"]
+
+[ext_resource type="Script" path="res://addons/terrain_3d/src/asset_dock.gd" id="1_e23pg"]
+
+[node name="Terrain3D" type="PanelContainer"]
+custom_minimum_size = Vector2(256, 95)
+offset_right = 766.0
+offset_bottom = 100.0
+script = ExtResource("1_e23pg")
+
+[node name="Box" type="BoxContainer" parent="."]
+layout_mode = 2
+size_flags_vertical = 3
+vertical = true
+
+[node name="Buttons" type="BoxContainer" parent="Box"]
+layout_mode = 2
+
+[node name="TexturesBtn" type="Button" parent="Box/Buttons"]
+custom_minimum_size = Vector2(80, 30)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 0
+theme_override_font_sizes/font_size = 16
+toggle_mode = true
+button_pressed = true
+text = "Textures"
+
+[node name="MeshesBtn" type="Button" parent="Box/Buttons"]
+custom_minimum_size = Vector2(80, 30)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 0
+theme_override_font_sizes/font_size = 16
+toggle_mode = true
+text = "Meshes"
+
+[node name="PlacementOpt" type="OptionButton" parent="Box/Buttons"]
+custom_minimum_size = Vector2(80, 30)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 0
+item_count = 9
+selected = 7
+popup/item_0/text = "Left_UL"
+popup/item_0/id = 0
+popup/item_1/text = "Left_BL"
+popup/item_1/id = 1
+popup/item_2/text = "Left_UR"
+popup/item_2/id = 2
+popup/item_3/text = "Left_BR"
+popup/item_3/id = 3
+popup/item_4/text = "Right_UL"
+popup/item_4/id = 4
+popup/item_5/text = "Right_BL "
+popup/item_5/id = 5
+popup/item_6/text = "Right_UR"
+popup/item_6/id = 6
+popup/item_7/text = "Right_BR"
+popup/item_7/id = 7
+popup/item_8/text = "Bottom"
+popup/item_8/id = 8
+
+[node name="SizeSlider" type="HSlider" parent="Box/Buttons"]
+custom_minimum_size = Vector2(80, 10)
+layout_mode = 2
+size_flags_horizontal = 3
+min_value = 56.0
+max_value = 230.0
+value = 83.0
+
+[node name="Floating" type="Button" parent="Box/Buttons"]
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 0
+tooltip_text = "Pop this dock out to a floating window."
+toggle_mode = true
+text = "F"
+flat = true
+
+[node name="Pinned" type="Button" parent="Box/Buttons"]
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 0
+tooltip_text = "Make this window \"Always on top\"."
+toggle_mode = true
+text = "P"
+flat = true
+
+[node name="ScrollContainer" type="ScrollContainer" parent="Box"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
diff --git a/addons/terrain_3d/src/bake_lod_dialog.gd b/addons/terrain_3d/src/bake_lod_dialog.gd
new file mode 100644
index 0000000..f73c82c
--- /dev/null
+++ b/addons/terrain_3d/src/bake_lod_dialog.gd
@@ -0,0 +1,28 @@
+@tool
+extends ConfirmationDialog
+
+var lod: int = 0
+var description: String = ""
+
+
+func _ready() -> void:
+ set_unparent_when_invisible(true)
+ about_to_popup.connect(_on_about_to_popup)
+ visibility_changed.connect(_on_visibility_changed)
+ %LodBox.value_changed.connect(_on_lod_box_value_changed)
+
+
+func _on_about_to_popup() -> void:
+ lod = %LodBox.value
+
+
+func _on_visibility_changed() -> void:
+ # Change text on the autowrap label only when the popup is visible.
+ # Works around Godot issue #47005:
+ # https://github.com/godotengine/godot/issues/47005
+ if visible:
+ %DescriptionLabel.text = description
+
+
+func _on_lod_box_value_changed(p_value: float) -> void:
+ lod = %LodBox.value
diff --git a/addons/terrain_3d/src/bake_lod_dialog.tscn b/addons/terrain_3d/src/bake_lod_dialog.tscn
new file mode 100644
index 0000000..1011c72
--- /dev/null
+++ b/addons/terrain_3d/src/bake_lod_dialog.tscn
@@ -0,0 +1,41 @@
+[gd_scene load_steps=2 format=3 uid="uid://bhvrrmb8bk1bt"]
+
+[ext_resource type="Script" path="res://addons/terrain_3d/src/bake_lod_dialog.gd" id="1_sf76d"]
+
+[node name="bake_lod_dialog" type="ConfirmationDialog"]
+title = "Bake Terrain3D Mesh"
+position = Vector2i(0, 36)
+size = Vector2i(400, 115)
+visible = true
+script = ExtResource("1_sf76d")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 8.0
+offset_top = 8.0
+offset_right = -8.0
+offset_bottom = -49.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 20
+
+[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "LOD:"
+
+[node name="LodBox" type="SpinBox" parent="VBoxContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 8.0
+value = 4.0
+
+[node name="DescriptionLabel" type="Label" parent="VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+autowrap_mode = 2
diff --git a/addons/terrain_3d/src/baker.gd b/addons/terrain_3d/src/baker.gd
new file mode 100644
index 0000000..0a53ba4
--- /dev/null
+++ b/addons/terrain_3d/src/baker.gd
@@ -0,0 +1,385 @@
+extends Node
+
+const BakeLodDialog: PackedScene = preload("res://addons/terrain_3d/src/bake_lod_dialog.tscn")
+const BAKE_MESH_DESCRIPTION: String = "This will create a child MeshInstance3D. LOD4+ is recommended. LOD0 is slow and dense with vertices every 1 unit. It is not an optimal mesh."
+const BAKE_OCCLUDER_DESCRIPTION: String = "This will create a child OccluderInstance3D. LOD4+ is recommended and will take 5+ seconds per region to generate. LOD0 is unnecessarily dense and slow."
+const SET_UP_NAVIGATION_DESCRIPTION: String = "This operation will:
+
+- Create a NavigationRegion3D node,
+- Assign it a blank NavigationMesh resource,
+- Move the Terrain3D node to be a child of the new node,
+- And bake the nav mesh.
+
+Once setup is complete, you can modify the settings on your nav mesh, and rebake
+without having to run through the setup again.
+
+If preferred, this setup can be canceled and the steps performed manually. For
+the best results, adjust the settings on the NavigationMesh resource to match
+the settings of your navigation agents and collisions."
+
+var plugin: EditorPlugin
+var bake_method: Callable
+var bake_lod_dialog: ConfirmationDialog
+var confirm_dialog: ConfirmationDialog
+
+
+func _enter_tree() -> void:
+ bake_lod_dialog = BakeLodDialog.instantiate()
+ bake_lod_dialog.hide()
+ bake_lod_dialog.confirmed.connect(func(): bake_method.call())
+ bake_lod_dialog.set_unparent_when_invisible(true)
+
+ confirm_dialog = ConfirmationDialog.new()
+ confirm_dialog.hide()
+ confirm_dialog.confirmed.connect(func(): bake_method.call())
+ confirm_dialog.set_unparent_when_invisible(true)
+
+
+func _exit_tree() -> void:
+ bake_lod_dialog.queue_free()
+ confirm_dialog.queue_free()
+
+
+func bake_mesh_popup() -> void:
+ if plugin.terrain:
+ bake_method = _bake_mesh
+ bake_lod_dialog.description = BAKE_MESH_DESCRIPTION
+ plugin.get_editor_interface().popup_dialog_centered(bake_lod_dialog)
+
+
+func _bake_mesh() -> void:
+ var mesh: Mesh = plugin.terrain.bake_mesh(bake_lod_dialog.lod, Terrain3DStorage.HEIGHT_FILTER_NEAREST)
+ if !mesh:
+ push_error("Failed to bake mesh from Terrain3D")
+ return
+
+ var undo: EditorUndoRedoManager = plugin.get_undo_redo()
+ undo.create_action("Terrain3D Bake ArrayMesh")
+
+ var mesh_instance := plugin.terrain.get_node_or_null(^"MeshInstance3D") as MeshInstance3D
+ if !mesh_instance:
+ mesh_instance = MeshInstance3D.new()
+ mesh_instance.name = &"MeshInstance3D"
+ mesh_instance.set_skeleton_path(NodePath())
+ mesh_instance.mesh = mesh
+
+ undo.add_do_method(plugin.terrain, &"add_child", mesh_instance, true)
+ undo.add_undo_method(plugin.terrain, &"remove_child", mesh_instance)
+ undo.add_do_property(mesh_instance, &"owner", plugin.terrain.owner)
+ undo.add_do_reference(mesh_instance)
+
+ else:
+ undo.add_do_property(mesh_instance, &"mesh", mesh)
+ undo.add_undo_property(mesh_instance, &"mesh", mesh_instance.mesh)
+
+ if mesh_instance.mesh.resource_path:
+ var path := mesh_instance.mesh.resource_path
+ undo.add_do_method(mesh, &"take_over_path", path)
+ undo.add_undo_method(mesh_instance.mesh, &"take_over_path", path)
+ undo.add_do_method(ResourceSaver, &"save", mesh)
+ undo.add_undo_method(ResourceSaver, &"save", mesh_instance.mesh)
+
+ undo.commit_action()
+
+
+func bake_occluder_popup() -> void:
+ if plugin.terrain:
+ bake_method = _bake_occluder
+ bake_lod_dialog.description = BAKE_OCCLUDER_DESCRIPTION
+ plugin.get_editor_interface().popup_dialog_centered(bake_lod_dialog)
+
+
+func _bake_occluder() -> void:
+ var mesh: Mesh = plugin.terrain.bake_mesh(bake_lod_dialog.lod, Terrain3DStorage.HEIGHT_FILTER_MINIMUM)
+ if !mesh:
+ push_error("Failed to bake mesh from Terrain3D")
+ return
+ assert(mesh.get_surface_count() == 1)
+
+ var undo: EditorUndoRedoManager = plugin.get_undo_redo()
+ undo.create_action("Terrain3D Bake Occluder3D")
+
+ var occluder := ArrayOccluder3D.new()
+ var arrays: Array = mesh.surface_get_arrays(0)
+ assert(arrays.size() > Mesh.ARRAY_INDEX)
+ assert(arrays[Mesh.ARRAY_INDEX] != null)
+ occluder.set_arrays(arrays[Mesh.ARRAY_VERTEX], arrays[Mesh.ARRAY_INDEX])
+
+ var occluder_instance := plugin.terrain.get_node_or_null(^"OccluderInstance3D") as OccluderInstance3D
+ if !occluder_instance:
+ occluder_instance = OccluderInstance3D.new()
+ occluder_instance.name = &"OccluderInstance3D"
+ occluder_instance.occluder = occluder
+
+ undo.add_do_method(plugin.terrain, &"add_child", occluder_instance, true)
+ undo.add_undo_method(plugin.terrain, &"remove_child", occluder_instance)
+ undo.add_do_property(occluder_instance, &"owner", plugin.terrain.owner)
+ undo.add_do_reference(occluder_instance)
+
+ else:
+ undo.add_do_property(occluder_instance, &"occluder", occluder)
+ undo.add_undo_property(occluder_instance, &"occluder", occluder_instance.occluder)
+
+ if occluder_instance.occluder.resource_path:
+ var path := occluder_instance.occluder.resource_path
+ undo.add_do_method(occluder, &"take_over_path", path)
+ undo.add_undo_method(occluder_instance.occluder, &"take_over_path", path)
+ undo.add_do_method(ResourceSaver, &"save", occluder)
+ undo.add_undo_method(ResourceSaver, &"save", occluder_instance.occluder)
+
+ undo.commit_action()
+
+
+func find_nav_region_terrains(p_nav_region: NavigationRegion3D) -> Array[Terrain3D]:
+ var result: Array[Terrain3D] = []
+ if not p_nav_region.navigation_mesh:
+ return result
+
+ var source_mode: NavigationMesh.SourceGeometryMode
+ source_mode = p_nav_region.navigation_mesh.geometry_source_geometry_mode
+ if source_mode == NavigationMesh.SOURCE_GEOMETRY_ROOT_NODE_CHILDREN:
+ result.append_array(p_nav_region.find_children("", "Terrain3D", true, true))
+ return result
+
+ var group_nodes: Array = p_nav_region.get_tree().get_nodes_in_group(p_nav_region.navigation_mesh.geometry_source_group_name)
+ for node in group_nodes:
+ if node is Terrain3D:
+ result.push_back(node)
+ if source_mode == NavigationMesh.SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN:
+ result.append_array(node.find_children("", "Terrain3D", true, true))
+
+ return result
+
+
+func find_terrain_nav_regions(p_terrain: Terrain3D) -> Array[NavigationRegion3D]:
+ var result: Array[NavigationRegion3D] = []
+ var root: Node = plugin.get_editor_interface().get_edited_scene_root()
+ if not root:
+ return result
+ for nav_region in root.find_children("", "NavigationRegion3D", true, true):
+ if find_nav_region_terrains(nav_region).has(p_terrain):
+ result.push_back(nav_region)
+ return result
+
+
+func bake_nav_mesh() -> void:
+ if plugin.nav_region:
+ # A NavigationRegion3D is selected. We only need to bake that one navmesh.
+ _bake_nav_region_nav_mesh(plugin.nav_region)
+ print("Terrain3DNavigation: Finished baking 1 NavigationMesh.")
+
+ elif plugin.terrain:
+ # A Terrain3D is selected. There are potentially multiple navmeshes to bake and we need to
+ # find them all. (The multiple navmesh use-case is likely on very large scenes with lots of
+ # geometry. Each navmesh in this case would define its own, non-overlapping, baking AABB, to
+ # cut down on the amount of geometry to bake. In a large open-world RPG, for instance, there
+ # could be a navmesh for each town.)
+ var nav_regions: Array[NavigationRegion3D] = find_terrain_nav_regions(plugin.terrain)
+ for nav_region in nav_regions:
+ _bake_nav_region_nav_mesh(nav_region)
+ print("Terrain3DNavigation: Finished baking %d NavigationMesh(es)." % nav_regions.size())
+
+
+func _bake_nav_region_nav_mesh(p_nav_region: NavigationRegion3D) -> void:
+ var nav_mesh: NavigationMesh = p_nav_region.navigation_mesh
+ assert(nav_mesh != null)
+
+ var source_geometry_data := NavigationMeshSourceGeometryData3D.new()
+ NavigationMeshGenerator.parse_source_geometry_data(nav_mesh, source_geometry_data, p_nav_region)
+
+ for terrain in find_nav_region_terrains(p_nav_region):
+ var aabb: AABB = nav_mesh.filter_baking_aabb
+ aabb.position += nav_mesh.filter_baking_aabb_offset
+ aabb = p_nav_region.global_transform * aabb
+ var faces: PackedVector3Array = terrain.generate_nav_mesh_source_geometry(aabb)
+ if not faces.is_empty():
+ source_geometry_data.add_faces(faces, Transform3D.IDENTITY)
+
+ NavigationMeshGenerator.bake_from_source_geometry_data(nav_mesh, source_geometry_data)
+
+ _postprocess_nav_mesh(nav_mesh)
+
+ # Assign null first to force the debug display to actually update:
+ p_nav_region.set_navigation_mesh(null)
+ p_nav_region.set_navigation_mesh(nav_mesh)
+
+ # Trigger save to disk if it is saved as an external file
+ if not nav_mesh.get_path().is_empty():
+ ResourceSaver.save(nav_mesh, nav_mesh.get_path(), ResourceSaver.FLAG_COMPRESS)
+
+ # Let other editor plugins and tool scripts know the nav mesh was just baked:
+ p_nav_region.bake_finished.emit()
+
+
+func _postprocess_nav_mesh(p_nav_mesh: NavigationMesh) -> void:
+ # Post-process the nav mesh to work around Godot issue #85548
+
+ # Round all the vertices in the nav_mesh to the nearest cell_size/cell_height so that it doesn't
+ # contain any edges shorter than cell_size/cell_height (one cause of #85548).
+ var vertices: PackedVector3Array = _postprocess_nav_mesh_round_vertices(p_nav_mesh)
+
+ # Rounding vertices can collapse some edges to 0 length. We remove these edges, and any polygons
+ # that have been reduced to 0 area.
+ var polygons: Array[PackedInt32Array] = _postprocess_nav_mesh_remove_empty_polygons(p_nav_mesh, vertices)
+
+ # Another cause of #85548 is baking producing overlapping polygons. We remove these.
+ _postprocess_nav_mesh_remove_overlapping_polygons(p_nav_mesh, vertices, polygons)
+
+ p_nav_mesh.clear_polygons()
+ p_nav_mesh.set_vertices(vertices)
+ for polygon in polygons:
+ p_nav_mesh.add_polygon(polygon)
+
+
+func _postprocess_nav_mesh_round_vertices(p_nav_mesh: NavigationMesh) -> PackedVector3Array:
+ assert(p_nav_mesh != null)
+ assert(p_nav_mesh.cell_size > 0.0)
+ assert(p_nav_mesh.cell_height > 0.0)
+
+ var cell_size: Vector3 = Vector3(p_nav_mesh.cell_size, p_nav_mesh.cell_height, p_nav_mesh.cell_size)
+
+ # Round a little harder to avoid rounding errors with non-power-of-two cell_size/cell_height
+ # causing the navigation map to put two non-matching edges in the same cell:
+ var round_factor := cell_size * 1.001
+
+ var vertices: PackedVector3Array = p_nav_mesh.get_vertices()
+ for i in range(vertices.size()):
+ vertices[i] = (vertices[i] / round_factor).floor() * round_factor
+ return vertices
+
+
+func _postprocess_nav_mesh_remove_empty_polygons(p_nav_mesh: NavigationMesh, p_vertices: PackedVector3Array) -> Array[PackedInt32Array]:
+ var polygons: Array[PackedInt32Array] = []
+
+ for i in range(p_nav_mesh.get_polygon_count()):
+ var old_polygon: PackedInt32Array = p_nav_mesh.get_polygon(i)
+ var new_polygon: PackedInt32Array = []
+
+ # Remove duplicate vertices (introduced by rounding) from the polygon:
+ var polygon_vertices: PackedVector3Array = []
+ for index in old_polygon:
+ var vertex: Vector3 = p_vertices[index]
+ if polygon_vertices.has(vertex):
+ continue
+ polygon_vertices.push_back(vertex)
+ new_polygon.push_back(index)
+
+ # If we removed some vertices, we might be able to remove the polygon too:
+ if new_polygon.size() <= 2:
+ continue
+ polygons.push_back(new_polygon)
+
+ return polygons
+
+
+func _postprocess_nav_mesh_remove_overlapping_polygons(p_nav_mesh: NavigationMesh, p_vertices: PackedVector3Array, p_polygons: Array[PackedInt32Array]) -> void:
+ # Occasionally, a baked nav mesh comes out with overlapping polygons:
+ # https://github.com/godotengine/godot/issues/85548#issuecomment-1839341071
+ # Until the bug is fixed in the engine, this function attempts to detect and remove overlapping
+ # polygons.
+
+ # This function has to make a choice of which polygon to remove when an overlap is detected,
+ # because in this case the nav mesh is ambiguous. To do this it uses a heuristic:
+ # (1) an 'overlap' is defined as an edge that is shared by 3 or more polygons.
+ # (2) a 'bad polygon' is defined as a polygon that contains 2 or more 'overlaps'.
+ # The function removes the 'bad polygons', which in practice seems to be enough to remove all
+ # overlaps without creating holes in the nav mesh.
+
+ var cell_size: Vector3 = Vector3(p_nav_mesh.cell_size, p_nav_mesh.cell_height, p_nav_mesh.cell_size)
+
+ # `edges` is going to map edges (vertex pairs) to arrays of polygons that contain that edge.
+ var edges: Dictionary = {}
+
+ for polygon_index in range(p_polygons.size()):
+ var polygon: PackedInt32Array = p_polygons[polygon_index]
+ for j in range(polygon.size()):
+ var vertex: Vector3 = p_vertices[polygon[j]]
+ var next_vertex: Vector3 = p_vertices[polygon[(j + 1) % polygon.size()]]
+
+ # edge_key is a key we can use in the edges dictionary that uniquely identifies the
+ # edge. We use cell coordinates here (Vector3i) because with a non-power-of-two
+ # cell_size, rounding errors can cause Vector3 vertices to not be equal.
+ # Array.sort IS defined for vector types - see the Godot docs. It's necessary here
+ # because polygons that share an edge can have their vertices in a different order.
+ var edge_key: Array = [Vector3i(vertex / cell_size), Vector3i(next_vertex / cell_size)]
+ edge_key.sort()
+
+ if !edges.has(edge_key):
+ edges[edge_key] = []
+ edges[edge_key].push_back(polygon_index)
+
+ var overlap_count: Dictionary = {}
+ for connections in edges.values():
+ if connections.size() <= 2:
+ continue
+ for polygon_index in connections:
+ overlap_count[polygon_index] = overlap_count.get(polygon_index, 0) + 1
+
+ var bad_polygons: Array = []
+ for polygon_index in overlap_count.keys():
+ if overlap_count[polygon_index] >= 2:
+ bad_polygons.push_back(polygon_index)
+
+ bad_polygons.sort()
+ for i in range(bad_polygons.size() - 1, -1, -1):
+ p_polygons.remove_at(bad_polygons[i])
+
+
+func set_up_navigation_popup() -> void:
+ if plugin.terrain:
+ bake_method = _set_up_navigation
+ confirm_dialog.dialog_text = SET_UP_NAVIGATION_DESCRIPTION
+ plugin.get_editor_interface().popup_dialog_centered(confirm_dialog)
+
+
+func _set_up_navigation() -> void:
+ assert(plugin.terrain)
+ var terrain: Terrain3D = plugin.terrain
+
+ var nav_region := NavigationRegion3D.new()
+ nav_region.name = &"NavigationRegion3D"
+ nav_region.navigation_mesh = NavigationMesh.new()
+
+ var undo_redo: EditorUndoRedoManager = plugin.get_undo_redo()
+
+ undo_redo.create_action("Terrain3D Set up Navigation")
+ undo_redo.add_do_method(self, &"_do_set_up_navigation", nav_region, terrain)
+ undo_redo.add_undo_method(self, &"_undo_set_up_navigation", nav_region, terrain)
+ undo_redo.add_do_reference(nav_region)
+ undo_redo.commit_action()
+
+ plugin.get_editor_interface().inspect_object(nav_region)
+ assert(plugin.nav_region == nav_region)
+
+ bake_nav_mesh()
+
+
+func _do_set_up_navigation(p_nav_region: NavigationRegion3D, p_terrain: Terrain3D) -> void:
+ var parent: Node = p_terrain.get_parent()
+ var index: int = p_terrain.get_index()
+ var t_owner: Node = p_terrain.owner
+
+ parent.remove_child(p_terrain)
+ p_nav_region.add_child(p_terrain)
+
+ parent.add_child(p_nav_region, true)
+ parent.move_child(p_nav_region, index)
+
+ p_nav_region.owner = t_owner
+ p_terrain.owner = t_owner
+
+
+func _undo_set_up_navigation(p_nav_region: NavigationRegion3D, p_terrain: Terrain3D) -> void:
+ assert(p_terrain.get_parent() == p_nav_region)
+
+ var parent: Node = p_nav_region.get_parent()
+ var index: int = p_nav_region.get_index()
+ var t_owner: Node = p_nav_region.get_owner()
+
+ parent.remove_child(p_nav_region)
+ p_nav_region.remove_child(p_terrain)
+
+ parent.add_child(p_terrain, true)
+ parent.move_child(p_terrain, index)
+
+ p_terrain.owner = t_owner
diff --git a/addons/terrain_3d/src/channel_packer.gd b/addons/terrain_3d/src/channel_packer.gd
new file mode 100644
index 0000000..47c814d
--- /dev/null
+++ b/addons/terrain_3d/src/channel_packer.gd
@@ -0,0 +1,212 @@
+extends Object
+
+const WINDOW_SCENE: String = "res://addons/terrain_3d/src/channel_packer.tscn"
+const TEMPLATE_PATH: String = "res://addons/terrain_3d/src/channel_packer_import_template.txt"
+
+enum {
+ IMAGE_ALBEDO,
+ IMAGE_HEIGHT,
+ IMAGE_NORMAL,
+ IMAGE_ROUGHNESS,
+}
+
+var plugin: EditorPlugin
+var editor_interface: EditorInterface
+var dialog: AcceptDialog
+var save_file_dialog: FileDialog
+var open_file_dialog: FileDialog
+var invert_green_checkbox: CheckBox
+var last_opened_directory: String
+var last_saved_directory: String
+var packing_albedo: bool = false
+var queue_pack_normal_roughness: bool = false
+var images: Array[Image] = [null, null, null, null]
+var status_label: Label
+var no_op: Callable = func(): pass
+var last_file_selected_fn: Callable = no_op
+
+
+func pack_textures_popup() -> void:
+ if dialog != null:
+ print("Terrain3DChannelPacker: Cannot open pack tool, dialog already open.")
+ return
+
+ dialog = (load(WINDOW_SCENE) as PackedScene).instantiate()
+ dialog.confirmed.connect(_on_close_requested)
+ dialog.canceled.connect(_on_close_requested)
+ status_label = dialog.find_child("StatusLabel")
+ invert_green_checkbox = dialog.find_child("InvertGreenChannelCheckBox")
+
+ editor_interface = plugin.get_editor_interface()
+ _init_file_dialogs()
+ editor_interface.popup_dialog_centered(dialog)
+
+ _init_texture_picker(dialog.find_child("AlbedoVBox"), IMAGE_ALBEDO)
+ _init_texture_picker(dialog.find_child("HeightVBox"), IMAGE_HEIGHT)
+ _init_texture_picker(dialog.find_child("NormalVBox"), IMAGE_NORMAL)
+ _init_texture_picker(dialog.find_child("RoughnessVBox"), IMAGE_ROUGHNESS)
+ var pack_button_path: String = "Panel/MarginContainer/VBoxContainer/PackButton"
+ (dialog.get_node(pack_button_path) as Button).pressed.connect(_on_pack_button_pressed)
+
+
+func _on_close_requested() -> void:
+ last_file_selected_fn = no_op
+ images = [null, null, null, null]
+ dialog.queue_free()
+ dialog = null
+
+
+func _init_file_dialogs() -> void:
+ save_file_dialog = FileDialog.new()
+ save_file_dialog.set_filters(PackedStringArray(["*.png"]))
+ save_file_dialog.set_file_mode(FileDialog.FILE_MODE_SAVE_FILE)
+ save_file_dialog.access = FileDialog.ACCESS_FILESYSTEM
+ save_file_dialog.file_selected.connect(_on_save_file_selected)
+
+ open_file_dialog = FileDialog.new()
+ open_file_dialog.set_filters(PackedStringArray(["*.png", "*.bmp", "*.exr", "*.hdr", "*.jpg", "*.jpeg", "*.tga", "*.svg", "*.webp", ".ktx"]))
+ open_file_dialog.set_file_mode(FileDialog.FILE_MODE_OPEN_FILE)
+ open_file_dialog.access = FileDialog.ACCESS_FILESYSTEM
+
+ dialog.add_child(save_file_dialog)
+ dialog.add_child(open_file_dialog)
+
+
+func _init_texture_picker(p_parent: Node, p_image_index: int) -> void:
+ var line_edit: LineEdit = p_parent.find_child("LineEdit")
+ var file_pick_button: Button = p_parent.find_child("PickButton")
+ var clear_button: Button = p_parent.find_child("ClearButton")
+ var texture_rect: TextureRect = p_parent.find_child("TextureRect")
+ var texture_button: Button = p_parent.find_child("TextureButton")
+
+ var open_fn: Callable = func() -> void:
+ open_file_dialog.current_path = last_opened_directory
+ if last_file_selected_fn != no_op:
+ open_file_dialog.file_selected.disconnect(last_file_selected_fn)
+ last_file_selected_fn = func(path: String) -> void:
+ line_edit.text = path
+ line_edit.caret_column = path.length()
+ last_opened_directory = path.get_base_dir() + "/"
+ var image: Image = Image.new()
+ var code: int = image.load(path)
+ if code != OK:
+ _show_error("Failed to load texture '" + path + "'")
+ texture_rect.texture = null
+ images[p_image_index] = null
+ else:
+ _show_success("Loaded texture '" + path + "'")
+ texture_rect.texture = ImageTexture.create_from_image(image)
+ images[p_image_index] = image
+ open_file_dialog.file_selected.connect(last_file_selected_fn)
+ open_file_dialog.popup_centered_ratio()
+
+ var clear_fn: Callable = func() -> void:
+ line_edit.text = ""
+ texture_rect.texture = null
+ images[p_image_index] = null
+
+ # allow user to edit textbox and press enter because Godot's file picker doesn't work 100% of the time
+ var line_edit_submit_fn: Callable = func(path: String) -> void:
+ var image: Image = Image.new()
+ var code: int = image.load(path)
+ if code != OK:
+ _show_error("Failed to load texture '" + path + "'")
+ texture_rect.texture = null
+ images[p_image_index] = null
+ else:
+ texture_rect.texture = ImageTexture.create_from_image(image)
+ images[p_image_index] = image
+
+ line_edit.text_submitted.connect(line_edit_submit_fn)
+ file_pick_button.pressed.connect(open_fn)
+ texture_button.pressed.connect(open_fn)
+ clear_button.pressed.connect(clear_fn)
+ _set_button_icon(file_pick_button, "Folder")
+ _set_button_icon(clear_button, "Remove")
+
+
+func _set_button_icon(p_button: Button, p_icon_name: String) -> void:
+ var editor_base: Control = editor_interface.get_base_control()
+ var icon: Texture2D = editor_base.get_theme_icon(p_icon_name, "EditorIcons")
+ p_button.icon = icon
+
+
+func _show_error(p_text: String) -> void:
+ push_error("Terrain3DChannelPacker: " + p_text)
+ status_label.text = p_text
+ status_label.add_theme_color_override("font_color", Color(0.9, 0, 0))
+
+
+func _show_success(p_text: String) -> void:
+ print("Terrain3DChannelPacker: " + p_text)
+ status_label.text = p_text
+ status_label.add_theme_color_override("font_color", Color(0, 0.82, 0.14))
+
+
+func _create_import_file(png_path: String) -> void:
+ var dst_import_path: String = png_path + ".import"
+
+ var file: FileAccess = FileAccess.open(TEMPLATE_PATH, FileAccess.READ)
+ var template_content: String = file.get_as_text()
+ file.close()
+
+ var import_content: String = template_content.replace("$SOURCE_FILE", png_path)
+ file = FileAccess.open(dst_import_path, FileAccess.WRITE)
+ file.store_string(import_content)
+ file.close()
+
+
+func _on_pack_button_pressed() -> void:
+ packing_albedo = images[IMAGE_ALBEDO] != null and images[IMAGE_HEIGHT] != null
+ var packing_normal_roughness: bool = images[IMAGE_NORMAL] != null and images[IMAGE_ROUGHNESS] != null
+
+ if not packing_albedo and not packing_normal_roughness:
+ _show_error("Please select an albedo and height texture or a normal and roughness texture.")
+ return
+
+ if packing_albedo:
+ save_file_dialog.current_path = last_saved_directory + "packed_albedo_height"
+ save_file_dialog.title = "Save Packed Albedo/Height Texture"
+ save_file_dialog.popup_centered_ratio()
+ if packing_normal_roughness:
+ queue_pack_normal_roughness = true
+ return
+ if packing_normal_roughness:
+ save_file_dialog.current_path = last_saved_directory + "packed_normal_roughness"
+ save_file_dialog.title = "Save Packed Normal/Roughness Texture"
+ save_file_dialog.popup_centered_ratio()
+
+
+func _on_save_file_selected(p_dst_path) -> void:
+ last_saved_directory = p_dst_path.get_base_dir() + "/"
+ if packing_albedo:
+ _pack_textures(images[IMAGE_ALBEDO], images[IMAGE_HEIGHT], p_dst_path, false)
+ else:
+ _pack_textures(images[IMAGE_NORMAL], images[IMAGE_ROUGHNESS], p_dst_path, invert_green_checkbox.button_pressed)
+
+ if queue_pack_normal_roughness:
+ queue_pack_normal_roughness = false
+ packing_albedo = false
+ save_file_dialog.current_path = last_saved_directory + "packed_normal_roughness"
+ save_file_dialog.title = "Save Packed Normal/Roughness Texture"
+ save_file_dialog.call_deferred("popup_centered_ratio")
+
+
+func _pack_textures(p_rgb_image: Image, p_a_image: Image, p_dst_path: String, p_invert_green: bool) -> void:
+ if p_rgb_image and p_a_image:
+ if p_rgb_image.get_size() != p_a_image.get_size():
+ _show_error("Textures must be the same size.")
+ return
+
+ var output_image: Image = Terrain3DUtil.pack_image(p_rgb_image, p_a_image, p_invert_green)
+
+ if not output_image:
+ _show_error("Failed to pack textures.")
+ return
+
+ output_image.save_png(p_dst_path)
+ editor_interface.get_resource_filesystem().scan_sources()
+ _create_import_file(p_dst_path)
+ _show_success("Packed to " + p_dst_path + ".")
+ else:
+ _show_error("Failed to load one or more textures.")
diff --git a/addons/terrain_3d/src/channel_packer.tscn b/addons/terrain_3d/src/channel_packer.tscn
new file mode 100644
index 0000000..ebd2f0c
--- /dev/null
+++ b/addons/terrain_3d/src/channel_packer.tscn
@@ -0,0 +1,359 @@
+[gd_scene load_steps=5 format=3 uid="uid://nud6dwjcnj5v"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ysabf"]
+bg_color = Color(0.211765, 0.239216, 0.290196, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lcvna"]
+bg_color = Color(0.168627, 0.211765, 0.266667, 1)
+border_width_left = 3
+border_width_top = 3
+border_width_right = 3
+border_width_bottom = 3
+border_color = Color(0.270588, 0.435294, 0.580392, 1)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cb0xf"]
+bg_color = Color(0.137255, 0.137255, 0.137255, 1)
+draw_center = false
+border_width_left = 3
+border_width_top = 3
+border_width_right = 3
+border_width_bottom = 3
+border_color = Color(0.784314, 0.784314, 0.784314, 1)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7qdas"]
+
+[node name="AcceptDialog" type="AcceptDialog"]
+title = "Terrain3D Channel Packer"
+initial_position = 1
+size = Vector2i(660, 900)
+visible = true
+ok_button_text = "Close"
+
+[node name="Panel" type="Panel" parent="."]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 8.0
+offset_top = 8.0
+offset_right = -8.0
+offset_bottom = -49.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ysabf")
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = -1.0
+offset_bottom = -53.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 5
+theme_override_constants/margin_top = 5
+theme_override_constants/margin_right = 5
+theme_override_constants/margin_bottom = 5
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer"]
+layout_mode = 2
+size_flags_vertical = 0
+theme_override_constants/separation = 10
+
+[node name="AlbedoHeightPanel" type="Panel" parent="Panel/MarginContainer/VBoxContainer"]
+custom_minimum_size = Vector2(0, 250)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_lcvna")
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 10
+theme_override_constants/margin_top = 10
+theme_override_constants/margin_right = 10
+theme_override_constants/margin_bottom = 10
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer"]
+layout_mode = 2
+
+[node name="AlbedoVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="AlbedoLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
+layout_mode = 2
+text = "Albedo texture"
+
+[node name="AlbedoHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
+layout_mode = 2
+
+[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"]
+layout_mode = 2
+
+[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"]
+layout_mode = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_top = 10
+
+[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer"]
+custom_minimum_size = Vector2(110, 110)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
+
+[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -50.0
+offset_top = -50.0
+offset_right = 50.0
+offset_bottom = 50.0
+grow_horizontal = 2
+grow_vertical = 2
+expand_mode = 1
+
+[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
+
+[node name="HeightVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="HeightLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
+layout_mode = 2
+text = "Height texture"
+
+[node name="HeightHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
+layout_mode = 2
+
+[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"]
+layout_mode = 2
+
+[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"]
+layout_mode = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_top = 10
+
+[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer"]
+custom_minimum_size = Vector2(110, 110)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
+
+[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -50.0
+offset_top = -50.0
+offset_right = 50.0
+offset_bottom = 50.0
+grow_horizontal = 2
+grow_vertical = 2
+expand_mode = 1
+
+[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
+
+[node name="NormalRoughnessPanel" type="Panel" parent="Panel/MarginContainer/VBoxContainer"]
+custom_minimum_size = Vector2(0, 280)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_lcvna")
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 10
+theme_override_constants/margin_top = 10
+theme_override_constants/margin_right = 10
+theme_override_constants/margin_bottom = 10
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer"]
+layout_mode = 2
+
+[node name="NormalVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="NormalLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
+layout_mode = 2
+text = "Normal texture"
+
+[node name="NormalHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
+layout_mode = 2
+
+[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"]
+layout_mode = 2
+
+[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"]
+layout_mode = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_top = 10
+
+[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer"]
+custom_minimum_size = Vector2(110, 110)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
+
+[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -50.0
+offset_top = -50.0
+offset_right = 50.0
+offset_bottom = 50.0
+grow_horizontal = 2
+grow_vertical = 2
+expand_mode = 1
+
+[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
+
+[node name="InvertGreenChannelCheckBox" type="CheckBox" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
+layout_mode = 2
+text = "Convert DirectX to OpenGL"
+
+[node name="RoughnessVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="RoughnessLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
+layout_mode = 2
+text = "Roughness texture"
+
+[node name="RoughnessHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
+layout_mode = 2
+
+[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
+layout_mode = 2
+
+[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
+layout_mode = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_top = 10
+
+[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer"]
+custom_minimum_size = Vector2(110, 110)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
+
+[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -50.0
+offset_top = -50.0
+offset_right = 50.0
+offset_bottom = 50.0
+grow_horizontal = 2
+grow_vertical = 2
+expand_mode = 1
+
+[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
+
+[node name="NormalRoughnessHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="PackButton" type="Button" parent="Panel/MarginContainer/VBoxContainer"]
+layout_mode = 2
+text = "Pack textures as..."
+
+[node name="StatusLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer"]
+custom_minimum_size = Vector2(0, 10)
+layout_mode = 2
+theme_override_colors/font_color = Color(1, 1, 1, 1)
+text = "Use this to create a packed Albedo + Height texture and/or a packed Normal + Roughness texture.
+
+You can then use these textures with Terrain3D."
+autowrap_mode = 2
diff --git a/addons/terrain_3d/src/channel_packer_import_template.txt b/addons/terrain_3d/src/channel_packer_import_template.txt
new file mode 100644
index 0000000..e5da5eb
--- /dev/null
+++ b/addons/terrain_3d/src/channel_packer_import_template.txt
@@ -0,0 +1,32 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="$SOURCE_FILE"
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=2
+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=1
\ No newline at end of file
diff --git a/addons/terrain_3d/src/gradient_operation_builder.gd b/addons/terrain_3d/src/gradient_operation_builder.gd
new file mode 100644
index 0000000..f08a734
--- /dev/null
+++ b/addons/terrain_3d/src/gradient_operation_builder.gd
@@ -0,0 +1,55 @@
+extends "res://addons/terrain_3d/src/operation_builder.gd"
+
+
+const MultiPicker: Script = preload("res://addons/terrain_3d/src/multi_picker.gd")
+
+
+func _get_point_picker() -> MultiPicker:
+ return tool_settings.settings["gradient_points"]
+
+
+func _get_brush_size() -> float:
+ return tool_settings.get_setting("size")
+
+
+func _is_drawable() -> bool:
+ return tool_settings.get_setting("drawable")
+
+
+func is_picking() -> bool:
+ return not _get_point_picker().all_points_selected()
+
+
+func pick(p_global_position: Vector3, p_terrain: Terrain3D) -> void:
+ if not _get_point_picker().all_points_selected():
+ _get_point_picker().add_point(p_global_position)
+
+
+func is_ready() -> bool:
+ return _get_point_picker().all_points_selected() and not _is_drawable()
+
+
+func apply_operation(p_editor: Terrain3DEditor, p_global_position: Vector3, p_camera_direction: float) -> void:
+ var points: PackedVector3Array = _get_point_picker().get_points()
+ assert(points.size() == 2)
+ assert(not _is_drawable())
+
+ var brush_size: float = _get_brush_size()
+ assert(brush_size > 0.0)
+
+ var start: Vector3 = points[0]
+ var end: Vector3 = points[1]
+
+ p_editor.start_operation(start)
+
+ var dir: Vector3 = (end - start).normalized()
+
+ var pos: Vector3 = start
+ while dir.dot(end - pos) > 0.0:
+ p_editor.operate(pos, p_camera_direction)
+ pos += dir * brush_size * 0.2
+
+ p_editor.stop_operation()
+
+ _get_point_picker().clear()
+
diff --git a/addons/terrain_3d/src/multi_picker.gd b/addons/terrain_3d/src/multi_picker.gd
new file mode 100644
index 0000000..aa228bd
--- /dev/null
+++ b/addons/terrain_3d/src/multi_picker.gd
@@ -0,0 +1,87 @@
+extends HBoxContainer
+
+
+signal pressed
+signal value_changed
+
+
+const ICON_PICKER: String = "res://addons/terrain_3d/icons/picker.svg"
+const ICON_PICKER_CHECKED: String = "res://addons/terrain_3d/icons/picker_checked.svg"
+const MAX_POINTS: int = 2
+
+
+var icon_picker: Texture2D
+var icon_picker_checked: Texture2D
+var points: PackedVector3Array
+var picking_index: int = -1
+
+
+func _init() -> void:
+ icon_picker = load(ICON_PICKER)
+ icon_picker_checked = load(ICON_PICKER_CHECKED)
+
+ points.resize(MAX_POINTS)
+
+ for i in range(MAX_POINTS):
+ var button := Button.new()
+ button.icon = icon_picker
+ button.tooltip_text = "Pick point on the Terrain"
+ button.set_meta(&"point_index", i)
+ button.pressed.connect(_on_button_pressed.bind(i))
+ add_child(button)
+
+ _update_buttons()
+
+
+func _on_button_pressed(button_index: int) -> void:
+ points[button_index] = Vector3.ZERO
+ picking_index = button_index
+ _update_buttons()
+ pressed.emit()
+
+
+func _update_buttons() -> void:
+ for child in get_children():
+ if child is Button:
+ _update_button(child)
+
+
+func _update_button(button: Button) -> void:
+ var index: int = button.get_meta(&"point_index")
+
+ if points[index] != Vector3.ZERO:
+ button.icon = icon_picker_checked
+ else:
+ button.icon = icon_picker
+
+
+func clear() -> void:
+ points.fill(Vector3.ZERO)
+ _update_buttons()
+ value_changed.emit()
+
+
+func all_points_selected() -> bool:
+ return points.count(Vector3.ZERO) == 0
+
+
+func add_point(p_value: Vector3) -> void:
+ if points.has(p_value):
+ return
+
+ # If manually selecting a point individually
+ if picking_index != -1:
+ points[picking_index] = p_value
+ picking_index = -1
+ else:
+ # Else picking a sequence of points (non-drawable)
+ for i in range(MAX_POINTS):
+ if points[i] == Vector3.ZERO:
+ points[i] = p_value
+ break
+ _update_buttons()
+ value_changed.emit()
+
+
+func get_points() -> PackedVector3Array:
+ return points
diff --git a/addons/terrain_3d/src/operation_builder.gd b/addons/terrain_3d/src/operation_builder.gd
new file mode 100644
index 0000000..507856d
--- /dev/null
+++ b/addons/terrain_3d/src/operation_builder.gd
@@ -0,0 +1,23 @@
+extends RefCounted
+
+
+const ToolSettings: Script = preload("res://addons/terrain_3d/src/tool_settings.gd")
+
+
+var tool_settings: ToolSettings
+
+
+func is_picking() -> bool:
+ return false
+
+
+func pick(p_global_position: Vector3, p_terrain: Terrain3D) -> void:
+ pass
+
+
+func is_ready() -> bool:
+ return false
+
+
+func apply_operation(editor: Terrain3DEditor, p_global_position: Vector3, p_camera_direction: float) -> void:
+ pass
diff --git a/addons/terrain_3d/src/region_gizmo.gd b/addons/terrain_3d/src/region_gizmo.gd
new file mode 100644
index 0000000..af2a6cd
--- /dev/null
+++ b/addons/terrain_3d/src/region_gizmo.gd
@@ -0,0 +1,66 @@
+extends EditorNode3DGizmo
+
+var material: StandardMaterial3D
+var selection_material: StandardMaterial3D
+var region_position: Vector2
+var region_size: float
+var grid: Array[Vector2i]
+var use_secondary_color: bool = false
+var show_rect: bool = true
+
+var main_color: Color = Color.GREEN_YELLOW
+var secondary_color: Color = Color.RED
+var grid_color: Color = Color.WHITE
+var border_color: Color = Color.BLUE
+
+
+func _init() -> void:
+ material = StandardMaterial3D.new()
+ material.set_flag(BaseMaterial3D.FLAG_DISABLE_DEPTH_TEST, true)
+ material.set_flag(BaseMaterial3D.FLAG_ALBEDO_FROM_VERTEX_COLOR, true)
+ material.set_shading_mode(BaseMaterial3D.SHADING_MODE_UNSHADED)
+ material.set_albedo(Color.WHITE)
+
+ selection_material = material.duplicate()
+ selection_material.set_render_priority(0)
+
+
+func _redraw() -> void:
+ clear()
+
+ var rect_position = region_position * region_size
+
+ if show_rect:
+ var modulate: Color = main_color if !use_secondary_color else secondary_color
+ if abs(region_position.x) > 8 or abs(region_position.y) > 8:
+ modulate = Color.GRAY
+ draw_rect(Vector2(region_size,region_size)*.5 + rect_position, region_size, selection_material, modulate)
+
+ for pos in grid:
+ var grid_tile_position = Vector2(pos) * region_size
+ if show_rect and grid_tile_position == rect_position:
+ # Skip this one, otherwise focused region borders are not always visible due to draw order
+ continue
+
+ draw_rect(Vector2(region_size,region_size)*.5 + grid_tile_position, region_size, material, grid_color)
+
+ draw_rect(Vector2.ZERO, region_size * 16.0, material, border_color)
+
+
+func draw_rect(p_pos: Vector2, p_size: float, p_material: StandardMaterial3D, p_modulate: Color) -> void:
+ var lines: PackedVector3Array = [
+ Vector3(-1, 0, -1),
+ Vector3(-1, 0, 1),
+ Vector3(1, 0, 1),
+ Vector3(1, 0, -1),
+ Vector3(-1, 0, 1),
+ Vector3(1, 0, 1),
+ Vector3(1, 0, -1),
+ Vector3(-1, 0, -1),
+ ]
+
+ for i in lines.size():
+ lines[i] = ((lines[i] / 2.0) * p_size) + Vector3(p_pos.x, 0, p_pos.y)
+
+ add_lines(lines, p_material, false, p_modulate)
+
diff --git a/addons/terrain_3d/src/terrain_tools.gd b/addons/terrain_3d/src/terrain_tools.gd
new file mode 100644
index 0000000..91efc3c
--- /dev/null
+++ b/addons/terrain_3d/src/terrain_tools.gd
@@ -0,0 +1,77 @@
+extends HBoxContainer
+
+
+const Baker: Script = preload("res://addons/terrain_3d/src/baker.gd")
+const Packer: Script = preload("res://addons/terrain_3d/src/channel_packer.gd")
+
+var plugin: EditorPlugin
+var menu_button: MenuButton = MenuButton.new()
+var baker: Baker = Baker.new()
+var packer: Packer = Packer.new()
+
+enum {
+ MENU_BAKE_ARRAY_MESH,
+ MENU_BAKE_OCCLUDER,
+ MENU_BAKE_NAV_MESH,
+ MENU_SEPARATOR,
+ MENU_SET_UP_NAVIGATION,
+ MENU_PACK_TEXTURES,
+}
+
+
+func _enter_tree() -> void:
+ baker.plugin = plugin
+ packer.plugin = plugin
+
+ add_child(baker)
+
+ menu_button.text = "Terrain3D Tools"
+ menu_button.get_popup().add_item("Bake ArrayMesh", MENU_BAKE_ARRAY_MESH)
+ menu_button.get_popup().add_item("Bake Occluder3D", MENU_BAKE_OCCLUDER)
+ menu_button.get_popup().add_item("Bake NavMesh", MENU_BAKE_NAV_MESH)
+ menu_button.get_popup().add_separator("", MENU_SEPARATOR)
+ menu_button.get_popup().add_item("Set up Navigation", MENU_SET_UP_NAVIGATION)
+ menu_button.get_popup().add_separator("", MENU_SEPARATOR)
+ menu_button.get_popup().add_item("Pack Textures", MENU_PACK_TEXTURES)
+
+ menu_button.get_popup().id_pressed.connect(_on_menu_pressed)
+ menu_button.about_to_popup.connect(_on_menu_about_to_popup)
+ add_child(menu_button)
+
+
+func _exit_tree() -> void:
+ # TODO: If packer isn't freed, Godot complains about ObjectDB instances leaked and
+ # resources still in use at exit. Figure out why.
+ packer.free()
+
+
+func _on_menu_pressed(p_id: int) -> void:
+ match p_id:
+ MENU_BAKE_ARRAY_MESH:
+ baker.bake_mesh_popup()
+ MENU_BAKE_OCCLUDER:
+ baker.bake_occluder_popup()
+ MENU_BAKE_NAV_MESH:
+ baker.bake_nav_mesh()
+ MENU_SET_UP_NAVIGATION:
+ baker.set_up_navigation_popup()
+ MENU_PACK_TEXTURES:
+ packer.pack_textures_popup()
+
+
+func _on_menu_about_to_popup() -> void:
+ menu_button.get_popup().set_item_disabled(MENU_BAKE_ARRAY_MESH, not plugin.terrain)
+ menu_button.get_popup().set_item_disabled(MENU_BAKE_OCCLUDER, not plugin.terrain)
+ menu_button.get_popup().set_item_disabled(MENU_PACK_TEXTURES, not plugin.terrain)
+
+ if plugin.terrain:
+ var nav_regions: Array[NavigationRegion3D] = baker.find_terrain_nav_regions(plugin.terrain)
+ menu_button.get_popup().set_item_disabled(MENU_BAKE_NAV_MESH, nav_regions.size() == 0)
+ menu_button.get_popup().set_item_disabled(MENU_SET_UP_NAVIGATION, nav_regions.size() != 0)
+ elif plugin.nav_region:
+ var terrains: Array[Terrain3D] = baker.find_nav_region_terrains(plugin.nav_region)
+ menu_button.get_popup().set_item_disabled(MENU_BAKE_NAV_MESH, terrains.size() == 0)
+ menu_button.get_popup().set_item_disabled(MENU_SET_UP_NAVIGATION, true)
+ else:
+ menu_button.get_popup().set_item_disabled(MENU_BAKE_NAV_MESH, true)
+ menu_button.get_popup().set_item_disabled(MENU_SET_UP_NAVIGATION, true)
diff --git a/addons/terrain_3d/src/tool_settings.gd b/addons/terrain_3d/src/tool_settings.gd
new file mode 100644
index 0000000..ad9a195
--- /dev/null
+++ b/addons/terrain_3d/src/tool_settings.gd
@@ -0,0 +1,679 @@
+extends PanelContainer
+
+signal picking(type, callback)
+signal setting_changed
+
+enum Layout {
+ HORIZONTAL,
+ VERTICAL,
+ GRID,
+}
+
+enum SettingType {
+ CHECKBOX,
+ COLOR_SELECT,
+ DOUBLE_SLIDER,
+ OPTION,
+ PICKER,
+ MULTI_PICKER,
+ SLIDER,
+ TYPE_MAX,
+}
+
+const MultiPicker: Script = preload("res://addons/terrain_3d/src/multi_picker.gd")
+const DEFAULT_BRUSH: String = "circle0.exr"
+const BRUSH_PATH: String = "res://addons/terrain_3d/brushes"
+const PICKER_ICON: String = "res://addons/terrain_3d/icons/picker.svg"
+
+# Add settings flags
+const NONE: int = 0x0
+const ALLOW_LARGER: int = 0x1
+const ALLOW_SMALLER: int = 0x2
+const ALLOW_OUT_OF_BOUNDS: int = 0x3 # LARGER|SMALLER
+const NO_LABEL: int = 0x4
+const ADD_SEPARATOR: int = 0x8
+const ADD_SPACER: int = 0x10
+
+var brush_preview_material: ShaderMaterial
+var select_brush_button: Button
+
+var main_list: HBoxContainer
+var advanced_list: VBoxContainer
+var height_list: VBoxContainer
+var scale_list: VBoxContainer
+var rotation_list: VBoxContainer
+var color_list: VBoxContainer
+var settings: Dictionary = {}
+
+
+func _ready() -> void:
+ main_list = HBoxContainer.new()
+ add_child(main_list, true)
+
+ ## Common Settings
+ add_brushes(main_list)
+
+ add_setting({ "name":"size", "type":SettingType.SLIDER, "list":main_list, "default":50, "unit":"m",
+ "range":Vector3(2, 200, 1), "flags":ALLOW_LARGER|ADD_SPACER })
+
+ add_setting({ "name":"strength", "type":SettingType.SLIDER, "list":main_list, "default":10,
+ "unit":"%", "range":Vector3(1, 100, 1), "flags":ALLOW_LARGER })
+
+ add_setting({ "name":"enable", "type":SettingType.CHECKBOX, "list":main_list, "default":true })
+
+ add_setting({ "name":"height", "type":SettingType.SLIDER, "list":main_list, "default":50,
+ "unit":"m", "range":Vector3(-500, 500, 0.1), "flags":ALLOW_OUT_OF_BOUNDS })
+ add_setting({ "name":"height_picker", "type":SettingType.PICKER, "list":main_list,
+ "default":Terrain3DEditor.HEIGHT, "flags":NO_LABEL })
+
+ add_setting({ "name":"color", "type":SettingType.COLOR_SELECT, "list":main_list,
+ "default":Color.WHITE, "flags":ADD_SEPARATOR })
+ add_setting({ "name":"color_picker", "type":SettingType.PICKER, "list":main_list,
+ "default":Terrain3DEditor.COLOR, "flags":NO_LABEL })
+
+ add_setting({ "name":"roughness", "type":SettingType.SLIDER, "list":main_list, "default":0,
+ "unit":"%", "range":Vector3(-100, 100, 1), "flags":ADD_SEPARATOR })
+ add_setting({ "name":"roughness_picker", "type":SettingType.PICKER, "list":main_list,
+ "default":Terrain3DEditor.ROUGHNESS, "flags":NO_LABEL })
+
+ add_setting({ "name":"enable_texture", "label":"Texture", "type":SettingType.CHECKBOX,
+ "list":main_list, "default":true })
+
+ add_setting({ "name":"enable_angle", "label":"Angle", "type":SettingType.CHECKBOX,
+ "list":main_list, "default":true, "flags":ADD_SEPARATOR })
+ add_setting({ "name":"angle", "type":SettingType.SLIDER, "list":main_list, "default":0,
+ "unit":"%", "range":Vector3(0, 337.5, 22.5), "flags":NO_LABEL })
+ add_setting({ "name":"angle_picker", "type":SettingType.PICKER, "list":main_list,
+ "default":Terrain3DEditor.ANGLE, "flags":NO_LABEL })
+ add_setting({ "name":"dynamic_angle", "label":"Dynamic", "type":SettingType.CHECKBOX,
+ "list":main_list, "default":false, "flags":ADD_SPACER })
+
+ add_setting({ "name":"enable_scale", "label":"Scale ±", "type":SettingType.CHECKBOX,
+ "list":main_list, "default":true, "flags":ADD_SEPARATOR })
+ add_setting({ "name":"scale", "label":"±", "type":SettingType.SLIDER, "list":main_list, "default":0,
+ "unit":"%", "range":Vector3(-60, 80, 20), "flags":NO_LABEL })
+ add_setting({ "name":"scale_picker", "type":SettingType.PICKER, "list":main_list,
+ "default":Terrain3DEditor.SCALE, "flags":NO_LABEL })
+
+ ## Slope
+ add_setting({ "name":"slope", "type":SettingType.DOUBLE_SLIDER, "list":main_list,
+ "default":0, "unit":"°", "range":Vector3(0, 180, 1) })
+ add_setting({ "name":"gradient_points", "type":SettingType.MULTI_PICKER, "label":"Points",
+ "list":main_list, "default":Terrain3DEditor.HEIGHT, "flags":ADD_SEPARATOR })
+ add_setting({ "name":"drawable", "type":SettingType.CHECKBOX, "list":main_list, "default":false,
+ "flags":ADD_SEPARATOR })
+ settings["drawable"].toggled.connect(_on_drawable_toggled)
+
+ ## Instancer
+ height_list = create_submenu(main_list, "Height", Layout.VERTICAL)
+ add_setting({ "name":"height_offset", "type":SettingType.SLIDER, "list":height_list, "default":0,
+ "unit":"m", "range":Vector3(-10, 10, 0.05), "flags":ALLOW_OUT_OF_BOUNDS })
+ add_setting({ "name":"random_height", "label":"Random Height ±", "type":SettingType.SLIDER,
+ "list":height_list, "default":0, "unit":"m", "range":Vector3(0, 10, 0.05),
+ "flags":ALLOW_OUT_OF_BOUNDS })
+
+ scale_list = create_submenu(main_list, "Scale", Layout.VERTICAL)
+ add_setting({ "name":"fixed_scale", "type":SettingType.SLIDER, "list":scale_list, "default":100,
+ "unit":"%", "range":Vector3(1, 1000, 1), "flags":ALLOW_OUT_OF_BOUNDS })
+ add_setting({ "name":"random_scale", "label":"Random Scale ±", "type":SettingType.SLIDER, "list":scale_list,
+ "default":20, "unit":"%", "range":Vector3(0, 99, 1), "flags":ALLOW_OUT_OF_BOUNDS })
+
+ rotation_list = create_submenu(main_list, "Rotation", Layout.VERTICAL)
+ add_setting({ "name":"fixed_spin", "label":"Fixed Spin (Around Y)", "type":SettingType.SLIDER, "list":rotation_list,
+ "default":0, "unit":"°", "range":Vector3(0, 360, 1) })
+ add_setting({ "name":"random_spin", "type":SettingType.SLIDER, "list":rotation_list, "default":360,
+ "unit":"°", "range":Vector3(0, 360, 1) })
+ add_setting({ "name":"fixed_angle", "label":"Fixed Angle (From Y)", "type":SettingType.SLIDER, "list":rotation_list,
+ "default":0, "unit":"°", "range":Vector3(-85, 85, 1), "flags":ALLOW_OUT_OF_BOUNDS })
+ add_setting({ "name":"random_angle", "label":"Random Angle ±", "type":SettingType.SLIDER, "list":rotation_list,
+ "default":10, "unit":"°", "range":Vector3(0, 85, 1), "flags":ALLOW_OUT_OF_BOUNDS })
+ add_setting({ "name":"align_to_normal", "type":SettingType.CHECKBOX, "list":rotation_list, "default":false })
+
+ color_list = create_submenu(main_list, "Color", Layout.VERTICAL)
+ add_setting({ "name":"vertex_color", "type":SettingType.COLOR_SELECT, "list":color_list,
+ "default":Color.WHITE })
+ add_setting({ "name":"random_hue", "label":"Random Hue Shift ±", "type":SettingType.SLIDER,
+ "list":color_list, "default":0, "unit":"°", "range":Vector3(0, 360, 1) })
+ add_setting({ "name":"random_darken", "type":SettingType.SLIDER, "list":color_list, "default":50,
+ "unit":"%", "range":Vector3(0, 100, 1) })
+ #add_setting({ "name":"blend_mode", "type":SettingType.OPTION, "list":color_list, "default":0,
+ #"range":Vector3(0, 3, 1) })
+
+ var spacer: Control = Control.new()
+ spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ main_list.add_child(spacer, true)
+
+ ## Advanced Settings Menu
+ advanced_list = create_submenu(main_list, "Advanced", Layout.VERTICAL)
+ add_setting({ "name":"automatic_regions", "type":SettingType.CHECKBOX, "list":advanced_list,
+ "default":true })
+ add_setting({ "name":"align_to_view", "type":SettingType.CHECKBOX, "list":advanced_list,
+ "default":true })
+ add_setting({ "name":"show_cursor_while_painting", "type":SettingType.CHECKBOX, "list":advanced_list,
+ "default":true })
+ advanced_list.add_child(HSeparator.new(), true)
+ add_setting({ "name":"gamma", "type":SettingType.SLIDER, "list":advanced_list, "default":1.0,
+ "unit":"γ", "range":Vector3(0.1, 2.0, 0.01) })
+ add_setting({ "name":"jitter", "type":SettingType.SLIDER, "list":advanced_list, "default":50,
+ "unit":"%", "range":Vector3(0, 100, 1) })
+
+
+func create_submenu(p_parent: Control, p_button_name: String, p_layout: Layout) -> Container:
+ var menu_button: Button = Button.new()
+ menu_button.set_text(p_button_name)
+ menu_button.set_toggle_mode(true)
+ menu_button.set_v_size_flags(SIZE_SHRINK_CENTER)
+ menu_button.toggled.connect(_on_show_submenu.bind(menu_button))
+
+ var submenu: PopupPanel = PopupPanel.new()
+ submenu.popup_hide.connect(menu_button.set_pressed_no_signal.bind(false))
+ var panel_style: StyleBox = get_theme_stylebox("panel", "PopupMenu").duplicate()
+ panel_style.set_content_margin_all(10)
+ submenu.set("theme_override_styles/panel", panel_style)
+ submenu.add_to_group("terrain3d_submenus")
+
+ # Pop up menu on hover, hide on exit
+ menu_button.mouse_entered.connect(_on_show_submenu.bind(true, menu_button))
+ submenu.mouse_exited.connect(_on_show_submenu.bind(false, menu_button))
+
+ var sublist: Container
+ match(p_layout):
+ Layout.GRID:
+ sublist = GridContainer.new()
+ Layout.VERTICAL:
+ sublist = VBoxContainer.new()
+ Layout.HORIZONTAL, _:
+ sublist = HBoxContainer.new()
+
+ p_parent.add_child(menu_button, true)
+ menu_button.add_child(submenu, true)
+ submenu.add_child(sublist, true)
+
+ return sublist
+
+
+func _on_show_submenu(p_toggled: bool, p_button: Button) -> void:
+ # Don't show if mouse already down (from painting)
+ if p_toggled and Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
+ return
+
+ # Hide menu if mouse is not in button or panel
+ var button_rect: Rect2 = Rect2(p_button.get_screen_transform().origin, p_button.get_global_rect().size)
+ var in_button: bool = button_rect.has_point(DisplayServer.mouse_get_position())
+ var panel: PopupPanel = p_button.get_child(0)
+ var panel_rect: Rect2 = Rect2(panel.position, panel.size)
+ var in_panel: bool = panel_rect.has_point(DisplayServer.mouse_get_position())
+ if not p_toggled and ( in_button or in_panel ):
+ return
+
+ # Hide all submenus before possibly enabling the current one
+ get_tree().call_group("terrain3d_submenus", "set_visible", false)
+ var popup: PopupPanel = p_button.get_child(0)
+ var popup_pos: Vector2 = p_button.get_screen_transform().origin
+ popup.set_visible(p_toggled)
+ popup_pos.y -= popup.get_size().y
+ popup.set_position(popup_pos)
+
+
+func add_brushes(p_parent: Control) -> void:
+ var brush_list: GridContainer = create_submenu(p_parent, "Brush", Layout.GRID)
+ brush_list.name = "BrushList"
+
+ var brush_button_group: ButtonGroup = ButtonGroup.new()
+ brush_button_group.pressed.connect(_on_setting_changed)
+ var default_brush_btn: Button
+
+ var dir: DirAccess = DirAccess.open(BRUSH_PATH)
+ if dir:
+ dir.list_dir_begin()
+ var file_name = dir.get_next()
+ while file_name != "":
+ if !dir.current_is_dir() and file_name.ends_with(".exr"):
+ var img: Image = Image.load_from_file(BRUSH_PATH + "/" + file_name)
+ img = Terrain3DUtil.black_to_alpha(img)
+ var tex: ImageTexture = ImageTexture.create_from_image(img)
+
+ var btn: Button = Button.new()
+ btn.set_custom_minimum_size(Vector2.ONE * 100)
+ btn.set_button_icon(tex)
+ btn.set_meta("image", img)
+ btn.set_expand_icon(true)
+ btn.set_material(_get_brush_preview_material())
+ btn.set_toggle_mode(true)
+ btn.set_button_group(brush_button_group)
+ btn.mouse_entered.connect(_on_brush_hover.bind(true, btn))
+ btn.mouse_exited.connect(_on_brush_hover.bind(false, btn))
+ brush_list.add_child(btn, true)
+ if file_name == DEFAULT_BRUSH:
+ default_brush_btn = btn
+
+ var lbl: Label = Label.new()
+ btn.name = file_name.get_basename().to_pascal_case()
+ btn.add_child(lbl, true)
+ lbl.text = btn.name
+ lbl.visible = false
+ lbl.position.y = 70
+ lbl.add_theme_color_override("font_shadow_color", Color.BLACK)
+ lbl.add_theme_constant_override("shadow_offset_x", 1)
+ lbl.add_theme_constant_override("shadow_offset_y", 1)
+ lbl.add_theme_font_size_override("font_size", 16)
+
+ file_name = dir.get_next()
+
+ brush_list.columns = sqrt(brush_list.get_child_count()) + 2
+
+ if not default_brush_btn:
+ default_brush_btn = brush_button_group.get_buttons()[0]
+ default_brush_btn.set_pressed(true)
+
+ settings["brush"] = brush_button_group
+
+ select_brush_button = brush_list.get_parent().get_parent()
+ # Optionally erase the main brush button text and replace it with the texture
+# select_brush_button.set_button_icon(default_brush_btn.get_button_icon())
+# select_brush_button.set_custom_minimum_size(Vector2.ONE * 36)
+# select_brush_button.set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER)
+# select_brush_button.set_expand_icon(true)
+
+
+func _on_brush_hover(p_hovering: bool, p_button: Button) -> void:
+ if p_button.get_child_count() > 0:
+ var child = p_button.get_child(0)
+ if child is Label:
+ if p_hovering:
+ child.visible = true
+ else:
+ child.visible = false
+
+
+func _on_pick(p_type: Terrain3DEditor.Tool) -> void:
+ emit_signal("picking", p_type, _on_picked)
+
+
+func _on_picked(p_type: Terrain3DEditor.Tool, p_color: Color, p_global_position: Vector3) -> void:
+ match p_type:
+ Terrain3DEditor.HEIGHT:
+ settings["height"].value = p_color.r if not is_nan(p_color.r) else 0
+ Terrain3DEditor.COLOR:
+ settings["color"].color = p_color if not is_nan(p_color.r) else Color.WHITE
+ Terrain3DEditor.ROUGHNESS:
+ # 200... -.5 converts 0,1 to -100,100
+ settings["roughness"].value = round(200 * (p_color.a - 0.5)) if not is_nan(p_color.r) else 0.499
+ Terrain3DEditor.ANGLE:
+ settings["angle"].value = p_color.r
+ Terrain3DEditor.SCALE:
+ settings["scale"].value = p_color.r
+ _on_setting_changed()
+
+
+func _on_point_pick(p_type: Terrain3DEditor.Tool, p_name: String) -> void:
+ assert(p_type == Terrain3DEditor.HEIGHT)
+ emit_signal("picking", p_type, _on_point_picked.bind(p_name))
+
+
+func _on_point_picked(p_type: Terrain3DEditor.Tool, p_color: Color, p_global_position: Vector3, p_name: String) -> void:
+ assert(p_type == Terrain3DEditor.HEIGHT)
+
+ var point: Vector3 = p_global_position
+ point.y = p_color.r
+ settings[p_name].add_point(point)
+ _on_setting_changed()
+
+
+func add_setting(p_args: Dictionary) -> void:
+ var p_name: StringName = p_args.get("name", "")
+ var p_label: String = p_args.get("label", "") # Optional replacement for name
+ var p_type: SettingType = p_args.get("type", SettingType.TYPE_MAX)
+ var p_list: Control = p_args.get("list")
+ var p_default: Variant = p_args.get("default")
+ var p_suffix: String = p_args.get("unit", "")
+ var p_range: Vector3 = p_args.get("range", Vector3(0, 0, 1))
+ var p_minimum: float = p_range.x
+ var p_maximum: float = p_range.y
+ var p_step: float = p_range.z
+ var p_flags: int = p_args.get("flags", NONE)
+
+ if p_name.is_empty() or p_type == SettingType.TYPE_MAX:
+ return
+
+ var container: HBoxContainer = HBoxContainer.new()
+ container.set_v_size_flags(SIZE_EXPAND_FILL)
+ var control: Control # Houses the setting to be saved
+ var pending_children: Array[Control]
+
+ match p_type:
+ SettingType.CHECKBOX:
+ var checkbox := CheckBox.new()
+ checkbox.set_pressed_no_signal(p_default)
+ checkbox.pressed.connect(_on_setting_changed)
+ pending_children.push_back(checkbox)
+ control = checkbox
+
+ SettingType.COLOR_SELECT:
+ var picker := ColorPickerButton.new()
+ picker.set_custom_minimum_size(Vector2(100, 25))
+ picker.color = Color.WHITE
+ picker.edit_alpha = false
+ picker.get_picker().set_color_mode(ColorPicker.MODE_HSV)
+ picker.color_changed.connect(_on_setting_changed)
+ var popup: PopupPanel = picker.get_popup()
+ popup.mouse_exited.connect(Callable(func(p): p.hide()).bind(popup))
+ pending_children.push_back(picker)
+ control = picker
+
+ SettingType.PICKER:
+ var button := Button.new()
+ button.set_v_size_flags(SIZE_SHRINK_CENTER)
+ button.icon = load(PICKER_ICON)
+ button.tooltip_text = "Pick value from the Terrain"
+ button.pressed.connect(_on_pick.bind(p_default))
+ pending_children.push_back(button)
+ control = button
+
+ SettingType.MULTI_PICKER:
+ var multi_picker: HBoxContainer = MultiPicker.new()
+ multi_picker.pressed.connect(_on_point_pick.bind(p_default, p_name))
+ multi_picker.value_changed.connect(_on_setting_changed)
+ pending_children.push_back(multi_picker)
+ control = multi_picker
+
+ SettingType.OPTION:
+ var option := OptionButton.new()
+ for i in int(p_maximum):
+ option.add_item("a", i)
+ option.selected = p_minimum
+ option.item_selected.connect(_on_setting_changed)
+ pending_children.push_back(option)
+ control = option
+
+ SettingType.SLIDER, SettingType.DOUBLE_SLIDER:
+ var slider: Control
+ if p_type == SettingType.SLIDER:
+ # Create an editable value box
+ var spin_slider := EditorSpinSlider.new()
+ spin_slider.set_flat(false)
+ spin_slider.set_hide_slider(true)
+ spin_slider.value_changed.connect(_on_setting_changed)
+ spin_slider.set_max(p_maximum)
+ spin_slider.set_min(p_minimum)
+ spin_slider.set_step(p_step)
+ spin_slider.set_value(p_default)
+ spin_slider.set_suffix(p_suffix)
+ spin_slider.set_v_size_flags(SIZE_SHRINK_CENTER)
+ spin_slider.set_custom_minimum_size(Vector2(75, 0))
+
+ # Create horizontal slider linked to the above box
+ slider = HSlider.new()
+ slider.share(spin_slider)
+ if p_flags & ALLOW_LARGER:
+ slider.set_allow_greater(true)
+ if p_flags & ALLOW_SMALLER:
+ slider.set_allow_lesser(true)
+ pending_children.push_back(slider)
+ pending_children.push_back(spin_slider)
+ control = spin_slider
+
+ else: # DOUBLE_SLIDER
+ var label := Label.new()
+ label.set_custom_minimum_size(Vector2(75, 0))
+ slider = DoubleSlider.new()
+ slider.label = label
+ slider.suffix = p_suffix
+ slider.setting_changed.connect(_on_setting_changed)
+ pending_children.push_back(slider)
+ pending_children.push_back(label)
+ control = slider
+
+ slider.set_max(p_maximum)
+ slider.set_min(p_minimum)
+ slider.set_step(p_step)
+ slider.set_value(p_default)
+ slider.set_v_size_flags(SIZE_SHRINK_CENTER)
+ slider.set_custom_minimum_size(Vector2(60, 10))
+
+ control.name = p_name.to_pascal_case()
+ settings[p_name] = control
+
+ # Setup button labels
+ if not (p_flags & NO_LABEL):
+ # Labels are actually buttons styled to look like labels
+ var label := Button.new()
+ label.set("theme_override_styles/normal", get_theme_stylebox("normal", "Label"))
+ label.set("theme_override_styles/hover", get_theme_stylebox("normal", "Label"))
+ label.set("theme_override_styles/pressed", get_theme_stylebox("normal", "Label"))
+ label.set("theme_override_styles/focus", get_theme_stylebox("normal", "Label"))
+ label.pressed.connect(_on_label_pressed.bind(p_name, p_default))
+ if p_label.is_empty():
+ label.set_text(p_name.capitalize() + ": ")
+ else:
+ label.set_text(p_label.capitalize() + ": ")
+ pending_children.push_front(label)
+
+ # Add separators to front
+ if p_flags & ADD_SEPARATOR:
+ pending_children.push_front(VSeparator.new())
+ if p_flags & ADD_SPACER:
+ var spacer := Control.new()
+ spacer.set_custom_minimum_size(Vector2(5, 0))
+ pending_children.push_front(spacer)
+
+ # Add all children to container and list
+ for child in pending_children:
+ container.add_child(child, true)
+ p_list.add_child(container, true)
+
+
+# If label button is pressed, reset value to default or toggle checkbox
+func _on_label_pressed(p_name: String, p_default: Variant) -> void:
+ var control: Control = settings.get(p_name)
+ if not control:
+ return
+ if control is CheckBox:
+ set_setting(p_name, !control.button_pressed)
+ elif p_default != null:
+ set_setting(p_name, p_default)
+
+
+func get_settings() -> Dictionary:
+ var dict: Dictionary
+ for key in settings.keys():
+ dict[key] = get_setting(key)
+ return dict
+
+
+func get_setting(p_setting: String) -> Variant:
+ var object: Object = settings.get(p_setting)
+ var value: Variant
+ if object is Range:
+ value = object.get_value()
+ # Adjust widths of all sliders on update of values
+ var digits: float = count_digits(value)
+ var width: float = clamp( (1 + count_digits(value)) * 19., 50, 80) * clamp(EditorInterface.get_editor_scale(), .9, 2)
+ object.set_custom_minimum_size(Vector2(width, 0))
+ elif object is DoubleSlider:
+ value = Vector2(object.get_min_value(), object.get_max_value())
+ elif object is ButtonGroup:
+ var img: Image = object.get_pressed_button().get_meta("image")
+ var tex: Texture2D = object.get_pressed_button().get_button_icon()
+ value = [ img, tex ]
+ elif object is CheckBox:
+ value = object.is_pressed()
+ elif object is ColorPickerButton:
+ value = object.color
+ elif object is MultiPicker:
+ value = object.get_points()
+ if value == null:
+ value = 0
+ return value
+
+
+func set_setting(p_setting: String, p_value: Variant) -> void:
+ var object: Object = settings.get(p_setting)
+ if object is Range:
+ object.set_value(p_value)
+ elif object is DoubleSlider: # Expects p_value is Vector2
+ object.set_min_value(p_value.x)
+ object.set_max_value(p_value.y)
+ elif object is ButtonGroup: # Expects p_value is Array [ "button name", boolean ]
+ if p_value is Array and p_value.size() == 2:
+ for button in object.get_buttons():
+ if button.name == p_value[0]:
+ button.button_pressed = p_value[1]
+ elif object is CheckBox:
+ object.button_pressed = p_value
+ elif object is ColorPickerButton:
+ object.color = p_value
+ elif object is MultiPicker: # Expects p_value is PackedVector3Array
+ object.points = p_value
+ _on_setting_changed(object)
+
+
+func show_settings(p_settings: PackedStringArray) -> void:
+ for setting in settings.keys():
+ var object: Object = settings[setting]
+ if object is Control:
+ if setting in p_settings:
+ object.get_parent().show()
+ else:
+ object.get_parent().hide()
+ if select_brush_button:
+ if not "brush" in p_settings:
+ select_brush_button.hide()
+ else:
+ select_brush_button.show()
+
+
+func _on_setting_changed(p_data: Variant = null) -> void:
+ # If a button was clicked on a submenu
+ if p_data is Button and p_data.get_parent().get_parent() is PopupPanel:
+ if p_data.get_parent().name == "BrushList":
+ # Optionally Set selected brush texture in main brush button
+# p_data.get_parent().get_parent().get_parent().set_button_icon(p_data.get_button_icon())
+ # Hide popup
+ p_data.get_parent().get_parent().set_visible(false)
+ # Hide label
+ if p_data.get_child_count() > 0:
+ p_data.get_child(0).visible = false
+
+ emit_signal("setting_changed")
+
+
+func _on_drawable_toggled(p_button_pressed: bool) -> void:
+ if not p_button_pressed:
+ settings["gradient_points"].clear()
+
+
+func _get_brush_preview_material() -> ShaderMaterial:
+ if !brush_preview_material:
+ brush_preview_material = ShaderMaterial.new()
+ var shader: Shader = Shader.new()
+
+ var code: String = "shader_type canvas_item;\n"
+ code += "varying vec4 v_vertex_color;\n"
+ code += "void vertex() {\n"
+ code += " v_vertex_color = COLOR;\n"
+ code += "}\n"
+ code += "void fragment(){\n"
+ code += " vec4 tex = texture(TEXTURE, UV);\n"
+ code += " COLOR.a *= pow(tex.r, 0.666);\n"
+ code += " COLOR.rgb = v_vertex_color.rgb;\n"
+ code += "}\n"
+
+ shader.set_code(code)
+ brush_preview_material.set_shader(shader)
+ return brush_preview_material
+
+
+
+# Counts digits of a number including negative sign, decimal points, and up to 3 decimals
+func count_digits(p_value: float) -> int:
+ var count: int = 1
+ for i in range(5, 0, -1):
+ if abs(p_value) >= pow(10, i):
+ count = i+1
+ break
+ if p_value - floor(p_value) >= .1:
+ count += 1 # For the decimal
+ if p_value*10 - floor(p_value*10.) >= .1:
+ count += 1
+ if p_value*100 - floor(p_value*100.) >= .1:
+ count += 1
+ if p_value*1000 - floor(p_value*1000.) >= .1:
+ count += 1
+ # Negative sign
+ if p_value < 0:
+ count += 1
+ return count
+
+
+#### Sub Class DoubleSlider
+
+class DoubleSlider extends Range:
+ signal setting_changed(Vector2)
+ var label: Label
+ var suffix: String
+ var grabbed: bool = false
+ var _max_value: float
+ # TODO Needs to clamp min and max values. Currently allows max slider to go negative.
+
+ func _gui_input(p_event: InputEvent) -> void:
+ if p_event is InputEventMouseButton:
+ if p_event.get_button_index() == MOUSE_BUTTON_LEFT:
+ grabbed = p_event.is_pressed()
+ set_min_max(p_event.get_position().x)
+
+ if p_event is InputEventMouseMotion:
+ if grabbed:
+ set_min_max(p_event.get_position().x)
+
+
+ func _notification(p_what: int) -> void:
+ if p_what == NOTIFICATION_RESIZED:
+ pass
+ if p_what == NOTIFICATION_DRAW:
+ var bg: StyleBox = get_theme_stylebox("slider", "HSlider")
+ var bg_height: float = bg.get_minimum_size().y
+ draw_style_box(bg, Rect2(Vector2(0, (size.y - bg_height) / 2), Vector2(size.x, bg_height)))
+
+ var grabber: Texture2D = get_theme_icon("grabber", "HSlider")
+ var area: StyleBox = get_theme_stylebox("grabber_area", "HSlider")
+ var h: float = size.y / 2 - grabber.get_size().y / 2
+
+ var minpos: Vector2 = Vector2((min_value / _max_value) * size.x - grabber.get_size().x / 2, h)
+ var maxpos: Vector2 = Vector2((max_value / _max_value) * size.x - grabber.get_size().x / 2, h)
+
+ draw_style_box(area, Rect2(Vector2(minpos.x + grabber.get_size().x / 2, (size.y - bg_height) / 2), Vector2(maxpos.x - minpos.x, bg_height)))
+
+ draw_texture(grabber, minpos)
+ draw_texture(grabber, maxpos)
+
+
+ func set_max(p_value: float) -> void:
+ max_value = p_value
+ if _max_value == 0:
+ _max_value = max_value
+ update_label()
+
+
+ func set_min_max(p_xpos: float) -> void:
+ var mid_value_normalized: float = ((max_value + min_value) / 2.0) / _max_value
+ var mid_value: float = size.x * mid_value_normalized
+ var min_active: bool = p_xpos < mid_value
+ var xpos_ranged: float = snappedf((p_xpos / size.x) * _max_value, step)
+
+ if min_active:
+ min_value = xpos_ranged
+ else:
+ max_value = xpos_ranged
+
+ min_value = clamp(min_value, 0, max_value - 10)
+ max_value = clamp(max_value, min_value + 10, _max_value)
+
+ update_label()
+ emit_signal("setting_changed", Vector2(min_value, max_value))
+ queue_redraw()
+
+
+ func update_label() -> void:
+ if label:
+ label.set_text(str(min_value) + suffix + "/" + str(max_value) + suffix)
diff --git a/addons/terrain_3d/src/toolbar.gd b/addons/terrain_3d/src/toolbar.gd
new file mode 100644
index 0000000..4128400
--- /dev/null
+++ b/addons/terrain_3d/src/toolbar.gd
@@ -0,0 +1,77 @@
+extends VBoxContainer
+
+
+signal tool_changed(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation)
+
+const ICON_REGION_ADD: String = "res://addons/terrain_3d/icons/region_add.svg"
+const ICON_REGION_REMOVE: String = "res://addons/terrain_3d/icons/region_remove.svg"
+const ICON_HEIGHT_ADD: String = "res://addons/terrain_3d/icons/height_add.svg"
+const ICON_HEIGHT_SUB: String = "res://addons/terrain_3d/icons/height_sub.svg"
+const ICON_HEIGHT_MUL: String = "res://addons/terrain_3d/icons/height_mul.svg"
+const ICON_HEIGHT_DIV: String = "res://addons/terrain_3d/icons/height_div.svg"
+const ICON_HEIGHT_FLAT: String = "res://addons/terrain_3d/icons/height_flat.svg"
+const ICON_HEIGHT_SLOPE: String = "res://addons/terrain_3d/icons/height_slope.svg"
+const ICON_HEIGHT_SMOOTH: String = "res://addons/terrain_3d/icons/height_smooth.svg"
+const ICON_PAINT_TEXTURE: String = "res://addons/terrain_3d/icons/texture_paint.svg"
+const ICON_SPRAY_TEXTURE: String = "res://addons/terrain_3d/icons/texture_spray.svg"
+const ICON_COLOR: String = "res://addons/terrain_3d/icons/color_paint.svg"
+const ICON_WETNESS: String = "res://addons/terrain_3d/icons/wetness.svg"
+const ICON_AUTOSHADER: String = "res://addons/terrain_3d/icons/autoshader.svg"
+const ICON_HOLES: String = "res://addons/terrain_3d/icons/holes.svg"
+const ICON_NAVIGATION: String = "res://addons/terrain_3d/icons/navigation.svg"
+const ICON_INSTANCER: String = "res://addons/terrain_3d/icons/multimesh.svg"
+
+var tool_group: ButtonGroup = ButtonGroup.new()
+
+
+func _init() -> void:
+ set_custom_minimum_size(Vector2(20, 0))
+
+
+func _ready() -> void:
+ tool_group.connect("pressed", _on_tool_selected)
+
+ add_tool_button(Terrain3DEditor.REGION, Terrain3DEditor.ADD, "Add Region", load(ICON_REGION_ADD), tool_group)
+ add_tool_button(Terrain3DEditor.REGION, Terrain3DEditor.SUBTRACT, "Remove Region", load(ICON_REGION_REMOVE), tool_group)
+ add_child(HSeparator.new())
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.ADD, "Raise", load(ICON_HEIGHT_ADD), tool_group)
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.SUBTRACT, "Lower", load(ICON_HEIGHT_SUB), tool_group)
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.MULTIPLY, "Expand (Away from 0)", load(ICON_HEIGHT_MUL), tool_group)
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.DIVIDE, "Reduce (Towards 0)", load(ICON_HEIGHT_DIV), tool_group)
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.REPLACE, "Flatten", load(ICON_HEIGHT_FLAT), tool_group)
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.GRADIENT, "Slope", load(ICON_HEIGHT_SLOPE), tool_group)
+ add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.AVERAGE, "Smooth", load(ICON_HEIGHT_SMOOTH), tool_group)
+ add_child(HSeparator.new())
+ add_tool_button(Terrain3DEditor.TEXTURE, Terrain3DEditor.REPLACE, "Paint Base Texture", load(ICON_PAINT_TEXTURE), tool_group)
+ add_tool_button(Terrain3DEditor.TEXTURE, Terrain3DEditor.ADD, "Spray Overlay Texture", load(ICON_SPRAY_TEXTURE), tool_group)
+ add_tool_button(Terrain3DEditor.AUTOSHADER, Terrain3DEditor.REPLACE, "Autoshader", load(ICON_AUTOSHADER), tool_group)
+ add_child(HSeparator.new())
+ add_tool_button(Terrain3DEditor.COLOR, Terrain3DEditor.REPLACE, "Paint Color", load(ICON_COLOR), tool_group)
+ add_tool_button(Terrain3DEditor.ROUGHNESS, Terrain3DEditor.REPLACE, "Paint Wetness", load(ICON_WETNESS), tool_group)
+ add_child(HSeparator.new())
+ add_tool_button(Terrain3DEditor.HOLES, Terrain3DEditor.REPLACE, "Create Holes", load(ICON_HOLES), tool_group)
+ add_tool_button(Terrain3DEditor.NAVIGATION, Terrain3DEditor.REPLACE, "Paint Navigable Area", load(ICON_NAVIGATION), tool_group)
+ add_tool_button(Terrain3DEditor.INSTANCER, Terrain3DEditor.ADD, "Instance Meshes", load(ICON_INSTANCER), tool_group)
+
+ var buttons: Array[BaseButton] = tool_group.get_buttons()
+ buttons[0].set_pressed(true)
+
+
+func add_tool_button(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation,
+ p_tip: String, p_icon: Texture2D, p_group: ButtonGroup) -> void:
+
+ var button: Button = Button.new()
+ button.set_name(p_tip.to_pascal_case())
+ button.set_meta("Tool", p_tool)
+ button.set_meta("Operation", p_operation)
+ button.set_tooltip_text(p_tip)
+ button.set_button_icon(p_icon)
+ button.set_button_group(p_group)
+ button.set_flat(true)
+ button.set_toggle_mode(true)
+ button.set_h_size_flags(SIZE_SHRINK_END)
+ add_child(button)
+
+
+func _on_tool_selected(p_button: BaseButton) -> void:
+ emit_signal("tool_changed", p_button.get_meta("Tool", -1), p_button.get_meta("Operation", -1))
diff --git a/addons/terrain_3d/src/ui.gd b/addons/terrain_3d/src/ui.gd
new file mode 100644
index 0000000..bc6df8a
--- /dev/null
+++ b/addons/terrain_3d/src/ui.gd
@@ -0,0 +1,387 @@
+extends Node
+#class_name Terrain3DUI Cannot be named until Godot #75388
+
+
+# Includes
+const Toolbar: Script = preload("res://addons/terrain_3d/src/toolbar.gd")
+const ToolSettings: Script = preload("res://addons/terrain_3d/src/tool_settings.gd")
+const TerrainTools: Script = preload("res://addons/terrain_3d/src/terrain_tools.gd")
+const OperationBuilder: Script = preload("res://addons/terrain_3d/src/operation_builder.gd")
+const GradientOperationBuilder: Script = preload("res://addons/terrain_3d/src/gradient_operation_builder.gd")
+const COLOR_RAISE := Color.WHITE
+const COLOR_LOWER := Color.BLACK
+const COLOR_SMOOTH := Color(0.5, 0, .1)
+const COLOR_EXPAND := Color.ORANGE
+const COLOR_REDUCE := Color.BLUE_VIOLET
+const COLOR_FLATTEN := Color(0., 0.32, .4)
+const COLOR_SLOPE := Color.YELLOW
+const COLOR_PAINT := Color.FOREST_GREEN
+const COLOR_SPRAY := Color.SEA_GREEN
+const COLOR_ROUGHNESS := Color.ROYAL_BLUE
+const COLOR_AUTOSHADER := Color.DODGER_BLUE
+const COLOR_HOLES := Color.BLACK
+const COLOR_NAVIGATION := Color.REBECCA_PURPLE
+const COLOR_INSTANCER := Color.CRIMSON
+const COLOR_PICK_COLOR := Color.WHITE
+const COLOR_PICK_HEIGHT := Color.DARK_RED
+const COLOR_PICK_ROUGH := Color.ROYAL_BLUE
+
+const RING1: String = "res://addons/terrain_3d/brushes/ring1.exr"
+@onready var ring_texture := ImageTexture.create_from_image(Terrain3DUtil.black_to_alpha(Image.load_from_file(RING1)))
+
+var plugin: EditorPlugin # Actually Terrain3DEditorPlugin, but Godot still has CRC errors
+var toolbar: Toolbar
+var toolbar_settings: ToolSettings
+var terrain_tools: TerrainTools
+var setting_has_changed: bool = false
+var visible: bool = false
+var picking: int = Terrain3DEditor.TOOL_MAX
+var picking_callback: Callable
+var decal: Decal
+var decal_timer: Timer
+var gradient_decals: Array[Decal]
+var brush_data: Dictionary
+var operation_builder: OperationBuilder
+
+
+func _enter_tree() -> void:
+ toolbar = Toolbar.new()
+ toolbar.hide()
+ toolbar.connect("tool_changed", _on_tool_changed)
+
+ toolbar_settings = ToolSettings.new()
+ toolbar_settings.connect("setting_changed", _on_setting_changed)
+ toolbar_settings.connect("picking", _on_picking)
+ toolbar_settings.hide()
+
+ terrain_tools = TerrainTools.new()
+ terrain_tools.plugin = plugin
+ terrain_tools.hide()
+
+ plugin.add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_LEFT, toolbar)
+ plugin.add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_BOTTOM, toolbar_settings)
+ plugin.add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_MENU, terrain_tools)
+
+ _on_tool_changed(Terrain3DEditor.REGION, Terrain3DEditor.ADD)
+
+ decal = Decal.new()
+ add_child(decal)
+ decal_timer = Timer.new()
+ decal_timer.wait_time = .5
+ decal_timer.one_shot = true
+ decal_timer.timeout.connect(Callable(func(node):
+ if node:
+ get_tree().create_tween().tween_property(node, "albedo_mix", 0.0, 0.15)).bind(decal))
+ add_child(decal_timer)
+
+
+func _exit_tree() -> void:
+ plugin.remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_LEFT, toolbar)
+ plugin.remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_BOTTOM, toolbar_settings)
+ toolbar.queue_free()
+ toolbar_settings.queue_free()
+ terrain_tools.queue_free()
+ decal.queue_free()
+ decal_timer.queue_free()
+ for gradient_decal in gradient_decals:
+ gradient_decal.queue_free()
+ gradient_decals.clear()
+
+
+func set_visible(p_visible: bool) -> void:
+ visible = p_visible
+ terrain_tools.set_visible(p_visible)
+ toolbar.set_visible(p_visible)
+ toolbar_settings.set_visible(p_visible)
+ update_decal()
+
+
+func set_menu_visibility(p_list: Control, p_visible: bool) -> void:
+ if p_list:
+ p_list.get_parent().get_parent().visible = p_visible
+
+
+func _on_tool_changed(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation) -> void:
+ clear_picking()
+ set_menu_visibility(toolbar_settings.advanced_list, true)
+ set_menu_visibility(toolbar_settings.scale_list, false)
+ set_menu_visibility(toolbar_settings.rotation_list, false)
+ set_menu_visibility(toolbar_settings.height_list, false)
+ set_menu_visibility(toolbar_settings.color_list, false)
+
+ # Select which settings to show. Options in tool_settings.gd:_ready
+ var to_show: PackedStringArray = []
+
+ match p_tool:
+ Terrain3DEditor.HEIGHT:
+ to_show.push_back("brush")
+ to_show.push_back("size")
+ to_show.push_back("strength")
+ if p_operation == Terrain3DEditor.REPLACE:
+ to_show.push_back("height")
+ to_show.push_back("height_picker")
+ if p_operation == Terrain3DEditor.GRADIENT:
+ to_show.push_back("gradient_points")
+ to_show.push_back("drawable")
+
+ Terrain3DEditor.TEXTURE:
+ to_show.push_back("brush")
+ to_show.push_back("size")
+ to_show.push_back("enable_texture")
+ if p_operation == Terrain3DEditor.ADD:
+ to_show.push_back("strength")
+ to_show.push_back("enable_angle")
+ to_show.push_back("angle")
+ to_show.push_back("angle_picker")
+ to_show.push_back("dynamic_angle")
+ to_show.push_back("enable_scale")
+ to_show.push_back("scale")
+ to_show.push_back("scale_picker")
+
+ Terrain3DEditor.COLOR:
+ to_show.push_back("brush")
+ to_show.push_back("size")
+ to_show.push_back("strength")
+ to_show.push_back("color")
+ to_show.push_back("color_picker")
+
+ Terrain3DEditor.ROUGHNESS:
+ to_show.push_back("brush")
+ to_show.push_back("size")
+ to_show.push_back("strength")
+ to_show.push_back("roughness")
+ to_show.push_back("roughness_picker")
+
+ Terrain3DEditor.AUTOSHADER, Terrain3DEditor.HOLES, Terrain3DEditor.NAVIGATION:
+ to_show.push_back("brush")
+ to_show.push_back("size")
+ to_show.push_back("enable")
+
+ Terrain3DEditor.INSTANCER:
+ to_show.push_back("size")
+ to_show.push_back("strength")
+ to_show.push_back("enable")
+ set_menu_visibility(toolbar_settings.height_list, true)
+ to_show.push_back("height_offset")
+ to_show.push_back("random_height")
+ set_menu_visibility(toolbar_settings.scale_list, true)
+ to_show.push_back("fixed_scale")
+ to_show.push_back("random_scale")
+ set_menu_visibility(toolbar_settings.rotation_list, true)
+ to_show.push_back("fixed_spin")
+ to_show.push_back("random_spin")
+ to_show.push_back("fixed_angle")
+ to_show.push_back("random_angle")
+ to_show.push_back("align_to_normal")
+ set_menu_visibility(toolbar_settings.color_list, true)
+ to_show.push_back("vertex_color")
+ to_show.push_back("random_darken")
+ to_show.push_back("random_hue")
+
+ _:
+ pass
+
+ # Advanced menu settings
+ to_show.push_back("automatic_regions")
+ to_show.push_back("align_to_view")
+ to_show.push_back("show_cursor_while_painting")
+ to_show.push_back("gamma")
+ to_show.push_back("jitter")
+ toolbar_settings.show_settings(to_show)
+
+ operation_builder = null
+ if p_operation == Terrain3DEditor.GRADIENT:
+ operation_builder = GradientOperationBuilder.new()
+ operation_builder.tool_settings = toolbar_settings
+
+ if plugin.editor:
+ plugin.editor.set_tool(p_tool)
+ plugin.editor.set_operation(p_operation)
+
+ _on_setting_changed()
+ plugin.update_region_grid()
+
+
+func _on_setting_changed() -> void:
+ if not plugin.asset_dock:
+ return
+ brush_data = toolbar_settings.get_settings()
+ brush_data["asset_id"] = plugin.asset_dock.get_current_list().get_selected_id()
+ update_decal()
+ plugin.editor.set_brush_data(brush_data)
+
+
+func update_decal() -> void:
+ var mouse_buttons: int = Input.get_mouse_button_mask()
+ if not visible or \
+ not plugin.terrain or \
+ brush_data.is_empty() or \
+ mouse_buttons & MOUSE_BUTTON_RIGHT or \
+ (mouse_buttons & MOUSE_BUTTON_LEFT and not brush_data["show_cursor_while_painting"]) or \
+ plugin.editor.get_tool() == Terrain3DEditor.REGION:
+ decal.visible = false
+ for gradient_decal in gradient_decals:
+ gradient_decal.visible = false
+ return
+ else:
+ # Wait for cursor to recenter after right-click before revealing
+ # See https://github.com/godotengine/godot/issues/70098
+ await get_tree().create_timer(.05).timeout
+ decal.visible = true
+
+ decal.size = Vector3.ONE * brush_data["size"]
+ if brush_data["align_to_view"]:
+ var cam: Camera3D = plugin.terrain.get_camera();
+ if (cam):
+ decal.rotation.y = cam.rotation.y
+ else:
+ decal.rotation.y = 0
+
+ # Set texture and color
+ if picking != Terrain3DEditor.TOOL_MAX:
+ decal.texture_albedo = ring_texture
+ decal.size = Vector3.ONE * 10. * plugin.terrain.get_mesh_vertex_spacing()
+ match picking:
+ Terrain3DEditor.HEIGHT:
+ decal.modulate = COLOR_PICK_HEIGHT
+ Terrain3DEditor.COLOR:
+ decal.modulate = COLOR_PICK_COLOR
+ Terrain3DEditor.ROUGHNESS:
+ decal.modulate = COLOR_PICK_ROUGH
+ decal.modulate.a = 1.0
+ else:
+ decal.texture_albedo = brush_data["brush"][1]
+ match plugin.editor.get_tool():
+ Terrain3DEditor.HEIGHT:
+ match plugin.editor.get_operation():
+ Terrain3DEditor.ADD:
+ decal.modulate = COLOR_RAISE
+ Terrain3DEditor.SUBTRACT:
+ decal.modulate = COLOR_LOWER
+ Terrain3DEditor.MULTIPLY:
+ decal.modulate = COLOR_EXPAND
+ Terrain3DEditor.DIVIDE:
+ decal.modulate = COLOR_REDUCE
+ Terrain3DEditor.REPLACE:
+ decal.modulate = COLOR_FLATTEN
+ Terrain3DEditor.AVERAGE:
+ decal.modulate = COLOR_SMOOTH
+ Terrain3DEditor.GRADIENT:
+ decal.modulate = COLOR_SLOPE
+ _:
+ decal.modulate = Color.WHITE
+ decal.modulate.a = max(.3, brush_data["strength"] * .01)
+ Terrain3DEditor.TEXTURE:
+ match plugin.editor.get_operation():
+ Terrain3DEditor.REPLACE:
+ decal.modulate = COLOR_PAINT
+ decal.modulate.a = 1.0
+ Terrain3DEditor.ADD:
+ decal.modulate = COLOR_SPRAY
+ decal.modulate.a = max(.3, brush_data["strength"] * .01)
+ _:
+ decal.modulate = Color.WHITE
+ Terrain3DEditor.COLOR:
+ decal.modulate = brush_data["color"].srgb_to_linear()*.5
+ decal.modulate.a = max(.3, brush_data["strength"] * .01)
+ Terrain3DEditor.ROUGHNESS:
+ decal.modulate = COLOR_ROUGHNESS
+ decal.modulate.a = max(.3, brush_data["strength"] * .01)
+ Terrain3DEditor.AUTOSHADER:
+ decal.modulate = COLOR_AUTOSHADER
+ decal.modulate.a = 1.0
+ Terrain3DEditor.HOLES:
+ decal.modulate = COLOR_HOLES
+ decal.modulate.a = 1.0
+ Terrain3DEditor.NAVIGATION:
+ decal.modulate = COLOR_NAVIGATION
+ decal.modulate.a = 1.0
+ Terrain3DEditor.INSTANCER:
+ decal.texture_albedo = ring_texture
+ decal.modulate = COLOR_INSTANCER
+ decal.modulate.a = 1.0
+ _:
+ decal.modulate = Color.WHITE
+ decal.modulate.a = max(.3, brush_data["strength"] * .01)
+ decal.size.y = max(1000, decal.size.y)
+ decal.albedo_mix = 1.0
+ decal.cull_mask = 1 << ( plugin.terrain.get_mouse_layer() - 1 )
+ decal_timer.start()
+
+ for gradient_decal in gradient_decals:
+ gradient_decal.visible = false
+
+ if plugin.editor.get_operation() == Terrain3DEditor.GRADIENT:
+ var index := 0
+ for point in brush_data["gradient_points"]:
+ if point != Vector3.ZERO:
+ var point_decal: Decal = _get_gradient_decal(index)
+ point_decal.visible = true
+ point_decal.position = point
+ index += 1
+
+
+func _get_gradient_decal(index: int) -> Decal:
+ if gradient_decals.size() > index:
+ return gradient_decals[index]
+
+ var gradient_decal := Decal.new()
+ gradient_decal = Decal.new()
+ gradient_decal.texture_albedo = ring_texture
+ gradient_decal.modulate = COLOR_SLOPE
+ gradient_decal.size = Vector3.ONE * 10. * plugin.terrain.get_mesh_vertex_spacing()
+ gradient_decal.size.y = 1000.
+ gradient_decal.cull_mask = decal.cull_mask
+ add_child(gradient_decal)
+
+ gradient_decals.push_back(gradient_decal)
+ return gradient_decal
+
+
+func set_decal_rotation(p_rot: float) -> void:
+ decal.rotation.y = p_rot
+
+
+func _on_picking(p_type: int, p_callback: Callable) -> void:
+ picking = p_type
+ picking_callback = p_callback
+ update_decal()
+
+
+func clear_picking() -> void:
+ picking = Terrain3DEditor.TOOL_MAX
+
+
+func is_picking() -> bool:
+ if picking != Terrain3DEditor.TOOL_MAX:
+ return true
+
+ if operation_builder and operation_builder.is_picking():
+ return true
+
+ return false
+
+
+func pick(p_global_position: Vector3) -> void:
+ if picking != Terrain3DEditor.TOOL_MAX:
+ var color: Color
+ match picking:
+ Terrain3DEditor.HEIGHT:
+ color = plugin.terrain.get_storage().get_pixel(Terrain3DStorage.TYPE_HEIGHT, p_global_position)
+ Terrain3DEditor.ROUGHNESS:
+ color = plugin.terrain.get_storage().get_pixel(Terrain3DStorage.TYPE_COLOR, p_global_position)
+ Terrain3DEditor.COLOR:
+ color = plugin.terrain.get_storage().get_color(p_global_position)
+ Terrain3DEditor.ANGLE:
+ color = Color(plugin.terrain.get_storage().get_angle(p_global_position), 0., 0., 1.)
+ Terrain3DEditor.SCALE:
+ color = Color(plugin.terrain.get_storage().get_scale(p_global_position), 0., 0., 1.)
+ _:
+ push_error("Unsupported picking type: ", picking)
+ return
+ picking_callback.call(picking, color, p_global_position)
+ picking = Terrain3DEditor.TOOL_MAX
+
+ elif operation_builder and operation_builder.is_picking():
+ operation_builder.pick(p_global_position, plugin.terrain)
+
diff --git a/addons/terrain_3d/terrain.gdextension b/addons/terrain_3d/terrain.gdextension
new file mode 100644
index 0000000..d24ffba
--- /dev/null
+++ b/addons/terrain_3d/terrain.gdextension
@@ -0,0 +1,29 @@
+[configuration]
+
+entry_symbol = "terrain_3d_init"
+compatibility_minimum = 4.2
+
+[icons]
+
+Terrain3D = "res://addons/terrain_3d/icons/terrain3d.svg"
+
+[libraries]
+
+windows.debug.x86_64 = "res://addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll"
+windows.release.x86_64 = "res://addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll"
+
+linux.debug.x86_64 = "res://addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so"
+linux.release.x86_64 = "res://addons/terrain_3d/bin/libterrain.linux.release.x86_64.so"
+linux.debug.arm64 = "res://addons/terrain_3d/bin/libterrain.linux.debug.arm64.so"
+linux.release.arm64 = "res://addons/terrain_3d/bin/libterrain.linux.release.arm64.so"
+linux.debug.rv64 = "res://addons/terrain_3d/bin/libterrain.linux.debug.rv64.so"
+linux.release.rv64 = "res://addons/terrain_3d/bin/libterrain.linux.release.rv64.so"
+
+macos.debug = "res://addons/terrain_3d/bin/libterrain.macos.debug.framework"
+macos.release = "res://addons/terrain_3d/bin/libterrain.macos.release.framework"
+
+android.debug.arm64 = "res://addons/terrain_3d/bin/libterrain.android.debug.arm64.so"
+android.release.arm64 = "res://addons/terrain_3d/bin/libterrain.android.release.arm64.so"
+
+ios.debug = "res://addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib"
+ios.release = "res://addons/terrain_3d/bin/libterrain.ios.release.universal.dylib"
\ No newline at end of file
diff --git a/addons/terrain_3d/tools/importer.gd b/addons/terrain_3d/tools/importer.gd
new file mode 100644
index 0000000..b563844
--- /dev/null
+++ b/addons/terrain_3d/tools/importer.gd
@@ -0,0 +1,82 @@
+@tool
+extends Terrain3D
+
+
+@export var clear_all: bool = false : set = reset_settings
+@export var clear_terrain: bool = false : set = reset_terrain
+@export var update_height_range: bool = false : set = update_heights
+
+
+func reset_settings(p_value) -> void:
+ if p_value:
+ height_file_name = ""
+ control_file_name = ""
+ color_file_name = ""
+ import_position = Vector3.ZERO
+ import_offset = 0.0
+ import_scale = 1.0
+ r16_range = Vector2(0, 1)
+ r16_size = Vector2i(1024, 1024)
+ storage = null
+ material = null
+ assets = null
+
+
+func reset_terrain(p_value) -> void:
+ if p_value:
+ storage = null
+
+
+func update_heights(p_value) -> void:
+ if p_value and storage:
+ storage.update_height_range()
+
+
+@export_group("Import File")
+@export_global_file var height_file_name: String = ""
+@export_global_file var control_file_name: String = ""
+@export_global_file var color_file_name: String = ""
+@export var import_position: Vector3 = Vector3.ZERO
+@export var import_scale: float = 1.0
+@export var import_offset: float = 0.0
+@export var r16_range: Vector2 = Vector2(0, 1)
+@export var r16_size: Vector2i = Vector2i(1024, 1024)
+@export var run_import: bool = false : set = start_import
+
+func start_import(p_value: bool) -> void:
+ if p_value:
+ print("Terrain3DImporter: Importing files:\n\t%s\n\t%s\n\t%s" % [ height_file_name, control_file_name, color_file_name])
+ if not storage:
+ storage = Terrain3DStorage.new()
+
+ var imported_images: Array[Image]
+ imported_images.resize(Terrain3DStorage.TYPE_MAX)
+ var min_max := Vector2(0, 1)
+ var img: Image
+ if height_file_name:
+ img = Terrain3DUtil.load_image(height_file_name, ResourceLoader.CACHE_MODE_IGNORE, r16_range, r16_size)
+ min_max = Terrain3DUtil.get_min_max(img)
+ imported_images[Terrain3DStorage.TYPE_HEIGHT] = img
+ if control_file_name:
+ img = Terrain3DUtil.load_image(control_file_name, ResourceLoader.CACHE_MODE_IGNORE)
+ imported_images[Terrain3DStorage.TYPE_CONTROL] = img
+ if color_file_name:
+ img = Terrain3DUtil.load_image(color_file_name, ResourceLoader.CACHE_MODE_IGNORE)
+ imported_images[Terrain3DStorage.TYPE_COLOR] = img
+ if assets.get_texture_count() == 0:
+ material.show_checkered = false
+ material.show_colormap = true
+ storage.import_images(imported_images, import_position, import_offset, import_scale)
+ print("Terrain3DImporter: Import finished")
+
+
+@export_group("Export File")
+enum { TYPE_HEIGHT, TYPE_CONTROL, TYPE_COLOR }
+@export_enum("Height:0", "Control:1", "Color:2") var map_type: int = TYPE_HEIGHT
+@export var file_name_out: String = ""
+@export var run_export: bool = false : set = start_export
+
+func start_export(p_value: bool) -> void:
+ var err: int = storage.export_image(file_name_out, map_type)
+ print("Terrain3DImporter: Export error status: ", err, " ", error_string(err))
+
diff --git a/addons/terrain_3d/tools/importer.tscn b/addons/terrain_3d/tools/importer.tscn
new file mode 100644
index 0000000..cfa152c
--- /dev/null
+++ b/addons/terrain_3d/tools/importer.tscn
@@ -0,0 +1,16 @@
+[gd_scene load_steps=5 format=3 uid="uid://blaieaqp413k7"]
+
+[ext_resource type="Script" path="res://addons/terrain_3d/tools/importer.gd" id="1_60b8f"]
+
+[sub_resource type="Terrain3DStorage" id="Terrain3DStorage_rmuvl"]
+
+[sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_cjpaa"]
+show_checkered = true
+
+[sub_resource type="Terrain3DAssets" id="Terrain3DAssets_gbxcd"]
+
+[node name="Importer" type="Terrain3D"]
+storage = SubResource("Terrain3DStorage_rmuvl")
+material = SubResource("Terrain3DMaterial_cjpaa")
+assets = SubResource("Terrain3DAssets_gbxcd")
+script = ExtResource("1_60b8f")
diff --git a/addons/terrain_3d/utils/terrain_3d_objects.gd b/addons/terrain_3d/utils/terrain_3d_objects.gd
new file mode 100644
index 0000000..55d338b
--- /dev/null
+++ b/addons/terrain_3d/utils/terrain_3d_objects.gd
@@ -0,0 +1,187 @@
+@tool
+extends Node3D
+class_name Terrain3DObjects
+
+const TransformChangedNotifier: Script = preload("res://addons/terrain_3d/utils/transform_changed_notifier.gd")
+
+const CHILD_HELPER_NAME: StringName = &"TransformChangedSignaller"
+const CHILD_HELPER_PATH: NodePath = ^"TransformChangedSignaller"
+
+var _undo_redo = null
+var _terrain_id: int
+var _offsets: Dictionary # Object ID -> Vector3(X, Y offset relative to terrain height, Z)
+var _ignore_transform_change: bool = false
+
+
+func _enter_tree() -> void:
+ if not Engine.is_editor_hint():
+ return
+
+ for child in get_children():
+ _on_child_entered_tree(child)
+
+ child_entered_tree.connect(_on_child_entered_tree)
+ child_exiting_tree.connect(_on_child_exiting_tree)
+
+
+func _exit_tree() -> void:
+ if not Engine.is_editor_hint():
+ return
+
+ child_entered_tree.disconnect(_on_child_entered_tree)
+ child_exiting_tree.disconnect(_on_child_exiting_tree)
+
+ for child in get_children():
+ _on_child_exiting_tree(child)
+
+
+func editor_setup(p_plugin) -> void:
+ _undo_redo = p_plugin.get_undo_redo()
+
+
+func get_terrain() -> Terrain3D:
+ var terrain := instance_from_id(_terrain_id) as Terrain3D
+ if not terrain or terrain.is_queued_for_deletion() or not terrain.is_inside_tree():
+ var terrains: Array[Node] = EditorInterface.get_edited_scene_root().find_children("", "Terrain3D")
+ if terrains.size() > 0:
+ terrain = terrains[0]
+ _terrain_id = terrain.get_instance_id() if terrain else 0
+
+ if terrain and terrain.storage and not terrain.storage.maps_edited.is_connected(_on_maps_edited):
+ terrain.storage.maps_edited.connect(_on_maps_edited)
+
+ return terrain
+
+
+func _get_terrain_height(p_global_position: Vector3) -> float:
+ var terrain: Terrain3D = get_terrain()
+ if not terrain or not terrain.storage:
+ return 0.0
+ var height: float = terrain.storage.get_height(p_global_position)
+ if is_nan(height):
+ return 0.0
+ return height
+
+
+func _on_child_entered_tree(p_node: Node) -> void:
+ if not (p_node is Node3D):
+ return
+
+ assert(p_node.get_parent() == self)
+
+ var helper: TransformChangedNotifier = p_node.get_node_or_null(CHILD_HELPER_PATH)
+ if not helper:
+ helper = TransformChangedNotifier.new()
+ helper.name = CHILD_HELPER_NAME
+ p_node.add_child(helper, true, INTERNAL_MODE_BACK)
+ assert(p_node.has_node(CHILD_HELPER_PATH))
+
+ # When reparenting a Node3D, Godot changes its transform _after_ reparenting it. So here,
+ # we must use call_deferred, to avoid receiving transform_changed as a result of reparenting.
+ _setup_child_signal.call_deferred(p_node, helper)
+
+
+func _setup_child_signal(p_node: Node, helper: TransformChangedNotifier) -> void:
+ if not p_node.is_inside_tree():
+ return
+ if helper.transform_changed.is_connected(_on_child_transform_changed):
+ return
+
+ helper.transform_changed.connect(_on_child_transform_changed.bind(p_node))
+ _update_child_offset(p_node)
+
+
+func _on_child_exiting_tree(p_node: Node) -> void:
+ if not (p_node is Node3D) or not p_node.has_node(CHILD_HELPER_PATH):
+ return
+
+ var helper: TransformChangedNotifier = p_node.get_node_or_null(CHILD_HELPER_PATH)
+ if helper:
+ helper.transform_changed.disconnect(_on_child_transform_changed)
+ p_node.remove_child(helper)
+ helper.queue_free()
+
+ _offsets.erase(p_node.get_instance_id())
+
+
+func _is_node_selected(p_node: Node) -> bool:
+ var editor_sel = EditorInterface.get_selection()
+ return editor_sel.get_transformable_selected_nodes().has(p_node)
+
+
+func _on_child_transform_changed(p_node: Node3D) -> void:
+ if _ignore_transform_change:
+ return
+
+ var lmb_down := Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT)
+ if lmb_down and (_is_node_selected(p_node) or _is_node_selected(self)):
+ # The user may be moving the node using gizmos.
+ # We should wait until they're done before updating otherwise gizmos + this node conflict.
+ return
+
+ if not _offsets.has(p_node.get_instance_id()):
+ return
+
+ var old_offset: Vector3 = _offsets[p_node.get_instance_id()]
+ var old_h: float = _get_terrain_height(old_offset)
+ var old_position: Vector3 = old_offset + Vector3(0, old_h, 0)
+ var new_position: Vector3 = p_node.global_position
+ if old_position.is_equal_approx(new_position):
+ return
+ var new_h: float = _get_terrain_height(new_position)
+ var new_offset: Vector3 = new_position - Vector3(0, new_h, 0)
+
+ var translate_without_reposition: bool = Input.is_key_pressed(KEY_SHIFT)
+ var y_changed: bool = not is_equal_approx(old_position.y, p_node.global_position.y)
+ if not y_changed and not translate_without_reposition:
+ new_offset.y = old_offset.y
+ new_position = new_offset + Vector3(0, new_h, 0)
+
+ # Make sure that when the user undo's the translation, the offset change gets undone too!
+ _undo_redo.create_action("Translate", UndoRedo.MERGE_ALL)
+ _undo_redo.add_do_method(self, &"_set_offset_and_position", p_node.get_instance_id(), new_offset, new_position)
+ _undo_redo.add_undo_method(self, &"_set_offset_and_position", p_node.get_instance_id(), old_offset, old_position)
+ _undo_redo.commit_action()
+
+
+func _set_offset_and_position(p_id: int, p_offset: Vector3, p_position: Vector3) -> void:
+ var node := instance_from_id(p_id) as Node
+ if not is_instance_valid(node):
+ return
+
+ _ignore_transform_change = true
+ node.global_position = p_position
+ _offsets[p_id] = p_offset
+ _ignore_transform_change = false
+
+
+# Overwrite current offset stored for node with its current Y position relative to the terrain
+func _update_child_offset(p_node: Node3D) -> void:
+ var position: Vector3 = global_transform * p_node.position
+ var h: float = _get_terrain_height(position)
+ var offset: Vector3 = position - Vector3(0, h, 0)
+ _offsets[p_node.get_instance_id()] = offset
+
+
+# Overwrite node's current position with terrain height + stored offset for this node
+func _update_child_position(p_node: Node3D) -> void:
+ if not _offsets.has(p_node.get_instance_id()):
+ return
+
+ var position: Vector3 = global_transform * p_node.position
+ var h: float = _get_terrain_height(position)
+ var offset: Vector3 = _offsets[p_node.get_instance_id()]
+ var new_position: Vector3 = global_transform.inverse() * (offset + Vector3(0, h, 0))
+ if not p_node.position.is_equal_approx(new_position):
+ p_node.position = new_position
+
+
+func _on_maps_edited(p_edited_aabb: AABB) -> void:
+ var edited_area: AABB = p_edited_aabb.grow(1)
+ edited_area.position.y = -INF
+ edited_area.end.y = INF
+
+ for child in get_children():
+ var node := child as Node3D
+ if node && edited_area.has_point(node.global_position):
+ _update_child_position(node)
diff --git a/addons/terrain_3d/utils/transform_changed_notifier.gd b/addons/terrain_3d/utils/transform_changed_notifier.gd
new file mode 100644
index 0000000..4b8c586
--- /dev/null
+++ b/addons/terrain_3d/utils/transform_changed_notifier.gd
@@ -0,0 +1,14 @@
+@tool
+extends Node3D
+
+signal transform_changed
+
+
+func _ready() -> void:
+ assert(Engine.is_editor_hint())
+ set_notify_transform(true)
+
+
+func _notification(what: int) -> void:
+ if what == NOTIFICATION_TRANSFORM_CHANGED:
+ transform_changed.emit()
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png
new file mode 100644
index 0000000..dde202f
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png.import
new file mode 100644
index 0000000..f72ff1d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bp465hkr1uaa2"
+path.s3tc="res://.godot/imported/Bark_DeadTree.png-0cf8e3f4c77dd7f8735846ee0421e267.s3tc.ctex"
+path.etc2="res://.godot/imported/Bark_DeadTree.png-0cf8e3f4c77dd7f8735846ee0421e267.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree.png"
+dest_files=["res://.godot/imported/Bark_DeadTree.png-0cf8e3f4c77dd7f8735846ee0421e267.s3tc.ctex", "res://.godot/imported/Bark_DeadTree.png-0cf8e3f4c77dd7f8735846ee0421e267.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png
new file mode 100644
index 0000000..7c2fc35
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png.import
new file mode 100644
index 0000000..ec17b44
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnowyasko8vkg"
+path.s3tc="res://.godot/imported/Bark_DeadTree_Normal.png-b65a7acae4f57e011de1a6c0e116d0cb.s3tc.ctex"
+path.etc2="res://.godot/imported/Bark_DeadTree_Normal.png-b65a7acae4f57e011de1a6c0e116d0cb.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png"
+dest_files=["res://.godot/imported/Bark_DeadTree_Normal.png-b65a7acae4f57e011de1a6c0e116d0cb.s3tc.ctex", "res://.godot/imported/Bark_DeadTree_Normal.png-b65a7acae4f57e011de1a6c0e116d0cb.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/models/environment/stylized_nature_kit_quaternius/glTF/Bark_DeadTree_Normal.png"
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png
new file mode 100644
index 0000000..5f4779b
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png.import
new file mode 100644
index 0000000..9f18bfb
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://yu4eln8uttce"
+path.s3tc="res://.godot/imported/Bark_NormalTree.png-338050c0f3e4ee8205e775c035040238.s3tc.ctex"
+path.etc2="res://.godot/imported/Bark_NormalTree.png-338050c0f3e4ee8205e775c035040238.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree.png"
+dest_files=["res://.godot/imported/Bark_NormalTree.png-338050c0f3e4ee8205e775c035040238.s3tc.ctex", "res://.godot/imported/Bark_NormalTree.png-338050c0f3e4ee8205e775c035040238.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png
new file mode 100644
index 0000000..4340b4c
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png.import
new file mode 100644
index 0000000..52c950c
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bjteoitf8npnl"
+path.s3tc="res://.godot/imported/Bark_NormalTree_Normal.png-5907a7a7592236b9a919151b77d1d511.s3tc.ctex"
+path.etc2="res://.godot/imported/Bark_NormalTree_Normal.png-5907a7a7592236b9a919151b77d1d511.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png"
+dest_files=["res://.godot/imported/Bark_NormalTree_Normal.png-5907a7a7592236b9a919151b77d1d511.s3tc.ctex", "res://.godot/imported/Bark_NormalTree_Normal.png-5907a7a7592236b9a919151b77d1d511.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/models/environment/stylized_nature_kit_quaternius/glTF/Bark_NormalTree_Normal.png"
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png
new file mode 100644
index 0000000..71fe231
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png.import
new file mode 100644
index 0000000..5125ffc
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://xrket42lt8j4"
+path.s3tc="res://.godot/imported/Bark_TwistedTree.png-761f6ca1754e0f8160df01da45bdffc4.s3tc.ctex"
+path.etc2="res://.godot/imported/Bark_TwistedTree.png-761f6ca1754e0f8160df01da45bdffc4.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree.png"
+dest_files=["res://.godot/imported/Bark_TwistedTree.png-761f6ca1754e0f8160df01da45bdffc4.s3tc.ctex", "res://.godot/imported/Bark_TwistedTree.png-761f6ca1754e0f8160df01da45bdffc4.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png
new file mode 100644
index 0000000..7c2fc35
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png.import
new file mode 100644
index 0000000..1fa51b8
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dv8rw44uj3oam"
+path.s3tc="res://.godot/imported/Bark_TwistedTree_Normal.png-e09e7b7ab47fa6fac4e2b25a335a371a.s3tc.ctex"
+path.etc2="res://.godot/imported/Bark_TwistedTree_Normal.png-e09e7b7ab47fa6fac4e2b25a335a371a.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png"
+dest_files=["res://.godot/imported/Bark_TwistedTree_Normal.png-e09e7b7ab47fa6fac4e2b25a335a371a.s3tc.ctex", "res://.godot/imported/Bark_TwistedTree_Normal.png-e09e7b7ab47fa6fac4e2b25a335a371a.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/models/environment/stylized_nature_kit_quaternius/glTF/Bark_TwistedTree_Normal.png"
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.bin
new file mode 100644
index 0000000..c594b00
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf
new file mode 100644
index 0000000..4602312
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf
@@ -0,0 +1,151 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Bush_Common"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_TwistedTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.008",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_TwistedTree_C",
+ "uri":"Leaves_TwistedTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":1800,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":1800,
+ "max":[
+ 0.9913685917854309,
+ 1.3470909595489502,
+ 0.9907516837120056
+ ],
+ "min":[
+ -0.9234761595726013,
+ -0.234694704413414,
+ -0.9743891954421997
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":1800,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":1800,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":2700,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":28800,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21600,
+ "byteOffset":28800,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21600,
+ "byteOffset":50400,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14400,
+ "byteOffset":72000,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5400,
+ "byteOffset":86400,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":91800,
+ "uri":"Bush_Common.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf.import
new file mode 100644
index 0000000..6de8963
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cyf8k01s212tf"
+path="res://.godot/imported/Bush_Common.gltf-d6fe266ab4390b3825d283506e44076b.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common.gltf"
+dest_files=["res://.godot/imported/Bush_Common.gltf-d6fe266ab4390b3825d283506e44076b.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.bin
new file mode 100644
index 0000000..9b3949d
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf
new file mode 100644
index 0000000..da4f574
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf
@@ -0,0 +1,252 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Bush_Common_Flowers"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_NormalTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.009",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_NormalTree_C",
+ "uri":"Leaves_NormalTree_C.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":1800,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":1800,
+ "max":[
+ 0.9913685917854309,
+ 1.3470909595489502,
+ 0.9907516837120056
+ ],
+ "min":[
+ -0.9234761595726013,
+ -0.234694704413414,
+ -0.9743891954421997
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":1800,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":1800,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":2700,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":715,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":715,
+ "max":[
+ 0.9718135595321655,
+ 1.328537940979004,
+ 0.98771071434021
+ ],
+ "min":[
+ -0.7453983426094055,
+ 0.2586841881275177,
+ -0.9251851439476013
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":715,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":715,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":1404,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":28800,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21600,
+ "byteOffset":28800,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21600,
+ "byteOffset":50400,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14400,
+ "byteOffset":72000,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5400,
+ "byteOffset":86400,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":11440,
+ "byteOffset":91800,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":8580,
+ "byteOffset":103240,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":8580,
+ "byteOffset":111820,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5720,
+ "byteOffset":120400,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2808,
+ "byteOffset":126120,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":128928,
+ "uri":"Bush_Common_Flowers.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf.import
new file mode 100644
index 0000000..9b6ae2b
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dqnwywimfo2d3"
+path="res://.godot/imported/Bush_Common_Flowers.gltf-c57ed6ec66b4fe2d040e737bf1d92bf3.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Bush_Common_Flowers.gltf"
+dest_files=["res://.godot/imported/Bush_Common_Flowers.gltf-c57ed6ec66b4fe2d040e737bf1d92bf3.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.bin
new file mode 100644
index 0000000..612a429
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf
new file mode 100644
index 0000000..562cad4
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf
@@ -0,0 +1,152 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Clover_1"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cylinder.018",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":267,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":267,
+ "max":[
+ 0.2939910888671875,
+ 1.131940245628357,
+ 0.36432379484176636
+ ],
+ "min":[
+ -0.5022982358932495,
+ -0.012792191468179226,
+ -0.39956197142601013
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":267,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":267,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1137,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2136,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3204,
+ "byteOffset":2136,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3204,
+ "byteOffset":5340,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2136,
+ "byteOffset":8544,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2274,
+ "byteOffset":10680,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":12956,
+ "uri":"Clover_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf.import
new file mode 100644
index 0000000..b946b1a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://b4rtlg1as0jff"
+path="res://.godot/imported/Clover_1.gltf-4f9f7d69d0518168d12b0afb1bfa6ffc.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_1.gltf"
+dest_files=["res://.godot/imported/Clover_1.gltf-4f9f7d69d0518168d12b0afb1bfa6ffc.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.bin
new file mode 100644
index 0000000..4a8343e
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf
new file mode 100644
index 0000000..78c0e60
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf
@@ -0,0 +1,152 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Clover_2"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cylinder.002",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":433,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":433,
+ "max":[
+ 0.34883004426956177,
+ 1.261434555053711,
+ 0.36432382464408875
+ ],
+ "min":[
+ -0.5022982358932495,
+ -0.0023507503792643547,
+ -0.47231054306030273
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":433,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":433,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1845,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":3464,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5196,
+ "byteOffset":3464,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5196,
+ "byteOffset":8660,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3464,
+ "byteOffset":13856,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3690,
+ "byteOffset":17320,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":21012,
+ "uri":"Clover_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf.import
new file mode 100644
index 0000000..0053b9a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://0iiyo63ptuvv"
+path="res://.godot/imported/Clover_2.gltf-1ec912cf28f7a6f1410eb44a03d0778f.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Clover_2.gltf"
+dest_files=["res://.godot/imported/Clover_2.gltf-1ec912cf28f7a6f1410eb44a03d0778f.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.bin
new file mode 100644
index 0000000..75aa955
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf
new file mode 100644
index 0000000..29d47d2
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"CommonTree_1"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_NormalTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.023",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_NormalTree_C",
+ "uri":"Leaves_NormalTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":5618,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":5618,
+ "max":[
+ 1.2684564590454102,
+ 6.483748912811279,
+ 1.3548027276992798
+ ],
+ "min":[
+ -1.3591265678405762,
+ -0.24277201294898987,
+ -1.126320481300354
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":5618,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":5618,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":13035,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":3840,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":3840,
+ "max":[
+ 2.116964101791382,
+ 7.022013187408447,
+ 2.3531949520111084
+ ],
+ "min":[
+ -2.1944587230682373,
+ 2.3466193675994873,
+ -2.2245190143585205
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":3840,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":3840,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":5760,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":89888,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":67416,
+ "byteOffset":89888,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":67416,
+ "byteOffset":157304,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":44944,
+ "byteOffset":224720,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":26070,
+ "byteOffset":269664,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":61440,
+ "byteOffset":295736,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":46080,
+ "byteOffset":357176,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":46080,
+ "byteOffset":403256,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":30720,
+ "byteOffset":449336,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":11520,
+ "byteOffset":480056,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":491576,
+ "uri":"CommonTree_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf.import
new file mode 100644
index 0000000..54d0103
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cagupjr4dpp0r"
+path="res://.godot/imported/CommonTree_1.gltf-c1f8514e9f152be42d34199b93f62263.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_1.gltf"
+dest_files=["res://.godot/imported/CommonTree_1.gltf-c1f8514e9f152be42d34199b93f62263.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.bin
new file mode 100644
index 0000000..d403b09
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf
new file mode 100644
index 0000000..f6124ff
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"CommonTree_2"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_NormalTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.024",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_NormalTree_C",
+ "uri":"Leaves_NormalTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":5431,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":5431,
+ "max":[
+ 1.3451228141784668,
+ 6.727368354797363,
+ 1.5685818195343018
+ ],
+ "min":[
+ -1.431023359298706,
+ -0.24277201294898987,
+ -0.9472540616989136
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":5431,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":5431,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":12930,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":2676,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":2676,
+ "max":[
+ 2.24128794670105,
+ 7.400223731994629,
+ 2.4243826866149902
+ ],
+ "min":[
+ -2.2230136394500732,
+ 2.886406183242798,
+ -1.8514697551727295
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":2676,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":2676,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":4014,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":86896,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":65172,
+ "byteOffset":86896,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":65172,
+ "byteOffset":152068,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43448,
+ "byteOffset":217240,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":25860,
+ "byteOffset":260688,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":42816,
+ "byteOffset":286548,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":32112,
+ "byteOffset":329364,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":32112,
+ "byteOffset":361476,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21408,
+ "byteOffset":393588,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":8028,
+ "byteOffset":414996,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":423024,
+ "uri":"CommonTree_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf.import
new file mode 100644
index 0000000..1c9fa1b
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cifpq1hlx6cwu"
+path="res://.godot/imported/CommonTree_2.gltf-b70782b627c12b9c6d80ec5fe5deb33a.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_2.gltf"
+dest_files=["res://.godot/imported/CommonTree_2.gltf-b70782b627c12b9c6d80ec5fe5deb33a.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.bin
new file mode 100644
index 0000000..3af9057
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf
new file mode 100644
index 0000000..9e75eb2
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"CommonTree_3"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_NormalTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.025",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_NormalTree_C",
+ "uri":"Leaves_NormalTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":2149,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":2149,
+ "max":[
+ 1.0429332256317139,
+ 7.97797966003418,
+ 1.102728247642517
+ ],
+ "min":[
+ -0.848488450050354,
+ -0.24277201294898987,
+ -0.8173294067382812
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":2149,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":2149,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":5115,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":3600,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":3600,
+ "max":[
+ 2.076380968093872,
+ 9.182417869567871,
+ 2.1801114082336426
+ ],
+ "min":[
+ -1.9864652156829834,
+ 2.5763165950775146,
+ -2.0609655380249023
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":3600,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":3600,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":5400,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":34384,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":25788,
+ "byteOffset":34384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":25788,
+ "byteOffset":60172,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":17192,
+ "byteOffset":85960,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":10230,
+ "byteOffset":103152,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":57600,
+ "byteOffset":113384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43200,
+ "byteOffset":170984,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43200,
+ "byteOffset":214184,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":28800,
+ "byteOffset":257384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":10800,
+ "byteOffset":286184,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":296984,
+ "uri":"CommonTree_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf.import
new file mode 100644
index 0000000..65d3a1e
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://2uujdwdr5ch3"
+path="res://.godot/imported/CommonTree_3.gltf-d6fb59459e96851668c8147414afacc1.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_3.gltf"
+dest_files=["res://.godot/imported/CommonTree_3.gltf-d6fb59459e96851668c8147414afacc1.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.bin
new file mode 100644
index 0000000..14c2760
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf
new file mode 100644
index 0000000..5e8037d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"CommonTree_4"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_NormalTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.026",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_NormalTree_C",
+ "uri":"Leaves_NormalTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":4328,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":4328,
+ "max":[
+ 1.236419439315796,
+ 7.957448959350586,
+ 1.0542998313903809
+ ],
+ "min":[
+ -1.167366862297058,
+ -0.24277201294898987,
+ -1.212726354598999
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":4328,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":4328,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":9840,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":1572,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1572,
+ "max":[
+ 2.028430461883545,
+ 9.195609092712402,
+ 1.6757631301879883
+ ],
+ "min":[
+ -1.7970952987670898,
+ 5.8085174560546875,
+ -2.0796103477478027
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":1572,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":1572,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":2358,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":69248,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":51936,
+ "byteOffset":69248,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":51936,
+ "byteOffset":121184,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":34624,
+ "byteOffset":173120,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":19680,
+ "byteOffset":207744,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":25152,
+ "byteOffset":227424,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":18864,
+ "byteOffset":252576,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":18864,
+ "byteOffset":271440,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":12576,
+ "byteOffset":290304,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4716,
+ "byteOffset":302880,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":307596,
+ "uri":"CommonTree_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf.import
new file mode 100644
index 0000000..72e6595
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://vqmg1haj578u"
+path="res://.godot/imported/CommonTree_4.gltf-491a9746f1d2172b4db75f2d59759e3a.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_4.gltf"
+dest_files=["res://.godot/imported/CommonTree_4.gltf-491a9746f1d2172b4db75f2d59759e3a.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.bin
new file mode 100644
index 0000000..6341419
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf
new file mode 100644
index 0000000..6a45ffc
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"CommonTree_5"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_NormalTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.027",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_NormalTree_C",
+ "uri":"Leaves_NormalTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":2273,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":2273,
+ "max":[
+ 0.9063012599945068,
+ 5.4537034034729,
+ 0.8049076795578003
+ ],
+ "min":[
+ -0.8957228064537048,
+ -0.24277201294898987,
+ -0.920511782169342
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":2273,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":2273,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":5646,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":2600,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":2600,
+ "max":[
+ 1.7588107585906982,
+ 6.763467788696289,
+ 2.057202100753784
+ ],
+ "min":[
+ -1.912354588508606,
+ 2.356473684310913,
+ -2.162447929382324
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":2600,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":2600,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":3900,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":36368,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":27276,
+ "byteOffset":36368,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":27276,
+ "byteOffset":63644,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":18184,
+ "byteOffset":90920,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":11292,
+ "byteOffset":109104,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":41600,
+ "byteOffset":120396,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":31200,
+ "byteOffset":161996,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":31200,
+ "byteOffset":193196,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":20800,
+ "byteOffset":224396,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":7800,
+ "byteOffset":245196,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":252996,
+ "uri":"CommonTree_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf.import
new file mode 100644
index 0000000..53ca95d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dtacpnynicit6"
+path="res://.godot/imported/CommonTree_5.gltf-d035d38b92b3d638758d7afb1cb79838.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/CommonTree_5.gltf"
+dest_files=["res://.godot/imported/CommonTree_5.gltf-d035d38b92b3d638758d7afb1cb79838.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.bin
new file mode 100644
index 0000000..fedbfce
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf
new file mode 100644
index 0000000..cd7f2b7
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf
@@ -0,0 +1,161 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"DeadTree_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_DeadTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree_Normal",
+ "uri":"Bark_DeadTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree",
+ "uri":"Bark_DeadTree.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":8036,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":8036,
+ "max":[
+ 3.556612253189087,
+ 9.15992259979248,
+ 2.845168113708496
+ ],
+ "min":[
+ -2.5923237800598145,
+ -0.3355545997619629,
+ -2.9034998416900635
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":8036,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":8036,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":18507,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":128576,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":96432,
+ "byteOffset":128576,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":96432,
+ "byteOffset":225008,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":64288,
+ "byteOffset":321440,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":37014,
+ "byteOffset":385728,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":422744,
+ "uri":"DeadTree_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf.import
new file mode 100644
index 0000000..7d1e7e5
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://casjbf0b3hqjf"
+path="res://.godot/imported/DeadTree_1.gltf-6ebdd15f20e5b71c58a365dc0227937d.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_1.gltf"
+dest_files=["res://.godot/imported/DeadTree_1.gltf-6ebdd15f20e5b71c58a365dc0227937d.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.bin
new file mode 100644
index 0000000..4cbfa5b
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf
new file mode 100644
index 0000000..84376ce
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf
@@ -0,0 +1,161 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"DeadTree_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_DeadTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.043",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree_Normal",
+ "uri":"Bark_DeadTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree",
+ "uri":"Bark_DeadTree.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":8635,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":8635,
+ "max":[
+ 4.397274017333984,
+ 11.152676582336426,
+ 3.8556599617004395
+ ],
+ "min":[
+ -2.332343816757202,
+ -0.3355545997619629,
+ -2.522876024246216
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":8635,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":8635,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":19671,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":138160,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":103620,
+ "byteOffset":138160,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":103620,
+ "byteOffset":241780,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":69080,
+ "byteOffset":345400,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":39342,
+ "byteOffset":414480,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":453824,
+ "uri":"DeadTree_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf.import
new file mode 100644
index 0000000..dcfc4b4
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dvcxjgvb7ejoa"
+path="res://.godot/imported/DeadTree_2.gltf-4ac243d335bae4f4d4a00e598b57f08d.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_2.gltf"
+dest_files=["res://.godot/imported/DeadTree_2.gltf-4ac243d335bae4f4d4a00e598b57f08d.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.bin
new file mode 100644
index 0000000..885b526
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf
new file mode 100644
index 0000000..54ff58d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf
@@ -0,0 +1,161 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"DeadTree_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_DeadTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.019",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree_Normal",
+ "uri":"Bark_DeadTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree",
+ "uri":"Bark_DeadTree.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":7936,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":7936,
+ "max":[
+ 2.540004014968872,
+ 12.944830894470215,
+ 3.043358564376831
+ ],
+ "min":[
+ -3.847569704055786,
+ -0.3355545997619629,
+ -3.3867006301879883
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":7936,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":7936,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":17406,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":126976,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":95232,
+ "byteOffset":126976,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":95232,
+ "byteOffset":222208,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":63488,
+ "byteOffset":317440,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":34812,
+ "byteOffset":380928,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":415740,
+ "uri":"DeadTree_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf.import
new file mode 100644
index 0000000..33637ae
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bw8bauco8g58c"
+path="res://.godot/imported/DeadTree_3.gltf-054ed568026c5d9787c96319245e1168.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_3.gltf"
+dest_files=["res://.godot/imported/DeadTree_3.gltf-054ed568026c5d9787c96319245e1168.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.bin
new file mode 100644
index 0000000..a8ab297
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf
new file mode 100644
index 0000000..8f787ec
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf
@@ -0,0 +1,161 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"DeadTree_4"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_DeadTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.018",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree_Normal",
+ "uri":"Bark_DeadTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree",
+ "uri":"Bark_DeadTree.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":7653,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":7653,
+ "max":[
+ 4.59817361831665,
+ 12.435422897338867,
+ 4.133494853973389
+ ],
+ "min":[
+ -3.3627684116363525,
+ -0.3355545997619629,
+ -3.5989503860473633
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":7653,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":7653,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":17106,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":122448,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":91836,
+ "byteOffset":122448,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":91836,
+ "byteOffset":214284,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":61224,
+ "byteOffset":306120,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":34212,
+ "byteOffset":367344,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":401556,
+ "uri":"DeadTree_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf.import
new file mode 100644
index 0000000..8b5f932
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://w70pjhduw3mu"
+path="res://.godot/imported/DeadTree_4.gltf-f1c072b1498028a37d478e3c1dd774c6.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_4.gltf"
+dest_files=["res://.godot/imported/DeadTree_4.gltf-f1c072b1498028a37d478e3c1dd774c6.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.bin
new file mode 100644
index 0000000..e027070
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf
new file mode 100644
index 0000000..8c4cb9a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf
@@ -0,0 +1,161 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"DeadTree_5"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_DeadTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.021",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree_Normal",
+ "uri":"Bark_DeadTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_DeadTree",
+ "uri":"Bark_DeadTree.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":7499,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":7499,
+ "max":[
+ 4.385861396789551,
+ 16.10182762145996,
+ 3.616036891937256
+ ],
+ "min":[
+ -3.9705328941345215,
+ -0.3355545997619629,
+ -4.7972307205200195
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":7499,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":7499,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":16944,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":119984,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":89988,
+ "byteOffset":119984,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":89988,
+ "byteOffset":209972,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":59992,
+ "byteOffset":299960,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":33888,
+ "byteOffset":359952,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":393840,
+ "uri":"DeadTree_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf.import
new file mode 100644
index 0000000..51eb82e
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://c6efibn4o0dxp"
+path="res://.godot/imported/DeadTree_5.gltf-067c4d02a3b45a9eaa20b9a3ea06bfc7.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/DeadTree_5.gltf"
+dest_files=["res://.godot/imported/DeadTree_5.gltf-067c4d02a3b45a9eaa20b9a3ea06bfc7.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.bin
new file mode 100644
index 0000000..8712382
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf
new file mode 100644
index 0000000..2be91c7
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf
@@ -0,0 +1,152 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Fern_1"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.023",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":243,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":243,
+ "max":[
+ 4.626213073730469,
+ 2.4413082599639893,
+ 4.396108150482178
+ ],
+ "min":[
+ -4.419975280761719,
+ -0.2474701851606369,
+ -4.091315746307373
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":243,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":243,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":864,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1944,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2916,
+ "byteOffset":1944,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2916,
+ "byteOffset":4860,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1944,
+ "byteOffset":7776,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1728,
+ "byteOffset":9720,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":11448,
+ "uri":"Fern_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf.import
new file mode 100644
index 0000000..c8a2d33
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bfp7grhaneysx"
+path="res://.godot/imported/Fern_1.gltf-0a32a0ce69c64a9bcfc3b382924efd55.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Fern_1.gltf"
+dest_files=["res://.godot/imported/Fern_1.gltf-0a32a0ce69c64a9bcfc3b382924efd55.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.bin
new file mode 100644
index 0000000..faa36e3
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf
new file mode 100644
index 0000000..e1e0839
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf
@@ -0,0 +1,254 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Flower_3_Group"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.021",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":533,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":533,
+ "max":[
+ 0.7883017063140869,
+ 1.7742599248886108,
+ 0.7045559287071228
+ ],
+ "min":[
+ -0.568230926990509,
+ -0.03458359092473984,
+ -0.5427353382110596
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":533,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":533,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":2130,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5123,
+ "count":48,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":48,
+ "max":[
+ 0.8748752474784851,
+ 2.020251512527466,
+ 0.789365291595459
+ ],
+ "min":[
+ -0.6136013269424438,
+ 1.4516462087631226,
+ -0.8017617464065552
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":48,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":48,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":135,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":4264,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6396,
+ "byteOffset":4264,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6396,
+ "byteOffset":10660,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4264,
+ "byteOffset":17056,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4260,
+ "byteOffset":21320,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":384,
+ "byteOffset":25580,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":576,
+ "byteOffset":25964,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":576,
+ "byteOffset":26540,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":384,
+ "byteOffset":27116,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":270,
+ "byteOffset":27500,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":27772,
+ "uri":"Flower_3_Group.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf.import
new file mode 100644
index 0000000..1e7f9ab
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://tr3sfgg1nmhw"
+path="res://.godot/imported/Flower_3_Group.gltf-ac323c192c57e13129a9b103b979bffe.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Group.gltf"
+dest_files=["res://.godot/imported/Flower_3_Group.gltf-ac323c192c57e13129a9b103b979bffe.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.bin
new file mode 100644
index 0000000..f129c6c
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf
new file mode 100644
index 0000000..748168a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf
@@ -0,0 +1,254 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Flower_3_Single"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.020",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":211,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":211,
+ "max":[
+ 0.42587125301361084,
+ 1.7716585397720337,
+ 0.35561174154281616
+ ],
+ "min":[
+ -0.48073863983154297,
+ -0.018326954916119576,
+ -0.520720362663269
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":211,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":211,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":810,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5123,
+ "count":16,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":16,
+ "max":[
+ 0.42078328132629395,
+ 2.0498666763305664,
+ 0.3568156957626343
+ ],
+ "min":[
+ -0.27247604727745056,
+ 1.755362868309021,
+ -0.3710358142852783
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":45,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1688,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2532,
+ "byteOffset":1688,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2532,
+ "byteOffset":4220,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1688,
+ "byteOffset":6752,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1620,
+ "byteOffset":8440,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":128,
+ "byteOffset":10060,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":10188,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":10380,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":128,
+ "byteOffset":10572,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":90,
+ "byteOffset":10700,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":10792,
+ "uri":"Flower_3_Single.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf.import
new file mode 100644
index 0000000..0be9061
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://0e1vjsxt4627"
+path="res://.godot/imported/Flower_3_Single.gltf-5c25dedbf5a86583d0db49befb6d9b22.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_3_Single.gltf"
+dest_files=["res://.godot/imported/Flower_3_Single.gltf-5c25dedbf5a86583d0db49befb6d9b22.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.bin
new file mode 100644
index 0000000..f0b3ca4
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf
new file mode 100644
index 0000000..e879edf
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf
@@ -0,0 +1,254 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Flower_4_Group"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.003",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":302,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":302,
+ "max":[
+ 0.6255365610122681,
+ 2.2943496704101562,
+ 0.5279141068458557
+ ],
+ "min":[
+ -0.7901612520217896,
+ -0.05699761211872101,
+ -0.6181322932243347
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":302,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":302,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1470,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5123,
+ "count":1000,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1000,
+ "max":[
+ 0.8491399884223938,
+ 2.4297707080841064,
+ 0.7313783168792725
+ ],
+ "min":[
+ -0.9313857555389404,
+ 1.122023582458496,
+ -0.6361504197120667
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":1000,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":1000,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":3600,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2416,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3624,
+ "byteOffset":2416,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3624,
+ "byteOffset":6040,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2416,
+ "byteOffset":9664,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2940,
+ "byteOffset":12080,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":8000,
+ "byteOffset":15020,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":12000,
+ "byteOffset":23020,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":12000,
+ "byteOffset":35020,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":8000,
+ "byteOffset":47020,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":7200,
+ "byteOffset":55020,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":62220,
+ "uri":"Flower_4_Group.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf.import
new file mode 100644
index 0000000..a18fbe9
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://s2aqb5e6bhi2"
+path="res://.godot/imported/Flower_4_Group.gltf-4f8fa9031c096d3d9c2a81f80f7e8a6d.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Group.gltf"
+dest_files=["res://.godot/imported/Flower_4_Group.gltf-4f8fa9031c096d3d9c2a81f80f7e8a6d.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.bin
new file mode 100644
index 0000000..8d615e4
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf
new file mode 100644
index 0000000..9392686
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf
@@ -0,0 +1,254 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Flower_4_Single"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.001",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":99,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":99,
+ "max":[
+ 0.56728196144104,
+ 2.2943310737609863,
+ 0.21159152686595917
+ ],
+ "min":[
+ -0.5050064325332642,
+ -0.03043048270046711,
+ -0.3631875216960907
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":99,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":99,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":486,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5123,
+ "count":400,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":400,
+ "max":[
+ 0.3805691599845886,
+ 2.388728618621826,
+ 0.37106218934059143
+ ],
+ "min":[
+ -0.39627349376678467,
+ 1.1264549493789673,
+ -0.40180256962776184
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":400,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":400,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":1440,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":792,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1188,
+ "byteOffset":792,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1188,
+ "byteOffset":1980,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":792,
+ "byteOffset":3168,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":972,
+ "byteOffset":3960,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":3200,
+ "byteOffset":4932,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4800,
+ "byteOffset":8132,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4800,
+ "byteOffset":12932,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3200,
+ "byteOffset":17732,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2880,
+ "byteOffset":20932,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":23812,
+ "uri":"Flower_4_Single.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf.import
new file mode 100644
index 0000000..d5feea3
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cltn7hsac6w12"
+path="res://.godot/imported/Flower_4_Single.gltf-b7c6538343eba528dad7f738fef7c1e6.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Flower_4_Single.gltf"
+dest_files=["res://.godot/imported/Flower_4_Single.gltf-b7c6538343eba528dad7f738fef7c1e6.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png
new file mode 100644
index 0000000..8220419
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png.import
new file mode 100644
index 0000000..de12adb
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b01x4gufwp3gr"
+path.s3tc="res://.godot/imported/Flowers.png-ed5665a6a5771f8b0daa5dd0ee47749b.s3tc.ctex"
+path.etc2="res://.godot/imported/Flowers.png-ed5665a6a5771f8b0daa5dd0ee47749b.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Flowers.png"
+dest_files=["res://.godot/imported/Flowers.png-ed5665a6a5771f8b0daa5dd0ee47749b.s3tc.ctex", "res://.godot/imported/Flowers.png-ed5665a6a5771f8b0daa5dd0ee47749b.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png
new file mode 100644
index 0000000..b401c27
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png.import
new file mode 100644
index 0000000..2688a0e
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c1qg1n8vkc76x"
+path.s3tc="res://.godot/imported/Grass.png-d984b81e9f5a1c6cbc37962c386c02a1.s3tc.ctex"
+path.etc2="res://.godot/imported/Grass.png-d984b81e9f5a1c6cbc37962c386c02a1.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass.png"
+dest_files=["res://.godot/imported/Grass.png-d984b81e9f5a1c6cbc37962c386c02a1.s3tc.ctex", "res://.godot/imported/Grass.png-d984b81e9f5a1c6cbc37962c386c02a1.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.bin
new file mode 100644
index 0000000..82f7730
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf
new file mode 100644
index 0000000..ae46364
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf
@@ -0,0 +1,150 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Grass_Common_Short"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Grass",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.014",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Grass",
+ "uri":"Grass.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":153,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":153,
+ "max":[
+ 0.2832280695438385,
+ 1.311718225479126,
+ 0.25788721442222595
+ ],
+ "min":[
+ -0.3556424081325531,
+ -0.022385215386748314,
+ -0.47937828302383423
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":153,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":153,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":465,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1224,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1836,
+ "byteOffset":1224,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1836,
+ "byteOffset":3060,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1224,
+ "byteOffset":4896,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":930,
+ "byteOffset":6120,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":7052,
+ "uri":"Grass_Common_Short.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf.import
new file mode 100644
index 0000000..70dd2de
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://b7kqcww3lkm48"
+path="res://.godot/imported/Grass_Common_Short.gltf-86b75dfc8a924d8bdb2bbffc4e7bf212.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Short.gltf"
+dest_files=["res://.godot/imported/Grass_Common_Short.gltf-86b75dfc8a924d8bdb2bbffc4e7bf212.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.bin
new file mode 100644
index 0000000..69b3c7f
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf
new file mode 100644
index 0000000..b131470
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf
@@ -0,0 +1,150 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Grass_Common_Tall"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Grass",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.013",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Grass",
+ "uri":"Grass.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":303,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":303,
+ "max":[
+ 0.49152159690856934,
+ 1.841333031654358,
+ 0.5140784978866577
+ ],
+ "min":[
+ -0.40356767177581787,
+ -0.031362250447273254,
+ -0.47903335094451904
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":303,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":303,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":978,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2424,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3636,
+ "byteOffset":2424,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3636,
+ "byteOffset":6060,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2424,
+ "byteOffset":9696,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1956,
+ "byteOffset":12120,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":14076,
+ "uri":"Grass_Common_Tall.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf.import
new file mode 100644
index 0000000..0cb65ec
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dcwi5cmusqadc"
+path="res://.godot/imported/Grass_Common_Tall.gltf-0b3e3157fd6ed23b9f82403c9b2d35b3.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Common_Tall.gltf"
+dest_files=["res://.godot/imported/Grass_Common_Tall.gltf-0b3e3157fd6ed23b9f82403c9b2d35b3.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.bin
new file mode 100644
index 0000000..bb62b37
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf
new file mode 100644
index 0000000..9e73049
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf
@@ -0,0 +1,150 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Grass_Wispy_Short"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Grass",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.033",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Grass",
+ "uri":"Grass.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":559,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":559,
+ "max":[
+ 0.5941424369812012,
+ 0.9860967993736267,
+ 0.6269333362579346
+ ],
+ "min":[
+ -0.7280435562133789,
+ -0.08575008809566498,
+ -0.5828109979629517
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":559,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":559,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1482,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":4472,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6708,
+ "byteOffset":4472,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6708,
+ "byteOffset":11180,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4472,
+ "byteOffset":17888,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2964,
+ "byteOffset":22360,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":25324,
+ "uri":"Grass_Wispy_Short.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf.import
new file mode 100644
index 0000000..f8ffdfa
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dd4xa20jgag5p"
+path="res://.godot/imported/Grass_Wispy_Short.gltf-7f2766df36ff44f050e9f8aeb5443aad.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Short.gltf"
+dest_files=["res://.godot/imported/Grass_Wispy_Short.gltf-7f2766df36ff44f050e9f8aeb5443aad.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.bin
new file mode 100644
index 0000000..b747e42
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf
new file mode 100644
index 0000000..2821e49
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf
@@ -0,0 +1,150 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Grass_Wispy_Tall"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Grass",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.017",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Grass",
+ "uri":"Grass.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":644,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":644,
+ "max":[
+ 0.8008279800415039,
+ 1.6357505321502686,
+ 0.7751253247261047
+ ],
+ "min":[
+ -0.7392446994781494,
+ -0.03605181723833084,
+ -0.8185906410217285
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":644,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":644,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1866,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":5152,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":7728,
+ "byteOffset":5152,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":7728,
+ "byteOffset":12880,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5152,
+ "byteOffset":20608,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3732,
+ "byteOffset":25760,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":29492,
+ "uri":"Grass_Wispy_Tall.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf.import
new file mode 100644
index 0000000..a7ab646
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://83rdw2mqt4qn"
+path="res://.godot/imported/Grass_Wispy_Tall.gltf-b0246b337ed2ffc752745ab7c33efb1e.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Grass_Wispy_Tall.gltf"
+dest_files=["res://.godot/imported/Grass_Wispy_Tall.gltf-b0246b337ed2ffc752745ab7c33efb1e.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png
new file mode 100644
index 0000000..109ac05
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png.import
new file mode 100644
index 0000000..e417e56
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cjqumxduhqspr"
+path="res://.godot/imported/Leaf_Pine.png-c83034aa1ac19bfdf760d778dc776bc4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine.png"
+dest_files=["res://.godot/imported/Leaf_Pine.png-c83034aa1ac19bfdf760d778dc776bc4.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png
new file mode 100644
index 0000000..9d1e0ac
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png.import
new file mode 100644
index 0000000..fef4333
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dql0ux6c2dded"
+path.s3tc="res://.godot/imported/Leaf_Pine_C.png-73d4bd3555e352cacb0a23bfc8d9ddff.s3tc.ctex"
+path.etc2="res://.godot/imported/Leaf_Pine_C.png-73d4bd3555e352cacb0a23bfc8d9ddff.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaf_Pine_C.png"
+dest_files=["res://.godot/imported/Leaf_Pine_C.png-73d4bd3555e352cacb0a23bfc8d9ddff.s3tc.ctex", "res://.godot/imported/Leaf_Pine_C.png-73d4bd3555e352cacb0a23bfc8d9ddff.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png
new file mode 100644
index 0000000..e2bd85a
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png.import
new file mode 100644
index 0000000..e9a39d3
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://wep3lfvqm5ra"
+path.s3tc="res://.godot/imported/Leaves.png-157ebe064dc0151d778728b50311f466.s3tc.ctex"
+path.etc2="res://.godot/imported/Leaves.png-157ebe064dc0151d778728b50311f466.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves.png"
+dest_files=["res://.godot/imported/Leaves.png-157ebe064dc0151d778728b50311f466.s3tc.ctex", "res://.godot/imported/Leaves.png-157ebe064dc0151d778728b50311f466.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png
new file mode 100644
index 0000000..1e757b1
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png.import
new file mode 100644
index 0000000..dbeac71
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bkkjdnmopuwbe"
+path="res://.godot/imported/Leaves_GiantPine_C.png-b5e780ce1e6d00b26ead9cc1bd54dcad.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_GiantPine_C.png"
+dest_files=["res://.godot/imported/Leaves_GiantPine_C.png-b5e780ce1e6d00b26ead9cc1bd54dcad.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png
new file mode 100644
index 0000000..ea1735e
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png.import
new file mode 100644
index 0000000..bef58fd
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buxjxj67t8lcu"
+path="res://.godot/imported/Leaves_NormalTree.png-17052fdb429b464648f9fe7f4db2e9d1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree.png"
+dest_files=["res://.godot/imported/Leaves_NormalTree.png-17052fdb429b464648f9fe7f4db2e9d1.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png
new file mode 100644
index 0000000..2be63af
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png.import
new file mode 100644
index 0000000..0c5fa20
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bcw52u5fvml8k"
+path.s3tc="res://.godot/imported/Leaves_NormalTree_C.png-041fe050661f1fbd8ab1290835742f1f.s3tc.ctex"
+path.etc2="res://.godot/imported/Leaves_NormalTree_C.png-041fe050661f1fbd8ab1290835742f1f.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_NormalTree_C.png"
+dest_files=["res://.godot/imported/Leaves_NormalTree_C.png-041fe050661f1fbd8ab1290835742f1f.s3tc.ctex", "res://.godot/imported/Leaves_NormalTree_C.png-041fe050661f1fbd8ab1290835742f1f.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png
new file mode 100644
index 0000000..2d3caa9
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png.import
new file mode 100644
index 0000000..b27e10d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d16fb6ogoptl0"
+path="res://.godot/imported/Leaves_TwistedTree.png-6a6eb8ef03adda98c54f63d587239b7e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree.png"
+dest_files=["res://.godot/imported/Leaves_TwistedTree.png-6a6eb8ef03adda98c54f63d587239b7e.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png
new file mode 100644
index 0000000..3897e2f
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png.import
new file mode 100644
index 0000000..16828f9
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bevandxthicb3"
+path.s3tc="res://.godot/imported/Leaves_TwistedTree_C.png-9ec2587df996c332877ffa8d9d061272.s3tc.ctex"
+path.etc2="res://.godot/imported/Leaves_TwistedTree_C.png-9ec2587df996c332877ffa8d9d061272.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Leaves_TwistedTree_C.png"
+dest_files=["res://.godot/imported/Leaves_TwistedTree_C.png-9ec2587df996c332877ffa8d9d061272.s3tc.ctex", "res://.godot/imported/Leaves_TwistedTree_C.png-9ec2587df996c332877ffa8d9d061272.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.bin
new file mode 100644
index 0000000..b99724f
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf
new file mode 100644
index 0000000..3d660b2
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Mushroom_Common"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Mushrooms",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.032",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Mushrooms",
+ "uri":"Mushrooms.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":555,
+ "max":[
+ 0.23032501339912415,
+ 0.4460097551345825,
+ 0.3339020013809204
+ ],
+ "min":[
+ -0.33337587118148804,
+ -0.017470968887209892,
+ -0.44521069526672363
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":555,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":555,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":2640,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":6660,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6660,
+ "byteOffset":6660,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4440,
+ "byteOffset":13320,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5280,
+ "byteOffset":17760,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":23040,
+ "uri":"Mushroom_Common.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf.import
new file mode 100644
index 0000000..5d5af72
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bro7mix4pom88"
+path="res://.godot/imported/Mushroom_Common.gltf-ab9124e3dae03c458125914fa735eea0.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Common.gltf"
+dest_files=["res://.godot/imported/Mushroom_Common.gltf-ab9124e3dae03c458125914fa735eea0.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.bin
new file mode 100644
index 0000000..24435e1
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf
new file mode 100644
index 0000000..a453b52
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Mushroom_Laetiporus"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Mushrooms",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.020",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Mushrooms",
+ "uri":"Mushrooms.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":1806,
+ "max":[
+ 0.716213583946228,
+ 0.606732964515686,
+ 0.7748813629150391
+ ],
+ "min":[
+ -0.6498190760612488,
+ -0.16022536158561707,
+ -0.32830116152763367
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":1806,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":1806,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":9648,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":21672,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21672,
+ "byteOffset":21672,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14448,
+ "byteOffset":43344,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":19296,
+ "byteOffset":57792,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":77088,
+ "uri":"Mushroom_Laetiporus.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf.import
new file mode 100644
index 0000000..849a114
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://c3g4srf555dmi"
+path="res://.godot/imported/Mushroom_Laetiporus.gltf-ac077b6f4acb74984477377101e1a440.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushroom_Laetiporus.gltf"
+dest_files=["res://.godot/imported/Mushroom_Laetiporus.gltf-ac077b6f4acb74984477377101e1a440.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png
new file mode 100644
index 0000000..c5d11a3
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png.import
new file mode 100644
index 0000000..0a61a4d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://y6iwboc18njp"
+path.s3tc="res://.godot/imported/Mushrooms.png-7ea86b8755d2d0d49ad08698e127ce25.s3tc.ctex"
+path.etc2="res://.godot/imported/Mushrooms.png-7ea86b8755d2d0d49ad08698e127ce25.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Mushrooms.png"
+dest_files=["res://.godot/imported/Mushrooms.png-7ea86b8755d2d0d49ad08698e127ce25.s3tc.ctex", "res://.godot/imported/Mushrooms.png-7ea86b8755d2d0d49ad08698e127ce25.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png
new file mode 100644
index 0000000..02bf5f5
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png.import
new file mode 100644
index 0000000..3b939b4
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dxccllbs47a4a"
+path.s3tc="res://.godot/imported/PathRocks_Diffuse.png-dabdbf85c89e8104ee3b3f70ed1bffbd.s3tc.ctex"
+path.etc2="res://.godot/imported/PathRocks_Diffuse.png-dabdbf85c89e8104ee3b3f70ed1bffbd.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/PathRocks_Diffuse.png"
+dest_files=["res://.godot/imported/PathRocks_Diffuse.png-dabdbf85c89e8104ee3b3f70ed1bffbd.s3tc.ctex", "res://.godot/imported/PathRocks_Diffuse.png-dabdbf85c89e8104ee3b3f70ed1bffbd.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.bin
new file mode 100644
index 0000000..b2f6135
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf
new file mode 100644
index 0000000..d8790e6
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Round_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.008",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":292,
+ "max":[
+ 0.28022968769073486,
+ 0.08767858147621155,
+ 0.20741015672683716
+ ],
+ "min":[
+ -0.21980905532836914,
+ -0.0077979713678359985,
+ -0.15961268544197083
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":292,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":292,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":408,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":3504,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3504,
+ "byteOffset":3504,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2336,
+ "byteOffset":7008,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":816,
+ "byteOffset":9344,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":10160,
+ "uri":"Pebble_Round_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf.import
new file mode 100644
index 0000000..79a2bb2
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://d246ykfafkuv5"
+path="res://.godot/imported/Pebble_Round_1.gltf-e94658bfa001aab821642be3ace4a330.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_1.gltf"
+dest_files=["res://.godot/imported/Pebble_Round_1.gltf-e94658bfa001aab821642be3ace4a330.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.bin
new file mode 100644
index 0000000..482195e
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf
new file mode 100644
index 0000000..93c4c69
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Round_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.010",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":212,
+ "max":[
+ 0.23427341878414154,
+ 0.09124953299760818,
+ 0.1887856125831604
+ ],
+ "min":[
+ -0.21520347893238068,
+ -0.0029801998753100634,
+ -0.22227312624454498
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":212,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":212,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":342,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2544,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2544,
+ "byteOffset":2544,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1696,
+ "byteOffset":5088,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":684,
+ "byteOffset":6784,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":7468,
+ "uri":"Pebble_Round_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf.import
new file mode 100644
index 0000000..577a2d9
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://do0xrk34tbaff"
+path="res://.godot/imported/Pebble_Round_2.gltf-e6d2aa5e9daa138ed6d54c9d817e4fbb.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_2.gltf"
+dest_files=["res://.godot/imported/Pebble_Round_2.gltf-e6d2aa5e9daa138ed6d54c9d817e4fbb.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.bin
new file mode 100644
index 0000000..32501e8
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf
new file mode 100644
index 0000000..80837b0
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Round_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.009",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":244,
+ "max":[
+ 0.22259299457073212,
+ 0.09686936438083649,
+ 0.2633242607116699
+ ],
+ "min":[
+ -0.22709830105304718,
+ -0.0017530163750052452,
+ -0.22148603200912476
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":244,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":244,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":384,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2928,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2928,
+ "byteOffset":2928,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1952,
+ "byteOffset":5856,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":768,
+ "byteOffset":7808,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":8576,
+ "uri":"Pebble_Round_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf.import
new file mode 100644
index 0000000..6e3765d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bar5tanb4xvae"
+path="res://.godot/imported/Pebble_Round_3.gltf-4039d6126d12edf0f810f4f5558aed87.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_3.gltf"
+dest_files=["res://.godot/imported/Pebble_Round_3.gltf-4039d6126d12edf0f810f4f5558aed87.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.bin
new file mode 100644
index 0000000..38b42c0
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf
new file mode 100644
index 0000000..dae858d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Round_4"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":266,
+ "max":[
+ 0.19573403894901276,
+ 0.0937667116522789,
+ 0.22166091203689575
+ ],
+ "min":[
+ -0.2105470895767212,
+ -0.00563192879781127,
+ -0.23073677718639374
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":266,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":266,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":378,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":3192,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3192,
+ "byteOffset":3192,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2128,
+ "byteOffset":6384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":756,
+ "byteOffset":8512,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":9268,
+ "uri":"Pebble_Round_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf.import
new file mode 100644
index 0000000..a0fc3be
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://tibr266agofx"
+path="res://.godot/imported/Pebble_Round_4.gltf-b6ff8573289e43d9077bd29147fe1e13.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_4.gltf"
+dest_files=["res://.godot/imported/Pebble_Round_4.gltf-b6ff8573289e43d9077bd29147fe1e13.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.bin
new file mode 100644
index 0000000..8a14554
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf
new file mode 100644
index 0000000..b3878df
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Round_5"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.007",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":254,
+ "max":[
+ 0.20201954245567322,
+ 0.09668100625276566,
+ 0.1452593356370926
+ ],
+ "min":[
+ -0.21657367050647736,
+ -0.00414585554972291,
+ -0.20099897682666779
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":254,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":254,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":372,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":3048,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3048,
+ "byteOffset":3048,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2032,
+ "byteOffset":6096,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":744,
+ "byteOffset":8128,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":8872,
+ "uri":"Pebble_Round_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf.import
new file mode 100644
index 0000000..a5bc20a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://i8ofkuxtkx5i"
+path="res://.godot/imported/Pebble_Round_5.gltf-8df4299380ad32f4b3bc60006d635690.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Round_5.gltf"
+dest_files=["res://.godot/imported/Pebble_Round_5.gltf-8df4299380ad32f4b3bc60006d635690.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.bin
new file mode 100644
index 0000000..2afe492
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf
new file mode 100644
index 0000000..cbfd916
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Square_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.006",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":216,
+ "max":[
+ 0.20128773152828217,
+ 0.1277286410331726,
+ 0.23776745796203613
+ ],
+ "min":[
+ -0.23334957659244537,
+ -0.0022022530902177095,
+ -0.20187555253505707
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":216,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":216,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":312,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2592,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2592,
+ "byteOffset":2592,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1728,
+ "byteOffset":5184,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":624,
+ "byteOffset":6912,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":7536,
+ "uri":"Pebble_Square_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf.import
new file mode 100644
index 0000000..d764141
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://210sm8g2r1bl"
+path="res://.godot/imported/Pebble_Square_1.gltf-efcce217cc5d8547b10d97bef59ab195.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_1.gltf"
+dest_files=["res://.godot/imported/Pebble_Square_1.gltf-efcce217cc5d8547b10d97bef59ab195.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.bin
new file mode 100644
index 0000000..f61bbf7
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf
new file mode 100644
index 0000000..6f9a00c
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Square_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.004",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":162,
+ "max":[
+ 0.19046445190906525,
+ 0.13527964055538177,
+ 0.160864919424057
+ ],
+ "min":[
+ -0.2006315439939499,
+ -0.005164282396435738,
+ -0.11938932538032532
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":162,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":162,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":234,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1944,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1944,
+ "byteOffset":1944,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1296,
+ "byteOffset":3888,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":468,
+ "byteOffset":5184,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":5652,
+ "uri":"Pebble_Square_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf.import
new file mode 100644
index 0000000..630ea46
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dj03rv1axh61m"
+path="res://.godot/imported/Pebble_Square_2.gltf-c10327ab6f4c605e3fc89d442d43744f.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_2.gltf"
+dest_files=["res://.godot/imported/Pebble_Square_2.gltf-c10327ab6f4c605e3fc89d442d43744f.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.bin
new file mode 100644
index 0000000..71816d1
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf
new file mode 100644
index 0000000..73453b1
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Square_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.003",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":108,
+ "max":[
+ 0.18668454885482788,
+ 0.1508151739835739,
+ 0.15225757658481598
+ ],
+ "min":[
+ -0.18665164709091187,
+ -0.00811817031353712,
+ -0.16649161279201508
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":108,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":108,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":156,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1296,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1296,
+ "byteOffset":1296,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":864,
+ "byteOffset":2592,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":312,
+ "byteOffset":3456,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":3768,
+ "uri":"Pebble_Square_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf.import
new file mode 100644
index 0000000..a4bb53e
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://w65j2i36yd0y"
+path="res://.godot/imported/Pebble_Square_3.gltf-19474e661c4f38cb2c2021ec58bd2cff.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_3.gltf"
+dest_files=["res://.godot/imported/Pebble_Square_3.gltf-19474e661c4f38cb2c2021ec58bd2cff.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.bin
new file mode 100644
index 0000000..f198c9b
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf
new file mode 100644
index 0000000..02b8883
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Square_4"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.001",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":96,
+ "max":[
+ 0.16872341930866241,
+ 0.16551485657691956,
+ 0.1331545114517212
+ ],
+ "min":[
+ -0.17121998965740204,
+ -0.0027762739919126034,
+ -0.15767109394073486
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":96,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":96,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":144,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1152,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1152,
+ "byteOffset":1152,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":768,
+ "byteOffset":2304,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":288,
+ "byteOffset":3072,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":3360,
+ "uri":"Pebble_Square_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf.import
new file mode 100644
index 0000000..72dbbec
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://hxmxho8lmarg"
+path="res://.godot/imported/Pebble_Square_4.gltf-f7962dcd599ee3e6eb8a0f3b0ebf5e96.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_4.gltf"
+dest_files=["res://.godot/imported/Pebble_Square_4.gltf-f7962dcd599ee3e6eb8a0f3b0ebf5e96.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.bin
new file mode 100644
index 0000000..a3b06c8
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf
new file mode 100644
index 0000000..5c8e9a8
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Square_5"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.002",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":156,
+ "max":[
+ 0.18346840143203735,
+ 0.14420261979103088,
+ 0.22290711104869843
+ ],
+ "min":[
+ -0.16856330633163452,
+ -0.00795699656009674,
+ -0.22753244638442993
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":156,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":156,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":216,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1872,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1872,
+ "byteOffset":1872,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1248,
+ "byteOffset":3744,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":432,
+ "byteOffset":4992,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":5424,
+ "uri":"Pebble_Square_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf.import
new file mode 100644
index 0000000..ebcf67c
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dynwub7nlhko4"
+path="res://.godot/imported/Pebble_Square_5.gltf-a00e6dafdace9f4cf76c4341900dbfc8.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_5.gltf"
+dest_files=["res://.godot/imported/Pebble_Square_5.gltf-a00e6dafdace9f4cf76c4341900dbfc8.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.bin
new file mode 100644
index 0000000..2a6a36b
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf
new file mode 100644
index 0000000..d8db232
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pebble_Square_6"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.005",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":139,
+ "max":[
+ 0.24700631201267242,
+ 0.12762853503227234,
+ 0.14230100810527802
+ ],
+ "min":[
+ -0.21502231061458588,
+ -0.010146240703761578,
+ -0.12062107771635056
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":139,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":139,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":195,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1668,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1668,
+ "byteOffset":1668,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1112,
+ "byteOffset":3336,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":390,
+ "byteOffset":4448,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":4840,
+ "uri":"Pebble_Square_6.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf.import
new file mode 100644
index 0000000..95aa28e
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://s1uwt3ctgxam"
+path="res://.godot/imported/Pebble_Square_6.gltf-93df3dd296401a4bff2f5420f65d39d3.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pebble_Square_6.gltf"
+dest_files=["res://.godot/imported/Pebble_Square_6.gltf-93df3dd296401a4bff2f5420f65d39d3.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.bin
new file mode 100644
index 0000000..a6a2c2d
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf
new file mode 100644
index 0000000..438d848
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Petal_1"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.028",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":14,
+ "max":[
+ 0.20332272350788116,
+ 0.24367444217205048,
+ 0.22596585750579834
+ ],
+ "min":[
+ -0.256916344165802,
+ 1.184918232866039e-06,
+ -0.22899580001831055
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":14,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":14,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":39,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":168,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":168,
+ "byteOffset":168,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":112,
+ "byteOffset":336,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":78,
+ "byteOffset":448,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":528,
+ "uri":"Petal_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf.import
new file mode 100644
index 0000000..0651de2
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://0sppcd6f1bgp"
+path="res://.godot/imported/Petal_1.gltf-e51eddf04ff2121d6d4266f0b6d45cf0.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_1.gltf"
+dest_files=["res://.godot/imported/Petal_1.gltf-e51eddf04ff2121d6d4266f0b6d45cf0.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.bin
new file mode 100644
index 0000000..8814902
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf
new file mode 100644
index 0000000..2c0040f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Petal_2"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.024",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":16,
+ "max":[
+ 0.3525437116622925,
+ 0.23606069386005402,
+ 0.30195337533950806
+ ],
+ "min":[
+ -0.32067161798477173,
+ 0,
+ -0.3291413486003876
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":45,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":192,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":128,
+ "byteOffset":384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":90,
+ "byteOffset":512,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":604,
+ "uri":"Petal_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf.import
new file mode 100644
index 0000000..b6ca77f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cpbpdccnkw0we"
+path="res://.godot/imported/Petal_2.gltf-947636f03cc7b95544ef3e730c17802d.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_2.gltf"
+dest_files=["res://.godot/imported/Petal_2.gltf-947636f03cc7b95544ef3e730c17802d.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.bin
new file mode 100644
index 0000000..631d508
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf
new file mode 100644
index 0000000..891d063
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Petal_3"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cylinder.011",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":16,
+ "max":[
+ 0.3044891953468323,
+ 0.18948519229888916,
+ 0.3329152464866638
+ ],
+ "min":[
+ -0.31499457359313965,
+ 2.0768348463207076e-07,
+ -0.27345067262649536
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":45,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":192,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":128,
+ "byteOffset":384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":90,
+ "byteOffset":512,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":604,
+ "uri":"Petal_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf.import
new file mode 100644
index 0000000..68e9f4a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dupsl4x0g074w"
+path="res://.godot/imported/Petal_3.gltf-a8c2540c0e07965ab5c963a3761fc54a.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_3.gltf"
+dest_files=["res://.godot/imported/Petal_3.gltf-a8c2540c0e07965ab5c963a3761fc54a.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.bin
new file mode 100644
index 0000000..013362f
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf
new file mode 100644
index 0000000..ddfced8
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Petal_4"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.027",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":25,
+ "max":[
+ 0.1856984794139862,
+ 0.25205618143081665,
+ 0.12215583026409149
+ ],
+ "min":[
+ -0.1433948129415512,
+ -1.3743051852088684e-07,
+ -0.12229615449905396
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":25,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":25,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":90,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":300,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":300,
+ "byteOffset":300,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":200,
+ "byteOffset":600,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":180,
+ "byteOffset":800,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":980,
+ "uri":"Petal_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf.import
new file mode 100644
index 0000000..753cd02
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dsik7c8fypya"
+path="res://.godot/imported/Petal_4.gltf-07fc4dd966767e0ed08f1e9e83df7719.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_4.gltf"
+dest_files=["res://.godot/imported/Petal_4.gltf-07fc4dd966767e0ed08f1e9e83df7719.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.bin
new file mode 100644
index 0000000..099c272
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf
new file mode 100644
index 0000000..68b0ca6
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Petal_5"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Flowers",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.029",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Flowers",
+ "uri":"Flowers.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":16,
+ "max":[
+ 0.43301600217819214,
+ 0.2898155748844147,
+ 0.3756616413593292
+ ],
+ "min":[
+ -0.40094661712646484,
+ 0.0010437477612867951,
+ -0.4195518493652344
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":16,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":45,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":192,
+ "byteOffset":192,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":128,
+ "byteOffset":384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":90,
+ "byteOffset":512,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":604,
+ "uri":"Petal_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf.import
new file mode 100644
index 0000000..001786d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bwanejg30lgat"
+path="res://.godot/imported/Petal_5.gltf-c1ffcb0d3054049f5c0cb01a52b3678a.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Petal_5.gltf"
+dest_files=["res://.godot/imported/Petal_5.gltf-c1ffcb0d3054049f5c0cb01a52b3678a.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.bin
new file mode 100644
index 0000000..3a4fda5
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf
new file mode 100644
index 0000000..28011ce
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pine_1"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_Pine",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.028",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaf_Pine_C",
+ "uri":"Leaf_Pine_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":4076,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":4076,
+ "max":[
+ 1.3389160633087158,
+ 6.822727203369141,
+ 1.3303884267807007
+ ],
+ "min":[
+ -1.0975136756896973,
+ -0.23508860170841217,
+ -1.8778250217437744
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":4076,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":4076,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":9531,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":1170,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1170,
+ "max":[
+ 2.4958789348602295,
+ 7.081829071044922,
+ 2.0614705085754395
+ ],
+ "min":[
+ -2.448819160461426,
+ 2.158754587173462,
+ -2.4769327640533447
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":1170,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":1170,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":2310,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":65216,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":48912,
+ "byteOffset":65216,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":48912,
+ "byteOffset":114128,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":32608,
+ "byteOffset":163040,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":19062,
+ "byteOffset":195648,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":18720,
+ "byteOffset":214712,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14040,
+ "byteOffset":233432,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14040,
+ "byteOffset":247472,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":9360,
+ "byteOffset":261512,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4620,
+ "byteOffset":270872,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":275492,
+ "uri":"Pine_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf.import
new file mode 100644
index 0000000..11711c9
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dufujtjltaaxs"
+path="res://.godot/imported/Pine_1.gltf-81646bde88f2e77ae08ae46958a6b031.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_1.gltf"
+dest_files=["res://.godot/imported/Pine_1.gltf-81646bde88f2e77ae08ae46958a6b031.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.bin
new file mode 100644
index 0000000..d7008b5
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf
new file mode 100644
index 0000000..74bd68b
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pine_2"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_Pine",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.029",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaf_Pine_C",
+ "uri":"Leaf_Pine_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":3616,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":3616,
+ "max":[
+ 1.3288283348083496,
+ 6.861804008483887,
+ 1.4154813289642334
+ ],
+ "min":[
+ -0.8798791170120239,
+ -0.23508860170841217,
+ -1.9060800075531006
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":3616,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":3616,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":8634,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":1310,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1310,
+ "max":[
+ 2.8361265659332275,
+ 7.141149520874023,
+ 2.527508020401001
+ ],
+ "min":[
+ -2.891958236694336,
+ 1.1175905466079712,
+ -2.6936988830566406
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":1310,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":1310,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":2310,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":57856,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43392,
+ "byteOffset":57856,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43392,
+ "byteOffset":101248,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":28928,
+ "byteOffset":144640,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":17268,
+ "byteOffset":173568,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":20960,
+ "byteOffset":190836,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":15720,
+ "byteOffset":211796,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":15720,
+ "byteOffset":227516,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":10480,
+ "byteOffset":243236,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4620,
+ "byteOffset":253716,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":258336,
+ "uri":"Pine_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf.import
new file mode 100644
index 0000000..d7e40e0
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://ccgnpu0xnng5a"
+path="res://.godot/imported/Pine_2.gltf-fa08fe15af098d36635d2dc5e253d60d.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_2.gltf"
+dest_files=["res://.godot/imported/Pine_2.gltf-fa08fe15af098d36635d2dc5e253d60d.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.bin
new file mode 100644
index 0000000..700f525
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf
new file mode 100644
index 0000000..a6fbe7a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pine_3"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_Pine",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.030",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaf_Pine_C",
+ "uri":"Leaf_Pine_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":5772,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":5772,
+ "max":[
+ 1.0800867080688477,
+ 6.998227119445801,
+ 1.1170551776885986
+ ],
+ "min":[
+ -0.9482465982437134,
+ -0.23508860170841217,
+ -1.2420871257781982
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":5772,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":5772,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":13506,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":801,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":801,
+ "max":[
+ 1.4976577758789062,
+ 7.157110214233398,
+ 1.7034649848937988
+ ],
+ "min":[
+ -2.113736867904663,
+ 3.187588691711426,
+ -2.2923386096954346
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":801,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":801,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":1386,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":92352,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":69264,
+ "byteOffset":92352,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":69264,
+ "byteOffset":161616,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":46176,
+ "byteOffset":230880,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":27012,
+ "byteOffset":277056,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":12816,
+ "byteOffset":304068,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":9612,
+ "byteOffset":316884,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":9612,
+ "byteOffset":326496,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6408,
+ "byteOffset":336108,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2772,
+ "byteOffset":342516,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":345288,
+ "uri":"Pine_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf.import
new file mode 100644
index 0000000..ad59215
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bxbdepyikafo7"
+path="res://.godot/imported/Pine_3.gltf-2ca4c2a2627f8aef91def453ea6b0a8b.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_3.gltf"
+dest_files=["res://.godot/imported/Pine_3.gltf-2ca4c2a2627f8aef91def453ea6b0a8b.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.bin
new file mode 100644
index 0000000..1539cc3
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf
new file mode 100644
index 0000000..5b13853
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pine_4"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_Pine",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.031",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaf_Pine_C",
+ "uri":"Leaf_Pine_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":2978,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":2978,
+ "max":[
+ 1.9782183170318604,
+ 9.700387001037598,
+ 0.8374438285827637
+ ],
+ "min":[
+ -1.9725096225738525,
+ -0.23508861660957336,
+ -1.9964979887008667
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":2978,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":2978,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":6480,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":1910,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1910,
+ "max":[
+ 2.930187225341797,
+ 10.0013427734375,
+ 2.424938201904297
+ ],
+ "min":[
+ -2.8718371391296387,
+ 2.4392924308776855,
+ -2.9459073543548584
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":1910,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":1910,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":3630,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":47648,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":35736,
+ "byteOffset":47648,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":35736,
+ "byteOffset":83384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":23824,
+ "byteOffset":119120,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":12960,
+ "byteOffset":142944,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":30560,
+ "byteOffset":155904,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":22920,
+ "byteOffset":186464,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":22920,
+ "byteOffset":209384,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":15280,
+ "byteOffset":232304,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":7260,
+ "byteOffset":247584,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":254844,
+ "uri":"Pine_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf.import
new file mode 100644
index 0000000..0f3fa84
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://n0gjppt4p4e6"
+path="res://.godot/imported/Pine_4.gltf-4d5528f91afe6c123fd160ac0cf77f94.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_4.gltf"
+dest_files=["res://.godot/imported/Pine_4.gltf-4d5528f91afe6c123fd160ac0cf77f94.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.bin
new file mode 100644
index 0000000..4e92f32
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf
new file mode 100644
index 0000000..17af6cb
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf
@@ -0,0 +1,264 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Pine_5"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Bark_NormalTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_Pine",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.032",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree_Normal",
+ "uri":"Bark_NormalTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_NormalTree",
+ "uri":"Bark_NormalTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaf_Pine_C",
+ "uri":"Leaf_Pine_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":542,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":542,
+ "max":[
+ 0.6472557783126831,
+ 8.332257270812988,
+ 0.4739142060279846
+ ],
+ "min":[
+ -0.47391438484191895,
+ -0.23508861660957336,
+ -1.5000479221343994
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":542,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":542,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1464,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":1773,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1773,
+ "max":[
+ 3.432434320449829,
+ 8.48871898651123,
+ 2.4435970783233643
+ ],
+ "min":[
+ -2.987706422805786,
+ 1.453586220741272,
+ -3.7784042358398438
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":1773,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":1773,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":3474,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":8672,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6504,
+ "byteOffset":8672,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6504,
+ "byteOffset":15176,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4336,
+ "byteOffset":21680,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2928,
+ "byteOffset":26016,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":28368,
+ "byteOffset":28944,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21276,
+ "byteOffset":57312,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21276,
+ "byteOffset":78588,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14184,
+ "byteOffset":99864,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6948,
+ "byteOffset":114048,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":120996,
+ "uri":"Pine_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf.import
new file mode 100644
index 0000000..4595719
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://d1mo4t8r61ws8"
+path="res://.godot/imported/Pine_5.gltf-056ab9b14c325d58ede8e33813077092.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Pine_5.gltf"
+dest_files=["res://.godot/imported/Pine_5.gltf-056ab9b14c325d58ede8e33813077092.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.bin
new file mode 100644
index 0000000..86913fe
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf
new file mode 100644
index 0000000..93995b7
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf
@@ -0,0 +1,152 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Plant_1"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.036",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":120,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":120,
+ "max":[
+ 0.562667191028595,
+ 0.978546142578125,
+ 0.6224353909492493
+ ],
+ "min":[
+ -0.7107237577438354,
+ -0.0350240021944046,
+ -0.7635920643806458
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":120,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":120,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":360,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":960,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1440,
+ "byteOffset":960,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1440,
+ "byteOffset":2400,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":960,
+ "byteOffset":3840,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":720,
+ "byteOffset":4800,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":5520,
+ "uri":"Plant_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf.import
new file mode 100644
index 0000000..242d409
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://csr35xospt8sd"
+path="res://.godot/imported/Plant_1.gltf-741bf2a8087ea904a5345ed659dc9c86.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1.gltf"
+dest_files=["res://.godot/imported/Plant_1.gltf-741bf2a8087ea904a5345ed659dc9c86.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.bin
new file mode 100644
index 0000000..cf8ddd3
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf
new file mode 100644
index 0000000..ce9aef6
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf
@@ -0,0 +1,152 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Plant_1_Big"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.035",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5123,
+ "count":360,
+ "normalized":true,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":360,
+ "max":[
+ 1.4963372945785522,
+ 3.7003872394561768,
+ 1.4680646657943726
+ ],
+ "min":[
+ -1.394121527671814,
+ -0.05603840574622154,
+ -1.6583820581436157
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":360,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":360,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":1080,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2880,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4320,
+ "byteOffset":2880,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4320,
+ "byteOffset":7200,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2880,
+ "byteOffset":11520,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2160,
+ "byteOffset":14400,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":16560,
+ "uri":"Plant_1_Big.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf.import
new file mode 100644
index 0000000..060dc44
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://8pd0jcr2tuvb"
+path="res://.godot/imported/Plant_1_Big.gltf-f55e6ceb9ee19adb95280518dc9cdad1.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_1_Big.gltf"
+dest_files=["res://.godot/imported/Plant_1_Big.gltf-f55e6ceb9ee19adb95280518dc9cdad1.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.bin
new file mode 100644
index 0000000..dc4853a
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf
new file mode 100644
index 0000000..5ea3c20
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Plant_7"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.011",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":54,
+ "max":[
+ 0.5996842384338379,
+ 0.3286193609237671,
+ 0.4982551336288452
+ ],
+ "min":[
+ -0.44815123081207275,
+ 0.07910457253456116,
+ -0.46386587619781494
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":54,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":54,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":144,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":648,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":648,
+ "byteOffset":648,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":432,
+ "byteOffset":1296,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":288,
+ "byteOffset":1728,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":2016,
+ "uri":"Plant_7.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf.import
new file mode 100644
index 0000000..39dd10f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dvo8c5jq6gv07"
+path="res://.godot/imported/Plant_7.gltf-a6a3576e6ba4b46bdbcbec756ffc1333.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7.gltf"
+dest_files=["res://.godot/imported/Plant_7.gltf-a6a3576e6ba4b46bdbcbec756ffc1333.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.bin
new file mode 100644
index 0000000..c5b4222
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf
new file mode 100644
index 0000000..f8309ea
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf
@@ -0,0 +1,138 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Plant_7_Big"
+ }
+ ],
+ "materials":[
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Plane.079",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Leaves",
+ "uri":"Leaves.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":126,
+ "max":[
+ 0.6097632646560669,
+ 0.3037440776824951,
+ 0.5116460919380188
+ ],
+ "min":[
+ -0.7010567784309387,
+ 0.05031152814626694,
+ -0.8505279421806335
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":126,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":126,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":336,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":1512,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1512,
+ "byteOffset":1512,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1008,
+ "byteOffset":3024,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":672,
+ "byteOffset":4032,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":4704,
+ "uri":"Plant_7_Big.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf.import
new file mode 100644
index 0000000..61eab6a
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dg03q1ovobajw"
+path="res://.godot/imported/Plant_7_Big.gltf-d354a1d4b83a586038e5f94b5df0e092.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Plant_7_Big.gltf"
+dest_files=["res://.godot/imported/Plant_7_Big.gltf-d354a1d4b83a586038e5f94b5df0e092.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.bin
new file mode 100644
index 0000000..672cd2b
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf
new file mode 100644
index 0000000..b28029f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Round_Small_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.012",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":2036,
+ "max":[
+ 0.5184587240219116,
+ 0.10394920408725739,
+ 0.7730143070220947
+ ],
+ "min":[
+ -0.5380551815032959,
+ -0.008882608264684677,
+ -0.703344464302063
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":2036,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":2036,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":2994,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":24432,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":24432,
+ "byteOffset":24432,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":16288,
+ "byteOffset":48864,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5988,
+ "byteOffset":65152,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":71140,
+ "uri":"RockPath_Round_Small_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf.import
new file mode 100644
index 0000000..67061de
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dl0vstcowusi5"
+path="res://.godot/imported/RockPath_Round_Small_1.gltf-6b376bd0cb66a4e170af562f94b86f40.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_1.gltf"
+dest_files=["res://.godot/imported/RockPath_Round_Small_1.gltf-6b376bd0cb66a4e170af562f94b86f40.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.bin
new file mode 100644
index 0000000..85f0b92
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf
new file mode 100644
index 0000000..87e0bd8
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Round_Small_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.013",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":2264,
+ "max":[
+ 0.5792431235313416,
+ 0.09686935693025589,
+ 0.5954861640930176
+ ],
+ "min":[
+ -0.5602763891220093,
+ -0.0077979713678359985,
+ -0.7587976455688477
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":2264,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":2264,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":3378,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":27168,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":27168,
+ "byteOffset":27168,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":18112,
+ "byteOffset":54336,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6756,
+ "byteOffset":72448,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":79204,
+ "uri":"RockPath_Round_Small_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf.import
new file mode 100644
index 0000000..781d904
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bbyiskyh6v8hn"
+path="res://.godot/imported/RockPath_Round_Small_2.gltf-fc81c913e334f79652de7cdc32491eea.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_2.gltf"
+dest_files=["res://.godot/imported/RockPath_Round_Small_2.gltf-fc81c913e334f79652de7cdc32491eea.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.bin
new file mode 100644
index 0000000..e63ed19
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf
new file mode 100644
index 0000000..4ac11cf
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Round_Small_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.014",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":2026,
+ "max":[
+ 0.5917490720748901,
+ 0.10147523880004883,
+ 0.5997233390808105
+ ],
+ "min":[
+ -0.5872809290885925,
+ -0.007797975093126297,
+ -0.6902713775634766
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":2026,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":2026,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":3006,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":24312,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":24312,
+ "byteOffset":24312,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":16208,
+ "byteOffset":48624,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6012,
+ "byteOffset":64832,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":70844,
+ "uri":"RockPath_Round_Small_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf.import
new file mode 100644
index 0000000..9badecb
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://c0ems57d554jo"
+path="res://.godot/imported/RockPath_Round_Small_3.gltf-a563bc5563247def52c61c21986d07ad.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Small_3.gltf"
+dest_files=["res://.godot/imported/RockPath_Round_Small_3.gltf-a563bc5563247def52c61c21986d07ad.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.bin
new file mode 100644
index 0000000..4327453
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf
new file mode 100644
index 0000000..20d1013
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Round_Thin"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.074",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":4556,
+ "max":[
+ 0.7602781653404236,
+ 0.10147523880004883,
+ 1.00310480594635
+ ],
+ "min":[
+ -0.6970729231834412,
+ -0.008862055838108063,
+ -1.0861014127731323
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":4556,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":4556,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":6762,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":54672,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":54672,
+ "byteOffset":54672,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":36448,
+ "byteOffset":109344,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":13524,
+ "byteOffset":145792,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":159316,
+ "uri":"RockPath_Round_Thin.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf.import
new file mode 100644
index 0000000..9544277
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bl8h22krdco86"
+path="res://.godot/imported/RockPath_Round_Thin.gltf-d13d534e9ffe00ee60bf335a33ff726a.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Thin.gltf"
+dest_files=["res://.godot/imported/RockPath_Round_Thin.gltf-d13d534e9ffe00ee60bf335a33ff726a.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.bin
new file mode 100644
index 0000000..02e524e
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf
new file mode 100644
index 0000000..4d6e6bd
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Round_Wide"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.028",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":7084,
+ "max":[
+ 1.0626386404037476,
+ 0.10394921153783798,
+ 1.00310480594635
+ ],
+ "min":[
+ -1.0479755401611328,
+ -0.008882611989974976,
+ -1.125931739807129
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":7084,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":7084,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":10500,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":85008,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":85008,
+ "byteOffset":85008,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":56672,
+ "byteOffset":170016,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21000,
+ "byteOffset":226688,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":247688,
+ "uri":"RockPath_Round_Wide.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf.import
new file mode 100644
index 0000000..6ad8c7f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cey6kq1q5w225"
+path="res://.godot/imported/RockPath_Round_Wide.gltf-b98419cb74cf375f73d2758f174a0ba3.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Round_Wide.gltf"
+dest_files=["res://.godot/imported/RockPath_Round_Wide.gltf-b98419cb74cf375f73d2758f174a0ba3.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.bin
new file mode 100644
index 0000000..e95e213
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf
new file mode 100644
index 0000000..13903b9
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Square_Small_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.016",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":1633,
+ "max":[
+ 0.49995994567871094,
+ 0.14124737679958344,
+ 0.4995327293872833
+ ],
+ "min":[
+ -0.518924355506897,
+ -0.008622835390269756,
+ -0.4743192493915558
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":1633,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":1633,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":2349,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":19596,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":19596,
+ "byteOffset":19596,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":13064,
+ "byteOffset":39192,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4698,
+ "byteOffset":52256,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":56956,
+ "uri":"RockPath_Square_Small_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf.import
new file mode 100644
index 0000000..5f4c19f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://b3y41idstc7xn"
+path="res://.godot/imported/RockPath_Square_Small_1.gltf-fdf473b355cc48023635237225229cef.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_1.gltf"
+dest_files=["res://.godot/imported/RockPath_Square_Small_1.gltf-fdf473b355cc48023635237225229cef.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.bin
new file mode 100644
index 0000000..83864d1
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf
new file mode 100644
index 0000000..4bfb9f1
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Square_Small_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.011",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":1165,
+ "max":[
+ 0.4951825737953186,
+ 0.13612976670265198,
+ 0.4721206724643707
+ ],
+ "min":[
+ -0.4975392818450928,
+ -0.013205458410084248,
+ -0.4939475357532501
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":1165,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":1165,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":1677,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":13980,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":13980,
+ "byteOffset":13980,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":9320,
+ "byteOffset":27960,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3354,
+ "byteOffset":37280,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":40636,
+ "uri":"RockPath_Square_Small_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf.import
new file mode 100644
index 0000000..63dbefa
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bpitq4ka6fwqh"
+path="res://.godot/imported/RockPath_Square_Small_2.gltf-270c0b1b3550cdb9555733dd1a9c0cc2.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_2.gltf"
+dest_files=["res://.godot/imported/RockPath_Square_Small_2.gltf-270c0b1b3550cdb9555733dd1a9c0cc2.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.bin
new file mode 100644
index 0000000..c511fd3
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf
new file mode 100644
index 0000000..4ca3955
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Square_Small_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.015",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":1176,
+ "max":[
+ 0.43974483013153076,
+ 0.16551485657691956,
+ 0.5275344848632812
+ ],
+ "min":[
+ -0.3961157500743866,
+ -0.00811817031353712,
+ -0.5487543344497681
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":1176,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":1176,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":1704,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":14112,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14112,
+ "byteOffset":14112,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":9408,
+ "byteOffset":28224,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3408,
+ "byteOffset":37632,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":41040,
+ "uri":"RockPath_Square_Small_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf.import
new file mode 100644
index 0000000..ce69496
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bph0xt1mwjf66"
+path="res://.godot/imported/RockPath_Square_Small_3.gltf-3d68aac119ee65990a74db2f4282d40b.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Small_3.gltf"
+dest_files=["res://.godot/imported/RockPath_Square_Small_3.gltf-3d68aac119ee65990a74db2f4282d40b.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.bin
new file mode 100644
index 0000000..972d8ed
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf
new file mode 100644
index 0000000..7baf548
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Square_Thin"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.073",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":3727,
+ "max":[
+ 0.7916909456253052,
+ 0.16620168089866638,
+ 0.9846768975257874
+ ],
+ "min":[
+ -0.7681896090507507,
+ -0.010146241635084152,
+ -1.0022598505020142
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":3727,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":3727,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":5379,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":44724,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":44724,
+ "byteOffset":44724,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":29816,
+ "byteOffset":89448,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":10758,
+ "byteOffset":119264,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":130024,
+ "uri":"RockPath_Square_Thin.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf.import
new file mode 100644
index 0000000..506e0c3
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://x7yp2e10kjxr"
+path="res://.godot/imported/RockPath_Square_Thin.gltf-b0b29782162c3f3fc82a4db3ee31c575.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Thin.gltf"
+dest_files=["res://.godot/imported/RockPath_Square_Thin.gltf-b0b29782162c3f3fc82a4db3ee31c575.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.bin
new file mode 100644
index 0000000..5efedd5
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf
new file mode 100644
index 0000000..0ec8479
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"RockPath_Square_Wide"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"PathRocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.017_Retopology.038",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"PathRocks_Diffuse",
+ "uri":"PathRocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":4712,
+ "max":[
+ 1.0278809070587158,
+ 0.16620168089866638,
+ 0.9870055913925171
+ ],
+ "min":[
+ -1.0236998796463013,
+ -0.010146240703761578,
+ -0.9999311566352844
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":4712,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":4712,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":6768,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":56544,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":56544,
+ "byteOffset":56544,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":37696,
+ "byteOffset":113088,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":13536,
+ "byteOffset":150784,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":164320,
+ "uri":"RockPath_Square_Wide.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf.import
new file mode 100644
index 0000000..38ab35d
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bkolsuftd1x6v"
+path="res://.godot/imported/RockPath_Square_Wide.gltf-6dbcef4908a741b7c77c3eb07356bd0d.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/RockPath_Square_Wide.gltf"
+dest_files=["res://.godot/imported/RockPath_Square_Wide.gltf-6dbcef4908a741b7c77c3eb07356bd0d.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.bin
new file mode 100644
index 0000000..3b8d132
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf
new file mode 100644
index 0000000..9771563
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Rock_Medium_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Rocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.005_Retopology.001",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Rocks_Diffuse",
+ "uri":"Rocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":351,
+ "max":[
+ 1.4978611469268799,
+ 1.988665223121643,
+ 1.8392531871795654
+ ],
+ "min":[
+ -1.7272872924804688,
+ -0.27113133668899536,
+ -1.1498832702636719
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":351,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":351,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":1026,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":4212,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4212,
+ "byteOffset":4212,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2808,
+ "byteOffset":8424,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2052,
+ "byteOffset":11232,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":13284,
+ "uri":"Rock_Medium_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf.import
new file mode 100644
index 0000000..31b3000
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cuv15vdpp026r"
+path="res://.godot/imported/Rock_Medium_1.gltf-db387a770fafb5908f8d560b3e036236.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_1.gltf"
+dest_files=["res://.godot/imported/Rock_Medium_1.gltf-db387a770fafb5908f8d560b3e036236.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.bin
new file mode 100644
index 0000000..064074d
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf
new file mode 100644
index 0000000..233555e
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Rock_Medium_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Rocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.004_Retopology.001",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Rocks_Diffuse",
+ "uri":"Rocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":249,
+ "max":[
+ 1.3351185321807861,
+ 1.8481333255767822,
+ 1.3199462890625
+ ],
+ "min":[
+ -1.713641881942749,
+ -0.05084158852696419,
+ -1.1591253280639648
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":249,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":249,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":732,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":2988,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":2988,
+ "byteOffset":2988,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1992,
+ "byteOffset":5976,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":1464,
+ "byteOffset":7968,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":9432,
+ "uri":"Rock_Medium_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf.import
new file mode 100644
index 0000000..5997813
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bkm021qxw51w8"
+path="res://.godot/imported/Rock_Medium_2.gltf-fb8db707ee14946dd1ce9e321d5fb69e.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_2.gltf"
+dest_files=["res://.godot/imported/Rock_Medium_2.gltf-fb8db707ee14946dd1ce9e321d5fb69e.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.bin
new file mode 100644
index 0000000..9eb3d53
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf
new file mode 100644
index 0000000..252e5cf
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf
@@ -0,0 +1,136 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Rock_Medium_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Rocks",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":0
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Cube.002_Retopology.001",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Rocks_Diffuse",
+ "uri":"Rocks_Diffuse.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":531,
+ "max":[
+ 1.5958054065704346,
+ 2.000638246536255,
+ 2.5856480598449707
+ ],
+ "min":[
+ -1.8242793083190918,
+ -0.31564441323280334,
+ -0.8904620409011841
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":531,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":531,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":1566,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":6372,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":6372,
+ "byteOffset":6372,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":4248,
+ "byteOffset":12744,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":3132,
+ "byteOffset":16992,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":20124,
+ "uri":"Rock_Medium_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf.import
new file mode 100644
index 0000000..3fe2d51
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://cua03lyxt3pvj"
+path="res://.godot/imported/Rock_Medium_3.gltf-26d6b6b1a281bd4d62947e4b5cb7e3aa.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Rock_Medium_3.gltf"
+dest_files=["res://.godot/imported/Rock_Medium_3.gltf-26d6b6b1a281bd4d62947e4b5cb7e3aa.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png
new file mode 100644
index 0000000..42f6c3b
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png.import
new file mode 100644
index 0000000..02b882f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://mmcsh8ex5q42"
+path="res://.godot/imported/Rocks_Desert_Diffuse.png-2d328d9fcfadbefe555cc357de4d8449.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Desert_Diffuse.png"
+dest_files=["res://.godot/imported/Rocks_Desert_Diffuse.png-2d328d9fcfadbefe555cc357de4d8449.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png
new file mode 100644
index 0000000..fff5ca5
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png.import
new file mode 100644
index 0000000..11dcef6
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8ww6sv4tkqxp"
+path.s3tc="res://.godot/imported/Rocks_Diffuse.png-55b71b83462aa4648b885b38dfa3e7c9.s3tc.ctex"
+path.etc2="res://.godot/imported/Rocks_Diffuse.png-55b71b83462aa4648b885b38dfa3e7c9.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/Rocks_Diffuse.png"
+dest_files=["res://.godot/imported/Rocks_Diffuse.png-55b71b83462aa4648b885b38dfa3e7c9.s3tc.ctex", "res://.godot/imported/Rocks_Diffuse.png-55b71b83462aa4648b885b38dfa3e7c9.etc2.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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.bin
new file mode 100644
index 0000000..4362f44
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf
new file mode 100644
index 0000000..77ee3ea
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf
@@ -0,0 +1,262 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"TwistedTree_1"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_TwistedTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_TwistedTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.038",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree_Normal",
+ "uri":"Bark_TwistedTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree",
+ "uri":"Bark_TwistedTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_TwistedTree_C",
+ "uri":"Leaves_TwistedTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":9360,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":9360,
+ "max":[
+ 9.911966323852539,
+ 15.281858444213867,
+ 3.4427638053894043
+ ],
+ "min":[
+ -1.498000979423523,
+ -0.20147469639778137,
+ -5.117466926574707
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":9360,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":9360,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":21636,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":4704,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":4704,
+ "max":[
+ 11.341513633728027,
+ 16.52402114868164,
+ 4.822585105895996
+ ],
+ "min":[
+ -2.174241065979004,
+ 2.4449024200439453,
+ -6.726779460906982
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":4704,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":4704,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":7056,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":149760,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":112320,
+ "byteOffset":149760,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":112320,
+ "byteOffset":262080,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":74880,
+ "byteOffset":374400,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43272,
+ "byteOffset":449280,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":75264,
+ "byteOffset":492552,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":56448,
+ "byteOffset":567816,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":56448,
+ "byteOffset":624264,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":37632,
+ "byteOffset":680712,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14112,
+ "byteOffset":718344,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":732456,
+ "uri":"TwistedTree_1.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf.import
new file mode 100644
index 0000000..cccb809
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://dunwgbf2ggnv2"
+path="res://.godot/imported/TwistedTree_1.gltf-417473bc1664be897cf7eba658f822f7.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_1.gltf"
+dest_files=["res://.godot/imported/TwistedTree_1.gltf-417473bc1664be897cf7eba658f822f7.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.bin
new file mode 100644
index 0000000..520f5ad
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf
new file mode 100644
index 0000000..97db482
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf
@@ -0,0 +1,262 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"TwistedTree_2"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_TwistedTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_TwistedTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.039",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree_Normal",
+ "uri":"Bark_TwistedTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree",
+ "uri":"Bark_TwistedTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_TwistedTree_C",
+ "uri":"Leaves_TwistedTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":8719,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":8719,
+ "max":[
+ 3.0595297813415527,
+ 17.562589645385742,
+ 2.152212142944336
+ ],
+ "min":[
+ -5.446475505828857,
+ -0.20147468149662018,
+ -4.334892272949219
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":8719,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":8719,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":20370,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":4688,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":4688,
+ "max":[
+ 3.942902088165283,
+ 18.74772834777832,
+ 3.661869764328003
+ ],
+ "min":[
+ -6.619970321655273,
+ 4.4927978515625,
+ -5.540718078613281
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":4688,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":4688,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":7032,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":139504,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":104628,
+ "byteOffset":139504,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":104628,
+ "byteOffset":244132,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":69752,
+ "byteOffset":348760,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":40740,
+ "byteOffset":418512,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":75008,
+ "byteOffset":459252,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":56256,
+ "byteOffset":534260,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":56256,
+ "byteOffset":590516,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":37504,
+ "byteOffset":646772,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":14064,
+ "byteOffset":684276,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":698340,
+ "uri":"TwistedTree_2.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf.import
new file mode 100644
index 0000000..552e2f6
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bn7u20xn16nef"
+path="res://.godot/imported/TwistedTree_2.gltf-371f66c884f2375c9ad65ba7d3292d98.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_2.gltf"
+dest_files=["res://.godot/imported/TwistedTree_2.gltf-371f66c884f2375c9ad65ba7d3292d98.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.bin
new file mode 100644
index 0000000..0e57535
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf
new file mode 100644
index 0000000..d7c5cf1
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf
@@ -0,0 +1,262 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"TwistedTree_3"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_TwistedTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_TwistedTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.040",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree_Normal",
+ "uri":"Bark_TwistedTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree",
+ "uri":"Bark_TwistedTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_TwistedTree_C",
+ "uri":"Leaves_TwistedTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":9405,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":9405,
+ "max":[
+ 5.440822124481201,
+ 14.757431983947754,
+ 3.588460922241211
+ ],
+ "min":[
+ -3.039580821990967,
+ -0.20147468149662018,
+ -5.2718305587768555
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":9405,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":9405,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":22167,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":5400,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":5400,
+ "max":[
+ 6.867476463317871,
+ 15.871066093444824,
+ 4.985528945922852
+ ],
+ "min":[
+ -4.49001932144165,
+ 1.901405930519104,
+ -6.520090103149414
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":5400,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":5400,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":8100,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":150480,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":112860,
+ "byteOffset":150480,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":112860,
+ "byteOffset":263340,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":75240,
+ "byteOffset":376200,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":44334,
+ "byteOffset":451440,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":86400,
+ "byteOffset":495776,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":64800,
+ "byteOffset":582176,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":64800,
+ "byteOffset":646976,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43200,
+ "byteOffset":711776,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":16200,
+ "byteOffset":754976,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":771176,
+ "uri":"TwistedTree_3.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf.import
new file mode 100644
index 0000000..42aecbe
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://db3nscmckshfu"
+path="res://.godot/imported/TwistedTree_3.gltf-8552d0060173886622daf45a1f1f2819.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_3.gltf"
+dest_files=["res://.godot/imported/TwistedTree_3.gltf-8552d0060173886622daf45a1f1f2819.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.bin
new file mode 100644
index 0000000..19aad18
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf
new file mode 100644
index 0000000..e172aa4
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf
@@ -0,0 +1,262 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"TwistedTree_4"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_TwistedTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_TwistedTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.041",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree_Normal",
+ "uri":"Bark_TwistedTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree",
+ "uri":"Bark_TwistedTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_TwistedTree_C",
+ "uri":"Leaves_TwistedTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":9176,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":9176,
+ "max":[
+ 4.80446195602417,
+ 17.352516174316406,
+ 2.777181386947632
+ ],
+ "min":[
+ -2.732177972793579,
+ -0.20147468149662018,
+ -6.009294033050537
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":9176,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":9176,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":20700,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":5400,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":5400,
+ "max":[
+ 6.053491592407227,
+ 18.536760330200195,
+ 4.150291442871094
+ ],
+ "min":[
+ -4.327320098876953,
+ 2.1321682929992676,
+ -7.142794609069824
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":5400,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":5400,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":8100,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":146816,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":110112,
+ "byteOffset":146816,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":110112,
+ "byteOffset":256928,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":73408,
+ "byteOffset":367040,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":41400,
+ "byteOffset":440448,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":86400,
+ "byteOffset":481848,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":64800,
+ "byteOffset":568248,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":64800,
+ "byteOffset":633048,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":43200,
+ "byteOffset":697848,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":16200,
+ "byteOffset":741048,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":757248,
+ "uri":"TwistedTree_4.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf.import
new file mode 100644
index 0000000..9e2a1b0
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://c1comp68ne14r"
+path="res://.godot/imported/TwistedTree_4.gltf-291a4b606aa4295378f9d5c248ead142.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_4.gltf"
+dest_files=["res://.godot/imported/TwistedTree_4.gltf-291a4b606aa4295378f9d5c248ead142.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.bin b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.bin
new file mode 100644
index 0000000..572eb27
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.bin differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf
new file mode 100644
index 0000000..312d3c1
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf
@@ -0,0 +1,262 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v4.0.44",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"TwistedTree_5"
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Bark_TwistedTree",
+ "normalTexture":{
+ "index":0
+ },
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":1
+ },
+ "metallicFactor":0
+ }
+ },
+ {
+ "alphaCutoff":0.20000000298023224,
+ "alphaMode":"MASK",
+ "doubleSided":true,
+ "name":"Leaves_TwistedTree",
+ "pbrMetallicRoughness":{
+ "baseColorTexture":{
+ "index":2
+ },
+ "metallicFactor":0
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"tree.042",
+ "primitives":[
+ {
+ "attributes":{
+ "COLOR_0":0,
+ "POSITION":1,
+ "NORMAL":2,
+ "TEXCOORD_0":3
+ },
+ "indices":4,
+ "material":0
+ },
+ {
+ "attributes":{
+ "COLOR_0":5,
+ "POSITION":6,
+ "NORMAL":7,
+ "TEXCOORD_0":8
+ },
+ "indices":9,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "textures":[
+ {
+ "sampler":0,
+ "source":0
+ },
+ {
+ "sampler":0,
+ "source":1
+ },
+ {
+ "sampler":0,
+ "source":2
+ }
+ ],
+ "images":[
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree_Normal",
+ "uri":"Bark_TwistedTree_Normal.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Bark_TwistedTree",
+ "uri":"Bark_TwistedTree.png"
+ },
+ {
+ "mimeType":"image/png",
+ "name":"Leaves_TwistedTree_C",
+ "uri":"Leaves_TwistedTree_C.png"
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":9603,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":9603,
+ "max":[
+ 4.437458515167236,
+ 14.353582382202148,
+ 1.6412839889526367
+ ],
+ "min":[
+ -2.2728946208953857,
+ -0.20147468149662018,
+ -5.161355018615723
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":9603,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":3,
+ "componentType":5126,
+ "count":9603,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":4,
+ "componentType":5123,
+ "count":21246,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":6044,
+ "type":"VEC4"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":6044,
+ "max":[
+ 5.748274803161621,
+ 15.460700988769531,
+ 3.0480315685272217
+ ],
+ "min":[
+ -3.7464373111724854,
+ 5.0873823165893555,
+ -6.338996887207031
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":7,
+ "componentType":5126,
+ "count":6044,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":8,
+ "componentType":5126,
+ "count":6044,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":9,
+ "componentType":5123,
+ "count":9066,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":153648,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":115236,
+ "byteOffset":153648,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":115236,
+ "byteOffset":268884,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":76824,
+ "byteOffset":384120,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":42492,
+ "byteOffset":460944,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":96704,
+ "byteOffset":503436,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":72528,
+ "byteOffset":600140,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":72528,
+ "byteOffset":672668,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":48352,
+ "byteOffset":745196,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":18132,
+ "byteOffset":793548,
+ "target":34963
+ }
+ ],
+ "samplers":[
+ {
+ "magFilter":9729,
+ "minFilter":9987
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":811680,
+ "uri":"TwistedTree_5.bin"
+ }
+ ]
+}
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf.import b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf.import
new file mode 100644
index 0000000..dfb521f
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://drb6kc4lqiopt"
+path="res://.godot/imported/TwistedTree_5.gltf-d6d161f545eca96ec7b6d8fb20c041b0.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/glTF/TwistedTree_5.gltf"
+dest_files=["res://.godot/imported/TwistedTree_5.gltf-d6d161f545eca96ec7b6d8fb20c041b0.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/glTF/desktop.ini b/assets/models/environment/stylized_nature_kit_quaternius/glTF/desktop.ini
new file mode 100644
index 0000000..b9e2e68
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/glTF/desktop.ini
@@ -0,0 +1,116 @@
+[LocalizedFileNames]
+Plant_2_Big.gltf=@Plant_2_Big,0
+Plant_1_Big.gltf=@Plant_1_Big,0
+Plant_2.gltf=@Plant_2,0
+Plant_1.gltf=@Plant_1,0
+Clover_1.gltf=@Clover_1,0
+Clover_2.gltf=@Clover_2,0
+Plant_7_Big.gltf=@Plant_7_Big,0
+Plant_7.gltf=@Plant_7,0
+Plant_6.gltf=@Plant_6,0
+Plant_4.gltf=@Plant_4,0
+Plant_3.gltf=@Plant_3,0
+Fern_1.gltf=@Fern_1,0
+Fern_2.gltf=@Fern_2,0
+Plant_5.gltf=@Plant_5,0
+Flower_7_Group.gltf=@Flower_7_Group,0
+Flower_7_Single.gltf=@Flower_7_Single,0
+Flower_3_Group.gltf=@Flower_3_Group,0
+Flower_6_2.gltf=@Flower_6_2,0
+Flower_6.gltf=@Flower_6,0
+Flower_2_Group.gltf=@Flower_2_Group,0
+Flower_2_Single.gltf=@Flower_2_Single,0
+Flower_3_Single.gltf=@Flower_3_Single,0
+Flower_4_Group.gltf=@Flower_4_Group,0
+Flower_4_Single.gltf=@Flower_4_Single,0
+Flower_1_Group.gltf=@Flower_1_Group,0
+Flower_1_Single.gltf=@Flower_1_Single,0
+Petal_6.gltf=@Petal_6,0
+Petal_5.gltf=@Petal_5,0
+Petal_4.gltf=@Petal_4,0
+Petal_3.gltf=@Petal_3,0
+Petal_2.gltf=@Petal_2,0
+Petal_1.gltf=@Petal_1,0
+Mushroom_RedCap.gltf=@Mushroom_RedCap,0
+Mushroom_Common.gltf=@Mushroom_Common,0
+Mushroom_Oyster.gltf=@Mushroom_Oyster,0
+Mushroom_Laetiporus.gltf=@Mushroom_Laetiporus,0
+Grass_Wispy_Tall.gltf=@Grass_Wispy_Tall,0
+Grass_Wide_Tall.gltf=@Grass_Wide_Tall,0
+Grass_Common_Tall.gltf=@Grass_Common_Tall,0
+Grass_Common_Short.gltf=@Grass_Common_Short,0
+Grass_Wide_Short.gltf=@Grass_Wide_Short,0
+Grass_Wheat.gltf=@Grass_Wheat,0
+Grass_Wispy_Short.gltf=@Grass_Wispy_Short,0
+Bush_Large_Flowers.gltf=@Bush_Large_Flowers,0
+Bush_Common_Flowers.gltf=@Bush_Common_Flowers,0
+Bush_Common.gltf=@Bush_Common,0
+Bush_Long_1.gltf=@Bush_Long_1,0
+Bush_Long_2.gltf=@Bush_Long_2,0
+RockPath_Round_Small_3.gltf=@RockPath_Round_Small_3,0
+RockPath_Round_Small_2.gltf=@RockPath_Round_Small_2,0
+RockPath_Round_Small_1.gltf=@RockPath_Round_Small_1,0
+RockPath_Square_Small_3.gltf=@RockPath_Square_Small_3,0
+RockPath_Square_Small_2.gltf=@RockPath_Square_Small_2,0
+RockPath_Square_Small_1.gltf=@RockPath_Square_Small_1,0
+RockPath_Round_Wide.gltf=@RockPath_Round_Wide,0
+RockPath_Round_Thin.gltf=@RockPath_Round_Thin,0
+RockPath_Square_Wide.gltf=@RockPath_Square_Wide,0
+RockPath_Square_Thin.gltf=@RockPath_Square_Thin,0
+Pebble_Square_6.gltf=@Pebble_Square_6,0
+Pebble_Square_5.gltf=@Pebble_Square_5,0
+Pebble_Square_4.gltf=@Pebble_Square_4,0
+Pebble_Square_3.gltf=@Pebble_Square_3,0
+Pebble_Square_2.gltf=@Pebble_Square_2,0
+Pebble_Square_1.gltf=@Pebble_Square_1,0
+Pebble_Round_5.gltf=@Pebble_Round_5,0
+Pebble_Round_4.gltf=@Pebble_Round_4,0
+Pebble_Round_3.gltf=@Pebble_Round_3,0
+Pebble_Round_2.gltf=@Pebble_Round_2,0
+Pebble_Round_1.gltf=@Pebble_Round_1,0
+Rock_Medium_1.gltf=@Rock_Medium_1,0
+Rock_Medium_2.gltf=@Rock_Medium_2,0
+Rock_Medium_3.gltf=@Rock_Medium_3,0
+Rock_Medium_4.gltf=@Rock_Medium_4,0
+Rock_Big_1.gltf=@Rock_Big_1,0
+Rock_Big_2.gltf=@Rock_Big_2,0
+DeadTree_2.gltf=@DeadTree_2,0
+DeadTree_3.gltf=@DeadTree_3,0
+DeadTree_4.gltf=@DeadTree_4,0
+DeadTree_5.gltf=@DeadTree_5,0
+DeadTree_1.gltf=@DeadTree_1,0
+CommonTree_1.gltf=@CommonTree_1,0
+CommonTree_2.gltf=@CommonTree_2,0
+CommonTree_3.gltf=@CommonTree_3,0
+CommonTree_4.gltf=@CommonTree_4,0
+CommonTree_5.gltf=@CommonTree_5,0
+GiantPine_3.gltf=@GiantPine_3,0
+GiantPine_4.gltf=@GiantPine_4,0
+GiantPine_1.gltf=@GiantPine_1,0
+GiantPine_2.gltf=@GiantPine_2,0
+GiantPine_5.gltf=@GiantPine_5,0
+TallThick_2.gltf=@TallThick_2,0
+TallThick_4.gltf=@TallThick_4,0
+TallThick_3.gltf=@TallThick_3,0
+TallThick_5.gltf=@TallThick_5,0
+TallThick_1.gltf=@TallThick_1,0
+Birch_5.gltf=@Birch_5,0
+Birch_3.gltf=@Birch_3,0
+Birch_2.gltf=@Birch_2,0
+Birch_1.gltf=@Birch_1,0
+Birch_4.gltf=@Birch_4,0
+TwistedTree_1.gltf=@TwistedTree_1,0
+TwistedTree_3.gltf=@TwistedTree_3,0
+TwistedTree_2.gltf=@TwistedTree_2,0
+TwistedTree_4.gltf=@TwistedTree_4,0
+TwistedTree_5.gltf=@TwistedTree_5,0
+Pine_1.gltf=@Pine_1,0
+Pine_2.gltf=@Pine_2,0
+Pine_4.gltf=@Pine_4,0
+Pine_5.gltf=@Pine_5,0
+Pine_3.gltf=@Pine_3,0
+CherryBlossom_2.gltf=@CherryBlossom_2,0
+CherryBlossom_1.gltf=@CherryBlossom_1,0
+CherryBlossom_5.gltf=@CherryBlossom_5,0
+CherryBlossom_3.gltf=@CherryBlossom_3,0
+CherryBlossom_4.gltf=@CherryBlossom_4,0
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb
new file mode 100644
index 0000000..3929425
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb.import b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb.import
new file mode 100644
index 0000000..7e0d955
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bi7vo3i6wsl2y"
+path="res://.godot/imported/plant7diedummekuh.glb-a51b74f7f415252a3386acbe91eb9883.scn"
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb"
+dest_files=["res://.godot/imported/plant7diedummekuh.glb-a51b74f7f415252a3386acbe91eb9883.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+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
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png
new file mode 100644
index 0000000..e2bd85a
Binary files /dev/null and b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png differ
diff --git a/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png.import b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png.import
new file mode 100644
index 0000000..fc9eb88
--- /dev/null
+++ b/assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png.import
@@ -0,0 +1,39 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vcxc6y1g5opj"
+path.s3tc="res://.godot/imported/plant7diedummekuh_Leaves.png-ceec7bde397c1222849591068408ddfc.s3tc.ctex"
+path.etc2="res://.godot/imported/plant7diedummekuh_Leaves.png-ceec7bde397c1222849591068408ddfc.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+generator_parameters={
+"md5": "3e67813a2e50d3252828ea3f11bcbb1e"
+}
+
+[deps]
+
+source_file="res://assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh_Leaves.png"
+dest_files=["res://.godot/imported/plant7diedummekuh_Leaves.png-ceec7bde397c1222849591068408ddfc.s3tc.ctex", "res://.godot/imported/plant7diedummekuh_Leaves.png-ceec7bde397c1222849591068408ddfc.etc2.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
diff --git a/game.tscn b/game.tscn
index 034df1e..039f4be 100644
--- a/game.tscn
+++ b/game.tscn
@@ -1,13 +1,13 @@
[gd_scene load_steps=4 format=3 uid="uid://cswuap81n7t3f"]
[ext_resource type="Script" path="res://game.gd" id="1_mfbtr"]
-[ext_resource type="PackedScene" uid="uid://bhhqaysqjw2d" path="res://worlds/world1/world1.tscn" id="2_knpqt"]
+[ext_resource type="PackedScene" uid="uid://cavbs8gurvpfh" path="res://worlds/terrain1/terrain1.tscn" id="2_luexm"]
[ext_resource type="Script" path="res://globals/colors.gd" id="3_0x6i2"]
[node name="Game" type="Node3D"]
script = ExtResource("1_mfbtr")
skip_menu = false
-starting_world = ExtResource("2_knpqt")
+starting_world = ExtResource("2_luexm")
[node name="CurrentScene" type="Node3D" parent="."]
diff --git a/project.godot b/project.godot
index d746693..d874c74 100644
--- a/project.godot
+++ b/project.godot
@@ -38,6 +38,10 @@ window/stretch/mode="canvas_items"
window/stretch/aspect="expand"
window/handheld/orientation=1
+[editor_plugins]
+
+enabled=PackedStringArray("res://addons/terrain_3d/plugin.cfg")
+
[file_customization]
folder_colors={
diff --git a/resources/asset_info/DaysOne.tres b/resources/asset_info/days_one.tres
similarity index 100%
rename from resources/asset_info/DaysOne.tres
rename to resources/asset_info/days_one.tres
diff --git a/ui/main_menu/main_menu.gd b/ui/main_menu/main_menu.gd
index c916683..5251757 100644
--- a/ui/main_menu/main_menu.gd
+++ b/ui/main_menu/main_menu.gd
@@ -52,9 +52,15 @@ func list_licenses() -> void:
add_license(file)
func add_license(license_path: String) -> void:
- var asset_info: AssetInfo = load(LICENSE_FOLDER + license_path)
+
+ if license_path.ends_with(".remap"):
+ license_path = license_path.replace(".remap", "")
+
+ print(LICENSE_FOLDER + license_path)
+ var asset_info: AssetInfo = ResourceLoader.load(LICENSE_FOLDER + license_path)
var new_license_entry: Node = license_entry.instantiate()
license_container.add_child(new_license_entry)
+ print(asset_info)
new_license_entry.populate(asset_info)
diff --git a/ui/main_menu/main_menu.tscn b/ui/main_menu/main_menu.tscn
index 3b89384..c86dcad 100644
--- a/ui/main_menu/main_menu.tscn
+++ b/ui/main_menu/main_menu.tscn
@@ -107,6 +107,7 @@ text = "Exit"
[node name="LicensesScreen" type="PanelContainer" parent="."]
unique_name_in_owner = true
+visible = false
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
diff --git a/worlds/terrain1/terrain1.tscn b/worlds/terrain1/terrain1.tscn
new file mode 100644
index 0000000..63b0d3f
--- /dev/null
+++ b/worlds/terrain1/terrain1.tscn
@@ -0,0 +1,63 @@
+[gd_scene load_steps=12 format=3 uid="uid://cavbs8gurvpfh"]
+
+[ext_resource type="Terrain3DStorage" uid="uid://c4h6ufb0esmas" path="res://worlds/terrain1/terrain1_storage.res" id="1_k1mvv"]
+[ext_resource type="Terrain3DMaterial" uid="uid://c6ppgrnektc8g" path="res://worlds/terrain1/terrain1_material.tres" id="2_2cdhe"]
+[ext_resource type="Terrain3DAssets" uid="uid://bh60t03kfpvux" path="res://worlds/terrain1/terrain1_assets.tres" id="3_5hdjg"]
+[ext_resource type="PackedScene" uid="uid://dawpmu4vvv3rs" path="res://entities/monster_spawnpoint/monster_spawnpoint.tscn" id="4_l81pf"]
+[ext_resource type="Script" path="res://entities/monster_spawnpoint/monster_spawnpoint_probability.gd" id="5_6bskj"]
+[ext_resource type="Resource" uid="uid://0xqaef8uftnv" path="res://resources/monsters/debuggy.tres" id="6_of6wf"]
+[ext_resource type="PackedScene" uid="uid://bi7vo3i6wsl2y" path="res://assets/models/environment/stylized_nature_kit_quaternius/plant7diedummekuh.glb" id="7_a22cv"]
+
+[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_4a17c"]
+sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
+ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
+
+[sub_resource type="Sky" id="Sky_mvddp"]
+sky_material = SubResource("ProceduralSkyMaterial_4a17c")
+
+[sub_resource type="Environment" id="Environment_tunrb"]
+background_mode = 2
+sky = SubResource("Sky_mvddp")
+tonemap_mode = 2
+glow_enabled = true
+
+[sub_resource type="Resource" id="Resource_rgf8x"]
+script = ExtResource("5_6bskj")
+monster_data = ExtResource("6_of6wf")
+chance = 100.0
+
+[node name="Terrain1" type="Node3D"]
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0)
+shadow_enabled = true
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_tunrb")
+
+[node name="Terrain3D" type="Terrain3D" parent="."]
+storage = ExtResource("1_k1mvv")
+material = ExtResource("2_2cdhe")
+assets = ExtResource("3_5hdjg")
+render_cast_shadows = 0
+collision_layer = 2
+collision_mask = 9
+
+[node name="MonsterSpawnpoint" parent="." instance=ExtResource("4_l81pf")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.3621, 0, -15.1762)
+spawnable_monsters = Array[ExtResource("5_6bskj")]([SubResource("Resource_rgf8x")])
+
+[node name="MonsterSpawnpoint2" parent="." instance=ExtResource("4_l81pf")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.129, 0, -9.60006)
+spawnable_monsters = Array[ExtResource("5_6bskj")]([SubResource("Resource_rgf8x")])
+
+[node name="MonsterSpawnpoint3" parent="." instance=ExtResource("4_l81pf")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 37.0513, 4.65929, 13.587)
+spawnable_monsters = Array[ExtResource("5_6bskj")]([SubResource("Resource_rgf8x")])
+
+[node name="MonsterSpawnpoint4" parent="." instance=ExtResource("4_l81pf")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.8614, 1.04235, 27.0149)
+spawnable_monsters = Array[ExtResource("5_6bskj")]([SubResource("Resource_rgf8x")])
+
+[node name="plant7diedummekuh" parent="." instance=ExtResource("7_a22cv")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.02146, 0, 1.29385)
diff --git a/worlds/terrain1/terrain1_assets.tres b/worlds/terrain1/terrain1_assets.tres
new file mode 100644
index 0000000..2cd9d75
--- /dev/null
+++ b/worlds/terrain1/terrain1_assets.tres
@@ -0,0 +1,33 @@
+[gd_resource type="Terrain3DAssets" load_steps=9 format=3 uid="uid://bh60t03kfpvux"]
+
+[ext_resource type="Texture2D" uid="uid://sofgexkx8m2k" path="res://worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png" id="1_i4gqd"]
+[ext_resource type="Texture2D" uid="uid://ckr6jrefpdhmb" path="res://worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png" id="2_et80k"]
+[ext_resource type="Texture2D" uid="uid://wsd38lb6nwke" path="res://worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png" id="3_s3c4a"]
+[ext_resource type="Texture2D" uid="uid://dwwq48fl57us3" path="res://worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png" id="4_itqpy"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_k58i2"]
+cull_mode = 2
+vertex_color_use_as_albedo = true
+backlight_enabled = true
+backlight = Color(0.5, 0.5, 0.5, 1)
+
+[sub_resource type="Terrain3DMeshAsset" id="Terrain3DMeshAsset_jsol1"]
+height_offset = 0.5
+density = 10.0
+material_override = SubResource("StandardMaterial3D_k58i2")
+generated_type = 1
+
+[sub_resource type="Terrain3DTextureAsset" id="Terrain3DTextureAsset_xsor5"]
+name = "grass_001_packed_albedo_height"
+albedo_texture = ExtResource("3_s3c4a")
+normal_texture = ExtResource("4_itqpy")
+
+[sub_resource type="Terrain3DTextureAsset" id="Terrain3DTextureAsset_blj65"]
+name = "rock030_packed_albedo_height"
+id = 1
+albedo_texture = ExtResource("1_i4gqd")
+normal_texture = ExtResource("2_et80k")
+
+[resource]
+mesh_list = Array[Terrain3DMeshAsset]([SubResource("Terrain3DMeshAsset_jsol1")])
+texture_list = Array[Terrain3DTextureAsset]([SubResource("Terrain3DTextureAsset_xsor5"), SubResource("Terrain3DTextureAsset_blj65")])
diff --git a/worlds/terrain1/terrain1_material.tres b/worlds/terrain1/terrain1_material.tres
new file mode 100644
index 0000000..a0c685a
--- /dev/null
+++ b/worlds/terrain1/terrain1_material.tres
@@ -0,0 +1,38 @@
+[gd_resource type="Terrain3DMaterial" load_steps=4 format=3 uid="uid://c6ppgrnektc8g"]
+
+[sub_resource type="Gradient" id="Gradient_73pyr"]
+offsets = PackedFloat32Array(0.2, 1)
+colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1)
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_7a7wb"]
+noise_type = 2
+frequency = 0.03
+cellular_jitter = 3.0
+cellular_return_type = 0
+domain_warp_enabled = true
+domain_warp_type = 1
+domain_warp_amplitude = 50.0
+domain_warp_fractal_type = 2
+domain_warp_fractal_lacunarity = 1.5
+domain_warp_fractal_gain = 1.0
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_i4bum"]
+seamless = true
+color_ramp = SubResource("Gradient_73pyr")
+noise = SubResource("FastNoiseLite_7a7wb")
+
+[resource]
+_shader_parameters = {
+"blend_sharpness": 0.87,
+"height_blending": true,
+"macro_variation1": Color(1, 1, 1, 1),
+"macro_variation2": Color(1, 1, 1, 1),
+"noise1_angle": 0.0,
+"noise1_offset": Vector2(0.5, 0.5),
+"noise1_scale": 0.04,
+"noise2_scale": 0.076,
+"noise3_scale": 0.225,
+"noise_texture": SubResource("NoiseTexture2D_i4bum"),
+"vertex_normals_distance": 128.0
+}
+world_background = 0
diff --git a/worlds/terrain1/terrain1_storage.res b/worlds/terrain1/terrain1_storage.res
new file mode 100644
index 0000000..bddc3ce
Binary files /dev/null and b/worlds/terrain1/terrain1_storage.res differ
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png
new file mode 100644
index 0000000..fa0c3e5
Binary files /dev/null and b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png differ
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png.import b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png.import
new file mode 100644
index 0000000..4bbf69e
--- /dev/null
+++ b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c2wjfbl54qy7h"
+path="res://.godot/imported/Grass001_1K-PNG_Color.png-ca0a445c095de6febf0b868c703a4793.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Color.png"
+dest_files=["res://.godot/imported/Grass001_1K-PNG_Color.png-ca0a445c095de6febf0b868c703a4793.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
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png
new file mode 100644
index 0000000..98cbdb9
Binary files /dev/null and b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png differ
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png.import b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png.import
new file mode 100644
index 0000000..bac3931
--- /dev/null
+++ b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://by4p3rt2vpphc"
+path="res://.godot/imported/Grass001_1K-PNG_Displacement.png-a8af31a9251708ac194fadcd8b7b9de2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Displacement.png"
+dest_files=["res://.godot/imported/Grass001_1K-PNG_Displacement.png-a8af31a9251708ac194fadcd8b7b9de2.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
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png
new file mode 100644
index 0000000..c652f51
Binary files /dev/null and b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png differ
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png.import b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png.import
new file mode 100644
index 0000000..3726f27
--- /dev/null
+++ b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d28w3g8iexdl7"
+path="res://.godot/imported/Grass001_1K-PNG_NormalGL.png-284e79525319cf8b9f1a23fd8e29a5f7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/grass_001/Grass001_1K-PNG_NormalGL.png"
+dest_files=["res://.godot/imported/Grass001_1K-PNG_NormalGL.png-284e79525319cf8b9f1a23fd8e29a5f7.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
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png
new file mode 100644
index 0000000..36f5597
Binary files /dev/null and b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png differ
diff --git a/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png.import b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png.import
new file mode 100644
index 0000000..c7df9db
--- /dev/null
+++ b/worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://y2xk5h7oyogt"
+path="res://.godot/imported/Grass001_1K-PNG_Roughness.png-85c6c5d4c4956f613d0910a635d5a792.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/grass_001/Grass001_1K-PNG_Roughness.png"
+dest_files=["res://.godot/imported/Grass001_1K-PNG_Roughness.png-85c6c5d4c4956f613d0910a635d5a792.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
diff --git a/worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png b/worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png
new file mode 100644
index 0000000..6d5c93f
Binary files /dev/null and b/worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png differ
diff --git a/worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png.import b/worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png.import
new file mode 100644
index 0000000..7009bce
--- /dev/null
+++ b/worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://wsd38lb6nwke"
+path.s3tc="res://.godot/imported/grass_001_packed_albedo_height.png-c7db96c429baa5ae06a183fc4c52cb17.s3tc.ctex"
+path.etc2="res://.godot/imported/grass_001_packed_albedo_height.png-c7db96c429baa5ae06a183fc4c52cb17.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/grass_001/grass_001_packed_albedo_height.png"
+dest_files=["res://.godot/imported/grass_001_packed_albedo_height.png-c7db96c429baa5ae06a183fc4c52cb17.s3tc.ctex", "res://.godot/imported/grass_001_packed_albedo_height.png-c7db96c429baa5ae06a183fc4c52cb17.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=2
+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=1
diff --git a/worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png b/worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png
new file mode 100644
index 0000000..36b3060
Binary files /dev/null and b/worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png differ
diff --git a/worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png.import b/worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png.import
new file mode 100644
index 0000000..3090569
--- /dev/null
+++ b/worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dwwq48fl57us3"
+path.s3tc="res://.godot/imported/grass_001_packed_normal_roughness.png-6a0368d7f5ad5c8592aae981ff9760f4.s3tc.ctex"
+path.etc2="res://.godot/imported/grass_001_packed_normal_roughness.png-6a0368d7f5ad5c8592aae981ff9760f4.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/grass_001/grass_001_packed_normal_roughness.png"
+dest_files=["res://.godot/imported/grass_001_packed_normal_roughness.png-6a0368d7f5ad5c8592aae981ff9760f4.s3tc.ctex", "res://.godot/imported/grass_001_packed_normal_roughness.png-6a0368d7f5ad5c8592aae981ff9760f4.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=2
+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=1
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png
new file mode 100644
index 0000000..8c14e19
Binary files /dev/null and b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png differ
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png.import b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png.import
new file mode 100644
index 0000000..a6d8ef6
--- /dev/null
+++ b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crku1nxbu2hmx"
+path="res://.godot/imported/Rock030_1K-PNG_Color.png-42ae620489daa5d2a41c2d27a634d175.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Color.png"
+dest_files=["res://.godot/imported/Rock030_1K-PNG_Color.png-42ae620489daa5d2a41c2d27a634d175.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
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png
new file mode 100644
index 0000000..ef5b8c2
Binary files /dev/null and b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png differ
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png.import b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png.import
new file mode 100644
index 0000000..3b968cb
--- /dev/null
+++ b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://csx4na7h667u2"
+path="res://.godot/imported/Rock030_1K-PNG_Displacement.png-06118eb447dc3cb3533fe5d4b016df02.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Displacement.png"
+dest_files=["res://.godot/imported/Rock030_1K-PNG_Displacement.png-06118eb447dc3cb3533fe5d4b016df02.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
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png
new file mode 100644
index 0000000..38fb92c
Binary files /dev/null and b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png differ
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png.import b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png.import
new file mode 100644
index 0000000..1329529
--- /dev/null
+++ b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dhhq8dhhoow6y"
+path="res://.godot/imported/Rock030_1K-PNG_NormalGL.png-77a1409b9b4a554282e591f68b96e74e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/rock_030/Rock030_1K-PNG_NormalGL.png"
+dest_files=["res://.godot/imported/Rock030_1K-PNG_NormalGL.png-77a1409b9b4a554282e591f68b96e74e.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
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png
new file mode 100644
index 0000000..4990c35
Binary files /dev/null and b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png differ
diff --git a/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png.import b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png.import
new file mode 100644
index 0000000..399a0af
--- /dev/null
+++ b/worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://yyswf1lc60w8"
+path="res://.godot/imported/Rock030_1K-PNG_Roughness.png-39ba57eee3bbcfda16d05a2f09d4efde.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/rock_030/Rock030_1K-PNG_Roughness.png"
+dest_files=["res://.godot/imported/Rock030_1K-PNG_Roughness.png-39ba57eee3bbcfda16d05a2f09d4efde.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
diff --git a/worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png b/worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png
new file mode 100644
index 0000000..69b0469
Binary files /dev/null and b/worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png differ
diff --git a/worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png.import b/worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png.import
new file mode 100644
index 0000000..56caa59
--- /dev/null
+++ b/worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://sofgexkx8m2k"
+path.s3tc="res://.godot/imported/rock030_packed_albedo_height.png-f4329fcc6ef1d6ac019f92104550396d.s3tc.ctex"
+path.etc2="res://.godot/imported/rock030_packed_albedo_height.png-f4329fcc6ef1d6ac019f92104550396d.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/rock_030/rock030_packed_albedo_height.png"
+dest_files=["res://.godot/imported/rock030_packed_albedo_height.png-f4329fcc6ef1d6ac019f92104550396d.s3tc.ctex", "res://.godot/imported/rock030_packed_albedo_height.png-f4329fcc6ef1d6ac019f92104550396d.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=2
+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=1
diff --git a/worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png b/worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png
new file mode 100644
index 0000000..3fee7a8
Binary files /dev/null and b/worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png differ
diff --git a/worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png.import b/worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png.import
new file mode 100644
index 0000000..bd20075
--- /dev/null
+++ b/worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ckr6jrefpdhmb"
+path.s3tc="res://.godot/imported/rock30_packed_normal_roughness.png-9fc952dff901752b9f72b77b6c93ac14.s3tc.ctex"
+path.etc2="res://.godot/imported/rock30_packed_normal_roughness.png-9fc952dff901752b9f72b77b6c93ac14.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc", "etc2_astc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://worlds/terrain1/textures/rock_030/rock30_packed_normal_roughness.png"
+dest_files=["res://.godot/imported/rock30_packed_normal_roughness.png-9fc952dff901752b9f72b77b6c93ac14.s3tc.ctex", "res://.godot/imported/rock30_packed_normal_roughness.png-9fc952dff901752b9f72b77b6c93ac14.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=2
+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=1