diff --git a/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg b/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg
new file mode 100644
index 0000000..fe4dbf5
--- /dev/null
+++ b/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg
@@ -0,0 +1 @@
+
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg.import b/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg.import
new file mode 100644
index 0000000..9584d3b
--- /dev/null
+++ b/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://btc01wc11tiid"
+path="res://.godot/imported/GuiResizerTopLeft.svg-eb563f557424c74239e878a1213a5bf4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/anthonyec.camera_preview/GuiResizerTopLeft.svg"
+dest_files=["res://.godot/imported/GuiResizerTopLeft.svg-eb563f557424c74239e878a1213a5bf4.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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopRight.svg b/addons/anthonyec.camera_preview/GuiResizerTopRight.svg
new file mode 100644
index 0000000..dd00953
--- /dev/null
+++ b/addons/anthonyec.camera_preview/GuiResizerTopRight.svg
@@ -0,0 +1 @@
+
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopRight.svg.import b/addons/anthonyec.camera_preview/GuiResizerTopRight.svg.import
new file mode 100644
index 0000000..4a1fa5d
--- /dev/null
+++ b/addons/anthonyec.camera_preview/GuiResizerTopRight.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://04l05jxuyt7k"
+path="res://.godot/imported/GuiResizerTopRight.svg-cc1dc8556d51357c5eb0b01d09d8f049.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/anthonyec.camera_preview/GuiResizerTopRight.svg"
+dest_files=["res://.godot/imported/GuiResizerTopRight.svg-cc1dc8556d51357c5eb0b01d09d8f049.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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/anthonyec.camera_preview/Pin.svg b/addons/anthonyec.camera_preview/Pin.svg
new file mode 100644
index 0000000..8e5935c
--- /dev/null
+++ b/addons/anthonyec.camera_preview/Pin.svg
@@ -0,0 +1 @@
+
diff --git a/addons/anthonyec.camera_preview/Pin.svg.import b/addons/anthonyec.camera_preview/Pin.svg.import
new file mode 100644
index 0000000..27d274f
--- /dev/null
+++ b/addons/anthonyec.camera_preview/Pin.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://do6d60od41vmg"
+path="res://.godot/imported/Pin.svg-83b09f5c00a829c5d8b136bf5bae65bc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/anthonyec.camera_preview/Pin.svg"
+dest_files=["res://.godot/imported/Pin.svg-83b09f5c00a829c5d8b136bf5bae65bc.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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/anthonyec.camera_preview/plugin.cfg b/addons/anthonyec.camera_preview/plugin.cfg
new file mode 100644
index 0000000..4ad0d4c
--- /dev/null
+++ b/addons/anthonyec.camera_preview/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Little Camera Preview"
+description="Shows a picture-in-picture preview of the selected 2D or 3D camera"
+author="Anthony Cossins"
+version="1.3"
+script="plugin.gd"
diff --git a/addons/anthonyec.camera_preview/plugin.gd b/addons/anthonyec.camera_preview/plugin.gd
new file mode 100644
index 0000000..4e74dd8
--- /dev/null
+++ b/addons/anthonyec.camera_preview/plugin.gd
@@ -0,0 +1,87 @@
+@tool
+extends EditorPlugin
+
+const preview_scene = preload("res://addons/anthonyec.camera_preview/preview.tscn")
+
+var preview: CameraPreview
+var current_main_screen_name: String
+
+func _enter_tree() -> void:
+ main_screen_changed.connect(_on_main_screen_changed)
+ EditorInterface.get_selection().selection_changed.connect(_on_editor_selection_changed)
+
+ # Initialise preview panel and add to main screen.
+ preview = preview_scene.instantiate() as CameraPreview
+ preview.request_hide()
+
+ var main_screen = EditorInterface.get_editor_main_screen()
+ main_screen.add_child(preview)
+
+func _exit_tree() -> void:
+ if preview:
+ preview.queue_free()
+
+func _ready() -> void:
+ # TODO: Currently there is no API to get the main screen name without
+ # listening to the `EditorPlugin.main_screen_changed` signal:
+ # https://github.com/godotengine/godot-proposals/issues/2081
+ EditorInterface.set_main_screen_editor("Script")
+ EditorInterface.set_main_screen_editor("3D")
+
+func _on_main_screen_changed(screen_name: String) -> void:
+ current_main_screen_name = screen_name
+
+ # TODO: Bit of a hack to prevent pinned staying between view changes on the same scene.
+ preview.unlink_camera()
+ _on_editor_selection_changed()
+
+func _on_editor_selection_changed() -> void:
+ if not is_main_screen_viewport():
+ # This hides the preview "container" and not the preview itself, allowing
+ # any locked previews to remain visible once switching back to 3D tab.
+ preview.visible = false
+ return
+
+ preview.visible = true
+
+ var selected_nodes = EditorInterface.get_selection().get_selected_nodes()
+
+ var selected_camera_3d: Camera3D = find_camera_3d_or_null(selected_nodes)
+ var selected_camera_2d: Camera2D = find_camera_2d_or_null(selected_nodes)
+
+ if selected_camera_3d and current_main_screen_name == "3D":
+ preview.link_with_camera_3d(selected_camera_3d)
+ preview.request_show()
+
+ elif selected_camera_2d and current_main_screen_name == "2D":
+ preview.link_with_camera_2d(selected_camera_2d)
+ preview.request_show()
+
+ else:
+ preview.request_hide()
+
+func is_main_screen_viewport() -> bool:
+ return current_main_screen_name == "3D" or current_main_screen_name == "2D"
+
+func find_camera_3d_or_null(nodes: Array[Node]) -> Camera3D:
+ var camera: Camera3D
+
+ for node in nodes:
+ if node is Camera3D:
+ camera = node as Camera3D
+ break
+
+ return camera
+
+func find_camera_2d_or_null(nodes: Array[Node]) -> Camera2D:
+ var camera: Camera2D
+
+ for node in nodes:
+ if node is Camera2D:
+ camera = node as Camera2D
+ break
+
+ return camera
+
+func _on_selected_camera_3d_tree_exiting() -> void:
+ preview.unlink_camera()
diff --git a/addons/anthonyec.camera_preview/preview.gd b/addons/anthonyec.camera_preview/preview.gd
new file mode 100644
index 0000000..3c07d04
--- /dev/null
+++ b/addons/anthonyec.camera_preview/preview.gd
@@ -0,0 +1,404 @@
+@tool
+
+class_name CameraPreview
+extends Control
+
+enum CameraType {
+ CAMERA_2D,
+ CAMERA_3D
+}
+
+enum PinnedPosition {
+ LEFT,
+ RIGHT,
+}
+
+enum InteractionState {
+ NONE,
+ RESIZE,
+ DRAG,
+
+ # Animation is split into 2 seperate states so that the tween is only
+ # invoked once in the "start" state.
+ START_ANIMATE_INTO_PLACE,
+ ANIMATE_INTO_PLACE,
+}
+
+const margin_3d: Vector2 = Vector2(10, 10)
+const margin_2d: Vector2 = Vector2(20, 15)
+const panel_margin: float = 2
+const min_panel_size: float = 250
+
+@onready var panel: Panel = %Panel
+@onready var placeholder: Panel = %Placeholder
+@onready var preview_camera_3d: Camera3D = %Camera3D
+@onready var preview_camera_2d: Camera2D = %Camera2D
+@onready var sub_viewport: SubViewport = %SubViewport
+@onready var sub_viewport_text_rect: TextureRect = %TextureRect
+@onready var resize_left_handle: Button = %ResizeLeftHandle
+@onready var resize_right_handle: Button = %ResizeRightHandle
+@onready var lock_button: Button = %LockButton
+@onready var gradient: TextureRect = %Gradient
+@onready var viewport_margin_container: MarginContainer = %ViewportMarginContainer
+@onready var overlay_margin_container: MarginContainer = %OverlayMarginContainer
+@onready var overlay_container: Control = %OverlayContainer
+
+var camera_type: CameraType = CameraType.CAMERA_3D
+var pinned_position: PinnedPosition = PinnedPosition.RIGHT
+var viewport_ratio: float = 1
+var editor_scale: float = EditorInterface.get_editor_scale()
+var is_locked: bool
+var show_controls: bool
+var selected_camera_3d: Camera3D
+var selected_camera_2d: Camera2D
+
+var state: InteractionState = InteractionState.NONE
+var initial_mouse_position: Vector2
+var initial_panel_size: Vector2
+var initial_panel_position: Vector2
+
+func _ready() -> void:
+ # Set initial width.
+ panel.size.x = min_panel_size * editor_scale
+
+ # Setting texture to viewport in code instead of directly in the editor
+ # because otherwise an error "Path to node is invalid: Panel/SubViewport"
+ # on first load. This is harmless but doesn't look great.
+ #
+ # This is a known issue:
+ # https://github.com/godotengine/godot/issues/27790#issuecomment-499740220
+ sub_viewport_text_rect.texture = sub_viewport.get_texture()
+
+ # From what I can tell there's something wrong with how an editor theme
+ # scales when used within a plugin. It seems to ignore the screen scale.
+ # For instance, a 30x30px button will appear tiny on a retina display.
+ #
+ # Someone else had the issue with no luck:
+ # https://forum.godotengine.org/t/how-to-scale-plugin-controls-to-look-the-same-in-4k-as-1080p/36151
+ #
+ # And seems Dialogic also scales buttons manually:
+ # https://github.com/dialogic-godot/dialogic/blob/master/addons/dialogic/Editor/Common/sidebar.gd#L25C6-L38
+ #
+ # Maybe I don't know the correct way to do it, so for now the workaround is
+ # to set the correct size in code using screen scale.
+ var button_size = Vector2(30, 30) * editor_scale
+ var margin_size: float = panel_margin * editor_scale
+
+ resize_left_handle.size = button_size
+ resize_left_handle.pivot_offset = Vector2(0, 0) * editor_scale
+
+ resize_right_handle.size = button_size
+ resize_right_handle.pivot_offset = Vector2(30, 30) * editor_scale
+
+ lock_button.size = button_size
+ lock_button.pivot_offset = Vector2(0, 30) * editor_scale
+
+ viewport_margin_container.add_theme_constant_override("margin_left", margin_size)
+ viewport_margin_container.add_theme_constant_override("margin_top", margin_size)
+ viewport_margin_container.add_theme_constant_override("margin_right", margin_size)
+ viewport_margin_container.add_theme_constant_override("margin_bottom", margin_size)
+
+ overlay_margin_container.add_theme_constant_override("margin_left", margin_size)
+ overlay_margin_container.add_theme_constant_override("margin_top", margin_size)
+ overlay_margin_container.add_theme_constant_override("margin_right", margin_size)
+ overlay_margin_container.add_theme_constant_override("margin_bottom", margin_size)
+
+ # Parent node overlay size is not available on first ready, need to wait a
+ # frame for it to be drawn.
+ await get_tree().process_frame
+
+ # Anchors are set in code because setting them in the editor UI doesn't take
+ # editor scale into account.
+ resize_left_handle.position = Vector2(0, 0)
+ resize_right_handle.set_anchors_preset(Control.PRESET_TOP_LEFT)
+
+ resize_right_handle.position = Vector2(overlay_container.size.x - button_size.x, 0)
+ resize_right_handle.set_anchors_preset(Control.PRESET_TOP_RIGHT)
+
+ lock_button.position = Vector2(0, overlay_container.size.y - button_size.y)
+ lock_button.set_anchors_preset(Control.PRESET_BOTTOM_LEFT)
+
+func _process(_delta: float) -> void:
+ if not visible: return
+
+ match state:
+ InteractionState.NONE:
+ panel.size = get_clamped_size(panel.size)
+ panel.position = get_pinned_position(pinned_position)
+
+ InteractionState.RESIZE:
+ var delta_mouse_position = initial_mouse_position - get_global_mouse_position()
+ var resized_size = panel.size
+
+ if pinned_position == PinnedPosition.LEFT:
+ resized_size = initial_panel_size - delta_mouse_position
+
+ if pinned_position == PinnedPosition.RIGHT:
+ resized_size = initial_panel_size + delta_mouse_position
+
+ panel.size = get_clamped_size(resized_size)
+ panel.position = get_pinned_position(pinned_position)
+
+ InteractionState.DRAG:
+ placeholder.size = panel.size
+
+ var global_mouse_position = get_global_mouse_position()
+ var offset = initial_mouse_position - initial_panel_position
+
+ panel.global_position = global_mouse_position - offset
+
+ if global_mouse_position.x < global_position.x + size.x / 2:
+ pinned_position = PinnedPosition.LEFT
+ else:
+ pinned_position = PinnedPosition.RIGHT
+
+ placeholder.position = get_pinned_position(pinned_position)
+
+ InteractionState.START_ANIMATE_INTO_PLACE:
+ var final_position: Vector2 = get_pinned_position(pinned_position)
+ var tween = get_tree().create_tween()
+
+ tween.set_ease(Tween.EASE_OUT)
+ tween.set_trans(Tween.TRANS_CUBIC)
+ tween.tween_property(panel, "position", final_position, 0.3)
+
+ tween.finished.connect(func():
+ panel.position = final_position
+ state = InteractionState.NONE
+ )
+
+ state = InteractionState.ANIMATE_INTO_PLACE
+
+ # I couldn't get `mouse_entered` and `mouse_exited` events to work
+ # nicely, so I use rect method instead. Plus using this method it's easy to
+ # grow the hit area size.
+ var panel_hover_rect = Rect2(panel.global_position, panel.size)
+ panel_hover_rect = panel_hover_rect.grow(40)
+
+ var mouse_position = get_global_mouse_position()
+
+ show_controls = state != InteractionState.NONE or panel_hover_rect.has_point(mouse_position)
+
+ # UI visibility.
+ resize_left_handle.visible = show_controls and pinned_position == PinnedPosition.RIGHT
+ resize_right_handle.visible = show_controls and pinned_position == PinnedPosition.LEFT
+ lock_button.visible = show_controls or is_locked
+ placeholder.visible = state == InteractionState.DRAG or state == InteractionState.ANIMATE_INTO_PLACE
+ gradient.visible = show_controls
+
+ # Sync camera settings.
+ if camera_type == CameraType.CAMERA_3D and selected_camera_3d:
+ sub_viewport.size = panel.size
+
+ # Sync position and rotation without using a `RemoteTransform` node
+ # because if you save a camera as a scene, the remote transform node will
+ # be stored within the scene. Also it's harder to keep the remote
+ # transform `remote_path` up-to-date with scene changes, which causes
+ # many errors.
+ preview_camera_3d.global_position = selected_camera_3d.global_position
+ preview_camera_3d.global_rotation = selected_camera_3d.global_rotation
+
+ preview_camera_3d.fov = selected_camera_3d.fov
+ preview_camera_3d.projection = selected_camera_3d.projection
+ preview_camera_3d.size = selected_camera_3d.size
+ preview_camera_3d.cull_mask = selected_camera_3d.cull_mask
+ preview_camera_3d.keep_aspect = selected_camera_3d.keep_aspect
+ preview_camera_3d.near = selected_camera_3d.near
+ preview_camera_3d.far = selected_camera_3d.far
+ preview_camera_3d.h_offset = selected_camera_3d.h_offset
+ preview_camera_3d.v_offset = selected_camera_3d.v_offset
+ preview_camera_3d.attributes = selected_camera_3d.attributes
+ preview_camera_3d.environment = selected_camera_3d.environment
+
+ if camera_type == CameraType.CAMERA_2D and selected_camera_2d:
+ var project_window_size = get_project_window_size()
+ var ratio = project_window_size.x / panel.size.x
+
+ # TODO: Is there a better way to fix this?
+ # The camera border is visible sometimes due to pixel rounding.
+ # Subtract 1px from right and bottom to hide this.
+ var hide_camera_border_fix = Vector2(1, 1)
+
+ sub_viewport.size = panel.size
+ sub_viewport.size_2d_override = (panel.size - hide_camera_border_fix) * ratio
+ sub_viewport.size_2d_override_stretch = true
+
+ preview_camera_2d.global_position = selected_camera_2d.global_position
+ preview_camera_2d.global_rotation = selected_camera_2d.global_rotation
+
+ preview_camera_2d.offset = selected_camera_2d.offset
+ preview_camera_2d.zoom = selected_camera_2d.zoom
+ preview_camera_2d.ignore_rotation = selected_camera_2d.ignore_rotation
+ preview_camera_2d.anchor_mode = selected_camera_2d.anchor_mode
+ preview_camera_2d.limit_left = selected_camera_2d.limit_left
+ preview_camera_2d.limit_right = selected_camera_2d.limit_right
+ preview_camera_2d.limit_top = selected_camera_2d.limit_top
+ preview_camera_2d.limit_bottom = selected_camera_2d.limit_bottom
+
+func link_with_camera_3d(camera_3d: Camera3D) -> void:
+ # TODO: Camera may not be ready since this method is called in `_enter_tree`
+ # in the plugin because of a workaround for:
+ # https://github.com/godotengine/godot-proposals/issues/2081
+ if not preview_camera_3d:
+ return request_hide()
+
+ var is_different_camera = camera_3d != preview_camera_3d
+
+ # TODO: A bit messy.
+ if is_different_camera:
+ if preview_camera_3d.tree_exiting.is_connected(unlink_camera):
+ preview_camera_3d.tree_exiting.disconnect(unlink_camera)
+
+ if not camera_3d.tree_exiting.is_connected(unlink_camera):
+ camera_3d.tree_exiting.connect(unlink_camera)
+
+ sub_viewport.disable_3d = false
+ sub_viewport.world_3d = camera_3d.get_world_3d()
+
+ selected_camera_3d = camera_3d
+ camera_type = CameraType.CAMERA_3D
+
+func link_with_camera_2d(camera_2d: Camera2D) -> void:
+ if not preview_camera_2d:
+ return request_hide()
+
+ var is_different_camera = camera_2d != preview_camera_2d
+
+ # TODO: A bit messy.
+ if is_different_camera:
+ if preview_camera_2d.tree_exiting.is_connected(unlink_camera):
+ preview_camera_2d.tree_exiting.disconnect(unlink_camera)
+
+ if not camera_2d.tree_exiting.is_connected(unlink_camera):
+ camera_2d.tree_exiting.connect(unlink_camera)
+
+ sub_viewport.disable_3d = true
+ sub_viewport.world_2d = camera_2d.get_world_2d()
+
+ selected_camera_2d = camera_2d
+ camera_type = CameraType.CAMERA_2D
+
+func unlink_camera() -> void:
+ if selected_camera_3d:
+ selected_camera_3d = null
+
+ if selected_camera_2d:
+ selected_camera_2d = null
+
+ is_locked = false
+ lock_button.button_pressed = false
+
+func request_hide() -> void:
+ if is_locked: return
+ visible = false
+
+func request_show() -> void:
+ visible = true
+
+func get_pinned_position(pinned_position: PinnedPosition) -> Vector2:
+ var margin: Vector2 = margin_3d * editor_scale
+
+ if camera_type == CameraType.CAMERA_2D:
+ margin = margin_2d * editor_scale
+
+ match pinned_position:
+ PinnedPosition.LEFT:
+ return Vector2.ZERO - Vector2(0, panel.size.y) - Vector2(-margin.x, margin.y)
+ PinnedPosition.RIGHT:
+ return size - panel.size - margin
+ _:
+ assert(false, "Unknown pinned position %s" % str(pinned_position))
+
+ return Vector2.ZERO
+
+func get_clamped_size(desired_size: Vector2) -> Vector2:
+ var viewport_ratio = get_project_window_ratio()
+ var editor_viewport_size = get_editor_viewport_size()
+
+ var max_bounds = Vector2(
+ editor_viewport_size.x * 0.6,
+ editor_viewport_size.y * 0.8
+ )
+
+ var clamped_size = desired_size
+
+ # Apply aspect ratio.
+ clamped_size = Vector2(clamped_size.x, clamped_size.x * viewport_ratio)
+
+ # Clamp the max size while respecting the aspect ratio.
+ if clamped_size.y >= max_bounds.y:
+ clamped_size.x = max_bounds.y / viewport_ratio
+ clamped_size.y = max_bounds.y
+
+ if clamped_size.x >= max_bounds.x:
+ clamped_size.x = max_bounds.x
+ clamped_size.y = max_bounds.x * viewport_ratio
+
+ # Clamp the min size based on if it's portrait or landscape. Portrait min
+ # size should be based on it's height. Landscape min size is based on it's
+ # width instead. Applying min width to a portrait size would make it too big.
+ var is_portrait = viewport_ratio > 1
+
+ if is_portrait and clamped_size.y <= min_panel_size * editor_scale:
+ clamped_size.x = min_panel_size / viewport_ratio
+ clamped_size.y = min_panel_size
+ clamped_size = clamped_size * editor_scale
+
+ if not is_portrait and clamped_size.x <= min_panel_size * editor_scale:
+ clamped_size.x = min_panel_size
+ clamped_size.y = min_panel_size * viewport_ratio
+ clamped_size = clamped_size * editor_scale
+
+ # Round down to avoid sub-pixel artifacts, mainly seen around the margins.
+ return clamped_size.floor()
+
+func get_project_window_size() -> Vector2:
+ var window_width = float(ProjectSettings.get_setting("display/window/size/viewport_width"))
+ var window_height = float(ProjectSettings.get_setting("display/window/size/viewport_height"))
+
+ return Vector2(window_width, window_height)
+
+func get_project_window_ratio() -> float:
+ var project_window_size = get_project_window_size()
+
+ return project_window_size.y / project_window_size.x
+
+func get_editor_viewport_size() -> Vector2:
+ var fallback_size = EditorInterface.get_editor_main_screen().size
+
+ # There isn't an API for getting the viewport node. Instead it has to be
+ # found by checking the parent's parent of the subviewport and find
+ # the correct node based on name and class.
+ var editor_sub_viewport_3d = EditorInterface.get_editor_viewport_3d(0)
+ var editor_viewport_container = editor_sub_viewport_3d.get_parent().get_parent().get_parent()
+
+ # Early return incase editor tree structure has changed.
+ if editor_viewport_container.get_class() != "Node3DEditorViewportContainer":
+ return fallback_size
+
+ return editor_viewport_container.size
+
+func _on_resize_handle_button_down() -> void:
+ if state != InteractionState.NONE: return
+
+ state = InteractionState.RESIZE
+ initial_mouse_position = get_global_mouse_position()
+ initial_panel_size = panel.size
+
+func _on_resize_handle_button_up() -> void:
+ state = InteractionState.NONE
+
+func _on_drag_handle_button_down() -> void:
+ if state != InteractionState.NONE: return
+
+ state = InteractionState.DRAG
+ initial_mouse_position = get_global_mouse_position()
+ initial_panel_position = panel.global_position
+
+func _on_drag_handle_button_up() -> void:
+ if state != InteractionState.DRAG: return
+
+ state = InteractionState.START_ANIMATE_INTO_PLACE
+
+func _on_lock_button_pressed() -> void:
+ is_locked = !is_locked
diff --git a/addons/anthonyec.camera_preview/preview.tscn b/addons/anthonyec.camera_preview/preview.tscn
new file mode 100644
index 0000000..77b3ced
--- /dev/null
+++ b/addons/anthonyec.camera_preview/preview.tscn
@@ -0,0 +1,200 @@
+[gd_scene load_steps=8 format=3 uid="uid://xybmfvufjuv"]
+
+[ext_resource type="Script" path="res://addons/anthonyec.camera_preview/preview.gd" id="1_6b32r"]
+[ext_resource type="Texture2D" uid="uid://do6d60od41vmg" path="res://addons/anthonyec.camera_preview/Pin.svg" id="2_p0pa8"]
+[ext_resource type="Texture2D" uid="uid://btc01wc11tiid" path="res://addons/anthonyec.camera_preview/GuiResizerTopLeft.svg" id="2_t64ej"]
+[ext_resource type="Texture2D" uid="uid://04l05jxuyt7k" path="res://addons/anthonyec.camera_preview/GuiResizerTopRight.svg" id="3_6yuab"]
+
+[sub_resource type="ViewportTexture" id="ViewportTexture_hchdq"]
+viewport_path = NodePath("Panel/SubViewport")
+
+[sub_resource type="Gradient" id="Gradient_11p6r"]
+offsets = PackedFloat32Array(0, 0.3, 0.6, 1)
+colors = PackedColorArray(0, 0, 0, 0.235294, 0, 0, 0, 0.0784314, 0, 0, 0, 0.0784314, 0, 0, 0, 0.235294)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_4dkve"]
+gradient = SubResource("Gradient_11p6r")
+width = 256
+height = 256
+fill_to = Vector2(2.08165e-12, 1)
+
+[node name="Preview" type="Control"]
+z_index = 999
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_6b32r")
+
+[node name="Placeholder" type="Panel" parent="."]
+unique_name_in_owner = true
+visible = false
+modulate = Color(1, 1, 1, 0.705882)
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -40.0
+offset_top = -40.0
+offset_right = 410.0
+offset_bottom = 410.0
+grow_horizontal = 0
+grow_vertical = 0
+
+[node name="Panel" type="Panel" parent="."]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -520.0
+offset_top = -908.889
+offset_right = -20.0
+offset_bottom = -20.0
+grow_horizontal = 0
+grow_vertical = 0
+pivot_offset = Vector2(450, 300)
+
+[node name="SubViewport" type="SubViewport" parent="Panel"]
+unique_name_in_owner = true
+handle_input_locally = false
+gui_disable_input = true
+size_2d_override_stretch = true
+
+[node name="Camera3D" type="Camera3D" parent="Panel/SubViewport"]
+unique_name_in_owner = true
+current = true
+
+[node name="Camera2D" type="Camera2D" parent="Panel/SubViewport"]
+unique_name_in_owner = true
+ignore_rotation = false
+
+[node name="ViewportMarginContainer" type="MarginContainer" parent="Panel"]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+
+[node name="TextureRect" type="TextureRect" parent="Panel/ViewportMarginContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+texture = SubResource("ViewportTexture_hchdq")
+expand_mode = 1
+
+[node name="Gradient" type="TextureRect" parent="Panel"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+texture = SubResource("GradientTexture2D_4dkve")
+
+[node name="OverlayMarginContainer" type="MarginContainer" parent="Panel"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+
+[node name="OverlayContainer" type="Control" parent="Panel/OverlayMarginContainer"]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 2
+mouse_filter = 2
+
+[node name="DragHandle" type="Button" parent="Panel/OverlayMarginContainer/OverlayContainer"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+focus_mode = 0
+flat = true
+
+[node name="ResizeLeftHandle" type="Button" parent="Panel/OverlayMarginContainer/OverlayContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+offset_right = 60.0
+offset_bottom = 60.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+mouse_default_cursor_shape = 12
+icon = ExtResource("2_t64ej")
+flat = true
+icon_alignment = 1
+expand_icon = true
+
+[node name="ResizeRightHandle" type="Button" parent="Panel/OverlayMarginContainer/OverlayContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -60.0
+offset_bottom = 60.0
+pivot_offset = Vector2(60, 60)
+size_flags_horizontal = 8
+size_flags_vertical = 0
+mouse_default_cursor_shape = 11
+icon = ExtResource("3_6yuab")
+flat = true
+icon_alignment = 1
+expand_icon = true
+
+[node name="LockButton" type="Button" parent="Panel/OverlayMarginContainer/OverlayContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+anchors_preset = 2
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_top = -60.0
+offset_right = 60.0
+pivot_offset = Vector2(0, 60)
+size_flags_horizontal = 0
+size_flags_vertical = 8
+tooltip_text = "Always Show Preview"
+toggle_mode = true
+icon = ExtResource("2_p0pa8")
+flat = true
+icon_alignment = 1
+expand_icon = true
+
+[connection signal="button_down" from="Panel/OverlayMarginContainer/OverlayContainer/DragHandle" to="." method="_on_drag_handle_button_down"]
+[connection signal="button_up" from="Panel/OverlayMarginContainer/OverlayContainer/DragHandle" to="." method="_on_drag_handle_button_up"]
+[connection signal="renamed" from="Panel/OverlayMarginContainer/OverlayContainer/DragHandle" to="." method="_on_drag_handle_renamed"]
+[connection signal="button_down" from="Panel/OverlayMarginContainer/OverlayContainer/ResizeLeftHandle" to="." method="_on_resize_handle_button_down"]
+[connection signal="button_up" from="Panel/OverlayMarginContainer/OverlayContainer/ResizeLeftHandle" to="." method="_on_resize_handle_button_up"]
+[connection signal="button_down" from="Panel/OverlayMarginContainer/OverlayContainer/ResizeRightHandle" to="." method="_on_resize_handle_button_down"]
+[connection signal="button_up" from="Panel/OverlayMarginContainer/OverlayContainer/ResizeRightHandle" to="." method="_on_resize_handle_button_up"]
+[connection signal="pressed" from="Panel/OverlayMarginContainer/OverlayContainer/LockButton" to="." method="_on_lock_button_pressed"]
diff --git a/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import b/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import
index 694a2ae..16d9a06 100644
--- a/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import
+++ b/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import
@@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/Roboto-Bold.ttf-a0c3395776dbc11ee676c5f1ea9c0
Rendering=null
antialiasing=1
generate_mipmaps=false
+disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
diff --git a/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf.import b/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf.import
index d7c809a..9034952 100644
--- a/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf.import
+++ b/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf.import
@@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/Roboto-Italic.ttf-844485a0171d6031f98f4829003
Rendering=null
antialiasing=1
generate_mipmaps=false
+disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
diff --git a/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import b/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import
index 16d8db1..3f33bc5 100644
--- a/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import
+++ b/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import
@@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/Roboto-Regular.ttf-d9ce0640effe9e93230b445b37
Rendering=null
antialiasing=1
generate_mipmaps=false
+disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
diff --git a/graphics/mockups/darktree1.png.import b/graphics/mockups/darktree1.png.import
index 337d73b..7d1041d 100644
--- a/graphics/mockups/darktree1.png.import
+++ b/graphics/mockups/darktree1.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cg1cxmqbo1pa"
-path="res://.godot/imported/darktree1.png-6c9c1843804e0501b0678ae7981cd027.ctex"
+path.s3tc="res://.godot/imported/darktree1.png-6c9c1843804e0501b0678ae7981cd027.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree1.png"
-dest_files=["res://.godot/imported/darktree1.png-6c9c1843804e0501b0678ae7981cd027.ctex"]
+dest_files=["res://.godot/imported/darktree1.png-6c9c1843804e0501b0678ae7981cd027.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree2.png.import b/graphics/mockups/darktree2.png.import
index ea0561a..50a8d54 100644
--- a/graphics/mockups/darktree2.png.import
+++ b/graphics/mockups/darktree2.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://fcm6etmmj65d"
-path="res://.godot/imported/darktree2.png-bc0ff27335e63d23792e6feab3fd4ae4.ctex"
+path.s3tc="res://.godot/imported/darktree2.png-bc0ff27335e63d23792e6feab3fd4ae4.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree2.png"
-dest_files=["res://.godot/imported/darktree2.png-bc0ff27335e63d23792e6feab3fd4ae4.ctex"]
+dest_files=["res://.godot/imported/darktree2.png-bc0ff27335e63d23792e6feab3fd4ae4.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree3.png.import b/graphics/mockups/darktree3.png.import
index 9fd6bc2..5c1c130 100644
--- a/graphics/mockups/darktree3.png.import
+++ b/graphics/mockups/darktree3.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c8h24ouqcqlxv"
-path="res://.godot/imported/darktree3.png-402f41198d5cec5befc9ed8b825ec529.ctex"
+path.s3tc="res://.godot/imported/darktree3.png-402f41198d5cec5befc9ed8b825ec529.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree3.png"
-dest_files=["res://.godot/imported/darktree3.png-402f41198d5cec5befc9ed8b825ec529.ctex"]
+dest_files=["res://.godot/imported/darktree3.png-402f41198d5cec5befc9ed8b825ec529.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree4.png.import b/graphics/mockups/darktree4.png.import
index 6c20c88..67edc7e 100644
--- a/graphics/mockups/darktree4.png.import
+++ b/graphics/mockups/darktree4.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dcimm8umxko8"
-path="res://.godot/imported/darktree4.png-ae0a0014c089a2b4be72c1152d2d368a.ctex"
+path.s3tc="res://.godot/imported/darktree4.png-ae0a0014c089a2b4be72c1152d2d368a.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree4.png"
-dest_files=["res://.godot/imported/darktree4.png-ae0a0014c089a2b4be72c1152d2d368a.ctex"]
+dest_files=["res://.godot/imported/darktree4.png-ae0a0014c089a2b4be72c1152d2d368a.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree5.png.import b/graphics/mockups/darktree5.png.import
index bbcc928..c489a99 100644
--- a/graphics/mockups/darktree5.png.import
+++ b/graphics/mockups/darktree5.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://rk30f4q2a1vm"
-path="res://.godot/imported/darktree5.png-881d40bfdb6059f71c7e02910ea20291.ctex"
+path.s3tc="res://.godot/imported/darktree5.png-881d40bfdb6059f71c7e02910ea20291.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree5.png"
-dest_files=["res://.godot/imported/darktree5.png-881d40bfdb6059f71c7e02910ea20291.ctex"]
+dest_files=["res://.godot/imported/darktree5.png-881d40bfdb6059f71c7e02910ea20291.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree6.png.import b/graphics/mockups/darktree6.png.import
index f00a8f8..fa6baef 100644
--- a/graphics/mockups/darktree6.png.import
+++ b/graphics/mockups/darktree6.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://xd1ob1jfq7pi"
-path="res://.godot/imported/darktree6.png-521759c8c41c7d7d8b1927848573fb31.ctex"
+path.s3tc="res://.godot/imported/darktree6.png-521759c8c41c7d7d8b1927848573fb31.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree6.png"
-dest_files=["res://.godot/imported/darktree6.png-521759c8c41c7d7d8b1927848573fb31.ctex"]
+dest_files=["res://.godot/imported/darktree6.png-521759c8c41c7d7d8b1927848573fb31.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree7.png.import b/graphics/mockups/darktree7.png.import
index 670fd88..68f099c 100644
--- a/graphics/mockups/darktree7.png.import
+++ b/graphics/mockups/darktree7.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bxfwua8h235xp"
-path="res://.godot/imported/darktree7.png-792eec1560e1d356fcfe4dc06b6826b5.ctex"
+path.s3tc="res://.godot/imported/darktree7.png-792eec1560e1d356fcfe4dc06b6826b5.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree7.png"
-dest_files=["res://.godot/imported/darktree7.png-792eec1560e1d356fcfe4dc06b6826b5.ctex"]
+dest_files=["res://.godot/imported/darktree7.png-792eec1560e1d356fcfe4dc06b6826b5.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree8.png.import b/graphics/mockups/darktree8.png.import
index 4141b2e..33392e5 100644
--- a/graphics/mockups/darktree8.png.import
+++ b/graphics/mockups/darktree8.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bradm5u7vjjxq"
-path="res://.godot/imported/darktree8.png-c82977a598fa7488efa01b0060f473e5.ctex"
+path.s3tc="res://.godot/imported/darktree8.png-c82977a598fa7488efa01b0060f473e5.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree8.png"
-dest_files=["res://.godot/imported/darktree8.png-c82977a598fa7488efa01b0060f473e5.ctex"]
+dest_files=["res://.godot/imported/darktree8.png-c82977a598fa7488efa01b0060f473e5.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/darktree9.png.import b/graphics/mockups/darktree9.png.import
index 79f97a0..d7fd8a1 100644
--- a/graphics/mockups/darktree9.png.import
+++ b/graphics/mockups/darktree9.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bryqg0hb4f0ry"
-path="res://.godot/imported/darktree9.png-7e06c76477609c96f145e40553614f03.ctex"
+path.s3tc="res://.godot/imported/darktree9.png-7e06c76477609c96f145e40553614f03.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/mockups/darktree9.png"
-dest_files=["res://.godot/imported/darktree9.png-7e06c76477609c96f145e40553614f03.ctex"]
+dest_files=["res://.godot/imported/darktree9.png-7e06c76477609c96f145e40553614f03.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/mockups/field_placeholder.png b/graphics/mockups/field_placeholder.png
new file mode 100644
index 0000000..0c01bf6
Binary files /dev/null and b/graphics/mockups/field_placeholder.png differ
diff --git a/graphics/mockups/field_placeholder.png.import b/graphics/mockups/field_placeholder.png.import
new file mode 100644
index 0000000..3d76eaa
--- /dev/null
+++ b/graphics/mockups/field_placeholder.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cygt1j1m0vpqg"
+path.s3tc="res://.godot/imported/field_placeholder.png-be0fb818475a680edf7ae1e8920c3ab2.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://graphics/mockups/field_placeholder.png"
+dest_files=["res://.godot/imported/field_placeholder.png-be0fb818475a680edf7ae1e8920c3ab2.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/graphics/testingground/Doll.png.import b/graphics/testingground/Doll.png.import
index a442e7e..8454453 100644
--- a/graphics/testingground/Doll.png.import
+++ b/graphics/testingground/Doll.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dj1syhq0dmf3p"
-path="res://.godot/imported/Doll.png-6f0443c64ba885f03fa15b69fdd4a622.ctex"
+path.s3tc="res://.godot/imported/Doll.png-6f0443c64ba885f03fa15b69fdd4a622.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/Doll.png"
-dest_files=["res://.godot/imported/Doll.png-6f0443c64ba885f03fa15b69fdd4a622.ctex"]
+dest_files=["res://.godot/imported/Doll.png-6f0443c64ba885f03fa15b69fdd4a622.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/IveSeenSomeShit.png.import b/graphics/testingground/IveSeenSomeShit.png.import
index 04253d9..e2bad95 100644
--- a/graphics/testingground/IveSeenSomeShit.png.import
+++ b/graphics/testingground/IveSeenSomeShit.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bcah7lrg2oae1"
-path="res://.godot/imported/IveSeenSomeShit.png-a70e0f6edf8bc1e32ae477ef1b86b685.ctex"
+path.s3tc="res://.godot/imported/IveSeenSomeShit.png-a70e0f6edf8bc1e32ae477ef1b86b685.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/IveSeenSomeShit.png"
-dest_files=["res://.godot/imported/IveSeenSomeShit.png-a70e0f6edf8bc1e32ae477ef1b86b685.ctex"]
+dest_files=["res://.godot/imported/IveSeenSomeShit.png-a70e0f6edf8bc1e32ae477ef1b86b685.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/TakeThatCandy.png.import b/graphics/testingground/TakeThatCandy.png.import
index 2ca9dce..612e335 100644
--- a/graphics/testingground/TakeThatCandy.png.import
+++ b/graphics/testingground/TakeThatCandy.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cumdgxn0ibpv7"
-path="res://.godot/imported/TakeThatCandy.png-f01b70ef03aa14681b514f7be251778e.ctex"
+path.s3tc="res://.godot/imported/TakeThatCandy.png-f01b70ef03aa14681b514f7be251778e.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/TakeThatCandy.png"
-dest_files=["res://.godot/imported/TakeThatCandy.png-f01b70ef03aa14681b514f7be251778e.ctex"]
+dest_files=["res://.godot/imported/TakeThatCandy.png-f01b70ef03aa14681b514f7be251778e.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/chestnut1.png.import b/graphics/testingground/chestnut1.png.import
index 372ba59..d57ea39 100644
--- a/graphics/testingground/chestnut1.png.import
+++ b/graphics/testingground/chestnut1.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dfynp0xqtpcke"
-path="res://.godot/imported/chestnut1.png-21a267aa266521f1b5d3f4d8a3c58228.ctex"
+path.s3tc="res://.godot/imported/chestnut1.png-21a267aa266521f1b5d3f4d8a3c58228.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/chestnut1.png"
-dest_files=["res://.godot/imported/chestnut1.png-21a267aa266521f1b5d3f4d8a3c58228.ctex"]
+dest_files=["res://.godot/imported/chestnut1.png-21a267aa266521f1b5d3f4d8a3c58228.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/chestnut2.png.import b/graphics/testingground/chestnut2.png.import
index d747e42..5fe3745 100644
--- a/graphics/testingground/chestnut2.png.import
+++ b/graphics/testingground/chestnut2.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://63rgrra0tdef"
-path="res://.godot/imported/chestnut2.png-08cf9d087b4c2a8247e0363130550373.ctex"
+path.s3tc="res://.godot/imported/chestnut2.png-08cf9d087b4c2a8247e0363130550373.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/chestnut2.png"
-dest_files=["res://.godot/imported/chestnut2.png-08cf9d087b4c2a8247e0363130550373.ctex"]
+dest_files=["res://.godot/imported/chestnut2.png-08cf9d087b4c2a8247e0363130550373.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/concerned.png.import b/graphics/testingground/concerned.png.import
index dbbf074..72881e6 100644
--- a/graphics/testingground/concerned.png.import
+++ b/graphics/testingground/concerned.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cvn2p215jq2am"
-path="res://.godot/imported/concerned.png-205741d8bc7fe187c462562cc67cb650.ctex"
+path.s3tc="res://.godot/imported/concerned.png-205741d8bc7fe187c462562cc67cb650.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/concerned.png"
-dest_files=["res://.godot/imported/concerned.png-205741d8bc7fe187c462562cc67cb650.ctex"]
+dest_files=["res://.godot/imported/concerned.png-205741d8bc7fe187c462562cc67cb650.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom1.png.import b/graphics/testingground/mushroom1.png.import
index 7f9c2db..e0f96ab 100644
--- a/graphics/testingground/mushroom1.png.import
+++ b/graphics/testingground/mushroom1.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c1iyeflkwaqxf"
-path="res://.godot/imported/mushroom1.png-e27fd7d2f556707904d2f859e371da23.ctex"
+path.s3tc="res://.godot/imported/mushroom1.png-e27fd7d2f556707904d2f859e371da23.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom1.png"
-dest_files=["res://.godot/imported/mushroom1.png-e27fd7d2f556707904d2f859e371da23.ctex"]
+dest_files=["res://.godot/imported/mushroom1.png-e27fd7d2f556707904d2f859e371da23.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom10.png.import b/graphics/testingground/mushroom10.png.import
index fb8ba96..15cebae 100644
--- a/graphics/testingground/mushroom10.png.import
+++ b/graphics/testingground/mushroom10.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bednd2jncey0i"
-path="res://.godot/imported/mushroom10.png-7643aad497bc0ec349fbaa9d7d07927a.ctex"
+path.s3tc="res://.godot/imported/mushroom10.png-7643aad497bc0ec349fbaa9d7d07927a.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom10.png"
-dest_files=["res://.godot/imported/mushroom10.png-7643aad497bc0ec349fbaa9d7d07927a.ctex"]
+dest_files=["res://.godot/imported/mushroom10.png-7643aad497bc0ec349fbaa9d7d07927a.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom11.png.import b/graphics/testingground/mushroom11.png.import
index 107288b..e2bf768 100644
--- a/graphics/testingground/mushroom11.png.import
+++ b/graphics/testingground/mushroom11.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cam7x7byvqtb2"
-path="res://.godot/imported/mushroom11.png-f358b483aa3f778bb3de2ca731fdf765.ctex"
+path.s3tc="res://.godot/imported/mushroom11.png-f358b483aa3f778bb3de2ca731fdf765.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom11.png"
-dest_files=["res://.godot/imported/mushroom11.png-f358b483aa3f778bb3de2ca731fdf765.ctex"]
+dest_files=["res://.godot/imported/mushroom11.png-f358b483aa3f778bb3de2ca731fdf765.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom2.png.import b/graphics/testingground/mushroom2.png.import
index 0728e51..761afbf 100644
--- a/graphics/testingground/mushroom2.png.import
+++ b/graphics/testingground/mushroom2.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://clqou4xqud8br"
-path="res://.godot/imported/mushroom2.png-3d05f5ddfc64a24a97ae9ed335b94856.ctex"
+path.s3tc="res://.godot/imported/mushroom2.png-3d05f5ddfc64a24a97ae9ed335b94856.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom2.png"
-dest_files=["res://.godot/imported/mushroom2.png-3d05f5ddfc64a24a97ae9ed335b94856.ctex"]
+dest_files=["res://.godot/imported/mushroom2.png-3d05f5ddfc64a24a97ae9ed335b94856.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom3.png.import b/graphics/testingground/mushroom3.png.import
index 2b2b1e1..80e82d1 100644
--- a/graphics/testingground/mushroom3.png.import
+++ b/graphics/testingground/mushroom3.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cj1bfgpunfsoq"
-path="res://.godot/imported/mushroom3.png-8d3ea6150747f891c0044b399a46a7b6.ctex"
+path.s3tc="res://.godot/imported/mushroom3.png-8d3ea6150747f891c0044b399a46a7b6.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom3.png"
-dest_files=["res://.godot/imported/mushroom3.png-8d3ea6150747f891c0044b399a46a7b6.ctex"]
+dest_files=["res://.godot/imported/mushroom3.png-8d3ea6150747f891c0044b399a46a7b6.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom4.png.import b/graphics/testingground/mushroom4.png.import
index e26338b..51233c4 100644
--- a/graphics/testingground/mushroom4.png.import
+++ b/graphics/testingground/mushroom4.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bnb3bjk274vgn"
-path="res://.godot/imported/mushroom4.png-225b82126c9976b66663819da707d84f.ctex"
+path.s3tc="res://.godot/imported/mushroom4.png-225b82126c9976b66663819da707d84f.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom4.png"
-dest_files=["res://.godot/imported/mushroom4.png-225b82126c9976b66663819da707d84f.ctex"]
+dest_files=["res://.godot/imported/mushroom4.png-225b82126c9976b66663819da707d84f.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom5.png.import b/graphics/testingground/mushroom5.png.import
index c601b2c..705352b 100644
--- a/graphics/testingground/mushroom5.png.import
+++ b/graphics/testingground/mushroom5.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://0oy8by6pd2wg"
-path="res://.godot/imported/mushroom5.png-c59ec4efb34f378729e1d88ff8f24356.ctex"
+path.s3tc="res://.godot/imported/mushroom5.png-c59ec4efb34f378729e1d88ff8f24356.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom5.png"
-dest_files=["res://.godot/imported/mushroom5.png-c59ec4efb34f378729e1d88ff8f24356.ctex"]
+dest_files=["res://.godot/imported/mushroom5.png-c59ec4efb34f378729e1d88ff8f24356.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom6.png.import b/graphics/testingground/mushroom6.png.import
index 5732470..b0abeff 100644
--- a/graphics/testingground/mushroom6.png.import
+++ b/graphics/testingground/mushroom6.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b1h55mnc1giqu"
-path="res://.godot/imported/mushroom6.png-28853bdab5924a577c8b03ddf5606732.ctex"
+path.s3tc="res://.godot/imported/mushroom6.png-28853bdab5924a577c8b03ddf5606732.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom6.png"
-dest_files=["res://.godot/imported/mushroom6.png-28853bdab5924a577c8b03ddf5606732.ctex"]
+dest_files=["res://.godot/imported/mushroom6.png-28853bdab5924a577c8b03ddf5606732.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom7.png.import b/graphics/testingground/mushroom7.png.import
index 710b65d..353219f 100644
--- a/graphics/testingground/mushroom7.png.import
+++ b/graphics/testingground/mushroom7.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c5lsjern0iqmc"
-path="res://.godot/imported/mushroom7.png-00f11afdca674c7e9c74d6dc31d3d14c.ctex"
+path.s3tc="res://.godot/imported/mushroom7.png-00f11afdca674c7e9c74d6dc31d3d14c.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom7.png"
-dest_files=["res://.godot/imported/mushroom7.png-00f11afdca674c7e9c74d6dc31d3d14c.ctex"]
+dest_files=["res://.godot/imported/mushroom7.png-00f11afdca674c7e9c74d6dc31d3d14c.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom8.png.import b/graphics/testingground/mushroom8.png.import
index 5f4ceb9..52a470c 100644
--- a/graphics/testingground/mushroom8.png.import
+++ b/graphics/testingground/mushroom8.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bg465y2vkrvfm"
-path="res://.godot/imported/mushroom8.png-25b2fc63bd00dc22c8c7376f86d0c6b0.ctex"
+path.s3tc="res://.godot/imported/mushroom8.png-25b2fc63bd00dc22c8c7376f86d0c6b0.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom8.png"
-dest_files=["res://.godot/imported/mushroom8.png-25b2fc63bd00dc22c8c7376f86d0c6b0.ctex"]
+dest_files=["res://.godot/imported/mushroom8.png-25b2fc63bd00dc22c8c7376f86d0c6b0.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/graphics/testingground/mushroom9.png.import b/graphics/testingground/mushroom9.png.import
index d41266b..5609b78 100644
--- a/graphics/testingground/mushroom9.png.import
+++ b/graphics/testingground/mushroom9.png.import
@@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://6xxebx7ry6o8"
-path="res://.godot/imported/mushroom9.png-8c495f592b9590dd761af5dfd2b49b77.ctex"
+path.s3tc="res://.godot/imported/mushroom9.png-8c495f592b9590dd761af5dfd2b49b77.s3tc.ctex"
metadata={
-"vram_texture": false
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
}
[deps]
source_file="res://graphics/testingground/mushroom9.png"
-dest_files=["res://.godot/imported/mushroom9.png-8c495f592b9590dd761af5dfd2b49b77.ctex"]
+dest_files=["res://.godot/imported/mushroom9.png-8c495f592b9590dd761af5dfd2b49b77.s3tc.ctex"]
[params]
-compress/mode=0
+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=false
+mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -31,4 +32,4 @@ 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
+detect_3d/compress_to=0
diff --git a/project.godot b/project.godot
index f65766e..47aa938 100644
--- a/project.godot
+++ b/project.godot
@@ -11,8 +11,8 @@ config_version=5
[application]
config/name="Babushka"
-run/main_scene="res://scenes/2DTestingGround.tscn"
-config/features=PackedStringArray("4.2", "Forward Plus")
+run/main_scene="res://scenes/mockups/abandoned_street_3d.tscn"
+config/features=PackedStringArray("4.3", "Forward Plus")
config/icon="res://icon.svg"
[autoload]
@@ -73,39 +73,44 @@ project/assembly_name="Babushka"
[editor_plugins]
-enabled=PackedStringArray("res://addons/dialogic/plugin.cfg")
+enabled=PackedStringArray("res://addons/anthonyec.camera_preview/plugin.cfg", "res://addons/dialogic/plugin.cfg")
[input]
move_left={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
]
}
move_up={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
]
}
move_down={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
dialogic_default_action={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
]
}
+click={
+"deadzone": 0.5,
+"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
+]
+}
[internationalization]
diff --git a/scenes/2DTestingGround.tscn b/scenes/2DTestingGround.tscn
index 64da492..a69f8e0 100644
--- a/scenes/2DTestingGround.tscn
+++ b/scenes/2DTestingGround.tscn
@@ -9,10 +9,9 @@ y_sort_enabled = true
[node name="player" parent="." instance=ExtResource("1_c1tk0")]
-[node name="Camera2D" type="Camera2D" parent="." node_paths=PackedStringArray("followNode")]
+[node name="Camera2D" type="Camera2D" parent="."]
position = Vector2(166.03, 0)
script = ExtResource("4_qljgx")
multiplier = 100.0
-followNode = NodePath("")
[node name="World" parent="." instance=ExtResource("7_yb6mq")]
diff --git a/scenes/mockups/abandoned_street.tscn b/scenes/mockups/abandoned_street_2D.tscn
similarity index 76%
rename from scenes/mockups/abandoned_street.tscn
rename to scenes/mockups/abandoned_street_2D.tscn
index 3948d8f..def7c5c 100644
--- a/scenes/mockups/abandoned_street.tscn
+++ b/scenes/mockups/abandoned_street_2D.tscn
@@ -1,20 +1,20 @@
[gd_scene load_steps=12 format=3 uid="uid://dx7gn5yiq1aki"]
-[ext_resource type="PackedScene" uid="uid://dd3giw31imfk4" path="res://scenes/player.tscn" id="1_kndfx"]
-[ext_resource type="Texture2D" uid="uid://cg1cxmqbo1pa" path="res://graphics/mockups/darktree1.png" id="2_mxft2"]
-[ext_resource type="Texture2D" uid="uid://fcm6etmmj65d" path="res://graphics/mockups/darktree2.png" id="3_sr86a"]
-[ext_resource type="Texture2D" uid="uid://c8h24ouqcqlxv" path="res://graphics/mockups/darktree3.png" id="4_51h5w"]
-[ext_resource type="Texture2D" uid="uid://dcimm8umxko8" path="res://graphics/mockups/darktree4.png" id="5_lvo5e"]
-[ext_resource type="Texture2D" uid="uid://rk30f4q2a1vm" path="res://graphics/mockups/darktree5.png" id="6_13fgy"]
-[ext_resource type="Texture2D" uid="uid://xd1ob1jfq7pi" path="res://graphics/mockups/darktree6.png" id="7_okbpt"]
-[ext_resource type="Texture2D" uid="uid://bxfwua8h235xp" path="res://graphics/mockups/darktree7.png" id="8_ndent"]
-[ext_resource type="Texture2D" uid="uid://bradm5u7vjjxq" path="res://graphics/mockups/darktree8.png" id="9_kx3ah"]
-[ext_resource type="Texture2D" uid="uid://bryqg0hb4f0ry" path="res://graphics/mockups/darktree9.png" id="10_5slwi"]
-[ext_resource type="Texture2D" uid="uid://c1iyeflkwaqxf" path="res://graphics/testingground/mushroom1.png" id="11_pggjo"]
+[ext_resource type="PackedScene" uid="uid://dd3giw31imfk4" path="res://scenes/player.tscn" id="1_i63wh"]
+[ext_resource type="Texture2D" uid="uid://cg1cxmqbo1pa" path="res://graphics/mockups/darktree1.png" id="2_mb5hf"]
+[ext_resource type="Texture2D" uid="uid://fcm6etmmj65d" path="res://graphics/mockups/darktree2.png" id="3_4vs7w"]
+[ext_resource type="Texture2D" uid="uid://c8h24ouqcqlxv" path="res://graphics/mockups/darktree3.png" id="4_88a82"]
+[ext_resource type="Texture2D" uid="uid://dcimm8umxko8" path="res://graphics/mockups/darktree4.png" id="5_ua5wd"]
+[ext_resource type="Texture2D" uid="uid://rk30f4q2a1vm" path="res://graphics/mockups/darktree5.png" id="6_5bpbl"]
+[ext_resource type="Texture2D" uid="uid://xd1ob1jfq7pi" path="res://graphics/mockups/darktree6.png" id="7_yup5b"]
+[ext_resource type="Texture2D" uid="uid://bxfwua8h235xp" path="res://graphics/mockups/darktree7.png" id="8_1cter"]
+[ext_resource type="Texture2D" uid="uid://bradm5u7vjjxq" path="res://graphics/mockups/darktree8.png" id="9_w3fwj"]
+[ext_resource type="Texture2D" uid="uid://bryqg0hb4f0ry" path="res://graphics/mockups/darktree9.png" id="10_dc0id"]
+[ext_resource type="Texture2D" uid="uid://c1iyeflkwaqxf" path="res://graphics/testingground/mushroom1.png" id="11_i1j1a"]
[node name="AbandonedStreet" type="Node2D"]
-[node name="player" parent="." instance=ExtResource("1_kndfx")]
+[node name="player" parent="." instance=ExtResource("1_i63wh")]
z_index = 1
z_as_relative = true
position = Vector2(586, 343)
@@ -28,105 +28,105 @@ position = Vector2(578, 327)
y_sort_enabled = true
position = Vector2(159, 107.5)
scale = Vector2(0.681208, 0.926282)
-texture = ExtResource("2_mxft2")
+texture = ExtResource("2_mb5hf")
[node name="Darktree2" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(290, 97)
-texture = ExtResource("3_sr86a")
+texture = ExtResource("3_4vs7w")
[node name="Darktree3" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(445, 108)
-texture = ExtResource("4_51h5w")
+texture = ExtResource("4_88a82")
[node name="Darktree4" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(50, 116)
-texture = ExtResource("5_lvo5e")
+texture = ExtResource("5_ua5wd")
[node name="Darktree5" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(585, 95)
-texture = ExtResource("6_13fgy")
+texture = ExtResource("6_5bpbl")
[node name="Darktree6" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(716, 94)
-texture = ExtResource("7_okbpt")
+texture = ExtResource("7_yup5b")
[node name="Darktree7" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(826, 122)
-texture = ExtResource("8_ndent")
+texture = ExtResource("8_1cter")
[node name="Darktree8" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(962, 114)
-texture = ExtResource("9_kx3ah")
+texture = ExtResource("9_w3fwj")
[node name="Darktree9" type="Sprite2D" parent="background"]
y_sort_enabled = true
position = Vector2(1093, 93)
-texture = ExtResource("10_5slwi")
+texture = ExtResource("10_dc0id")
[node name="Darktree10" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(1018, 108)
scale = Vector2(0.681208, 0.926282)
-texture = ExtResource("2_mxft2")
+texture = ExtResource("2_mb5hf")
[node name="Darktree11" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(72, 65)
scale = Vector2(1.24457, 1)
-texture = ExtResource("3_sr86a")
+texture = ExtResource("3_4vs7w")
[node name="Darktree12" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(340, 79)
scale = Vector2(0.66092, 1)
-texture = ExtResource("4_51h5w")
+texture = ExtResource("4_88a82")
[node name="Darktree13" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(647, 92)
-texture = ExtResource("5_lvo5e")
+texture = ExtResource("5_ua5wd")
[node name="Darktree14" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(899, 50)
-texture = ExtResource("6_13fgy")
+texture = ExtResource("6_5bpbl")
[node name="Darktree15" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(785, 30.5)
scale = Vector2(1, 1.41197)
-texture = ExtResource("7_okbpt")
+texture = ExtResource("7_yup5b")
[node name="Darktree16" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(510, 90)
-texture = ExtResource("8_ndent")
+texture = ExtResource("8_1cter")
[node name="Darktree17" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(398, 74)
-texture = ExtResource("9_kx3ah")
+texture = ExtResource("9_w3fwj")
[node name="Darktree18" type="Sprite2D" parent="background"]
z_index = -1
y_sort_enabled = true
position = Vector2(211, 40)
-texture = ExtResource("10_5slwi")
+texture = ExtResource("10_dc0id")
[node name="foreground" type="Node2D" parent="."]
position = Vector2(577, 365)
@@ -137,66 +137,66 @@ z_index = 2
y_sort_enabled = true
position = Vector2(-148.175, 1329.47)
scale = Vector2(0.645939, 9.86782)
-texture = ExtResource("2_mxft2")
+texture = ExtResource("2_mb5hf")
[node name="Darktree20" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(-92.472, 1049.58)
scale = Vector2(0.372823, 11.4754)
-texture = ExtResource("3_sr86a")
+texture = ExtResource("3_4vs7w")
[node name="Darktree21" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(-50.7635, 1438.31)
scale = Vector2(0.313822, 9.20193)
-texture = ExtResource("4_51h5w")
+texture = ExtResource("4_88a82")
[node name="Darktree22" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(97.6169, 966)
scale = Vector2(0.462093, 10.9798)
-texture = ExtResource("5_lvo5e")
+texture = ExtResource("5_ua5wd")
[node name="Darktree23" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(-6.03674, 1142.87)
scale = Vector2(0.393303, 10.4205)
-texture = ExtResource("6_13fgy")
+texture = ExtResource("6_5bpbl")
[node name="Darktree24" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(30.1837, 919.352)
scale = Vector2(0.359898, 13.0444)
-texture = ExtResource("7_okbpt")
+texture = ExtResource("7_yup5b")
[node name="Darktree25" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(60.6419, 1321.69)
scale = Vector2(0.394639, 10.7981)
-texture = ExtResource("8_ndent")
+texture = ExtResource("8_1cter")
[node name="Darktree26" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(152.016, 1531.61)
scale = Vector2(0.384475, 10.3028)
-texture = ExtResource("9_kx3ah")
+texture = ExtResource("9_w3fwj")
[node name="Darktree27" type="Sprite2D" parent="foreground"]
z_index = 2
y_sort_enabled = true
position = Vector2(126.223, 855.211)
scale = Vector2(0.274398, 10.5544)
-texture = ExtResource("10_5slwi")
+texture = ExtResource("10_dc0id")
[node name="road" type="Sprite2D" parent="."]
modulate = Color(0.368627, 0.368627, 0.368627, 0.898039)
position = Vector2(577, 365)
scale = Vector2(3.64435, 0.128623)
-texture = ExtResource("11_pggjo")
+texture = ExtResource("11_i1j1a")
diff --git a/scenes/mockups/abandoned_street_3d.tscn b/scenes/mockups/abandoned_street_3d.tscn
new file mode 100644
index 0000000..5c2f157
--- /dev/null
+++ b/scenes/mockups/abandoned_street_3d.tscn
@@ -0,0 +1,1362 @@
+[gd_scene load_steps=32 format=3 uid="uid://c1j5u0cjdswvp"]
+
+[ext_resource type="Texture2D" uid="uid://cg1cxmqbo1pa" path="res://graphics/mockups/darktree1.png" id="1_u6vd6"]
+[ext_resource type="Texture2D" uid="uid://fcm6etmmj65d" path="res://graphics/mockups/darktree2.png" id="2_tcvf7"]
+[ext_resource type="Texture2D" uid="uid://c8h24ouqcqlxv" path="res://graphics/mockups/darktree3.png" id="3_v2fdw"]
+[ext_resource type="Texture2D" uid="uid://dcimm8umxko8" path="res://graphics/mockups/darktree4.png" id="4_yrcwc"]
+[ext_resource type="Texture2D" uid="uid://rk30f4q2a1vm" path="res://graphics/mockups/darktree5.png" id="5_3ynl8"]
+[ext_resource type="Texture2D" uid="uid://xd1ob1jfq7pi" path="res://graphics/mockups/darktree6.png" id="6_ijjvr"]
+[ext_resource type="Texture2D" uid="uid://bxfwua8h235xp" path="res://graphics/mockups/darktree7.png" id="7_lwa45"]
+[ext_resource type="Texture2D" uid="uid://bradm5u7vjjxq" path="res://graphics/mockups/darktree8.png" id="8_wu13e"]
+[ext_resource type="Texture2D" uid="uid://bryqg0hb4f0ry" path="res://graphics/mockups/darktree9.png" id="9_4i1d4"]
+[ext_resource type="Texture2D" uid="uid://c1iyeflkwaqxf" path="res://graphics/testingground/mushroom1.png" id="10_my8if"]
+[ext_resource type="Texture2D" uid="uid://cvn2p215jq2am" path="res://graphics/testingground/concerned.png" id="10_oy1dv"]
+[ext_resource type="Texture2D" uid="uid://cj1bfgpunfsoq" path="res://graphics/testingground/mushroom3.png" id="12_50we8"]
+[ext_resource type="Texture2D" uid="uid://cumdgxn0ibpv7" path="res://graphics/testingground/TakeThatCandy.png" id="12_jgqen"]
+[ext_resource type="Texture2D" uid="uid://bcah7lrg2oae1" path="res://graphics/testingground/IveSeenSomeShit.png" id="13_gcssn"]
+[ext_resource type="Texture2D" uid="uid://dj1syhq0dmf3p" path="res://graphics/testingground/Doll.png" id="14_qxv15"]
+[ext_resource type="Texture2D" uid="uid://bnb3bjk274vgn" path="res://graphics/testingground/mushroom4.png" id="16_5f343"]
+[ext_resource type="Texture2D" uid="uid://0oy8by6pd2wg" path="res://graphics/testingground/mushroom5.png" id="17_odxxd"]
+[ext_resource type="Texture2D" uid="uid://b1h55mnc1giqu" path="res://graphics/testingground/mushroom6.png" id="18_i7vrp"]
+[ext_resource type="Texture2D" uid="uid://c5lsjern0iqmc" path="res://graphics/testingground/mushroom7.png" id="19_yb8aa"]
+[ext_resource type="Texture2D" uid="uid://bg465y2vkrvfm" path="res://graphics/testingground/mushroom8.png" id="20_2ds7x"]
+[ext_resource type="Texture2D" uid="uid://6xxebx7ry6o8" path="res://graphics/testingground/mushroom9.png" id="21_jip6m"]
+[ext_resource type="Texture2D" uid="uid://bednd2jncey0i" path="res://graphics/testingground/mushroom10.png" id="22_1s1o0"]
+[ext_resource type="Texture2D" uid="uid://cam7x7byvqtb2" path="res://graphics/testingground/mushroom11.png" id="23_m1mer"]
+[ext_resource type="Texture2D" uid="uid://dfynp0xqtpcke" path="res://graphics/testingground/chestnut1.png" id="24_ohuks"]
+[ext_resource type="Texture2D" uid="uid://63rgrra0tdef" path="res://graphics/testingground/chestnut2.png" id="25_j83yj"]
+[ext_resource type="Texture2D" uid="uid://cygt1j1m0vpqg" path="res://graphics/mockups/field_placeholder.png" id="26_7nyv4"]
+[ext_resource type="PackedScene" uid="uid://dbd1niu3tp8y5" path="res://scenes/props/Player3D.tscn" id="27_mqdni"]
+
+[sub_resource type="PlaneMesh" id="PlaneMesh_8dxh5"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f4rkw"]
+albedo_color = Color(0.505882, 0.588235, 0.494118, 1)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_neui6"]
+size = Vector3(2.01563, 0.160522, 2.00824)
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_rdjax"]
+height = 2.70765
+
+[node name="Node3D" type="Node3D"]
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+mesh = SubResource("PlaneMesh_8dxh5")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_f4rkw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.000976563, -0.0739136, -0.00112915)
+shape = SubResource("BoxShape3D_neui6")
+
+[node name="background" type="Node3D" parent="."]
+
+[node name="tree" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.102578, 0.119419, -0.747793)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree2" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.164495, 0.119419, -0.829471)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree2"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree2/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree3" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.30683, 0.119096, -0.69378)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree3"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree3/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree4" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.466273, 0.120625, -0.798476)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree4"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree4/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree5" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.709182, 0.147986, -0.589548)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree5"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree5/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree6" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.494517, 0.108343, -0.589548)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree6"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree6/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree7" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.148489, 0.111307, -0.589548)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree7"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree7/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree8" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.375699, 0.111307, -0.738924)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree8"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree8/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree9" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.696664, 0.13729, -0.543319)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree9"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree9/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree10" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.287227, 0.119419, -0.721983)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree10"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree10/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree11" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.5543, 0.119419, -0.803662)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree11"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree11/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree12" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.0829748, 0.119096, -0.66797)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree12"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree12/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree13" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.0764678, 0.120625, -0.772666)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree13"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree13/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree14" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.319377, 0.147986, -0.563738)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree14"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree14/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree15" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.884322, 0.108343, -0.563738)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree15"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree15/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree16" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0999822, 0, -0.00188484, 0, 0.1, 0, 0.00188484, 0, 0.0999822, -0.538294, 0.111307, -0.520366)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree16"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree16/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree17" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.765503, 0.111307, -0.713115)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree17"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree17/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree18" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.231314, 0.13729, -0.840139)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree18"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree18/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree19" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.59089, 0.119419, -0.666389)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree19"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree19/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree20" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.323817, 0.119419, -0.748068)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree20"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree20/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree21" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.795143, 0.119096, -0.612376)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree21"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree21/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree22" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.899468, 0.120625, -0.509008)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree22"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree22/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree23" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.916255, 0.147986, -0.248355)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree23"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree23/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree24" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.785074, 0.108343, -0.418221)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree24"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree24/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree42" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.917235, 0.119419, -0.508767)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree42"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree42/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree43" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.523234, 0.108343, -0.61479)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree43"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree43/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree44" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.74063, 0.111307, -0.34558)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree44"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree44/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree45" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.714098, 0.111307, -0.616197)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree45"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree45/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree46" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.360267, 0.13729, -0.743018)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree46"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree46/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree47" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.756501, 0.119419, -0.536722)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree47"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree47/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree48" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.652256, 0.119419, -0.795821)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree48"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree48/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree49" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.258255, 0.108343, -0.901844)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree49"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree49/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree50" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0613486, 0, -0.0789706, 0, 0.1, 0, 0.0789706, 0, 0.0613486, 0.441907, 0.111307, -0.605384)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree50"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree50/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree51" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.449119, 0.111307, -0.90325)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree51"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree51/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree52" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.883555, 0.13729, -0.567455)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree52"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree52/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree53" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.207396, 0.108343, -0.733205)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree53"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree53/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree25" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.46999, 0.111307, -0.508144)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree25"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree25/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree26" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.112614, 0.111307, -0.65752)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree26"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree26/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree27" type="Sprite3D" parent="background"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.646804, 0.13729, -0.461916)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree27"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree27/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree28" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.900771, 0.119419, -0.592793)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree28"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree28/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree29" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.74172, 0.119096, -0.731858)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree29"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree29/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree30" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.739281, 0.120625, -0.922587)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree30"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree30/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree31" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.430205, 0.147986, -1.00701)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree31"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree31/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree32" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.935996, 0.120625, -0.58507)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree32"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree32/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree33" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.626919, 0.147986, -0.669496)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree33"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree33/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree34" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.560079, 0.119419, -0.951965)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree34"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree34/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree35" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.777209, 0.119419, -0.776313)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree35"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree35/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree36" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.401028, 0.119096, -1.09103)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree36"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree36/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree37" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.256982, 0.120625, -1.11966)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree37"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree37/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree38" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.0315572, 0.147986, -0.987731)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree38"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree38/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree39" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.49657, 0.111307, -0.763219)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree39"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree39/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree40" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.820336, 0.111307, -0.550602)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree40"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree40/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree41" type="Sprite3D" parent="background"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.359324, 0.13729, -0.883899)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="background/tree41"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="background/tree41/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="foreground" type="Node3D" parent="."]
+transform = Transform3D(-0.999657, 0, -0.0261769, 0, 1, 0, 0.0261769, 0, -0.999657, 0, 0, 0)
+
+[node name="tree" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.102578, 0.119419, -0.747793)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree2" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.164495, 0.119419, -0.829471)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree2"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree2/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree3" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.30683, 0.119096, -0.69378)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree3"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree3/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree4" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.466273, 0.120625, -0.798476)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree4"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree4/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree5" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.709182, 0.147986, -0.589548)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree5"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree5/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree6" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.494517, 0.108343, -0.589548)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree6"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree6/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree7" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.148489, 0.111307, -0.589548)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree7"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree7/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree8" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.375699, 0.111307, -0.738924)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree8"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree8/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree9" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.696664, 0.13729, -0.543319)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree9"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree9/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree10" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.287227, 0.119419, -0.721983)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree10"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree10/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree11" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.5543, 0.119419, -0.803662)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree11"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree11/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree12" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.0829748, 0.119096, -0.66797)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree12"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree12/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree13" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.0764678, 0.120625, -0.772666)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree13"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree13/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree14" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.319377, 0.147986, -0.563738)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree14"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree14/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree15" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.884322, 0.108343, -0.563738)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree15"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree15/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree16" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0999822, 0, -0.00188484, 0, 0.1, 0, 0.00188484, 0, 0.0999822, -0.538294, 0.111307, -0.520366)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree16"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree16/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree17" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.765503, 0.111307, -0.713115)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree17"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree17/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree18" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.231314, 0.13729, -0.840139)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree18"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree18/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree19" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.59089, 0.119419, -0.666389)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree19"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree19/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree20" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.323817, 0.119419, -0.748068)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree20"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree20/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree21" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.795143, 0.119096, -0.612376)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree21"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree21/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree22" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.899468, 0.120625, -0.509008)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree22"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree22/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree23" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.916255, 0.147986, -0.248355)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree23"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree23/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree24" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.785074, 0.108343, -0.418221)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree24"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree24/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree42" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.917235, 0.119419, -0.508767)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree42"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree42/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree43" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.523234, 0.108343, -0.61479)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree43"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree43/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree44" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.74063, 0.111307, -0.34558)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree44"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree44/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree45" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.714098, 0.111307, -0.616197)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree45"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree45/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree46" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.360267, 0.13729, -0.743018)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree46"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree46/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree47" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.756501, 0.119419, -0.536722)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree47"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree47/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree48" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.652256, 0.119419, -0.795821)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree48"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree48/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree49" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.258255, 0.108343, -0.901844)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree49"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree49/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree50" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0613486, 0, -0.0789706, 0, 0.1, 0, 0.0789706, 0, 0.0613486, 0.441907, 0.111307, -0.605384)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree50"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree50/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree51" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.449119, 0.111307, -0.90325)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree51"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree51/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree52" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.883555, 0.13729, -0.567455)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree52"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree52/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree53" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0628262, 0, -0.0778002, 0, 0.1, 0, 0.0778002, 0, 0.0628262, 0.207396, 0.108343, -0.733205)
+billboard = 1
+shaded = true
+texture = ExtResource("6_ijjvr")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree53"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree53/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree25" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.46999, 0.111307, -0.508144)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree25"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree25/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree26" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.112614, 0.111307, -0.65752)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree26"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree26/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree27" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.646804, 0.13729, -0.461916)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree27"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree27/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree28" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.900771, 0.119419, -0.592793)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree28"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree28/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree29" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.74172, 0.119096, -0.731858)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree29"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree29/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree30" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.739281, 0.120625, -0.922587)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree30"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree30/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree31" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.430205, 0.147986, -1.00701)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree31"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree31/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree32" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.935996, 0.120625, -0.58507)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree32"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree32/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree33" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.626919, 0.147986, -0.669496)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree33"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree33/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree34" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.560079, 0.119419, -0.951965)
+billboard = 1
+shaded = true
+texture = ExtResource("1_u6vd6")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree34"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree34/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree35" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.777209, 0.119419, -0.776313)
+billboard = 1
+shaded = true
+texture = ExtResource("2_tcvf7")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree35"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree35/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree36" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.401028, 0.119096, -1.09103)
+billboard = 1
+shaded = true
+texture = ExtResource("3_v2fdw")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree36"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree36/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree37" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.256982, 0.120625, -1.11966)
+billboard = 1
+shaded = true
+texture = ExtResource("4_yrcwc")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree37"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree37/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree38" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.0315572, 0.147986, -0.987731)
+billboard = 1
+shaded = true
+texture = ExtResource("5_3ynl8")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree38"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree38/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree39" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.49657, 0.111307, -0.763219)
+billboard = 1
+shaded = true
+texture = ExtResource("7_lwa45")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree39"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree39/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree40" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.820336, 0.111307, -0.550602)
+billboard = 1
+shaded = true
+texture = ExtResource("8_wu13e")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree40"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree40/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="tree41" type="Sprite3D" parent="foreground"]
+transform = Transform3D(0.0559526, 0, 0.0828813, 0, 0.1, 0, -0.0828813, 0, 0.0559526, -0.359324, 0.13729, -0.883899)
+billboard = 1
+shaded = true
+texture = ExtResource("9_4i1d4")
+
+[node name="StaticBody3D" type="StaticBody3D" parent="foreground/tree41"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="foreground/tree41/StaticBody3D"]
+shape = SubResource("CapsuleShape3D_rdjax")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.878467, 0.477803, 0, -0.477803, 0.878467, 0, 0.578004, 0.455086)
+light_color = Color(0.81, 0.49329, 0.4374, 1)
+
+[node name="road" type="Sprite3D" parent="."]
+transform = Transform3D(0.329771, -0.000931354, 6.51372e-11, -1.45041e-16, -1.09278e-09, -0.04, 0.0122939, 0.0249826, -1.74724e-09, -0.243499, 1.60336e-05, 0.10753)
+sorting_offset = -0.475
+modulate = Color(0.45098, 0.407843, 0.423529, 0.678431)
+shaded = true
+texture = ExtResource("10_my8if")
+
+[node name="player" type="Sprite3D" parent="."]
+transform = Transform3D(0.04, 0, 0, 0, 0.04, 0, 0, 0, 0.04, -0.0237094, 0.116035, 0.0958161)
+billboard = 1
+shaded = true
+texture = ExtResource("10_oy1dv")
+
+[node name="player2" type="Sprite3D" parent="."]
+transform = Transform3D(0.04, 0, 0, 0, 0.04, 0, 0, 0, 0.04, 0.329996, 0.116035, 0.334039)
+billboard = 1
+shaded = true
+texture = ExtResource("12_jgqen")
+
+[node name="player3" type="Sprite3D" parent="."]
+transform = Transform3D(0.04, 0, 0, 0, 0.04, 0, 0, 0, 0.04, 0.290469, 0.116035, -0.275782)
+billboard = 1
+shaded = true
+texture = ExtResource("13_gcssn")
+
+[node name="player4" type="Sprite3D" parent="."]
+transform = Transform3D(0.04, 0, 0, 0, 0.04, 0, 0, 0, 0.04, -0.568754, 0.116035, -0.275782)
+billboard = 1
+shaded = true
+texture = ExtResource("14_qxv15")
+
+[node name="details" type="Node" parent="."]
+
+[node name="mushroom" type="Sprite3D" parent="details"]
+transform = Transform3D(0.02, 0, 0, 0, 0.02, 0, 0, 0, 0.02, 0.16742, 0.049829, -0.134812)
+billboard = 1
+shaded = true
+texture = ExtResource("12_50we8")
+
+[node name="mushroom2" type="Sprite3D" parent="details"]
+transform = Transform3D(0.02, 0, 0, 0, 0.02, 0, 0, 0, 0.02, -0.213234, 0.049829, -0.0385236)
+billboard = 1
+shaded = true
+texture = ExtResource("16_5f343")
+
+[node name="mushroom3" type="Sprite3D" parent="details"]
+transform = Transform3D(0.02, 0, 0, 0, 0.02, 0, 0, 0, 0.02, 0.439114, 0.049829, 0.288457)
+billboard = 1
+shaded = true
+texture = ExtResource("17_odxxd")
+
+[node name="mushroom4" type="Sprite3D" parent="details"]
+transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, 0.439114, 0.0399265, -0.274104)
+billboard = 1
+shaded = true
+texture = ExtResource("18_i7vrp")
+
+[node name="mushroom5" type="Sprite3D" parent="details"]
+transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.245921, 0.0399265, -0.274104)
+billboard = 1
+shaded = true
+texture = ExtResource("19_yb8aa")
+
+[node name="mushroom6" type="Sprite3D" parent="details"]
+transform = Transform3D(0.02, 0, 0, 0, 0.02, 0, 0, 0, 0.02, -0.394128, 0.0399265, -0.163411)
+billboard = 1
+shaded = true
+texture = ExtResource("20_2ds7x")
+
+[node name="mushroom7" type="Sprite3D" parent="details"]
+transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.41057, 0.0579707, -0.0786379)
+billboard = 1
+shaded = true
+texture = ExtResource("21_jip6m")
+
+[node name="mushroom8" type="Sprite3D" parent="details"]
+transform = Transform3D(0.02, 0, 0, 0, 0.02, 0, 0, 0, 0.02, -0.0635555, 0.0579707, 0.357456)
+billboard = 1
+shaded = true
+texture = ExtResource("22_1s1o0")
+
+[node name="mushroom9" type="Sprite3D" parent="details"]
+transform = Transform3D(0.01, 0, 0, 0, 0.01, 0, 0, 0, 0.01, -0.00889933, 0.0579707, 0.35657)
+billboard = 1
+shaded = true
+texture = ExtResource("23_m1mer")
+
+[node name="chestnut" type="Sprite3D" parent="details"]
+transform = Transform3D(0.008, 0, 0, 0, 0.008, 0, 0, 0, 0.008, 0.22631, 0.0579707, 0.0106865)
+billboard = 1
+shaded = true
+texture = ExtResource("24_ohuks")
+
+[node name="chestnut2" type="Sprite3D" parent="details"]
+transform = Transform3D(0.008, 0, 0, 0, 0.008, 0, 0, 0, 0.008, 0.135594, 0.0579707, 0.000677824)
+billboard = 1
+shaded = true
+texture = ExtResource("25_j83yj")
+
+[node name="fields" type="Node" parent="."]
+
+[node name="field" type="Sprite3D" parent="fields"]
+transform = Transform3D(0.02, 0, 0, 0, -8.74228e-10, -0.02, 0, 0.02, -8.74228e-10, 0.17571, 0.0607805, 0.369449)
+shaded = true
+texture = ExtResource("26_7nyv4")
+
+[node name="field6" type="Sprite3D" parent="fields"]
+transform = Transform3D(0.02, 0, 0, 0, -8.74228e-10, -0.02, 0, 0.02, -8.74228e-10, 0.497358, 0.0607805, 0.369449)
+shaded = true
+texture = ExtResource("26_7nyv4")
+
+[node name="field2" type="Sprite3D" parent="fields"]
+transform = Transform3D(0.02, 0, 0, 0, -8.74228e-10, -0.02, 0, 0.02, -8.74228e-10, -0.254384, 0.0607805, 0.369449)
+shaded = true
+texture = ExtResource("26_7nyv4")
+
+[node name="field3" type="Sprite3D" parent="fields"]
+transform = Transform3D(0.02, 0, 0, 0, -8.74228e-10, -0.02, 0, 0.02, -8.74228e-10, -0.254384, 0.0607805, -0.0765149)
+shaded = true
+texture = ExtResource("26_7nyv4")
+
+[node name="field4" type="Sprite3D" parent="fields"]
+transform = Transform3D(0.02, 0, 0, 0, -8.74228e-10, -0.02, 0, 0.02, -8.74228e-10, 0.457693, 0.0607805, -0.0765149)
+shaded = true
+texture = ExtResource("26_7nyv4")
+
+[node name="field5" type="Sprite3D" parent="fields"]
+transform = Transform3D(0.02, 0, 0, 0, -8.74228e-10, -0.02, 0, 0.02, -8.74228e-10, 0.0528325, 0.0607805, -0.0765149)
+shaded = true
+texture = ExtResource("26_7nyv4")
+
+[node name="Player3d" parent="." instance=ExtResource("27_mqdni")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.110292, 0.0067718, 0.0825893)
diff --git a/scenes/props/Player3D.tscn b/scenes/props/Player3D.tscn
new file mode 100644
index 0000000..c380cec
--- /dev/null
+++ b/scenes/props/Player3D.tscn
@@ -0,0 +1,37 @@
+[gd_scene load_steps=5 format=3 uid="uid://dbd1niu3tp8y5"]
+
+[ext_resource type="Texture2D" uid="uid://cvn2p215jq2am" path="res://graphics/testingground/concerned.png" id="1_5jpx2"]
+[ext_resource type="Script" path="res://scripts/player_3d.gd" id="1_08wm4"]
+[ext_resource type="Script" path="res://scripts/camera_pivot.gd" id="3_drcdp"]
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1vdrh"]
+radius = 0.0478421
+height = 0.234557
+
+[node name="Player3d" type="Node3D"]
+
+[node name="CharacterBody3D" type="CharacterBody3D" parent="."]
+script = ExtResource("1_08wm4")
+SPEED = 0.5
+
+[node name="Sprite" type="Sprite3D" parent="CharacterBody3D"]
+transform = Transform3D(0.04, 0, 0, 0, 0.04, 0, 0, 0, 0.04, 0, 0.110813, 0)
+billboard = 1
+shaded = true
+texture = ExtResource("1_5jpx2")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.119886, 0)
+shape = SubResource("CapsuleShape3D_1vdrh")
+
+[node name="CameraPivot" type="Node3D" parent="CharacterBody3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.159723, 0)
+script = ExtResource("3_drcdp")
+canPitch = true
+canYaw = true
+
+[node name="SubPivot" type="Node3D" parent="CharacterBody3D/CameraPivot"]
+
+[node name="Camera3D" type="Camera3D" parent="CharacterBody3D/CameraPivot/SubPivot"]
+transform = Transform3D(1, 0, 0, 0, 0.871025, 0.491238, 0, -0.491238, 0.871025, 0, 0.658355, 1.24487)
+fov = 28.5
diff --git a/scripts/camera_pivot.gd b/scripts/camera_pivot.gd
new file mode 100644
index 0000000..6608b21
--- /dev/null
+++ b/scripts/camera_pivot.gd
@@ -0,0 +1,22 @@
+extends Node3D
+
+@export var canPitch: bool = false
+@export var canYaw: bool = false
+@export var rotateSpeed: float = 0.003
+@onready var sub_pivot: Node3D = $SubPivot
+
+func _ready() -> void:
+ Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
+
+func _input(event):
+ if event.is_action_pressed("click"):
+ if Input.mouse_mode == Input.MOUSE_MODE_VISIBLE:
+ Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
+
+ if event.is_action_pressed("ui_cancel"):
+ Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
+
+ if event is InputEventMouseMotion:
+ if Input.mouse_mode != Input.MOUSE_MODE_CAPTURED: return
+ if canYaw: sub_pivot.rotate_x(event.relative.y * -rotateSpeed)
+ if canPitch: rotate_y(event.relative.x * -rotateSpeed)
diff --git a/scripts/player_3d.gd b/scripts/player_3d.gd
new file mode 100644
index 0000000..1bec08c
--- /dev/null
+++ b/scripts/player_3d.gd
@@ -0,0 +1,30 @@
+extends CharacterBody3D
+
+
+@export var SPEED = 1.0
+
+@onready var camera_3d: Camera3D = $CameraPivot/SubPivot/Camera3D
+
+
+func _physics_process(delta: float) -> void:
+ # Add the gravity.
+ if not is_on_floor():
+ velocity += get_gravity() * delta
+
+ # Handle jump.
+ #if Input.is_action_just_pressed("ui_accept") and is_on_floor():
+ # velocity.y = JUMP_VELOCITY
+
+ # Get the input direction and handle the movement/deceleration.
+ # As good practice, you should replace UI actions with custom gameplay actions.
+ var input_dir := Input.get_vector("move_left", "move_right", "move_up", "move_down")
+ input_dir = input_dir.rotated(-camera_3d.global_rotation.y)
+ var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
+ if direction:
+ velocity.x = direction.x * SPEED
+ velocity.z = direction.z * SPEED
+ else:
+ velocity.x = move_toward(velocity.x, 0, SPEED)
+ velocity.z = move_toward(velocity.z, 0, SPEED)
+
+ move_and_slide()