commit 37f86566202b035e61790756f42ac865b718dbc7
Author: Schimmel <64300351+SchimmelSpreu83@users.noreply.github.com>
Date: Tue Feb 25 22:07:11 2025 +0100
Initial Project Upload
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..8ad74f7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0af181c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+# Godot 4+ specific ignores
+.godot/
+/android/
diff --git a/source/.editorconfig b/source/.editorconfig
new file mode 100644
index 0000000..f28239b
--- /dev/null
+++ b/source/.editorconfig
@@ -0,0 +1,4 @@
+root = true
+
+[*]
+charset = utf-8
diff --git a/source/addons/bbcode_edit.editor/.assets_for_readme/color_completion.gif b/source/addons/bbcode_edit.editor/.assets_for_readme/color_completion.gif
new file mode 100644
index 0000000..59b26a2
Binary files /dev/null and b/source/addons/bbcode_edit.editor/.assets_for_readme/color_completion.gif differ
diff --git a/source/addons/bbcode_edit.editor/.assets_for_readme/reference_completion.gif b/source/addons/bbcode_edit.editor/.assets_for_readme/reference_completion.gif
new file mode 100644
index 0000000..a91d9b7
Binary files /dev/null and b/source/addons/bbcode_edit.editor/.assets_for_readme/reference_completion.gif differ
diff --git a/source/addons/bbcode_edit.editor/.assets_for_readme/shortcuts.gif b/source/addons/bbcode_edit.editor/.assets_for_readme/shortcuts.gif
new file mode 100644
index 0000000..e459916
Binary files /dev/null and b/source/addons/bbcode_edit.editor/.assets_for_readme/shortcuts.gif differ
diff --git a/source/addons/bbcode_edit.editor/.assets_for_readme/snippet.gif b/source/addons/bbcode_edit.editor/.assets_for_readme/snippet.gif
new file mode 100644
index 0000000..8f72806
Binary files /dev/null and b/source/addons/bbcode_edit.editor/.assets_for_readme/snippet.gif differ
diff --git a/source/addons/bbcode_edit.editor/LICENCE.txt b/source/addons/bbcode_edit.editor/LICENCE.txt
new file mode 100644
index 0000000..3e37514
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/LICENCE.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Patou
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/source/addons/bbcode_edit.editor/README.md b/source/addons/bbcode_edit.editor/README.md
new file mode 100644
index 0000000..26dd414
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/README.md
@@ -0,0 +1,114 @@
+# BBCodeEdit (for script editor[^editor_only])
+
+
+
+A Godot addon that brings BBCode completion and QOL tools to the script editor
+in order to help format documentation comments.
+(May be extended to any CodeEdit in the future.[^editor_only])
+
+
+# Showcase
+
+There are **shortcuts** to easily toggle some formattings:
+
+
+
+
+**Completion** for formatting tags, with some special completions implemented for specific tags:
+
+
+
+
+**Documentation references** are completed:
+
+
+
+
+Some useful **snippets** are included:
+
+
+
+
+# Features / Roadmap
+
+*Checked items are the implemented ones, unchecked are the ones in development.[^editor_only]*
+
+- [ ] Code completion for:
+ - [x] Most used BBCode tags
+ - [ ] All BBCode tags[^editor_only] (See [Godot Reference](https://docs.godotengine.org/en/4.3/tutorials/ui/bbcode_in_richtextlabel.html#reference))
+ - [x] Documentation comments:
+ - [x] formatting tags
+ - [x] referencing tag
+ - [x] `@` tags:
+ - [x] deprecated
+ - [x] experimental
+ - [x] tutorial
+ - [x] Snippets:
+ - [x] **Note:**, **Warning:**...
+- [ ] Classify tags accepted in documentation comments according to [Godot Reference](https://docs.godotengine.org/en/4.3/tutorials/scripting/gdscript/gdscript_documentation_comments.html#bbcode-and-class-reference)
+- [ ] Advanced completions:
+ - [x] Color:
+ - [x] Named colors
+ - [x] Hexadecimal color preview (**Note: ** If it starts with a digit, `0x` will be prefixed temporarily because Godot cancels int completion)
+ - [x] Color picker
+ - [ ] URL of files? (I don't know if file URLs work)
+ - [x] Documentation comments' references: (NB: [Inner classes](https://docs.godotengine.org/en/4.3/tutorials/scripting/gdscript/gdscript_basics.html#inner-classes) won't be properly proposed in completions)
+ - [x] Classes
+ - [x] Parameters
+ - [x] Members (aka. Properties)
+ - [x] Methods (aka. Functions)
+ - [x] Constants
+ - [x] Signals
+ - [x] Enums
+ - [ ] Other references, like annotations or operators, are not implemented because they are rarely used.
+- [ ] ~~BBCode preview (through [SyntaxHighlighter](https://docs.godotengine.org/en/4.3/classes/class_syntaxhighlighter.html)?)~~\
+ ~~Edit: Won't work because GDSCriptSyntaxHighlighter can't be extended\
+ BBCode spellcheck/semi-preview (through `_draw()` ?)~~\
+ Edit 2: Won't implement, because there is easier:
+- [ ] Add a shortcut to open:
+ - [x] Current file documentation (May have a problem if pressed before the editor checks unsaved status of the file)
+ - [ ] Preview of the selected text (or autodetect start and end if no selection)
+- [ ] Add shortcuts for:
+ *You can rebind them in `Project → Project settings → Input Map`. If you just enabled the addon, they may appear here only after a restart of the editor. You will have to restart the editor for any change to take effect.*
+ - [x] **bold** (`alt + B`)
+ - [x] *italic* (`alt + I`)
+ - [x] ~~striketrough~~ (`alt + C`, but if you had unbound `alt + S` from `open shader editor`, it will be `alt + S`)
+ - [x] underline (`alt + U`)
+ - [ ] Wrap in any tag?
+- [ ] Add an external CodeEdit in the editor to write bbcode, because completion inside strings is a nightmare due to builtin behaviors.[^editor_only]
+
+
+## Installation
+
+You can download the addon:
+- On GitHub: `Code` → `Download ZIP`.
+- Through the editor: `AssetLib` → Search for "BBCodeEdit"
+
+*By default, this readme is included, along with it's illustrations. If you don't want them,
+do not download `addons/bbcode_edit.editor/README.md` nor `addons/bbcode_edit.editor/.assets_for_readme/*`*
+
+To edit shortcuts:
+- *If they don't show up* in the input map GUI: first restart the editor
+- modify them in the input map GUI
+- **restart** the editor to update the input map.
+
+You can also exclude `*.editor/*` or `bbcode_edit.editor/` from your export presets,
+because this addon is (for now[^editor_only]) script-editor-only.
+
+
+## Godot version
+
+Godot 4.3 (May work with previous 4.x versions)
+
+
+# Development Status
+
+Development halted. But the addon is really handy as-is.
+
+[^editor_only]: **Note:** All non-script-editor-related features are on hold for now
+ because I don't have the time nor the need to implement them.
+ This would also require refactoring `bbcode_edit.gd` into two separate classes.
+ One with all [RichTextLabel's tags](https://docs.godotengine.org/en/4.3/tutorials/ui/bbcode_in_richtextlabel.html#reference)
+ and one with [documentation comments' tags](https://docs.godotengine.org/en/4.3/tutorials/scripting/gdscript/gdscript_documentation_comments.html#bbcode-and-class-reference).
+ If you really need BBCode completion in a CodeEdit (eg. for an inspector plugin, or for any code edit within an exported project),
+ I *may* give it a try, or you could contribute this refactor (this repo is under the MIT Licence).
diff --git a/source/addons/bbcode_edit.editor/bbcode_completion_icon.svg b/source/addons/bbcode_edit.editor/bbcode_completion_icon.svg
new file mode 100644
index 0000000..68d5a6b
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/bbcode_completion_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/bbcode_edit.editor/bbcode_completion_icon.svg.import b/source/addons/bbcode_edit.editor/bbcode_completion_icon.svg.import
new file mode 100644
index 0000000..180befb
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/bbcode_completion_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpwcspqlqm78h"
+path="res://.godot/imported/bbcode_completion_icon.svg-e050b1e9fb923c5a17b0f52532042234.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/bbcode_edit.editor/bbcode_completion_icon.svg"
+dest_files=["res://.godot/imported/bbcode_completion_icon.svg-e050b1e9fb923c5a17b0f52532042234.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/source/addons/bbcode_edit.editor/bbcode_edit.gd b/source/addons/bbcode_edit.editor/bbcode_edit.gd
new file mode 100644
index 0000000..c20464d
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/bbcode_edit.gd
@@ -0,0 +1,891 @@
+@tool
+extends CodeEdit
+
+
+enum CompletionKind {
+ IGNORE,
+ FORMATTING,
+ COLOR,
+ COMMAND,
+ CLASS_REFERENCE,
+ REFERENCE_START,
+ REFERENCE_END,
+ REFERENCING_TAG,
+ ANNOTATION,
+}
+
+
+const Completions = preload("res://addons/bbcode_edit.editor/completions_db/completions.gd")
+const Scraper = preload("res://addons/bbcode_edit.editor/editor_interface_scraper.gd")
+
+const ACTION_TOGGLE_BOLD = &"bbcode_edit/toggle_bold"
+const ACTION_TOGGLE_ITALIC = &"bbcode_edit/toggle_italic"
+const ACTION_TOGGLE_UNDERLINE = &"bbcode_edit/toggle_underline"
+const ACTION_TOGGLE_STRIKE = &"bbcode_edit/toggle_strike"
+
+const TOGGLING_ACTIONS = {
+ ACTION_TOGGLE_BOLD: "b",
+ ACTION_TOGGLE_ITALIC: "i",
+ ACTION_TOGGLE_UNDERLINE: "u",
+ ACTION_TOGGLE_STRIKE: "s",
+}
+
+const BBCODE_COMPLETION_ICON = preload("res://addons/bbcode_edit.editor/bbcode_completion_icon.svg")
+const COLOR_PICKER_CONTAINER_PATH = ^"_BBCodeEditColorPicker"
+const COLOR_PICKER_PATH = ^"_BBCodeEditColorPicker/ColorPicker"
+
+const MALFORMED = "MALFORMED"
+const COMMAND_PREFIX_CHAR = "\u0001"
+const ORDER_PREFIX = "\ufffe"
+const CLASS_REFERENCE_PREFIX_CHAR = "\uffff"
+const REFERENCE_START_SUFFIX_CHAR = "\uffff"
+const REFERENCE_END_SUFFIX_CHAR = "\ufffe"
+const ANNOTATION_SUFFIX_CHAR = "\ufff0"
+const _COMMAND_COLOR_PICKER = "color_picker"
+
+const CLASS_DOC_ENDERS: Array[String] = [
+ "##",
+ "signal",
+ "enum",
+ "const",
+ "@export",
+ "var",
+ "@onready",
+ "static",
+ "func",
+ "class ",
+]
+
+static var REGEX_PARENTHESES = RegEx.create_from_string(r"\(([^)]+)\)")
+
+
+func _init() -> void:
+ set_process_input(true)
+ if has_meta(&"initialized"):
+ return
+ code_completion_requested.connect(add_completion_options)
+ text_changed.connect(_on_text_changed)
+ code_completion_prefixes += ["["] # Use assignation because append don't work
+ set_meta(&"initialized", true)
+
+
+func add_completion_options() -> void:
+ #print("Code completion options requested")
+ var line_i: int = get_caret_line()
+ var line: String = get_line(line_i)
+ var column_i: int = get_caret_column()
+ var comment_i: int = is_in_comment(line_i, column_i)
+
+ if comment_i == -1 or get_delimiter_start_key(comment_i) != "##":
+ if line[column_i-1] == "[":
+ #print_rich("[color=red]Emergency cancel[/color]")
+ cancel_code_completion()
+ #print_rich("[color=red]not in bbcode completion[/color]")
+ return
+ #print_rich("[color=red]in bbcode completion[/color]")
+
+ var to_test: String = trim_doc_comment_start(line.left(column_i))
+ var line_only: String = to_test
+
+ if line_only[0] == "@" and not (
+ line_only.begins_with("@tutorial: ")
+ or line_only.begins_with("@deprecated: ")
+ or line_only.begins_with("@experimental: ")
+ ):
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "@deprecated" + ANNOTATION_SUFFIX_CHAR,
+ "deprecated\n## ",
+ get_theme_color(&"font-color"),
+ Scraper.get_icon(&"StatusError"),
+ )
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "@deprecated: Some explaination" + ANNOTATION_SUFFIX_CHAR,
+ "deprecated: ",
+ get_theme_color(&"font-color"),
+ Scraper.get_icon(&"StatusError"),
+ )
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "@experimental" + ANNOTATION_SUFFIX_CHAR,
+ "experimental\n## ",
+ get_theme_color(&"font-color"),
+ Scraper.get_icon(&"NodeWarning"),
+ )
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "@experimental: Some explaination" + ANNOTATION_SUFFIX_CHAR,
+ "experimental: ",
+ get_theme_color(&"font-color"),
+ Scraper.get_icon(&"NodeWarning"),
+ )
+
+ var class_comment_end_line: int = 0
+ while not _is_line_class_doc_ender(get_line(class_comment_end_line)):
+ class_comment_end_line += 1
+ while get_line(class_comment_end_line).begins_with("##"):
+ class_comment_end_line += 1
+ if _is_line_class_doc_ender(get_line(class_comment_end_line)):
+ class_comment_end_line = -1
+
+ if line_i < class_comment_end_line:
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "@tutorial: https://example.com" + ANNOTATION_SUFFIX_CHAR,
+ "tutorial: https://",
+ get_theme_color(&"font-color"),
+ Scraper.get_icon(&"ExternalLink"),
+ )
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "@tutorial(Title): https://example.com" + ANNOTATION_SUFFIX_CHAR,
+ "tutorial(|): https://",
+ get_theme_color(&"font-color"),
+ Scraper.get_icon(&"ExternalLink"),
+ )
+
+ update_code_completion_options(true)
+ return
+
+ var prev_line_i: int = line_i - 1
+ var prev_line: String = get_line(prev_line_i).strip_edges(true, false)
+ while prev_line.begins_with("##"):
+ to_test = prev_line.trim_prefix("##").strip_edges() + " " + to_test
+ prev_line_i -= 1
+ prev_line = get_line(prev_line_i).strip_edges(true, false)
+
+ to_test = to_test.split("]")[-1]#.split("=")[-1]
+ #print_rich("to_test:[color=magenta][code] ", to_test)
+
+ if "[" not in to_test:
+ #print("No BRACKET")
+ update_code_completion_options(true)
+ return
+
+ var describes_i: int = line_i
+ while is_in_comment(describes_i) != -1:
+ describes_i += 1
+ var describes: String = get_line(describes_i)
+
+ if check_parameter_completions(to_test, describes_i, describes):
+ return
+
+ var font_color: Color = get_theme_color(&"font_color")
+
+ if line_only[0] == "[":
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "Note:",
+ "b]Note:[/b] ",
+ font_color,
+ Scraper.get_icon(&"TextMesh"),
+ )
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "Warning:",
+ "b]Warning:[/b] ",
+ font_color,
+ Scraper.get_icon(&"TextMesh"),
+ )
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "Example:",
+ "b]Example:[/b] ",
+ font_color,
+ Scraper.get_icon(&"TextMesh"),
+ )
+
+ # TODO only propose valid tags
+ var completions: Array[String] = (
+ Completions.TAGS_UNIVERSAL
+ + Completions.TAGS_DOC_COMMENT_FORMATTING
+ # TODO MAYBE: I have to refactor everything related to tag availability.
+ #+ Completions.TAGS_RICH_TEXT_LABEL
+ )
+ var displays: Array[String] = []
+ displays.assign(completions.map(_bracket))
+
+ #print("First completion is: ", completions[0])
+
+ for i in completions.size():
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ displays[i].replace("|", ""),
+ completions[i],
+ font_color,
+ BBCODE_COMPLETION_ICON,
+ )
+
+ var reference_completions: Array[String] = Completions.TAGS_DOC_COMMENT_REFERENCE
+ var reference_displays: Array[String] = []
+ for completion in reference_completions:
+ reference_displays.append(_bracket(completion.trim_suffix("|") + "Class.name"))
+
+ var reference_icon: Texture2D = Scraper.get_reference_icon()
+ for i in reference_completions.size():
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ reference_displays[i].replace("|", ""),
+ reference_completions[i],
+ font_color,
+ reference_icon,
+ )
+
+ if describes.begins_with("func "):
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ "[param name]",
+ "param |",
+ font_color,
+ reference_icon,
+ )
+
+ var class_completions := Completions.get_class_completions()
+ for i in len(class_completions.names):
+ var name_: String = class_completions.names[i]
+ add_code_completion_option(
+ CodeEdit.KIND_CLASS,
+ CLASS_REFERENCE_PREFIX_CHAR + "[" + name_ + "]",
+ name_ + "||",
+ font_color,
+ class_completions.icons[i],
+ )
+
+ update_code_completion_options(true) # NEEDED so that `[` triggers popup
+
+
+func _is_line_class_doc_ender(line: String) -> bool:
+ for doc_ender in CLASS_DOC_ENDERS:
+ if line.begins_with(doc_ender):
+ return true
+ return false
+
+
+func _bracket(string: String) -> String:
+ return "[" + string + "]"
+
+
+func trim_doc_comment_start(line: String) -> String:
+ return line.strip_edges(true, false).trim_prefix("##").strip_edges(true, false)
+
+
+func check_parameter_completions(to_test: String, describes_i: int, describes: String) -> bool:
+ to_test = to_test.split("[")[-1]
+ var parts: PackedStringArray = to_test.split(" ", false)
+
+ var parameters: PackedStringArray = PackedStringArray()
+ var values: PackedStringArray = PackedStringArray()
+ for part in parts:
+ # TODO MAYBE impleement sub parameter handling ? (e.g. [font otv="wght=200,wdth=400"])
+ var split: PackedStringArray = part.split("=", 1)
+ parameters.append(split[0])
+ values.append(split[1] if split.size() == 2 else MALFORMED)
+
+ #print_rich("Parameters:[color=magenta] ", parameters)
+ #print_rich("Values:[color=magenta] ", values)
+
+ if parameters.is_empty():
+ return false
+
+ if parameters.size() == 1 and values[0] != "MALFORMED":
+ var value: String = values[0]
+ match parameters[0]:
+ "color":
+ if value.begins_with(HEX_PREFIX) and value.substr(HEX_PREFIX.length()).is_valid_html_color():
+ add_hex_color(value.substr(HEX_PREFIX.length()), true)
+ elif value.is_valid_html_color():
+ if value.is_valid_int():
+ insert_text(HEX_PREFIX, get_caret_line(), get_caret_column()-value.length())
+ request_code_completion.call_deferred(true)
+ add_hex_color(value)
+
+ add_color_completions(value.length())
+ return true
+
+ match parameters[0]:
+ "param":
+ if not describes.begins_with("func "):
+ return false
+
+ if ")" not in describes:
+ var next_line_i: int = describes_i + 1
+ var next_line: String = get_line(next_line_i)
+ while ")" not in next_line:
+ describes += next_line
+ next_line_i += 1
+ next_line = get_line(next_line_i)
+ describes += next_line
+ #print_rich("Describes: [color=purple][code]", describes)
+
+ for part in (
+ REGEX_PARENTHESES.search(describes).get_string().trim_prefix("(").trim_suffix(")").split(",")
+ ):
+ var param_parts := part.split(":", true, 1)
+ var parameter: String = param_parts[0].strip_edges()
+
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ parameter + REFERENCE_END_SUFFIX_CHAR,
+ parameter + "||",
+ get_theme_color(&"font_color"),
+ Scraper.get_icon(&"Variant")
+ if param_parts.size() == 1 else
+ Scraper.try_get_icon(param_parts[1].split("=", true, 1)[0].strip_edges(), &"Variant")
+ )
+
+ update_code_completion_options(true)
+ return true
+ "member":
+ if parameters.size() >= 2:
+ var path: PackedStringArray = parameters[1].split(".")
+ if path.size() >= 2:
+ if ClassDB.class_exists(path[0]):
+ add_member_completion_from_class_name(path[0])
+ else:
+ for other_class_ in ProjectSettings.get_global_class_list():
+ if other_class_["class"] == path[0]:
+ add_member_completion_from_script(load(other_class_["path"]))
+ break
+ update_code_completion_options(true)
+ return true
+ add_member_completion_from_script(EditorInterface.get_script_editor().get_current_script())
+ add_classes_completion()
+ return true
+ "method":
+ if parameters.size() >= 2:
+ var path: PackedStringArray = parameters[1].split(".")
+ if path.size() >= 2:
+ if ClassDB.class_exists(path[0]):
+ add_method_completion_from_class_name(path[0])
+ else:
+ for other_class_ in ProjectSettings.get_global_class_list():
+ if other_class_["class"] == path[0]:
+ add_method_completion_from_script(load(other_class_["path"]))
+ break
+ update_code_completion_options(true)
+ return true
+ add_method_completion_from_script(EditorInterface.get_script_editor().get_current_script())
+ add_classes_completion()
+ return true
+ "constant":
+ if parameters.size() >= 2:
+ var path: PackedStringArray = parameters[1].split(".")
+ if path.size() >= 2:
+ if ClassDB.class_exists(path[0]):
+ add_constant_completion_from_class_name(path[0])
+ else:
+ for other_class_ in ProjectSettings.get_global_class_list():
+ if other_class_["class"] == path[0]:
+ add_constant_completion_from_script(load(other_class_["path"]))
+ break
+ update_code_completion_options(true)
+ return true
+ add_constant_completion_from_script(EditorInterface.get_script_editor().get_current_script())
+ add_classes_completion()
+ return true
+ "signal":
+ if parameters.size() >= 2:
+ var path: PackedStringArray = parameters[1].split(".")
+ if path.size() >= 2:
+ if ClassDB.class_exists(path[0]):
+ add_signal_completion_from_class_name(path[0])
+ else:
+ for other_class_ in ProjectSettings.get_global_class_list():
+ if other_class_["class"] == path[0]:
+ add_signal_completion_from_script(load(other_class_["path"]))
+ break
+ update_code_completion_options(true)
+ return true
+ add_signal_completion_from_script(EditorInterface.get_script_editor().get_current_script())
+ add_classes_completion()
+ return true
+ "enum":
+ if parameters.size() >= 2:
+ var path: PackedStringArray = parameters[1].split(".")
+ if path.size() >= 2:
+ if ClassDB.class_exists(path[0]):
+ add_enum_completion_from_class_name(path[0])
+ else:
+ for other_class_ in ProjectSettings.get_global_class_list():
+ if other_class_["class"] == path[0]:
+ add_enum_completion_from_script(load(other_class_["path"]))
+ break
+ update_code_completion_options(true)
+ return true
+ add_enum_completion_from_script(EditorInterface.get_script_editor().get_current_script())
+ add_classes_completion()
+ return true
+
+ return false
+
+
+func substr_clamped_start(string: String, from: int, len: int) -> String:
+ if from < 0:
+ if len != -1:
+ len += from
+ if len < 0:
+ len = 0
+ from = 0
+
+ return string.substr(from, len)
+
+
+const HEX_PREFIX = "0x"
+func add_hex_color(hex: String, include_prefix: bool = false) -> void:
+ print_rich("Valid color: ", hex, " [color=", hex, "]██████")
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ HEX_PREFIX + hex + " ",
+ HEX_PREFIX + hex if include_prefix else hex,
+ get_theme_color(&"font_color"),
+ Scraper.get_color_icon(),
+ Color.html(hex),
+ )
+
+
+func add_color_completions(chars_typed: int) -> void:
+ var icon = Scraper.get_color_icon()
+ for color in Completions.COLORS:
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ color,
+ color,
+ get_theme_color(&"font_color"),
+ icon,
+ Color.from_string(color, Color.RED),
+ )
+
+ add_code_completion_option(
+ CodeEdit.KIND_PLAIN_TEXT,
+ COMMAND_PREFIX_CHAR + "Bring color picker",
+ _COMMAND_COLOR_PICKER + "," + str(chars_typed),
+ get_theme_color(&"font_color"),
+ EditorInterface.get_base_control().get_theme_icon("ColorPicker", "EditorIcons"),
+ )
+ update_code_completion_options(true)
+
+
+## Add completion for classes WITH SUBSCRIPT (aka it will add a dot at the end)
+func add_classes_completion() -> void:
+ var class_completions := Completions.get_class_completions()
+ for i in len(class_completions.names):
+ var name_: String = class_completions.names[i]
+ add_code_completion_option(
+ CodeEdit.KIND_CLASS,
+ ORDER_PREFIX + name_ + "." + REFERENCE_START_SUFFIX_CHAR,
+ name_ + ".",
+ get_theme_color(&"font_color"),
+ class_completions.icons[i],
+ )
+ update_code_completion_options(true)
+
+
+func add_member_completion_from_script(class_: Script) -> void:
+ add_members(class_.get_script_property_list())
+ # Don't show inherited things, because the reference won't work.
+ #add_member_completion_from_class_name(class_.get_instance_base_type())
+
+
+
+func add_member_completion_from_class_name(class_: StringName) -> void:
+ add_members(ClassDB.class_get_property_list(class_, true))
+
+
+func add_members(members: Array[Dictionary]) -> void:
+ for member in members:
+ if member["usage"] & (
+ PROPERTY_USAGE_INTERNAL
+ | PROPERTY_USAGE_CATEGORY
+ | PROPERTY_USAGE_GROUP
+ | PROPERTY_USAGE_SUBGROUP
+ ):
+ continue
+
+ add_code_completion_option(
+ CodeEdit.KIND_MEMBER,
+ member["name"] + REFERENCE_END_SUFFIX_CHAR,
+ member["name"] + "||",
+ get_theme_color(&"font-color"),
+ get_icon_for_member(member),
+ )
+
+
+func get_icon_for_member(member: Dictionary, fallback: StringName = &"MemberProperty") -> Texture2D:
+ if member["type"] == TYPE_OBJECT:
+ return Scraper.get_class_icon(member["class_name"], fallback)
+
+ return Scraper.get_builtin_type_icon(member["type"], fallback)
+
+
+func add_method_completion_from_script(class_: Script) -> void:
+ add_methods(class_.get_method_list())
+ # Don't show inherited things, because the reference won't work.
+ #add_method_completion_from_class_name(class_.get_instance_base_type())
+
+
+func add_method_completion_from_class_name(class_: StringName) -> void:
+ add_methods(ClassDB.class_get_method_list(class_, true))
+
+
+func add_methods(methods: Array[Dictionary]) -> void:
+ for method in methods:
+ add_code_completion_option(
+ CodeEdit.KIND_FUNCTION,
+ method["name"] + REFERENCE_END_SUFFIX_CHAR,
+ method["name"] + "||",
+ get_theme_color(&"font-color"),
+ get_icon_for_method(method),
+ )
+
+
+func get_icon_for_method(method: Dictionary) -> Texture2D:
+ var returned: Dictionary = method["return"]
+
+ if returned["type"] == TYPE_NIL:
+ return Scraper.get_icon(&"MemberMethod")
+
+ return get_icon_for_member(returned, &"Function")
+
+
+func add_constant_completion_from_script(class_: Script) -> void:
+ add_constants(class_.get_script_constant_map())
+ # Don't show inherited things, because the reference won't work.
+ #add_constant_completion_from_class_name(class_.get_instance_base_type())
+
+
+func add_constant_completion_from_class_name(class_: StringName) -> void:
+ for constant_name in ClassDB.class_get_integer_constant_list(class_, true):
+ add_constants({constant_name: ClassDB.class_get_integer_constant(class_, constant_name)})
+
+
+func add_constants(constants: Dictionary) -> void:
+ for constant in constants:
+ var value: Variant = constants[constant]
+ var type: int = typeof(value)
+
+ if type == TYPE_OBJECT and value is Script and value.resource_path.is_empty():
+ # Inner classes don't work in class
+ continue
+
+ var display_text: String = constant
+ if type != TYPE_COLOR:
+ var repr: String = var_to_str(value)
+ if repr.is_empty():
+ if type == TYPE_OBJECT:
+ repr = value.to_string()
+ else:
+ repr = str(repr)
+ if repr.length() > 32:
+ repr = repr.left(32) + "..."
+ display_text += " (" + repr + ")"
+ display_text += REFERENCE_END_SUFFIX_CHAR
+
+ add_code_completion_option(
+ CodeEdit.KIND_CONSTANT,
+ display_text,
+ constant + "||",
+ get_theme_color(&"font-color"),
+ Scraper.get_type_icon(value, &"MemberConstant"),
+ value
+ )
+
+
+func add_signal_completion_from_script(class_: Script) -> void:
+ add_signals(class_.get_script_signal_list())
+ # Don't show inherited things, because the reference won't work.
+ #add_signal_completion_from_class_name(class_.get_instance_base_type())
+
+
+func add_signal_completion_from_class_name(class_: StringName) -> void:
+ add_signals(ClassDB.class_get_signal_list(class_, true))
+
+
+func add_signals(signals: Array[Dictionary]) -> void:
+ var icon: Texture2D = Scraper.get_icon(&"MemberSignal")
+ for signal_ in signals:
+ add_code_completion_option(
+ CodeEdit.KIND_SIGNAL,
+ signal_["name"] + REFERENCE_END_SUFFIX_CHAR,
+ signal_["name"] + "||",
+ get_theme_color(&"font-color"),
+ icon,
+ )
+
+
+func add_enum_completion_from_script(class_: Script) -> void:
+ var map := class_.get_script_constant_map()
+ var probable_enums: PackedStringArray
+
+ for constant in map:
+ if typeof(map[constant]) == TYPE_DICTIONARY:
+ var candidate: Dictionary = map[constant]
+ if candidate.values().all(_is_int):
+ probable_enums.append(constant)
+
+ if probable_enums:
+ add_enums(probable_enums)
+
+ # Don't show inherited things, because the reference won't work.
+ #add_enum_completion_from_class_name(class_.get_instance_base_type())
+
+
+static func _is_int(value: Variant) -> bool:
+ return typeof(value) == TYPE_INT
+
+
+func add_enum_completion_from_class_name(class_: StringName) -> void:
+ add_enums(ClassDB.class_get_enum_list(class_, true))
+
+
+func add_enums(enums: PackedStringArray) -> void:
+ var icon: Texture2D = Scraper.get_icon(&"Enum")
+ for enum_ in enums:
+ add_code_completion_option(
+ CodeEdit.KIND_ENUM,
+ enum_ + REFERENCE_END_SUFFIX_CHAR,
+ enum_ + "||",
+ get_theme_color(&"font-color"),
+ icon,
+ )
+
+
+func toggle_tag(tag: String) -> void:
+ var prefix: String = "[" + tag + "]"
+ var prefix_len: int = prefix.length()
+ var suffix: String = "[/" + tag + "]"
+ var suffix_len: int = suffix.length()
+
+ var main_selection_from_column: int = get_selection_from_column()
+ var main_selection_from_line: int = get_selection_from_line()
+ var main_selection_to_column: int = get_selection_to_column()
+ var main_selection_to_line: int = get_selection_to_line()
+ var main_selection_end_line: String = get_line(main_selection_to_line)
+
+ if (
+ main_selection_from_column > prefix_len
+ and get_line(main_selection_from_line).substr(
+ main_selection_from_column - prefix_len,
+ prefix_len
+ ) == prefix
+ and main_selection_to_column <= main_selection_end_line.length() - suffix_len
+ and main_selection_end_line.substr(
+ main_selection_to_column,
+ suffix_len
+ ) == suffix
+ ):
+ begin_complex_operation()
+ begin_multicaret_edit()
+
+ for caret in get_caret_count():
+ if multicaret_edit_ignore_caret(caret):
+ continue
+
+ var initial_text: String = get_selected_text(caret)
+ var initial_start_column: int = get_selection_from_column(caret)
+ var initial_end_column: int = get_selection_to_column(caret)
+
+ select(
+ get_selection_from_line(caret),
+ initial_start_column - prefix_len,
+ get_selection_to_line(caret),
+ initial_end_column + suffix_len,
+ caret
+ )
+ insert_text_at_caret(initial_text, caret)
+ select(
+ get_selection_from_line(caret),
+ initial_start_column - prefix_len,
+ get_selection_to_line(caret),
+ initial_end_column - prefix_len,
+ caret
+ )
+
+ end_multicaret_edit()
+ end_complex_operation()
+ return
+
+ begin_complex_operation()
+ begin_multicaret_edit()
+
+ for caret in get_caret_count():
+ if multicaret_edit_ignore_caret(caret):
+ continue
+
+ var initial_start_column: int = get_selection_from_column(caret)
+ var initial_end_column: int = get_selection_to_column(caret)
+
+ insert_text_at_caret(prefix + get_selected_text(caret) + suffix, caret)
+
+ select(
+ get_selection_from_line(caret),
+ initial_start_column + prefix_len,
+ get_selection_to_line(caret),
+ initial_end_column + prefix_len,
+ caret
+ )
+
+ end_multicaret_edit()
+ end_complex_operation()
+
+
+func _confirm_code_completion(replace: bool = false) -> void:
+ var selected_completion: Dictionary = get_code_completion_option(get_code_completion_selected_index())
+ var display_text: String = selected_completion["display_text"]
+ var prefix: String = display_text[0]
+
+ if prefix == COMMAND_PREFIX_CHAR:
+ var parts: PackedStringArray = selected_completion["insert_text"].split(",")
+ var chars_to_remove: int = int(parts[1]) if parts.size() >= 2 else 0
+ if chars_to_remove:
+ for caret in get_caret_count():
+ var line_i: int = get_caret_line(caret)
+ var line: String = get_line(line_i)
+ var column_i: int = get_caret_column(caret)
+ set_line(line_i, line.left(column_i - chars_to_remove) + line.substr(column_i))
+ set_caret_column(column_i - chars_to_remove, false, caret)
+
+ match parts[0]:
+ _COMMAND_COLOR_PICKER:
+ if not has_node(^"BBCODE_EDIT_COLOR_PICKER"):
+ add_child(preload("res://addons/bbcode_edit.editor/color_picker.tscn").instantiate())
+ var container: PopupPanel = get_node(COLOR_PICKER_CONTAINER_PATH)
+ var picker: ColorPicker = get_node(COLOR_PICKER_PATH)
+
+ container.position = Vector2(get_pos_at_line_column(get_caret_line(), get_caret_column())) + global_position + Vector2(0, get_line_height())
+ container.add_theme_stylebox_override(&"panel", EditorInterface.get_base_control().get_theme_stylebox(&"Content", &"EditorStyles"))
+ picker.color_changed.connect(_on_color_picker_color_changed)
+
+ cancel_code_completion()
+ return
+
+ var icon: Texture2D = selected_completion["icon"]
+ var suffix: String = display_text[-1]
+ var kind: CompletionKind = (
+ CompletionKind.FORMATTING if icon == BBCODE_COMPLETION_ICON else
+ CompletionKind.COLOR if icon == Scraper.get_color_icon() else
+ CompletionKind.CLASS_REFERENCE if prefix == CLASS_REFERENCE_PREFIX_CHAR else
+ CompletionKind.REFERENCE_START if suffix == REFERENCE_START_SUFFIX_CHAR else
+ CompletionKind.REFERENCE_END if suffix == REFERENCE_END_SUFFIX_CHAR else
+ CompletionKind.ANNOTATION if suffix == ANNOTATION_SUFFIX_CHAR else
+ CompletionKind.REFERENCING_TAG if icon == Scraper.get_reference_icon() else
+ 0
+ )
+
+ #print_rich("Kind is [color=red][code]", CompletionKind.find_key(kind))
+
+ begin_complex_operation()
+
+ # Don't use the following code, it's a dev crime.
+ # Oops, I just did...
+ # This code block allows to call the code that is meant to be executed
+ # when the virtual method isn't implemented.
+ var script: GDScript = get_script()
+ set_script(null)
+ super.confirm_code_completion(replace)
+ set_script(script)
+
+ if (
+ kind == CompletionKind.FORMATTING
+ or kind == CompletionKind.CLASS_REFERENCE
+ or kind == CompletionKind.REFERENCING_TAG
+ ):
+ for caret in get_caret_count():
+ var line: String = get_line(get_caret_line(caret)) + " " # Add space so that column is in range
+ var column: int = get_caret_column(caret)
+ if not line[column] == "]":
+ insert_text_at_caret("]", caret)
+ # Replace caret at it's previous column
+ set_caret_column(column, false, caret)
+
+ if kind == CompletionKind.COLOR:
+ var line_i: int = get_caret_line()
+ var line: String = get_line(line_i)
+ var column: int = get_caret_column()
+ var color_start: int = column - selected_completion["display_text"].length() + 1
+ if line.substr(color_start).begins_with(HEX_PREFIX):
+ set_line(
+ line_i,
+ line.left(color_start) + line.substr(color_start + HEX_PREFIX.length())
+ )
+ set_caret_column(column - HEX_PREFIX.length())
+
+ for caret in get_caret_count():
+ set_caret_column(get_caret_column(caret) + 1, false, caret)
+ elif kind:
+ for caret in get_caret_count():
+ var line_i: int = get_caret_line(caret)
+ var line: String = get_line(line_i)
+ var first_pipe: int = line.find("|")
+ if first_pipe == -1: # Just in case
+ continue
+ var pipe_end: int = first_pipe + 1
+ while pipe_end < line.length() and line[pipe_end] == "|":
+ pipe_end += 1
+ set_line(line_i, line.left(first_pipe) + line.substr(pipe_end))
+ set_caret_column(pipe_end-1, false, caret)
+
+ end_complex_operation()
+
+ if kind == CompletionKind.REFERENCING_TAG:
+ var prefixes := code_completion_prefixes
+ code_completion_prefixes += [" "]
+ request_code_completion()
+ code_completion_prefixes = prefixes
+ elif kind and kind != CompletionKind.ANNOTATION:
+ request_code_completion()
+
+
+func _gui_input(event: InputEvent) -> void:
+ if not event.is_pressed() or event.is_echo():
+ return
+
+ if has_node(COLOR_PICKER_CONTAINER_PATH):
+ if event is InputEventKey or event is InputEventMouseButton:
+ get_node(COLOR_PICKER_CONTAINER_PATH).free()
+
+ for action in TOGGLING_ACTIONS:
+ if is_action(event, action):
+ toggle_tag(TOGGLING_ACTIONS[action])
+
+
+func is_action(event: InputEvent, action: StringName) -> bool:
+ return InputMap.has_action(action) and event.is_action(action, true)
+
+
+func _on_text_changed() -> void:
+ var line_i: int = get_caret_line()
+ var column_i: int = get_caret_column()
+ var line: String = get_line(get_caret_line())
+ if (
+ is_in_comment(line_i, column_i) == -1
+ and is_in_string(line_i, column_i) == -1
+ and line
+ and line[column_i-1] == "["
+ ):
+ cancel_code_completion() # Prevent completing when typing array fast
+
+
+func _on_color_picker_color_changed(color: Color) -> void:
+ var hex: String = color.to_html(color.a8 != 255)
+
+ for caret in get_caret_count():
+ var line_i: int = get_caret_line(caret)
+ var line: String = get_line(line_i)
+ var column_i: int = get_caret_column(caret)
+
+ if line[column_i] != "]" and line[column_i] != " ":
+ var to_scan: String = line.substr(column_i)
+ var end: int = to_scan.find("]")
+
+ if end == -1:
+ end = to_scan.find(" ")
+ else:
+ var other: int = to_scan.find(" ")
+ if other != -1 and other < end:
+ end = other
+
+ set_line(line_i, line.left(column_i) + to_scan.substr(end))
+
+ insert_text_at_caret(hex, caret)
+ set_caret_column(column_i, false, caret)
diff --git a/source/addons/bbcode_edit.editor/bbcode_edit.gd.uid b/source/addons/bbcode_edit.editor/bbcode_edit.gd.uid
new file mode 100644
index 0000000..d085d4d
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/bbcode_edit.gd.uid
@@ -0,0 +1 @@
+uid://3wc61yw7stvq
diff --git a/source/addons/bbcode_edit.editor/bbcode_edit_main.gd b/source/addons/bbcode_edit.editor/bbcode_edit_main.gd
new file mode 100644
index 0000000..bebe0f4
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/bbcode_edit_main.gd
@@ -0,0 +1,218 @@
+@tool
+extends EditorPlugin
+
+
+const BBCodeEdit: GDScript = preload("res://addons/bbcode_edit.editor/bbcode_edit.gd")
+const Scraper = preload("res://addons/bbcode_edit.editor/editor_interface_scraper.gd")
+
+
+const ADDON_NAME = "BBCode Editor"
+const ACTION_OPEN_DOC = &"bbcode_edit/editor/open_current_file_documentation"
+const ACTION_SETTINGS: Array[StringName] = [
+ "input/" + ACTION_OPEN_DOC,
+ "input/" + BBCodeEdit.ACTION_TOGGLE_BOLD,
+ "input/" + BBCodeEdit.ACTION_TOGGLE_ITALIC,
+ "input/" + BBCodeEdit.ACTION_TOGGLE_UNDERLINE,
+ "input/" + BBCodeEdit.ACTION_TOGGLE_STRIKE,
+]
+
+
+func _enable_plugin() -> void:
+ print("Enabling ", ADDON_NAME)
+ add_keybinds()
+ _on_editor_startup.call_deferred()
+ print("Enabled ", ADDON_NAME)
+
+
+func _disable_plugin() -> void:
+ print("Disabling ", ADDON_NAME)
+ for editor in EditorInterface.get_script_editor().get_open_script_editors():
+ editor.get_base_editor().set_script(null)
+ remove_keybinds()
+ for setting in ACTION_SETTINGS:
+ InputMap.erase_action(setting.substr(6))
+ print("Disabled ", ADDON_NAME)
+
+
+func _enter_tree() -> void:
+ if not EditorInterface.has_meta(&"bbcode_edit_saved_once"):
+ EditorInterface.set_meta(&"bbcode_edit_saved_once", PackedStringArray())
+ _on_editor_startup.call_deferred()
+
+
+var started_up: bool = false
+func _on_editor_startup() -> void:
+ if started_up:
+ return
+ started_up = true
+
+ # TODO check if InputMap.load_from_project_settings() is better
+ for setting in ACTION_SETTINGS:
+ if !ProjectSettings.has_setting(setting):
+ continue
+ var action_dict: Dictionary = ProjectSettings.get_setting(setting)
+ var action_name: StringName = setting.substr(6)
+ InputMap.add_action(action_name, action_dict["deadzone"])
+ for event in action_dict["events"]:
+ InputMap.action_add_event(action_name, event)
+
+ EditorInterface.get_script_editor().editor_script_changed.connect(check_current.unbind(1))
+ check_current.call_deferred()
+
+
+func add_keybinds() -> void:
+ var toggle_bold := InputEventKey.new()
+ toggle_bold.alt_pressed = true
+ toggle_bold.keycode = 66
+ ProjectSettings.set_setting(
+ &"input/bbcode_edit/toggle_bold",
+ {
+ "deadzone": 0.5,
+ "events": [toggle_bold],
+ }
+ )
+
+ var toggle_italic := InputEventKey.new()
+ toggle_italic.alt_pressed = true
+ toggle_italic.keycode = 73
+ ProjectSettings.set_setting(
+ &"input/bbcode_edit/toggle_italic",
+ {
+ "deadzone": 0.5,
+ "events": [toggle_italic],
+ }
+ )
+
+ var toggle_underline := InputEventKey.new()
+ toggle_underline.alt_pressed = true
+ toggle_underline.keycode = 85
+ ProjectSettings.set_setting(
+ &"input/bbcode_edit/toggle_underline",
+ {
+ "deadzone": 0.5,
+ "events": [toggle_underline],
+ }
+ )
+
+ var toggle_strike := InputEventKey.new()
+ toggle_strike.alt_pressed = true
+ toggle_strike.keycode = _get_striketrough_keycode()
+ ProjectSettings.set_setting(
+ &"input/bbcode_edit/toggle_strike",
+ {
+ "deadzone": 0.5,
+ "events": [toggle_strike],
+ }
+ )
+
+ if Engine.is_editor_hint():
+ add_editor_keybinds()
+
+ ProjectSettings.save()
+ print_rich("[color=orange]If you don't see the keybinds in the InputMap, please reload the Project.[/color]")
+
+
+func _get_striketrough_keycode() -> int:
+ var editor_shortcuts: Variant = EditorInterface.get_editor_settings().get(&"shortcuts")
+
+ if editor_shortcuts == null:
+ return KEY_C
+
+ for shortcut: Dictionary in editor_shortcuts:
+ if shortcut["name"] == "bottom_panels/toggle_shader_editor_bottom_panel":
+ var input_events: Array = shortcut.get("shortcuts")
+ for input_event: InputEvent in input_events:
+ if input_event.keycode == KEY_S:
+ return KEY_C
+ return KEY_S
+
+ return KEY_C
+
+
+func add_editor_keybinds() -> void:
+ var open_current_file_documentation := InputEventKey.new()
+ open_current_file_documentation.shift_pressed = true
+ open_current_file_documentation.keycode = 4194332
+ ProjectSettings.set_setting(
+ "input/" + ACTION_OPEN_DOC,
+ {
+ "deadzone": 0.5,
+ "events": [open_current_file_documentation],
+ }
+ )
+ # NB: Initial values DON'T work, see [url]https://github.com/godotengine/godot/issues/56598[/url]
+ #ProjectSettings.set_initial_value(&"input/bbcode_edit/editor/open_current_file_documentation", open_current_file_documentation.duplicate())
+
+
+
+func remove_keybinds() -> void:
+ ProjectSettings.set_setting("input/" + BBCodeEdit.ACTION_TOGGLE_BOLD, null)
+ ProjectSettings.set_setting("input/" + BBCodeEdit.ACTION_TOGGLE_ITALIC, null)
+ ProjectSettings.set_setting("input/" + BBCodeEdit.ACTION_TOGGLE_UNDERLINE, null)
+ ProjectSettings.set_setting("input/" + BBCodeEdit.ACTION_TOGGLE_STRIKE, null)
+
+ # This calls ProjectSettings.save(), so please call it last
+ remove_editor_keybinds()
+
+
+func remove_editor_keybinds() -> void:
+ ProjectSettings.set_setting("input/" + ACTION_OPEN_DOC, null)
+ ProjectSettings.save()
+
+
+func check_current() -> void:
+ var current_editor := EditorInterface.get_script_editor().get_current_editor()
+ if current_editor == null:
+ return
+ check_bbcode_pretendant(current_editor.get_base_editor())
+
+
+func check_bbcode_pretendant(pretendant: Control) -> void:
+ if pretendant is CodeEdit and not pretendant.has_meta(&"BBCode_utilities"):
+ add_bbcode_handling(pretendant)
+
+
+func add_bbcode_handling(code_edit: CodeEdit) -> void:
+ # TODO MAYBE implement automatic script inheritence if script is already overriden by another addon
+ code_edit.set_meta(&"never_changed", true)
+ code_edit.set_script(BBCodeEdit)
+
+
+## [b]WARING:[/b] not fully implemented for non-current script
+func open_doc(script: Script, code_edit: CodeEdit = null) -> void:
+ var class_name_: String = script.get_global_name()
+
+ if class_name_ == "":
+ class_name_ = '"' + script.resource_path.trim_prefix("res://") + '"'
+ var bbcode_edit_saved_once: PackedStringArray = EditorInterface.get_meta(&"bbcode_edit_saved_once", PackedStringArray())
+ if code_edit and class_name_ not in bbcode_edit_saved_once:
+ bbcode_edit_saved_once.append(class_name_)
+ print_rich("[color=orange]The script never changed since startup: brute-forcing documentation generation. (See [url=https://github.com/godotengine/godot/pull/95821]godot#95821[/url])[/color]")
+ code_edit.text = code_edit.text
+ EditorInterface.save_all_scenes()
+ elif Scraper.is_current_script_unsaved():
+ # TODO ↑ Fix this for non-current script
+ print_rich("[color=orange]Saving to make godot generate documentation.[/color]")
+ EditorInterface.save_all_scenes()
+
+ elif Scraper.is_current_script_unsaved():
+ print_rich("[color=orange]Saving to make godot generate documentation.[/color]")
+ EditorInterface.save_all_scenes()
+
+ EditorInterface.get_script_editor().get_current_editor().go_to_help.emit.call_deferred("class_name:"+class_name_)
+
+
+
+func _unhandled_input(event: InputEvent) -> void:
+ if (
+ InputMap.has_action(ACTION_OPEN_DOC)
+ and InputMap.event_is_action(event, ACTION_OPEN_DOC, true)
+ ):
+ # TODO find a workaround for the appearance delay of (*) to check unsaved status.
+ var current_editor := EditorInterface.get_script_editor().get_current_editor()
+ if current_editor == null:
+ return
+
+ var code_edit := current_editor.get_base_editor()
+ if code_edit is CodeEdit:
+ open_doc(EditorInterface.get_script_editor().get_current_script(), code_edit)
diff --git a/source/addons/bbcode_edit.editor/bbcode_edit_main.gd.uid b/source/addons/bbcode_edit.editor/bbcode_edit_main.gd.uid
new file mode 100644
index 0000000..6dc0f4d
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/bbcode_edit_main.gd.uid
@@ -0,0 +1 @@
+uid://cvo3g4cvmjypn
diff --git a/source/addons/bbcode_edit.editor/color_picker.tscn b/source/addons/bbcode_edit.editor/color_picker.tscn
new file mode 100644
index 0000000..ef10e02
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/color_picker.tscn
@@ -0,0 +1,14 @@
+[gd_scene format=3 uid="uid://ofreh5nfb6pa"]
+
+[node name="_BBCodeEditColorPicker" type="PopupPanel"]
+size = Vector2i(306, 584)
+visible = true
+
+[node name="ColorPicker" type="ColorPicker" parent="."]
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 302.0
+offset_bottom = 580.0
+color = Color(0.83233, 0, 0.367475, 1)
+deferred_mode = true
+picker_shape = 3
diff --git a/source/addons/bbcode_edit.editor/completions_db/builtin_classes.txt b/source/addons/bbcode_edit.editor/completions_db/builtin_classes.txt
new file mode 100644
index 0000000..1b852f9
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/completions_db/builtin_classes.txt
@@ -0,0 +1,937 @@
+AESContext
+AStar2D
+AStar3D
+AStarGrid2D
+AcceptDialog
+AnimatableBody2D
+AnimatableBody3D
+AnimatedSprite2D
+AnimatedSprite3D
+AnimatedTexture
+Animation
+AnimationLibrary
+AnimationMixer
+AnimationNode
+AnimationNodeAdd2
+AnimationNodeAdd3
+AnimationNodeAnimation
+AnimationNodeBlend2
+AnimationNodeBlend3
+AnimationNodeBlendSpace1D
+AnimationNodeBlendSpace2D
+AnimationNodeBlendTree
+AnimationNodeOneShot
+AnimationNodeOutput
+AnimationNodeStateMachine
+AnimationNodeStateMachinePlayback
+AnimationNodeStateMachineTransition
+AnimationNodeSub2
+AnimationNodeSync
+AnimationNodeTimeScale
+AnimationNodeTimeSeek
+AnimationNodeTransition
+AnimationPlayer
+AnimationRootNode
+AnimationTree
+Area2D
+Area3D
+ArrayMesh
+ArrayOccluder3D
+AspectRatioContainer
+AtlasTexture
+AudioBusLayout
+AudioEffect
+AudioEffectAmplify
+AudioEffectBandLimitFilter
+AudioEffectBandPassFilter
+AudioEffectCapture
+AudioEffectChorus
+AudioEffectCompressor
+AudioEffectDelay
+AudioEffectDistortion
+AudioEffectEQ
+AudioEffectEQ10
+AudioEffectEQ21
+AudioEffectEQ6
+AudioEffectFilter
+AudioEffectHardLimiter
+AudioEffectHighPassFilter
+AudioEffectHighShelfFilter
+AudioEffectInstance
+AudioEffectLimiter
+AudioEffectLowPassFilter
+AudioEffectLowShelfFilter
+AudioEffectNotchFilter
+AudioEffectPanner
+AudioEffectPhaser
+AudioEffectPitchShift
+AudioEffectRecord
+AudioEffectReverb
+AudioEffectSpectrumAnalyzer
+AudioEffectSpectrumAnalyzerInstance
+AudioEffectStereoEnhance
+AudioListener2D
+AudioListener3D
+AudioSample
+AudioSamplePlayback
+AudioServer
+AudioStream
+AudioStreamGenerator
+AudioStreamGeneratorPlayback
+AudioStreamInteractive
+AudioStreamMP3
+AudioStreamMicrophone
+AudioStreamOggVorbis
+AudioStreamPlayback
+AudioStreamPlaybackInteractive
+AudioStreamPlaybackOggVorbis
+AudioStreamPlaybackPlaylist
+AudioStreamPlaybackPolyphonic
+AudioStreamPlaybackResampled
+AudioStreamPlaybackSynchronized
+AudioStreamPlayer
+AudioStreamPlayer2D
+AudioStreamPlayer3D
+AudioStreamPlaylist
+AudioStreamPolyphonic
+AudioStreamRandomizer
+AudioStreamSynchronized
+AudioStreamWAV
+BackBufferCopy
+BaseButton
+BaseMaterial3D
+BitMap
+Bone2D
+BoneAttachment3D
+BoneMap
+BoxContainer
+BoxMesh
+BoxOccluder3D
+BoxShape3D
+Button
+ButtonGroup
+CPUParticles2D
+CPUParticles3D
+CSGBox3D
+CSGCombiner3D
+CSGCylinder3D
+CSGMesh3D
+CSGPolygon3D
+CSGPrimitive3D
+CSGShape3D
+CSGSphere3D
+CSGTorus3D
+CallbackTweener
+Camera2D
+Camera3D
+CameraAttributes
+CameraAttributesPhysical
+CameraAttributesPractical
+CameraFeed
+CameraServer
+CameraTexture
+CanvasGroup
+CanvasItem
+CanvasItemMaterial
+CanvasLayer
+CanvasModulate
+CanvasTexture
+CapsuleMesh
+CapsuleShape2D
+CapsuleShape3D
+CenterContainer
+CharFXTransform
+CharacterBody2D
+CharacterBody3D
+CheckBox
+CheckButton
+CircleShape2D
+ClassDB
+CodeEdit
+CodeHighlighter
+CollisionObject2D
+CollisionObject3D
+CollisionPolygon2D
+CollisionPolygon3D
+CollisionShape2D
+CollisionShape3D
+ColorPicker
+ColorPickerButton
+ColorRect
+Compositor
+CompositorEffect
+CompressedCubemap
+CompressedCubemapArray
+CompressedTexture2D
+CompressedTexture2DArray
+CompressedTexture3D
+CompressedTextureLayered
+ConcavePolygonShape2D
+ConcavePolygonShape3D
+ConeTwistJoint3D
+ConfigFile
+ConfirmationDialog
+Container
+Control
+ConvexPolygonShape2D
+ConvexPolygonShape3D
+Crypto
+CryptoKey
+Cubemap
+CubemapArray
+Curve
+Curve2D
+Curve3D
+CurveTexture
+CurveXYZTexture
+CylinderMesh
+CylinderShape3D
+DTLSServer
+DampedSpringJoint2D
+Decal
+DirAccess
+DirectionalLight2D
+DirectionalLight3D
+DisplayServer
+ENetConnection
+ENetMultiplayerPeer
+ENetPacketPeer
+EditorCommandPalette
+EditorDebuggerPlugin
+EditorDebuggerSession
+EditorExportPlatform
+EditorExportPlatformAndroid
+EditorExportPlatformIOS
+EditorExportPlatformLinuxBSD
+EditorExportPlatformMacOS
+EditorExportPlatformPC
+EditorExportPlatformWeb
+EditorExportPlatformWindows
+EditorExportPlugin
+EditorFeatureProfile
+EditorFileDialog
+EditorFileSystem
+EditorFileSystemDirectory
+EditorFileSystemImportFormatSupportQuery
+EditorImportPlugin
+EditorInspector
+EditorInspectorPlugin
+EditorInterface
+EditorNode3DGizmo
+EditorNode3DGizmoPlugin
+EditorPaths
+EditorPlugin
+EditorProperty
+EditorResourceConversionPlugin
+EditorResourcePicker
+EditorResourcePreview
+EditorResourcePreviewGenerator
+EditorResourceTooltipPlugin
+EditorSceneFormatImporter
+EditorSceneFormatImporterBlend
+EditorSceneFormatImporterFBX2GLTF
+EditorSceneFormatImporterGLTF
+EditorSceneFormatImporterUFBX
+EditorScenePostImport
+EditorScenePostImportPlugin
+EditorScript
+EditorScriptPicker
+EditorSelection
+EditorSettings
+EditorSpinSlider
+EditorSyntaxHighlighter
+EditorTranslationParserPlugin
+EditorUndoRedoManager
+EditorVCSInterface
+EncodedObjectAsID
+Engine
+EngineDebugger
+EngineProfiler
+Environment
+Expression
+FBXDocument
+FBXState
+FastNoiseLite
+FileAccess
+FileDialog
+FileSystemDock
+FlowContainer
+FogMaterial
+FogVolume
+Font
+FontFile
+FontVariation
+FramebufferCacheRD
+GDExtension
+GDExtensionManager
+GDScript
+GDScriptEditorTranslationParserPlugin
+GDScriptNativeClass
+GLTFAccessor
+GLTFAnimation
+GLTFBufferView
+GLTFCamera
+GLTFDocument
+GLTFDocumentExtension
+GLTFDocumentExtensionConvertImporterMesh
+GLTFDocumentExtensionPhysics
+GLTFDocumentExtensionTextureKTX
+GLTFDocumentExtensionTextureWebP
+GLTFLight
+GLTFMesh
+GLTFNode
+GLTFPhysicsBody
+GLTFPhysicsShape
+GLTFSkeleton
+GLTFSkin
+GLTFSpecGloss
+GLTFState
+GLTFTexture
+GLTFTextureSampler
+GPUParticles2D
+GPUParticles3D
+GPUParticlesAttractor3D
+GPUParticlesAttractorBox3D
+GPUParticlesAttractorSphere3D
+GPUParticlesAttractorVectorField3D
+GPUParticlesCollision3D
+GPUParticlesCollisionBox3D
+GPUParticlesCollisionHeightField3D
+GPUParticlesCollisionSDF3D
+GPUParticlesCollisionSphere3D
+Generic6DOFJoint3D
+Geometry2D
+Geometry3D
+GeometryInstance3D
+GodotNavigationServer2D
+GodotPhysicsServer2D
+GodotPhysicsServer3D
+Gradient
+GradientTexture1D
+GradientTexture2D
+GraphEdit
+GraphElement
+GraphFrame
+GraphNode
+GridContainer
+GridMap
+GrooveJoint2D
+HBoxContainer
+HFlowContainer
+HMACContext
+HScrollBar
+HSeparator
+HSlider
+HSplitContainer
+HTTPClient
+HTTPRequest
+HashingContext
+HeightMapShape3D
+HingeJoint3D
+IP
+IPUnix
+Image
+ImageFormatLoader
+ImageFormatLoaderExtension
+ImageTexture
+ImageTexture3D
+ImageTextureLayered
+ImmediateMesh
+ImporterMesh
+ImporterMeshInstance3D
+Input
+InputEvent
+InputEventAction
+InputEventFromWindow
+InputEventGesture
+InputEventJoypadButton
+InputEventJoypadMotion
+InputEventKey
+InputEventMIDI
+InputEventMagnifyGesture
+InputEventMouse
+InputEventMouseButton
+InputEventMouseMotion
+InputEventPanGesture
+InputEventScreenDrag
+InputEventScreenTouch
+InputEventShortcut
+InputEventWithModifiers
+InputMap
+InstancePlaceholder
+IntervalTweener
+ItemList
+JNISingleton
+JSON
+JSONRPC
+JavaClass
+JavaClassWrapper
+JavaScriptBridge
+JavaScriptObject
+Joint2D
+Joint3D
+KinematicCollision2D
+KinematicCollision3D
+Label
+Label3D
+LabelSettings
+Light2D
+Light3D
+LightOccluder2D
+LightmapGI
+LightmapGIData
+LightmapProbe
+Lightmapper
+LightmapperRD
+Line2D
+LineEdit
+LinkButton
+MainLoop
+MarginContainer
+Marker2D
+Marker3D
+Marshalls
+Material
+MenuBar
+MenuButton
+Mesh
+MeshConvexDecompositionSettings
+MeshDataTool
+MeshInstance2D
+MeshInstance3D
+MeshLibrary
+MeshTexture
+MethodTweener
+MissingNode
+MissingResource
+MobileVRInterface
+MovieWriter
+MovieWriterMJPEG
+MovieWriterPNGWAV
+MultiMesh
+MultiMeshInstance2D
+MultiMeshInstance3D
+MultiplayerAPI
+MultiplayerAPIExtension
+MultiplayerPeer
+MultiplayerPeerExtension
+MultiplayerSpawner
+MultiplayerSynchronizer
+Mutex
+NativeMenu
+NativeMenuWindows
+NavigationAgent2D
+NavigationAgent3D
+NavigationLink2D
+NavigationLink3D
+NavigationMesh
+NavigationMeshGenerator
+NavigationMeshSourceGeometryData2D
+NavigationMeshSourceGeometryData3D
+NavigationObstacle2D
+NavigationObstacle3D
+NavigationPathQueryParameters2D
+NavigationPathQueryParameters3D
+NavigationPathQueryResult2D
+NavigationPathQueryResult3D
+NavigationPolygon
+NavigationRegion2D
+NavigationRegion3D
+NavigationServer2D
+NavigationServer3D
+NinePatchRect
+Node
+Node2D
+Node3D
+Node3DGizmo
+Noise
+NoiseTexture2D
+NoiseTexture3D
+ORMMaterial3D
+OS
+Object
+Occluder3D
+OccluderInstance3D
+OccluderPolygon2D
+OfflineMultiplayerPeer
+OggPacketSequence
+OggPacketSequencePlayback
+OmniLight3D
+OpenXRAPIExtension
+OpenXRAction
+OpenXRActionMap
+OpenXRActionSet
+OpenXRCompositionLayer
+OpenXRCompositionLayerCylinder
+OpenXRCompositionLayerEquirect
+OpenXRCompositionLayerQuad
+OpenXRExtensionWrapperExtension
+OpenXRHand
+OpenXRIPBinding
+OpenXRInteractionProfile
+OpenXRInteractionProfileMetadata
+OpenXRInterface
+OptimizedTranslation
+OptionButton
+PCKPacker
+PackedDataContainer
+PackedDataContainerRef
+PackedScene
+PacketPeer
+PacketPeerDTLS
+PacketPeerExtension
+PacketPeerStream
+PacketPeerUDP
+Panel
+PanelContainer
+PanoramaSkyMaterial
+Parallax2D
+ParallaxBackground
+ParallaxLayer
+ParticleProcessMaterial
+Path2D
+Path3D
+PathFollow2D
+PathFollow3D
+Performance
+PhysicalBone2D
+PhysicalBone3D
+PhysicalBoneSimulator3D
+PhysicalSkyMaterial
+PhysicsBody2D
+PhysicsBody3D
+PhysicsDirectBodyState2D
+PhysicsDirectBodyState2DExtension
+PhysicsDirectBodyState3D
+PhysicsDirectBodyState3DExtension
+PhysicsDirectSpaceState2D
+PhysicsDirectSpaceState2DExtension
+PhysicsDirectSpaceState3D
+PhysicsDirectSpaceState3DExtension
+PhysicsMaterial
+PhysicsPointQueryParameters2D
+PhysicsPointQueryParameters3D
+PhysicsRayQueryParameters2D
+PhysicsRayQueryParameters3D
+PhysicsServer2D
+PhysicsServer2DExtension
+PhysicsServer2DManager
+PhysicsServer3D
+PhysicsServer3DExtension
+PhysicsServer3DManager
+PhysicsServer3DRenderingServerHandler
+PhysicsShapeQueryParameters2D
+PhysicsShapeQueryParameters3D
+PhysicsTestMotionParameters2D
+PhysicsTestMotionParameters3D
+PhysicsTestMotionResult2D
+PhysicsTestMotionResult3D
+PinJoint2D
+PinJoint3D
+PlaceholderCubemap
+PlaceholderCubemapArray
+PlaceholderMaterial
+PlaceholderMesh
+PlaceholderTexture2D
+PlaceholderTexture2DArray
+PlaceholderTexture3D
+PlaceholderTextureLayered
+PlaneMesh
+PointLight2D
+PointMesh
+Polygon2D
+PolygonOccluder3D
+PolygonPathFinder
+Popup
+PopupMenu
+PopupPanel
+PortableCompressedTexture2D
+PrimitiveMesh
+PrismMesh
+ProceduralSkyMaterial
+ProgressBar
+ProjectSettings
+PropertyTweener
+QuadMesh
+QuadOccluder3D
+RDAttachmentFormat
+RDFramebufferPass
+RDPipelineColorBlendState
+RDPipelineColorBlendStateAttachment
+RDPipelineDepthStencilState
+RDPipelineMultisampleState
+RDPipelineRasterizationState
+RDPipelineSpecializationConstant
+RDSamplerState
+RDShaderFile
+RDShaderSPIRV
+RDShaderSource
+RDTextureFormat
+RDTextureView
+RDUniform
+RDVertexAttribute
+RandomNumberGenerator
+Range
+RayCast2D
+RayCast3D
+RectangleShape2D
+RefCounted
+ReferenceRect
+ReflectionProbe
+RegEx
+RegExMatch
+RemoteTransform2D
+RemoteTransform3D
+RenderData
+RenderDataExtension
+RenderDataRD
+RenderSceneBuffers
+RenderSceneBuffersConfiguration
+RenderSceneBuffersExtension
+RenderSceneBuffersRD
+RenderSceneData
+RenderSceneDataExtension
+RenderSceneDataRD
+RenderingDevice
+RenderingServer
+Resource
+ResourceFormatImporterSaver
+ResourceFormatLoader
+ResourceFormatSaver
+ResourceImporter
+ResourceImporterBMFont
+ResourceImporterBitMap
+ResourceImporterCSVTranslation
+ResourceImporterDynamicFont
+ResourceImporterImage
+ResourceImporterImageFont
+ResourceImporterLayeredTexture
+ResourceImporterMP3
+ResourceImporterOBJ
+ResourceImporterOggVorbis
+ResourceImporterScene
+ResourceImporterShaderFile
+ResourceImporterTexture
+ResourceImporterTextureAtlas
+ResourceImporterWAV
+ResourceLoader
+ResourcePreloader
+ResourceSaver
+ResourceUID
+RibbonTrailMesh
+RichTextEffect
+RichTextLabel
+RigidBody2D
+RigidBody3D
+RootMotionView
+SceneCacheInterface
+SceneMultiplayer
+SceneRPCInterface
+SceneReplicationConfig
+SceneReplicationInterface
+SceneState
+SceneTree
+SceneTreeTimer
+Script
+ScriptCreateDialog
+ScriptEditor
+ScriptEditorBase
+ScriptExtension
+ScriptLanguage
+ScriptLanguageExtension
+ScrollBar
+ScrollContainer
+SegmentShape2D
+Semaphore
+SeparationRayShape2D
+SeparationRayShape3D
+Separator
+Shader
+ShaderGlobalsOverride
+ShaderInclude
+ShaderMaterial
+Shape2D
+Shape3D
+ShapeCast2D
+ShapeCast3D
+Shortcut
+Skeleton2D
+Skeleton3D
+SkeletonIK3D
+SkeletonModification2D
+SkeletonModification2DCCDIK
+SkeletonModification2DFABRIK
+SkeletonModification2DJiggle
+SkeletonModification2DLookAt
+SkeletonModification2DPhysicalBones
+SkeletonModification2DStackHolder
+SkeletonModification2DTwoBoneIK
+SkeletonModificationStack2D
+SkeletonModifier3D
+SkeletonProfile
+SkeletonProfileHumanoid
+Skin
+SkinReference
+Sky
+Slider
+SliderJoint3D
+SoftBody3D
+SphereMesh
+SphereOccluder3D
+SphereShape3D
+SpinBox
+SplitContainer
+SpotLight3D
+SpringArm3D
+Sprite2D
+Sprite3D
+SpriteBase3D
+SpriteFrames
+StandardMaterial3D
+StaticBody2D
+StaticBody3D
+StatusIndicator
+StreamPeer
+StreamPeerBuffer
+StreamPeerExtension
+StreamPeerGZIP
+StreamPeerTCP
+StreamPeerTLS
+StyleBox
+StyleBoxEmpty
+StyleBoxFlat
+StyleBoxLine
+StyleBoxTexture
+SubViewport
+SubViewportContainer
+SurfaceTool
+SyntaxHighlighter
+SystemFont
+TCPServer
+TLSOptions
+TabBar
+TabContainer
+TextEdit
+TextLine
+TextMesh
+TextParagraph
+TextServer
+TextServerAdvanced
+TextServerDummy
+TextServerExtension
+TextServerManager
+Texture
+Texture2D
+Texture2DArray
+Texture2DArrayRD
+Texture2DRD
+Texture3D
+Texture3DRD
+TextureButton
+TextureCubemapArrayRD
+TextureCubemapRD
+TextureLayered
+TextureLayeredRD
+TextureProgressBar
+TextureRect
+Theme
+ThemeContext
+ThemeDB
+Thread
+TileData
+TileMap
+TileMapLayer
+TileMapPattern
+TileSet
+TileSetAtlasSource
+TileSetScenesCollectionSource
+TileSetSource
+Time
+Timer
+TorusMesh
+TouchScreenButton
+Translation
+TranslationServer
+Tree
+TreeItem
+TriangleMesh
+TubeTrailMesh
+Tween
+Tweener
+UDPServer
+UPNP
+UPNPDevice
+UndoRedo
+UniformSetCacheRD
+VBoxContainer
+VFlowContainer
+VScrollBar
+VSeparator
+VSlider
+VSplitContainer
+VehicleBody3D
+VehicleWheel3D
+VideoStream
+VideoStreamPlayback
+VideoStreamPlayer
+VideoStreamTheora
+Viewport
+ViewportTexture
+VisibleOnScreenEnabler2D
+VisibleOnScreenEnabler3D
+VisibleOnScreenNotifier2D
+VisibleOnScreenNotifier3D
+VisualInstance3D
+VisualShader
+VisualShaderNode
+VisualShaderNodeBillboard
+VisualShaderNodeBooleanConstant
+VisualShaderNodeBooleanParameter
+VisualShaderNodeClamp
+VisualShaderNodeColorConstant
+VisualShaderNodeColorFunc
+VisualShaderNodeColorOp
+VisualShaderNodeColorParameter
+VisualShaderNodeComment
+VisualShaderNodeCompare
+VisualShaderNodeConstant
+VisualShaderNodeCubemap
+VisualShaderNodeCubemapParameter
+VisualShaderNodeCurveTexture
+VisualShaderNodeCurveXYZTexture
+VisualShaderNodeCustom
+VisualShaderNodeDerivativeFunc
+VisualShaderNodeDeterminant
+VisualShaderNodeDistanceFade
+VisualShaderNodeDotProduct
+VisualShaderNodeExpression
+VisualShaderNodeFaceForward
+VisualShaderNodeFloatConstant
+VisualShaderNodeFloatFunc
+VisualShaderNodeFloatOp
+VisualShaderNodeFloatParameter
+VisualShaderNodeFrame
+VisualShaderNodeFresnel
+VisualShaderNodeGlobalExpression
+VisualShaderNodeGroupBase
+VisualShaderNodeIf
+VisualShaderNodeInput
+VisualShaderNodeIntConstant
+VisualShaderNodeIntFunc
+VisualShaderNodeIntOp
+VisualShaderNodeIntParameter
+VisualShaderNodeIs
+VisualShaderNodeLinearSceneDepth
+VisualShaderNodeMix
+VisualShaderNodeMultiplyAdd
+VisualShaderNodeOuterProduct
+VisualShaderNodeOutput
+VisualShaderNodeParameter
+VisualShaderNodeParameterRef
+VisualShaderNodeParticleAccelerator
+VisualShaderNodeParticleBoxEmitter
+VisualShaderNodeParticleConeVelocity
+VisualShaderNodeParticleEmit
+VisualShaderNodeParticleEmitter
+VisualShaderNodeParticleMeshEmitter
+VisualShaderNodeParticleMultiplyByAxisAngle
+VisualShaderNodeParticleOutput
+VisualShaderNodeParticleRandomness
+VisualShaderNodeParticleRingEmitter
+VisualShaderNodeParticleSphereEmitter
+VisualShaderNodeProximityFade
+VisualShaderNodeRandomRange
+VisualShaderNodeRemap
+VisualShaderNodeReroute
+VisualShaderNodeResizableBase
+VisualShaderNodeRotationByAxis
+VisualShaderNodeSDFRaymarch
+VisualShaderNodeSDFToScreenUV
+VisualShaderNodeSample3D
+VisualShaderNodeScreenNormalWorldSpace
+VisualShaderNodeScreenUVToSDF
+VisualShaderNodeSmoothStep
+VisualShaderNodeStep
+VisualShaderNodeSwitch
+VisualShaderNodeTexture
+VisualShaderNodeTexture2DArray
+VisualShaderNodeTexture2DArrayParameter
+VisualShaderNodeTexture2DParameter
+VisualShaderNodeTexture3D
+VisualShaderNodeTexture3DParameter
+VisualShaderNodeTextureParameter
+VisualShaderNodeTextureParameterTriplanar
+VisualShaderNodeTextureSDF
+VisualShaderNodeTextureSDFNormal
+VisualShaderNodeTransformCompose
+VisualShaderNodeTransformConstant
+VisualShaderNodeTransformDecompose
+VisualShaderNodeTransformFunc
+VisualShaderNodeTransformOp
+VisualShaderNodeTransformParameter
+VisualShaderNodeTransformVecMult
+VisualShaderNodeUIntConstant
+VisualShaderNodeUIntFunc
+VisualShaderNodeUIntOp
+VisualShaderNodeUIntParameter
+VisualShaderNodeUVFunc
+VisualShaderNodeUVPolarCoord
+VisualShaderNodeVarying
+VisualShaderNodeVaryingGetter
+VisualShaderNodeVaryingSetter
+VisualShaderNodeVec2Constant
+VisualShaderNodeVec2Parameter
+VisualShaderNodeVec3Constant
+VisualShaderNodeVec3Parameter
+VisualShaderNodeVec4Constant
+VisualShaderNodeVec4Parameter
+VisualShaderNodeVectorBase
+VisualShaderNodeVectorCompose
+VisualShaderNodeVectorDecompose
+VisualShaderNodeVectorDistance
+VisualShaderNodeVectorFunc
+VisualShaderNodeVectorLen
+VisualShaderNodeVectorOp
+VisualShaderNodeVectorRefract
+VisualShaderNodeWorldPositionFromDepth
+VoxelGI
+VoxelGIData
+WeakRef
+WebRTCDataChannel
+WebRTCDataChannelExtension
+WebRTCMultiplayerPeer
+WebRTCPeerConnection
+WebRTCPeerConnectionExtension
+WebSocketMultiplayerPeer
+WebSocketPeer
+WebXRInterface
+Window
+WorkerThreadPool
+World2D
+World3D
+WorldBoundaryShape2D
+WorldBoundaryShape3D
+WorldEnvironment
+X509Certificate
+XMLParser
+XRAnchor3D
+XRBodyModifier3D
+XRBodyTracker
+XRCamera3D
+XRController3D
+XRControllerTracker
+XRFaceModifier3D
+XRFaceTracker
+XRHandModifier3D
+XRHandTracker
+XRInterface
+XRInterfaceExtension
+XRNode3D
+XROrigin3D
+XRPose
+XRPositionalTracker
+XRServer
+XRTracker
+XRVRS
+ZIPPacker
+ZIPReader
\ No newline at end of file
diff --git a/source/addons/bbcode_edit.editor/completions_db/completions.gd b/source/addons/bbcode_edit.editor/completions_db/completions.gd
new file mode 100644
index 0000000..b24ec8d
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/completions_db/completions.gd
@@ -0,0 +1,265 @@
+extends Object
+
+
+const Scraper = preload("res://addons/bbcode_edit.editor/editor_interface_scraper.gd")
+
+
+const PATH_BUILTIN_COMPLETIONS = "res://addons/bbcode_edit.editor/completions_db/builtin_classes.txt"
+
+
+# TODO add all tags and classify them between Documentation Only, Documentation Forbidden, Universal
+const TAGS_UNIVERSAL: Array[String] = [
+ "b]|[/b",
+ "u]|[/u",
+ "i]|[/i",
+ "s]|[/s",
+ "code]|[/code",
+ "color=|][/color",
+ "lb||",
+ "rb||",
+ "font=|][/font",
+ "img]res://|[/img",
+ "img width=| height=]res://[/img",
+ "url]|[/url",
+ "url=https://|][/url",
+ "center]|[/center",
+]
+const TAGS_DOC_COMMENT_REFERENCE: Array[String] = [
+ "annotation |",
+ "constant |",
+ "enum |",
+ "member |",
+ "method |",
+ "constructor |",
+ "operator |",
+ "signal |",
+ "theme_item |",
+]
+const TAGS_DOC_COMMENT_FORMATTING: Array[String] = [
+ "codeblock]|[/codeblock",
+ "br||",
+ "kbd]|[/kbd",
+]
+# TODO add all tags
+const TAGS_RICH_TEXT_LABEL: Array[String] = [
+ # TODO complete with all options
+ "font name=| size=][/font]",
+ 'url={"|": }][/url',
+]
+const COLORS: Array[StringName] = [
+ "alice_blue",
+ "antique_white",
+ "aqua",
+ "aquamarine",
+ "azure",
+ "beige",
+ "bisque",
+ "black",
+ "blanched_almond",
+ "blue",
+ "blue_violet",
+ "brown",
+ "burlywood",
+ "cadet_blue",
+ "chartreuse",
+ "chocolate",
+ "coral",
+ "cornflower_blue",
+ "cornsilk",
+ "crimson",
+ "cyan",
+ "dark_blue",
+ "dark_cyan",
+ "dark_goldenrod",
+ "dark_gray",
+ "dark_green",
+ "dark_khaki",
+ "dark_magenta",
+ "dark_olive_green",
+ "dark_orange",
+ "dark_orchid",
+ "dark_red",
+ "dark_salmon",
+ "dark_sea_green",
+ "dark_slate_blue",
+ "dark_slate_gray",
+ "dark_turquoise",
+ "dark_violet",
+ "deep_pink",
+ "deep_sky_blue",
+ "dim_gray",
+ "dodger_blue",
+ "firebrick",
+ "floral_white",
+ "forest_green",
+ "fuchsia",
+ "gainsboro",
+ "ghost_white",
+ "gold",
+ "goldenrod",
+ "gray",
+ "green",
+ "green_yellow",
+ "honeydew",
+ "hot_pink",
+ "indian_red",
+ "indigo",
+ "ivory",
+ "khaki",
+ "lavender",
+ "lavender_blush",
+ "lawn_green",
+ "lemon_chiffon",
+ "light_blue",
+ "light_coral",
+ "light_cyan",
+ "light_goldenrod",
+ "light_gray",
+ "light_green",
+ "light_pink",
+ "light_salmon",
+ "light_sea_green",
+ "light_sky_blue",
+ "light_slate_gray",
+ "light_steel_blue",
+ "light_yellow",
+ "lime",
+ "lime_green",
+ "linen",
+ "magenta",
+ "maroon",
+ "medium_aquamarine",
+ "medium_blue",
+ "medium_orchid",
+ "medium_purple",
+ "medium_sea_green",
+ "medium_slate_blue",
+ "medium_spring_green",
+ "medium_turquoise",
+ "medium_violet_red",
+ "midnight_blue",
+ "mint_cream",
+ "misty_rose",
+ "moccasin",
+ "navajo_white",
+ "navy_blue",
+ "old_lace",
+ "olive",
+ "olive_drab",
+ "orange",
+ "orange_red",
+ "orchid",
+ "pale_goldenrod",
+ "pale_green",
+ "pale_turquoise",
+ "pale_violet_red",
+ "papaya_whip",
+ "peach_puff",
+ "peru",
+ "pink",
+ "plum",
+ "powder_blue",
+ "purple",
+ "rebecca_purple",
+ "red",
+ "rosy_brown",
+ "royal_blue",
+ "saddle_brown",
+ "salmon",
+ "sandy_brown",
+ "sea_green",
+ "seashell",
+ "sienna",
+ "silver",
+ "sky_blue",
+ "slate_blue",
+ "slate_gray",
+ "snow",
+ "spring_green",
+ "steel_blue",
+ "tan",
+ "teal",
+ "thistle",
+ "tomato",
+ "transparent",
+ "turquoise",
+ "violet",
+ "web_gray",
+ "web_green",
+ "web_maroon",
+ "web_purple",
+ "wheat",
+ "white",
+ "white_smoke",
+ "yellow",
+ "yellow_green",
+]
+
+
+static var _BUILTIN_CLASSES = PackedStringArray()
+
+
+static func get_builtin_classes() -> PackedStringArray:
+ if not _BUILTIN_CLASSES:
+ var file: FileAccess = FileAccess.open(PATH_BUILTIN_COMPLETIONS, FileAccess.READ)
+ if FileAccess.get_open_error():
+ push_error(
+ "Failed to open "
+ + PATH_BUILTIN_COMPLETIONS
+ + ", error is:"
+ + error_string(FileAccess.get_open_error())
+ )
+ _BUILTIN_CLASSES = file.get_as_text().split("\n")
+ return _BUILTIN_CLASSES
+
+
+static var icon_cache: Dictionary = {}
+static func get_class_completions() -> ClassCompletions:
+ var class_names: PackedStringArray = get_builtin_classes().duplicate()
+ var icons: Array[Texture2D] = []
+ for class_name_ in class_names:
+ icons.append(Scraper.get_builtin_class_icon(class_name_))
+
+ var classes: Array[Dictionary] = ProjectSettings.get_global_class_list()
+ var class_to_icon: Dictionary = {}
+ var class_to_base: Dictionary = {}
+
+ for class_ in classes:
+ var class_name_: String = class_["class"]
+ class_names.append(class_name_)
+
+ var icon_path: String = class_.get("icon", "")
+ if icon_path:
+ icons.append(load(icon_path))
+ elif class_name_ in icon_cache:
+ icons.append(icon_cache[class_name_])
+ else:
+ if class_to_base.is_empty():
+ for class__ in classes:
+ if class__["icon"]:
+ class_to_icon[class__["class"]] = class__["icon"]
+ class_to_base[class__["class"]] = class__["base"]
+ var icon_class: String = class_name_
+ while icon_class in class_to_base:
+ icon_class = class_to_base[icon_class]
+ if icon_class in class_to_icon:
+ icon_cache[class_name_] = load(class_to_icon[icon_class])
+ icons.append(icon_cache[class_name_])
+ break
+ if len(icons) != len(class_names):
+ icon_cache[class_name_] = Scraper.get_builtin_class_icon(icon_class)
+ icons.append(icon_cache[class_name_])
+
+ return ClassCompletions.new(
+ class_names,
+ icons,
+ )
+
+
+class ClassCompletions:
+ var names: PackedStringArray
+ var icons: Array[Texture2D]
+
+ func _init(_names: PackedStringArray, _icons: Array[Texture2D]) -> void:
+ names = _names
+ icons = _icons
diff --git a/source/addons/bbcode_edit.editor/completions_db/completions.gd.uid b/source/addons/bbcode_edit.editor/completions_db/completions.gd.uid
new file mode 100644
index 0000000..a06425c
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/completions_db/completions.gd.uid
@@ -0,0 +1 @@
+uid://cwk6mlavaqf8c
diff --git a/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd b/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd
new file mode 100644
index 0000000..9c42aa1
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd
@@ -0,0 +1,23 @@
+extends Node
+
+
+## This has to be a scene.
+## (In an EditorScript, editor specifc classes would polute the result)
+
+const Completions = preload("res://addons/bbcode_edit.editor/completions_db/completions.gd")
+
+
+func _ready() -> void:
+ print("Fetching classes...")
+ var file: FileAccess = FileAccess.open(Completions.PATH_BUILTIN_COMPLETIONS, FileAccess.WRITE)
+ if FileAccess.get_open_error():
+ push_error(
+ "Failed to open "
+ + Completions.PATH_BUILTIN_COMPLETIONS
+ + ", error is:"
+ + error_string(FileAccess.get_open_error())
+ )
+ return
+ file.store_string("\n".join(ClassDB.get_class_list()))
+ print_rich("[color=web_green]Classes successfuly pasted to clipboard")
+ get_tree().quit()
diff --git a/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd.uid b/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd.uid
new file mode 100644
index 0000000..12e5c72
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd.uid
@@ -0,0 +1 @@
+uid://bd4tjvv6hc3wg
diff --git a/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.tscn b/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.tscn
new file mode 100644
index 0000000..88bc6e9
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://blcco0wsttyck"]
+
+[ext_resource type="Script" path="res://addons/bbcode_edit.editor/completions_db/fetch_builtin_classes.gd" id="1_tk0nj"]
+
+[node name="FetchClassDB" type="Node"]
+script = ExtResource("1_tk0nj")
diff --git a/source/addons/bbcode_edit.editor/editor_interface_scraper.gd b/source/addons/bbcode_edit.editor/editor_interface_scraper.gd
new file mode 100644
index 0000000..1f4732a
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/editor_interface_scraper.gd
@@ -0,0 +1,126 @@
+extends Object
+
+
+## This singleton has utility methods to scrap the Editor's interface
+
+
+static func get_icon(icon: StringName) -> Texture2D:
+ return EditorInterface.get_base_control().get_theme_icon(icon, &"EditorIcons")
+
+
+static func get_color_icon() -> Texture2D:
+ return get_icon(&"Color")
+
+
+static func get_reference_icon() -> Texture2D:
+ return get_icon(&"Help")
+
+
+static func try_get_icon(icon: StringName, fallback: StringName) -> Texture2D:
+ var result: Texture2D = get_icon(icon)
+ if result == get_icon(&"za86e81czxe1s89az6ee7s1"): # Random
+ return get_icon(fallback)
+ return result
+
+
+static func get_builtin_class_icon(class_name_: StringName) -> Texture2D:
+ var result: Texture2D = get_icon(class_name_)
+ var file_broken: Texture2D = get_icon(&"za86e81czxe1s89az6ee7s1") # Random
+ while result == file_broken and class_name_ != &"":
+ class_name_ = ClassDB.get_parent_class(class_name_)
+ result = get_icon(class_name_)
+ return result
+
+
+static func get_class_icon(name: StringName, fallback: StringName) -> Texture2D:
+ if ClassDB.class_exists(name):
+ return get_builtin_class_icon(name)
+ var base_name = name
+ var global_class_list := ProjectSettings.get_global_class_list()
+ var found: bool = true
+ while found:
+ found = false
+ for class_ in global_class_list:
+ if class_["class"] == name:
+ if class_["icon"]:
+ return load(class_["icon"])
+ else:
+ name = class_["base"]
+ if ClassDB.class_exists(name):
+ return get_builtin_class_icon(name)
+ found = true
+ break
+
+ # This can happen for type union (ex: CanvasItemMaterial,ShaderMaterial)
+ return get_icon(fallback)
+
+
+## [b]Note:[/b] Return the Variant icon for [constant @GlobalScope.TYPE_NIL].
+static func get_builtin_type_icon(type: Variant.Type, fallback: StringName) -> Texture2D:
+ if type == TYPE_NIL:
+ return get_icon(&"Variant")
+
+ if 0 <= type and type < TYPE_MAX:
+ return get_icon(type_string(type))
+
+ return get_icon(fallback)
+
+
+static func get_type_icon(value: Variant, fallback: StringName) -> Texture2D:
+ var type: int = typeof(value)
+ if type == TYPE_OBJECT:
+ if value is Script:
+ var to_check: Script = value
+ while true:
+ if to_check.get_global_name():
+ return get_class_icon(to_check.get_global_name(), fallback)
+ # TODO MAYBE Read first line for @icon
+ if to_check.get_base_script():
+ to_check = to_check.get_base_script()
+ else:
+ return get_builtin_class_icon(to_check.get_instance_base_type())
+
+ var script: Script = value.get_script()
+ if script:
+ var search_for: Script = script
+ while true:
+ for class_ in ProjectSettings.get_global_class_list():
+ if class_["path"] == search_for.resource_path:
+ return get_class_icon(class_["class"], fallback)
+ if search_for.get_base_script():
+ search_for = search_for.get_base_script()
+ else:
+ return get_builtin_class_icon(search_for.get_instance_base_type())
+
+ return get_builtin_class_icon(value.get_class())
+
+ return get_builtin_type_icon(type, fallback)
+
+
+## Scrap the Editor tree to find if it's unsaved.
+static func is_current_script_unsaved() -> bool:
+ # Reference path: $"../../../../../../@VSplitContainer@9820/@VBoxContainer@9821/@ItemList@9824"
+ var current_editor := EditorInterface.get_script_editor().get_current_editor().get_base_editor()
+ if current_editor is not CodeEdit:
+ return false
+
+ var pointer: Node = current_editor.get_node(^"../../../../../..")
+
+ if pointer == null:
+ return false
+
+ for node_type: String in ["VSplitContainer", "VBoxContainer", "ItemList"]:
+ pointer = _fetch_node(pointer, node_type)
+ if pointer == null:
+ return false
+
+ var item_list: ItemList = pointer
+ return item_list.get_item_text(item_list.get_selected_items()[0]).ends_with("(*)")
+
+
+static func _fetch_node(parent: Node, type: String) -> Node:
+ type = "@" + type
+ for child in parent.get_children():
+ if child.name.begins_with(type):
+ return child
+ return null
diff --git a/source/addons/bbcode_edit.editor/editor_interface_scraper.gd.uid b/source/addons/bbcode_edit.editor/editor_interface_scraper.gd.uid
new file mode 100644
index 0000000..5b27619
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/editor_interface_scraper.gd.uid
@@ -0,0 +1 @@
+uid://dfbwqmen4hcc4
diff --git a/source/addons/bbcode_edit.editor/plugin.cfg b/source/addons/bbcode_edit.editor/plugin.cfg
new file mode 100644
index 0000000..43fffed
--- /dev/null
+++ b/source/addons/bbcode_edit.editor/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="BBCodeEdit (for script editor)"
+description="A Godot addon that brings BBCode completion and QOL tools to the script editor in order to help formatting documentation comments."
+author="Patou"
+version="1.0.1"
+script="bbcode_edit_main.gd"
diff --git a/source/addons/debug_draw_3d/LICENSE b/source/addons/debug_draw_3d/LICENSE
new file mode 100644
index 0000000..617a15b
--- /dev/null
+++ b/source/addons/debug_draw_3d/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 DmitriySalnikov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the Software), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, andor sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/source/addons/debug_draw_3d/README.md b/source/addons/debug_draw_3d/README.md
new file mode 100644
index 0000000..3f26a8f
--- /dev/null
+++ b/source/addons/debug_draw_3d/README.md
@@ -0,0 +1,162 @@
+
+
+# Debug drawing utility for Godot
+
+This is an add-on for debug drawing in 3D and for some 2D overlays, which is written in `C++` and can be used with `GDScript` or `C#`.
+
+Based on my previous addon, which was developed [only for C#](https://github.com/DmitriySalnikov/godot_debug_draw_cs), and which was inspired by [Zylann's GDScript addon](https://github.com/Zylann/godot_debug_draw)
+
+## [Documentation](https://dd3d.dmitriysalnikov.ru/docs/)
+
+## [Godot 3 version](https://github.com/DmitriySalnikov/godot_debug_draw_3d/tree/godot_3)
+
+## Support me
+
+Your support adds motivation to develop my public projects.
+
+
+
+
+
+USDT-TRC20 TEw934PrsffHsAn5M63SoHYRuZo984EF6v
+
+## Features
+
+3D:
+
+* Arrow
+* Billboard opaque square
+* Box
+* Camera Frustum
+* Cylinder
+* Gizmo
+* Grid
+* Line
+* Line Path
+* Line with Arrow
+* Plane
+* Points
+* Position 3D (3 crossing axes)
+* Sphere
+
+2D:
+
+* **[Work in progress]**
+
+Overlay:
+
+* Text (with grouping and coloring)
+* FPS Graph
+* Custom Graphs
+
+Precompiled for:
+
+* Windows
+* Linux (built on Ubuntu 20.04)
+* macOS (10.14+)
+* Android (5.0+)
+* iOS
+* Web (Firefox not supported)
+
+This addon supports working with several World3D and different Viewports.
+There is also a no depth test mode and other settings that can be changed for each instance.
+
+This library supports double-precision builds, for more information, [see the documentation](https://dd3d.dmitriysalnikov.ru/docs/1.4.5/md_docs_2DoublePrecision.html).
+
+## [Interactive Web Demo](https://dd3d.dmitriysalnikov.ru/demo/)
+
+[](https://dd3d.dmitriysalnikov.ru/demo/)
+
+> [!WARNING]
+>
+> * Firefox most likely can't run this demo
+
+## Download
+
+To download, use the [Godot Asset Library](https://godotengine.org/asset-library/asset/1766) or use one of the stable versions from the [GitHub Releases](https://github.com/DmitriySalnikov/godot_debug_draw_3d/releases) page.
+
+For versions prior to `1.4.5`, just download one of the `source codes` in the assets. For newer versions, download `debug-draw-3d_[version].zip`.
+
+### Installation
+
+* Close editor
+* Copy `addons/debug_draw_3d` to your `addons` folder, create it if the folder doesn't exist
+* Launch editor
+
+## Examples
+
+More examples can be found in the `examples_dd3d/` folder.
+
+Simple test:
+
+```gdscript
+func _process(delta: float) -> void:
+ var _time = Time.get_ticks_msec() / 1000.0
+ var box_pos = Vector3(0, sin(_time * 4), 0)
+ var line_begin = Vector3(-1, sin(_time * 4), 0)
+ var line_end = Vector3(1, cos(_time * 4), 0)
+
+ DebugDraw3D.draw_box(box_pos, Vector3(1, 2, 1), Color(0, 1, 0))
+ DebugDraw3D.draw_line(line_begin, line_end, Color(1, 1, 0))
+ DebugDraw2D.set_text("Time", _time)
+ DebugDraw2D.set_text("Frames drawn", Engine.get_frames_drawn())
+ DebugDraw2D.set_text("FPS", Engine.get_frames_per_second())
+ DebugDraw2D.set_text("delta", delta)
+```
+
+
+
+An example of using scoped configs:
+
+```gdscript
+@tool
+extends Node3D
+
+func _ready():
+ # Set the base scoped_config.
+ # Each frame will be reset to these scoped values.
+ DebugDraw3D.scoped_config().set_thickness(0.1).set_center_brightness(0.6)
+
+func _process(delta):
+ # Draw using the base scoped config.
+ DebugDraw3D.draw_box(Vector3.ZERO, Quaternion.IDENTITY, Vector3.ONE * 2, Color.CORNFLOWER_BLUE)
+ if true:
+ # Create a scoped config that will exist until exiting this if.
+ var _s = DebugDraw3D.new_scoped_config().set_thickness(0).set_center_brightness(0.1)
+ # Draw with a thickness of 0
+ DebugDraw3D.draw_box(Vector3.ZERO, Quaternion.IDENTITY, Vector3.ONE, Color.RED)
+ # If necessary, the values inside this scope can be changed
+ # even before each call to draw_*.
+ _s.set_thickness(0.05)
+ DebugDraw3D.draw_box(Vector3(1,0,1), Quaternion.IDENTITY, Vector3.ONE * 1, Color.BLUE_VIOLET)
+```
+
+
+
+> [!TIP]
+>
+> If you want to use a non-standard Viewport for rendering a 3d scene, then do not forget to specify it in the scoped config!
+
+## API
+
+This project has a separate [documentation](https://dd3d.dmitriysalnikov.ru/docs/) page.
+
+Also, a list of all functions is available in the documentation inside the editor (see `DebugDraw3D` and `DebugDraw2D`).
+
+
+
+## Known issues and limitations
+
+The text in the keys and values of a text group cannot contain multi-line strings.
+
+The entire text overlay can only be placed in one corner, unlike `DataGraphs`.
+
+[Frustum of Camera3D does not take into account the window size from ProjectSettings](https://github.com/godotengine/godot/issues/70362).
+
+## More screenshots
+
+`DebugDrawDemoScene.tscn` in editor
+
+
+`DebugDrawDemoScene.tscn` in play mode
+
diff --git a/source/addons/debug_draw_3d/debug_draw_3d.gdextension b/source/addons/debug_draw_3d/debug_draw_3d.gdextension
new file mode 100644
index 0000000..9017632
--- /dev/null
+++ b/source/addons/debug_draw_3d/debug_draw_3d.gdextension
@@ -0,0 +1,153 @@
+[configuration]
+
+entry_symbol = "debug_draw_3d_library_init"
+compatibility_minimum = "4.1.4"
+reloadable = false
+
+[dependencies]
+
+; example.x86_64 = { "relative or absolute path to the dependency" : "the path relative to the exported project", }
+; -------------------------------------
+; debug
+
+macos = { }
+windows.x86_64 = { }
+linux.x86_64 = { }
+
+; by default godot is using threads
+web.wasm32.nothreads = {}
+web.wasm32 = {}
+
+android.arm32 = { }
+android.arm64 = { }
+android.x86_32 = { }
+android.x86_64 = { }
+
+ios = {}
+
+; -------------------------------------
+; release no debug draw
+
+macos.template_release = { }
+windows.template_release.x86_64 = { }
+linux.template_release.x86_64 = { }
+
+web.template_release.wasm32.nothreads = { }
+web.template_release.wasm32 = { }
+
+android.template_release.arm32 = { }
+android.template_release.arm64 = { }
+android.template_release.x86_32 = { }
+android.template_release.x86_64 = { }
+
+ios.template_release = {}
+
+; -------------------------------------
+; release forced debug draw
+
+macos.template_release.forced_dd3d = { }
+windows.template_release.x86_64.forced_dd3d = { }
+linux.template_release.x86_64.forced_dd3d = { }
+
+web.template_release.wasm32.nothreads.forced_dd3d = { }
+web.template_release.wasm32.forced_dd3d = { }
+
+ios.template_release.forced_dd3d = {}
+
+[libraries]
+
+; -------------------------------------
+; debug
+
+macos = "libs/libdd3d.macos.editor.universal.framework"
+windows.x86_64 = "libs/libdd3d.windows.editor.x86_64.dll"
+linux.x86_64 = "libs/libdd3d.linux.editor.x86_64.so"
+
+web.wasm32.nothreads = "libs/libdd3d.web.template_debug.wasm32.wasm"
+web.wasm32 = "libs/libdd3d.web.template_debug.wasm32.threads.wasm"
+
+android.arm32 = "libs/libdd3d.android.template_debug.arm32.so"
+android.arm64 = "libs/libdd3d.android.template_debug.arm64.so"
+android.x86_32 = "libs/libdd3d.android.template_debug.x86_32.so"
+android.x86_64 = "libs/libdd3d.android.template_debug.x86_64.so"
+
+ios = "libs/libdd3d.ios.template_debug.universal.dylib"
+
+; -------------------------------------
+; release no debug draw
+
+macos.template_release = "libs/libdd3d.macos.template_release.universal.framework"
+windows.template_release.x86_64 = "libs/libdd3d.windows.template_release.x86_64.dll"
+linux.template_release.x86_64 = "libs/libdd3d.linux.template_release.x86_64.so"
+
+web.template_release.wasm32.nothreads = "libs/libdd3d.web.template_release.wasm32.wasm"
+web.template_release.wasm32 = "libs/libdd3d.web.template_release.wasm32.threads.wasm"
+
+android.template_release.arm32 = "libs/libdd3d.android.template_release.arm32.so"
+android.template_release.arm64 = "libs/libdd3d.android.template_release.arm64.so"
+android.template_release.x86_32 = "libs/libdd3d.android.template_release.x86_32.so"
+android.template_release.x86_64 = "libs/libdd3d.android.template_release.x86_64.so"
+
+ios.template_release = "libs/libdd3d.ios.template_release.universal.dylib"
+
+; -------------------------------------
+; release forced debug draw
+
+macos.template_release.forced_dd3d = "libs/libdd3d.macos.template_release.universal.enabled.framework"
+windows.template_release.x86_64.forced_dd3d = "libs/libdd3d.windows.template_release.x86_64.enabled.dll"
+linux.template_release.x86_64.forced_dd3d = "libs/libdd3d.linux.template_release.x86_64.enabled.so"
+
+web.template_release.wasm32.nothreads.forced_dd3d = "libs/libdd3d.web.template_release.wasm32.enabled.wasm"
+web.template_release.wasm32.forced_dd3d = "libs/libdd3d.web.template_release.wasm32.threads.enabled.wasm"
+
+ios.template_release.forced_dd3d = "libs/libdd3d.ios.template_release.universal.enabled.dylib"
+
+; -------------------------------------
+; DOUBLE PRECISION
+; -------------------------------------
+
+; -------------------------------------
+; debug
+
+macos.double = "libs/libdd3d.macos.editor.universal.double.framework"
+windows.x86_64.double = "libs/libdd3d.windows.editor.x86_64.double.dll"
+linux.x86_64.double = "libs/libdd3d.linux.editor.x86_64.double.so"
+
+web.wasm32.nothreads.double = "libs/libdd3d.web.template_debug.wasm32.double.wasm"
+web.wasm32.double = "libs/libdd3d.web.template_debug.wasm32.threads.double.wasm"
+
+android.arm32.double = "libs/libdd3d.android.template_debug.arm32.double.so"
+android.arm64.double = "libs/libdd3d.android.template_debug.arm64.double.so"
+android.x86_32.double = "libs/libdd3d.android.template_debug.x86_32.double.so"
+android.x86_64.double = "libs/libdd3d.android.template_debug.x86_64.double.so"
+
+ios.double = "libs/libdd3d.ios.template_debug.universal.dylib"
+
+; -------------------------------------
+; release no debug draw
+
+macos.template_release.double = "libs/libdd3d.macos.template_release.universal.double.framework"
+windows.template_release.x86_64.double = "libs/libdd3d.windows.template_release.x86_64.double.dll"
+linux.template_release.x86_64.double = "libs/libdd3d.linux.template_release.x86_64.double.so"
+
+web.template_release.wasm32.nothreads.double = "libs/libdd3d.web.template_release.wasm32.double.wasm"
+web.template_release.wasm32.double = "libs/libdd3d.web.template_release.wasm32.threads.double.wasm"
+
+android.template_release.arm32.double = "libs/libdd3d.android.template_release.arm32.double.so"
+android.template_release.arm64.double = "libs/libdd3d.android.template_release.arm64.double.so"
+android.template_release.x86_32.double = "libs/libdd3d.android.template_release.x86_32.double.so"
+android.template_release.x86_64.double = "libs/libdd3d.android.template_release.x86_64.double.so"
+
+ios.template_release.double = "libs/libdd3d.ios.template_release.universal.double.dylib"
+
+; -------------------------------------
+; release forced debug draw
+
+macos.template_release.forced_dd3d.double = "libs/libdd3d.macos.template_release.universal.enabled.double.framework"
+windows.template_release.x86_64.forced_dd3d.double = "libs/libdd3d.windows.template_release.x86_64.enabled.double.dll"
+linux.template_release.x86_64.forced_dd3d.double = "libs/libdd3d.linux.template_release.x86_64.enabled.double.so"
+
+web.template_release.wasm32.nothreads.forced_dd3d.double = "libs/libdd3d.web.template_release.wasm32.enabled.double.wasm"
+web.template_release.wasm32.forced_dd3d.double = "libs/libdd3d.web.template_release.wasm32.threads.enabled.double.wasm"
+
+ios.template_release.forced_dd3d.double = "libs/libdd3d.ios.template_release.universal.enabled.double.dylib"
diff --git a/source/addons/debug_draw_3d/debug_draw_3d.gdextension.uid b/source/addons/debug_draw_3d/debug_draw_3d.gdextension.uid
new file mode 100644
index 0000000..2e94782
--- /dev/null
+++ b/source/addons/debug_draw_3d/debug_draw_3d.gdextension.uid
@@ -0,0 +1 @@
+uid://c0q15xk1bg0rd
diff --git a/source/addons/debug_draw_3d/libs/.gdignore b/source/addons/debug_draw_3d/libs/.gdignore
new file mode 100644
index 0000000..e69de29
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.arm32.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.arm32.so
new file mode 100644
index 0000000..d33ad3d
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.arm32.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.arm64.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.arm64.so
new file mode 100644
index 0000000..5d36ab5
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.arm64.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.x86_32.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.x86_32.so
new file mode 100644
index 0000000..a8a165f
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.x86_32.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.x86_64.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.x86_64.so
new file mode 100644
index 0000000..e17de52
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_debug.x86_64.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.arm32.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.arm32.so
new file mode 100644
index 0000000..1422498
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.arm32.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.arm64.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.arm64.so
new file mode 100644
index 0000000..fe76320
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.arm64.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.x86_32.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.x86_32.so
new file mode 100644
index 0000000..f4870b9
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.x86_32.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.x86_64.so b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.x86_64.so
new file mode 100644
index 0000000..f71ef9d
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.android.template_release.x86_64.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.ios.template_debug.universal.dylib b/source/addons/debug_draw_3d/libs/libdd3d.ios.template_debug.universal.dylib
new file mode 100644
index 0000000..a009e34
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.ios.template_debug.universal.dylib differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.ios.template_release.universal.dylib b/source/addons/debug_draw_3d/libs/libdd3d.ios.template_release.universal.dylib
new file mode 100644
index 0000000..1011e20
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.ios.template_release.universal.dylib differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.ios.template_release.universal.enabled.dylib b/source/addons/debug_draw_3d/libs/libdd3d.ios.template_release.universal.enabled.dylib
new file mode 100644
index 0000000..6ed3700
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.ios.template_release.universal.enabled.dylib differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.linux.editor.x86_64.so b/source/addons/debug_draw_3d/libs/libdd3d.linux.editor.x86_64.so
new file mode 100644
index 0000000..f09ccad
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.linux.editor.x86_64.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.linux.template_release.x86_64.enabled.so b/source/addons/debug_draw_3d/libs/libdd3d.linux.template_release.x86_64.enabled.so
new file mode 100644
index 0000000..c044efa
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.linux.template_release.x86_64.enabled.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.linux.template_release.x86_64.so b/source/addons/debug_draw_3d/libs/libdd3d.linux.template_release.x86_64.so
new file mode 100644
index 0000000..4016c35
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.linux.template_release.x86_64.so differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.macos.editor.universal.framework/Resources/Info.plist b/source/addons/debug_draw_3d/libs/libdd3d.macos.editor.universal.framework/Resources/Info.plist
new file mode 100644
index 0000000..f478678
--- /dev/null
+++ b/source/addons/debug_draw_3d/libs/libdd3d.macos.editor.universal.framework/Resources/Info.plist
@@ -0,0 +1,33 @@
+
+
+
+
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ libdd3d.macos.editor.universal.dylib
+ CFBundleName
+ Debug Draw 3D
+ CFBundleDisplayName
+ Debug Draw 3D
+ CFBundleIdentifier
+ ru.dmitriysalnikov.dd3d
+ NSHumanReadableCopyright
+ Copyright (c) Dmitriy Salnikov.
+ CFBundleVersion
+ 1.4.5
+ CFBundleShortVersionString
+ 1.4.5
+ CFBundlePackageType
+ FMWK
+ CSResourcesFileMapped
+
+ DTPlatformName
+ macosx
+ LSMinimumSystemVersion
+ 10.14
+
+
+
\ No newline at end of file
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.macos.editor.universal.framework/libdd3d.macos.editor.universal.dylib b/source/addons/debug_draw_3d/libs/libdd3d.macos.editor.universal.framework/libdd3d.macos.editor.universal.dylib
new file mode 100644
index 0000000..8068462
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.macos.editor.universal.framework/libdd3d.macos.editor.universal.dylib differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.enabled.framework/Resources/Info.plist b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.enabled.framework/Resources/Info.plist
new file mode 100644
index 0000000..6728018
--- /dev/null
+++ b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.enabled.framework/Resources/Info.plist
@@ -0,0 +1,33 @@
+
+
+
+
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ libdd3d.macos.template_release.universal.enabled.dylib
+ CFBundleName
+ Debug Draw 3D
+ CFBundleDisplayName
+ Debug Draw 3D
+ CFBundleIdentifier
+ ru.dmitriysalnikov.dd3d
+ NSHumanReadableCopyright
+ Copyright (c) Dmitriy Salnikov.
+ CFBundleVersion
+ 1.4.5
+ CFBundleShortVersionString
+ 1.4.5
+ CFBundlePackageType
+ FMWK
+ CSResourcesFileMapped
+
+ DTPlatformName
+ macosx
+ LSMinimumSystemVersion
+ 10.14
+
+
+
\ No newline at end of file
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.enabled.framework/libdd3d.macos.template_release.universal.enabled.dylib b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.enabled.framework/libdd3d.macos.template_release.universal.enabled.dylib
new file mode 100644
index 0000000..83d75e5
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.enabled.framework/libdd3d.macos.template_release.universal.enabled.dylib differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.framework/Resources/Info.plist b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.framework/Resources/Info.plist
new file mode 100644
index 0000000..bd05cdd
--- /dev/null
+++ b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.framework/Resources/Info.plist
@@ -0,0 +1,33 @@
+
+
+
+
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ libdd3d.macos.template_release.universal.dylib
+ CFBundleName
+ Debug Draw 3D
+ CFBundleDisplayName
+ Debug Draw 3D
+ CFBundleIdentifier
+ ru.dmitriysalnikov.dd3d
+ NSHumanReadableCopyright
+ Copyright (c) Dmitriy Salnikov.
+ CFBundleVersion
+ 1.4.5
+ CFBundleShortVersionString
+ 1.4.5
+ CFBundlePackageType
+ FMWK
+ CSResourcesFileMapped
+
+ DTPlatformName
+ macosx
+ LSMinimumSystemVersion
+ 10.14
+
+
+
\ No newline at end of file
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.framework/libdd3d.macos.template_release.universal.dylib b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.framework/libdd3d.macos.template_release.universal.dylib
new file mode 100644
index 0000000..92aada2
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.macos.template_release.universal.framework/libdd3d.macos.template_release.universal.dylib differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.web.template_debug.wasm32.threads.wasm b/source/addons/debug_draw_3d/libs/libdd3d.web.template_debug.wasm32.threads.wasm
new file mode 100644
index 0000000..593d8d6
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.web.template_debug.wasm32.threads.wasm differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.web.template_debug.wasm32.wasm b/source/addons/debug_draw_3d/libs/libdd3d.web.template_debug.wasm32.wasm
new file mode 100644
index 0000000..2f7314e
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.web.template_debug.wasm32.wasm differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.enabled.wasm b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.enabled.wasm
new file mode 100644
index 0000000..1f4011e
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.enabled.wasm differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.threads.enabled.wasm b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.threads.enabled.wasm
new file mode 100644
index 0000000..66068a2
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.threads.enabled.wasm differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.threads.wasm b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.threads.wasm
new file mode 100644
index 0000000..575ca79
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.threads.wasm differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.wasm b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.wasm
new file mode 100644
index 0000000..dfbb1ce
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.web.template_release.wasm32.wasm differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.windows.editor.x86_64.dll b/source/addons/debug_draw_3d/libs/libdd3d.windows.editor.x86_64.dll
new file mode 100644
index 0000000..497a0a7
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.windows.editor.x86_64.dll differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.windows.template_release.x86_64.dll b/source/addons/debug_draw_3d/libs/libdd3d.windows.template_release.x86_64.dll
new file mode 100644
index 0000000..63b3bb1
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.windows.template_release.x86_64.dll differ
diff --git a/source/addons/debug_draw_3d/libs/libdd3d.windows.template_release.x86_64.enabled.dll b/source/addons/debug_draw_3d/libs/libdd3d.windows.template_release.x86_64.enabled.dll
new file mode 100644
index 0000000..c547b5a
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/libdd3d.windows.template_release.x86_64.enabled.dll differ
diff --git a/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll
new file mode 100644
index 0000000..497a0a7
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll differ
diff --git a/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF1a12d9b.TMP b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF1a12d9b.TMP
new file mode 100644
index 0000000..497a0a7
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF1a12d9b.TMP differ
diff --git a/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF27eab0.TMP b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF27eab0.TMP
new file mode 100644
index 0000000..497a0a7
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF27eab0.TMP differ
diff --git a/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF554e51.TMP b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF554e51.TMP
new file mode 100644
index 0000000..497a0a7
Binary files /dev/null and b/source/addons/debug_draw_3d/libs/~libdd3d.windows.editor.x86_64.dll~RF554e51.TMP differ
diff --git a/source/addons/logger/logger.gd b/source/addons/logger/logger.gd
new file mode 100644
index 0000000..00fbdd3
--- /dev/null
+++ b/source/addons/logger/logger.gd
@@ -0,0 +1,88 @@
+extends CanvasLayer
+
+enum ErrTypes { NORMAL, NORMAL_RICH, WARNING, ERROR }
+
+const DEFAULT_DURATION: float = 5.0
+
+@export_range(0, 1000, 1) var log_limit: int = 120
+
+var msg_list: PackedStringArray = []
+var msg_uid: PackedInt32Array = []
+
+@onready var log_label: RichTextLabel = $LogLabel
+
+
+func _ready() -> void:
+ if OS.has_feature("standalone"):
+ hide()
+
+
+func print_msg(text: String, duration: float = DEFAULT_DURATION, type: ErrTypes = ErrTypes.NORMAL, color := Color.AQUA) -> void:
+ if not OS.is_debug_build():
+ return
+
+ if msg_list.size() + 1 > log_limit:
+ if msg_list.is_empty(): # Don't do anything if the [param log_limit] is set to 0.
+ return
+ else: # Remove the first messages until we have a free slot.
+ msg_list.remove_at(0)
+ msg_uid.remove_at(0)
+ print_msg(text, duration, type, color)
+ return
+
+ var prefix: String = ""
+ match type:
+ ErrTypes.NORMAL_RICH:
+ print_rich(text)
+ ErrTypes.WARNING:
+ push_warning(text)
+ prefix = str("[color=orange][b]WARNING: [/b][/color]")
+ ErrTypes.ERROR:
+ push_error(text)
+ printerr(text)
+ prefix = str("[color=red][b]ERROR: [/b][/color]")
+
+ # print messages into the log first before stoppingQ.
+ if OS.has_feature("standalone"):
+ return
+
+ text = str("%s[color=%s]%s[/color]" %[prefix, color.to_html(), text])
+ msg_list.append(text)
+
+ var timer := Timer.new()
+ timer.one_shot = true
+
+ msg_uid.append(absi(timer.get_instance_id()))
+
+ timer.timeout.connect(func() -> void:
+ var uid: int = msg_uid.find(absi(timer.get_instance_id()))
+ if uid >= 0:
+ msg_list.remove_at(uid)
+ msg_uid.remove_at(uid)
+ _update_hud()
+ timer.queue_free()
+ )
+ add_child(timer)
+ timer.start(duration if duration >= 0.0 else DEFAULT_DURATION)
+
+ _update_hud()
+
+
+func clear_log() -> void:
+ msg_list.clear()
+ msg_uid.clear()
+ _update_hud()
+ # Remove the timers.
+ for i: Node in get_children():
+ if not i == log_label:
+ i.queue_free()
+
+
+func _update_hud() -> void:
+ if not self.is_node_ready():
+ await self.ready
+
+ var text: String = "\n".join(msg_list) if not msg_list.is_empty() else ""
+ log_label.set_text(text)
+ if msg_list.is_empty():
+ log_label.clear()
diff --git a/source/addons/logger/logger.gd.uid b/source/addons/logger/logger.gd.uid
new file mode 100644
index 0000000..5d26de4
--- /dev/null
+++ b/source/addons/logger/logger.gd.uid
@@ -0,0 +1 @@
+uid://b5b7ohheyhxr0
diff --git a/source/addons/logger/logger.tscn b/source/addons/logger/logger.tscn
new file mode 100644
index 0000000..4b57881
--- /dev/null
+++ b/source/addons/logger/logger.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=2 format=3 uid="uid://cpfunq8fyixco"]
+
+[ext_resource type="Script" uid="uid://b5b7ohheyhxr0" path="res://addons/logger/logger.gd" id="1_thwo5"]
+
+[node name="Logger" type="CanvasLayer"]
+process_mode = 3
+layer = 128
+follow_viewport_enabled = true
+script = ExtResource("1_thwo5")
+log_limit = 30
+
+[node name="LogLabel" type="RichTextLabel" parent="."]
+modulate = Color(1, 1, 1, 0.498039)
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+mouse_filter = 2
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/bold_italics_font_size = 12
+theme_override_font_sizes/italics_font_size = 12
+theme_override_font_sizes/mono_font_size = 12
+theme_override_font_sizes/normal_font_size = 12
+theme_override_font_sizes/bold_font_size = 12
+bbcode_enabled = true
+fit_content = true
+scroll_active = false
+drag_and_drop_selection_enabled = false
diff --git a/source/addons/logger/plugin.cfg b/source/addons/logger/plugin.cfg
new file mode 100644
index 0000000..b5551a6
--- /dev/null
+++ b/source/addons/logger/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="On-Screen Logger - Pixelation Games"
+description="A logger that automatically displays the information on the game screen for a set or given amount of time"
+author="SchimmelSpreu83"
+version="0.5.0"
+script="plugin.gd"
diff --git a/source/addons/logger/plugin.gd b/source/addons/logger/plugin.gd
new file mode 100644
index 0000000..3627a9b
--- /dev/null
+++ b/source/addons/logger/plugin.gd
@@ -0,0 +1,10 @@
+@tool
+extends EditorPlugin
+
+
+func _enable_plugin() -> void:
+ add_autoload_singleton("Logger", "res://addons/logger/logger.tscn")
+
+
+func _disable_plugin() -> void:
+ remove_autoload_singleton("Logger")
diff --git a/source/addons/logger/plugin.gd.uid b/source/addons/logger/plugin.gd.uid
new file mode 100644
index 0000000..04039fa
--- /dev/null
+++ b/source/addons/logger/plugin.gd.uid
@@ -0,0 +1 @@
+uid://p6f8m3u0e8du
diff --git a/source/addons/panku_console/COMMIT_SHA b/source/addons/panku_console/COMMIT_SHA
new file mode 100644
index 0000000..fa043cb
--- /dev/null
+++ b/source/addons/panku_console/COMMIT_SHA
@@ -0,0 +1 @@
+3f4fa8737ead98dec6e3c296fe1fac9bc9c397c1
\ No newline at end of file
diff --git a/source/addons/panku_console/LICENSE b/source/addons/panku_console/LICENSE
new file mode 100644
index 0000000..d66c0a7
--- /dev/null
+++ b/source/addons/panku_console/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2023 Feo (k2kra) Wu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/source/addons/panku_console/README.md b/source/addons/panku_console/README.md
new file mode 100644
index 0000000..b986276
--- /dev/null
+++ b/source/addons/panku_console/README.md
@@ -0,0 +1 @@
+This repository is a mirror that tracks the latest version of [PankuConsole](https://github.com/Ark2000/PankuConsole), so you can add it as a submodule in you addons folder.
diff --git a/source/addons/panku_console/common/buffered_rich_text.gd b/source/addons/panku_console/common/buffered_rich_text.gd
new file mode 100644
index 0000000..db67648
--- /dev/null
+++ b/source/addons/panku_console/common/buffered_rich_text.gd
@@ -0,0 +1,35 @@
+extends VBoxContainer
+
+# it is like, an infinite scroll game.
+
+# specifically, the first buffer will be cleared and sent to the last
+# when the last buffer is full.
+
+# with buffers, we can constanly output lots of fancy stuff while keeping a smooth experience.
+
+const BUFFER_MAX_PARAGRAPHS = 64
+const BUFFERS = 4
+
+var cur_label_idx:int = 0
+
+func add_text(text:String):
+ var cur_label:RichTextLabel = get_child(cur_label_idx)
+ cur_label.text += text
+ if cur_label.get_paragraph_count() > BUFFER_MAX_PARAGRAPHS:
+ cur_label_idx += 1
+ if cur_label_idx == BUFFERS:
+ cur_label_idx = BUFFERS - 1
+ var first_label:RichTextLabel = get_child(0)
+ first_label.text = ""
+ move_child(first_label, BUFFERS - 1)
+
+func _ready():
+ set("theme_override_constants/separation", 0)
+ for child in get_children():
+ child.queue_free()
+ for i in range(BUFFERS):
+ var new_buffer:RichTextLabel = RichTextLabel.new()
+ new_buffer.fit_content = true
+ new_buffer.bbcode_enabled = true
+ new_buffer.selection_enabled = true
+ add_child(new_buffer)
diff --git a/source/addons/panku_console/common/buffered_rich_text.gd.uid b/source/addons/panku_console/common/buffered_rich_text.gd.uid
new file mode 100644
index 0000000..fe2010d
--- /dev/null
+++ b/source/addons/panku_console/common/buffered_rich_text.gd.uid
@@ -0,0 +1 @@
+uid://dqbh0mtduoa3k
diff --git a/source/addons/panku_console/common/config.gd b/source/addons/panku_console/common/config.gd
new file mode 100644
index 0000000..2fe5480
--- /dev/null
+++ b/source/addons/panku_console/common/config.gd
@@ -0,0 +1,37 @@
+class_name PankuConfig
+
+const USER_CONFIG_FILE_PATH = "user://panku_config.cfg"
+
+# load config from file, always return a dictionary
+static func _get_config(file_path:String) -> Dictionary:
+ if FileAccess.file_exists(file_path):
+ var file = FileAccess.open(file_path, FileAccess.READ)
+ var content := file.get_as_text()
+ var config:Dictionary = str_to_var(content)
+ if config: return config
+ return {}
+
+# save user config to file
+static func set_config(config:Dictionary):
+ var file = FileAccess.open(USER_CONFIG_FILE_PATH, FileAccess.WRITE)
+ var content = var_to_str(config)
+ file.store_string(content)
+
+# get config, if user config exists, return user config, otherwise return default config configured by plugin user
+static func get_config() -> Dictionary:
+ var user_config:Dictionary = _get_config(USER_CONFIG_FILE_PATH)
+ if not user_config.is_empty():
+ return user_config
+ # if no user config, return default config, which is read-only
+ if PankuConsolePlugin.is_custom_default_config_exists():
+ return _get_config(PankuConsolePlugin.get_custom_default_config_path())
+
+ return _get_config(PankuConsolePlugin.INITIAL_DEFAULT_CONFIG_FILE_PATH)
+
+static func get_value(key:String, default:Variant) -> Variant:
+ return get_config().get(key, default)
+
+static func set_value(key:String, val:Variant) -> void:
+ var config = _get_config(USER_CONFIG_FILE_PATH)
+ config[key] = val
+ set_config(config)
diff --git a/source/addons/panku_console/common/config.gd.uid b/source/addons/panku_console/common/config.gd.uid
new file mode 100644
index 0000000..b6769dc
--- /dev/null
+++ b/source/addons/panku_console/common/config.gd.uid
@@ -0,0 +1 @@
+uid://bgc3h0yuqrdnt
diff --git a/source/addons/panku_console/common/gdexprenv.gd b/source/addons/panku_console/common/gdexprenv.gd
new file mode 100644
index 0000000..61d03cd
--- /dev/null
+++ b/source/addons/panku_console/common/gdexprenv.gd
@@ -0,0 +1,276 @@
+class_name PankuGDExprEnv
+
+const type_names = {
+ TYPE_NIL: "null",
+ TYPE_BOOL: "bool",
+ TYPE_INT: "int",
+ TYPE_FLOAT: "float",
+ TYPE_STRING: "String",
+ TYPE_VECTOR2: "Vector2",
+ TYPE_VECTOR2I: "Vector2i",
+ TYPE_RECT2: "Rect2",
+ TYPE_RECT2I: "Rect2i",
+ TYPE_VECTOR3: "Vector3",
+ TYPE_VECTOR3I: "Vector3i",
+ TYPE_TRANSFORM2D: "Transform2D",
+ TYPE_VECTOR4: "Vector4",
+ TYPE_VECTOR4I: "Vector4i",
+ TYPE_PLANE: "Plane",
+ TYPE_QUATERNION: "Quaternion",
+ TYPE_AABB: "AABB",
+ TYPE_BASIS: "Basis",
+ TYPE_TRANSFORM3D: "Transform3D",
+ TYPE_PROJECTION: "Projection",
+ TYPE_COLOR: "Color",
+ TYPE_STRING_NAME: "StringName",
+ TYPE_NODE_PATH: "NodePath",
+ TYPE_RID: "RID",
+ TYPE_OBJECT: "Object",
+ TYPE_CALLABLE: "Callable",
+ TYPE_SIGNAL: "Signal",
+ TYPE_DICTIONARY: "Dictionary",
+ TYPE_ARRAY: "Array",
+ TYPE_PACKED_BYTE_ARRAY: "PackedByteArray",
+ TYPE_PACKED_INT32_ARRAY: "PackedInt32Array",
+ TYPE_PACKED_INT64_ARRAY: "PackedInt64Array",
+ TYPE_PACKED_FLOAT32_ARRAY: "PackedFloat32Array",
+ TYPE_PACKED_FLOAT64_ARRAY: "PackedFloat64Array",
+ TYPE_PACKED_STRING_ARRAY: "PackedStringArray",
+ TYPE_PACKED_VECTOR2_ARRAY: "PackedVector2Array",
+ TYPE_PACKED_VECTOR3_ARRAY: "PackedVector3Array",
+ TYPE_PACKED_COLOR_ARRAY: "PackedColorArray",
+}
+
+var _envs = {}
+var _envs_info = {}
+var _expression = Expression.new()
+var _base_instance:Object
+
+func set_base_instance(base_instance:Object):
+ _base_instance = base_instance
+ #add info of base instance
+ var env_info = extract_info_from_script(_base_instance.get_script())
+ for k in env_info: _envs_info[k] = env_info[k]
+
+func get_base_instance():
+ return _base_instance
+
+## Register an environment that run expressions.
+## [br][code]env_name[/code]: the name of the environment
+## [br][code]env[/code]: The base instance that runs the expressions. For exmaple your player node.
+func register_env(env_name:String, env:Object):
+ _envs[env_name] = env
+# output("[color=green][Info][/color] [b]%s[/b] env loaded!"%env_name)
+ if env is Node:
+ env.tree_exiting.connect(
+ func(): remove_env(env_name)
+ )
+ if env.get_script():
+ var env_info = extract_info_from_script(env.get_script())
+ for k in env_info:
+ var keyword = "%s.%s" % [env_name, k]
+ _envs_info[keyword] = env_info[k]
+
+## Return the environment object or [code]null[/code] by its name.
+func get_env(env_name:String) -> Node:
+ return _envs.get(env_name)
+
+## Remove the environment named [code]env_name[/code]
+func remove_env(env_name:String):
+ if _envs.has(env_name):
+ _envs.erase(env_name)
+ for k in _envs_info.keys():
+ if k.begins_with(env_name + "."):
+ _envs_info.erase(k)
+
+#Execute an expression in a preset environment.
+func execute(exp:String) -> Dictionary:
+ return execute_exp(exp, _expression, _base_instance, _envs)
+
+# TODO: not used
+func get_available_export_objs() -> Array:
+ var result = []
+ for obj_name in _envs:
+ var obj = _envs[obj_name]
+ if !obj.get_script():
+ continue
+ var export_properties = get_export_properties_from_script(obj.get_script())
+ if export_properties.is_empty():
+ continue
+ result.push_back(obj_name)
+ return result
+
+func get_help_info(k:String) -> String:
+ return _envs_info[k]["help"]
+
+#TODO: refactor all those mess
+func parse_exp(exp:String, allow_empty:=false):
+ var result:Array
+ var empty_flag = allow_empty and exp.is_empty()
+
+ if empty_flag:
+ result = _envs_info.keys()
+ else:
+ result = search_and_sort_and_highlight(exp, _envs_info.keys())
+
+ var hints_bbcode = []
+ var hints_value = []
+
+ for r in result:
+ var keyword:String
+ var bbcode_main:String
+
+ if empty_flag:
+ keyword = r
+ bbcode_main = r
+ else:
+ keyword = r["keyword"]
+ bbcode_main = r["bbcode"]
+
+ var bbcode_postfix = _envs_info[keyword]["bbcode_postfix"]
+ var keyword_type = _envs_info[keyword]["type"]
+ hints_value.push_back(keyword)
+ hints_bbcode.push_back(bbcode_main + bbcode_postfix)
+ return {
+ "hints_bbcode": hints_bbcode,
+ "hints_value": hints_value
+ }
+
+static func search_and_sort_and_highlight(s:String, li:Array):
+ s = s.lstrip(" ").rstrip(" ")
+ var matched = []
+ if s == "": return matched
+ for k in li:
+ var start = k.find(s)
+ if start >= 0:
+ var similarity = 1.0 * s.length() / k.length()
+ matched.append({
+ "keyword": k,
+ "similarity": similarity,
+ "start": start,
+ "bbcode": ""
+ })
+
+ matched.sort_custom(
+ func(k1, k2):
+ if k1["start"] != k2["start"]:
+ return k1["start"] > k2["start"]
+ else:
+ return k1["similarity"] < k2["similarity"]
+ )
+
+ var line_format = "%s[color=green][b]%s[/b][/color]%s"
+
+ for m in matched:
+ var p = ["", "", ""]
+ if m["start"] < 0:
+ p[0] = m["keyword"]
+ else:
+ p[0] = m["keyword"].substr(0, m["start"])
+ p[1] = s
+ p[2] = m["keyword"].substr(m["start"] + s.length(), -1)
+
+ m["bbcode"] = line_format % p
+
+ return matched
+
+static func extract_info_from_script(script:Script):
+ var result = {}
+
+ var methods = []
+ var properties = []
+ var constants = []
+ var constants_bbcode_postfix = {}
+
+ for m in script.get_script_method_list():
+ if m["name"] != "" and m["name"].is_valid_identifier() and !m["name"].begins_with("_"):
+ var args = []
+ for a in m["args"]:
+ args.push_back("[color=cyan]%s[/color][color=gray]:[/color][color=orange]%s[/color]"%[a["name"], type_names[a["type"]]])
+ result[m["name"]] = {
+ "type": "method",
+ "bbcode_postfix": "(%s)"%("[color=gray], [/color]".join(PackedStringArray(args)))
+ }
+ for p in script.get_script_property_list():
+ if p["name"] != "" and !p["name"].begins_with("_") and p["name"].is_valid_identifier():
+ result[p["name"]] = {
+ "type": "property",
+ "bbcode_postfix":"[color=gray]:[/color][color=orange]%s[/color]"%type_names[p["type"]]
+ }
+
+ var constant_map = script.get_script_constant_map()
+ var help_info = {}
+ for c in constant_map:
+ if !c.begins_with("_"):
+ result[c] = {
+ "type": "constant",
+ "bbcode_postfix":"[color=gray]:[/color][color=orange]%s[/color]"%type_names[typeof(constant_map[c])]
+ }
+ elif c.begins_with("_HELP_") and c.length() > 6 and typeof(constant_map[c]) == TYPE_STRING:
+ var key = c.lstrip("_HELP_")
+ help_info[key] = constant_map[c]
+
+ for k in result:
+ if help_info.has(k):
+ result[k]["help"] = help_info[k]
+ else:
+ result[k]["help"] = "No help information provided."
+
+ #keyword -> {type, bbcode_postfix, help}
+ return result
+
+static func execute_exp(exp_str:String, expression:Expression, base_instance:Object, env:Dictionary):
+ var failed := false
+ var result = null
+
+ var error = expression.parse(exp_str, env.keys())
+ if error != OK:
+ failed = true
+ result = expression.get_error_text()
+ else:
+ result = expression.execute(env.values(), base_instance, true)
+ if expression.has_execute_failed():
+ failed = true
+ result = expression.get_error_text()
+
+ return {
+ "failed": failed,
+ "result": result
+ }
+
+static func get_export_properties_from_script(script:Script):
+ var result = []
+ var data = script.get_script_property_list()
+ for d in data:
+ if !(d.usage == PROPERTY_USAGE_SCRIPT_VARIABLE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE):
+ continue
+ result.append(d)
+ return result
+
+static func generate_help_text_from_script(script:Script):
+ var result = ["[color=cyan][b]User script defined identifiers[/b][/color]: "]
+ var env_info = extract_info_from_script(script)
+ var keys = env_info.keys()
+ keys.sort()
+ for k in keys:
+ result.push_back("%s - [i]%s[/i]"%[k + env_info[k]["bbcode_postfix"], env_info[k]["help"]])
+ return "\n".join(PackedStringArray(result))
+
+#returns a string containing all public script properties of an object
+#please BE AWARE when using this function on an object with custom getters.
+static func get_object_outline(obj:Object) -> String:
+ var result := PackedStringArray()
+ if obj == null: return "null"
+ var script = obj.get_script()
+ if script == null:
+ return "this object has no script attached."
+ var properties = script.get_script_property_list()
+ for p in properties:
+ if p.usage & PROPERTY_USAGE_SCRIPT_VARIABLE == 0:
+ continue
+ if p.name.begins_with("_"):
+ continue
+ result.append("%s: %s" % [p.name, str(obj.get(p.name))])
+ if result.is_empty():
+ return "this object has no public script variables."
+ return "\n".join(result)
diff --git a/source/addons/panku_console/common/gdexprenv.gd.uid b/source/addons/panku_console/common/gdexprenv.gd.uid
new file mode 100644
index 0000000..36af267
--- /dev/null
+++ b/source/addons/panku_console/common/gdexprenv.gd.uid
@@ -0,0 +1 @@
+uid://cv7potpg6dris
diff --git a/source/addons/panku_console/common/lynx_window2/border.gd b/source/addons/panku_console/common/lynx_window2/border.gd
new file mode 100644
index 0000000..53b25d6
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/border.gd
@@ -0,0 +1,9 @@
+extends Panel
+
+func hey_i_am_here():
+ modulate.a = 0.0
+ var t = create_tween()
+ t.set_speed_scale(1.0 / Engine.time_scale)
+ for i in range(2):
+ t.tween_property(self, "modulate:a", 0.3, 0.1)
+ t.tween_property(self, "modulate:a", 0.0, 0.1)
diff --git a/source/addons/panku_console/common/lynx_window2/border.gd.uid b/source/addons/panku_console/common/lynx_window2/border.gd.uid
new file mode 100644
index 0000000..8cdd2a0
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/border.gd.uid
@@ -0,0 +1 @@
+uid://djg7feld7wktp
diff --git a/source/addons/panku_console/common/lynx_window2/lynx_window_2.gd b/source/addons/panku_console/common/lynx_window2/lynx_window_2.gd
new file mode 100644
index 0000000..85d711d
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/lynx_window_2.gd
@@ -0,0 +1,300 @@
+class_name PankuLynxWindow extends ColorRect
+
+#Do not connect the button node directly, use these signals to detect click event.
+signal title_btn_clicked
+signal window_closed
+
+const lynx_window_shader_material:ShaderMaterial = preload("./lynx_window_shader_material.tres")
+
+@export var _window_title_container:HBoxContainer
+@export var _title_btn:PankuButton
+@export var _close_btn:PankuButton
+@export var _options_btn:PankuButton
+@export var _resize_btn:Button
+@export var _shadow_focus:Panel
+@export var _shadow:NinePatchRect
+@export var _container:Panel
+@export var _pop_btn:PankuButton
+
+@export var no_resize := false
+@export var no_resize_x := false
+@export var no_resize_y := false
+@export var no_move := false
+@export var no_snap := false
+
+@export var no_title := false:
+ set(v):
+ no_title = v
+ _window_title_container.visible = !v
+
+@export var queue_free_on_close := true
+@export var flicker := true
+
+var transform_interp_speed := 40.0
+var bounds_interp_speed := 50.0
+var anim_interp_speed := 10.0
+
+var _is_dragging := false
+var _drag_start_position:Vector2
+var _drag_start_position_global:Vector2
+var _is_resizing := false
+var _resize_start_position:Vector2
+var _os_window:Window
+var _content:Control
+var _size_before_folded:Vector2
+var _folded:bool = false
+var _size_animation:bool = false
+var _target_size:Vector2
+
+func add_options_button(callback:Callable):
+ _options_btn.show()
+ _options_btn.pressed.connect(callback)
+
+func get_layout_position(layout:Control.LayoutPreset) -> Vector2:
+ var window_rect = get_rect()
+ var screen_rect = get_viewport_rect()
+ var new_position = Vector2.ZERO
+ var end_position = screen_rect.size - window_rect.size
+ var center_position = end_position / 2
+ if layout == PRESET_TOP_LEFT:
+ pass
+ elif layout == PRESET_CENTER_TOP:
+ new_position.x = center_position.x
+ elif layout == PRESET_TOP_RIGHT:
+ new_position.x = end_position.x
+ elif layout == PRESET_CENTER_LEFT:
+ new_position.y = center_position.y
+ elif layout == PRESET_CENTER:
+ new_position = center_position
+ elif layout == PRESET_CENTER_RIGHT:
+ new_position.x = end_position.x
+ new_position.y = center_position.y
+ elif layout == PRESET_BOTTOM_LEFT:
+ new_position.y = end_position.y
+ elif layout == PRESET_CENTER_BOTTOM:
+ new_position.x = center_position.x
+ new_position.y = end_position.y
+ elif layout == PRESET_BOTTOM_RIGHT:
+ new_position = end_position
+ return new_position
+
+func get_content():
+ return _content
+
+func set_content(node:Control):
+ _content = node
+ if _os_window and _os_window.visible:
+ if _os_window.get_child_count() > 0:
+ push_error("Error: error in set_content")
+ return
+ _os_window.add_child(node)
+ return
+ if _container.get_child_count() > 0:
+ push_error("Error: error in set_content.")
+ return
+ _container.add_child(node)
+
+func highlight(v:bool):
+ _shadow_focus.visible = v
+
+func _init_os_window():
+ _os_window = Window.new()
+ var color_rect = ColorRect.new()
+ color_rect.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
+ _os_window.add_child(color_rect)
+ get_tree().root.add_child(_os_window)
+ #destructor
+ tree_exiting.connect(
+ func():
+ _os_window.queue_free()
+ )
+ #switch back to embed window when os window close requested
+ _os_window.close_requested.connect(
+ func():
+ _os_window.remove_child(_content)
+ _os_window.hide()
+ set_content(_content)
+ show()
+ )
+ if get_parent().has_method("get_os_window_bg_color"):
+ color_rect.color = get_parent().get_os_window_bg_color()
+
+func switch_to_os_window():
+ if _content == null:
+ push_error("Error: No content. ")
+ return
+ if _os_window == null:
+ _init_os_window()
+ _container.remove_child(_content)
+ _os_window.add_child(_content)
+ _os_window.size = size
+ _os_window.title = _title_btn.text
+ _os_window.position = Vector2(DisplayServer.window_get_position(0)) + position
+ _content.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
+ _os_window.show()
+ hide()
+
+func show_window():
+ if _os_window and _os_window.visible:
+ return
+ show()
+ move_to_front()
+ modulate.a = 0.0
+ create_tween().tween_property(self, "modulate:a", 1.0, 0.2)
+
+func hide_window():
+ if _os_window and _os_window.visible:
+ _os_window.close_requested.emit()
+ hide()
+
+func toggle_window_visibility():
+ if _os_window.visible or visible:
+ hide_window()
+ else:
+ show_window()
+
+func set_window_visibility(b:bool):
+ if b: show_window()
+ else: hide_window()
+
+func get_window_visibility() -> bool:
+ return visible or _os_window.visible
+
+func set_window_title_text(text:String):
+ if _os_window and _os_window.visible:
+ _os_window.title = text
+ else:
+ _title_btn.text = " " + text
+
+func get_normal_window_size():
+ if _folded: return _size_before_folded
+ return size
+
+func get_title_bar_height():
+ return _window_title_container.size.y
+
+func _ready():
+ custom_minimum_size = _window_title_container.get_minimum_size()
+
+ _options_btn.visible = false
+
+ _title_btn.button_down.connect(
+ func():
+ _is_dragging = true
+ _drag_start_position = get_local_mouse_position()
+ _drag_start_position_global = get_global_mouse_position()
+ )
+ _title_btn.button_up.connect(
+ func():
+ _is_dragging = false
+ )
+ _resize_btn.button_down.connect(
+ func():
+ _is_resizing = true
+ _resize_start_position = _resize_btn.get_local_mouse_position()
+ )
+ _resize_btn.button_up.connect(
+ func():
+ _is_resizing = false
+ )
+ _close_btn.pressed.connect(
+ func():
+ window_closed.emit()
+ if queue_free_on_close:
+ queue_free()
+ else:
+ hide()
+ )
+
+ _title_btn.button.gui_input.connect(
+ func(e):
+ if e is InputEventMouseButton and !e.pressed:
+ if e.button_index != MOUSE_BUTTON_NONE:
+ if (get_global_mouse_position() - _drag_start_position_global).length_squared() < 4:
+ title_btn_clicked.emit()
+ )
+ visibility_changed.connect(
+ func():
+ if is_visible_in_tree() and flicker:
+ $Border.hey_i_am_here()
+ )
+
+ if flicker:
+ $Border.hey_i_am_here()
+
+ _pop_btn.pressed.connect(switch_to_os_window)
+
+ if _container.get_child_count() > 0:
+ _content = _container.get_child(0)
+
+ if get_parent().has_method("get_enable_os_popup_btns"):
+ _pop_btn.visible = get_parent().get_enable_os_popup_btns()
+
+ # feature: foldable window
+ title_btn_clicked.connect(
+ func():
+ if _folded:
+ _target_size = _size_before_folded
+ else:
+ if !_size_animation:
+ _size_before_folded = size
+ _target_size = _window_title_container.size
+ _size_animation = true
+ _folded = !_folded
+ _resize_btn.visible = !_folded
+ )
+
+func _input(e):
+ #release focus when you click outside of the window
+ if is_visible:
+ if e is InputEventMouseButton and e.pressed:
+ if !get_global_rect().has_point(get_global_mouse_position()):
+ var f = get_viewport().gui_get_focus_owner()
+ if f and is_ancestor_of(f):
+ f.release_focus()
+ if e is InputEventKey and e.keycode == KEY_ESCAPE and e.pressed and get_global_rect().has_point(get_global_mouse_position()):
+ window_closed.emit()
+ if queue_free_on_close:
+ queue_free()
+ else:
+ hide()
+
+func _process(delta: float) -> void:
+ if !no_move and _is_dragging:
+ var tp := position + get_local_mouse_position() - _drag_start_position
+ position = interp(position, tp, transform_interp_speed, delta)
+ elif !no_resize and _is_resizing:
+ var ts := size + _resize_btn.get_local_mouse_position() - _resize_start_position
+ ts.x = min(ts.x, get_viewport_rect().size.x)
+ ts.y = min(ts.y, get_viewport_rect().size.y)
+ if !no_resize_x:
+ size.x = interp(size.x, ts.x, transform_interp_speed, delta)
+ if !no_resize_y:
+ size.y = interp(size.y, ts.y, transform_interp_speed, delta)
+ elif !no_snap:
+ var window_rect := get_rect()
+ var screen_rect := get_viewport_rect()
+ var target_position := window_rect.position
+ var target_size := window_rect.size.clamp(Vector2.ZERO, screen_rect.size)
+ if window_rect.position.y < 0:
+ target_position.y = 0
+ if window_rect.end.y > screen_rect.end.y:
+ target_position.y = screen_rect.end.y - window_rect.size.y
+ if window_rect.end.y > screen_rect.end.y + window_rect.size.y / 2:
+ target_position.y = screen_rect.end.y - get_title_bar_height()
+ if window_rect.position.x < 0:
+ target_position.x = 0
+ if window_rect.end.x > screen_rect.end.x:
+ target_position.x = screen_rect.end.x - window_rect.size.x
+ var current_position = window_rect.position
+ current_position = interp(current_position, target_position, bounds_interp_speed, delta)
+ size = interp(size, target_size, bounds_interp_speed, delta)
+ position = current_position
+ if _size_animation:
+ if _target_size.is_equal_approx(size):
+ _size_animation = false
+ size = interp(size, _target_size, anim_interp_speed, delta)
+
+# Framerate-independent interpolation.
+func interp(from, to, lambda: float, delta: float):
+ return lerp(from, to, 1.0 - exp(-lambda * delta))
diff --git a/source/addons/panku_console/common/lynx_window2/lynx_window_2.gd.uid b/source/addons/panku_console/common/lynx_window2/lynx_window_2.gd.uid
new file mode 100644
index 0000000..eb18506
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/lynx_window_2.gd.uid
@@ -0,0 +1 @@
+uid://ctfiphl1luka1
diff --git a/source/addons/panku_console/common/lynx_window2/lynx_window_2.tscn b/source/addons/panku_console/common/lynx_window2/lynx_window_2.tscn
new file mode 100644
index 0000000..9f5fa99
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/lynx_window_2.tscn
@@ -0,0 +1,196 @@
+[gd_scene load_steps=19 format=3 uid="uid://s88loppa6gja"]
+
+[ext_resource type="Material" uid="uid://dyipeqsa8lcpc" path="res://addons/panku_console/common/lynx_window2/lynx_window_shader_material.tres" id="1_tvp6i"]
+[ext_resource type="Script" path="res://addons/panku_console/common/lynx_window2/lynx_window_2.gd" id="2_1ul5o"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="2_3fhqk"]
+[ext_resource type="Texture2D" uid="uid://dosm26riekruh" path="res://addons/panku_console/res/icons2/menu.svg" id="4_4dlyn"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="4_dnesi"]
+[ext_resource type="Texture2D" uid="uid://gav3m4qtvgje" path="res://addons/panku_console/res/icons2/pop-out-svgrepo-com.svg" id="4_im81u"]
+[ext_resource type="Texture2D" uid="uid://8g5afcuanbl6" path="res://addons/panku_console/res/icons2/close.svg" id="5_l4qpm"]
+[ext_resource type="Texture2D" uid="uid://dvr12fl5prm78" path="res://addons/panku_console/res/effect/square_shadow.png" id="6_mfp1h"]
+[ext_resource type="Texture2D" uid="uid://ciu5jiw4xmkq0" path="res://addons/panku_console/res/icons2/resize-svgrepo-com.svg" id="7_duwqn"]
+[ext_resource type="Script" path="res://addons/panku_console/common/lynx_window2/border.gd" id="8_gj3ji"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hv45g"]
+draw_center = false
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(1, 1, 1, 0.25098)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6i67d"]
+content_margin_left = 8.0
+content_margin_top = 8.0
+content_margin_right = 8.0
+content_margin_bottom = 8.0
+draw_center = false
+border_width_left = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(1, 1, 1, 0.25098)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lct0k"]
+draw_center = false
+shadow_color = Color(0, 0, 0, 0.0627451)
+shadow_size = 16
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5muk4"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_r0x7y"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_p7tml"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_p3y6j"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_uldta"]
+draw_center = false
+border_width_left = 4
+border_width_top = 4
+border_width_right = 4
+border_width_bottom = 4
+border_color = Color(1, 1, 1, 1)
+
+[node name="LynxWindow2" type="ColorRect" node_paths=PackedStringArray("_window_title_container", "_title_btn", "_close_btn", "_options_btn", "_resize_btn", "_shadow_focus", "_shadow", "_container", "_pop_btn")]
+material = ExtResource("1_tvp6i")
+clip_contents = true
+offset_right = 413.0
+offset_bottom = 305.0
+theme = ExtResource("2_3fhqk")
+script = ExtResource("2_1ul5o")
+_window_title_container = NodePath("VBoxContainer/Up")
+_title_btn = NodePath("VBoxContainer/Up/TitleButton")
+_close_btn = NodePath("VBoxContainer/Up/CloseButton")
+_options_btn = NodePath("VBoxContainer/Up/MenuButton")
+_resize_btn = NodePath("Button")
+_shadow_focus = NodePath("Shadow2")
+_shadow = NodePath("Shadow")
+_container = NodePath("VBoxContainer/Down")
+_pop_btn = NodePath("VBoxContainer/Up/PopupButton")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = 0
+
+[node name="Up" type="HBoxContainer" parent="VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="TitleButton" parent="VBoxContainer/Up" instance=ExtResource("4_dnesi")]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_hv45g")
+
+[node name="TextureRect" parent="VBoxContainer/Up/TitleButton/HBoxContainer" index="0"]
+texture = null
+
+[node name="Label" parent="VBoxContainer/Up/TitleButton/HBoxContainer" index="1"]
+text = "Window Title"
+
+[node name="PopupButton" parent="VBoxContainer/Up" instance=ExtResource("4_dnesi")]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_hv45g")
+
+[node name="TextureRect" parent="VBoxContainer/Up/PopupButton/HBoxContainer" index="0"]
+texture = ExtResource("4_im81u")
+
+[node name="Label" parent="VBoxContainer/Up/PopupButton/HBoxContainer" index="1"]
+visible = false
+
+[node name="MenuButton" parent="VBoxContainer/Up" instance=ExtResource("4_dnesi")]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_hv45g")
+
+[node name="TextureRect" parent="VBoxContainer/Up/MenuButton/HBoxContainer" index="0"]
+texture = ExtResource("4_4dlyn")
+
+[node name="Label" parent="VBoxContainer/Up/MenuButton/HBoxContainer" index="1"]
+visible = false
+
+[node name="CloseButton" parent="VBoxContainer/Up" instance=ExtResource("4_dnesi")]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_hv45g")
+
+[node name="TextureRect" parent="VBoxContainer/Up/CloseButton/HBoxContainer" index="0"]
+texture = ExtResource("5_l4qpm")
+
+[node name="Label" parent="VBoxContainer/Up/CloseButton/HBoxContainer" index="1"]
+visible = false
+
+[node name="Down" type="Panel" parent="VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_6i67d")
+
+[node name="Shadow" type="NinePatchRect" parent="."]
+self_modulate = Color(1, 1, 1, 0.501961)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -64.0
+offset_top = -79.0
+offset_right = 63.0
+offset_bottom = 47.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("6_mfp1h")
+draw_center = false
+region_rect = Rect2(0, 0, 512, 512)
+patch_margin_left = 64
+patch_margin_top = 80
+patch_margin_right = 64
+patch_margin_bottom = 48
+
+[node name="Shadow2" type="Panel" parent="."]
+visible = false
+layout_mode = 2
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_lct0k")
+
+[node name="Button" type="Button" parent="."]
+self_modulate = Color(1, 1, 1, 0.501961)
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -12.0
+offset_top = -12.0
+grow_horizontal = 0
+grow_vertical = 0
+mouse_default_cursor_shape = 12
+theme_override_styles/normal = SubResource("StyleBoxEmpty_5muk4")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_r0x7y")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_p7tml")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_p3y6j")
+icon = ExtResource("7_duwqn")
+flat = true
+expand_icon = true
+
+[node name="Border" type="Panel" parent="."]
+modulate = Color(1, 1, 1, 0)
+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_styles/panel = SubResource("StyleBoxFlat_uldta")
+script = ExtResource("8_gj3ji")
+
+[editable path="VBoxContainer/Up/TitleButton"]
+[editable path="VBoxContainer/Up/PopupButton"]
+[editable path="VBoxContainer/Up/MenuButton"]
+[editable path="VBoxContainer/Up/CloseButton"]
diff --git a/source/addons/panku_console/common/lynx_window2/lynx_window_shader_material.tres b/source/addons/panku_console/common/lynx_window2/lynx_window_shader_material.tres
new file mode 100644
index 0000000..1ed1018
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/lynx_window_shader_material.tres
@@ -0,0 +1,8 @@
+[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://dyipeqsa8lcpc"]
+
+[ext_resource type="Shader" path="res://addons/panku_console/res/shader/simple_fast_blur.gdshader" id="1_3h55m"]
+
+[resource]
+shader = ExtResource("1_3h55m")
+shader_parameter/lod = 4.0
+shader_parameter/modulate = Color(0, 0, 0, 0.12549)
diff --git a/source/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd b/source/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd
new file mode 100644
index 0000000..3298c43
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd
@@ -0,0 +1,80 @@
+#A simple control node managing its child windows
+class_name PankuLynxWindowsManager extends Control
+
+const CFG_ENABLE_OS_WINDOW = "enable_os_window"
+const CFG_OS_WINDOW_BGCOLOR = "os_window_bg_color"
+
+@onready var console:PankuConsole = get_node(PankuConsole.SingletonPath)
+
+var os_popup_btn_enabled:bool
+var os_window_bg_color:Color
+
+func _ready():
+ load_data()
+
+func _input(e):
+ if e is InputEventMouseButton and e.pressed:
+ var flag = true
+ #traverse child windows in reverse order, use double shadow to highlight current active window.
+ for i in range(get_child_count() - 1, -1, -1):
+ var w:Control = get_child(i)
+ if w.visible and w.get_global_rect().has_point(get_global_mouse_position()):
+ var forefront = get_child(get_child_count() - 1)
+ if forefront.has_method("highlight"): forefront.highlight(false)
+ w.move_to_front()
+ forefront = get_child(get_child_count() - 1)
+ if forefront.has_method("highlight"): forefront.highlight(true)
+ flag = false
+ break
+ if flag and get_child_count() > 0:
+ var forefront = get_child(get_child_count() - 1)
+ if forefront.has_method("highlight"): forefront.highlight(false)
+
+func create_window(content:Control) -> PankuLynxWindow:
+ var new_window:PankuLynxWindow = preload("lynx_window_2.tscn").instantiate()
+ content.anchors_preset = Control.PRESET_FULL_RECT
+ new_window.set_content(content)
+ add_child(new_window)
+ new_window.show_window()
+ return new_window
+
+func enable_os_popup_btns(b:bool):
+ #note that this may affect your project
+ get_viewport().gui_embed_subwindows = !b
+ os_popup_btn_enabled = b
+ for w in get_children():
+ #maybe there's a better way to get node type
+ if !w.has_method("switch_to_os_window"):
+ continue
+ w._pop_btn.visible = b
+
+func get_enable_os_popup_btns() -> bool:
+ return os_popup_btn_enabled
+
+func set_os_window_bg_color(c:Color):
+ os_window_bg_color = c
+ for w in get_children():
+ #maybe there's a better way to get node type
+ if !w.has_method("switch_to_os_window"):
+ continue
+ if w._os_window != null:
+ w._os_window.get_child(0).color = c
+
+func get_os_window_bg_color() -> Color:
+ return os_window_bg_color
+
+func save_data():
+ var cfg = PankuConfig.get_config()
+ cfg[CFG_ENABLE_OS_WINDOW] = os_popup_btn_enabled
+ cfg[CFG_OS_WINDOW_BGCOLOR] = os_window_bg_color
+ PankuConfig.set_config(cfg)
+
+func load_data():
+ var cfg = PankuConfig.get_config()
+ enable_os_popup_btns(cfg.get(CFG_ENABLE_OS_WINDOW, false))
+ set_os_window_bg_color(cfg.get(CFG_OS_WINDOW_BGCOLOR, Color("#2b2e32")))
+
+func _notification(what):
+ #quit event
+ if what == NOTIFICATION_WM_CLOSE_REQUEST:
+ save_data()
diff --git a/source/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd.uid b/source/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd.uid
new file mode 100644
index 0000000..f635451
--- /dev/null
+++ b/source/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd.uid
@@ -0,0 +1 @@
+uid://ciferd4gytj41
diff --git a/source/addons/panku_console/common/module_manager.gd b/source/addons/panku_console/common/module_manager.gd
new file mode 100644
index 0000000..fbfe42e
--- /dev/null
+++ b/source/addons/panku_console/common/module_manager.gd
@@ -0,0 +1,54 @@
+class_name PankuModuleManager
+
+var _modules:Array[PankuModule]
+var _modules_table:Dictionary
+var _core:PankuConsole
+
+func init_manager(_core:PankuConsole, _modules:Array[PankuModule]):
+ self._modules = _modules
+ self._core = _core
+ load_modules()
+
+func load_modules():
+
+ # The extra tree structure is purely used for avoiding using RefCounted which may cause uncessary leaked instance warnings.
+ var manager_node:Node = Node.new()
+ manager_node.name = "_Modules_"
+ _core.add_child(manager_node)
+
+ for _m in _modules:
+ var module:PankuModule = _m
+ _modules_table[module.get_module_name()] = module
+
+ module.name = module.get_module_name()
+ manager_node.add_child(module)
+
+ for _m in _modules:
+ var module:PankuModule = _m
+ module.core = _core
+ module._init_module()
+ #print("[info] %s module loaded!" % module.get_module_name())
+
+func update_modules(delta:float):
+ for _m in _modules:
+ var module:PankuModule = _m
+ module.update_module(delta)
+
+func get_module(module_name:String):
+ return _modules_table[module_name]
+
+func has_module(module_name:String):
+ return _modules_table.has(module_name)
+
+func get_module_option_objects():
+ var objects = []
+ for _m in _modules:
+ var module:PankuModule = _m
+ if module._opt != null:
+ objects.append(module._opt)
+ return objects
+
+func quit_modules():
+ for _m in _modules:
+ var module:PankuModule = _m
+ module.quit_module()
diff --git a/source/addons/panku_console/common/module_manager.gd.uid b/source/addons/panku_console/common/module_manager.gd.uid
new file mode 100644
index 0000000..cca2b6d
--- /dev/null
+++ b/source/addons/panku_console/common/module_manager.gd.uid
@@ -0,0 +1 @@
+uid://ciurr4mc7r71x
diff --git a/source/addons/panku_console/common/module_options.gd b/source/addons/panku_console/common/module_options.gd
new file mode 100644
index 0000000..1910cfd
--- /dev/null
+++ b/source/addons/panku_console/common/module_options.gd
@@ -0,0 +1,11 @@
+class_name ModuleOptions extends Resource
+
+var _module:PankuModule
+
+var _loaded := false
+
+#FIXME: Tricky part of saving data, needs to be reworked
+func update_setting(key: String, value: Variant):
+ self.set(key, value)
+ if _loaded and _module:
+ _module.save_module_data(key, value)
diff --git a/source/addons/panku_console/common/module_options.gd.uid b/source/addons/panku_console/common/module_options.gd.uid
new file mode 100644
index 0000000..62f262b
--- /dev/null
+++ b/source/addons/panku_console/common/module_options.gd.uid
@@ -0,0 +1 @@
+uid://c43wmdfwptw3v
diff --git a/source/addons/panku_console/common/panku_button.gd b/source/addons/panku_console/common/panku_button.gd
new file mode 100644
index 0000000..7414df6
--- /dev/null
+++ b/source/addons/panku_console/common/panku_button.gd
@@ -0,0 +1,39 @@
+class_name PankuButton extends Control
+
+signal pressed
+signal button_down
+signal button_up
+
+@export
+var button:Button
+
+@export
+var trect:TextureRect
+
+@export
+var label:Label
+
+var icon:
+ set(v):
+ trect.texture = v
+ get:
+ return trect.texture
+
+var text:
+ set(v):
+ label.text = v
+ get:
+ return label.text
+
+func _ready():
+
+ button.pressed.connect(
+ func():
+ pressed.emit()
+ )
+ button.button_down.connect(
+ func(): button_down.emit()
+ )
+ button.button_up.connect(
+ func(): button_up.emit()
+ )
diff --git a/source/addons/panku_console/common/panku_button.gd.uid b/source/addons/panku_console/common/panku_button.gd.uid
new file mode 100644
index 0000000..d6c50c8
--- /dev/null
+++ b/source/addons/panku_console/common/panku_button.gd.uid
@@ -0,0 +1 @@
+uid://0ydmyeffilu7
diff --git a/source/addons/panku_console/common/panku_button.tscn b/source/addons/panku_console/common/panku_button.tscn
new file mode 100644
index 0000000..e404fdc
--- /dev/null
+++ b/source/addons/panku_console/common/panku_button.tscn
@@ -0,0 +1,42 @@
+[gd_scene load_steps=5 format=3 uid="uid://drn5t13m088fb"]
+
+[ext_resource type="Script" path="res://addons/panku_console/common/panku_button.gd" id="1_7kf5f"]
+[ext_resource type="Texture2D" uid="uid://dchvk7qgfe37m" path="res://addons/panku_console/res/icons2/fold-svgrepo-com.svg" id="2_su653"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_v3kpx"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cwnaw"]
+content_margin_top = 4.0
+content_margin_bottom = 4.0
+
+[node name="PankuButton" type="PanelContainer" node_paths=PackedStringArray("button", "trect", "label")]
+editor_description = "Godot's Button can't handle scaling icons properly as descripted in https://github.com/godotengine/godot-proposals/issues/660, so I have to make a new one."
+self_modulate = Color(1, 1, 1, 0)
+offset_right = 112.0
+offset_bottom = 31.0
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_v3kpx")
+script = ExtResource("1_7kf5f")
+button = NodePath("Button")
+trect = NodePath("HBoxContainer/TextureRect")
+label = NodePath("HBoxContainer/Label")
+
+[node name="Button" type="Button" parent="."]
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 0
+
+[node name="TextureRect" type="TextureRect" parent="HBoxContainer"]
+layout_mode = 2
+mouse_filter = 2
+texture = ExtResource("2_su653")
+expand_mode = 2
+
+[node name="Label" type="Label" parent="HBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 1
+theme_override_styles/normal = SubResource("StyleBoxEmpty_cwnaw")
+vertical_alignment = 1
diff --git a/source/addons/panku_console/common/panku_module.gd b/source/addons/panku_console/common/panku_module.gd
new file mode 100644
index 0000000..4ef3188
--- /dev/null
+++ b/source/addons/panku_console/common/panku_module.gd
@@ -0,0 +1,101 @@
+class_name PankuModule extends Node
+# extends Node: A hacky way to avoid cyclic RefCounted verbose warnings which is uncessary to worry about.
+
+var core:PankuConsole
+
+var _env:RefCounted = null
+var _opt:ModuleOptions = null
+
+# dir name of the module
+func get_module_name() -> String:
+ return get_script().resource_path.get_base_dir().get_file()
+
+# called when the module is loaded
+func init_module():
+ pass
+
+# called when the module is unloaded (quit program)
+func quit_module():
+ if _opt:
+ _opt._loaded = false
+
+# called at the start of each physics frame
+func update_module(delta:float):
+ pass
+
+func save_module_data(key:String, value:Variant):
+ var cfg:Dictionary = PankuConfig.get_config()
+ var module_name:String = get_module_name()
+ if !cfg.has(module_name):
+ cfg[module_name] = {}
+ cfg[module_name][key] = value
+ PankuConfig.set_config(cfg)
+
+func load_module_data(key:String, default_value:Variant = null) -> Variant:
+ var cfg:Dictionary = PankuConfig.get_config()
+ var module_name:String = get_module_name()
+ var module_data = cfg.get(module_name, {})
+ return module_data.get(key, default_value)
+
+func has_module_data(key:String) -> bool:
+ var cfg:Dictionary = PankuConfig.get_config()
+ var module_name:String = get_module_name()
+ var module_data = cfg.get(module_name, {})
+ return module_data.has(key)
+
+func load_window_data(window:PankuLynxWindow):
+ window.position = load_module_data("window_position", window.get_layout_position([
+ Control.PRESET_TOP_LEFT,
+ Control.PRESET_CENTER_TOP,
+ Control.PRESET_TOP_RIGHT,
+ Control.PRESET_CENTER_LEFT,
+ Control.PRESET_CENTER,
+ Control.PRESET_CENTER_RIGHT,
+ Control.PRESET_BOTTOM_LEFT,
+ Control.PRESET_CENTER_BOTTOM,
+ Control.PRESET_BOTTOM_RIGHT,
+ ][randi()%9]))
+ window.size = load_module_data("window_size", window.get_normal_window_size())
+ window.set_window_visibility(load_module_data("window_visibility", false))
+
+func save_window_data(window:PankuLynxWindow):
+ _save_window_geometry(window)
+ save_module_data("window_visibility", window.visible)
+
+
+func _save_window_geometry(window:PankuLynxWindow):
+ save_module_data("window_position", window.position)
+ save_module_data("window_size", window.get_normal_window_size())
+
+
+# Add hook to window to auto save its geometry on close.
+func add_auto_save_hook(window: PankuLynxWindow) -> void:
+ # Here some global settings check can be implemented,
+ # if we decide to make "save on close" feature optional
+ window.window_closed.connect(_save_window_geometry.bind(window))
+
+
+func get_module_env() -> RefCounted:
+ return _env
+
+func get_module_opt() -> ModuleOptions:
+ return _opt
+
+func _init_module():
+ var module_script_dir:String = get_script().resource_path.get_base_dir()
+ var env_script_path = module_script_dir + "/env.gd"
+ var opt_script_path = module_script_dir + "/opt.gd"
+
+ if FileAccess.file_exists(env_script_path):
+ _env = load(env_script_path).new()
+ _env._module = self
+ core.gd_exprenv.register_env(get_module_name(), _env)
+
+ if FileAccess.file_exists(opt_script_path):
+ #print(opt_script_path)
+ _opt = load(opt_script_path).new() as ModuleOptions
+ _opt._module = self
+
+ init_module()
+ if _opt:
+ _opt._loaded = true
diff --git a/source/addons/panku_console/common/panku_module.gd.uid b/source/addons/panku_console/common/panku_module.gd.uid
new file mode 100644
index 0000000..e3556b2
--- /dev/null
+++ b/source/addons/panku_console/common/panku_module.gd.uid
@@ -0,0 +1 @@
+uid://d21arokusrmjd
diff --git a/source/addons/panku_console/common/repl_base_instance.gd b/source/addons/panku_console/common/repl_base_instance.gd
new file mode 100644
index 0000000..44d7ceb
--- /dev/null
+++ b/source/addons/panku_console/common/repl_base_instance.gd
@@ -0,0 +1,23 @@
+var _core:PankuConsole
+
+const _HELP_help := "List all environment variables."
+var help:String:
+ get:
+ var result = ["Registered objects:\n"]
+ var colors = ["#7c3f58", "#eb6b6f", "#f9a875", "#fff6d3"]
+ var i = 0
+ for k in _core.gd_exprenv._envs:
+ var c = colors[i%4]
+ i = i + 1
+ result.push_back("[b][color=%s]%s[/color][/b] "%[c, k])
+ result.push_back("\n")
+ result.push_back("You can type [b]helpe(object)[/b] to get more information.")
+ return "".join(PackedStringArray(result))
+
+const _HELP_helpe := "Provide detailed information about one specific environment variable."
+func helpe(obj:Object) -> String:
+ if !obj:
+ return "Invalid!"
+ if !obj.get_script():
+ return "It has no attached script!"
+ return PankuGDExprEnv.generate_help_text_from_script(obj.get_script())
diff --git a/source/addons/panku_console/common/repl_base_instance.gd.uid b/source/addons/panku_console/common/repl_base_instance.gd.uid
new file mode 100644
index 0000000..f4294d0
--- /dev/null
+++ b/source/addons/panku_console/common/repl_base_instance.gd.uid
@@ -0,0 +1 @@
+uid://cw0ur3eb0henf
diff --git a/source/addons/panku_console/common/smooth_scroll/smooth_scroll.gd b/source/addons/panku_console/common/smooth_scroll/smooth_scroll.gd
new file mode 100644
index 0000000..749d4cd
--- /dev/null
+++ b/source/addons/panku_console/common/smooth_scroll/smooth_scroll.gd
@@ -0,0 +1,48 @@
+extends PanelContainer
+
+@export var clip_container:Control
+
+@export var scrollbar:VScrollBar
+
+@export var follow_content:bool = true
+
+@onready var content:Control = clip_container.get_child(0)
+
+var scroll_progress:float = 0.0
+var prev_content_size_y:float = 0.0
+
+func init_progressbar() -> void:
+ scrollbar.min_value = 0.0
+ scrollbar.allow_greater = true
+ scrollbar.allow_lesser = true
+ scrollbar.value = 0.0
+
+func _gui_input(event: InputEvent) -> void:
+ if event is InputEventMouseButton and event.is_pressed():
+ var step:float = clip_container.size.y / 8.0
+ if event.button_index == MOUSE_BUTTON_WHEEL_UP:
+ scrollbar.value -= step
+ if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
+ scrollbar.value += step
+
+func _process(delta: float) -> void:
+ content.size = Vector2(clip_container.size.x, 0)
+ content.position = Vector2.ZERO
+ scrollbar.max_value = content.size.y
+ var scrollbar_value_max = max(0, scrollbar.max_value - clip_container.size.y)
+ scrollbar.value = lerp(scrollbar.value, clampf(scrollbar.value, 0.0, scrollbar_value_max), 0.2)
+ scrollbar.page = clip_container.size.y
+ scrollbar.visible = content.size.y > clip_container.size.y
+
+ scroll_progress = lerp(scroll_progress, scrollbar.value, 0.2)
+ content.position.y = - scroll_progress
+
+ if !follow_content: return
+ if prev_content_size_y != content.size.y:
+ var should_follow:bool = (scrollbar.value + scrollbar.page) / prev_content_size_y > 0.99
+ prev_content_size_y = content.size.y
+ if should_follow:
+ scrollbar.value = scrollbar.max_value - scrollbar.page
+
+func _ready() -> void:
+ init_progressbar()
diff --git a/source/addons/panku_console/common/smooth_scroll/smooth_scroll.gd.uid b/source/addons/panku_console/common/smooth_scroll/smooth_scroll.gd.uid
new file mode 100644
index 0000000..a5f1827
--- /dev/null
+++ b/source/addons/panku_console/common/smooth_scroll/smooth_scroll.gd.uid
@@ -0,0 +1 @@
+uid://rd44n33h004h
diff --git a/source/addons/panku_console/common/smooth_scroll/smooth_scroll.tscn b/source/addons/panku_console/common/smooth_scroll/smooth_scroll.tscn
new file mode 100644
index 0000000..013b157
--- /dev/null
+++ b/source/addons/panku_console/common/smooth_scroll/smooth_scroll.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=3 format=3 uid="uid://dyq4rjkkjs55d"]
+
+[ext_resource type="Script" path="res://addons/panku_console/common/smooth_scroll/smooth_scroll.gd" id="1_ma8ku"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_pa7xs"]
+
+[node name="SmoothScrollContainer" type="PanelContainer" node_paths=PackedStringArray("clip_container", "scrollbar")]
+self_modulate = Color(1, 1, 1, 0)
+clip_contents = true
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_pa7xs")
+script = ExtResource("1_ma8ku")
+clip_container = NodePath("HBoxContainer/Control")
+scrollbar = NodePath("HBoxContainer/VScrollBar")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="Control" type="Control" parent="HBoxContainer"]
+clip_contents = true
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="VScrollBar" type="VScrollBar" parent="HBoxContainer"]
+layout_mode = 2
+page = 20.0
+value = 80.0
diff --git a/source/addons/panku_console/common/utils.gd b/source/addons/panku_console/common/utils.gd
new file mode 100644
index 0000000..7aaeb1c
--- /dev/null
+++ b/source/addons/panku_console/common/utils.gd
@@ -0,0 +1,34 @@
+#@tool
+#extends EditorScript
+class_name PankuUtils
+
+# It will be included if you download the plugin from mirror repo(https://github.com/Ark2000/panku_console)
+const COMMIT_SHA_FILE_PATH = "res://addons/panku_console/COMMIT_SHA"
+
+static func get_plugin_version() -> String:
+ var error_result = "Unknown version"
+ #load version string from plugin.cfg
+ var cfg = ConfigFile.new()
+ if cfg.load("res://addons/panku_console/plugin.cfg") != OK:
+ return error_result
+ return cfg.get_value("plugin", "version", error_result)
+
+static func get_commit_sha() -> String:
+ if FileAccess.file_exists(COMMIT_SHA_FILE_PATH):
+ return FileAccess.get_file_as_string(COMMIT_SHA_FILE_PATH)
+ return ""
+
+static func get_commit_sha_short() -> String:
+ return get_commit_sha().substr(0, 7)
+
+static func get_commit_url() -> String:
+ var sha := get_commit_sha()
+ if sha != "":
+ return "https://github.com/Ark2000/PankuConsole/commit/" + sha
+ return ""
+
+#func _run():
+# print("plugin_version: ", get_plugin_version())
+# print("commit_sha: ", get_commit_sha())
+# print("commit_sha_short: ", get_commit_sha_short())
+# print("commit_url: ", get_commit_url())
diff --git a/source/addons/panku_console/common/utils.gd.uid b/source/addons/panku_console/common/utils.gd.uid
new file mode 100644
index 0000000..f59144b
--- /dev/null
+++ b/source/addons/panku_console/common/utils.gd.uid
@@ -0,0 +1 @@
+uid://shfkg603m80l
diff --git a/source/addons/panku_console/console.gd b/source/addons/panku_console/console.gd
new file mode 100644
index 0000000..cf4ce19
--- /dev/null
+++ b/source/addons/panku_console/console.gd
@@ -0,0 +1,78 @@
+class_name PankuConsole extends CanvasLayer
+# `console.gd` is a global singleton that provides all modules with a common interface
+# you can also use some of its members to interact with the console
+
+signal interactive_shell_visibility_changed(visible:bool)
+signal new_expression_entered(expression:String, result)
+signal new_notification_created(bbcode:String, id:int)
+signal toggle_console_action_just_pressed()
+
+const SingletonName = "Panku"
+const SingletonPath = "/root/" + SingletonName
+const ToggleConsoleAction = "toggle_console"
+
+# create_data_controller(objs:Array[Object]) -> PankuLynxWindow
+var create_data_controller_window:Callable = func(objs:Array): return null
+
+var windows_manager:PankuLynxWindowsManager
+var module_manager:PankuModuleManager = PankuModuleManager.new()
+var gd_exprenv:PankuGDExprEnv = PankuGDExprEnv.new()
+var _shell_visibility := false
+
+# notification whose id>=0 will be fixed to the bottom of the notification list
+# useful for loop print
+# you can use `get_instance_id()` as notification's unique id
+func notify(any, id=-1) -> void:
+ var text = str(any)
+ new_notification_created.emit(text, id)
+
+func get_shell_visibility() -> bool:
+ return _shell_visibility
+
+func _input(event: InputEvent):
+ if event.is_action_pressed(ToggleConsoleAction):
+ toggle_console_action_just_pressed.emit()
+
+func _ready():
+ assert(get_tree().current_scene != self, "Do not run console.tscn as a scene!")
+
+ windows_manager = $LynxWindowsManager
+ var base_instance = preload("./common/repl_base_instance.gd").new()
+ base_instance._core = self
+ gd_exprenv.set_base_instance(base_instance)
+
+ # add default input action if not defined by user
+ if not InputMap.has_action(ToggleConsoleAction):
+ InputMap.add_action(ToggleConsoleAction)
+ var default_toggle_console_event = InputEventKey.new()
+ default_toggle_console_event.physical_keycode = KEY_QUOTELEFT
+ InputMap.action_add_event(ToggleConsoleAction, default_toggle_console_event)
+
+ # since panku console servers numerous purposes
+ # we use a module system to manage all different features
+ # modules are invisible to each other by design to avoid coupling
+ # you can add or remove any modules here as you wish
+ var modules:Array[PankuModule] = [
+ PankuModuleNativeLogger.new(),
+ PankuModuleScreenNotifier.new(),
+ PankuModuleSystemReport.new(),
+ PankuModuleHistoryManager.new(),
+ PankuModuleEngineTools.new(),
+ PankuModuleKeyboardShortcuts.new(),
+ PankuModuleCheckLatestRelease.new(),
+ PankuModuleInteractiveShell.new(),
+ PankuModuleGeneralSettings.new(),
+ PankuModuleDataController.new(),
+ PankuModuleScreenCrtEffect.new(),
+ PankuModuleExpressionMonitor.new(),
+ PankuModuleTextureViewer.new(),
+ PankuModuleVariableTracker.new(),
+ PankuModuleAbout.new(),
+ PankuModuleSnakeGame.new(),
+ ]
+ module_manager.init_manager(self, modules)
+
+func _notification(what):
+ # quit event
+ if what == NOTIFICATION_WM_CLOSE_REQUEST:
+ module_manager.quit_modules()
diff --git a/source/addons/panku_console/console.gd.uid b/source/addons/panku_console/console.gd.uid
new file mode 100644
index 0000000..d0fdfac
--- /dev/null
+++ b/source/addons/panku_console/console.gd.uid
@@ -0,0 +1 @@
+uid://d7x5d27x8e20
diff --git a/source/addons/panku_console/console.tscn b/source/addons/panku_console/console.tscn
new file mode 100644
index 0000000..2506b02
--- /dev/null
+++ b/source/addons/panku_console/console.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=4 format=3 uid="uid://cyftuo4syatlv"]
+
+[ext_resource type="Script" path="res://addons/panku_console/console.gd" id="1_dohs1"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="2_wxhx6"]
+[ext_resource type="Script" path="res://addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd" id="10_f7qaq"]
+
+[node name="Console" type="CanvasLayer"]
+process_mode = 3
+layer = 128
+script = ExtResource("1_dohs1")
+
+[node name="LynxWindowsManager" type="Control" parent="."]
+z_index = 1
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("2_wxhx6")
+script = ExtResource("10_f7qaq")
diff --git a/source/addons/panku_console/default_panku_config.cfg b/source/addons/panku_console/default_panku_config.cfg
new file mode 100644
index 0000000..e5deb54
--- /dev/null
+++ b/source/addons/panku_console/default_panku_config.cfg
@@ -0,0 +1,80 @@
+{
+"enable_os_window": false,
+"engine_tools": {
+"time_scale": 1.0
+},
+"exp_history": [],
+"expression_monitor": {
+"monitor_data": [{
+"expressions": ["engine_tools.get_performance_info()"],
+"group_name": "default group"
+}],
+"window_position": Vector2(0, 49),
+"window_size": Vector2(85, 74),
+"window_visibility": false
+},
+"general_settings": {
+"enable_os_window": false,
+"lynx_window_base_color": Color(0, 0.0470588, 0.0941176, 0.501961),
+"lynx_window_blur_effect": true,
+"lynx_window_enable_os_window": false,
+"lynx_window_os_window_bg_color": Color(0, 0, 0, 0.658824),
+"os_window_bg_color": Color(0, 0, 0, 0.992157),
+"window_blur_effect": true,
+"window_position": Vector2(429.546, 94.1911),
+"window_size": Vector2(512.568, 478.128),
+"window_visibility": true
+},
+"history_manager": {
+"window_position": Vector2(317.728, 138.82),
+"window_size": Vector2(411.987, 339.537),
+"window_visibility": false
+},
+"interactive_shell": {
+"gui_mode": 0,
+"histories": [],
+"init_expr": "",
+"output_font_size": 14.0,
+"pause_if_input": false,
+"pause_if_popup": false,
+"show_side_menu": true,
+"unified_visibility": false,
+"unified_window_visibility": false,
+"window_position": Vector2(427.419, 75.3913),
+"window_size": Vector2(510.736, 410.437),
+"window_visibility": true
+},
+"keyboard_shortcuts": {
+"key_mapper": [],
+"window_position": Vector2(0, 49),
+"window_size": Vector2(85, 74),
+"window_visibility": false
+},
+"native_logger": {
+"font_size": 17.0,
+"logger_tags": ["[error]", "[warning]", "[info]"],
+"screen_overlay": 0,
+"screen_overlay_alpha": 0.44,
+"screen_overlay_font_shadow": true,
+"screen_overlay_font_size": 20.0,
+"show_timestamp": true,
+"window_position": Vector2(284.123, 124.547),
+"window_size": Vector2(483.998, 379.028),
+"window_visibility": false
+},
+"os_window_bg_color": Color(0, 0, 0, 0.992157),
+"os_window_bgcolor": Color(0, 0, 0, 0.658824),
+"snake": {
+"leader_board": [{
+"score": 40,
+"timestamp": "2024-01-29T16:00:00"
+}, {
+"score": 20,
+"timestamp": "2024-01-29T16:01:14"
+}]
+},
+"variable_tracker": {
+"tracking_delay": 0.5,
+"use_last_as_current": true
+}
+}
diff --git a/source/addons/panku_console/logo.svg b/source/addons/panku_console/logo.svg
new file mode 100644
index 0000000..41f564c
--- /dev/null
+++ b/source/addons/panku_console/logo.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/source/addons/panku_console/logo.svg.import b/source/addons/panku_console/logo.svg.import
new file mode 100644
index 0000000..48d9afc
--- /dev/null
+++ b/source/addons/panku_console/logo.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://rkxm4c3bbf34"
+path="res://.godot/imported/logo.svg-5c6f042742ccac523c072414b9eb3caf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/logo.svg"
+dest_files=["res://.godot/imported/logo.svg-5c6f042742ccac523c072414b9eb3caf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/modules/about/about.gd b/source/addons/panku_console/modules/about/about.gd
new file mode 100644
index 0000000..79b01f9
--- /dev/null
+++ b/source/addons/panku_console/modules/about/about.gd
@@ -0,0 +1,26 @@
+extends Control
+
+var _module:PankuModule
+
+@export var intro:Label
+@export var project_page_button:Button
+@export var check_update_button:Button
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ var version:String = PankuUtils.get_plugin_version()
+ var sha:String = PankuUtils.get_commit_sha_short()
+ if sha == "": sha = "Unknown"
+
+ intro.text = intro.text.replace("", version)
+ intro.text = intro.text.replace("", sha)
+
+ project_page_button.pressed.connect(
+ func():
+ OS.shell_open("https://github.com/Ark2000/PankuConsole")
+ )
+
+ check_update_button.pressed.connect(
+ func():
+ _module.core.gd_exprenv.execute("check_latest_release.check()")
+ )
diff --git a/source/addons/panku_console/modules/about/about.gd.uid b/source/addons/panku_console/modules/about/about.gd.uid
new file mode 100644
index 0000000..c9780f4
--- /dev/null
+++ b/source/addons/panku_console/modules/about/about.gd.uid
@@ -0,0 +1 @@
+uid://ddwpgsnaoabxx
diff --git a/source/addons/panku_console/modules/about/about.tscn b/source/addons/panku_console/modules/about/about.tscn
new file mode 100644
index 0000000..ecd50f3
--- /dev/null
+++ b/source/addons/panku_console/modules/about/about.tscn
@@ -0,0 +1,215 @@
+[gd_scene load_steps=10 format=3 uid="uid://cgwg3foes57mq"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/about/about.gd" id="1_kpix3"]
+[ext_resource type="PackedScene" uid="uid://dyq4rjkkjs55d" path="res://addons/panku_console/common/smooth_scroll/smooth_scroll.tscn" id="2_sev6e"]
+[ext_resource type="Texture2D" uid="uid://rkxm4c3bbf34" path="res://addons/panku_console/logo.svg" id="3_eycho"]
+[ext_resource type="PackedScene" uid="uid://cxmplwhfv5l88" path="res://addons/panku_console/modules/about/url_button.tscn" id="4_cqu2c"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_knn3o"]
+content_margin_left = 8.0
+content_margin_top = 8.0
+content_margin_right = 8.0
+content_margin_bottom = 8.0
+bg_color = Color(0, 0, 0, 0.270588)
+
+[sub_resource type="FontVariation" id="FontVariation_v70xy"]
+variation_embolden = 0.5
+
+[sub_resource type="FontVariation" id="FontVariation_wgi7f"]
+variation_embolden = 0.5
+
+[sub_resource type="SystemFont" id="SystemFont_6on77"]
+font_names = PackedStringArray("Monospace")
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cqcex"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0, 0, 0, 0.25098)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+
+[node name="about" type="Control" node_paths=PackedStringArray("intro", "project_page_button", "check_update_button")]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_kpix3")
+intro = NodePath("VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/PanelContainer/HBoxContainer/Label")
+project_page_button = NodePath("VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/HBoxContainer/ProjectPageButton")
+check_update_button = NodePath("VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/HBoxContainer/CheckUpdateButton")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 8.0
+offset_top = 8.0
+offset_right = -8.0
+offset_bottom = -8.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="SmoothScrollContainer" parent="VBoxContainer" instance=ExtResource("2_sev6e")]
+layout_mode = 2
+size_flags_vertical = 3
+follow_content = false
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control" index="0"]
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 995.0
+grow_horizontal = 2
+
+[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer"]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_knn3o")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/PanelContainer"]
+layout_mode = 2
+alignment = 1
+
+[node name="TextureRect" type="TextureRect" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/PanelContainer/HBoxContainer"]
+layout_mode = 2
+texture = ExtResource("3_eycho")
+expand_mode = 2
+
+[node name="Label" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/PanelContainer/HBoxContainer"]
+layout_mode = 2
+text = "Panku Console []
+© 2022-present Panku Console contributors.
+© 2022 Ark2000.
+"
+
+[node name="Label" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer"]
+layout_mode = 2
+text = "Panku Console is a feature-packed real-time debugging toolkit for Godot Engine."
+clip_text = true
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer"]
+layout_mode = 2
+
+[node name="ProjectPageButton" type="Button" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_fonts/font = SubResource("FontVariation_v70xy")
+text = "Project Page"
+
+[node name="CheckUpdateButton" type="Button" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_fonts/font = SubResource("FontVariation_v70xy")
+text = "Check Update"
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer"]
+layout_mode = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer"]
+layout_mode = 2
+
+[node name="Label" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_fonts/font = SubResource("FontVariation_wgi7f")
+text = "Project Manager"
+
+[node name="Button" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "Feo Wu (Ark2000)"
+url = "https://github.com/Ark2000"
+
+[node name="Label2" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_fonts/font = SubResource("FontVariation_wgi7f")
+text = "Contributors"
+
+[node name="Button2" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "Feo Wu (Ark2000)"
+url = "https://github.com/Ark2000"
+
+[node name="Button3" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "Rafael Correa (scriptsengineer)"
+url = "https://github.com/scriptsengineer"
+
+[node name="Button4" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "worron"
+url = "https://github.com/worron"
+
+[node name="Button5" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "mieldepoche"
+url = "https://github.com/mieldepoche"
+
+[node name="Button6" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "Eggbertx"
+url = "https://github.com/Eggbertx"
+
+[node name="Button7" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "univeous"
+url = "https://github.com/univeous"
+
+[node name="Button8" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "CheapMeow"
+url = "https://github.com/CheapMeow"
+
+[node name="Button9" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "winston-yallow (Winston)"
+url = "https://github.com/winston-yallow"
+
+[node name="Label3" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_fonts/font = SubResource("FontVariation_wgi7f")
+text = "Icons"
+
+[node name="Button10" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer" instance=ExtResource("4_cqu2c")]
+layout_mode = 2
+text = "SVG Repo"
+url = "https://www.svgrepo.com/page/licensing/"
+
+[node name="Label4" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_fonts/font = SubResource("FontVariation_wgi7f")
+text = "License"
+
+[node name="Label5" type="Label" parent="VBoxContainer/SmoothScrollContainer/HBoxContainer/Control/VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_fonts/font = SubResource("SystemFont_6on77")
+theme_override_styles/normal = SubResource("StyleBoxFlat_cqcex")
+text = "The MIT License (MIT)
+
+Copyright (c) 2022-present Panku Console contributors.
+Copyright (c) 2022 Ark2000
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the \"Software\"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
+clip_text = true
+
+[editable path="VBoxContainer/SmoothScrollContainer"]
diff --git a/source/addons/panku_console/modules/about/env.gd b/source/addons/panku_console/modules/about/env.gd
new file mode 100644
index 0000000..e3e1d11
--- /dev/null
+++ b/source/addons/panku_console/modules/about/env.gd
@@ -0,0 +1,5 @@
+var _module:PankuModule
+
+const _HELP_open = "Open about window"
+func open() -> void:
+ _module.open_window()
diff --git a/source/addons/panku_console/modules/about/env.gd.uid b/source/addons/panku_console/modules/about/env.gd.uid
new file mode 100644
index 0000000..5528dbf
--- /dev/null
+++ b/source/addons/panku_console/modules/about/env.gd.uid
@@ -0,0 +1 @@
+uid://bdw5dk5y0exvf
diff --git a/source/addons/panku_console/modules/about/module.gd b/source/addons/panku_console/modules/about/module.gd
new file mode 100644
index 0000000..9b4c915
--- /dev/null
+++ b/source/addons/panku_console/modules/about/module.gd
@@ -0,0 +1,15 @@
+class_name PankuModuleAbout extends PankuModule
+
+var window:PankuLynxWindow
+const ui = preload("./about.tscn")
+
+func open_window():
+ if window: return
+ var ui_instance = ui.instantiate()
+ ui_instance._module = self
+ window = core.windows_manager.create_window(ui_instance)
+ window.set_window_title_text("About")
+ window.show_window()
+ window.window_closed.connect(
+ func(): window = null
+ )
diff --git a/source/addons/panku_console/modules/about/module.gd.uid b/source/addons/panku_console/modules/about/module.gd.uid
new file mode 100644
index 0000000..c4464aa
--- /dev/null
+++ b/source/addons/panku_console/modules/about/module.gd.uid
@@ -0,0 +1 @@
+uid://c3mxo5wwp8po6
diff --git a/source/addons/panku_console/modules/about/url_button.gd b/source/addons/panku_console/modules/about/url_button.gd
new file mode 100644
index 0000000..97a4e1a
--- /dev/null
+++ b/source/addons/panku_console/modules/about/url_button.gd
@@ -0,0 +1,9 @@
+extends Button
+
+@export var url:String
+
+func _ready():
+ pressed.connect(
+ func():
+ OS.shell_open(url)
+ )
diff --git a/source/addons/panku_console/modules/about/url_button.gd.uid b/source/addons/panku_console/modules/about/url_button.gd.uid
new file mode 100644
index 0000000..38fb8ed
--- /dev/null
+++ b/source/addons/panku_console/modules/about/url_button.gd.uid
@@ -0,0 +1 @@
+uid://qedfr3ggip7d
diff --git a/source/addons/panku_console/modules/about/url_button.tscn b/source/addons/panku_console/modules/about/url_button.tscn
new file mode 100644
index 0000000..72236a3
--- /dev/null
+++ b/source/addons/panku_console/modules/about/url_button.tscn
@@ -0,0 +1,17 @@
+[gd_scene load_steps=3 format=3 uid="uid://cxmplwhfv5l88"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/about/url_button.gd" id="1_01blg"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ivnlg"]
+content_margin_left = 8.0
+bg_color = Color(0, 0, 0, 0.243137)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+
+[node name="Button" type="Button"]
+theme_override_styles/normal = SubResource("StyleBoxFlat_ivnlg")
+text = "Button Text"
+alignment = 0
+script = ExtResource("1_01blg")
diff --git a/source/addons/panku_console/modules/check_latest_release/env.gd b/source/addons/panku_console/modules/check_latest_release/env.gd
new file mode 100644
index 0000000..74e0a00
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/env.gd
@@ -0,0 +1,5 @@
+var _module:PankuModule
+
+const _HELP_check = "Fetch latest release information from Github"
+func check():
+ _module.check()
diff --git a/source/addons/panku_console/modules/check_latest_release/env.gd.uid b/source/addons/panku_console/modules/check_latest_release/env.gd.uid
new file mode 100644
index 0000000..bfbb98a
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/env.gd.uid
@@ -0,0 +1 @@
+uid://b8nmhsdccly1f
diff --git a/source/addons/panku_console/modules/check_latest_release/module.gd b/source/addons/panku_console/modules/check_latest_release/module.gd
new file mode 100644
index 0000000..e720ff7
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/module.gd
@@ -0,0 +1,32 @@
+class_name PankuModuleCheckLatestRelease extends PankuModule
+
+signal check_lasted_release_requested()
+signal check_lasted_release_responded(msg:Dictionary)
+
+func send_request() -> Node:
+ var node = preload("./network.gd").new()
+ core.add_child(node)
+ node.check_latest_release()
+ node.response_received.connect(
+ func(_v): node.queue_free()
+ )
+ return node
+
+func check_update():
+ send_request().response_received.connect(
+ func(msg:Dictionary):
+ check_lasted_release_responded.emit(msg)
+ )
+
+func check():
+ send_request().response_received.connect(
+ func(msg:Dictionary):
+ if !msg["success"]:
+ core.notify("[color=red][Error][/color] Failed! " + msg["msg"])
+ else:
+ core.notify("[color=green][info][/color] Latest: [%s] [url=%s]%s[/url]" % [msg["published_at"], msg["html_url"], msg["name"]])
+ )
+
+func init_module():
+ # implement core functions
+ check_lasted_release_requested.connect(check_update)
diff --git a/source/addons/panku_console/modules/check_latest_release/module.gd.uid b/source/addons/panku_console/modules/check_latest_release/module.gd.uid
new file mode 100644
index 0000000..3990a21
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/module.gd.uid
@@ -0,0 +1 @@
+uid://dosa0qqky3u13
diff --git a/source/addons/panku_console/modules/check_latest_release/network.gd b/source/addons/panku_console/modules/check_latest_release/network.gd
new file mode 100644
index 0000000..963718e
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/network.gd
@@ -0,0 +1,59 @@
+extends HTTPRequest
+
+signal response_received(msg:Dictionary)
+
+const LATEST_RELEASE_URL = "https://api.github.com/repos/Ark2000/PankuConsole/releases/latest"
+
+const REQUEST_RESULT = {
+ RESULT_SUCCESS: "SUCCESS",
+ RESULT_CHUNKED_BODY_SIZE_MISMATCH: "CHUNKED_BODY_SIZE_MISMATCH",
+ RESULT_CANT_CONNECT: "CANT_CONNECT",
+ RESULT_CANT_RESOLVE: "CANT_RESOLVE",
+ RESULT_CONNECTION_ERROR: "CONNECTION_ERROR",
+ RESULT_TLS_HANDSHAKE_ERROR: "TLS_HANDSHAKE_ERROR",
+ RESULT_NO_RESPONSE: "NO_RESPONSE",
+ RESULT_BODY_SIZE_LIMIT_EXCEEDED: "BODY_SIZE_LIMIT_EXCEEDED",
+ RESULT_BODY_DECOMPRESS_FAILED: "BODY_DECOMPRESS_FAILED",
+ RESULT_REQUEST_FAILED: "REQUEST_FAILED",
+ RESULT_DOWNLOAD_FILE_CANT_OPEN: "DOWNLOAD_FILE_CANT_OPEN",
+ RESULT_DOWNLOAD_FILE_WRITE_ERROR: "DOWNLOAD_FILE_WRITE_ERROR",
+ RESULT_REDIRECT_LIMIT_REACHED: "REDIRECT_LIMIT_REACHED",
+ RESULT_TIMEOUT: "TIMEOUT"
+}
+
+static func dget(dict:Dictionary, key, default_value=""):
+ return default_value if !dict.has(key) else dict[key]
+
+var is_busy := false
+
+func _ready():
+ request_completed.connect(_on_request_completed)
+
+func check_latest_release():
+ if is_busy: return
+ is_busy = true
+ var error = request(LATEST_RELEASE_URL)
+ if error != OK:
+ is_busy = false
+ response_received.emit({
+ "success": false,
+ "msg": "An error occurred in the HTTP request."
+ })
+
+func _on_request_completed(result:int, response_code:int, headers:PackedStringArray, body:PackedByteArray):
+ is_busy = false
+ if result != RESULT_SUCCESS:
+ response_received.emit({
+ "success": false,
+ "msg": REQUEST_RESULT[result]
+ })
+ return
+ var json = JSON.new()
+ json.parse(body.get_string_from_utf8())
+ var response:Dictionary = json.get_data()
+ response_received.emit({
+ "success": true,
+ "published_at": dget(response, "published_at", "???"),
+ "name": dget(response, "name", "???"),
+ "html_url": dget(response, "html_url", "???")
+ })
diff --git a/source/addons/panku_console/modules/check_latest_release/network.gd.uid b/source/addons/panku_console/modules/check_latest_release/network.gd.uid
new file mode 100644
index 0000000..147bb10
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/network.gd.uid
@@ -0,0 +1 @@
+uid://dw70rqfoabmal
diff --git a/source/addons/panku_console/modules/check_latest_release/opt.gd b/source/addons/panku_console/modules/check_latest_release/opt.gd
new file mode 100644
index 0000000..9bd8384
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/opt.gd
@@ -0,0 +1,8 @@
+extends ModuleOptions
+
+@export_group("check_latest_release")
+
+@export var export_button_check_update := "Check Update"
+
+func check_update():
+ _module.check()
diff --git a/source/addons/panku_console/modules/check_latest_release/opt.gd.uid b/source/addons/panku_console/modules/check_latest_release/opt.gd.uid
new file mode 100644
index 0000000..0bbaf47
--- /dev/null
+++ b/source/addons/panku_console/modules/check_latest_release/opt.gd.uid
@@ -0,0 +1 @@
+uid://d0tmmqx108m0n
diff --git a/source/addons/panku_console/modules/data_controller/exporter/exporter_2.gd b/source/addons/panku_console/modules/data_controller/exporter/exporter_2.gd
new file mode 100644
index 0000000..05106cd
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/exporter_2.gd
@@ -0,0 +1,207 @@
+extends Control
+const BUTTON_PREFIX = "export_button_"
+const COMMENT_PREFIX = "export_comment_"
+const TEXT_LABEL_MIN_X = 120
+
+@export var container:VBoxContainer
+
+var objects := []
+var rows_need_update:Array = []
+var row_objects:Array[Object] = []
+
+func _ready() -> void:
+ init()
+
+func create_rows_from_object(index:int):
+ var obj:Object = objects[index]
+ var row_types := []
+ var rows := []
+
+ if obj == null:
+ return
+
+
+ if !is_instance_valid(obj):
+ return
+
+ var script = obj.get_script()
+ if script == null:
+ return
+
+ var data = script.get_script_property_list()
+ for d in data:
+ if d.name.begins_with("_"): continue
+ if d.name.begins_with("readonly"):
+ row_types.append("read_only")
+ rows.append(create_ui_row_read_only(d))
+ continue
+ if d.usage == (PROPERTY_USAGE_SCRIPT_VARIABLE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE):
+ if d.name.begins_with(BUTTON_PREFIX) and d.type == TYPE_STRING:
+ row_types.append("func_button")
+ rows.append(create_ui_row_func_button(d, obj))
+ elif d.name.begins_with(COMMENT_PREFIX) and d.type == TYPE_STRING:
+ row_types.append("comment")
+ rows.append(create_ui_row_comment(obj.get(d.name)))
+ elif d.type == TYPE_INT and d.hint == PROPERTY_HINT_NONE:
+ row_types.append("int")
+ rows.append(create_ui_row_int(d))
+ elif d.type == TYPE_FLOAT and d.hint == PROPERTY_HINT_NONE:
+ row_types.append("float")
+ rows.append(create_ui_row_float(d))
+ elif d.type in [TYPE_FLOAT, TYPE_INT] and d.hint == PROPERTY_HINT_RANGE:
+ row_types.append("range_number")
+ rows.append(create_ui_row_range_number(d))
+ elif d.type == TYPE_VECTOR2:
+ row_types.append("vec2")
+ rows.append(create_ui_row_vec2(d))
+ elif d.type == TYPE_BOOL:
+ row_types.append("bool")
+ rows.append(create_ui_row_bool(d))
+ elif d.type == TYPE_STRING:
+ row_types.append("string")
+ rows.append(create_ui_row_string(d))
+ elif d.type == TYPE_COLOR:
+ row_types.append("color")
+ rows.append(create_ui_row_color(d))
+ elif d.type == TYPE_INT and d.hint == PROPERTY_HINT_ENUM:
+ row_types.append("enum")
+ rows.append(create_ui_row_enum(d))
+ else:
+ row_types.append("read_only")
+ rows.append(create_ui_row_read_only(d))
+ elif d.usage == PROPERTY_USAGE_GROUP:
+ row_types.append("group_button")
+ rows.append(create_ui_row_group_button(d, []))
+
+ var current_group_button = null
+ var control_group = []
+ for i in range(rows.size()):
+ var row_type:String = row_types[i]
+ var row = rows[i]
+ if row_type == "group_button":
+ if current_group_button != null:
+ current_group_button.control_group = control_group
+ control_group = []
+ current_group_button = row
+ else:
+ if current_group_button != null:
+ control_group.append(row)
+ if not row_type in ["group_button", "func_button", "comment"]:
+ rows_need_update.append(row)
+ row_objects.append(obj)
+ if control_group.size() > 0:
+ current_group_button.control_group = control_group
+
+ for row in rows:
+ container.add_child(row)
+
+func init():
+ for child in container.get_children():
+ container.remove_child(child)
+ child.queue_free()
+
+ for i in range(objects.size()):
+ create_rows_from_object(i)
+
+ init_data()
+
+ create_tween().set_loops().tween_callback(update_rows).set_delay(0.1)
+
+func is_empty() -> bool:
+ return container.get_child_count() == 0
+
+func update_rows():
+ for i in range(rows_need_update.size()):
+ var row = rows_need_update[i]
+ var obj = row_objects[i]
+ var prop_name = row.name_label.text
+
+ if !row.visible: continue
+ if row.is_active(): continue
+
+ if is_instance_valid(obj):
+ row.update_ui(obj.get(prop_name))
+ else:
+ if row.name_label.text.begins_with("(missing)"):
+ continue
+ row.name_label.text = "(missing)" + row.name_label.text
+ row.name_label.modulate=Color("#ae5464")
+
+func init_data():
+ for i in range(rows_need_update.size()):
+ var row = rows_need_update[i]
+ var obj = row_objects[i]
+ var prop_name = row.name_label.text
+
+ row.ui_val_changed.connect(
+ func(val):
+ if !is_instance_valid(obj):
+ return
+ if prop_name in obj:
+ if obj.has_method("update_setting"):
+ obj.update_setting(prop_name, val)
+ else:
+ obj.set(prop_name, val)
+ )
+
+func init_ui_row(ui_row:Control, property:Dictionary) -> Control:
+ ui_row.name_label.text = property.name
+ ui_row.name_label.custom_minimum_size.x = TEXT_LABEL_MIN_X
+ return ui_row
+
+func create_ui_row_float(property:Dictionary) -> Control:
+ var ui_row = preload("./row_float.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_int(property:Dictionary) -> Control:
+ var ui_row = preload("./row_int.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_range_number(property:Dictionary) -> Control:
+ var ui_row = preload("./row_range_number.tscn").instantiate()
+ ui_row.setup(property.type, property.hint_string.split(",", false))
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_vec2(property:Dictionary) -> Control:
+ var ui_row = preload("./row_vec_2.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_bool(property:Dictionary) -> Control:
+ var ui_row = preload("./row_bool.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_string(property:Dictionary) -> Control:
+ var ui_row = preload("./row_string.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_color(property:Dictionary) -> Control:
+ var ui_row = preload("./row_color.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_enum(property:Dictionary) -> Control:
+ var ui_row = preload("./row_enum.tscn").instantiate()
+ ui_row.setup(property.hint_string.split(",", false))
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_read_only(property:Dictionary) -> Control:
+ var ui_row = preload("./row_read_only.tscn").instantiate()
+ return init_ui_row(ui_row, property)
+
+func create_ui_row_comment(comment:String) -> Control:
+ var ui_row = preload("./row_comment.tscn").instantiate()
+ ui_row.label.text = comment
+ return ui_row
+
+func create_ui_row_func_button(property:Dictionary, object:Object) -> Control:
+ var ui_row:Button = preload("./row_button.tscn").instantiate()
+ ui_row.text = object.get(property.name)
+ var func_name:String = property.name.trim_prefix(BUTTON_PREFIX)
+ if func_name in object:
+ ui_row.pressed.connect(Callable(object, func_name))
+ return ui_row
+
+func create_ui_row_group_button(property:Dictionary, group:Array) -> Control:
+ var ui_row:Button = preload("./row_group_button.tscn").instantiate()
+ ui_row.text = property.name
+ ui_row.control_group = group
+ return ui_row
diff --git a/source/addons/panku_console/modules/data_controller/exporter/exporter_2.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/exporter_2.gd.uid
new file mode 100644
index 0000000..dc9ec4f
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/exporter_2.gd.uid
@@ -0,0 +1 @@
+uid://byr3fbq3rqx6b
diff --git a/source/addons/panku_console/modules/data_controller/exporter/exporter_2.tscn b/source/addons/panku_console/modules/data_controller/exporter/exporter_2.tscn
new file mode 100644
index 0000000..dd6bdb2
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/exporter_2.tscn
@@ -0,0 +1,83 @@
+[gd_scene load_steps=15 format=3 uid="uid://c0y1axyst1ub3"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/exporter_2.gd" id="1_0hpei"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_3uypn"]
+[ext_resource type="PackedScene" uid="uid://cj0urmvj2rtas" path="res://addons/panku_console/modules/data_controller/exporter/row_vec_2.tscn" id="1_v4pbh"]
+[ext_resource type="PackedScene" uid="uid://b4jxqh4ysyodt" path="res://addons/panku_console/modules/data_controller/exporter/row_string.tscn" id="2_87515"]
+[ext_resource type="PackedScene" uid="uid://dyq4rjkkjs55d" path="res://addons/panku_console/common/smooth_scroll/smooth_scroll.tscn" id="3_gmdfh"]
+[ext_resource type="PackedScene" uid="uid://dal16suyx5int" path="res://addons/panku_console/modules/data_controller/exporter/row_read_only.tscn" id="3_r8k7l"]
+[ext_resource type="PackedScene" uid="uid://b6w4d5bsp0erj" path="res://addons/panku_console/modules/data_controller/exporter/row_range_number.tscn" id="4_ido8o"]
+[ext_resource type="PackedScene" uid="uid://cnsnrihcgjsa" path="res://addons/panku_console/modules/data_controller/exporter/row_int.tscn" id="5_ua2hx"]
+[ext_resource type="PackedScene" uid="uid://78evbpdhqe4b" path="res://addons/panku_console/modules/data_controller/exporter/row_group_button.tscn" id="6_mmbw5"]
+[ext_resource type="PackedScene" uid="uid://bneg4nt6ryuuj" path="res://addons/panku_console/modules/data_controller/exporter/row_float.tscn" id="7_h6vg4"]
+[ext_resource type="PackedScene" uid="uid://dfsypgkiprnp8" path="res://addons/panku_console/modules/data_controller/exporter/row_enum.tscn" id="8_r3qu8"]
+[ext_resource type="PackedScene" uid="uid://b4iurk1ni11v2" path="res://addons/panku_console/modules/data_controller/exporter/row_color.tscn" id="9_scg41"]
+[ext_resource type="PackedScene" uid="uid://ds3hbsvvlvdyw" path="res://addons/panku_console/modules/data_controller/exporter/row_button.tscn" id="10_vt884"]
+[ext_resource type="PackedScene" uid="uid://i2pcctq0i2o3" path="res://addons/panku_console/modules/data_controller/exporter/row_bool.tscn" id="11_0f6sm"]
+
+[node name="exporter_2" type="Control" node_paths=PackedStringArray("container")]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_3uypn")
+script = ExtResource("1_0hpei")
+container = NodePath("SmoothScrollContainer/HBoxContainer/Control/VBoxContainer")
+
+[node name="SmoothScrollContainer" parent="." instance=ExtResource("3_gmdfh")]
+layout_mode = 1
+anchors_preset = -1
+offset_left = 4.0
+offset_top = 4.0
+offset_right = -4.0
+offset_bottom = -4.0
+follow_content = false
+
+[node name="VBoxContainer" type="VBoxContainer" parent="SmoothScrollContainer/HBoxContainer/Control" index="0"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="RowVec2" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("1_v4pbh")]
+layout_mode = 2
+
+[node name="RowString" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("2_87515")]
+layout_mode = 2
+
+[node name="RowReadOnly" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("3_r8k7l")]
+layout_mode = 2
+
+[node name="RowRangeNumber" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("4_ido8o")]
+layout_mode = 2
+
+[node name="RowInt" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("5_ua2hx")]
+layout_mode = 2
+
+[node name="GroupButton" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("6_mmbw5")]
+layout_mode = 2
+text = "Group 3"
+
+[node name="RowFloat" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("7_h6vg4")]
+layout_mode = 2
+
+[node name="RowEnum" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("8_r3qu8")]
+layout_mode = 2
+
+[node name="RowColor" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("9_scg41")]
+layout_mode = 2
+
+[node name="RowButton" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("10_vt884")]
+layout_mode = 2
+
+[node name="RowBool" parent="SmoothScrollContainer/HBoxContainer/Control/VBoxContainer" instance=ExtResource("11_0f6sm")]
+layout_mode = 2
+
+[editable path="SmoothScrollContainer"]
diff --git a/source/addons/panku_console/modules/data_controller/exporter/joystick_button.gd b/source/addons/panku_console/modules/data_controller/exporter/joystick_button.gd
new file mode 100644
index 0000000..7512881
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/joystick_button.gd
@@ -0,0 +1,21 @@
+extends PankuButton
+
+signal value_changed(delta:Vector2)
+
+var prev_mouse_mode
+var prev_mouse_pos
+
+func _ready():
+ super._ready()
+ button.gui_input.connect(
+ func(e:InputEvent):
+ if e is InputEventMouseButton and e.button_index == MOUSE_BUTTON_LEFT and e.pressed:
+ prev_mouse_mode = DisplayServer.mouse_get_mode()
+ prev_mouse_pos = get_viewport().get_mouse_position()
+ DisplayServer.mouse_set_mode(DisplayServer.MOUSE_MODE_CAPTURED)
+ if e is InputEventMouseMotion and e.button_mask != MOUSE_BUTTON_NONE:
+ value_changed.emit(e.relative)
+ if e is InputEventMouseButton and e.button_index == MOUSE_BUTTON_LEFT and !e.pressed:
+ DisplayServer.mouse_set_mode(prev_mouse_mode)
+ DisplayServer.warp_mouse(prev_mouse_pos)
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/joystick_button.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/joystick_button.gd.uid
new file mode 100644
index 0000000..53788e7
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/joystick_button.gd.uid
@@ -0,0 +1 @@
+uid://bd6t4rl6bk04g
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_bool.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_bool.tscn
new file mode 100644
index 0000000..de55943
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_bool.tscn
@@ -0,0 +1,25 @@
+[gd_scene load_steps=4 format=3 uid="uid://i2pcctq0i2o3"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd" id="1_n4ai0"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_u58sr"]
+
+[sub_resource type="SystemFont" id="SystemFont_l1ss8"]
+font_names = PackedStringArray("Monospace")
+font_weight = 900
+
+[node name="RowBool" type="HBoxContainer" node_paths=PackedStringArray("label_btn")]
+theme = ExtResource("1_u58sr")
+script = ExtResource("1_n4ai0")
+label_btn = NodePath("Button")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value3"
+vertical_alignment = 1
+
+[node name="Button" type="Button" parent="."]
+layout_mode = 2
+theme_override_fonts/font = SubResource("SystemFont_l1ss8")
+toggle_mode = true
+text = "[OFF] / ON"
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_button.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_button.tscn
new file mode 100644
index 0000000..c7a1bf3
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_button.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://ds3hbsvvlvdyw"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_07gid"]
+
+[node name="RowButton" type="Button"]
+offset_right = 80.0
+offset_bottom = 31.0
+size_flags_horizontal = 3
+focus_mode = 0
+theme_override_styles/focus = SubResource("StyleBoxEmpty_07gid")
+text = "Generate"
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_color.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_color.tscn
new file mode 100644
index 0000000..0170b7b
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_color.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=2 format=3 uid="uid://b4iurk1ni11v2"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_color.gd" id="1_qp8f1"]
+
+[node name="RowColor" type="HBoxContainer" node_paths=PackedStringArray("line_edit", "color_picker_button")]
+script = ExtResource("1_qp8f1")
+line_edit = NodePath("LineEdit")
+color_picker_button = NodePath("ColorPickerButton")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+text = "value3"
+
+[node name="LineEdit" type="LineEdit" parent="."]
+custom_minimum_size = Vector2(60, 0)
+text = "FFFFFFFF"
+
+[node name="ColorPickerButton" type="ColorPickerButton" parent="."]
+size_flags_horizontal = 3
+color = Color(0.0901961, 0.427451, 0.533333, 1)
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_comment.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_comment.tscn
new file mode 100644
index 0000000..a146b69
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_comment.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=5 format=3 uid="uid://cxnpwuiumbs85"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd" id="1_dvooy"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_wu8ma"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="3_wi42w"]
+[ext_resource type="Texture2D" uid="uid://b6jt0ggmuoyeb" path="res://addons/panku_console/res/icons2/info2.svg" id="4_o8r6v"]
+
+[node name="RowComment" type="HBoxContainer" node_paths=PackedStringArray("label")]
+custom_minimum_size = Vector2(20, 20)
+offset_right = 148.0
+offset_bottom = 31.0
+size_flags_horizontal = 3
+theme = ExtResource("1_wu8ma")
+script = ExtResource("1_dvooy")
+label = NodePath("PankuButton/HBoxContainer/Label")
+
+[node name="PankuButton" parent="." instance=ExtResource("3_wi42w")]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="TextureRect" parent="PankuButton/HBoxContainer" index="0"]
+texture = ExtResource("4_o8r6v")
+
+[node name="Label" parent="PankuButton/HBoxContainer" index="1"]
+modulate = Color(0.598845, 0.764704, 0.931026, 0.529412)
+size_flags_horizontal = 3
+text = "Comment"
+clip_text = true
+
+[editable path="PankuButton"]
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_enum.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_enum.tscn
new file mode 100644
index 0000000..58962ea
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_enum.tscn
@@ -0,0 +1,24 @@
+[gd_scene load_steps=2 format=3 uid="uid://dfsypgkiprnp8"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd" id="1_u8cx4"]
+
+[node name="RowEnum" type="HBoxContainer" node_paths=PackedStringArray("opt_btn")]
+script = ExtResource("1_u8cx4")
+opt_btn = NodePath("OptionButton")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value3"
+
+[node name="OptionButton" type="OptionButton" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+item_count = 3
+selected = 0
+popup/item_0/text = "option 1"
+popup/item_0/id = 0
+popup/item_1/text = "option 2"
+popup/item_1/id = 1
+popup/item_2/text = "option 3"
+popup/item_2/id = 2
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_float.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_float.tscn
new file mode 100644
index 0000000..e878d70
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_float.tscn
@@ -0,0 +1,33 @@
+[gd_scene load_steps=5 format=3 uid="uid://bneg4nt6ryuuj"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_float.gd" id="1_8dioj"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="2_5rj7f"]
+[ext_resource type="Texture2D" uid="uid://bc2g8vv0x3d8y" path="res://addons/panku_console/res/icons2/swap_horiz.svg" id="2_lyxit"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/joystick_button.gd" id="3_ee2gx"]
+
+[node name="RowFloat" type="HBoxContainer" node_paths=PackedStringArray("line_edit", "joystick_button")]
+script = ExtResource("1_8dioj")
+line_edit = NodePath("LineEdit")
+joystick_button = NodePath("PankuButton")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value3"
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "433.24"
+
+[node name="PankuButton" parent="." instance=ExtResource("2_5rj7f")]
+layout_mode = 2
+script = ExtResource("3_ee2gx")
+
+[node name="TextureRect" parent="PankuButton/HBoxContainer" index="0"]
+texture = ExtResource("2_lyxit")
+
+[node name="Label" parent="PankuButton/HBoxContainer" index="1"]
+text = ""
+
+[editable path="PankuButton"]
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_group_button.gd b/source/addons/panku_console/modules/data_controller/exporter/row_group_button.gd
new file mode 100644
index 0000000..ea5a2d7
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_group_button.gd
@@ -0,0 +1,16 @@
+extends Button
+
+@export var unpressed_icon:Texture2D = preload("res://addons/panku_console/res/icons2/chevron_right.svg")
+@export var pressed_icon:Texture2D = preload("res://addons/panku_console/res/icons2/expand_more.svg")
+
+@export var control_group:Array
+
+func _ready():
+ toggled.connect(set_group_visibility)
+ set_group_visibility(false)
+ button_pressed = false
+
+func set_group_visibility(enabled:bool):
+ icon = pressed_icon if enabled else unpressed_icon
+ for node in control_group:
+ node.visible = enabled
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_group_button.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_group_button.gd.uid
new file mode 100644
index 0000000..1e2d954
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_group_button.gd.uid
@@ -0,0 +1 @@
+uid://bmag0vwbj0x14
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_group_button.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_group_button.tscn
new file mode 100644
index 0000000..43a7db9
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_group_button.tscn
@@ -0,0 +1,38 @@
+[gd_scene load_steps=5 format=3 uid="uid://78evbpdhqe4b"]
+
+[ext_resource type="Texture2D" uid="uid://ws58gucuygx1" path="res://addons/panku_console/res/icons2/chevron_right.svg" id="1_sddod"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_group_button.gd" id="2_7jdni"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_gpngf"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wmca1"]
+bg_color = Color(0, 0.345098, 0.498039, 0.180392)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0.596078, 0.85098, 0.25098)
+
+[node name="GroupButton" type="Button"]
+custom_minimum_size = Vector2(0, 20)
+offset_right = 169.0
+offset_bottom = 27.0
+theme_override_styles/focus = SubResource("StyleBoxEmpty_gpngf")
+toggle_mode = true
+text = "Group_1"
+icon = ExtResource("1_sddod")
+flat = true
+alignment = 0
+expand_icon = true
+script = ExtResource("2_7jdni")
+
+[node name="Panel" type="Panel" parent="."]
+show_behind_parent = 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_styles/panel = SubResource("StyleBoxFlat_wmca1")
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_int.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_int.tscn
new file mode 100644
index 0000000..1e8f858
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_int.tscn
@@ -0,0 +1,43 @@
+[gd_scene load_steps=5 format=3 uid="uid://cnsnrihcgjsa"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_int.gd" id="1_gi50r"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="2_cfn1u"]
+[ext_resource type="Texture2D" uid="uid://dnexm7u6lq3km" path="res://addons/panku_console/res/icons2/remove.svg" id="2_ityxl"]
+[ext_resource type="Texture2D" uid="uid://dprpfr0l5xvmu" path="res://addons/panku_console/res/icons2/add.svg" id="3_3vcaq"]
+
+[node name="RowInt" type="HBoxContainer" node_paths=PackedStringArray("line_edit", "button_inc", "button_dec")]
+script = ExtResource("1_gi50r")
+line_edit = NodePath("LineEdit")
+button_inc = NodePath("Button2")
+button_dec = NodePath("Button")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value3"
+
+[node name="Button" parent="." instance=ExtResource("2_cfn1u")]
+layout_mode = 2
+
+[node name="TextureRect" parent="Button/HBoxContainer" index="0"]
+texture = ExtResource("2_ityxl")
+
+[node name="Label" parent="Button/HBoxContainer" index="1"]
+text = ""
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "12345"
+
+[node name="Button2" parent="." instance=ExtResource("2_cfn1u")]
+layout_mode = 2
+
+[node name="TextureRect" parent="Button2/HBoxContainer" index="0"]
+texture = ExtResource("3_3vcaq")
+
+[node name="Label" parent="Button2/HBoxContainer" index="1"]
+text = ""
+
+[editable path="Button"]
+[editable path="Button2"]
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_range_number.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_range_number.tscn
new file mode 100644
index 0000000..55096b9
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_range_number.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=2 format=3 uid="uid://b6w4d5bsp0erj"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd" id="1_wfk7y"]
+
+[node name="RowRangeNumber" type="HBoxContainer" node_paths=PackedStringArray("slider", "ledit")]
+offset_right = 285.0
+offset_bottom = 31.0
+script = ExtResource("1_wfk7y")
+slider = NodePath("HSlider")
+ledit = NodePath("LineEdit")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value2"
+
+[node name="HSlider" type="HSlider" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+size_flags_stretch_ratio = 2.0
+value = 30.0
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "123.45"
+virtual_keyboard_type = 2
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_read_only.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_read_only.tscn
new file mode 100644
index 0000000..eb17590
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_read_only.tscn
@@ -0,0 +1,18 @@
+[gd_scene load_steps=2 format=3 uid="uid://dal16suyx5int"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd" id="1_wju8u"]
+
+[node name="RowReadOnly" type="HBoxContainer" node_paths=PackedStringArray("ledit")]
+script = ExtResource("1_wju8u")
+ledit = NodePath("LineEdit")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value1"
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Disabled"
+editable = false
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_string.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_string.tscn
new file mode 100644
index 0000000..f93055a
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_string.tscn
@@ -0,0 +1,17 @@
+[gd_scene load_steps=2 format=3 uid="uid://b4jxqh4ysyodt"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_string.gd" id="1_7ybqm"]
+
+[node name="RowString" type="HBoxContainer" node_paths=PackedStringArray("line_edit")]
+script = ExtResource("1_7ybqm")
+line_edit = NodePath("LineEdit")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value3"
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "string value..."
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui.gd
new file mode 100644
index 0000000..fc1d0fc
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui.gd
@@ -0,0 +1,16 @@
+extends HBoxContainer
+
+var name_label:Label:
+ get: return get_node("VName")
+
+signal ui_val_changed(val)
+
+func get_ui_val():
+ return null
+
+func update_ui(val):
+ pass
+
+#stop sync if is active(eg. a line edit node is in focus)
+func is_active() -> bool:
+ return false
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui.gd.uid
new file mode 100644
index 0000000..3cd38d1
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui.gd.uid
@@ -0,0 +1 @@
+uid://8hf0oxasj7ib
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd
new file mode 100644
index 0000000..04a4e59
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd
@@ -0,0 +1,32 @@
+extends "./row_ui.gd"
+
+@export var label_btn:Button
+
+func get_ui_val() -> bool:
+ return label_btn.button_pressed
+
+func update_ui(val:bool):
+ label_btn.button_pressed = val
+ if val:
+ label_btn.text = "[x] ON"
+ set_font_color(label_btn, Color("#3ab38f"))
+ else:
+ label_btn.text = "[ ] OFF"
+ set_font_color(label_btn, Color("#b25566"))
+
+# wtf
+static func set_font_color(node, color):
+ node.set("theme_override_colors/font_color", color)
+ node.set("theme_override_colors/font_pressed_color", color)
+ node.set("theme_override_colors/font_hover_color", color)
+ node.set("theme_override_colors/font_focus_color", color)
+ node.set("theme_override_colors/font_disabled_color", color)
+ node.set("theme_override_colors/font_hover_pressed_color", color)
+ node.set("theme_override_colors/font_outline_color", color)
+
+func _ready():
+ update_ui(false)
+ label_btn.toggled.connect(
+ func(_s):
+ ui_val_changed.emit(get_ui_val())
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd.uid
new file mode 100644
index 0000000..ded2803
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_bool.gd.uid
@@ -0,0 +1 @@
+uid://chucvwlqhy8tt
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_color.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_color.gd
new file mode 100644
index 0000000..4201c5d
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_color.gd
@@ -0,0 +1,31 @@
+extends "./row_ui.gd"
+
+@export var line_edit:LineEdit
+@export var color_picker_button:ColorPickerButton
+
+func get_ui_val() -> Color:
+ return color_picker_button.color
+
+func update_ui(val:Color):
+ color_picker_button.color = val
+ line_edit.text = color_picker_button.color.to_html().to_upper()
+
+func is_active() -> bool:
+ return line_edit.has_focus() or color_picker_button.has_focus()
+
+func _ready():
+ color_picker_button.color_changed.connect(
+ func(c:Color):
+ line_edit.text = color_picker_button.color.to_html().to_upper()
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit.text_submitted.connect(
+ func(s:String):
+ color_picker_button.color = Color(s)
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit.focus_exited.connect(
+ func():
+ color_picker_button.color = Color(line_edit.text)
+ ui_val_changed.emit(get_ui_val())
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_color.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_color.gd.uid
new file mode 100644
index 0000000..d2c75cf
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_color.gd.uid
@@ -0,0 +1 @@
+uid://ls0p6ecn3id6
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd
new file mode 100644
index 0000000..365e023
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd
@@ -0,0 +1,9 @@
+extends HBoxContainer
+
+@export var label:Label
+
+func _ready():
+ $PankuButton.pressed.connect(
+ func():
+ Panku.notify(label.text)
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd.uid
new file mode 100644
index 0000000..f695b24
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_comment.gd.uid
@@ -0,0 +1 @@
+uid://djxgjkmqubfbj
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd
new file mode 100644
index 0000000..7c1accb
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd
@@ -0,0 +1,25 @@
+extends "./row_ui.gd"
+
+@export var opt_btn:OptionButton
+
+func update_ui(val):
+ opt_btn.select(val)
+
+func is_active():
+ return opt_btn.has_focus()
+
+func _ready():
+ opt_btn.item_selected.connect(
+ func(index:int):
+ ui_val_changed.emit(index)
+ )
+
+ # wtf, transparent background is a mess
+ var popup := opt_btn.get_popup()
+ popup.transparent_bg = true
+ popup.transparent = true
+
+func setup(params := []):
+ opt_btn.clear()
+ for p in params:
+ opt_btn.add_item(p)
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd.uid
new file mode 100644
index 0000000..b2ea2f4
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_enum.gd.uid
@@ -0,0 +1 @@
+uid://cuh624kee7s2u
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_float.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_float.gd
new file mode 100644
index 0000000..9e62d0d
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_float.gd
@@ -0,0 +1,29 @@
+extends "./row_ui.gd"
+
+@export var line_edit:LineEdit
+@export var joystick_button:PankuButton
+
+func get_ui_val():
+ return line_edit.text.to_float()
+
+func update_ui(val:float):
+ line_edit.text = str(val)
+
+func is_active() -> bool:
+ return line_edit.has_focus()
+
+func _ready():
+ line_edit.text_submitted.connect(
+ func(_s):
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit.focus_exited.connect(
+ func():
+ ui_val_changed.emit(get_ui_val())
+ )
+ var j_button = joystick_button
+ j_button.value_changed.connect(
+ func(delta:Vector2):
+ update_ui(get_ui_val() + delta.x)
+ ui_val_changed.emit(get_ui_val())
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_float.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_float.gd.uid
new file mode 100644
index 0000000..17358f0
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_float.gd.uid
@@ -0,0 +1 @@
+uid://bj6neep1yo03w
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_int.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_int.gd
new file mode 100644
index 0000000..bed1d9a
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_int.gd
@@ -0,0 +1,34 @@
+extends "./row_ui.gd"
+
+@export var line_edit:LineEdit
+@export var button_inc:PankuButton
+@export var button_dec:PankuButton
+
+func get_ui_val():
+ return line_edit.text.to_int()
+
+func update_ui(val:float):
+ line_edit.text = str(val)
+
+func is_active() -> bool:
+ return line_edit.has_focus()
+
+func _ready():
+ line_edit.text_submitted.connect(
+ func(_s):
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit.focus_exited.connect(
+ func():
+ ui_val_changed.emit(get_ui_val())
+ )
+ button_inc.pressed.connect(
+ func():
+ update_ui(get_ui_val() + 1)
+ ui_val_changed.emit(get_ui_val())
+ )
+ button_dec.pressed.connect(
+ func():
+ update_ui(get_ui_val() - 1)
+ ui_val_changed.emit(get_ui_val())
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_int.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_int.gd.uid
new file mode 100644
index 0000000..baec4d3
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_int.gd.uid
@@ -0,0 +1 @@
+uid://d11t8s1k4xj8l
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd
new file mode 100644
index 0000000..dbf6804
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd
@@ -0,0 +1,65 @@
+extends "./row_ui.gd"
+
+@export var slider:HSlider
+@export var ledit:LineEdit
+
+#Copied from the docs.
+
+#Hints that an int or float property should be within a range specified via the hint string "min,max" or "min,max,step". The hint string can optionally include "or_greater" and/or "or_less" to allow manual input going respectively above the max or below the min values.
+#
+#Example: "-360,360,1,or_greater,or_less".
+#
+#Additionally, other keywords can be included: "exp" for exponential range editing, "radians" for editing radian angles in degrees, "degrees" to hint at an angle and "hide_slider" to hide the slider.
+
+const properties = {
+ "or_greater": "allow_greater",
+ "or_less": "allow_lesser",
+ "exp": "exp_edit",
+# "radians",
+# "degrees",
+# "hide_slider"
+}
+
+func setup(data_type:int, params := []):
+ if params.size() >= 2:
+ slider.min_value = params[0].to_float()
+ slider.max_value = params[1].to_float()
+ for i in range(2, params.size()):
+ if i == 2 and !(params[2] in properties):
+ slider.step = params[2].to_float()
+ continue
+ if params[i] in properties:
+ slider.set(properties[params[i]], true)
+
+ #set default step if not specified
+ if params.size() == 2:
+ if data_type == TYPE_INT:
+ slider.step = 1
+ slider.rounded = true
+ elif data_type == TYPE_FLOAT:
+ slider.step = (slider.max_value - slider.min_value) / 100.0
+
+func _ready():
+
+ ledit.text_submitted.connect(
+ func(new_text):
+ ui_val_changed.emit(new_text)
+ slider.value = new_text.to_float()
+ )
+ ledit.focus_exited.connect(
+ func():
+ ui_val_changed.emit(ledit.text)
+ slider.value = ledit.text.to_float()
+ )
+ slider.value_changed.connect(
+ func(val):
+ ui_val_changed.emit(slider.value)
+ ledit.text = str(val)
+ )
+
+func update_ui(val):
+ ledit.text = str(val)
+ slider.value = val
+
+func is_active() -> bool:
+ return ledit.has_focus()
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd.uid
new file mode 100644
index 0000000..7583742
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_range_number.gd.uid
@@ -0,0 +1 @@
+uid://i2ex7bskjf4s
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd
new file mode 100644
index 0000000..99eb183
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd
@@ -0,0 +1,6 @@
+extends "./row_ui.gd"
+
+@export var ledit:LineEdit
+
+func update_ui(val):
+ ledit.text = str(val)
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd.uid
new file mode 100644
index 0000000..efacc18
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_readonly.gd.uid
@@ -0,0 +1 @@
+uid://dn81pg2pujviw
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_string.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_string.gd
new file mode 100644
index 0000000..efefe23
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_string.gd
@@ -0,0 +1,22 @@
+extends "./row_ui.gd"
+
+@export var line_edit:LineEdit
+
+func get_ui_val() -> String:
+ return line_edit.text
+
+func update_ui(val:String):
+ line_edit.text = val
+
+func is_active() -> bool:
+ return line_edit.has_focus()
+
+func _ready():
+ line_edit.text_submitted.connect(
+ func(_s):
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit.focus_exited.connect(
+ func():
+ ui_val_changed.emit(get_ui_val())
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_string.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_string.gd.uid
new file mode 100644
index 0000000..2e62421
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_string.gd.uid
@@ -0,0 +1 @@
+uid://bug02v22oeaqq
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd b/source/addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd
new file mode 100644
index 0000000..82c6bb9
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd
@@ -0,0 +1,40 @@
+extends "./row_ui.gd"
+
+@export var line_edit_x:LineEdit
+@export var line_edit_y:LineEdit
+@export var joystick_button:PankuButton
+
+func get_ui_val():
+ return Vector2(
+ line_edit_x.text.to_float(),
+ line_edit_y.text.to_float())
+
+func update_ui(val:Vector2):
+ line_edit_x.text = str(val.x)
+ line_edit_y.text = str(val.y)
+
+func is_active() -> bool:
+ return line_edit_x.has_focus() or line_edit_y.has_focus()
+
+func _ready():
+ line_edit_x.text_submitted.connect(
+ func(_s):
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit_y.text_submitted.connect(
+ func(_s):
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit_x.focus_exited.connect(
+ func():
+ ui_val_changed.emit(get_ui_val())
+ )
+ line_edit_y.focus_exited.connect(
+ func(): ui_val_changed.emit(get_ui_val())
+ )
+ var j_button = joystick_button
+ j_button.value_changed.connect(
+ func(delta:Vector2):
+ update_ui(get_ui_val() + delta)
+ ui_val_changed.emit(get_ui_val())
+ )
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd.uid b/source/addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd.uid
new file mode 100644
index 0000000..baa6f3a
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd.uid
@@ -0,0 +1 @@
+uid://dffdnex4shsj2
diff --git a/source/addons/panku_console/modules/data_controller/exporter/row_vec_2.tscn b/source/addons/panku_console/modules/data_controller/exporter/row_vec_2.tscn
new file mode 100644
index 0000000..84a5b03
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/exporter/row_vec_2.tscn
@@ -0,0 +1,45 @@
+[gd_scene load_steps=5 format=3 uid="uid://cj0urmvj2rtas"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/row_ui_vec2.gd" id="1_s5o20"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="2_4ivrv"]
+[ext_resource type="Texture2D" uid="uid://b22jdciwq07ic" path="res://addons/panku_console/res/icons2/open_with.svg" id="2_8vcdr"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/data_controller/exporter/joystick_button.gd" id="3_bw70a"]
+
+[node name="RowVec2" type="HBoxContainer" node_paths=PackedStringArray("line_edit_x", "line_edit_y", "joystick_button")]
+script = ExtResource("1_s5o20")
+line_edit_x = NodePath("LineEdit")
+line_edit_y = NodePath("LineEdit2")
+joystick_button = NodePath("PankuButton")
+
+[node name="VName" type="Label" parent="."]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+text = "value3"
+
+[node name="Label" type="Label" parent="."]
+layout_mode = 2
+text = "x"
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="Label2" type="Label" parent="."]
+layout_mode = 2
+text = "y"
+
+[node name="LineEdit2" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PankuButton" parent="." instance=ExtResource("2_4ivrv")]
+layout_mode = 2
+script = ExtResource("3_bw70a")
+
+[node name="TextureRect" parent="PankuButton/HBoxContainer" index="0"]
+texture = ExtResource("2_8vcdr")
+
+[node name="Label" parent="PankuButton/HBoxContainer" index="1"]
+text = ""
+
+[editable path="PankuButton"]
diff --git a/source/addons/panku_console/modules/data_controller/module.gd b/source/addons/panku_console/modules/data_controller/module.gd
new file mode 100644
index 0000000..71fce17
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/module.gd
@@ -0,0 +1,22 @@
+class_name PankuModuleDataController extends PankuModule
+
+const exporter_prefab = preload("./exporter/exporter_2.tscn")
+
+func init_module():
+ core.create_data_controller_window = add_data_controller_window
+ core.new_expression_entered.connect(
+ func(exp:String, result):
+ if !result["failed"] and result["result"] is Object:
+ var window = add_data_controller_window([result["result"]])
+ window.set_window_title_text(exp)
+ if window.get_content().is_empty():
+ window.queue_free()
+ )
+
+func add_data_controller_window(objs:Array) -> PankuLynxWindow:
+ var data_controller = exporter_prefab.instantiate()
+ data_controller.objects = objs
+ var new_window:PankuLynxWindow = core.windows_manager.create_window(data_controller)
+ new_window.position = new_window.get_layout_position(Control.PRESET_BOTTOM_RIGHT)
+ new_window.move_to_front()
+ return new_window
diff --git a/source/addons/panku_console/modules/data_controller/module.gd.uid b/source/addons/panku_console/modules/data_controller/module.gd.uid
new file mode 100644
index 0000000..b2df867
--- /dev/null
+++ b/source/addons/panku_console/modules/data_controller/module.gd.uid
@@ -0,0 +1 @@
+uid://dmlufb7dvw1dh
diff --git a/source/addons/panku_console/modules/engine_tools/env.gd b/source/addons/panku_console/modules/engine_tools/env.gd
new file mode 100644
index 0000000..e13f6ba
--- /dev/null
+++ b/source/addons/panku_console/modules/engine_tools/env.gd
@@ -0,0 +1,33 @@
+var _module:PankuModule
+
+const _HELP_toggle_fullscreen = "Toggle [fullscreen / windowed] mode"
+func toggle_fullscreen() -> void:
+ _module.toggle_fullscreen()
+
+const _HELP_set_time_scale = "Equals to [color=green]Engine.time_scale[/color]"
+func set_time_scale(val:float) -> void:
+ _module.set_time_scale(val)
+
+const _HELP_get_performance_info = "Show performance info"
+func get_performance_info() -> String:
+ return _module.get_performance_info()
+
+const _HELP_take_screenshot = "Take a screenshot of current window"
+func take_screenshot() -> void:
+ _module.take_screenshot()
+
+const _HELP_quit = "Quit application"
+func quit() -> void:
+ _module.quit()
+
+const _HELP_toggle_2d_collision_shape_visibility = "Toggle visibility of 2D collision shapes, useful for debugging"
+func toggle_2d_collision_shape_visibility() -> void:
+ _module.toggle_2d_collision_shape_visibility()
+
+const _HELP_toggle_3d_collision_shape_visibility = "Toggle visibility of 3D collision shapes, useful for debugging"
+func toggle_3d_collision_shape_visibility() -> void:
+ _module.toggle_3d_collision_shape_visibility()
+
+const _HELP_reload_current_scene = "Reload current scene"
+func reload_current_scene() -> void:
+ _module.reload_current_scene()
diff --git a/source/addons/panku_console/modules/engine_tools/env.gd.uid b/source/addons/panku_console/modules/engine_tools/env.gd.uid
new file mode 100644
index 0000000..60c692c
--- /dev/null
+++ b/source/addons/panku_console/modules/engine_tools/env.gd.uid
@@ -0,0 +1 @@
+uid://v6mgqpax77th
diff --git a/source/addons/panku_console/modules/engine_tools/module.gd b/source/addons/panku_console/modules/engine_tools/module.gd
new file mode 100644
index 0000000..ffd6fd8
--- /dev/null
+++ b/source/addons/panku_console/modules/engine_tools/module.gd
@@ -0,0 +1,79 @@
+class_name PankuModuleEngineTools extends PankuModule
+
+func toggle_fullscreen() -> void:
+ if DisplayServer.window_get_mode() != DisplayServer.WINDOW_MODE_WINDOWED:
+ DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
+ else:
+ DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
+ core.notify("Fullscreen: " + str(DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN))
+
+func set_time_scale(val:float) -> void:
+ Engine.time_scale = val
+
+func get_performance_info() -> String:
+ return "FPS: %d | Mem: %.2fMB | Objs: %d" % [Engine.get_frames_per_second(), OS.get_static_memory_usage()/1048576.0, Performance.get_monitor(Performance.OBJECT_COUNT)]
+
+func take_screenshot() -> void:
+ var image = core.get_viewport().get_texture().get_image()
+ var time = str(int(Time.get_unix_time_from_system() * 1000.0))
+ var file_name = "screenshot_%s.png" % time
+ var path = "user://".path_join(file_name)
+ var real_path = OS.get_user_data_dir().path_join(file_name)
+ image.save_png(path)
+ core.notify("[b]Screenshot[/b] saved at [color=green][url=%s]%s[/url][/color]" % [real_path, real_path])
+
+func quit() -> void:
+ core.get_tree().root.propagate_notification(core.NOTIFICATION_WM_CLOSE_REQUEST)
+ core.get_tree().quit()
+
+# Currently godot can't toggle visibility of 2D collision shapes at runtime, this is a workaround.
+# See https://github.com/godotengine/godot-proposals/issues/2072
+func toggle_2d_collision_shape_visibility() -> void:
+ var tree := core.get_tree()
+ tree.debug_collisions_hint = not tree.debug_collisions_hint
+
+ # Traverse tree to call queue_redraw on instances of
+ # CollisionShape2D and CollisionPolygon2D.
+ var node_stack: Array[Node] = [tree.get_root()]
+ while not node_stack.is_empty():
+ var node: Node = node_stack.pop_back()
+ if is_instance_valid(node):
+ if node is CollisionShape2D or node is CollisionPolygon2D:
+ node.queue_redraw()
+ node_stack.append_array(node.get_children())
+ core.notify("2D Debug Draw: " + str(tree.debug_collisions_hint))
+
+# Currently godot can't toggle visibility of 3D collision shapes at runtime, this is a workaround.
+# See https://github.com/godotengine/godot-proposals/issues/2072
+func toggle_3d_collision_shape_visibility() -> void:
+ var tree: SceneTree = get_tree()
+ # https://github.com/godotengine/godot-proposals/issues/2072
+ tree.debug_collisions_hint = not tree.debug_collisions_hint
+ print("Set show_debug_collisions_hint: ", tree.debug_collisions_hint)
+
+ # Traverse tree to call toggle collision visibility
+ var node_stack: Array[Node] = [tree.get_root()]
+ while not node_stack.is_empty():
+ var node: Node = node_stack.pop_back()
+ if is_instance_valid(node):
+ if node is RayCast3D \
+ or node is CollisionShape3D \
+ or node is CollisionPolygon3D \
+ #or node is CollisionObject3D \ (Doesn't work well with police-mans (they utilize exit_tree()).
+ or node is GPUParticlesCollision3D \
+ or node is GPUParticlesCollisionBox3D \
+ or node is GPUParticlesCollisionHeightField3D \
+ or node is GPUParticlesCollisionSDF3D \
+ or node is GPUParticlesCollisionSphere3D \
+ or node is CSGPrimitive3D:
+ # remove and re-add the node to the tree to force a redraw
+ # https://github.com/godotengine/godot/blob/26b1fd0d842fa3c2f090ead47e8ea7cd2d6515e1/scene/3d/collision_object_3d.cpp#L39
+ var parent: Node = node.get_parent()
+ if parent:
+ parent.remove_child(node)
+ parent.add_child(node)
+ node_stack.append_array(node.get_children())
+
+func reload_current_scene() -> void:
+ core.get_tree().reload_current_scene()
+ core.notify("Scene reloaded")
diff --git a/source/addons/panku_console/modules/engine_tools/module.gd.uid b/source/addons/panku_console/modules/engine_tools/module.gd.uid
new file mode 100644
index 0000000..bae9e86
--- /dev/null
+++ b/source/addons/panku_console/modules/engine_tools/module.gd.uid
@@ -0,0 +1 @@
+uid://c4hoo3g2ew04j
diff --git a/source/addons/panku_console/modules/engine_tools/opt.gd b/source/addons/panku_console/modules/engine_tools/opt.gd
new file mode 100644
index 0000000..7722ee7
--- /dev/null
+++ b/source/addons/panku_console/modules/engine_tools/opt.gd
@@ -0,0 +1,42 @@
+extends ModuleOptions
+
+@export_group("engine_tools")
+
+@export var export_button_toggle_fullscreen := "Toggle Fullscreen"
+
+func toggle_fullscreen():
+ _module.toggle_fullscreen()
+
+@export var export_button_take_screenshot := "Take Screenshot"
+
+func take_screenshot():
+ _module.take_screenshot()
+
+@export var export_button_quit := "Quit"
+
+func quit():
+ _module.quit()
+
+@export var export_button_toggle_2d_debug_draw := "Toggle 2D Debug Draw"
+
+func toggle_2d_debug_draw():
+ _module.toggle_2d_collision_shape_visibility()
+
+@export var export_button_toggle_3d_debug_draw := "Toggle 3D Debug Draw"
+
+func toggle_3d_debug_draw():
+ _module.toggle_3d_collision_shape_visibility()
+
+@export var export_button_reload_current_scene := "Reload Current Scene"
+
+func reload_current_scene():
+ _module.reload_current_scene()
+
+@export_range(0.1, 2.0) var time_scale := 1.0:
+ set(v):
+ time_scale = v
+ _module.set_time_scale(time_scale)
+
+@export var readonly_performance_info:String:
+ get:
+ return _module.get_performance_info()
diff --git a/source/addons/panku_console/modules/engine_tools/opt.gd.uid b/source/addons/panku_console/modules/engine_tools/opt.gd.uid
new file mode 100644
index 0000000..bee4a04
--- /dev/null
+++ b/source/addons/panku_console/modules/engine_tools/opt.gd.uid
@@ -0,0 +1 @@
+uid://b81mqk1oee6tv
diff --git a/source/addons/panku_console/modules/expression_monitor/env.gd b/source/addons/panku_console/modules/expression_monitor/env.gd
new file mode 100644
index 0000000..0ac9d50
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/env.gd
@@ -0,0 +1,4 @@
+var _module:PankuModule
+
+func open_window():
+ _module.open_window()
diff --git a/source/addons/panku_console/modules/expression_monitor/env.gd.uid b/source/addons/panku_console/modules/expression_monitor/env.gd.uid
new file mode 100644
index 0000000..2c706fe
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/env.gd.uid
@@ -0,0 +1 @@
+uid://dgp4vd4o3dska
diff --git a/source/addons/panku_console/modules/expression_monitor/expression_item.gd b/source/addons/panku_console/modules/expression_monitor/expression_item.gd
new file mode 100644
index 0000000..7be43d1
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/expression_item.gd
@@ -0,0 +1,33 @@
+extends Control
+
+signal expr_changed(new_expr:String)
+signal removing
+
+@export var x_btn:Button
+@export var ledit:LineEdit
+@export var label:Label
+
+func set_result(text:String):
+ label.text = text
+ label.get_parent().visible = (text != "")
+
+func set_expr(text:String):
+ ledit.text = text
+
+func get_expr() -> String:
+ return ledit.text
+
+func _ready():
+ x_btn.pressed.connect(
+ func():
+ removing.emit()
+ queue_free()
+ )
+ ledit.focus_exited.connect(
+ func():
+ expr_changed.emit(ledit.text)
+ )
+ ledit.text_submitted.connect(
+ func(new_text:String):
+ expr_changed.emit(new_text)
+ )
diff --git a/source/addons/panku_console/modules/expression_monitor/expression_item.gd.uid b/source/addons/panku_console/modules/expression_monitor/expression_item.gd.uid
new file mode 100644
index 0000000..0c7a73e
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/expression_item.gd.uid
@@ -0,0 +1 @@
+uid://d30sey6o0hufm
diff --git a/source/addons/panku_console/modules/expression_monitor/expression_item.tscn b/source/addons/panku_console/modules/expression_monitor/expression_item.tscn
new file mode 100644
index 0000000..21d307c
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/expression_item.tscn
@@ -0,0 +1,46 @@
+[gd_scene load_steps=4 format=3 uid="uid://om8bp40jo1e"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/expression_monitor/expression_item.gd" id="1_dnu23"]
+[ext_resource type="Texture2D" uid="uid://8g5afcuanbl6" path="res://addons/panku_console/res/icons2/close.svg" id="2_bc3ds"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="3_n03xa"]
+
+[node name="VBoxContainer" type="VBoxContainer" node_paths=PackedStringArray("x_btn", "ledit", "label")]
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 31.0
+grow_horizontal = 2
+size_flags_horizontal = 3
+script = ExtResource("1_dnu23")
+x_btn = NodePath("expression_item/PankuButton/Button")
+ledit = NodePath("expression_item/LineEdit")
+label = NodePath("HBoxContainer/Label")
+
+[node name="expression_item" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="PankuButton" parent="expression_item" instance=ExtResource("3_n03xa")]
+layout_mode = 2
+
+[node name="TextureRect" parent="expression_item/PankuButton/HBoxContainer" index="0"]
+texture = ExtResource("2_bc3ds")
+
+[node name="LineEdit" type="LineEdit" parent="expression_item"]
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "Input expression here..."
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+visible = false
+layout_mode = 2
+
+[node name="ColorRect" type="ColorRect" parent="HBoxContainer"]
+custom_minimum_size = Vector2(8, 0)
+layout_mode = 2
+color = Color(0.239216, 0.533333, 0.886275, 0.752941)
+
+[node name="Label" type="Label" parent="HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+autowrap_mode = 1
+
+[editable path="expression_item/PankuButton"]
diff --git a/source/addons/panku_console/modules/expression_monitor/expression_monitor2.gd b/source/addons/panku_console/modules/expression_monitor/expression_monitor2.gd
new file mode 100644
index 0000000..54902dc
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/expression_monitor2.gd
@@ -0,0 +1,24 @@
+extends Control
+
+@onready var monitor_groups_ui := $SmoothScrollContainer/HBoxContainer/Control/MonitorGroupsUI
+
+var _module:PankuModule
+
+func _physics_process(delta: float) -> void:
+ if Engine.get_physics_frames() % 10 != 1:
+ return
+ if !is_visible_in_tree():
+ return
+
+ var exprss = monitor_groups_ui.get_expressions_by_group()
+ var resultss = []
+ for exprs in exprss:
+ var results = []
+ for expr in exprs:
+ if expr == "":
+ continue
+ var eval_result_dict = _module.core.gd_exprenv.execute(expr)
+ var eval_result:String = str(eval_result_dict["result"])
+ results.append(eval_result)
+ resultss.append(results)
+ monitor_groups_ui.set_results_by_group(resultss)
diff --git a/source/addons/panku_console/modules/expression_monitor/expression_monitor2.gd.uid b/source/addons/panku_console/modules/expression_monitor/expression_monitor2.gd.uid
new file mode 100644
index 0000000..42fef47
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/expression_monitor2.gd.uid
@@ -0,0 +1 @@
+uid://c82duqjkfdhqp
diff --git a/source/addons/panku_console/modules/expression_monitor/expression_monitor2.tscn b/source/addons/panku_console/modules/expression_monitor/expression_monitor2.tscn
new file mode 100644
index 0000000..abf8b5c
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/expression_monitor2.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=4 format=3 uid="uid://biuybfe60pr4u"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/expression_monitor/expression_monitor2.gd" id="1_ha27e"]
+[ext_resource type="PackedScene" uid="uid://dyq4rjkkjs55d" path="res://addons/panku_console/common/smooth_scroll/smooth_scroll.tscn" id="2_6rd5x"]
+[ext_resource type="PackedScene" uid="uid://ctgf7kewoa1cn" path="res://addons/panku_console/modules/expression_monitor/monitor_groups_ui.tscn" id="2_sa5u0"]
+
+[node name="expression_monitor2" type="Control"]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_ha27e")
+
+[node name="SmoothScrollContainer" parent="." instance=ExtResource("2_6rd5x")]
+layout_mode = 1
+
+[node name="MonitorGroupsUI" parent="SmoothScrollContainer/HBoxContainer/Control" index="0" instance=ExtResource("2_sa5u0")]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_right = 0.0
+offset_bottom = 0.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[editable path="SmoothScrollContainer"]
diff --git a/source/addons/panku_console/modules/expression_monitor/module.gd b/source/addons/panku_console/modules/expression_monitor/module.gd
new file mode 100644
index 0000000..7c5a827
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/module.gd
@@ -0,0 +1,29 @@
+class_name PankuModuleExpressionMonitor extends PankuModule
+
+var monitor
+var monitor_window:PankuLynxWindow
+
+func init_module():
+ init_monitor_window()
+ load_window_data(monitor_window)
+ monitor.monitor_groups_ui.load_persistent_data(load_module_data("monitor_data", [{
+ "group_name": "default group",
+ "expressions": []
+ }]))
+
+func quit_module():
+ super.quit_module()
+ save_window_data(monitor_window)
+ save_module_data("monitor_data", monitor.monitor_groups_ui.get_persistent_data())
+
+func init_monitor_window():
+ monitor = preload("./expression_monitor2.tscn").instantiate()
+ monitor._module = self
+# monitor.set_data(load_module_data("exprs", []))
+ monitor_window = core.windows_manager.create_window(monitor)
+ add_auto_save_hook(monitor_window)
+ monitor_window.queue_free_on_close = false
+ monitor_window.set_window_title_text("Expression Monitor")
+
+func open_window():
+ monitor_window.show_window()
diff --git a/source/addons/panku_console/modules/expression_monitor/module.gd.uid b/source/addons/panku_console/modules/expression_monitor/module.gd.uid
new file mode 100644
index 0000000..6ef822d
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/module.gd.uid
@@ -0,0 +1 @@
+uid://dyi0mp3pjh47r
diff --git a/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd b/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd
new file mode 100644
index 0000000..ed14634
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd
@@ -0,0 +1,133 @@
+extends VBoxContainer
+
+signal group_move_up
+signal group_move_down
+
+const exp_item_ui_prefab:PackedScene = preload("./expression_item.tscn")
+const play_icon:Texture2D = preload("res://addons/panku_console/res/icons2/play-1001-svgrepo-com.svg")
+const pause_icon:Texture2D = preload("res://addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg")
+const expand_icon:Texture2D = preload("res://addons/panku_console/res/icons2/chevron_right.svg")
+const collapse_icon:Texture2D = preload("res://addons/panku_console/res/icons2/expand_more.svg")
+
+@onready var group_toggle_button:Button = $GroupManager/ToggleButton
+@onready var rename_line_edit:LineEdit = $GroupManager/RenameLineEdit
+@onready var state_control_button:PankuButton = $GroupManager/StateControlButton
+@onready var rename_button:PankuButton = $GroupManager/RenameButton
+@onready var confirm_rename_button:PankuButton = $GroupManager/ConfirmRenameButton
+@onready var cancel_rename_button:PankuButton = $GroupManager/CancelRenameButton
+@onready var move_up_button:PankuButton = $GroupManager/MoveUpButton
+@onready var move_down_button:PankuButton = $GroupManager/MoveDownButton
+
+@onready var exp_body_container:Control = $PanelContainer
+@onready var exp_container:Control = $PanelContainer/VBoxContainer/ExpressionContainer
+@onready var add_exp_button:Button = $PanelContainer/VBoxContainer/AddNewExpressionButton
+@onready var remove_this_group_button:PankuButton = $GroupManager/RemoveButton
+
+@onready var normal_ui_group:Array = [
+ group_toggle_button,
+ state_control_button,
+ rename_button
+]
+
+@onready var edit_ui_group:Array = [
+ rename_line_edit,
+ confirm_rename_button,
+ cancel_rename_button,
+ move_up_button,
+ move_down_button,
+ remove_this_group_button
+]
+
+func _ready():
+ edit_ui_group.map(func(item): item.hide())
+ normal_ui_group.map(func(item): item.show())
+ exp_body_container.hide()
+
+ group_toggle_button.toggle_mode = true
+ group_toggle_button.button_pressed = false
+ group_toggle_button.toggled.connect(
+ func(button_pressed:bool):
+ exp_body_container.visible = button_pressed
+ group_toggle_button.icon = collapse_icon if button_pressed else expand_icon
+ )
+
+ add_exp_button.pressed.connect(
+ func():
+ var exp_item = exp_item_ui_prefab.instantiate()
+ exp_container.add_child(exp_item)
+ )
+
+ state_control_button.button.toggle_mode = true
+ state_control_button.button.button_pressed = false
+ state_control_button.button.toggled.connect(
+ func(button_pressed:bool):
+ state_control_button.icon = pause_icon if button_pressed else play_icon
+ )
+
+ rename_button.pressed.connect(
+ func():
+ edit_ui_group.map(func(item): item.show())
+ normal_ui_group.map(func(item): item.hide())
+ rename_line_edit.text = group_toggle_button.text
+ )
+
+ cancel_rename_button.pressed.connect(
+ func():
+ edit_ui_group.map(func(item): item.hide())
+ normal_ui_group.map(func(item): item.show())
+ )
+
+ confirm_rename_button.pressed.connect(
+ func():
+ edit_ui_group.map(func(item): item.hide())
+ normal_ui_group.map(func(item): item.show())
+ group_toggle_button.text = rename_line_edit.text
+ )
+
+ move_up_button.pressed.connect(
+ func():
+ group_move_up.emit()
+ )
+
+ move_down_button.pressed.connect(
+ func():
+ group_move_down.emit()
+ )
+
+ remove_this_group_button.pressed.connect(queue_free)
+
+ load_persistent_data({
+ "group_name": "Unnamed Group",
+ "expressions": []
+ })
+
+func get_expressions(show_hidden := false) -> Array:
+ # optimization?
+ var exps = []
+ if state_control_button.button.button_pressed or show_hidden:
+ for child in exp_container.get_children():
+ exps.append(child.get_expr())
+ return exps
+
+func set_results(results:Array):
+ if results.size() > exp_container.get_child_count():
+ push_error("unexpected parameters.")
+ return
+ for i in range(results.size()):
+ var result:String = results[i]
+ exp_container.get_child(i).set_result(result)
+
+func get_persistent_data() -> Dictionary:
+ return {
+ "group_name": group_toggle_button.text,
+ "expressions": get_expressions(true)
+ }
+
+func load_persistent_data(data:Dictionary):
+ group_toggle_button.text = data["group_name"]
+ for child in exp_container.get_children():
+ child.queue_free()
+ for exp in data["expressions"]:
+ var exp_item = exp_item_ui_prefab.instantiate()
+ exp_container.add_child(exp_item)
+ exp_item.set_expr(exp)
diff --git a/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd.uid b/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd.uid
new file mode 100644
index 0000000..36d964a
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd.uid
@@ -0,0 +1 @@
+uid://duv7kvvhtwnvw
diff --git a/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.tscn b/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.tscn
new file mode 100644
index 0000000..bceed67
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/monitor_group_ui.tscn
@@ -0,0 +1,145 @@
+[gd_scene load_steps=17 format=3 uid="uid://dlnkho5p7p2aq"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_5nvur"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/expression_monitor/monitor_group_ui.gd" id="1_b5egi"]
+[ext_resource type="Texture2D" uid="uid://ws58gucuygx1" path="res://addons/panku_console/res/icons2/chevron_right.svg" id="1_k5xby"]
+[ext_resource type="Texture2D" uid="uid://ecmevhk0tuas" path="res://addons/panku_console/res/icons2/play-1001-svgrepo-com.svg" id="2_wnb5s"]
+[ext_resource type="Texture2D" uid="uid://2cjvp0dp8ede" path="res://addons/panku_console/res/icons2/check-svgrepo-com.svg" id="3_h1h1v"]
+[ext_resource type="Texture2D" uid="uid://8g5afcuanbl6" path="res://addons/panku_console/res/icons2/close.svg" id="4_2d3kd"]
+[ext_resource type="Texture2D" uid="uid://brf6iwx4r6bdd" path="res://addons/panku_console/res/icons2/rename-svgrepo-com.svg" id="4_3tm8i"]
+[ext_resource type="Gradient" uid="uid://nr65cgweqh8n" path="res://addons/panku_console/res/green_gradient_1d.tres" id="4_gsqii"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="5_6smru"]
+[ext_resource type="Texture2D" uid="uid://d0k813mm5y0d5" path="res://addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg" id="5_xed2e"]
+[ext_resource type="Texture2D" uid="uid://cdxbns8lyctqp" path="res://addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg" id="6_168yw"]
+[ext_resource type="PackedScene" uid="uid://om8bp40jo1e" path="res://addons/panku_console/modules/expression_monitor/expression_item.tscn" id="9_2py4a"]
+[ext_resource type="Texture2D" uid="uid://cngs5d4uosvmt" path="res://addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg" id="10_jdwtu"]
+[ext_resource type="Texture2D" uid="uid://dprpfr0l5xvmu" path="res://addons/panku_console/res/icons2/add.svg" id="10_l2ajq"]
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_c12ue"]
+gradient = ExtResource("4_gsqii")
+width = 128
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fdb5g"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0, 0, 0, 0.12549)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.501961)
+
+[node name="MonitorGroupUI" type="VBoxContainer"]
+offset_right = 431.0
+offset_bottom = 124.0
+theme = ExtResource("1_5nvur")
+script = ExtResource("1_b5egi")
+
+[node name="GroupManager" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="ToggleButton" type="Button" parent="GroupManager"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Default Group"
+icon = ExtResource("1_k5xby")
+flat = true
+alignment = 0
+expand_icon = true
+
+[node name="TextureRect" type="TextureRect" parent="GroupManager/ToggleButton"]
+show_behind_parent = true
+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("GradientTexture1D_c12ue")
+expand_mode = 1
+
+[node name="RenameLineEdit" type="LineEdit" parent="GroupManager"]
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Default Group"
+
+[node name="StateControlButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/StateControlButton/HBoxContainer" index="0"]
+texture = ExtResource("2_wnb5s")
+
+[node name="RenameButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/RenameButton/HBoxContainer" index="0"]
+texture = ExtResource("4_3tm8i")
+
+[node name="ConfirmRenameButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+visible = false
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/ConfirmRenameButton/HBoxContainer" index="0"]
+texture = ExtResource("3_h1h1v")
+
+[node name="CancelRenameButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+visible = false
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/CancelRenameButton/HBoxContainer" index="0"]
+texture = ExtResource("4_2d3kd")
+
+[node name="MoveUpButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+visible = false
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/MoveUpButton/HBoxContainer" index="0"]
+texture = ExtResource("5_xed2e")
+
+[node name="MoveDownButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+visible = false
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/MoveDownButton/HBoxContainer" index="0"]
+texture = ExtResource("6_168yw")
+
+[node name="RemoveButton" parent="GroupManager" instance=ExtResource("5_6smru")]
+layout_mode = 2
+
+[node name="TextureRect" parent="GroupManager/RemoveButton/HBoxContainer" index="0"]
+texture = ExtResource("10_jdwtu")
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_fdb5g")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
+layout_mode = 2
+
+[node name="ExpressionContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"]
+layout_mode = 2
+
+[node name="VBoxContainer" parent="PanelContainer/VBoxContainer/ExpressionContainer" instance=ExtResource("9_2py4a")]
+layout_mode = 2
+
+[node name="VBoxContainer2" parent="PanelContainer/VBoxContainer/ExpressionContainer" instance=ExtResource("9_2py4a")]
+layout_mode = 2
+
+[node name="AddNewExpressionButton" type="Button" parent="PanelContainer/VBoxContainer"]
+layout_mode = 2
+text = "Add New Expression"
+icon = ExtResource("10_l2ajq")
+alignment = 0
+expand_icon = true
+
+[editable path="GroupManager/StateControlButton"]
+[editable path="GroupManager/RenameButton"]
+[editable path="GroupManager/ConfirmRenameButton"]
+[editable path="GroupManager/CancelRenameButton"]
+[editable path="GroupManager/MoveUpButton"]
+[editable path="GroupManager/MoveDownButton"]
+[editable path="GroupManager/RemoveButton"]
diff --git a/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd b/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd
new file mode 100644
index 0000000..c7349e4
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd
@@ -0,0 +1,50 @@
+extends VBoxContainer
+
+const MonitorGroup:GDScript = preload("./monitor_group_ui.gd")
+const group_prefab:PackedScene = preload("./monitor_group_ui.tscn")
+
+@onready var groups_container:Control = $Groups
+@onready var add_group_button:Button = $AddGroupButton
+
+func _ready():
+ add_group_button.pressed.connect(add_group)
+
+func get_expressions_by_group() -> Array:
+ var result := []
+ for child in groups_container.get_children():
+ var group:MonitorGroup = child
+ result.append(group.get_expressions())
+ return result
+
+func set_results_by_group(results:Array):
+ if results.size() > groups_container.get_child_count():
+ push_error("unexpected parameters.")
+ return
+ for i in range(results.size()):
+ groups_container.get_child(i).set_results(results[i])
+
+func add_group() -> MonitorGroup:
+ var group_ui:Node = group_prefab.instantiate()
+ groups_container.add_child(group_ui)
+ group_ui.group_move_up.connect(
+ func():
+ groups_container.move_child(group_ui, group_ui.get_index() - 1)
+ )
+ group_ui.group_move_down.connect(
+ func():
+ groups_container.move_child(group_ui, group_ui.get_index() + 1)
+ )
+ return group_ui
+
+func get_persistent_data() -> Array:
+ var data := []
+ for child in groups_container.get_children():
+ data.append(child.get_persistent_data())
+ return data
+
+func load_persistent_data(data:Array):
+ for child in groups_container.get_children():
+ child.queue_free()
+ for group_data in data:
+ var group_ui = add_group()
+ group_ui.load_persistent_data(group_data)
diff --git a/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd.uid b/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd.uid
new file mode 100644
index 0000000..6de645a
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd.uid
@@ -0,0 +1 @@
+uid://muvc1jw7aig3
diff --git a/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.tscn b/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.tscn
new file mode 100644
index 0000000..3f67e27
--- /dev/null
+++ b/source/addons/panku_console/modules/expression_monitor/monitor_groups_ui.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 format=3 uid="uid://ctgf7kewoa1cn"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd" id="1_8ojgn"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_gc4dk"]
+[ext_resource type="PackedScene" uid="uid://dlnkho5p7p2aq" path="res://addons/panku_console/modules/expression_monitor/monitor_group_ui.tscn" id="1_l15o5"]
+[ext_resource type="Texture2D" uid="uid://dprpfr0l5xvmu" path="res://addons/panku_console/res/icons2/add.svg" id="4_utrvo"]
+
+[node name="MonitorGroupsUI" type="VBoxContainer"]
+offset_right = 411.0
+offset_bottom = 309.0
+theme = ExtResource("1_gc4dk")
+script = ExtResource("1_8ojgn")
+
+[node name="Groups" type="VBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="MonitorGroupUI" parent="Groups" instance=ExtResource("1_l15o5")]
+layout_mode = 2
+
+[node name="MonitorGroupUI2" parent="Groups" instance=ExtResource("1_l15o5")]
+layout_mode = 2
+
+[node name="MonitorGroupUI3" parent="Groups" instance=ExtResource("1_l15o5")]
+layout_mode = 2
+
+[node name="AddGroupButton" type="Button" parent="."]
+layout_mode = 2
+text = "Add New Group"
+icon = ExtResource("4_utrvo")
+alignment = 0
+expand_icon = true
diff --git a/source/addons/panku_console/modules/general_settings/env.gd b/source/addons/panku_console/modules/general_settings/env.gd
new file mode 100644
index 0000000..27c1092
--- /dev/null
+++ b/source/addons/panku_console/modules/general_settings/env.gd
@@ -0,0 +1,4 @@
+var _module:PankuModule
+
+func open():
+ _module.open_settings_window()
diff --git a/source/addons/panku_console/modules/general_settings/env.gd.uid b/source/addons/panku_console/modules/general_settings/env.gd.uid
new file mode 100644
index 0000000..ca3544c
--- /dev/null
+++ b/source/addons/panku_console/modules/general_settings/env.gd.uid
@@ -0,0 +1 @@
+uid://bpo3kl5g267c5
diff --git a/source/addons/panku_console/modules/general_settings/module.gd b/source/addons/panku_console/modules/general_settings/module.gd
new file mode 100644
index 0000000..4d15ea7
--- /dev/null
+++ b/source/addons/panku_console/modules/general_settings/module.gd
@@ -0,0 +1,68 @@
+class_name PankuModuleGeneralSettings extends PankuModule
+
+var window:PankuLynxWindow
+
+func open_settings_window():
+ if window: return
+ # create a new exporter window
+ window = core.create_data_controller_window.call(
+ core.module_manager.get_module_option_objects()
+ )
+ window.set_window_title_text("General Settings")
+ load_window_data(window)
+ window.show_window()
+ window.window_closed.connect(
+ func():
+ save_window_data(window)
+ window = null
+ )
+
+# Taken from https://github.com/godotengine/godot/blob/master/editor/editor_settings.cpp#L1539
+static func get_auto_display_scale() -> float:
+ var flag := false
+ match OS.get_name():
+ "macOS":
+ flag = true
+ "Linux", "FreeBSD", "NetBSD", "OpenBSD", "BSD":
+ if DisplayServer.get_name() == "Wayland":
+ flag = true
+ "Android":
+ flag = true
+ "iOS":
+ flag = true
+ if flag:
+ return DisplayServer.screen_get_max_scale()
+
+ var screen := DisplayServer.window_get_current_screen()
+
+ if (DisplayServer.screen_get_size(screen) == Vector2i()):
+ # Invalid screen size, skip.
+ return 1.0
+
+ # Use the smallest dimension to use a correct display scale on portrait displays.
+ var smallest_dimension = min(DisplayServer.screen_get_size().x, DisplayServer.screen_get_size().y)
+ if DisplayServer.screen_get_dpi(screen) >= 192 and smallest_dimension >= 1400:
+ # hiDPI display.
+ return 2.0
+ elif smallest_dimension >= 1700:
+ # Likely a hiDPI display, but we aren't certain due to the returned DPI.
+ # Use an intermediate scale to handle this situation.
+ return 1.5
+ elif smallest_dimension <= 800:
+ # Small loDPI display. Use a smaller display scale so that editor elements fit more easily.
+ # Icons won't look great, but this is better than having editor elements overflow from its window.
+ return 0.75
+ return 1.0
+
+func init_module():
+ # load settings
+ get_module_opt().window_blur_effect = load_module_data("window_blur_effect", true)
+ get_module_opt().window_base_color = load_module_data("window_base_color", Color("#000c1880"))
+ get_module_opt().enable_os_window = load_module_data("enable_os_window", false)
+ get_module_opt().os_window_bg_color = load_module_data("os_window_bg_color", Color(0, 0, 0, 0))
+ get_module_opt().global_font_size = load_module_data("global_font_size", int(16 * get_auto_display_scale()))
+
+func quit_module():
+ super.quit_module()
+ if window:
+ save_window_data(window)
diff --git a/source/addons/panku_console/modules/general_settings/module.gd.uid b/source/addons/panku_console/modules/general_settings/module.gd.uid
new file mode 100644
index 0000000..a22f38c
--- /dev/null
+++ b/source/addons/panku_console/modules/general_settings/module.gd.uid
@@ -0,0 +1 @@
+uid://b2n3op7w3fopy
diff --git a/source/addons/panku_console/modules/general_settings/opt.gd b/source/addons/panku_console/modules/general_settings/opt.gd
new file mode 100644
index 0000000..348b1d5
--- /dev/null
+++ b/source/addons/panku_console/modules/general_settings/opt.gd
@@ -0,0 +1,49 @@
+extends ModuleOptions
+
+@export_group("general_settings")
+
+@export var window_blur_effect:bool = true:
+ set(v):
+ PankuLynxWindow.lynx_window_shader_material.set("shader_parameter/lod", 4.0 if v else 0.0)
+ get:
+ return PankuLynxWindow.lynx_window_shader_material.get("shader_parameter/lod") > 0.0
+
+@export var window_base_color:Color = Color(0.0, 0.0, 0.0, 0.1):
+ set(v):
+ PankuLynxWindow.lynx_window_shader_material.set("shader_parameter/modulate", v)
+ get:
+ return PankuLynxWindow.lynx_window_shader_material.get("shader_parameter/modulate")
+
+@export var enable_os_window := false:
+ set(v):
+ _module.core.windows_manager.enable_os_popup_btns(v)
+ get:
+ return _module.core.windows_manager.os_popup_btn_enabled
+
+@export var os_window_bg_color:Color:
+ set(v):
+ _module.core.windows_manager.set_os_window_bg_color(v)
+ get:
+ return _module.core.windows_manager.os_window_bg_color
+
+@export var global_font_size:int:
+ set(v):
+ Panku.windows_manager.theme.default_font_size = v
+ get:
+ return Panku.windows_manager.theme.default_font_size
+
+@export var export_comment_auto_global_font_size = (
+ "Adjust global font size automatically according to your device DPI"
+)
+
+@export var export_button_auto_global_font_size := "Auto Global Font Size"
+func auto_global_font_size():
+ global_font_size = int(16 * _module.get_auto_display_scale())
+
+@export var export_button_report_bugs := "Report Bugs"
+func report_bugs():
+ OS.shell_open("https://github.com/Ark2000/PankuConsole/issues")
+
+@export var export_button_suggest_features := "Suggest Features"
+func suggest_features():
+ OS.shell_open("https://github.com/Ark2000/PankuConsole/issues")
diff --git a/source/addons/panku_console/modules/general_settings/opt.gd.uid b/source/addons/panku_console/modules/general_settings/opt.gd.uid
new file mode 100644
index 0000000..2276f15
--- /dev/null
+++ b/source/addons/panku_console/modules/general_settings/opt.gd.uid
@@ -0,0 +1 @@
+uid://irpdfkmuqmuu
diff --git a/source/addons/panku_console/modules/history_manager/env.gd b/source/addons/panku_console/modules/history_manager/env.gd
new file mode 100644
index 0000000..dae4497
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/env.gd
@@ -0,0 +1,4 @@
+var _module:PankuModule
+
+func open() -> void:
+ _module.open_window()
diff --git a/source/addons/panku_console/modules/history_manager/env.gd.uid b/source/addons/panku_console/modules/history_manager/env.gd.uid
new file mode 100644
index 0000000..523c8b2
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/env.gd.uid
@@ -0,0 +1 @@
+uid://d3014lrp36mnf
diff --git a/source/addons/panku_console/modules/history_manager/exp_history.gd b/source/addons/panku_console/modules/history_manager/exp_history.gd
new file mode 100644
index 0000000..8d4b469
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/exp_history.gd
@@ -0,0 +1,206 @@
+extends Control
+
+@onready var console:PankuConsole
+
+const exp_item_prefab = preload("./exp_history_item.tscn")
+const CFG_EXP_HISTORY = "exp_history"
+
+@export var item_container:VBoxContainer
+@export var copy_button:Button
+@export var monitor_button:Button
+@export var favorite_button:Button
+@export var delete_button:Button
+@export var reverse_select_button:Button
+@export var prev_page_button:Button
+@export var next_page_button:Button
+@export var first_page_button:Button
+@export var last_page_button:Button
+@export var page_ledit:LineEdit
+@export var page_label:Label
+
+var current_page := 1
+var all_pages := 1
+var items_per_page := 5
+#[checked:bool, fav:bool, exp:String]
+var item_data := []
+
+func _ready():
+ load_data()
+ copy_button.pressed.connect(copy_selected)
+ monitor_button.pressed.connect(monitor_selected)
+ favorite_button.pressed.connect(star_selected)
+ delete_button.pressed.connect(remove_selected)
+ reverse_select_button.pressed.connect(invert_selected)
+ prev_page_button.pressed.connect(
+ func():
+ current_page -= 1
+ reload()
+ )
+ next_page_button.pressed.connect(
+ func():
+ current_page += 1
+ reload()
+ )
+ first_page_button.pressed.connect(
+ func():
+ current_page = 1;
+ reload()
+ )
+ last_page_button.pressed.connect(
+ func():
+ current_page = 99999999;
+ reload()
+ )
+ page_ledit.text_submitted.connect(
+ func(_new_text:String):
+ current_page = page_ledit.text.to_int()
+ reload()
+ )
+ page_ledit.focus_exited.connect(
+ func():
+ current_page = page_ledit.text.to_int()
+ reload()
+ )
+ create_tween().set_loops().set_process_mode(Tween.TWEEN_PROCESS_PHYSICS).tween_callback(
+ func():
+ if !is_visible_in_tree(): return
+ if item_container.get_child_count() < 1: return
+ var item_height = item_container.get_child(0).size.y
+ var item_gap = item_container.get("theme_override_constants/separation")
+ var container_height = item_container.get_parent().size.y
+ var _items_per_page = floor((container_height + item_gap) / (item_height + item_gap))
+ _items_per_page = max(5, _items_per_page)
+ if _items_per_page != items_per_page:
+ items_per_page = _items_per_page
+ reload()
+ ).set_delay(0.1)
+
+ visibility_changed.connect(
+ func():
+ if is_visible_in_tree(): reload()
+ )
+
+func reload():
+ #calculate pages
+ all_pages = max(1, ceil(1.0 * item_data.size() / items_per_page))
+ current_page = clamp(current_page, 1, all_pages)
+ page_label.text = " / %d" % all_pages
+ page_ledit.text = str(current_page)
+
+ #remove existing list items
+ var start_idx := (current_page - 1) * items_per_page
+ var end_idx := min(start_idx + items_per_page, item_data.size())
+ for c in item_container.get_children():
+ c.queue_free()
+
+ #add new list items
+ for i in range(start_idx, end_idx):
+ var list_item = exp_item_prefab.instantiate()
+ list_item.checkbox.button_pressed = item_data[i][0]
+ list_item.fav_icon.visible = item_data[i][1]
+ list_item.line_edit.text = item_data[i][2]
+ list_item.checkbox.toggled.connect(
+ func(val:bool): item_data[i][0] = val
+ )
+ list_item.line_edit.text_changed.connect(
+ func(val:String): item_data[i][2] = val
+ )
+ item_container.add_child(list_item)
+
+func copy_selected():
+ var result = combine_selected()
+ if result != "":
+ DisplayServer.clipboard_set(result)
+ console.notify("Combined expression has beed added to clipboard!")
+ clear_selected()
+
+func monitor_selected():
+ var result = combine_selected()
+ if result != "":
+ pass
+ # console.add_monitor_window(result, 0.1).centered()
+ clear_selected()
+
+func combine_selected() -> String:
+ var selected_exp = []
+ var combined_exp = ""
+ for d in item_data:
+ if !d[0]: continue
+ selected_exp.append(d[2])
+ if selected_exp.size() > 8:
+ console.notify("Maximum 8 items!")
+ return ""
+ if selected_exp.size() == 0:
+ console.notify("Nothing to copy!")
+ return ""
+ elif selected_exp.size() == 1:
+ combined_exp = selected_exp[0]
+ else:
+ for i in range(selected_exp.size()):
+ selected_exp[i] = "'%s: ' + str(%s)" % [selected_exp[i], selected_exp[i]]
+ combined_exp = " + '\\n' + ".join(PackedStringArray(selected_exp))
+ return combined_exp
+
+func clear_selected():
+ for d in item_data:
+ d[0] = false
+ reload()
+
+func invert_selected():
+ for d in item_data:
+ d[0] = !d[0]
+ reload()
+
+func star_selected():
+ var flag := true
+ for d in item_data:
+ if !d[0]: continue
+ d[1] = !d[1]
+ d[0] = false
+ flag = false
+ if flag:
+ console.notify("No selected items!")
+ return
+
+ #sort favorite
+ var fav_id := 0
+ var fav_items := []
+ var items := []
+ for d in item_data:
+ if d[1]: fav_items.append(d)
+ else: items.append(d)
+ item_data = fav_items + items
+ reload()
+
+func remove_selected():
+ var result = []
+ for d in item_data:
+ if d[0]: continue
+ result.append(d)
+ if item_data.size() == result.size():
+ console.notify("No selected items!")
+ return
+ console.notify("Removed %d items." % (item_data.size() - result.size()))
+ item_data = result
+ reload()
+
+func load_data():
+ #get saved data from cfg
+ var cfg = PankuConfig.get_config()
+ item_data = cfg.get(CFG_EXP_HISTORY, [])
+
+func save_data():
+ var cfg = PankuConfig.get_config()
+ cfg[CFG_EXP_HISTORY] = item_data
+ PankuConfig.set_config(cfg)
+
+func _notification(what):
+ if what == NOTIFICATION_WM_CLOSE_REQUEST:
+ save_data()
+
+func add_history(exp:String):
+ #ignore consecutive same
+ if item_data.size() > 0 and exp == item_data.back()[2]:
+ return
+ item_data.append([false, false, exp])
+ if is_visible_in_tree(): reload()
diff --git a/source/addons/panku_console/modules/history_manager/exp_history.gd.uid b/source/addons/panku_console/modules/history_manager/exp_history.gd.uid
new file mode 100644
index 0000000..dc2c72a
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/exp_history.gd.uid
@@ -0,0 +1 @@
+uid://dmxtorjmpadh4
diff --git a/source/addons/panku_console/modules/history_manager/exp_history.tscn b/source/addons/panku_console/modules/history_manager/exp_history.tscn
new file mode 100644
index 0000000..2c485ef
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/exp_history.tscn
@@ -0,0 +1,149 @@
+[gd_scene load_steps=4 format=3 uid="uid://fladd1y6sa1j"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_q7hjy"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/history_manager/exp_history.gd" id="2_kgk33"]
+[ext_resource type="PackedScene" uid="uid://dhsvbbxqlb1xy" path="res://addons/panku_console/modules/history_manager/exp_history_item.tscn" id="3_wac0s"]
+
+[node name="ExpHistory" type="Control" node_paths=PackedStringArray("item_container", "copy_button", "monitor_button", "favorite_button", "delete_button", "reverse_select_button", "prev_page_button", "next_page_button", "first_page_button", "last_page_button", "page_ledit", "page_label")]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 0
+offset_left = 227.0
+offset_top = 149.0
+offset_right = 634.0
+offset_bottom = 437.0
+theme = ExtResource("1_q7hjy")
+script = ExtResource("2_kgk33")
+item_container = NodePath("VBoxContainer2/Control/ItemContainer")
+copy_button = NodePath("VBoxContainer2/HBoxContainer/CopyButton")
+monitor_button = NodePath("VBoxContainer2/HBoxContainer/MonitorButton")
+favorite_button = NodePath("VBoxContainer2/HBoxContainer/FavoriteButton")
+delete_button = NodePath("VBoxContainer2/HBoxContainer/DeleteButton")
+reverse_select_button = NodePath("VBoxContainer2/HBoxContainer/InvertSelect")
+prev_page_button = NodePath("VBoxContainer2/HBoxContainer2/PrevPageButton")
+next_page_button = NodePath("VBoxContainer2/HBoxContainer2/NextPageButton")
+first_page_button = NodePath("VBoxContainer2/HBoxContainer2/FirstpageButton")
+last_page_button = NodePath("VBoxContainer2/HBoxContainer2/LastPageButton")
+page_ledit = NodePath("VBoxContainer2/HBoxContainer2/PageNumberEdit")
+page_label = NodePath("VBoxContainer2/HBoxContainer2/TotalPageLabel")
+metadata/_edit_vertical_guides_ = [161.838]
+
+[node name="Panel" type="Panel" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="VBoxContainer2" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = -4.0
+offset_bottom = -4.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer2"]
+layout_mode = 2
+
+[node name="CopyButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Copy"
+
+[node name="MonitorButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Monitor"
+
+[node name="FavoriteButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Favorite"
+
+[node name="DeleteButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Delete"
+
+[node name="InvertSelect" type="Button" parent="VBoxContainer2/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Invert Select"
+
+[node name="HSeparator2" type="HSeparator" parent="VBoxContainer2"]
+layout_mode = 2
+
+[node name="Control" type="Control" parent="VBoxContainer2"]
+clip_contents = true
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="ItemContainer" type="VBoxContainer" parent="VBoxContainer2/Control"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_vertical = 3
+theme_override_constants/separation = 2
+
+[node name="ExpItem" parent="VBoxContainer2/Control/ItemContainer" instance=ExtResource("3_wac0s")]
+layout_mode = 2
+
+[node name="ExpItem2" parent="VBoxContainer2/Control/ItemContainer" instance=ExtResource("3_wac0s")]
+layout_mode = 2
+
+[node name="ExpItem3" parent="VBoxContainer2/Control/ItemContainer" instance=ExtResource("3_wac0s")]
+layout_mode = 2
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer2"]
+layout_mode = 2
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer2"]
+layout_mode = 2
+
+[node name="FirstpageButton" type="Button" parent="VBoxContainer2/HBoxContainer2"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "<<<"
+
+[node name="PrevPageButton" type="Button" parent="VBoxContainer2/HBoxContainer2"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "<"
+
+[node name="PageNumberEdit" type="LineEdit" parent="VBoxContainer2/HBoxContainer2"]
+layout_mode = 2
+text = "1"
+
+[node name="TotalPageLabel" type="Label" parent="VBoxContainer2/HBoxContainer2"]
+layout_mode = 2
+text = "/ 10"
+vertical_alignment = 1
+
+[node name="NextPageButton" type="Button" parent="VBoxContainer2/HBoxContainer2"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = ">"
+
+[node name="LastPageButton" type="Button" parent="VBoxContainer2/HBoxContainer2"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = ">>>"
+
+[node name="HFlowContainer" type="HFlowContainer" parent="."]
+layout_mode = 2
+offset_right = 399.0
+size_flags_vertical = 0
diff --git a/source/addons/panku_console/modules/history_manager/exp_history_item.gd b/source/addons/panku_console/modules/history_manager/exp_history_item.gd
new file mode 100644
index 0000000..23c6e27
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/exp_history_item.gd
@@ -0,0 +1,5 @@
+extends HBoxContainer
+
+@export var checkbox:CheckBox
+@export var fav_icon:TextureRect
+@export var line_edit:LineEdit
diff --git a/source/addons/panku_console/modules/history_manager/exp_history_item.gd.uid b/source/addons/panku_console/modules/history_manager/exp_history_item.gd.uid
new file mode 100644
index 0000000..e4eb90e
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/exp_history_item.gd.uid
@@ -0,0 +1 @@
+uid://dv2i716b7b2vb
diff --git a/source/addons/panku_console/modules/history_manager/exp_history_item.tscn b/source/addons/panku_console/modules/history_manager/exp_history_item.tscn
new file mode 100644
index 0000000..a0e3378
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/exp_history_item.tscn
@@ -0,0 +1,27 @@
+[gd_scene load_steps=4 format=3 uid="uid://dhsvbbxqlb1xy"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_rsfup"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/history_manager/exp_history_item.gd" id="2_a3mfr"]
+[ext_resource type="Texture2D" uid="uid://hf6h8otb8qkv" path="res://addons/panku_console/res/icons2/favorite.svg" id="3_1odvn"]
+
+[node name="ExpItem" type="HBoxContainer" node_paths=PackedStringArray("checkbox", "fav_icon", "line_edit")]
+offset_right = 155.0
+offset_bottom = 20.0
+theme = ExtResource("1_rsfup")
+script = ExtResource("2_a3mfr")
+checkbox = NodePath("CheckBox")
+fav_icon = NodePath("TextureRect")
+line_edit = NodePath("LineEdit")
+
+[node name="CheckBox" type="CheckBox" parent="."]
+layout_mode = 2
+flat = true
+
+[node name="TextureRect" type="TextureRect" parent="."]
+layout_mode = 2
+texture = ExtResource("3_1odvn")
+stretch_mode = 3
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
diff --git a/source/addons/panku_console/modules/history_manager/module.gd b/source/addons/panku_console/modules/history_manager/module.gd
new file mode 100644
index 0000000..24a7607
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/module.gd
@@ -0,0 +1,26 @@
+class_name PankuModuleHistoryManager extends PankuModule
+
+var window:PankuLynxWindow
+
+func init_module():
+ # setup ui
+ var ui = preload("./exp_history.tscn").instantiate()
+ ui.console = core
+ core.new_expression_entered.connect(
+ func(expression, result):
+ ui.add_history(expression)
+ )
+
+ # bind window
+ window = core.windows_manager.create_window(ui)
+ add_auto_save_hook(window)
+ window.queue_free_on_close = false
+ window.set_window_title_text("History Manager")
+ load_window_data(window)
+
+func quit_module():
+ super.quit_module()
+ save_window_data(window)
+
+func open_window():
+ window.show_window()
diff --git a/source/addons/panku_console/modules/history_manager/module.gd.uid b/source/addons/panku_console/modules/history_manager/module.gd.uid
new file mode 100644
index 0000000..e86560f
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/module.gd.uid
@@ -0,0 +1 @@
+uid://cwah3j11k3rip
diff --git a/source/addons/panku_console/modules/history_manager/opt.gd b/source/addons/panku_console/modules/history_manager/opt.gd
new file mode 100644
index 0000000..0721510
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/opt.gd
@@ -0,0 +1,7 @@
+extends ModuleOptions
+
+@export_group("history_manager")
+
+@export var export_button_open_window := "Open Window"
+func open_window():
+ _module.open_window()
diff --git a/source/addons/panku_console/modules/history_manager/opt.gd.uid b/source/addons/panku_console/modules/history_manager/opt.gd.uid
new file mode 100644
index 0000000..ee6f520
--- /dev/null
+++ b/source/addons/panku_console/modules/history_manager/opt.gd.uid
@@ -0,0 +1 @@
+uid://dd642rpp7xgpi
diff --git a/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd b/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd
new file mode 100644
index 0000000..5010582
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd
@@ -0,0 +1,29 @@
+extends MarginContainer
+
+@export var rlabel:RichTextLabel
+
+#not sure about the performance
+const MAX_LOGS = 400
+
+func _ready():
+ rlabel.meta_clicked.connect(
+ func(meta):
+ OS.shell_open(meta)
+ )
+
+func add_log(bbcode:String):
+ rlabel.text += (bbcode + "\n")
+
+func clear():
+ rlabel.text = ""
+
+func set_font_size(sz:int):
+ rlabel.set("theme_override_font_sizes/normal_font_size", sz)
+ rlabel.set("theme_override_font_sizes/bold_font_size", sz)
+ rlabel.set("theme_override_font_sizes/italics_font_size", sz)
+ rlabel.set("theme_override_font_sizes/bold_italics_font_size", sz)
+ rlabel.set("theme_override_font_sizes/mono_font_size", sz)
+
+func get_font_size() -> int:
+ #return rlabel.get("theme_override_font_sizes/normal_font_size")
+ return 12
diff --git a/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd.uid b/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd.uid
new file mode 100644
index 0000000..3822e34
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd.uid
@@ -0,0 +1 @@
+uid://lmqymypcyxv2
diff --git a/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.tscn b/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.tscn
new file mode 100644
index 0000000..41232a5
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_logs/console_logs.tscn
@@ -0,0 +1,48 @@
+[gd_scene load_steps=4 format=3 uid="uid://nynkaa0igrh5"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd" id="1_3r4hk"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_b2qej"]
+[ext_resource type="Script" path="res://addons/panku_console/common/smooth_scroll/smooth_scroll.gd" id="2_46ya8"]
+
+[node name="ConsoleLogs" type="MarginContainer" node_paths=PackedStringArray("rlabel")]
+clip_contents = true
+offset_right = 365.0
+offset_bottom = 357.0
+theme = ExtResource("1_b2qej")
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+script = ExtResource("1_3r4hk")
+rlabel = NodePath("SmoothScrollContainer/HBoxContainer/Control/RichTextLabel")
+
+[node name="SmoothScrollContainer" type="PanelContainer" parent="." node_paths=PackedStringArray("clip_container", "scrollbar")]
+self_modulate = Color(1, 1, 1, 0)
+layout_mode = 2
+script = ExtResource("2_46ya8")
+clip_container = NodePath("HBoxContainer/Control")
+scrollbar = NodePath("HBoxContainer/VScrollBar")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="SmoothScrollContainer"]
+layout_mode = 2
+
+[node name="Control" type="Control" parent="SmoothScrollContainer/HBoxContainer"]
+clip_contents = true
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="RichTextLabel" type="RichTextLabel" parent="SmoothScrollContainer/HBoxContainer/Control"]
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+grow_horizontal = 2
+focus_mode = 2
+bbcode_enabled = true
+fit_content = true
+context_menu_enabled = true
+selection_enabled = true
+
+[node name="VScrollBar" type="VScrollBar" parent="SmoothScrollContainer/HBoxContainer"]
+layout_mode = 2
+page = 20.0
+value = 80.0
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/help_bar.tscn b/source/addons/panku_console/modules/interactive_shell/console_ui/help_bar.tscn
new file mode 100644
index 0000000..9582038
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/help_bar.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=2 format=3 uid="uid://cbijhl1nhy64n"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c7j4l"]
+bg_color = Color(0.180392, 0.32549, 0.403922, 1)
+
+[node name="HelpBar" type="PanelContainer"]
+anchors_preset = 12
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = -50.0
+offset_bottom = -26.0
+grow_horizontal = 2
+grow_vertical = 0
+
+[node name="Label" type="Label" parent="."]
+layout_mode = 2
+theme_override_styles/normal = SubResource("StyleBoxFlat_c7j4l")
+text = "[Help] This is hint!"
+vertical_alignment = 1
+clip_text = true
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd b/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd
new file mode 100644
index 0000000..f7e3942
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd
@@ -0,0 +1,54 @@
+extends Control
+
+@onready var _console_logs = $HBoxContainer/Control/VBoxContainer/ConsoleLogs
+@onready var _repl := $REPL
+@onready var side_button_separator:Node = $HBoxContainer/SideButtons/Space
+@onready var side_buttons:Control = $HBoxContainer/SideButtons
+@onready var side_separator:Control = $HBoxContainer/VSeparator
+
+const side_button_packed := preload("res://addons/panku_console/common/panku_button.tscn")
+const side_menu_config_file_path := "res://addons/panku_console/modules/interactive_shell/side_menu_config.json"
+
+var enable_side_menu := true
+
+func _ready() -> void:
+ _repl.output.connect(output)
+
+ var config_str := FileAccess.get_file_as_string(side_menu_config_file_path)
+ var cfg:Dictionary = JSON.parse_string(config_str)
+
+ for item in cfg["items.top"]:
+ add_side_button(item["command"], load(item["icon"]), item["text"])
+ for item in cfg["items.bottom"]:
+ add_side_button(item["command"], load(item["icon"]), item["text"], false)
+
+ resized.connect(
+ func():
+ var vis := side_buttons.get_minimum_size().y < size.y
+ vis = vis and enable_side_menu
+ side_buttons.visible = vis
+ side_separator.visible = vis
+ )
+
+## Output [code]any[/code] to the console
+func output(any):
+ var text = str(any)
+ _console_logs.add_log(text)
+
+func clear_output():
+ _console_logs.clear()
+
+func add_side_button(exp:String, icon:Texture2D, text:String, top:= true):
+ var new_button:PankuButton = side_button_packed.instantiate()
+ new_button.icon = icon
+ side_button_separator.get_parent().add_child(new_button)
+ side_button_separator.get_parent().move_child(
+ new_button,
+ side_button_separator.get_index() + int(!top)
+ )
+ new_button.pressed.connect(
+ func():
+ _repl._module.core.gd_exprenv.execute(exp)
+ )
+ new_button.set_meta("text", " " + text)
+ new_button.text = ""
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd.uid b/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd.uid
new file mode 100644
index 0000000..76ee12f
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd.uid
@@ -0,0 +1 @@
+uid://dwmn0g58audqf
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.tscn b/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.tscn
new file mode 100644
index 0000000..d3bc7b6
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.tscn
@@ -0,0 +1,111 @@
+[gd_scene load_steps=12 format=3 uid="uid://bqfm16y5vcgl3"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_8mhrg"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd" id="1_aab8v"]
+[ext_resource type="PackedScene" uid="uid://nynkaa0igrh5" path="res://addons/panku_console/modules/interactive_shell/console_logs/console_logs.tscn" id="1_jb1ae"]
+[ext_resource type="PackedScene" uid="uid://bme8twac4ick5" path="res://addons/panku_console/modules/interactive_shell/input_field/input_area.tscn" id="2_w7j54"]
+[ext_resource type="PackedScene" uid="uid://b3jf18wonocnv" path="res://addons/panku_console/modules/interactive_shell/hints_list/hints_list.tscn" id="3_qw8p4"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="4_5x5gm"]
+[ext_resource type="PackedScene" uid="uid://ca0bkchv6nsrb" path="res://addons/panku_console/modules/interactive_shell/console_ui/repl.tscn" id="4_ihf0b"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd" id="5_2te5e"]
+[ext_resource type="PackedScene" uid="uid://cbijhl1nhy64n" path="res://addons/panku_console/modules/interactive_shell/console_ui/help_bar.tscn" id="10_0thy6"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd" id="11_epqvn"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_i3l80"]
+bg_color = Color(0.6, 0.6, 0.6, 0.435294)
+border_width_left = 1
+border_color = Color(0.8, 0.8, 0.8, 0.352941)
+
+[node name="PankuConsoleUI" type="Control"]
+clip_contents = true
+custom_minimum_size = Vector2(0, 1)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_8mhrg")
+script = ExtResource("1_aab8v")
+
+[node name="REPL" parent="." node_paths=PackedStringArray("_input_area", "_hints", "_helpbar", "_helpbar_label") instance=ExtResource("4_ihf0b")]
+_input_area = NodePath("../HBoxContainer/Control/VBoxContainer/InputArea")
+_hints = NodePath("../HBoxContainer/Control/Layer2/HintsList")
+_helpbar = NodePath("../HBoxContainer/Control/Layer2/HelpBar")
+_helpbar_label = NodePath("../HBoxContainer/Control/Layer2/HelpBar/Label")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = 0
+
+[node name="SideButtons" type="VBoxContainer" parent="HBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="ControllerButton" parent="HBoxContainer/SideButtons" instance=ExtResource("4_5x5gm")]
+layout_mode = 2
+script = ExtResource("5_2te5e")
+
+[node name="Space" type="Control" parent="HBoxContainer/SideButtons"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="VSeparator" type="VSeparator" parent="HBoxContainer"]
+layout_mode = 2
+theme_override_styles/separator = SubResource("StyleBoxFlat_i3l80")
+
+[node name="Control" type="Control" parent="HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/Control"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = 0
+
+[node name="ConsoleLogs" parent="HBoxContainer/Control/VBoxContainer" instance=ExtResource("1_jb1ae")]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="InputArea" parent="HBoxContainer/Control/VBoxContainer" instance=ExtResource("2_w7j54")]
+layout_mode = 2
+
+[node name="Layer2" type="VBoxContainer" parent="HBoxContainer/Control"]
+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/separation = 0
+alignment = 2
+
+[node name="HintsList" parent="HBoxContainer/Control/Layer2" instance=ExtResource("3_qw8p4")]
+layout_mode = 2
+size_flags_vertical = 3
+mouse_filter = 2
+
+[node name="HelpBar" parent="HBoxContainer/Control/Layer2" instance=ExtResource("10_0thy6")]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="RemoteControl" type="ColorRect" parent="HBoxContainer/Control/Layer2" node_paths=PackedStringArray("target_control")]
+layout_mode = 2
+mouse_filter = 2
+color = Color(1, 0, 0, 0)
+script = ExtResource("11_epqvn")
+target_control = NodePath("../../VBoxContainer/InputArea")
+
+[editable path="HBoxContainer/Control/VBoxContainer/InputArea"]
+[editable path="HBoxContainer/Control/VBoxContainer/InputArea/Button"]
+[editable path="HBoxContainer/Control/Layer2/HelpBar"]
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd b/source/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd
new file mode 100644
index 0000000..01534d5
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd
@@ -0,0 +1,15 @@
+extends Control
+
+@export
+var target_control:Control
+
+func _ready():
+ if not target_control:
+ return
+
+ target_control.resized.connect(
+ func():
+ custom_minimum_size = target_control.get_minimum_size()
+ )
+
+ target_control.resized.emit()
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd.uid b/source/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd.uid
new file mode 100644
index 0000000..edd3dae
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd.uid
@@ -0,0 +1 @@
+uid://uvo41h7xhkjw
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/repl.gd b/source/addons/panku_console/modules/interactive_shell/console_ui/repl.gd
new file mode 100644
index 0000000..f6a63e3
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/repl.gd
@@ -0,0 +1,102 @@
+extends Node
+
+var _module:PankuModule:
+ set(v):
+ _module = v
+ _input_area.input.module = v
+
+@export_subgroup("Dependency")
+@export var _input_area:Control
+@export var _hints:Control
+@export var _helpbar:Control
+@export var _helpbar_label:Control
+
+@export_subgroup("Config")
+@export var show_all_hints_if_input_is_empty := false
+
+signal output(bbcode:String)
+signal output_echo(bbcode:String)
+signal output_result(bbcode:String)
+signal output_error(bbcode:String)
+
+var _current_hints := {}
+var _hint_idx := 0
+func _set_hint_idx(v):
+ _hint_idx = v
+ if _current_hints["hints_value"].size() > 0:
+ v = wrapi(v, 0, _current_hints["hints_value"].size())
+ var k = _current_hints["hints_value"][v]
+
+ #if the bbcode ends with ')',then we believe it is a method
+ #(I know maybe it's a bad practice, but the hinting system needs refactor)
+ var is_method = _current_hints["hints_bbcode"][v].ends_with(")")
+
+ _hint_idx = v
+ _hints.selected = v
+ _input_area.input.text = k + ("()" if is_method else "")
+ _input_area.input.caret_column = k.length() + (1 if is_method else 0)
+ _helpbar_label.text = "[Help] %s" % _module.core.gd_exprenv.get_help_info(k)
+
+func execute(exp:String):
+ exp = exp.lstrip(" ").rstrip(" ")
+ if exp.is_empty():
+ return
+ var echo:String = "[b][You][/b] " + exp
+ output.emit(echo)
+ output_echo.emit(echo)
+ var result = _module.core.gd_exprenv.execute(exp)
+ if !result["failed"]:
+ # ignore the expression result if it is null
+ if result["result"] != null:
+ var result_str:String = str(result["result"])
+ output.emit(result_str)
+ output_result.emit(result_str)
+ else:
+ var error_str:String = "[color=red]%s[/color]"%(result["result"])
+ output.emit(error_str)
+ output_error.emit(error_str)
+ _module.core.new_expression_entered.emit(exp, result)
+
+func _update_hints(exp:String):
+ _current_hints = _module.core.gd_exprenv.parse_exp(exp, show_all_hints_if_input_is_empty)
+ _hints.visible = _current_hints["hints_value"].size() > 0
+ _helpbar.visible = _hints.visible
+ _input_area.input.hints = _current_hints["hints_value"]
+ _hints.set_hints(_current_hints["hints_bbcode"])
+ _hint_idx = -1
+ _helpbar_label.text = "[Hint] Use TAB or up/down to autocomplete!"
+
+func _ready():
+ _input_area.visibility_changed.connect(
+ func():
+ #initialize all hints if is shown and the input is empty
+ if _input_area.visible and _input_area.input.text.is_empty() and !_hints.visible and show_all_hints_if_input_is_empty:
+ _update_hints("")
+ )
+ _input_area.submitted.connect(execute)
+ _input_area.update_hints.connect(_update_hints)
+ _input_area.next_hint.connect(
+ func():
+ _set_hint_idx(_hint_idx + 1)
+ )
+ _input_area.prev_hint.connect(
+ func():
+ if _hint_idx == -1:
+ _hint_idx = 0
+ _set_hint_idx(_hint_idx - 1)
+ )
+ _input_area.navigate_histories.connect(
+ func(histories, id):
+ if histories.size() > 0:
+ _hints.set_hints(histories)
+ _hints.selected = id
+ _hints.visible = true
+ else:
+ _hints.visible = false
+ _helpbar.visible = _hints.visible
+ _helpbar_label.text = "[Hint] Use up/down to navigate through submit histories!"
+
+ )
+
+ _helpbar.hide()
+ _hints.hide()
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/repl.gd.uid b/source/addons/panku_console/modules/interactive_shell/console_ui/repl.gd.uid
new file mode 100644
index 0000000..d72429e
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/repl.gd.uid
@@ -0,0 +1 @@
+uid://dat7sbouxab2
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/repl.tscn b/source/addons/panku_console/modules/interactive_shell/console_ui/repl.tscn
new file mode 100644
index 0000000..1e569af
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/repl.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://ca0bkchv6nsrb"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/console_ui/repl.gd" id="1_dk53o"]
+
+[node name="REPL" type="Node"]
+script = ExtResource("1_dk53o")
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd b/source/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd
new file mode 100644
index 0000000..d16d5c3
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd
@@ -0,0 +1,30 @@
+extends PankuButton
+
+func _ready():
+ super._ready()
+ set_meta("text", " Fold Menu")
+ text = ""
+ var img = Image.new()
+ img.copy_from(icon.get_image())
+ img.flip_x()
+ var unfold_icon = ImageTexture.create_from_image(img)
+ var fold_icon = icon
+
+ icon = unfold_icon
+
+ button.toggle_mode = true
+ button.toggled.connect(
+ func(button_pressed:bool):
+ if button_pressed:
+ icon = fold_icon
+ else:
+ icon = unfold_icon
+
+ for node in get_parent().get_children():
+ if not (node is PankuButton):
+ continue
+ if button_pressed:
+ node.text = node.get_meta("text")
+ else:
+ node.text = ""
+ )
diff --git a/source/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd.uid b/source/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd.uid
new file mode 100644
index 0000000..db4ee0b
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd.uid
@@ -0,0 +1 @@
+uid://bi8y7563r1w64
diff --git a/source/addons/panku_console/modules/interactive_shell/env.gd b/source/addons/panku_console/modules/interactive_shell/env.gd
new file mode 100644
index 0000000..550e482
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/env.gd
@@ -0,0 +1,11 @@
+var _module:PankuModule
+
+func open_window(): _module.open_window()
+
+func open_launcher(): _module.open_launcher()
+
+func set_unified_window_visibility(enabled:bool):
+ _module.set_unified_window_visibility(enabled)
+
+func set_pause_if_popup(enabled:bool):
+ _module.set_pause_if_popup(enabled)
diff --git a/source/addons/panku_console/modules/interactive_shell/env.gd.uid b/source/addons/panku_console/modules/interactive_shell/env.gd.uid
new file mode 100644
index 0000000..a3d3d6a
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/env.gd.uid
@@ -0,0 +1 @@
+uid://bmg4k82upnj6e
diff --git a/source/addons/panku_console/modules/interactive_shell/hints_list/hint.gd b/source/addons/panku_console/modules/interactive_shell/hints_list/hint.gd
new file mode 100644
index 0000000..1e3e7e6
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/hints_list/hint.gd
@@ -0,0 +1,8 @@
+extends PanelContainer
+
+@export var label:RichTextLabel
+@export var bg2:ColorRect
+
+func set_highlight(b:bool):
+ bg2.scale.x = 1.0 if b else 0.0
+ bg2.visible = b
diff --git a/source/addons/panku_console/modules/interactive_shell/hints_list/hint.gd.uid b/source/addons/panku_console/modules/interactive_shell/hints_list/hint.gd.uid
new file mode 100644
index 0000000..1f3ddbd
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/hints_list/hint.gd.uid
@@ -0,0 +1 @@
+uid://jkogv2oic5lq
diff --git a/source/addons/panku_console/modules/interactive_shell/hints_list/hint.tscn b/source/addons/panku_console/modules/interactive_shell/hints_list/hint.tscn
new file mode 100644
index 0000000..4a9750a
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/hints_list/hint.tscn
@@ -0,0 +1,44 @@
+[gd_scene load_steps=5 format=3 uid="uid://dbtn0x604fx5o"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/hints_list/hint.gd" id="1_sa53g"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_56dbv"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6xc2u"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ganpp"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+
+[node name="Hint" type="PanelContainer" node_paths=PackedStringArray("label", "bg2")]
+anchors_preset = 10
+anchor_right = 1.0
+grow_horizontal = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_56dbv")
+script = ExtResource("1_sa53g")
+label = NodePath("RichTextLabel")
+bg2 = NodePath("Bg2")
+
+[node name="Blur" type="ColorRect" parent="."]
+layout_mode = 2
+color = Color(0.219608, 0.219608, 0.223529, 0.658824)
+
+[node name="Bg2" type="ColorRect" parent="."]
+visible = false
+layout_mode = 2
+color = Color(0.290196, 0.509804, 0.305882, 1)
+
+[node name="RichTextLabel" type="RichTextLabel" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+mouse_filter = 2
+theme_override_styles/focus = SubResource("StyleBoxEmpty_6xc2u")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_ganpp")
+bbcode_enabled = true
+text = "[color=cyan]w_button[/color][color=gray]([/color]display_name:[color=green]String[/color], env:[color=green]String[/color], exp:[color=green]String[/color][color=gray])[/color]"
+fit_content = true
+scroll_active = false
+autowrap_mode = 0
diff --git a/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd b/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd
new file mode 100644
index 0000000..e80acf8
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd
@@ -0,0 +1,54 @@
+extends ScrollContainer
+
+const hint_pck = preload("./hint.tscn")
+
+const MAX_HEIGHT = 400
+
+@export var auto_resize := false
+
+@export var container:VBoxContainer
+
+var hints_count = 0
+
+var selected:int = 0:
+ set(v):
+ if !container: return
+ if v < container.get_child_count():
+ if selected < container.get_child_count():
+ container.get_child(selected).set_highlight(false)
+ container.get_child(v).set_highlight(true)
+ selected = v
+
+ #follow selected
+ var bar = get_v_scroll_bar()
+ if bar.visible:
+ var a = bar.max_value
+ var b = bar.value
+ var c = bar.page
+ var d = bar.max_value / hints_count
+ var l = d * selected
+ var r = d * (selected + 1)
+ if b > l: b = l
+ if b + c < r: b = r - c
+ bar.value = b
+
+func set_hints(texts:Array):
+ hints_count = texts.size()
+ for i in range(texts.size()):
+ var h
+ if i < container.get_child_count():
+ h = container.get_child(i)
+ h.show()
+ else:
+ h = hint_pck.instantiate()
+ container.add_child(h)
+ h.set_meta("idx", i)
+ h.label.text = texts[i]
+ h.set_highlight(false)
+ if texts.size() < container.get_child_count():
+ for i in range(texts.size(), container.get_child_count()):
+ container.get_child(i).hide()
+
+ if auto_resize:
+ await get_tree().process_frame
+ custom_minimum_size.y = min(MAX_HEIGHT, container.size.y)
diff --git a/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd.uid b/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd.uid
new file mode 100644
index 0000000..1cb770e
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd.uid
@@ -0,0 +1 @@
+uid://deu7gyviclqkx
diff --git a/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.tscn b/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.tscn
new file mode 100644
index 0000000..16bcdc8
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/hints_list/hints_list.tscn
@@ -0,0 +1,19 @@
+[gd_scene load_steps=2 format=3 uid="uid://b3jf18wonocnv"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd" id="1_yd1qq"]
+
+[node name="HintsList" type="ScrollContainer" node_paths=PackedStringArray("container")]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_yd1qq")
+container = NodePath("VBoxContainer")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_constants/separation = 0
+alignment = 2
diff --git a/source/addons/panku_console/modules/interactive_shell/input_field/input_area.gd b/source/addons/panku_console/modules/interactive_shell/input_field/input_area.gd
new file mode 100644
index 0000000..721b374
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/input_field/input_area.gd
@@ -0,0 +1,34 @@
+extends HBoxContainer
+
+@onready var console:PankuConsole = get_node(PankuConsole.SingletonPath)
+
+signal submitted(exp:String)
+signal update_hints(exp:String)
+signal next_hint()
+signal prev_hint()
+signal navigate_histories(histories:Array, cur:int)
+
+@export var input:LineEdit
+@export var btn:PankuButton
+
+func _ready():
+ input.text_submitted.connect(
+ func(s):
+ submitted.emit(s)
+ )
+ input.text_changed.connect(
+ func(s):
+ update_hints.emit(s)
+ )
+ btn.pressed.connect(
+ func():
+ submitted.emit(input.text)
+ input.on_text_submitted(input.text)
+ )
+
+ #get focus automatically.
+ visibility_changed.connect(
+ func():
+ if is_visible_in_tree():
+ input.call_deferred("grab_focus")
+ )
diff --git a/source/addons/panku_console/modules/interactive_shell/input_field/input_area.gd.uid b/source/addons/panku_console/modules/interactive_shell/input_field/input_area.gd.uid
new file mode 100644
index 0000000..3e14a9a
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/input_field/input_area.gd.uid
@@ -0,0 +1 @@
+uid://cruaokqh6fsku
diff --git a/source/addons/panku_console/modules/interactive_shell/input_field/input_area.tscn b/source/addons/panku_console/modules/interactive_shell/input_field/input_area.tscn
new file mode 100644
index 0000000..15521f5
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/input_field/input_area.tscn
@@ -0,0 +1,41 @@
+[gd_scene load_steps=6 format=3 uid="uid://bme8twac4ick5"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_rocdy"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/input_field/input_area.gd" id="2_6g40s"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="4_6t5yf"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/input_field/input_field.gd" id="4_xjt2l"]
+[ext_resource type="Texture2D" uid="uid://b4jd6tqlie0wx" path="res://addons/panku_console/res/icons2/reply.svg" id="6_w88f1"]
+
+[node name="InputArea" type="HBoxContainer" node_paths=PackedStringArray("input", "btn")]
+offset_right = 277.0
+offset_bottom = 26.0
+theme = ExtResource("1_rocdy")
+theme_override_constants/separation = 0
+script = ExtResource("2_6g40s")
+input = NodePath("InputField")
+btn = NodePath("Button")
+
+[node name="InputField" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+focus_neighbor_left = NodePath(".")
+focus_neighbor_top = NodePath(".")
+focus_neighbor_right = NodePath(".")
+focus_neighbor_bottom = NodePath(".")
+focus_next = NodePath(".")
+focus_previous = NodePath(".")
+placeholder_text = "Input expression here..."
+clear_button_enabled = true
+caret_blink = true
+script = ExtResource("4_xjt2l")
+
+[node name="Button" parent="." instance=ExtResource("4_6t5yf")]
+layout_mode = 2
+
+[node name="TextureRect" parent="Button/HBoxContainer" index="0"]
+texture = ExtResource("6_w88f1")
+
+[node name="Label" parent="Button/HBoxContainer" index="1"]
+text = ""
+
+[editable path="Button"]
diff --git a/source/addons/panku_console/modules/interactive_shell/input_field/input_field.gd b/source/addons/panku_console/modules/interactive_shell/input_field/input_field.gd
new file mode 100644
index 0000000..8ba120f
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/input_field/input_field.gd
@@ -0,0 +1,45 @@
+extends LineEdit
+
+var module:PankuModuleInteractiveShell
+
+#up/down history
+var history_idx := 0
+
+var hints = []
+
+func _ready():
+ text_submitted.connect(on_text_submitted)
+
+func on_text_submitted(s:String):
+ var histories = module.get_histories()
+ if histories.size() > 0 and history_idx < histories.size() and text == histories[history_idx]:
+ pass
+ else:
+ module.add_history(s)
+ history_idx = histories.size()
+ clear()
+
+func _gui_input(e):
+ #navigate through histories
+ var histories = module.get_histories()
+ if hints.is_empty():
+ if e is InputEventKey and e.keycode == KEY_UP and e.pressed:
+ if !histories.is_empty() :
+ history_idx = wrapi(history_idx-1, 0, histories.size())
+ text = histories[history_idx]
+ get_parent().navigate_histories.emit(histories, history_idx)
+ await get_tree().process_frame
+ caret_column = text.length()
+ elif e is InputEventKey and e.keycode == KEY_DOWN and e.pressed:
+ if !histories.is_empty():
+ history_idx = wrapi(history_idx+1, 0, histories.size())
+ text = histories[history_idx]
+ get_parent().navigate_histories.emit(histories, history_idx)
+ await get_tree().process_frame
+ caret_column = text.length()
+ #navigate through hints
+ else:
+ if e is InputEventKey and e.keycode == KEY_UP and e.pressed:
+ get_parent().prev_hint.emit()
+ elif e is InputEventKey and (e.keycode in [KEY_DOWN, KEY_TAB]) and e.pressed:
+ get_parent().next_hint.emit()
diff --git a/source/addons/panku_console/modules/interactive_shell/input_field/input_field.gd.uid b/source/addons/panku_console/modules/interactive_shell/input_field/input_field.gd.uid
new file mode 100644
index 0000000..b1edcf2
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/input_field/input_field.gd.uid
@@ -0,0 +1 @@
+uid://diu1bqw68okm6
diff --git a/source/addons/panku_console/modules/interactive_shell/mini_repl_2.gd b/source/addons/panku_console/modules/interactive_shell/mini_repl_2.gd
new file mode 100644
index 0000000..c74eb05
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/mini_repl_2.gd
@@ -0,0 +1,13 @@
+extends VBoxContainer
+
+var console:PankuConsole
+
+@export var input_area:Node
+@export var repl:Node
+
+func _ready() -> void:
+ repl.output_result.connect(console.notify)
+ repl.output_error.connect(console.notify)
+ input_area.submitted.connect(
+ func(_s): hide()
+ )
diff --git a/source/addons/panku_console/modules/interactive_shell/mini_repl_2.gd.uid b/source/addons/panku_console/modules/interactive_shell/mini_repl_2.gd.uid
new file mode 100644
index 0000000..81325aa
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/mini_repl_2.gd.uid
@@ -0,0 +1 @@
+uid://f1ytdep0f40w
diff --git a/source/addons/panku_console/modules/interactive_shell/mini_repl_2.tscn b/source/addons/panku_console/modules/interactive_shell/mini_repl_2.tscn
new file mode 100644
index 0000000..34d48d5
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/mini_repl_2.tscn
@@ -0,0 +1,61 @@
+[gd_scene load_steps=10 format=3 uid="uid://7782tkm11uco"]
+
+[ext_resource type="PackedScene" uid="uid://bme8twac4ick5" path="res://addons/panku_console/modules/interactive_shell/input_field/input_area.tscn" id="1_cerpp"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/mini_repl_2.gd" id="1_qrxrm"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/interactive_shell/console_ui/repl.gd" id="1_tygtx"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_yfc5r"]
+[ext_resource type="PackedScene" uid="uid://cbijhl1nhy64n" path="res://addons/panku_console/modules/interactive_shell/console_ui/help_bar.tscn" id="2_2k26n"]
+[ext_resource type="Shader" path="res://addons/panku_console/res/shader/simple_fast_blur.gdshader" id="4_djxpe"]
+[ext_resource type="PackedScene" uid="uid://b3jf18wonocnv" path="res://addons/panku_console/modules/interactive_shell/hints_list/hints_list.tscn" id="5_i3ldx"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xty2u"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_kt6ig"]
+shader = ExtResource("4_djxpe")
+shader_parameter/lod = 4.0
+shader_parameter/modulate = Color(0, 0, 0, 0.25098)
+
+[node name="MiniREPL" type="VBoxContainer" node_paths=PackedStringArray("input_area", "repl")]
+z_index = 2
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_yfc5r")
+theme_override_constants/separation = 0
+alignment = 2
+script = ExtResource("1_qrxrm")
+input_area = NodePath("PanelContainer/InputArea")
+repl = NodePath("REPL")
+
+[node name="REPL" type="Node" parent="." node_paths=PackedStringArray("_input_area", "_hints", "_helpbar", "_helpbar_label")]
+script = ExtResource("1_tygtx")
+_input_area = NodePath("../PanelContainer/InputArea")
+_hints = NodePath("../HintsList")
+_helpbar = NodePath("../HelpBar")
+_helpbar_label = NodePath("../HelpBar/Label")
+
+[node name="HintsList" parent="." instance=ExtResource("5_i3ldx")]
+layout_mode = 2
+auto_resize = true
+
+[node name="HelpBar" parent="." instance=ExtResource("2_2k26n")]
+custom_minimum_size = Vector2(0, 24)
+layout_mode = 2
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_xty2u")
+
+[node name="ColorRect" type="ColorRect" parent="PanelContainer"]
+material = SubResource("ShaderMaterial_kt6ig")
+layout_mode = 2
+
+[node name="InputArea" parent="PanelContainer" instance=ExtResource("1_cerpp")]
+custom_minimum_size = Vector2(0, 24)
+layout_mode = 2
+
+[editable path="HintsList"]
+[editable path="HelpBar"]
diff --git a/source/addons/panku_console/modules/interactive_shell/module.gd b/source/addons/panku_console/modules/interactive_shell/module.gd
new file mode 100644
index 0000000..6651dd5
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/module.gd
@@ -0,0 +1,170 @@
+class_name PankuModuleInteractiveShell extends PankuModule
+
+var window:PankuLynxWindow
+var interactive_shell:Control
+var simple_launcher:Control
+
+enum InputMode {
+ Window,
+ Launcher
+}
+
+var gui_mode:InputMode = InputMode.Window
+var pause_if_input:bool = true
+var unified_window_visibility:bool = false
+var init_expr:String = ""
+var _is_gui_open:bool = false
+var _was_tree_paused: bool = false
+var _previous_mouse_mode := Input.MOUSE_MODE_VISIBLE
+var _show_side_menu:bool
+
+func get_intro() -> String:
+ var intro:PackedStringArray = PackedStringArray()
+ intro.append("[color=#ffffff44][b][i]> Panku Console[/i][/b][/color]")
+ intro.append("[color=#ffffff44]Feature-Packed Runtime Debugging Toolkit for Godot[/color]")
+ intro.append("[color=#ffffff44]Version: %s([url=%s][color=#10a00c]%s[/color][/url]) | Visit [color=#3feeb6][url=https://github.com/Ark2000/PankuConsole]github repo[/url][/color] for more info[/color]" % [PankuUtils.get_plugin_version(), PankuUtils.get_commit_url(), PankuUtils.get_commit_sha_short()])
+ return "\n".join(intro)
+
+func init_module():
+ interactive_shell = preload("./console_ui/panku_console_ui.tscn").instantiate()
+ window = core.windows_manager.create_window(interactive_shell)
+ add_auto_save_hook(window)
+ interactive_shell._repl._module = self
+ window.queue_free_on_close = false
+ window.set_window_title_text("Interactive Shell V2")
+ load_window_data(window)
+ window.hide_window()
+
+ interactive_shell.output(get_intro())
+
+ simple_launcher = preload("./mini_repl_2.tscn").instantiate()
+ simple_launcher.console = core
+ core.add_child(simple_launcher)
+ simple_launcher.repl._module = self
+ simple_launcher.hide()
+
+ core.toggle_console_action_just_pressed.connect(
+ func():
+ if gui_mode == InputMode.Window:
+ if window.visible:
+ window.hide_window()
+ else:
+ window.show_window()
+ elif gui_mode == InputMode.Launcher:
+ simple_launcher.visible = not simple_launcher.visible
+ )
+
+ # Grab the mouse when the dev console is visible (e.g. FPS games)
+ window.visibility_changed.connect(
+ func():
+ # the mouse is grabbed when the window is visible
+ if window.visible:
+ _previous_mouse_mode = Input.mouse_mode
+ Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
+ # restore the mouse mode when the window is hidden
+ else:
+ Input.mouse_mode = _previous_mouse_mode
+ )
+
+ gui_mode = load_module_data("gui_mode", InputMode.Window)
+ pause_if_input = load_module_data("pause_if_popup", true)
+ unified_window_visibility = load_module_data("unified_visibility", false)
+ init_expr = load_module_data("init_expression", "print('Panku Console Loaded!')")
+
+ _show_side_menu = load_module_data("show_side_menu", true)
+ set_side_menu_visible(_show_side_menu)
+
+ window.visibility_changed.connect(update_gui_state)
+ simple_launcher.visibility_changed.connect(update_gui_state)
+ _is_gui_open = not (window.visible or simple_launcher.visible)
+ update_gui_state()
+
+ # TODO: this signal is emitted twice when the window is shown, investigate
+ # window.visibility_changed.connect(
+ # func():
+ # print("window visibility changed: ", window.visible)
+ # )
+
+ # execute init_expr after a short delay
+ if init_expr != "":
+ core.create_tween().tween_callback(
+ func():
+ var result = core.gd_exprenv.execute(init_expr)
+ core.new_expression_entered.emit(init_expr, result)
+ ).set_delay(0.1)
+
+ _input_histories = load_module_data("histories", [])
+
+func quit_module():
+ super.quit_module()
+ save_window_data(window)
+ save_module_data("gui_mode", gui_mode)
+ save_module_data("histories", _input_histories)
+ save_module_data("show_side_menu", _show_side_menu)
+
+func update_gui_state():
+ var is_gui_open = window.visible or simple_launcher.visible
+
+ if is_gui_open == _is_gui_open:
+ return
+
+ if _is_gui_open != is_gui_open:
+ core._shell_visibility = is_gui_open
+ core.interactive_shell_visibility_changed.emit(is_gui_open)
+ _is_gui_open = is_gui_open
+
+ if _is_gui_open and pause_if_input:
+ _was_tree_paused = core.get_tree().paused
+ core.get_tree().paused = true
+ else:
+ if core.get_tree().paused:
+ core.get_tree().paused = _was_tree_paused
+
+ if unified_window_visibility:
+ core.windows_manager.visible = _is_gui_open
+
+func open_window():
+ if gui_mode == InputMode.Window:
+ if not window.visible:
+ window.show_window()
+ else:
+ core.notify("The window is alreay opened.")
+ elif gui_mode == InputMode.Launcher:
+ gui_mode = InputMode.Window
+ simple_launcher.hide()
+ window.show_window()
+
+func open_launcher():
+ if gui_mode == InputMode.Window:
+ gui_mode = InputMode.Launcher
+ window.hide_window()
+ simple_launcher.show()
+ elif gui_mode == InputMode.Launcher:
+ if not simple_launcher.visible:
+ simple_launcher.show()
+ else:
+ core.notify("The launcher is alreay opened.")
+
+func set_side_menu_visible(enabled:bool):
+ _show_side_menu = enabled
+ interactive_shell.enable_side_menu = enabled
+ interactive_shell.resized.emit()
+
+func set_unified_window_visibility(enabled:bool):
+ unified_window_visibility = enabled
+ update_gui_state()
+
+func set_pause_if_popup(enabled:bool):
+ pause_if_input = enabled
+ update_gui_state()
+
+const MAX_HISTORY = 10
+var _input_histories := []
+
+func get_histories() -> Array:
+ return _input_histories
+
+func add_history(s:String) -> void:
+ _input_histories.append(s)
+ if _input_histories.size() > MAX_HISTORY:
+ _input_histories.remove_at(0)
diff --git a/source/addons/panku_console/modules/interactive_shell/module.gd.uid b/source/addons/panku_console/modules/interactive_shell/module.gd.uid
new file mode 100644
index 0000000..b594902
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/module.gd.uid
@@ -0,0 +1 @@
+uid://s5yxe800b171
diff --git a/source/addons/panku_console/modules/interactive_shell/opt.gd b/source/addons/panku_console/modules/interactive_shell/opt.gd
new file mode 100644
index 0000000..a913952
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/opt.gd
@@ -0,0 +1,31 @@
+extends ModuleOptions
+
+@export_group("interactive_shell")
+
+@export var export_comment_show_side_menu = "config file at side_menu_config.json"
+@export var show_side_menu:bool:
+ get:
+ return _module._show_side_menu
+ set(v):
+ _module.set_side_menu_visible(v)
+
+@export var export_comment_unified_visibility = "unified_visibility will keep all windows' visibility the same as interactive shell"
+@export var unified_visibility:bool = false:
+ get:
+ return _module.unified_window_visibility
+ set(v):
+ _module.set_unified_window_visibility(v)
+
+@export var export_comment_pause_if_popup = "Whether the whole game should be paused when interactive shell is visible"
+@export var pause_if_popup:bool = false:
+ get:
+ return _module.pause_if_input
+ set(v):
+ _module.set_pause_if_popup(v)
+
+@export var export_comment_init_expression = "init_expression will be executed when the project starts"
+@export var init_expression:String = "":
+ get:
+ return _module.init_expr
+ set(v):
+ _module.init_expr = v
diff --git a/source/addons/panku_console/modules/interactive_shell/opt.gd.uid b/source/addons/panku_console/modules/interactive_shell/opt.gd.uid
new file mode 100644
index 0000000..9c823bf
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/opt.gd.uid
@@ -0,0 +1 @@
+uid://btueetsj24uh2
diff --git a/source/addons/panku_console/modules/interactive_shell/side_menu_config.json b/source/addons/panku_console/modules/interactive_shell/side_menu_config.json
new file mode 100644
index 0000000..e8af52e
--- /dev/null
+++ b/source/addons/panku_console/modules/interactive_shell/side_menu_config.json
@@ -0,0 +1,36 @@
+{
+ "items.top":[
+ {
+ "text": "Debug Logs",
+ "icon": "res://addons/panku_console/res/icons2/info2.svg",
+ "command": "native_logger.open()"
+ },
+ {
+ "text": "Watch Exp",
+ "icon": "res://addons/panku_console/res/icons2/eye.svg",
+ "command": "expression_monitor.open_window()"
+ },
+ {
+ "text": "Shortcut",
+ "icon": "res://addons/panku_console/res/icons2/keyboard.svg",
+ "command": "keyboard_shortcuts.open()"
+ },
+ {
+ "text": "History",
+ "icon": "res://addons/panku_console/res/icons2/history.svg",
+ "command": "history_manager.open()"
+ }
+ ],
+ "items.bottom":[
+ {
+ "text": "Settings",
+ "icon": "res://addons/panku_console/res/icons2/gear.svg",
+ "command": "general_settings.open()"
+ },
+ {
+ "text": "About",
+ "icon": "res://addons/panku_console/res/icons2/question.svg",
+ "command": "about.open()"
+ }
+ ]
+}
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/env.gd b/source/addons/panku_console/modules/keyboard_shortcuts/env.gd
new file mode 100644
index 0000000..dae4497
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/env.gd
@@ -0,0 +1,4 @@
+var _module:PankuModule
+
+func open() -> void:
+ _module.open_window()
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/env.gd.uid b/source/addons/panku_console/modules/keyboard_shortcuts/env.gd.uid
new file mode 100644
index 0000000..78b2847
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/env.gd.uid
@@ -0,0 +1 @@
+uid://ektymvujjs1
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd
new file mode 100644
index 0000000..8658b83
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd
@@ -0,0 +1,19 @@
+extends HBoxContainer
+
+signal exp_edit_submitted(new_exp:String)
+
+@export var exp_edit:LineEdit
+@export var remap_button:Button
+@export var delete_button:Button
+
+func _ready():
+ delete_button.pressed.connect(queue_free)
+ exp_edit.text_submitted.connect(
+ func(new_text:String):
+ exp_edit.release_focus()
+ exp_edit_submitted.emit(new_text)
+ )
+ exp_edit.focus_exited.connect(
+ func():
+ exp_edit_submitted.emit(exp_edit.text)
+ )
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd.uid b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd.uid
new file mode 100644
index 0000000..2a3f6c6
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd.uid
@@ -0,0 +1 @@
+uid://njshgvm6ty21
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.tscn b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.tscn
new file mode 100644
index 0000000..d4c5b4a
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 format=3 uid="uid://dkw70e7xyrqxi"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_u320k"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd" id="2_7ijd8"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/keyboard_shortcuts/remap_button.gd" id="3_3bdj0"]
+[ext_resource type="Texture2D" uid="uid://dnexm7u6lq3km" path="res://addons/panku_console/res/icons2/remove.svg" id="4_vif73"]
+
+[node name="ExpkeyItem" type="HBoxContainer" node_paths=PackedStringArray("exp_edit", "remap_button", "delete_button")]
+offset_right = 280.0
+offset_bottom = 31.0
+theme = ExtResource("1_u320k")
+script = ExtResource("2_7ijd8")
+exp_edit = NodePath("ExpressionEdit")
+remap_button = NodePath("RemapButton")
+delete_button = NodePath("DeleteButton")
+
+[node name="ExpressionEdit" type="LineEdit" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "Expression"
+clear_button_enabled = true
+
+[node name="RemapButton" type="Button" parent="."]
+layout_mode = 2
+toggle_mode = true
+text = "Unassigned"
+script = ExtResource("3_3bdj0")
+
+[node name="DeleteButton" type="Button" parent="."]
+custom_minimum_size = Vector2(27, 0)
+layout_mode = 2
+toggle_mode = true
+icon = ExtResource("4_vif73")
+expand_icon = true
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd
new file mode 100644
index 0000000..886d565
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd
@@ -0,0 +1,79 @@
+extends Control
+
+signal key_binding_added(key: InputEventKey, expression: String)
+signal key_binding_changed(key: InputEventKey, expression: String)
+
+var console:PankuConsole
+
+const exp_key_item := preload("./exp_key_item.tscn")
+
+@export var add_btn:Button
+@export var container:VBoxContainer
+
+var mapping_data = []
+
+func _ready():
+ #when clicking the button, add a new exp key mapping item
+ add_btn.pressed.connect(
+ func():
+ var default_exp = ""
+ var default_event = null
+ add_item(default_exp, default_event)
+ mapping_data.push_back([default_exp, default_event])
+ )
+
+#handle input here.
+func _unhandled_input(e):
+ if e is InputEventKey:
+ for i in range(len(mapping_data)):
+ var key_mapping = mapping_data[i]
+ var exp:String = key_mapping[0]
+ var event:InputEventKey = key_mapping[1]
+ if !event: continue
+ if e.keycode == event.keycode and e.pressed and !e.echo:
+ #execute the exp
+ var result = console.gd_exprenv.execute(exp)
+ if result.failed:
+ console.notify("[color=red]%s[/color]" % result.result)
+ else:
+ #ignore null result
+ if result.result:
+ console.notify(str(result.result))
+
+func add_item(exp:String, event:InputEventKey):
+ var item = exp_key_item.instantiate()
+ container.add_child(item)
+ container.move_child(item, container.get_child_count() - 2)
+ item.exp_edit.text = exp
+ item.remap_button.key_event = event
+
+ item.exp_edit_submitted.connect(
+ func(new_exp:String):
+ mapping_data[item.get_index()][0] = new_exp
+ if(key_binding_added.get_connections().size() > 0):
+ key_binding_added.emit(event, new_exp)
+ )
+ item.remap_button.key_event_changed.connect(
+ func(new_event:InputEventKey):
+ await get_tree().process_frame
+ mapping_data[item.get_index()][1] = new_event
+ if(key_binding_changed.get_connections().size() > 0):
+ key_binding_changed.emit(new_event, mapping_data[item.get_index()][0])
+ )
+ item.tree_exiting.connect(
+ func():
+ mapping_data.remove_at(item.get_index())
+ )
+
+func get_data() -> Array:
+ return mapping_data
+
+func load_data(data:Array):
+ mapping_data = data
+
+ #load data
+ for i in range(len(mapping_data)):
+ var key_mapping = mapping_data[i]
+ var exp:String = key_mapping[0]
+ var event:InputEventKey = key_mapping[1]
+ add_item(exp, event)
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd.uid b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd.uid
new file mode 100644
index 0000000..ecf55fe
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd.uid
@@ -0,0 +1 @@
+uid://dhnsfi6dpgbv7
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.tscn b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.tscn
new file mode 100644
index 0000000..3e5b5c8
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.tscn
@@ -0,0 +1,71 @@
+[gd_scene load_steps=7 format=3 uid="uid://c6hm8vweq0j4f"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_0xd5p"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd" id="2_vxcow"]
+[ext_resource type="Texture2D" uid="uid://dprpfr0l5xvmu" path="res://addons/panku_console/res/icons2/add.svg" id="3_0d2ct"]
+[ext_resource type="Texture2D" uid="uid://b6jt0ggmuoyeb" path="res://addons/panku_console/res/icons2/info2.svg" id="3_ofrgs"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_i7jk5"]
+content_margin_left = 8.0
+content_margin_top = 8.0
+content_margin_right = 8.0
+content_margin_bottom = 8.0
+
+[sub_resource type="GDScript" id="GDScript_xeow3"]
+script/source = "extends Button
+
+func _ready():
+ pressed.connect(
+ func():
+ Panku.notify(\"Yes, I know it.\")
+ )
+"
+
+[node name="ExpKeyMapper" type="Control" node_paths=PackedStringArray("add_btn", "container")]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_0xd5p")
+script = ExtResource("2_vxcow")
+add_btn = NodePath("ScrollContainer/PanelContainer/VBoxContainer2/VBoxContainer/Add")
+container = NodePath("ScrollContainer/PanelContainer/VBoxContainer2/VBoxContainer")
+
+[node name="ScrollContainer" type="ScrollContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+horizontal_scroll_mode = 0
+
+[node name="PanelContainer" type="PanelContainer" parent="ScrollContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxEmpty_i7jk5")
+
+[node name="VBoxContainer2" type="VBoxContainer" parent="ScrollContainer/PanelContainer"]
+layout_mode = 2
+
+[node name="Button" type="Button" parent="ScrollContainer/PanelContainer/VBoxContainer2"]
+layout_mode = 2
+text = "Edit expression key bindings here."
+icon = ExtResource("3_ofrgs")
+alignment = 0
+expand_icon = true
+script = SubResource("GDScript_xeow3")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer/PanelContainer/VBoxContainer2"]
+layout_mode = 2
+
+[node name="Add" type="Button" parent="ScrollContainer/PanelContainer/VBoxContainer2/VBoxContainer"]
+layout_mode = 2
+text = " "
+icon = ExtResource("3_0d2ct")
+icon_alignment = 1
+expand_icon = true
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/module.gd b/source/addons/panku_console/modules/keyboard_shortcuts/module.gd
new file mode 100644
index 0000000..db00dd2
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/module.gd
@@ -0,0 +1,34 @@
+class_name PankuModuleKeyboardShortcuts extends PankuModule
+
+var window:PankuLynxWindow
+var key_mapper
+
+func init_module():
+ # setup ui
+ key_mapper = preload("./exp_key_mapper_2.tscn").instantiate()
+ key_mapper.console = core
+
+ # bind window
+ window = core.windows_manager.create_window(key_mapper)
+ add_auto_save_hook(window)
+ window.queue_free_on_close = false
+ window.set_window_title_text("Keyboard Shortcuts")
+
+ load_window_data(window)
+ key_mapper.load_data(load_module_data("key_mapper", []))
+ key_mapper.key_binding_added.connect(
+ func(key: InputEventKey, expression: String):
+ save_module_data("key_mapper", key_mapper.get_data())
+ )
+ key_mapper.key_binding_changed.connect(
+ func(key: InputEventKey, expression: String):
+ save_module_data("key_mapper", key_mapper.get_data())
+ )
+
+func quit_module():
+ super.quit_module()
+ save_window_data(window)
+ save_module_data("key_mapper", key_mapper.get_data())
+
+func open_window():
+ window.show_window()
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/module.gd.uid b/source/addons/panku_console/modules/keyboard_shortcuts/module.gd.uid
new file mode 100644
index 0000000..6761f27
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/module.gd.uid
@@ -0,0 +1 @@
+uid://c81fqogp5t1at
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/opt.gd b/source/addons/panku_console/modules/keyboard_shortcuts/opt.gd
new file mode 100644
index 0000000..ac27bb8
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/opt.gd
@@ -0,0 +1,8 @@
+extends ModuleOptions
+
+@export_group("keyboard_shortcuts")
+
+@export var export_button_open_keyboard_shortcuts := "Open Keyboard Shortcuts"
+
+func open_keyboard_shortcuts():
+ _module.open_window()
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/opt.gd.uid b/source/addons/panku_console/modules/keyboard_shortcuts/opt.gd.uid
new file mode 100644
index 0000000..75e4ce4
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/opt.gd.uid
@@ -0,0 +1 @@
+uid://3gbs45b3ws1b
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd b/source/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd
new file mode 100644
index 0000000..4391139
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd
@@ -0,0 +1,27 @@
+extends Button
+
+signal key_event_changed(new_event:InputEventKey)
+
+var key_event:InputEventKey:
+ set(v):
+ key_event = v
+ var key_name = "unassigned"
+ if key_event:
+ key_name = "Key " + OS.get_keycode_string(key_event.keycode)
+ text = key_name
+ key_event_changed.emit(v)
+
+func _ready():
+ set_process_unhandled_key_input(false)
+ toggled.connect(
+ func(button_pressed:bool):
+ set_process_unhandled_key_input(button_pressed)
+ if button_pressed:
+ text = "Waiting..."
+ else:
+ release_focus()
+ )
+
+func _unhandled_key_input(event):
+ key_event = event
+ button_pressed = false
diff --git a/source/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd.uid b/source/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd.uid
new file mode 100644
index 0000000..4473c3b
--- /dev/null
+++ b/source/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd.uid
@@ -0,0 +1 @@
+uid://dmkqg8vph34x0
diff --git a/source/addons/panku_console/modules/native_logger/env.gd b/source/addons/panku_console/modules/native_logger/env.gd
new file mode 100644
index 0000000..aee7d7e
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/env.gd
@@ -0,0 +1,13 @@
+var _module:PankuModule
+
+const _HELP_open = "Open logger window"
+func open() -> void:
+ _module.open_window()
+
+const _HELP_toggle_overlay = "Toggle visibility of logger overlay"
+func toggle_overlay() -> void:
+ _module.toggle_overlay()
+
+const _HELP_clear = "Clear logs"
+func clear() -> void:
+ _module.logger_ui.clear_all()
diff --git a/source/addons/panku_console/modules/native_logger/env.gd.uid b/source/addons/panku_console/modules/native_logger/env.gd.uid
new file mode 100644
index 0000000..b2167c0
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/env.gd.uid
@@ -0,0 +1 @@
+uid://do5j6ala4af7u
diff --git a/source/addons/panku_console/modules/native_logger/godot_log_monitor.gd b/source/addons/panku_console/modules/native_logger/godot_log_monitor.gd
new file mode 100644
index 0000000..97cf92a
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/godot_log_monitor.gd
@@ -0,0 +1,40 @@
+extends Node
+#Monitor built-in logs
+
+signal error_msg_received(msg:String)
+signal warning_msg_received(msg:String)
+signal info_msg_received(msg:String)
+
+const UPDATE_INTERVAL := 0.1
+const ERROR_MSG_PREFIX := "USER ERROR: "
+const WARNING_MSG_PREFIX := "USER WARNING: "
+#Any logs with three spaces at the beginning will be ignored.
+const IGNORE_PREFIX := " "
+
+var godot_log:FileAccess
+
+func _ready():
+ var file_logging_enabled = ProjectSettings.get("debug/file_logging/enable_file_logging") or ProjectSettings.get("debug/file_logging/enable_file_logging.pc")
+ if !file_logging_enabled:
+ push_warning("You have to enable file logging in order to use engine log monitor!")
+ return
+
+ var log_path = ProjectSettings.get("debug/file_logging/log_path")
+ godot_log = FileAccess.open(log_path, FileAccess.READ)
+
+ create_tween().set_loops(
+ ).tween_callback(_read_data
+ ).set_delay(UPDATE_INTERVAL)
+
+
+func _read_data():
+ while godot_log.get_position() < godot_log.get_length():
+ var new_line = godot_log.get_line()
+ if new_line.begins_with(IGNORE_PREFIX):
+ continue
+ if new_line.begins_with(ERROR_MSG_PREFIX):
+ error_msg_received.emit(new_line.trim_prefix(ERROR_MSG_PREFIX))
+ elif new_line.begins_with(WARNING_MSG_PREFIX):
+ warning_msg_received.emit(new_line.trim_prefix(WARNING_MSG_PREFIX))
+ else:
+ info_msg_received.emit(new_line)
diff --git a/source/addons/panku_console/modules/native_logger/godot_log_monitor.gd.uid b/source/addons/panku_console/modules/native_logger/godot_log_monitor.gd.uid
new file mode 100644
index 0000000..c9f1671
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/godot_log_monitor.gd.uid
@@ -0,0 +1 @@
+uid://kpgubf52na1d
diff --git a/source/addons/panku_console/modules/native_logger/log_overlay.tscn b/source/addons/panku_console/modules/native_logger/log_overlay.tscn
new file mode 100644
index 0000000..16dfe9d
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/log_overlay.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=2 format=3 uid="uid://clwb00tc8ogtr"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_2qqxo"]
+
+[node name="LogOverlay" type="RichTextLabel"]
+modulate = Color(1, 1, 1, 0.501961)
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+mouse_filter = 2
+theme = ExtResource("1_2qqxo")
+bbcode_enabled = true
+text = "Output Area"
+scroll_active = false
+scroll_following = true
+autowrap_mode = 0
+shortcut_keys_enabled = false
diff --git a/source/addons/panku_console/modules/native_logger/log_view_tag.gd b/source/addons/panku_console/modules/native_logger/log_view_tag.gd
new file mode 100644
index 0000000..280b00b
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/log_view_tag.gd
@@ -0,0 +1,12 @@
+extends Control
+
+@export var tag_btn:Button
+@export var rm_btn:Button
+
+var tag_text:String
+var tag_number:int = 0
+
+func check(message:String):
+ if message.contains(tag_text):
+ tag_number += 1
+ tag_btn.text = "%s (%d)" % [tag_text, tag_number]
diff --git a/source/addons/panku_console/modules/native_logger/log_view_tag.gd.uid b/source/addons/panku_console/modules/native_logger/log_view_tag.gd.uid
new file mode 100644
index 0000000..e320feb
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/log_view_tag.gd.uid
@@ -0,0 +1 @@
+uid://bsw75wfpe0yr8
diff --git a/source/addons/panku_console/modules/native_logger/log_view_tag.tscn b/source/addons/panku_console/modules/native_logger/log_view_tag.tscn
new file mode 100644
index 0000000..66762cd
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/log_view_tag.tscn
@@ -0,0 +1,47 @@
+[gd_scene load_steps=6 format=3 uid="uid://dpurdc5me82ds"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_e0ejw"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/native_logger/log_view_tag.gd" id="2_ia8vx"]
+[ext_resource type="PackedScene" uid="uid://drn5t13m088fb" path="res://addons/panku_console/common/panku_button.tscn" id="3_cc2ep"]
+[ext_resource type="Texture2D" uid="uid://8g5afcuanbl6" path="res://addons/panku_console/res/icons2/close.svg" id="4_msugh"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jvhll"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+shadow_color = Color(0, 0, 0, 0.188235)
+shadow_size = 1
+shadow_offset = Vector2(1, 1)
+
+[node name="LoggerViewTag" type="PanelContainer" node_paths=PackedStringArray("tag_btn", "rm_btn")]
+self_modulate = Color(0.027451, 0.490196, 0.333333, 1)
+offset_right = 123.0
+offset_bottom = 31.0
+size_flags_vertical = 4
+theme = ExtResource("1_e0ejw")
+theme_override_styles/panel = SubResource("StyleBoxFlat_jvhll")
+script = ExtResource("2_ia8vx")
+tag_btn = NodePath("HBoxContainer/Button")
+rm_btn = NodePath("HBoxContainer/Button2/Button")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="Button" type="Button" parent="HBoxContainer"]
+layout_mode = 2
+text = "[info] (428)"
+flat = true
+
+[node name="Button2" parent="HBoxContainer" instance=ExtResource("3_cc2ep")]
+layout_mode = 2
+
+[node name="Button" parent="HBoxContainer/Button2" index="0"]
+flat = true
+
+[node name="TextureRect" parent="HBoxContainer/Button2/HBoxContainer" index="0"]
+texture = ExtResource("4_msugh")
+
+[editable path="HBoxContainer/Button2"]
diff --git a/source/addons/panku_console/modules/native_logger/logger_view.gd b/source/addons/panku_console/modules/native_logger/logger_view.gd
new file mode 100644
index 0000000..7cd31d1
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/logger_view.gd
@@ -0,0 +1,150 @@
+extends Control
+
+signal content_updated(bbcode:String)
+
+var console:PankuConsole
+var _module:PankuModule
+
+const MAX_LOGS = 128
+
+@export var tag_prefab:PackedScene
+@export var search_box:LineEdit
+@export var search_btn:Button
+@export var pin_btn:Button
+@export var cls_btn:Button
+@export var tags_container2:ScrollContainer
+@export var tags_container:HBoxContainer
+@export var rlabel:RichTextLabel
+
+var current_filter:String = ""
+var logs:Array = []
+
+const CFG_LOGGER_TAGS = "logger_tags"
+const CFG_LOGGER_OUTPUT_FONT_SIZE = "logger_output_font_size"
+
+#level: #1.info 2.warning 3.error
+func add_log(message:String, level:int):
+ #add prefix
+ if level == 2:
+ message = "[bgcolor=yellow][color=black][warning][/color][/bgcolor] " + message
+ elif level == 3:
+ message = "[bgcolor=red][color=white][error][/color][/bgcolor] " + message
+
+ #update tags
+ for tag in tags_container.get_children():
+ tag.check(message)
+
+ if logs.size() > 0:
+ var last_log = logs.back()
+ if (last_log["message"] == message) and (Time.get_unix_time_from_system() - last_log["timestamp"] < 1.0):
+ last_log["count"] += 1
+ last_log["timestamp"] = Time.get_unix_time_from_system()
+ update_view()
+ return
+
+ logs.push_back({
+ "message": message,
+ "level": level,
+ "timestamp": Time.get_unix_time_from_system(),
+ "count": 1
+ })
+
+ #TODO: support more logs
+ if logs.size() >= MAX_LOGS:
+ logs = logs.slice(int(MAX_LOGS / 2))
+
+ update_view()
+
+func search(filter_string:String):
+ current_filter = filter_string
+ search_box.text = current_filter
+ update_view()
+
+func clear_all():
+ logs.clear()
+ update_view()
+
+func add_tag(filter_string:String):
+ if filter_string.trim_prefix(" ").trim_suffix(" ").is_empty():
+ return
+ var tag = tag_prefab.instantiate()
+ tag.tag_btn.text = filter_string
+ tag.tag_text = filter_string
+ tag.tag_btn.pressed.connect(
+ func():
+ search(filter_string)
+ )
+ tag.rm_btn.pressed.connect(
+ func():
+ if tags_container.get_child_count() == 1:
+ tags_container2.hide()
+ tag.queue_free()
+ )
+ #special treatment
+ if filter_string == "[warning]":
+ tag.self_modulate = Color("#f5c518")
+ tag.tag_btn.self_modulate = Color("#0a1014")
+ tag.rm_btn.self_modulate = Color("#0a1014")
+ elif filter_string == "[error]":
+ tag.self_modulate = Color("#d91f11")
+
+ tags_container.add_child(tag)
+ tags_container2.show()
+
+func update_view():
+ #TODO: optimization
+ var result:PackedStringArray = PackedStringArray()
+
+ for log in logs:
+ if !current_filter.is_empty() and !log["message"].contains(current_filter):
+ continue
+ var s = ""
+ if log["level"] == 1:
+ s = log["message"]
+ elif log["level"] == 2:
+ s = "[color=#e1ed96]%s[/color]" % log["message"]
+ elif log["level"] == 3:
+ s = "[color=#dd7085]%s[/color]" % log["message"]
+ if log["count"] > 1:
+ s = "[b](%d)[/b] %s" % [log["count"], s]
+ # add timestamp prefix
+ if _module.show_timestamp:
+ var time_str := Time.get_time_string_from_unix_time(log["timestamp"] + Time.get_time_zone_from_system()['bias'] * 60)
+ s = "[color=#a0a0a0][%s][/color] %s" % [time_str, s]
+ result.append(s)
+
+ var content:String = "\n".join(result)
+ #sync content
+ rlabel.text = content
+ content_updated.emit(content)
+
+func load_data(data:Array):
+ for item in data:
+ var text:String = item
+ add_tag(text)
+
+func get_data() -> Array:
+ var tags := PackedStringArray()
+ for tag in tags_container.get_children():
+ tags.push_back(tag.tag_text)
+ return tags
+
+func _ready():
+
+ #ui callbacks
+ search_btn.pressed.connect(
+ func():
+ search(search_box.text)
+ )
+ search_box.text_submitted.connect(
+ func(text:String):
+ search(search_box.text)
+ )
+ pin_btn.pressed.connect(
+ func():
+ add_tag(search_box.text)
+ search_box.clear()
+ )
+ cls_btn.pressed.connect(clear_all)
+
+ clear_all()
diff --git a/source/addons/panku_console/modules/native_logger/logger_view.gd.uid b/source/addons/panku_console/modules/native_logger/logger_view.gd.uid
new file mode 100644
index 0000000..41524c0
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/logger_view.gd.uid
@@ -0,0 +1 @@
+uid://dq460vgf6bsbl
diff --git a/source/addons/panku_console/modules/native_logger/logger_view.tscn b/source/addons/panku_console/modules/native_logger/logger_view.tscn
new file mode 100644
index 0000000..5bb6e3c
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/logger_view.tscn
@@ -0,0 +1,136 @@
+[gd_scene load_steps=5 format=3 uid="uid://b1c075ic6oru7"]
+
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="1_gcj58"]
+[ext_resource type="PackedScene" uid="uid://dpurdc5me82ds" path="res://addons/panku_console/modules/native_logger/log_view_tag.tscn" id="2_06ga0"]
+[ext_resource type="Script" path="res://addons/panku_console/modules/native_logger/logger_view.gd" id="2_8mrs2"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ggi4i"]
+bg_color = Color(0.6, 0.6, 0.6, 0)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.639216, 0.639216, 0.639216, 0.501961)
+
+[node name="logger_view" type="Control" node_paths=PackedStringArray("search_box", "search_btn", "pin_btn", "cls_btn", "tags_container2", "tags_container", "rlabel")]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_right = -882.0
+offset_bottom = -417.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_gcj58")
+script = ExtResource("2_8mrs2")
+tag_prefab = ExtResource("2_06ga0")
+search_box = NodePath("VBoxContainer/HBoxContainer/LineEdit")
+search_btn = NodePath("VBoxContainer/HBoxContainer/Button")
+pin_btn = NodePath("VBoxContainer/HBoxContainer/Button2")
+cls_btn = NodePath("VBoxContainer/HBoxContainer/Button3")
+tags_container2 = NodePath("VBoxContainer/ScrollContainer")
+tags_container = NodePath("VBoxContainer/ScrollContainer/HBoxContainer/HBoxContainer2")
+rlabel = NodePath("VBoxContainer/PanelContainer/MarginContainer/RichTextLabel")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Control" type="Control" parent="VBoxContainer"]
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 2
+
+[node name="LineEdit" type="LineEdit" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "search..."
+clear_button_enabled = true
+
+[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "OK"
+
+[node name="Button2" type="Button" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "Pin"
+
+[node name="Button3" type="Button" parent="VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "Clear All"
+
+[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
+visible = false
+custom_minimum_size = Vector2(0, 24)
+layout_mode = 2
+vertical_scroll_mode = 0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/ScrollContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 1
+text = " Tags: "
+vertical_alignment = 1
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/HBoxContainer"]
+clip_contents = true
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_ggi4i")
+
+[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/PanelContainer"]
+layout_mode = 2
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer/PanelContainer/MarginContainer"]
+layout_mode = 2
+bbcode_enabled = true
+text = "Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here
+Hello
+Some text here"
+scroll_following = true
diff --git a/source/addons/panku_console/modules/native_logger/module.gd b/source/addons/panku_console/modules/native_logger/module.gd
new file mode 100644
index 0000000..777fcf1
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/module.gd
@@ -0,0 +1,98 @@
+class_name PankuModuleNativeLogger extends PankuModule
+
+var output_overlay:RichTextLabel
+var native_logs_monitor:Node
+var window:PankuLynxWindow
+var logger_ui:Node
+var output_overlay_display_mode:ScreenOverlayDisplayMode
+var show_timestamp:bool
+
+enum ScreenOverlayDisplayMode {
+ AlwaysShow,
+ ShowIfShellVisible,
+ NeverShow
+}
+
+func init_module():
+ # add godot log monitor
+ native_logs_monitor = preload("./godot_log_monitor.gd").new()
+ core.add_child(native_logs_monitor)
+
+ # add output overlay
+ output_overlay = preload("./log_overlay.tscn").instantiate()
+ output_overlay.clear()
+ core.add_child(output_overlay)
+
+ # add logger window
+ logger_ui = preload("./logger_view.tscn").instantiate()
+ logger_ui._module = self
+ logger_ui.console = core
+
+ window = core.windows_manager.create_window(logger_ui)
+ add_auto_save_hook(window)
+ window.queue_free_on_close = false
+ window.set_window_title_text("Native Logger")
+
+ native_logs_monitor.error_msg_received.connect(
+ func(msg:String):
+ logger_ui.add_log(msg, 3)
+ )
+ native_logs_monitor.warning_msg_received.connect(
+ func(msg:String):
+ logger_ui.add_log(msg, 2)
+ )
+ native_logs_monitor.info_msg_received.connect(
+ func(msg:String):
+ logger_ui.add_log(msg, 1)
+ )
+ logger_ui.content_updated.connect(
+ func(bbcode:String):
+ output_overlay.text = bbcode
+ )
+
+ core.interactive_shell_visibility_changed.connect(
+ func(v:bool):
+ if output_overlay_display_mode == ScreenOverlayDisplayMode.ShowIfShellVisible:
+ output_overlay.visible = v
+ )
+
+ # load data
+ load_window_data(window)
+ get_module_opt().screen_overlay = load_module_data("screen_overlay", ScreenOverlayDisplayMode.AlwaysShow)
+ get_module_opt().screen_overlay_alpha = load_module_data("screen_overlay_alpha", 0.3)
+ get_module_opt().screen_overlay_font_shadow = load_module_data("screen_overlay_font_shadow", false)
+ get_module_opt().screen_overlay_override_font_size = load_module_data("screen_overlay_override_font_size", 0)
+ get_module_opt().show_timestamp = load_module_data("show_timestamp", true)
+ logger_ui.load_data(load_module_data("logger_tags", ["[error]", "[warning]"]))
+
+func quit_module():
+ super.quit_module()
+ # properties defined in opt.gd will be automatically saved as soon as the value is changed
+ # we only need to manually save properties outside opt.gd
+ save_window_data(window)
+ save_module_data("logger_tags", logger_ui.get_data())
+
+func open_window():
+ window.show_window()
+
+func toggle_overlay():
+ var next = {
+ ScreenOverlayDisplayMode.AlwaysShow: ScreenOverlayDisplayMode.NeverShow,
+ ScreenOverlayDisplayMode.ShowIfShellVisible: ScreenOverlayDisplayMode.NeverShow,
+ ScreenOverlayDisplayMode.NeverShow: ScreenOverlayDisplayMode.AlwaysShow
+ }
+ output_overlay_display_mode = next[output_overlay_display_mode]
+ set_overlay_display_mode(output_overlay_display_mode)
+
+func set_overlay_display_mode(mode:ScreenOverlayDisplayMode):
+ output_overlay_display_mode = mode
+ if output_overlay_display_mode == ScreenOverlayDisplayMode.AlwaysShow:
+ output_overlay.visible = true
+ elif output_overlay_display_mode == ScreenOverlayDisplayMode.ShowIfShellVisible:
+ output_overlay.visible = core.get_shell_visibility()
+ elif output_overlay_display_mode == ScreenOverlayDisplayMode.NeverShow:
+ output_overlay.visible = false
+
+func set_show_timestamp(v:bool):
+ show_timestamp = v
+ logger_ui.update_view()
diff --git a/source/addons/panku_console/modules/native_logger/module.gd.uid b/source/addons/panku_console/modules/native_logger/module.gd.uid
new file mode 100644
index 0000000..be7cea5
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/module.gd.uid
@@ -0,0 +1 @@
+uid://dhr113k6ucdi6
diff --git a/source/addons/panku_console/modules/native_logger/opt.gd b/source/addons/panku_console/modules/native_logger/opt.gd
new file mode 100644
index 0000000..777accf
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/opt.gd
@@ -0,0 +1,61 @@
+extends ModuleOptions
+
+@export_group("native_logger")
+
+@export var export_button_open_window := "Open Logger Window"
+func open_window():
+ _module.open_window()
+
+@export var export_comment_1 = "The logger is built upon the native engine file logging utility."
+
+@export var export_button_open_engine_log_folder:String = "Open Engine Logs Folder"
+
+@export_enum("Always Show", "Show If Shell Visible", "Never Show") var screen_overlay:int:
+ set(v):
+ _module.set_overlay_display_mode(v)
+ get:
+ return _module.output_overlay_display_mode
+
+@export var show_timestamp:bool = true:
+ set(v):
+ _module.set_show_timestamp(v)
+ get:
+ return _module.show_timestamp
+
+@export_range(0.0, 1.0, 0.01) var screen_overlay_alpha:float = 0.5:
+ set(v):
+ _module.output_overlay.modulate.a = v
+ get:
+ return _module.output_overlay.modulate.a
+
+@export var screen_overlay_override_font_size:int = 0:
+ set(v):
+ var overlay:RichTextLabel = _module.output_overlay
+ if (v <= 0):
+ overlay.remove_theme_font_size_override("normal_font_size")
+ overlay.remove_theme_font_size_override("bold_font_size")
+ overlay.remove_theme_font_size_override("italics_font_size")
+ overlay.remove_theme_font_size_override("bold_italics_font_size")
+ overlay.remove_theme_font_size_override("mono_font_size")
+ else:
+ overlay.add_theme_font_size_override("normal_font_size", v)
+ overlay.add_theme_font_size_override("bold_font_size", v)
+ overlay.add_theme_font_size_override("italics_font_size", v)
+ overlay.add_theme_font_size_override("bold_italics_font_size", v)
+ overlay.add_theme_font_size_override("mono_font_size", v)
+ get:
+ #return _module.output_overlay.theme.default_font_size
+ var overlay:RichTextLabel = _module.output_overlay
+ if overlay.has_theme_font_size_override("normal_font_size"):
+ return overlay.get("theme_override_font_sizes/normal_font_size")
+ return 0
+
+@export var screen_overlay_font_shadow:bool = false:
+ set(v):
+ var val = Color.BLACK if v else null
+ _module.output_overlay.set("theme_override_colors/font_shadow_color", val)
+ get:
+ return _module.output_overlay.get("theme_override_colors/font_shadow_color") != null
+
+func open_engine_log_folder():
+ OS.shell_open(ProjectSettings.globalize_path(ProjectSettings.get_setting("debug/file_logging/log_path").get_base_dir()))
diff --git a/source/addons/panku_console/modules/native_logger/opt.gd.uid b/source/addons/panku_console/modules/native_logger/opt.gd.uid
new file mode 100644
index 0000000..489410a
--- /dev/null
+++ b/source/addons/panku_console/modules/native_logger/opt.gd.uid
@@ -0,0 +1 @@
+uid://c4x75w61jlt7o
diff --git a/source/addons/panku_console/modules/screen_crt_effect/crt_effect_layer.tscn b/source/addons/panku_console/modules/screen_crt_effect/crt_effect_layer.tscn
new file mode 100644
index 0000000..201c93c
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/crt_effect_layer.tscn
@@ -0,0 +1,18 @@
+[gd_scene load_steps=3 format=3 uid="uid://c0hv8f6lk2d2d"]
+
+[ext_resource type="Shader" path="res://addons/panku_console/res/shader/mattias_crt.gdshader" id="1_ulpy0"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_p7j4u"]
+shader = ExtResource("1_ulpy0")
+
+[node name="CrtEffectLayer" type="CanvasLayer"]
+layer = 64
+
+[node name="ColorRect" type="ColorRect" parent="."]
+material = SubResource("ShaderMaterial_p7j4u")
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
diff --git a/source/addons/panku_console/modules/screen_crt_effect/env.gd b/source/addons/panku_console/modules/screen_crt_effect/env.gd
new file mode 100644
index 0000000..32387fa
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/env.gd
@@ -0,0 +1,5 @@
+var _module:PankuModule
+
+const _HELP_toggle = "The good old days"
+func toggle() -> void:
+ _module.toggle_crt_effect()
\ No newline at end of file
diff --git a/source/addons/panku_console/modules/screen_crt_effect/env.gd.uid b/source/addons/panku_console/modules/screen_crt_effect/env.gd.uid
new file mode 100644
index 0000000..ce1f73c
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/env.gd.uid
@@ -0,0 +1 @@
+uid://d1aiy5xe0v012
diff --git a/source/addons/panku_console/modules/screen_crt_effect/module.gd b/source/addons/panku_console/modules/screen_crt_effect/module.gd
new file mode 100644
index 0000000..edd5fe9
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/module.gd
@@ -0,0 +1,11 @@
+class_name PankuModuleScreenCrtEffect extends PankuModule
+
+var crt_effect_enabled := false
+var crt_effect_layer:CanvasLayer = null
+
+func toggle_crt_effect():
+ crt_effect_enabled = !crt_effect_enabled
+ if crt_effect_layer == null:
+ crt_effect_layer = preload("./crt_effect_layer.tscn").instantiate()
+ core.add_child(crt_effect_layer)
+ crt_effect_layer.visible = crt_effect_enabled
diff --git a/source/addons/panku_console/modules/screen_crt_effect/module.gd.uid b/source/addons/panku_console/modules/screen_crt_effect/module.gd.uid
new file mode 100644
index 0000000..c8e85c9
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/module.gd.uid
@@ -0,0 +1 @@
+uid://d0x0ja40c2b0t
diff --git a/source/addons/panku_console/modules/screen_crt_effect/opt.gd b/source/addons/panku_console/modules/screen_crt_effect/opt.gd
new file mode 100644
index 0000000..1f6c8ef
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/opt.gd
@@ -0,0 +1,16 @@
+extends ModuleOptions
+
+@export_group("screen_crt_effect")
+
+@export var export_button_toggle_crt_effect:String = "Toggle Effect"
+
+func toggle_crt_effect():
+ _module.toggle_crt_effect()
+
+func set_unified_window_visibility(enabled:bool):
+ _module.unified_window_visibility = enabled
+ _module.update_gui_state()
+
+func set_pause_if_popup(enabled:bool):
+ _module.pause_if_input = enabled
+ _module.update_gui_state()
diff --git a/source/addons/panku_console/modules/screen_crt_effect/opt.gd.uid b/source/addons/panku_console/modules/screen_crt_effect/opt.gd.uid
new file mode 100644
index 0000000..0c3ee65
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_crt_effect/opt.gd.uid
@@ -0,0 +1 @@
+uid://b1nxh5piiymes
diff --git a/source/addons/panku_console/modules/screen_notifier/env.gd b/source/addons/panku_console/modules/screen_notifier/env.gd
new file mode 100644
index 0000000..dada0ab
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/env.gd
@@ -0,0 +1,5 @@
+var _module:PankuModule
+
+const _HELP_notify = "Generate a notification"
+func notify(any):
+ _module.notify(str(any))
diff --git a/source/addons/panku_console/modules/screen_notifier/env.gd.uid b/source/addons/panku_console/modules/screen_notifier/env.gd.uid
new file mode 100644
index 0000000..166ead5
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/env.gd.uid
@@ -0,0 +1 @@
+uid://dblkaki6xi5k0
diff --git a/source/addons/panku_console/modules/screen_notifier/log_item.gd b/source/addons/panku_console/modules/screen_notifier/log_item.gd
new file mode 100644
index 0000000..322bef1
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/log_item.gd
@@ -0,0 +1,54 @@
+extends HBoxContainer
+
+var life = 2.0
+
+var amount := 1:
+ set(v):
+ amount = v
+ play_amount_pop_animation()
+
+@export var content_label:RichTextLabel
+@export var amount_label:Label
+@export var amount_panel:PanelContainer
+
+@export var progress_a:Panel
+@export var progress_b:Control
+
+var amount_pop_tween:Tween
+var life_tween:Tween
+
+func play_amount_pop_animation():
+ if amount_pop_tween: amount_pop_tween.kill()
+ amount_pop_tween = create_tween()
+ amount_pop_tween.tween_property(amount_panel, "scale", Vector2(1, 1), 0.01)
+ amount_pop_tween.tween_property(amount_panel, "scale", Vector2(1.2, 1.2), 0.05)
+ amount_pop_tween.tween_property(amount_panel, "scale", Vector2(1, 1), 0.05)
+
+func fade_out():
+ var tween = create_tween()
+ tween.tween_property(self, "modulate:a", 0.0, 0.2)
+ tween.tween_callback(queue_free).set_delay(0.2)
+
+func set_progress(v:float):
+ progress_a.size_flags_stretch_ratio = v
+ progress_b.size_flags_stretch_ratio = 1.0 - v
+
+func play_lifespan_animation():
+ # interrupt and clear current tween animation
+ if life_tween: life_tween.kill()
+ life_tween = create_tween()
+ # create new tween animations
+ life_tween.tween_property(self, "modulate:a", 1.0, 0.2)
+ life_tween.set_parallel(true)
+ life_tween.tween_method(set_progress, 1.0, 0.0, life)
+ life_tween.set_parallel(false)
+ life_tween.tween_property(self, "modulate:a", 0.0, 0.2)
+ life_tween.tween_callback(queue_free).set_delay(0.2)
+
+
+func _ready():
+ content_label.meta_clicked.connect(
+ func(meta):
+ OS.shell_open(str(meta))
+ )
+ play_lifespan_animation()
diff --git a/source/addons/panku_console/modules/screen_notifier/log_item.gd.uid b/source/addons/panku_console/modules/screen_notifier/log_item.gd.uid
new file mode 100644
index 0000000..77b33b3
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/log_item.gd.uid
@@ -0,0 +1 @@
+uid://cbivbjh6ve7yu
diff --git a/source/addons/panku_console/modules/screen_notifier/log_item.tscn b/source/addons/panku_console/modules/screen_notifier/log_item.tscn
new file mode 100644
index 0000000..2fd60d8
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/log_item.tscn
@@ -0,0 +1,83 @@
+[gd_scene load_steps=4 format=3 uid="uid://c8rfpfel4mqtm"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/screen_notifier/log_item.gd" id="1_2q8bu"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1ons3"]
+bg_color = Color(0, 0, 0, 0.501961)
+border_color = Color(0.8, 1, 1, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_loh7i"]
+bg_color = Color(1, 1, 1, 0.12549)
+
+[node name="LogItem" type="HBoxContainer" node_paths=PackedStringArray("content_label", "amount_label", "amount_panel", "progress_a", "progress_b")]
+offset_right = 320.0
+offset_bottom = 26.0
+mouse_filter = 2
+theme_override_constants/separation = 2
+script = ExtResource("1_2q8bu")
+content_label = NodePath("Content/MarginContainer/RichTextLabel")
+amount_label = NodePath("Amount/MarginContainer/Label")
+amount_panel = NodePath("Amount")
+progress_a = NodePath("Content/HBoxContainer/A")
+progress_b = NodePath("Content/HBoxContainer/B")
+metadata/content_label = NodePath("Content/MarginContainer/RichTextLabel")
+metadata/amount_label = NodePath("Amount/MarginContainer/Label")
+metadata/amount_panel = NodePath("Amount")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+custom_minimum_size = Vector2(4, 0)
+layout_mode = 2
+mouse_filter = 2
+color = Color(0, 0.752941, 0, 1)
+
+[node name="Content" type="PanelContainer" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_1ons3")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Content"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/separation = 0
+
+[node name="A" type="Panel" parent="Content/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_stretch_ratio = 0.4
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_loh7i")
+
+[node name="B" type="Control" parent="Content/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_stretch_ratio = 0.6
+mouse_filter = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="Content"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 8
+
+[node name="RichTextLabel" type="RichTextLabel" parent="Content/MarginContainer"]
+layout_mode = 2
+mouse_filter = 2
+bbcode_enabled = true
+text = "yoooooooooo~"
+fit_content = true
+
+[node name="Amount" type="PanelContainer" parent="."]
+layout_mode = 2
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_1ons3")
+
+[node name="MarginContainer" type="MarginContainer" parent="Amount"]
+layout_mode = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_right = 4
+
+[node name="Label" type="Label" parent="Amount/MarginContainer"]
+layout_mode = 2
+text = "x1"
+metadata/amount = 1
diff --git a/source/addons/panku_console/modules/screen_notifier/module.gd b/source/addons/panku_console/modules/screen_notifier/module.gd
new file mode 100644
index 0000000..9a7d3a4
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/module.gd
@@ -0,0 +1,12 @@
+class_name PankuModuleScreenNotifier extends PankuModule
+
+var notifier_layer := preload("./resident_logs.tscn").instantiate()
+
+func notify(bbcode:String, id:=-1):
+ notifier_layer.add_log(bbcode, id)
+
+func init_module():
+ core.new_notification_created.connect(notify)
+
+ # setup ui
+ core.add_child(notifier_layer)
diff --git a/source/addons/panku_console/modules/screen_notifier/module.gd.uid b/source/addons/panku_console/modules/screen_notifier/module.gd.uid
new file mode 100644
index 0000000..eee1aad
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/module.gd.uid
@@ -0,0 +1 @@
+uid://g60n3wlnos50
diff --git a/source/addons/panku_console/modules/screen_notifier/resident_logs.gd b/source/addons/panku_console/modules/screen_notifier/resident_logs.gd
new file mode 100644
index 0000000..3053915
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/resident_logs.gd
@@ -0,0 +1,59 @@
+extends CanvasLayer
+
+const logitem2_proto := preload("./log_item.tscn")
+
+const MAX_LOGS = 10
+
+var prev_log = ""
+
+@export var named_container:VBoxContainer
+@export var unnamed_container:VBoxContainer
+
+# logs whose id >= 0
+var named_logs := {}
+
+func _ready():
+ $ResidentLogs.size = get_viewport().size * 0.5
+
+func add_log(bbcode:String, id:=-1):
+ # logs whose id>=0 will be fixed to the bottom of the log list
+ # useful for loop print
+ # you can use `get_instance_id()` as logs's unique id
+ if id >= 0:
+ if !named_logs.has(id):
+ var new_node = logitem2_proto.instantiate()
+ new_node.amount_panel.hide()
+ new_node.life = 1.0
+ new_node.get_node("ColorRect").color = Color("#23aaf277")
+ named_container.add_child(new_node)
+ named_container.move_child(new_node, 0)
+ named_logs[id] = new_node
+ new_node.tree_exiting.connect(
+ func():
+ named_logs.erase(id)
+ )
+ var log_node = named_logs[id]
+ named_logs[id].content_label.text = bbcode
+ log_node.play_lifespan_animation()
+ return
+
+ #see the new log if can be combined with previous one
+ if prev_log == bbcode and unnamed_container.get_child_count() > 0:
+ var prev_node = unnamed_container.get_child(unnamed_container.get_child_count() - 1)
+ prev_node.amount += 1
+ prev_node.amount_label.text = "x" + str(prev_node.amount)
+ prev_node.amount_panel.show()
+ prev_node.play_lifespan_animation()
+ #create new log node
+ else:
+ if unnamed_container.get_child_count() >= MAX_LOGS:
+ unnamed_container.get_child(0).fade_out()
+ if get_tree():
+ var new_node = logitem2_proto.instantiate()
+ new_node.content_label.text = bbcode
+ new_node.amount_panel.hide()
+ new_node.get_node("ColorRect").color = Color(0.0, 0.75, 0.0, 0.5)
+ await get_tree().process_frame
+ unnamed_container.add_child(new_node)
+
+ prev_log = bbcode
diff --git a/source/addons/panku_console/modules/screen_notifier/resident_logs.gd.uid b/source/addons/panku_console/modules/screen_notifier/resident_logs.gd.uid
new file mode 100644
index 0000000..58af049
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/resident_logs.gd.uid
@@ -0,0 +1 @@
+uid://b52ulobnk0cvn
diff --git a/source/addons/panku_console/modules/screen_notifier/resident_logs.tscn b/source/addons/panku_console/modules/screen_notifier/resident_logs.tscn
new file mode 100644
index 0000000..ae7fffd
--- /dev/null
+++ b/source/addons/panku_console/modules/screen_notifier/resident_logs.tscn
@@ -0,0 +1,44 @@
+[gd_scene load_steps=4 format=3 uid="uid://ccr06ddwa73ca"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/screen_notifier/resident_logs.gd" id="1_uq2bh"]
+[ext_resource type="Theme" uid="uid://bk18yfu0d77wk" path="res://addons/panku_console/res/panku_console_theme.tres" id="2_npyp1"]
+
+[sub_resource type="GDScript" id="GDScript_p8loh"]
+script/source = "extends ColorRect
+
+func _ready():
+ queue_free()
+"
+
+[node name="ScreenNotifier" type="CanvasLayer" node_paths=PackedStringArray("named_container", "unnamed_container")]
+script = ExtResource("1_uq2bh")
+named_container = NodePath("ResidentLogs/Named")
+unnamed_container = NodePath("ResidentLogs/Unnamed")
+
+[node name="ResidentLogs" type="VBoxContainer" parent="."]
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_top = -193.0
+offset_right = 244.0
+offset_bottom = 193.0
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("2_npyp1")
+alignment = 2
+
+[node name="Indicator" type="ColorRect" parent="ResidentLogs"]
+layout_mode = 2
+size_flags_vertical = 3
+color = Color(1, 0.345098, 0.34902, 1)
+script = SubResource("GDScript_p8loh")
+
+[node name="Unnamed" type="VBoxContainer" parent="ResidentLogs"]
+layout_mode = 2
+mouse_filter = 2
+alignment = 2
+
+[node name="Named" type="VBoxContainer" parent="ResidentLogs"]
+layout_mode = 2
+mouse_filter = 2
+alignment = 2
diff --git a/source/addons/panku_console/modules/snake/env.gd b/source/addons/panku_console/modules/snake/env.gd
new file mode 100644
index 0000000..addf5b8
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/env.gd
@@ -0,0 +1,11 @@
+var _module:PankuModule
+
+const _HELP_execute = "Play Snake Game"
+func play() -> void:
+ _module.add_snake_window()
+
+func leader_board() -> String:
+ var content = ""
+ content += "== Learder Board ==\n"
+ content += str(_module.leader_board_arr)
+ return content
diff --git a/source/addons/panku_console/modules/snake/env.gd.uid b/source/addons/panku_console/modules/snake/env.gd.uid
new file mode 100644
index 0000000..67670de
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/env.gd.uid
@@ -0,0 +1 @@
+uid://6jkx6sxdlxa4
diff --git a/source/addons/panku_console/modules/snake/module.gd b/source/addons/panku_console/modules/snake/module.gd
new file mode 100644
index 0000000..da74fe8
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/module.gd
@@ -0,0 +1,37 @@
+class_name PankuModuleSnakeGame extends PankuModule
+
+var leader_board_arr = []
+
+func init_module():
+ leader_board_arr = load_module_data("leader_board", [])
+
+func add_snake_window():
+ var snake_ui := preload("res://addons/panku_console/modules/snake/snake.tscn").instantiate()
+ var window:PankuLynxWindow = core.windows_manager.create_window(snake_ui)
+ window.queue_free_on_close = true
+ window.set_window_title_text("Snake Game")
+ window.position = window.get_layout_position(Control.PRESET_CENTER)
+ window.move_to_front()
+ window.size = Vector2(
+ snake_ui.snake_game.MAP_SIZE * snake_ui.CELL_SIZE, 0)
+ window.size.y = window.size.x + 24
+
+ core.get_tree().root.get_viewport().gui_release_focus()
+
+ snake_ui.snake_game.game_over.connect(
+ func():
+ var record = {
+ "timestamp": Time.get_datetime_string_from_system(),
+ "score": snake_ui.snake_game.get_snake_length()
+ }
+ leader_board_arr.append(record)
+ leader_board_arr.sort_custom(
+ func(a, b):
+ return a['score'] > b['score']
+ )
+
+ if leader_board_arr.size() > 10:
+ leader_board_arr.resize(10)
+
+ save_module_data("leader_board", leader_board_arr)
+ )
diff --git a/source/addons/panku_console/modules/snake/module.gd.uid b/source/addons/panku_console/modules/snake/module.gd.uid
new file mode 100644
index 0000000..8cb6a0d
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/module.gd.uid
@@ -0,0 +1 @@
+uid://duo4dsnh8j86t
diff --git a/source/addons/panku_console/modules/snake/snake.gd b/source/addons/panku_console/modules/snake/snake.gd
new file mode 100644
index 0000000..43b400d
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/snake.gd
@@ -0,0 +1,71 @@
+signal game_over
+
+const MAP_SIZE = 24
+
+const DIR_REV = {
+ Vector2.LEFT: Vector2.RIGHT,
+ Vector2.RIGHT: Vector2.LEFT,
+ Vector2.UP: Vector2.DOWN,
+ Vector2.DOWN: Vector2.UP,
+}
+
+var snake_dict:Dictionary
+var snake_arr:Array
+var apple:Vector2
+var move_dir:Vector2
+
+func _init() -> void:
+ init()
+
+func init() -> void:
+
+ # init snake. 0:head, -1:tail
+ snake_dict = {Vector2(9, 8):0, Vector2(8, 8):0}
+ snake_arr = snake_dict.keys()
+
+ # init apple
+ apple = spawn_apple()
+
+ move_dir = Vector2.RIGHT
+
+func get_snake_length() -> int:
+ return snake_arr.size()
+
+func spawn_apple() -> Vector2:
+ var x_range = range(MAP_SIZE)
+ x_range.shuffle()
+ var y_range = range(MAP_SIZE)
+ y_range.shuffle()
+ for y in y_range:
+ for x in x_range:
+ if !snake_dict.has(Vector2(x, y)):
+ return Vector2(x, y)
+ return Vector2(-1, -1)
+
+func tick(input_dir:Vector2):
+
+ # can't turn back
+ if DIR_REV[input_dir] != move_dir:
+ move_dir = input_dir
+
+ # create new head
+ var new_head:Vector2 = snake_arr[0] + move_dir
+ new_head.x = wrapi(new_head.x, 0, MAP_SIZE)
+ new_head.y = wrapi(new_head.y, 0, MAP_SIZE)
+
+ # check if collide with self
+ if snake_dict.has(new_head):
+ # game over, restart
+ game_over.emit()
+ init()
+ return
+
+ # add new head
+ snake_arr.push_front(new_head)
+ snake_dict[new_head] = 0
+
+ # remove tail if no apple
+ if new_head != apple:
+ snake_dict.erase(snake_arr.pop_back())
+ else:
+ apple = spawn_apple()
diff --git a/source/addons/panku_console/modules/snake/snake.gd.uid b/source/addons/panku_console/modules/snake/snake.gd.uid
new file mode 100644
index 0000000..55e8965
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/snake.gd.uid
@@ -0,0 +1 @@
+uid://b4bw1i1hvgvo2
diff --git a/source/addons/panku_console/modules/snake/snake.tscn b/source/addons/panku_console/modules/snake/snake.tscn
new file mode 100644
index 0000000..66f7b56
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/snake.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=2 format=3 uid="uid://du6m05vxpcubk"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/snake/snake_ui.gd" id="1_0yq81"]
+
+[node name="SnakeUI" type="Control" node_paths=PackedStringArray("tex_rect")]
+clip_contents = true
+layout_mode = 3
+anchors_preset = 0
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_0yq81")
+tex_rect = NodePath("Snake")
+
+[node name="Snake" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
diff --git a/source/addons/panku_console/modules/snake/snake_gradient.tres b/source/addons/panku_console/modules/snake/snake_gradient.tres
new file mode 100644
index 0000000..b1ccdb3
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/snake_gradient.tres
@@ -0,0 +1,4 @@
+[gd_resource type="Gradient" format=3 uid="uid://chic0ft8frrr8"]
+
+[resource]
+colors = PackedColorArray(0.156863, 0.788235, 0, 1, 0, 0.658824, 0, 0.27451)
diff --git a/source/addons/panku_console/modules/snake/snake_ui.gd b/source/addons/panku_console/modules/snake/snake_ui.gd
new file mode 100644
index 0000000..f725ce4
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/snake_ui.gd
@@ -0,0 +1,66 @@
+extends Control
+
+const CELL_SIZE = 12
+const COLOR_EMPTY = Color(0.0, 0.0, 0.0, 0.0)
+const COLOR_APPLE = Color8(255, 112, 133)
+const COLOR_SNAKE = preload("./snake_gradient.tres")
+
+@export var tex_rect:TextureRect
+
+const KEY_SCHEME = {
+ KEY_UP: Vector2.UP,
+ KEY_DOWN: Vector2.DOWN,
+ KEY_LEFT: Vector2.LEFT,
+ KEY_RIGHT: Vector2.RIGHT,
+}
+
+var snake_game := preload("./snake.gd").new()
+var cached_input := Vector2.RIGHT
+var delay := 0.5
+var img_buffer:Image
+
+func _ready():
+ img_buffer = Image.create(
+ CELL_SIZE * snake_game.MAP_SIZE,
+ CELL_SIZE * snake_game.MAP_SIZE,
+ false, Image.FORMAT_RGBA8)
+ draw()
+
+func draw():
+ # draw background
+ img_buffer.fill(COLOR_EMPTY)
+
+ # draw snake
+ var gradient = GradientTexture1D.new()
+ for i in range(snake_game.snake_arr.size()):
+ var s = snake_game.snake_arr[i]
+ img_buffer.fill_rect(
+ Rect2i(s * CELL_SIZE, Vector2.ONE * CELL_SIZE),
+ COLOR_SNAKE.sample(1.0 * i / snake_game.snake_arr.size())
+ )
+
+ # draw apple
+ img_buffer.fill_rect(
+ Rect2i(snake_game.apple * CELL_SIZE, Vector2.ONE * CELL_SIZE),
+ COLOR_APPLE
+ )
+
+ # update texture
+ tex_rect.texture = ImageTexture.create_from_image(img_buffer)
+
+func _input(event:InputEvent):
+ if event is InputEventKey:
+ var key_event = event as InputEventKey
+ if key_event.pressed:
+ if KEY_SCHEME.has(key_event.keycode):
+ cached_input = KEY_SCHEME[key_event.keycode]
+ # if key is pressed, update immediately
+ delay = 0.0
+
+func _physics_process(delta):
+ delay -= delta
+ if delay <= 0.0:
+ snake_game.tick(cached_input)
+ draw()
+ # speed up as snake grows
+ delay = 2.0 / min(20, snake_game.get_snake_length() / 3.0 + 3)
diff --git a/source/addons/panku_console/modules/snake/snake_ui.gd.uid b/source/addons/panku_console/modules/snake/snake_ui.gd.uid
new file mode 100644
index 0000000..5ee3aaf
--- /dev/null
+++ b/source/addons/panku_console/modules/snake/snake_ui.gd.uid
@@ -0,0 +1 @@
+uid://d2cps4gk8cxti
diff --git a/source/addons/panku_console/modules/system_report/env.gd b/source/addons/panku_console/modules/system_report/env.gd
new file mode 100644
index 0000000..2e86345
--- /dev/null
+++ b/source/addons/panku_console/modules/system_report/env.gd
@@ -0,0 +1,9 @@
+var _os_report = preload("./os_report.gd").new()
+var _module:PankuModule
+
+const _HELP_execute = "Show detailed OS report"
+func execute() -> String:
+ _module.core.notify("Please wait, this may take a while...")
+ _os_report.inspect()
+ var report = "".join(_os_report.rtl)
+ return report
diff --git a/source/addons/panku_console/modules/system_report/env.gd.uid b/source/addons/panku_console/modules/system_report/env.gd.uid
new file mode 100644
index 0000000..ca4f9a0
--- /dev/null
+++ b/source/addons/panku_console/modules/system_report/env.gd.uid
@@ -0,0 +1 @@
+uid://b7ysded37x4b3
diff --git a/source/addons/panku_console/modules/system_report/module.gd b/source/addons/panku_console/modules/system_report/module.gd
new file mode 100644
index 0000000..785d693
--- /dev/null
+++ b/source/addons/panku_console/modules/system_report/module.gd
@@ -0,0 +1 @@
+class_name PankuModuleSystemReport extends PankuModule
diff --git a/source/addons/panku_console/modules/system_report/module.gd.uid b/source/addons/panku_console/modules/system_report/module.gd.uid
new file mode 100644
index 0000000..69edf93
--- /dev/null
+++ b/source/addons/panku_console/modules/system_report/module.gd.uid
@@ -0,0 +1 @@
+uid://v2ob1qsne6c1
diff --git a/source/addons/panku_console/modules/system_report/os_report.gd b/source/addons/panku_console/modules/system_report/os_report.gd
new file mode 100644
index 0000000..80fa3cc
--- /dev/null
+++ b/source/addons/panku_console/modules/system_report/os_report.gd
@@ -0,0 +1,168 @@
+#reference: https://github.com/godotengine/godot-demo-projects/blob/4.0-dev/misc/os_test/os_test.gd
+
+var rtl := PackedStringArray()
+
+# Returns a human-readable string from a date and time, date, or time dictionary.
+func datetime_to_string(date):
+ if (
+ date.has("year")
+ and date.has("month")
+ and date.has("day")
+ and date.has("hour")
+ and date.has("minute")
+ and date.has("second")
+ ):
+ # Date and time.
+ return "{year}-{month}-{day} {hour}:{minute}:{second}".format({
+ year = str(date.year).pad_zeros(2),
+ month = str(date.month).pad_zeros(2),
+ day = str(date.day).pad_zeros(2),
+ hour = str(date.hour).pad_zeros(2),
+ minute = str(date.minute).pad_zeros(2),
+ second = str(date.second).pad_zeros(2),
+ })
+ elif date.has("year") and date.has("month") and date.has("day"):
+ # Date only.
+ return "{year}-{month}-{day}".format({
+ year = str(date.year).pad_zeros(2),
+ month = str(date.month).pad_zeros(2),
+ day = str(date.day).pad_zeros(2),
+ })
+ else:
+ # Time only.
+ return "{hour}:{minute}:{second}".format({
+ hour = str(date.hour).pad_zeros(2),
+ minute = str(date.minute).pad_zeros(2),
+ second = str(date.second).pad_zeros(2),
+ })
+
+
+func scan_midi_devices():
+ OS.open_midi_inputs()
+ var devices = ", ".join(OS.get_connected_midi_inputs())
+ OS.close_midi_inputs()
+ return devices
+
+
+func add_header(header):
+ rtl.append("\n[font_size=24][color=#6df]{header}[/color][/font_size]\n\n".format({
+ header = header,
+ }))
+
+
+func add_line(key, value):
+ rtl.append("[color=#adf]{key}:[/color] {value}\n".format({
+ key = key,
+ value = value if str(value) != "" else "[color=#fff8](empty)[/color]",
+ }))
+
+
+func inspect():
+ add_header("Audio")
+ add_line("Mix rate", "%d Hz" % AudioServer.get_mix_rate())
+ add_line("Output latency", "%f ms" % (AudioServer.get_output_latency() * 1000))
+ add_line("Output device list", ", ".join(AudioServer.get_output_device_list()))
+ add_line("Capture device list", ", ".join(AudioServer.get_input_device_list()))
+
+ add_header("Date")
+ add_line("Date and time (local)", Time.get_datetime_string_from_system(false, true))
+ add_line("Date and time (UTC)", Time.get_datetime_string_from_system(true, true))
+ add_line("Date (local)", Time.get_date_string_from_system(false))
+ add_line("Date (UTC)", Time.get_date_string_from_system(true))
+ add_line("Time (local)", Time.get_time_string_from_system(false))
+ add_line("Time (UTC)", Time.get_time_string_from_system(true))
+ add_line("Timezone", Time.get_time_zone_from_system())
+ add_line("UNIX time", Time.get_unix_time_from_system())
+
+ add_header("Display")
+ add_line("Screen count", DisplayServer.get_screen_count())
+ add_line("DPI", DisplayServer.screen_get_dpi())
+ add_line("Scale factor", DisplayServer.screen_get_scale())
+ add_line("Maximum scale factor", DisplayServer.screen_get_max_scale())
+ add_line("Startup screen position", DisplayServer.screen_get_position())
+ add_line("Startup screen size", DisplayServer.screen_get_size())
+ add_line("Startup screen refresh rate", ("%f Hz" % DisplayServer.screen_get_refresh_rate()) if DisplayServer.screen_get_refresh_rate() > 0.0 else "")
+ add_line("Usable (safe) area rectangle", DisplayServer.get_display_safe_area())
+ add_line("Screen orientation", [
+ "Landscape",
+ "Portrait",
+ "Landscape (reverse)",
+ "Portrait (reverse)",
+ "Landscape (defined by sensor)",
+ "Portrait (defined by sensor)",
+ "Defined by sensor",
+ ][DisplayServer.screen_get_orientation()])
+
+ add_header("Engine")
+ add_line("Version", Engine.get_version_info()["string"])
+ add_line("Command-line arguments", str(OS.get_cmdline_args()))
+ add_line("Is debug build", OS.is_debug_build())
+ add_line("Executable path", OS.get_executable_path())
+ add_line("User data directory", OS.get_user_data_dir())
+ add_line("Filesystem is persistent", OS.is_userfs_persistent())
+
+ add_header("Environment")
+ add_line("Value of `PATH`", OS.get_environment("PATH"))
+ add_line("Value of `path`", OS.get_environment("path"))
+
+ add_header("Hardware")
+ add_line("Model name", OS.get_model_name())
+ add_line("Processor name", OS.get_processor_name())
+ add_line("Processor count", OS.get_processor_count())
+ add_line("Device unique ID", OS.get_unique_id())
+
+ add_header("Input")
+ add_line("Device has touch screen", DisplayServer.is_touchscreen_available())
+ var has_virtual_keyboard = DisplayServer.has_feature(DisplayServer.FEATURE_VIRTUAL_KEYBOARD)
+ add_line("Device has virtual keyboard", has_virtual_keyboard)
+ if has_virtual_keyboard:
+ add_line("Virtual keyboard height", DisplayServer.virtual_keyboard_get_height())
+
+ add_header("Localization")
+ add_line("Locale", OS.get_locale())
+
+ add_header("Mobile")
+ add_line("Granted permissions", OS.get_granted_permissions())
+
+# add_header(".NET (C#)")
+# var csharp_enabled = ResourceLoader.exists("res://CSharpTest.cs")
+# add_line("Mono module enabled", "Yes" if csharp_enabled else "No")
+# if csharp_enabled:
+# csharp_test.set_script(load("res://CSharpTest.cs"))
+# add_line("Operating System", csharp_test.OperatingSystem())
+# add_line("Platform Type", csharp_test.PlatformType())
+
+ add_header("Software")
+ add_line("OS name", OS.get_name())
+ add_line("Process ID", OS.get_process_id())
+ add_line("System dark mode supported", DisplayServer.is_dark_mode_supported())
+ add_line("System dark mode enabled", DisplayServer.is_dark_mode())
+ add_line("System accent color", "#%s" % DisplayServer.get_accent_color().to_html())
+
+ add_header("System directories")
+ add_line("Desktop", OS.get_system_dir(OS.SYSTEM_DIR_DESKTOP))
+ add_line("DCIM", OS.get_system_dir(OS.SYSTEM_DIR_DCIM))
+ add_line("Documents", OS.get_system_dir(OS.SYSTEM_DIR_DOCUMENTS))
+ add_line("Downloads", OS.get_system_dir(OS.SYSTEM_DIR_DOWNLOADS))
+ add_line("Movies", OS.get_system_dir(OS.SYSTEM_DIR_MOVIES))
+ add_line("Music", OS.get_system_dir(OS.SYSTEM_DIR_MUSIC))
+ add_line("Pictures", OS.get_system_dir(OS.SYSTEM_DIR_PICTURES))
+ add_line("Ringtones", OS.get_system_dir(OS.SYSTEM_DIR_RINGTONES))
+
+ add_header("Video")
+ add_line("Adapter name", RenderingServer.get_video_adapter_name())
+ add_line("Adapter vendor", RenderingServer.get_video_adapter_vendor())
+ add_line("Adapter type", [
+ "Other (Unknown)",
+ "Integrated",
+ "Discrete",
+ "Virtual",
+ "CPU",
+ ][RenderingServer.get_video_adapter_type()])
+ add_line("Adapter graphics API version", RenderingServer.get_video_adapter_api_version())
+
+ var video_adapter_driver_info = OS.get_video_adapter_driver_info()
+ if video_adapter_driver_info.size() > 0:
+ add_line("Adapter driver name", video_adapter_driver_info[0])
+ if video_adapter_driver_info.size() > 1:
+ add_line("Adapter driver version", video_adapter_driver_info[1])
diff --git a/source/addons/panku_console/modules/system_report/os_report.gd.uid b/source/addons/panku_console/modules/system_report/os_report.gd.uid
new file mode 100644
index 0000000..44193e4
--- /dev/null
+++ b/source/addons/panku_console/modules/system_report/os_report.gd.uid
@@ -0,0 +1 @@
+uid://dmmy0soeg4ihd
diff --git a/source/addons/panku_console/modules/texture_viewer/module.gd b/source/addons/panku_console/modules/texture_viewer/module.gd
new file mode 100644
index 0000000..5088464
--- /dev/null
+++ b/source/addons/panku_console/modules/texture_viewer/module.gd
@@ -0,0 +1,21 @@
+class_name PankuModuleTextureViewer extends PankuModule
+
+const texture_viewer_prefab = preload("./texture_viewer.tscn")
+
+func init_module():
+ core.new_expression_entered.connect(
+ func(exp:String, result):
+ if !result["failed"] and result["result"] is Texture2D:
+ add_texture_viewer_window(exp)
+ )
+
+func add_texture_viewer_window(expr:String):
+ #print("add_texture_viewer_window(%s)"%expr)
+ var texture_viewer := texture_viewer_prefab.instantiate()
+ texture_viewer.expr = expr
+ texture_viewer._module = self
+ var window:PankuLynxWindow = core.windows_manager.create_window(texture_viewer)
+ window.queue_free_on_close = true
+ window.set_window_title_text("Texture: " + expr)
+ window.position = window.get_layout_position(Control.PRESET_BOTTOM_LEFT)
+ window.move_to_front()
diff --git a/source/addons/panku_console/modules/texture_viewer/module.gd.uid b/source/addons/panku_console/modules/texture_viewer/module.gd.uid
new file mode 100644
index 0000000..ac6b3a1
--- /dev/null
+++ b/source/addons/panku_console/modules/texture_viewer/module.gd.uid
@@ -0,0 +1 @@
+uid://bjssjtuaw24jo
diff --git a/source/addons/panku_console/modules/texture_viewer/texture_viewer.gd b/source/addons/panku_console/modules/texture_viewer/texture_viewer.gd
new file mode 100644
index 0000000..bb47bb6
--- /dev/null
+++ b/source/addons/panku_console/modules/texture_viewer/texture_viewer.gd
@@ -0,0 +1,13 @@
+extends Control
+
+@onready var trect:TextureRect = $TextureRect
+
+var _module:PankuModule
+var expr:String
+
+func _physics_process(delta: float) -> void:
+ if Engine.get_physics_frames() % 10 != 1:
+ return
+ var result = _module.core.gd_exprenv.execute(expr)["result"]
+ if result is Texture2D:
+ trect.texture = ImageTexture.create_from_image(result.get_image())
diff --git a/source/addons/panku_console/modules/texture_viewer/texture_viewer.gd.uid b/source/addons/panku_console/modules/texture_viewer/texture_viewer.gd.uid
new file mode 100644
index 0000000..f9b86f3
--- /dev/null
+++ b/source/addons/panku_console/modules/texture_viewer/texture_viewer.gd.uid
@@ -0,0 +1 @@
+uid://dt0bpfgbi2gcb
diff --git a/source/addons/panku_console/modules/texture_viewer/texture_viewer.tscn b/source/addons/panku_console/modules/texture_viewer/texture_viewer.tscn
new file mode 100644
index 0000000..df593f4
--- /dev/null
+++ b/source/addons/panku_console/modules/texture_viewer/texture_viewer.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=2 format=3 uid="uid://diohs08jsami2"]
+
+[ext_resource type="Script" path="res://addons/panku_console/modules/texture_viewer/texture_viewer.gd" id="1_vljdg"]
+
+[node name="TextureViewer" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_vljdg")
+
+[node name="TextureRect" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+expand_mode = 1
diff --git a/source/addons/panku_console/modules/variable_tracker/module.gd b/source/addons/panku_console/modules/variable_tracker/module.gd
new file mode 100644
index 0000000..d1ab74d
--- /dev/null
+++ b/source/addons/panku_console/modules/variable_tracker/module.gd
@@ -0,0 +1,168 @@
+class_name PankuModuleVariableTracker extends PankuModule
+## Module to register and update some common environments.
+##
+## On module startup current scene root node registered as 'current' environment var,
+## for more convenient access from interactive shell. Module constantly monitoring node
+## tree afterwards and auto rebind 'current' environment in case of current scene changed.
+## Also all user autoload singletons registered with its root node names.
+
+const PROJECT_AUTOLOAD_PREFIX := "autoload/"
+const CURRENT_SCENE_ENV := "current"
+const SHELL_MODULE_NAME := "interactive_shell"
+const DEFAULT_TRACKING_DELAY := 0.5
+
+const CURRENT_REGISTERED_TIP := "[tip] Node '%s' registered as current scene, you can access it by [b]%s[/b]."
+const CURRENT_REMOVED_TIP := "[tip] No current scene found, [b]%s[/b] keyword is no longer available."
+const USER_AUTOLOADS_TIP := "[tip] Accessible user singleton modules: [b]%s[/b]"
+
+var _raw_exceptions_string: String = ""
+var _nodes_exception_regexp: RegEx
+
+var _reverse_root_nodes_order: bool
+var _current_scene_root:Node
+var _user_singleton_files := []
+var _tween_loop:Tween
+var _loop_call_back:CallbackTweener
+
+
+func init_module():
+ get_module_opt().tracking_delay = load_module_data("tracking_delay", DEFAULT_TRACKING_DELAY)
+ _reverse_root_nodes_order = load_module_data("use_last_as_current", true)
+ _raw_exceptions_string = load_module_data("root_node_exceptions", _raw_exceptions_string)
+
+ await core.get_tree().process_frame # not sure if it is necessary
+
+ update_exceptions_regexp()
+ _update_project_singleton_files()
+ _setup_scene_root_tracker()
+ _check_autoloads()
+
+
+# Build root node exceptions regular expression
+func update_exceptions_regexp() -> void:
+ if _raw_exceptions_string.is_empty():
+ _nodes_exception_regexp = RegEx.new() # not valid expression
+ return
+
+ _nodes_exception_regexp = RegEx.create_from_string(_raw_exceptions_string)
+
+ if not _nodes_exception_regexp.is_valid():
+ push_error("Can't parse '%s' expression for variable tracker" % _raw_exceptions_string)
+
+
+# Parse project setting and collect and autoload files.
+func _update_project_singleton_files() -> void:
+ _user_singleton_files.clear()
+ for property in ProjectSettings.get_property_list():
+ if property.name.begins_with(PROJECT_AUTOLOAD_PREFIX):
+ _user_singleton_files.append(ProjectSettings.get_setting(property.name).trim_prefix("*"))
+
+
+# Check if given node is autoload singleton.
+func _is_singleton(node: Node) -> bool:
+ # Comparing scene file and script file with list of autoload files
+ # from project settings. I'm not sure that approach hundred percent perfect,
+ # but it works so far.
+ if node.scene_file_path in _user_singleton_files:
+ return true
+
+ var script = node.get_script()
+ if script and (script.get_path() in _user_singleton_files):
+ return true
+
+ return false
+
+
+# Setup monitoring loop for current scene root node.
+func _setup_scene_root_tracker() -> void:
+ _check_current_scene()
+ # The whole idea looping something in the background
+ # while dev console is not even opened does not feel so right.
+ # Have no idea how to make it more elegant way,
+ # so lets make loop interval user controllable at least.
+ var tracking_delay = get_module_opt().tracking_delay
+
+ _tween_loop = core.create_tween()
+ _loop_call_back = _tween_loop.set_loops().tween_callback(_check_current_scene).set_delay(tracking_delay)
+
+
+## Set current scene root node monitoring interval.
+func change_tracking_delay(delay: float) -> void:
+ if _loop_call_back:
+ _loop_call_back.set_delay(delay)
+
+
+# Update current scene root node environment.
+func _check_current_scene() -> void:
+ var scene_root_found: Node = get_scene_root()
+
+ if scene_root_found:
+ if scene_root_found != _current_scene_root:
+ core.gd_exprenv.register_env(CURRENT_SCENE_ENV, scene_root_found)
+ _print_to_interactive_shell(CURRENT_REGISTERED_TIP % [scene_root_found.name, CURRENT_SCENE_ENV])
+
+ else:
+ if _current_scene_root:
+ core.gd_exprenv.remove_env(CURRENT_SCENE_ENV)
+ _print_to_interactive_shell(CURRENT_REMOVED_TIP % CURRENT_SCENE_ENV)
+
+ _current_scene_root = scene_root_found
+
+
+## Find the root node of current active scene.
+func get_scene_root() -> Node:
+ # Assuming current scene is the first node in tree that is not autoload singleton.
+ for node in _get_valid_root_nodes():
+ if not _is_singleton(node):
+ return node
+
+ return null
+
+
+# Get list of tree root nodes filtered and sorted according module settings
+func _get_valid_root_nodes() -> Array:
+ var nodes: Array = core.get_tree().root.get_children().filter(_root_nodes_filter)
+
+ if _reverse_root_nodes_order:
+ nodes.reverse()
+
+ return nodes
+
+
+# Filter function for tree root nodes
+func _root_nodes_filter(node: Node) -> bool:
+ # skip panku plugin itself
+ if node.name == core.SingletonName:
+ return false
+
+ # skip user defined exceptions
+ if _nodes_exception_regexp.is_valid() and _nodes_exception_regexp.search(node.name):
+ return false
+
+ return true
+
+
+# Find all autoload singletons and bind its to environment vars.
+func _check_autoloads() -> void:
+ var _user_singleton_names := []
+
+ for node in _get_valid_root_nodes():
+ if _is_singleton(node):
+ # register user singleton
+ _user_singleton_names.append(node.name)
+ core.gd_exprenv.register_env(node.name, node)
+
+ if not _user_singleton_names.is_empty():
+ _print_to_interactive_shell(USER_AUTOLOADS_TIP % ",".join(_user_singleton_names))
+
+
+# Print a tip to interactive shell module, modules load order does matter.
+func _print_to_interactive_shell(message: String) -> void:
+ if core.module_manager.has_module(SHELL_MODULE_NAME):
+ var ishell = core.module_manager.get_module(SHELL_MODULE_NAME)
+ ishell.interactive_shell.output(message)
+
+
+func quit_module():
+ _tween_loop.kill()
+ super.quit_module()
diff --git a/source/addons/panku_console/modules/variable_tracker/module.gd.uid b/source/addons/panku_console/modules/variable_tracker/module.gd.uid
new file mode 100644
index 0000000..adfa209
--- /dev/null
+++ b/source/addons/panku_console/modules/variable_tracker/module.gd.uid
@@ -0,0 +1 @@
+uid://bfauoc31bei37
diff --git a/source/addons/panku_console/modules/variable_tracker/opt.gd b/source/addons/panku_console/modules/variable_tracker/opt.gd
new file mode 100644
index 0000000..57114fa
--- /dev/null
+++ b/source/addons/panku_console/modules/variable_tracker/opt.gd
@@ -0,0 +1,32 @@
+extends ModuleOptions
+
+@export_group("variable_tracker")
+
+@export var export_comment_use_last_as_current = (
+ "Use last non singleton node as current scene. "
+ + "First node will be used if this option disabled."
+)
+@export var use_last_as_current: bool:
+ get:
+ return _module._reverse_root_nodes_order
+ set(value):
+ use_last_as_current = value
+ _module._reverse_root_nodes_order = value
+
+@export var export_comment_root_node_exceptions = (
+ "Top level nodes which will be ignored by variable tracker. "
+ + "Regular expressions can be used e.g. '(SignalBus|Game*)'."
+)
+@export var root_node_exceptions: String:
+ get:
+ return _module._raw_exceptions_string
+ set(value):
+ root_node_exceptions = value
+ _module._raw_exceptions_string = value
+ _module.update_exceptions_regexp()
+
+@export var export_comment_tracking_delay = "Current scene checking interval."
+@export_range(0.1, 2.0, 0.1) var tracking_delay := 0.5:
+ set(v):
+ tracking_delay = v
+ _module.change_tracking_delay(tracking_delay)
diff --git a/source/addons/panku_console/modules/variable_tracker/opt.gd.uid b/source/addons/panku_console/modules/variable_tracker/opt.gd.uid
new file mode 100644
index 0000000..f032ee8
--- /dev/null
+++ b/source/addons/panku_console/modules/variable_tracker/opt.gd.uid
@@ -0,0 +1 @@
+uid://ditwuts2auolh
diff --git a/source/addons/panku_console/plugin.cfg b/source/addons/panku_console/plugin.cfg
new file mode 100644
index 0000000..c5d4ff8
--- /dev/null
+++ b/source/addons/panku_console/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="PankuConsole"
+description="All-in-One Godot Engine runtime debugging tool."
+author="Feo (k2kra) Wu"
+version="1.7.8"
+script="plugin.gd"
diff --git a/source/addons/panku_console/plugin.gd b/source/addons/panku_console/plugin.gd
new file mode 100644
index 0000000..276b198
--- /dev/null
+++ b/source/addons/panku_console/plugin.gd
@@ -0,0 +1,132 @@
+@tool
+class_name PankuConsolePlugin
+extends EditorPlugin
+
+const SINGLETON_NAME = "Panku"
+const SINGLETON_PATH = "res://addons/panku_console/console.tscn"
+const SINGLETON_OPTION = "autoload/" + SINGLETON_NAME
+const INITIAL_DEFAULT_CONFIG_FILE_PATH = "res://addons/panku_console/default_panku_config.cfg"
+
+const CONFIG_SECTION = "panku"
+const OPTIONS = {
+ # See https://github.com/Ark2000/PankuConsole/issues/170
+ DISABLE_ON_RELEASE = 'disable_on_release',
+ # See https://github.com/Ark2000/PankuConsole/issues/173
+ CUSTOM_DEFAULT_CONFIG = 'custom_default_config',
+}
+
+var exporter: PankuExporter
+
+# Custom export plugin to automatically disable console in release builds
+class PankuExporter extends EditorExportPlugin:
+ const NAME = "Panku"
+ var owner: EditorPlugin
+ var need_restore_singleton: bool
+
+
+ func _get_name() -> String:
+ # Have no clue where this name will be used
+ # It just should be implemented according the docs
+ return NAME
+
+
+ func _export_begin(_features: PackedStringArray, is_debug: bool, _path: String, _flags: int) -> void:
+ need_restore_singleton = false
+ var disable_activated: bool = ProjectSettings.get_setting(owner.panku_option(OPTIONS.DISABLE_ON_RELEASE))
+
+ if not is_debug and disable_activated:
+ need_restore_singleton = ProjectSettings.has_setting(SINGLETON_OPTION)
+ owner.safe_remove_singleton()
+
+
+ func _export_end() -> void:
+ if need_restore_singleton:
+ owner.safe_add_singleton()
+
+# A helper function to add custom project settings
+# See https://dfaction.net/handling-custom-project-settings-using-gdscript/
+static func add_custom_project_setting(name: String, default_value, type: int, hint: int = PROPERTY_HINT_NONE, hint_string: String = "") -> void:
+ if ProjectSettings.has_setting(name): return
+
+ var setting_info: Dictionary = {
+ "name": name,
+ "type": type,
+ "hint": hint,
+ "hint_string": hint_string
+ }
+
+ ProjectSettings.set_setting(name, default_value)
+ ProjectSettings.add_property_info(setting_info)
+ ProjectSettings.set_initial_value(name, default_value)
+ ProjectSettings.set_as_basic(name, true)
+
+# Full option name in project settings.
+static func panku_option(option: String) -> String:
+ return CONFIG_SECTION + "/" + option
+
+static func get_custom_default_config_path() -> String:
+ return ProjectSettings.get_setting(panku_option(OPTIONS.CUSTOM_DEFAULT_CONFIG), INITIAL_DEFAULT_CONFIG_FILE_PATH)
+
+static func is_custom_default_config_exists() -> bool:
+ return FileAccess.file_exists(get_custom_default_config_path())
+
+# Adding singleton with preliminary check to avoid any conflicts.
+func safe_add_singleton() -> void:
+ if not ProjectSettings.has_setting(SINGLETON_OPTION):
+ add_autoload_singleton(SINGLETON_NAME, SINGLETON_PATH)
+
+
+# Removing singleton with preliminary check to avoid any conflicts.
+func safe_remove_singleton() -> void:
+ if ProjectSettings.has_setting(SINGLETON_OPTION):
+ remove_autoload_singleton(SINGLETON_NAME)
+
+func create_setting() -> void:
+ # Seems we can't add descriptions to custom settings now.
+
+ # Disable Panku Console in release builds
+ add_custom_project_setting(
+ panku_option(OPTIONS.DISABLE_ON_RELEASE),
+ false,
+ TYPE_BOOL
+ )
+ # Path to the custom `res://` path default config file, useful if you are going to keep panku console in release builds.
+ add_custom_project_setting(
+ panku_option(OPTIONS.CUSTOM_DEFAULT_CONFIG),
+ INITIAL_DEFAULT_CONFIG_FILE_PATH,
+ TYPE_STRING,
+ PROPERTY_HINT_FILE,
+ "*.cfg"
+ )
+
+ var error:int = ProjectSettings.save()
+ if error != OK:
+ push_error("Encountered error %d when saving project settings." % error)
+
+func _enter_tree() -> void:
+ # See https://github.com/godotengine/godot/issues/73525
+ exporter = (PankuExporter as Variant).new()
+ exporter.owner = self
+ add_export_plugin(exporter)
+ create_setting()
+
+ safe_add_singleton()
+ print("[Panku Console] initialized! Project page: https://github.com/Ark2000/PankuConsole")
+
+ if not is_custom_default_config_exists():
+ push_warning("[Panku Console] Default config file not found. Using code-level default config.")
+
+func _exit_tree() -> void:
+ remove_export_plugin(exporter)
+
+
+func _disable_plugin() -> void:
+ safe_remove_singleton()
+
+ for option in OPTIONS.values():
+ var opt: String = panku_option(option)
+ if ProjectSettings.has_setting(opt):
+ ProjectSettings.clear(opt)
+ ProjectSettings.save()
+
+ print("[Panku Console] disabled.")
diff --git a/source/addons/panku_console/plugin.gd.uid b/source/addons/panku_console/plugin.gd.uid
new file mode 100644
index 0000000..5a451eb
--- /dev/null
+++ b/source/addons/panku_console/plugin.gd.uid
@@ -0,0 +1 @@
+uid://bfoeovu4un3da
diff --git a/source/addons/panku_console/res/effect/square_shadow.png b/source/addons/panku_console/res/effect/square_shadow.png
new file mode 100644
index 0000000..213fe2c
Binary files /dev/null and b/source/addons/panku_console/res/effect/square_shadow.png differ
diff --git a/source/addons/panku_console/res/effect/square_shadow.png.import b/source/addons/panku_console/res/effect/square_shadow.png.import
new file mode 100644
index 0000000..e3057b0
--- /dev/null
+++ b/source/addons/panku_console/res/effect/square_shadow.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dvr12fl5prm78"
+path="res://.godot/imported/square_shadow.png-0b7f91b74dd24247868957be13db72f4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/effect/square_shadow.png"
+dest_files=["res://.godot/imported/square_shadow.png-0b7f91b74dd24247868957be13db72f4.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=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=true
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/source/addons/panku_console/res/green_gradient_1d.tres b/source/addons/panku_console/res/green_gradient_1d.tres
new file mode 100644
index 0000000..b2e8aa1
--- /dev/null
+++ b/source/addons/panku_console/res/green_gradient_1d.tres
@@ -0,0 +1,4 @@
+[gd_resource type="Gradient" format=3 uid="uid://nr65cgweqh8n"]
+
+[resource]
+colors = PackedColorArray(0.129412, 0.14902, 0.180392, 0.501961, 0.129412, 0.14902, 0.180392, 0)
diff --git a/source/addons/panku_console/res/icons2/add.svg b/source/addons/panku_console/res/icons2/add.svg
new file mode 100644
index 0000000..d0cbaf1
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/add.svg.import b/source/addons/panku_console/res/icons2/add.svg.import
new file mode 100644
index 0000000..210a639
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/add.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dprpfr0l5xvmu"
+path="res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/add.svg"
+dest_files=["res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg b/source/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg
new file mode 100644
index 0000000..429e411
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg.import
new file mode 100644
index 0000000..ef78742
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdxbns8lyctqp"
+path="res://.godot/imported/arrow-down-svgrepo-com.svg-38ccb799fe0295b6eb8e51628325ac00.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg"
+dest_files=["res://.godot/imported/arrow-down-svgrepo-com.svg-38ccb799fe0295b6eb8e51628325ac00.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg b/source/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg
new file mode 100644
index 0000000..85982c5
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg.import
new file mode 100644
index 0000000..19929d1
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d0k813mm5y0d5"
+path="res://.godot/imported/arrow-up-md-svgrepo-com.svg-0d7dc8f9b4626627fc89d656dd6522e5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg"
+dest_files=["res://.godot/imported/arrow-up-md-svgrepo-com.svg-0d7dc8f9b4626627fc89d656dd6522e5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg b/source/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg
new file mode 100644
index 0000000..8842fee
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg.import
new file mode 100644
index 0000000..1f324c3
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cngs5d4uosvmt"
+path="res://.godot/imported/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg-b7f02697b5af6027969d40533290cf43.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg"
+dest_files=["res://.godot/imported/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg-b7f02697b5af6027969d40533290cf43.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg b/source/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg
new file mode 100644
index 0000000..e3b8168
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg.import
new file mode 100644
index 0000000..05cb3c8
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://x2wmejhxundv"
+path="res://.godot/imported/bookmark-filled-svgrepo-com.svg-36e232dcc8b8fb5b9792fabd49d75fb9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg"
+dest_files=["res://.godot/imported/bookmark-filled-svgrepo-com.svg-36e232dcc8b8fb5b9792fabd49d75fb9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg b/source/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg
new file mode 100644
index 0000000..f7fae38
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg.import
new file mode 100644
index 0000000..dd2c3c3
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://232vc3pkp4kt"
+path="res://.godot/imported/bookmark-svgrepo-com.svg-ff120b5ee0d289505ac4f825e8ec66d9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/bookmark-svgrepo-com.svg"
+dest_files=["res://.godot/imported/bookmark-svgrepo-com.svg-ff120b5ee0d289505ac4f825e8ec66d9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/check-svgrepo-com.svg b/source/addons/panku_console/res/icons2/check-svgrepo-com.svg
new file mode 100644
index 0000000..b0a18cf
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/check-svgrepo-com.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/check-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/check-svgrepo-com.svg.import
new file mode 100644
index 0000000..4898009
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/check-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://2cjvp0dp8ede"
+path="res://.godot/imported/check-svgrepo-com.svg-034d6c5925c00dc6c3cf6966293ed643.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/check-svgrepo-com.svg"
+dest_files=["res://.godot/imported/check-svgrepo-com.svg-034d6c5925c00dc6c3cf6966293ed643.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/checkbox_checked.svg b/source/addons/panku_console/res/icons2/checkbox_checked.svg
new file mode 100644
index 0000000..970edd0
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/checkbox_checked.svg
@@ -0,0 +1,22 @@
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/checkbox_checked.svg.import b/source/addons/panku_console/res/icons2/checkbox_checked.svg.import
new file mode 100644
index 0000000..8e3f7d2
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/checkbox_checked.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bua84a0uv8ntw"
+path="res://.godot/imported/checkbox_checked.svg-b5d0aaca03398eb49c2d410cf3c86d9a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/checkbox_checked.svg"
+dest_files=["res://.godot/imported/checkbox_checked.svg-b5d0aaca03398eb49c2d410cf3c86d9a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/checkbox_unchecked.svg b/source/addons/panku_console/res/icons2/checkbox_unchecked.svg
new file mode 100644
index 0000000..609e889
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/checkbox_unchecked.svg
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/checkbox_unchecked.svg.import b/source/addons/panku_console/res/icons2/checkbox_unchecked.svg.import
new file mode 100644
index 0000000..bc8f59c
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/checkbox_unchecked.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkiyle8rjahmw"
+path="res://.godot/imported/checkbox_unchecked.svg-43408d4debc25d7804c4c806c8681c45.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/checkbox_unchecked.svg"
+dest_files=["res://.godot/imported/checkbox_unchecked.svg-43408d4debc25d7804c4c806c8681c45.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/chevron_right.svg b/source/addons/panku_console/res/icons2/chevron_right.svg
new file mode 100644
index 0000000..650d8f2
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/chevron_right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/chevron_right.svg.import b/source/addons/panku_console/res/icons2/chevron_right.svg.import
new file mode 100644
index 0000000..2939cea
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/chevron_right.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ws58gucuygx1"
+path="res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/chevron_right.svg"
+dest_files=["res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/close.svg b/source/addons/panku_console/res/icons2/close.svg
new file mode 100644
index 0000000..05fb420
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/close.svg.import b/source/addons/panku_console/res/icons2/close.svg.import
new file mode 100644
index 0000000..c1cd331
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/close.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8g5afcuanbl6"
+path="res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/close.svg"
+dest_files=["res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/close_20x.svg b/source/addons/panku_console/res/icons2/close_20x.svg
new file mode 100644
index 0000000..4aab7f5
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/close_20x.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/close_20x.svg.import b/source/addons/panku_console/res/icons2/close_20x.svg.import
new file mode 100644
index 0000000..a08ac18
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/close_20x.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ttbgv1vr1xsc"
+path="res://.godot/imported/close_20x.svg-9ead6c9c7ae149729de0bac95295aaba.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/close_20x.svg"
+dest_files=["res://.godot/imported/close_20x.svg-9ead6c9c7ae149729de0bac95295aaba.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/expand_more.svg b/source/addons/panku_console/res/icons2/expand_more.svg
new file mode 100644
index 0000000..61fa21d
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/expand_more.svg
@@ -0,0 +1 @@
+
diff --git a/source/addons/panku_console/res/icons2/expand_more.svg.import b/source/addons/panku_console/res/icons2/expand_more.svg.import
new file mode 100644
index 0000000..6ccfe1b
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/expand_more.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d1qaq6vnyc2f2"
+path="res://.godot/imported/expand_more.svg-156eef34c01d1545ad526cf0292ef120.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/expand_more.svg"
+dest_files=["res://.godot/imported/expand_more.svg-156eef34c01d1545ad526cf0292ef120.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/eye.svg b/source/addons/panku_console/res/icons2/eye.svg
new file mode 100644
index 0000000..171a612
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/eye.svg.import b/source/addons/panku_console/res/icons2/eye.svg.import
new file mode 100644
index 0000000..519f978
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/eye.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cvli654t5ybne"
+path="res://.godot/imported/eye.svg-6814b908d03cc1398c9846342a0966fc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/eye.svg"
+dest_files=["res://.godot/imported/eye.svg-6814b908d03cc1398c9846342a0966fc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/favorite.svg b/source/addons/panku_console/res/icons2/favorite.svg
new file mode 100644
index 0000000..4bd196b
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/favorite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/favorite.svg.import b/source/addons/panku_console/res/icons2/favorite.svg.import
new file mode 100644
index 0000000..1b05001
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/favorite.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://hf6h8otb8qkv"
+path="res://.godot/imported/favorite.svg-94e3b968ddcfab82f19abf606a6cd9bb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/favorite.svg"
+dest_files=["res://.godot/imported/favorite.svg-94e3b968ddcfab82f19abf606a6cd9bb.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/fold-svgrepo-com.svg b/source/addons/panku_console/res/icons2/fold-svgrepo-com.svg
new file mode 100644
index 0000000..0d9ed74
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/fold-svgrepo-com.svg
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/fold-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/fold-svgrepo-com.svg.import
new file mode 100644
index 0000000..0d7d509
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/fold-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dchvk7qgfe37m"
+path="res://.godot/imported/fold-svgrepo-com.svg-6f951c0c7f0583013a7f3fa96d045e61.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/fold-svgrepo-com.svg"
+dest_files=["res://.godot/imported/fold-svgrepo-com.svg-6f951c0c7f0583013a7f3fa96d045e61.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=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/gear.svg b/source/addons/panku_console/res/icons2/gear.svg
new file mode 100644
index 0000000..569706f
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/gear.svg
@@ -0,0 +1,10 @@
+
diff --git a/source/addons/panku_console/res/icons2/gear.svg.import b/source/addons/panku_console/res/icons2/gear.svg.import
new file mode 100644
index 0000000..06ab211
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/gear.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ch214eu302abt"
+path="res://.godot/imported/gear.svg-bd633691cf7fd6c996b8a22361898045.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/gear.svg"
+dest_files=["res://.godot/imported/gear.svg-bd633691cf7fd6c996b8a22361898045.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/history.svg b/source/addons/panku_console/res/icons2/history.svg
new file mode 100644
index 0000000..0d691fe
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/history.svg
@@ -0,0 +1,9 @@
+
diff --git a/source/addons/panku_console/res/icons2/history.svg.import b/source/addons/panku_console/res/icons2/history.svg.import
new file mode 100644
index 0000000..56c166c
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/history.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://kkrqc0j1wdi6"
+path="res://.godot/imported/history.svg-a137f2f4fbb3649b91b01d8def6f6456.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/history.svg"
+dest_files=["res://.godot/imported/history.svg-a137f2f4fbb3649b91b01d8def6f6456.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/info.svg b/source/addons/panku_console/res/icons2/info.svg
new file mode 100644
index 0000000..0e9ea7a
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/info.svg.import b/source/addons/panku_console/res/icons2/info.svg.import
new file mode 100644
index 0000000..da8b294
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/info.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dxvodkcmn4pa8"
+path="res://.godot/imported/info.svg-2b1105336c45eeebd4acdf04c60c8bdb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/info.svg"
+dest_files=["res://.godot/imported/info.svg-2b1105336c45eeebd4acdf04c60c8bdb.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/info2.svg b/source/addons/panku_console/res/icons2/info2.svg
new file mode 100644
index 0000000..e3db00e
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/info2.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/info2.svg.import b/source/addons/panku_console/res/icons2/info2.svg.import
new file mode 100644
index 0000000..87aaf96
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/info2.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6jt0ggmuoyeb"
+path="res://.godot/imported/info2.svg-c9ea3dad2575e3684098e5112249010d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/info2.svg"
+dest_files=["res://.godot/imported/info2.svg-c9ea3dad2575e3684098e5112249010d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/keyboard.svg b/source/addons/panku_console/res/icons2/keyboard.svg
new file mode 100644
index 0000000..6cdb9a1
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/keyboard.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/keyboard.svg.import b/source/addons/panku_console/res/icons2/keyboard.svg.import
new file mode 100644
index 0000000..87f3d69
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/keyboard.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqxh6hk3op1wv"
+path="res://.godot/imported/keyboard.svg-65a8773013921e61a1cc3ef80ef82693.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/keyboard.svg"
+dest_files=["res://.godot/imported/keyboard.svg-65a8773013921e61a1cc3ef80ef82693.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/menu.svg b/source/addons/panku_console/res/icons2/menu.svg
new file mode 100644
index 0000000..febcbbe
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/menu.svg.import b/source/addons/panku_console/res/icons2/menu.svg.import
new file mode 100644
index 0000000..13b3623
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/menu.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dosm26riekruh"
+path="res://.godot/imported/menu.svg-15ef2ef76b3f6c0e7fc0168d1ac05d38.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/menu.svg"
+dest_files=["res://.godot/imported/menu.svg-15ef2ef76b3f6c0e7fc0168d1ac05d38.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/more_horiz.svg b/source/addons/panku_console/res/icons2/more_horiz.svg
new file mode 100644
index 0000000..73560d0
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/more_horiz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/more_horiz.svg.import b/source/addons/panku_console/res/icons2/more_horiz.svg.import
new file mode 100644
index 0000000..1cc38b6
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/more_horiz.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bbc41a7b3jre0"
+path="res://.godot/imported/more_horiz.svg-7ca01f2b54bfa3040d05158756af7968.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/more_horiz.svg"
+dest_files=["res://.godot/imported/more_horiz.svg-7ca01f2b54bfa3040d05158756af7968.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/open_with.svg b/source/addons/panku_console/res/icons2/open_with.svg
new file mode 100644
index 0000000..d6c2bae
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/open_with.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/open_with.svg.import b/source/addons/panku_console/res/icons2/open_with.svg.import
new file mode 100644
index 0000000..0218874
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/open_with.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b22jdciwq07ic"
+path="res://.godot/imported/open_with.svg-4c7b4bea2cb5c0a1af405d61d3d85fa3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/open_with.svg"
+dest_files=["res://.godot/imported/open_with.svg-4c7b4bea2cb5c0a1af405d61d3d85fa3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg b/source/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg
new file mode 100644
index 0000000..6aba11b
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg.import
new file mode 100644
index 0000000..be3a9de
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cpfnfg1aw6xso"
+path="res://.godot/imported/pause-1010-svgrepo-com.svg-8a4549394af5099adcc9e7d6754d8258.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg"
+dest_files=["res://.godot/imported/pause-1010-svgrepo-com.svg-8a4549394af5099adcc9e7d6754d8258.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg b/source/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg
new file mode 100644
index 0000000..7cebe14
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg.import
new file mode 100644
index 0000000..dd29309
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ecmevhk0tuas"
+path="res://.godot/imported/play-1001-svgrepo-com.svg-6dda54bd1afb4351b91dc74d89d43c7f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/play-1001-svgrepo-com.svg"
+dest_files=["res://.godot/imported/play-1001-svgrepo-com.svg-6dda54bd1afb4351b91dc74d89d43c7f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg b/source/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg
new file mode 100644
index 0000000..e59c21a
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg
@@ -0,0 +1,14 @@
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg.import
new file mode 100644
index 0000000..a8959cd
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gav3m4qtvgje"
+path="res://.godot/imported/pop-out-svgrepo-com.svg-54bb73635d5759933a88bbec8ed6aca8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/pop-out-svgrepo-com.svg"
+dest_files=["res://.godot/imported/pop-out-svgrepo-com.svg-54bb73635d5759933a88bbec8ed6aca8.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/question.svg b/source/addons/panku_console/res/icons2/question.svg
new file mode 100644
index 0000000..f6a29dd
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/question.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/question.svg.import b/source/addons/panku_console/res/icons2/question.svg.import
new file mode 100644
index 0000000..1a53973
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/question.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ca6btx2q3g7q8"
+path="res://.godot/imported/question.svg-b2322d216b84b418e5a3bac06c50c9e3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/question.svg"
+dest_files=["res://.godot/imported/question.svg-b2322d216b84b418e5a3bac06c50c9e3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/remove.svg b/source/addons/panku_console/res/icons2/remove.svg
new file mode 100644
index 0000000..bee8c68
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/remove.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/remove.svg.import b/source/addons/panku_console/res/icons2/remove.svg.import
new file mode 100644
index 0000000..63fe8a4
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/remove.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dnexm7u6lq3km"
+path="res://.godot/imported/remove.svg-76a0d91c4b08193a23093f3f0fc3dcaf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/remove.svg"
+dest_files=["res://.godot/imported/remove.svg-76a0d91c4b08193a23093f3f0fc3dcaf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/rename-svgrepo-com.svg b/source/addons/panku_console/res/icons2/rename-svgrepo-com.svg
new file mode 100644
index 0000000..5e80b7a
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/rename-svgrepo-com.svg
@@ -0,0 +1,114 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/rename-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/rename-svgrepo-com.svg.import
new file mode 100644
index 0000000..f5b6f73
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/rename-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://brf6iwx4r6bdd"
+path="res://.godot/imported/rename-svgrepo-com.svg-5ec15595e7d5857527ce81e8c9082a28.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/rename-svgrepo-com.svg"
+dest_files=["res://.godot/imported/rename-svgrepo-com.svg-5ec15595e7d5857527ce81e8c9082a28.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/reply.svg b/source/addons/panku_console/res/icons2/reply.svg
new file mode 100644
index 0000000..2f85918
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/reply.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/reply.svg.import b/source/addons/panku_console/res/icons2/reply.svg.import
new file mode 100644
index 0000000..307cb1b
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/reply.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4jd6tqlie0wx"
+path="res://.godot/imported/reply.svg-198ceccf73b6dc82a4737a0814707430.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/reply.svg"
+dest_files=["res://.godot/imported/reply.svg-198ceccf73b6dc82a4737a0814707430.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/resize-svgrepo-com.svg b/source/addons/panku_console/res/icons2/resize-svgrepo-com.svg
new file mode 100644
index 0000000..c9a716d
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/resize-svgrepo-com.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/source/addons/panku_console/res/icons2/resize-svgrepo-com.svg.import b/source/addons/panku_console/res/icons2/resize-svgrepo-com.svg.import
new file mode 100644
index 0000000..ed250df
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/resize-svgrepo-com.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ciu5jiw4xmkq0"
+path="res://.godot/imported/resize-svgrepo-com.svg-cd0763e17be8b93faf6e99fda452ac2a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/resize-svgrepo-com.svg"
+dest_files=["res://.godot/imported/resize-svgrepo-com.svg-cd0763e17be8b93faf6e99fda452ac2a.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=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/search.svg b/source/addons/panku_console/res/icons2/search.svg
new file mode 100644
index 0000000..e14d7af
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/addons/panku_console/res/icons2/search.svg.import b/source/addons/panku_console/res/icons2/search.svg.import
new file mode 100644
index 0000000..db11eb3
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/search.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gtslyq1kvnxc"
+path="res://.godot/imported/search.svg-cbe7bc4d5cf71611ed1b364ee4407142.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/search.svg"
+dest_files=["res://.godot/imported/search.svg-cbe7bc4d5cf71611ed1b364ee4407142.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/icons2/swap_horiz.svg b/source/addons/panku_console/res/icons2/swap_horiz.svg
new file mode 100644
index 0000000..4bf16b0
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/swap_horiz.svg
@@ -0,0 +1 @@
+
diff --git a/source/addons/panku_console/res/icons2/swap_horiz.svg.import b/source/addons/panku_console/res/icons2/swap_horiz.svg.import
new file mode 100644
index 0000000..e50f875
--- /dev/null
+++ b/source/addons/panku_console/res/icons2/swap_horiz.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bc2g8vv0x3d8y"
+path="res://.godot/imported/swap_horiz.svg-3fa7c06ee39a243e7a12b5915f37a894.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/panku_console/res/icons2/swap_horiz.svg"
+dest_files=["res://.godot/imported/swap_horiz.svg-3fa7c06ee39a243e7a12b5915f37a894.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/panku_console/res/panku_console_theme.tres b/source/addons/panku_console/res/panku_console_theme.tres
new file mode 100644
index 0000000..69306e9
--- /dev/null
+++ b/source/addons/panku_console/res/panku_console_theme.tres
@@ -0,0 +1,137 @@
+[gd_resource type="Theme" load_steps=26 format=3 uid="uid://bk18yfu0d77wk"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1q17k"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_j0iw5"]
+bg_color = Color(0.160784, 0.160784, 0.160784, 0.12549)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.0627451)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2sv8t"]
+content_margin_left = 4.0
+content_margin_top = 2.0
+content_margin_right = 4.0
+content_margin_bottom = 2.0
+bg_color = Color(0, 0, 0, 0.12549)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.0627451)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oko07"]
+content_margin_left = 4.0
+content_margin_top = 2.0
+content_margin_right = 4.0
+content_margin_bottom = 2.0
+bg_color = Color(0.639216, 0.639216, 0.639216, 0.12549)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.0627451)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_66h6h"]
+bg_color = Color(1, 1, 1, 0.4)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_io0fu"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5a1x3"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_olfos"]
+content_margin_top = 8.0
+bg_color = Color(0.6, 0.6, 0.6, 0.12549)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.25098)
+expand_margin_top = 8.0
+
+[sub_resource type="ImageTexture" id="ImageTexture_p3ihr"]
+
+[sub_resource type="ImageTexture" id="ImageTexture_e0rko"]
+
+[sub_resource type="ImageTexture" id="ImageTexture_1il84"]
+
+[sub_resource type="ImageTexture" id="ImageTexture_amjqe"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pc3w4"]
+bg_color = Color(1, 1, 1, 0.501961)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xodll"]
+bg_color = Color(1, 1, 1, 0.501961)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_y3ihc"]
+content_margin_top = 23.0
+bg_color = Color(0, 0, 0, 0.25098)
+border_color = Color(0.6, 0.6, 0.6, 0.25098)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_36yn6"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1hrnt"]
+content_margin_left = 8.0
+bg_color = Color(0, 0, 0, 0.12549)
+border_width_left = 2
+border_color = Color(0.8, 0.8, 0.8, 0.25098)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xot6g"]
+content_margin_left = 4.0
+draw_center = false
+border_width_left = 2
+border_color = Color(0.8, 0.8, 0.8, 0.12549)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bcc4x"]
+bg_color = Color(0.317647, 0.317647, 0.317647, 0.901961)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_nqr1r"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_abx0a"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_37w0u"]
+bg_color = Color(1, 1, 1, 0.501961)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mhjmb"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_iamty"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jdo31"]
+content_margin_left = 8.0
+bg_color = Color(0.6, 0.6, 0.6, 0.12549)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.25098)
+
+[resource]
+default_font_size = 16
+Button/styles/focus = SubResource("StyleBoxEmpty_1q17k")
+Button/styles/hover = SubResource("StyleBoxFlat_j0iw5")
+Button/styles/normal = SubResource("StyleBoxFlat_2sv8t")
+Button/styles/pressed = SubResource("StyleBoxFlat_oko07")
+HScrollBar/styles/grabber = SubResource("StyleBoxFlat_66h6h")
+HScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_io0fu")
+HScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_5a1x3")
+HScrollBar/styles/scroll = SubResource("StyleBoxFlat_olfos")
+HSlider/icons/grabber = SubResource("ImageTexture_p3ihr")
+HSlider/icons/grabber_disabled = SubResource("ImageTexture_e0rko")
+HSlider/icons/grabber_highlight = SubResource("ImageTexture_1il84")
+HSlider/icons/tick = SubResource("ImageTexture_amjqe")
+HSlider/styles/grabber_area = SubResource("StyleBoxFlat_pc3w4")
+HSlider/styles/grabber_area_highlight = SubResource("StyleBoxFlat_xodll")
+HSlider/styles/slider = SubResource("StyleBoxFlat_y3ihc")
+LineEdit/styles/focus = SubResource("StyleBoxEmpty_36yn6")
+LineEdit/styles/normal = SubResource("StyleBoxFlat_1hrnt")
+LineEdit/styles/read_only = SubResource("StyleBoxFlat_xot6g")
+PopupMenu/styles/panel = SubResource("StyleBoxFlat_bcc4x")
+RichTextLabel/colors/default_color = Color(1, 1, 1, 0.878431)
+RichTextLabel/styles/focus = SubResource("StyleBoxEmpty_nqr1r")
+RichTextLabel/styles/normal = SubResource("StyleBoxEmpty_abx0a")
+VScrollBar/styles/grabber = SubResource("StyleBoxFlat_37w0u")
+VScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_mhjmb")
+VScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_iamty")
+VScrollBar/styles/scroll = SubResource("StyleBoxFlat_jdo31")
diff --git a/source/addons/panku_console/res/shader/mattias_crt.gdshader b/source/addons/panku_console/res/shader/mattias_crt.gdshader
new file mode 100644
index 0000000..1251da1
--- /dev/null
+++ b/source/addons/panku_console/res/shader/mattias_crt.gdshader
@@ -0,0 +1,63 @@
+// Source: https://www.shadertoy.com/view/Ms23DR
+// Loosely based on postprocessing shader by inigo quilez, License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
+
+shader_type canvas_item;
+
+uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest;
+
+vec2 curve(vec2 uv) {
+ uv = (uv - 0.5) * 2.0;
+ uv *= 1.1;
+ uv.x *= 1.0 + pow(abs(uv.y) / 5.0, 2.0);
+ uv.y *= 1.0 + pow(abs(uv.x) / 4.0, 2.0);
+ uv = (uv / 2.0) + 0.5;
+ uv = uv * 0.92 + 0.04;
+ return uv;
+}
+
+void fragment() {
+ vec2 fragCoord = FRAGCOORD.xy;
+ vec2 iResolution = 1.0 / SCREEN_PIXEL_SIZE;
+ float iTime = TIME;
+ vec2 q = fragCoord.xy / iResolution.xy;
+ vec2 uv = q;
+ uv = curve( uv );
+ vec3 oricol = texture( screen_texture, vec2(q.x,q.y) ).xyz;
+ vec3 col;
+ float x = sin(0.3*iTime+uv.y*21.0)*sin(0.7*iTime+uv.y*29.0)*sin(0.3+0.33*iTime+uv.y*31.0)*0.0017;
+
+ col.r = texture(screen_texture,vec2(x+uv.x+0.001,uv.y+0.001)).x+0.05;
+ col.g = texture(screen_texture,vec2(x+uv.x+0.000,uv.y-0.002)).y+0.05;
+ col.b = texture(screen_texture,vec2(x+uv.x-0.002,uv.y+0.000)).z+0.05;
+ col.r += 0.08*texture(screen_texture,0.75*vec2(x+0.025, -0.027)+vec2(uv.x+0.001,uv.y+0.001)).x;
+ col.g += 0.05*texture(screen_texture,0.75*vec2(x+-0.022, -0.02)+vec2(uv.x+0.000,uv.y-0.002)).y;
+ col.b += 0.08*texture(screen_texture,0.75*vec2(x+-0.02, -0.018)+vec2(uv.x-0.002,uv.y+0.000)).z;
+
+ col = clamp(col*0.6+0.4*col*col*1.0,0.0,1.0);
+
+ float vig = (0.0 + 1.0*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y));
+ col *= vec3(pow(vig,0.3));
+
+ col *= vec3(0.95,1.05,0.95);
+ col *= 2.8;
+
+ float scans = clamp( 0.35+0.35*sin(3.5*iTime+uv.y*iResolution.y*1.5), 0.0, 1.0);
+
+ float s = pow(scans,1.7);
+ col = col*vec3( 0.4+0.7*s) ;
+
+ col *= 1.0+0.01*sin(110.0*iTime);
+ if (uv.x < 0.0 || uv.x > 1.0)
+ col *= 0.0;
+ if (uv.y < 0.0 || uv.y > 1.0)
+ col *= 0.0;
+
+ col*=1.0-0.65*vec3(clamp((mod(fragCoord.x, 2.0)-1.0)*2.0,0.0,1.0));
+
+ float comp = smoothstep( 0.1, 0.9, sin(iTime) );
+
+ // Remove the next line to stop cross-fade between original and postprocess
+// col = mix( col, oricol, comp );
+
+ COLOR = vec4(col,1.0);
+}
diff --git a/source/addons/panku_console/res/shader/mattias_crt.gdshader.uid b/source/addons/panku_console/res/shader/mattias_crt.gdshader.uid
new file mode 100644
index 0000000..1958363
--- /dev/null
+++ b/source/addons/panku_console/res/shader/mattias_crt.gdshader.uid
@@ -0,0 +1 @@
+uid://dvmt0jmegy6yq
diff --git a/source/addons/panku_console/res/shader/simple_fast_blur.gdshader b/source/addons/panku_console/res/shader/simple_fast_blur.gdshader
new file mode 100644
index 0000000..4667743
--- /dev/null
+++ b/source/addons/panku_console/res/shader/simple_fast_blur.gdshader
@@ -0,0 +1,10 @@
+shader_type canvas_item;
+
+uniform float lod:hint_range(0.0, 5.0) = 0.0;
+uniform vec4 modulate:source_color = vec4(1.0);
+uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_linear_mipmap;
+
+void fragment() {
+ vec3 col = textureLod(screen_texture, SCREEN_UV, lod).rgb;
+ COLOR = vec4(mix(col, modulate.rgb, modulate.a), 1.0);
+}
diff --git a/source/addons/panku_console/res/shader/simple_fast_blur.gdshader.uid b/source/addons/panku_console/res/shader/simple_fast_blur.gdshader.uid
new file mode 100644
index 0000000..2a8ac8e
--- /dev/null
+++ b/source/addons/panku_console/res/shader/simple_fast_blur.gdshader.uid
@@ -0,0 +1 @@
+uid://djvmgn5gjuc3e
diff --git a/source/addons/run-configs/editor/assets/PlayConfig.svg b/source/addons/run-configs/editor/assets/PlayConfig.svg
new file mode 100644
index 0000000..65edb63
--- /dev/null
+++ b/source/addons/run-configs/editor/assets/PlayConfig.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/source/addons/run-configs/editor/assets/PlayConfig.svg.import b/source/addons/run-configs/editor/assets/PlayConfig.svg.import
new file mode 100644
index 0000000..a64b34a
--- /dev/null
+++ b/source/addons/run-configs/editor/assets/PlayConfig.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://chdilfj6p83xr"
+path="res://.godot/imported/PlayConfig.svg-9108fdc6839a4b29e144f2dcf6095160.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/run-configs/editor/assets/PlayConfig.svg"
+dest_files=["res://.godot/imported/PlayConfig.svg-9108fdc6839a4b29e144f2dcf6095160.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/addons/run-configs/editor/controls/configs_dropdown.gd b/source/addons/run-configs/editor/controls/configs_dropdown.gd
new file mode 100644
index 0000000..96cb968
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_dropdown.gd
@@ -0,0 +1,81 @@
+extends MenuButton
+
+const ConfigManager := preload("res://addons/run-configs/run-config-manager.gd")
+const RunConfig := preload("res://addons/run-configs/models/run_config.gd")
+
+const ConfigsEditorScene := preload("res://addons/run-configs/editor/controls/configs_editor/configs_editor.tscn")
+const ConfigsEditor := preload("res://addons/run-configs/editor/controls/configs_editor/configs_editor.gd")
+
+var configs_editor: ConfigsEditor
+var _add_config_index := 0
+var _no_config_index := 0
+
+const DEFAULT_CONFIGS_TEXT = "..."
+
+
+func _ready():
+ icon = EditorInterface.get_base_control().get_theme_icon(&"GuiTreeArrowDown", &"EditorIcons")
+ icon_alignment = HORIZONTAL_ALIGNMENT_RIGHT
+ text = DEFAULT_CONFIGS_TEXT
+ configs_editor = ConfigsEditorScene.instantiate()
+ configs_editor.hide()
+
+ EditorInterface.get_base_control().add_child(configs_editor)
+ configs_editor.confirmed.connect(_update, CONNECT_DEFERRED)
+
+ pressed.connect(_update)
+ get_popup().id_pressed.connect(_on_id_pressed)
+ _update() # Make sure size is properly set to fit in screen
+
+
+func _exit_tree() -> void:
+ configs_editor.queue_free()
+
+
+func _update():
+ var popup := get_popup()
+ popup.clear()
+
+ var configs := ConfigManager.load_configs()
+ var id := 0
+
+ if configs.size() > 0:
+ for config in configs:
+ popup.add_check_item(config.name, id)
+ id += 1
+
+ popup.add_separator()
+
+ _no_config_index = id
+ popup.add_check_item("No config", id)
+ id += 1
+ else:
+ popup.add_item("No configs", id)
+ popup.set_item_disabled(id, true)
+ id += 1
+
+ var config_count := ConfigManager.load_configs().size()
+ var current := ConfigManager.get_current_config_index()
+
+ if current >= 0 and current < config_count:
+ popup.set_item_checked(popup.get_item_index(current), true)
+ # Set main button text here as well
+ text = configs[current].name
+ else:
+ popup.set_item_checked(popup.get_item_index(_no_config_index), true)
+ text = DEFAULT_CONFIGS_TEXT
+
+ popup.add_separator()
+ popup.add_item("Edit configurations...", id)
+
+ _add_config_index = id
+
+
+func _on_id_pressed(id: int) -> void:
+ if id == _add_config_index:
+ configs_editor.popup_centered_ratio(0.5)
+ elif id == _no_config_index:
+ ConfigManager.set_current_config_index(-1)
+ else:
+ ConfigManager.set_current_config_index(id)
+ _update()
diff --git a/source/addons/run-configs/editor/controls/configs_dropdown.gd.uid b/source/addons/run-configs/editor/controls/configs_dropdown.gd.uid
new file mode 100644
index 0000000..127e74d
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_dropdown.gd.uid
@@ -0,0 +1 @@
+uid://dqc6njw4s61ip
diff --git a/source/addons/run-configs/editor/controls/configs_editor/configs_editor.gd b/source/addons/run-configs/editor/controls/configs_editor/configs_editor.gd
new file mode 100644
index 0000000..8a8467d
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/configs_editor.gd
@@ -0,0 +1,139 @@
+@tool
+extends ConfirmationDialog
+
+const ConfigsManager := preload("res://addons/run-configs/run-config-manager.gd")
+const RunConfig := preload("res://addons/run-configs/models/run_config.gd")
+const EnvEditor := preload("res://addons/run-configs/editor/controls/configs_editor/env_editor.gd")
+
+# Config List
+@onready var add_config: Button = %AddConfig
+@onready var remove_config: Button = %RemoveConfig
+
+# Form
+@onready var configs_list: ItemList = %ConfigsList
+@onready var name_edit: LineEdit = %NameEdit
+@onready var play_mode_edit: OptionButton = %PlayModeEdit
+@onready var custom_scene_edit: Button = %CustomSceneEdit
+@onready var env_edit: EnvEditor = %EnvEdit
+
+var file_dialog := EditorFileDialog.new()
+var configs: Array[RunConfig] = []
+var selected := 0
+
+func _ready():
+ # File dialog
+ file_dialog.title = "Choose a scene"
+ file_dialog.add_filter("*.tscn, *.scn", "Scenes")
+ file_dialog.min_size = Vector2(600, 400)
+ file_dialog.file_mode = EditorFileDialog.FILE_MODE_OPEN_FILE
+ add_child(file_dialog)
+ file_dialog.hide()
+
+ # Main setup
+ configs_list.item_selected.connect(_render_form)
+ about_to_popup.connect(_on_popup)
+
+ # Config List
+ add_config.pressed.connect(_on_add_config)
+ remove_config.pressed.connect(_on_remove_config)
+
+ # Form
+ name_edit.text_changed.connect(func(text): _update_value(&"name", text))
+ play_mode_edit.item_selected.connect(func(ind): _update_value(&"play_mode", ind))
+ custom_scene_edit.pressed.connect(func(): file_dialog.popup_centered_ratio())
+ file_dialog.file_selected.connect(func(file): _update_value(&"custom_scene", file))
+ env_edit.changed.connect(func(envs): _update_value(&"environment_variables", envs))
+
+ confirmed.connect(func(): ConfigsManager.set_configs(configs))
+
+
+# General
+func _on_popup():
+ configs = ConfigsManager.load_configs()
+ selected = ConfigsManager.get_current_config_index()
+ _render()
+
+
+func _on_add_config():
+ var new_config := RunConfig.new()
+
+ # Check for duplicate names
+ var base_name := new_config.name
+ var name := new_config.name
+ var count := 2
+
+ while true:
+ for config in configs:
+ if name == config.name:
+ name = "%s (%d)" % [base_name, count]
+ count += 1
+
+ break
+ new_config.name = name
+
+ configs.append(new_config)
+ selected = configs.size() - 1
+ _render()
+ name_edit.grab_focus()
+ name_edit.select_all()
+
+
+func _on_remove_config():
+ if configs.size() <= 0: return
+ configs.remove_at(selected)
+ selected = clamp(selected, 0, configs.size() - 1)
+ _render()
+
+
+func _render():
+ # Configs list
+ configs_list.clear()
+
+ for config in configs:
+ configs_list.add_item(config.name)
+
+ if configs.size() > 0:
+ configs_list.select(selected if selected >= 0 else 0)
+
+ remove_config.disabled = configs.size() <= 0
+
+ # Form
+ _render_form(selected)
+
+
+# Form
+func _render_form(ind: int):
+ selected = ind
+
+ if selected < 0 or selected >= configs.size():
+ %Form.hide()
+ %Hint.show()
+ return
+ %Form.show()
+ %Hint.hide()
+
+ var config := configs[selected]
+ # Name
+ name_edit.text = config.name
+ # Play mode
+ play_mode_edit.select(config.play_mode)
+ # Custom scene
+ custom_scene_edit.text = config.custom_scene
+ if custom_scene_edit.text.is_empty():
+ custom_scene_edit.text = "Choose a scene..."
+ custom_scene_edit.visible = config.play_mode == RunConfig.PlayMode.CustomScene
+ # Env
+ env_edit.render(config.environment_variables)
+
+
+func _update_value(property: StringName, value):
+ if property == &"name":
+ configs_list.set_item_text(selected, value)
+ elif property == &"play_mode":
+ custom_scene_edit.visible = value == int(RunConfig.PlayMode.CustomScene)
+ elif property == &"custom_scene":
+ custom_scene_edit.text = value
+
+ var config := configs[selected]
+ config.set(property, value)
+
diff --git a/source/addons/run-configs/editor/controls/configs_editor/configs_editor.gd.uid b/source/addons/run-configs/editor/controls/configs_editor/configs_editor.gd.uid
new file mode 100644
index 0000000..be72327
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/configs_editor.gd.uid
@@ -0,0 +1 @@
+uid://lnx4u4yhkg1o
diff --git a/source/addons/run-configs/editor/controls/configs_editor/configs_editor.tscn b/source/addons/run-configs/editor/controls/configs_editor/configs_editor.tscn
new file mode 100644
index 0000000..00793b8
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/configs_editor.tscn
@@ -0,0 +1,197 @@
+[gd_scene load_steps=10 format=3 uid="uid://dso1w1uqfsxmi"]
+
+[ext_resource type="Script" uid="uid://bcaa1qlb4eiqc" path="res://addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd" id="1_bhvuh"]
+[ext_resource type="Script" uid="uid://lnx4u4yhkg1o" path="res://addons/run-configs/editor/controls/configs_editor/configs_editor.gd" id="1_ldnip"]
+[ext_resource type="Script" uid="uid://jbxwvla3sahm" path="res://addons/run-configs/editor/controls/configs_editor/env_editor.gd" id="3_2bcxm"]
+
+[sub_resource type="Image" id="Image_pdc0p"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_hfgpw"]
+image = SubResource("Image_pdc0p")
+
+[sub_resource type="GDScript" id="GDScript_knwq4"]
+script/source = "@tool
+extends Button
+
+func _ready() -> void:
+ icon = get_theme_icon(&\"Add\", &\"EditorIcons\")
+"
+
+[sub_resource type="GDScript" id="GDScript_b2o0p"]
+script/source = "@tool
+extends Button
+
+func _ready() -> void:
+ icon = get_theme_icon(&\"Close\", &\"EditorIcons\")
+"
+
+[sub_resource type="GDScript" id="GDScript_fhb5p"]
+script/source = "@tool
+extends Button
+
+func _ready() -> void:
+ icon = get_theme_icon(&\"Folder\", &\"EditorIcons\")
+"
+
+[sub_resource type="GDScript" id="GDScript_ggysl"]
+script/source = "@tool
+extends Button
+
+func _ready() -> void:
+ icon = get_theme_icon(&\"Add\", &\"EditorIcons\")
+"
+
+[node name="ConfigsEditor" type="ConfirmationDialog"]
+title = "Edit Run Configurations"
+initial_position = 2
+size = Vector2i(698, 400)
+visible = true
+ok_button_text = "Apply"
+script = ExtResource("1_ldnip")
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 690.0
+offset_bottom = 351.0
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="ConfigsEditor" type="VBoxContainer" parent="MarginContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/ConfigsEditor"]
+layout_mode = 2
+
+[node name="AddConfig" type="Button" parent="MarginContainer/ConfigsEditor/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Add a new config"
+icon = SubResource("ImageTexture_hfgpw")
+script = SubResource("GDScript_knwq4")
+
+[node name="RemoveConfig" type="Button" parent="MarginContainer/ConfigsEditor/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Remove selected config"
+icon = SubResource("ImageTexture_hfgpw")
+script = SubResource("GDScript_b2o0p")
+
+[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer/ConfigsEditor"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer"]
+custom_minimum_size = Vector2(175, 0)
+layout_mode = 2
+
+[node name="ConfigsList" type="ItemList" parent="MarginContainer/ConfigsEditor/HSplitContainer/VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+auto_height = true
+
+[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+horizontal_scroll_mode = 0
+
+[node name="PanelContainer" type="PanelContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Form" type="GridContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_constants/v_separation = 8
+columns = 2
+
+[node name="Name" type="Label" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form"]
+layout_mode = 2
+tooltip_text = "Name of the config"
+text = "Name "
+
+[node name="NameEdit" type="LineEdit" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PlayMode" type="Label" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form"]
+layout_mode = 2
+tooltip_text = "Scene that will be run
+This only applies if you run via the custom \"Run Config\" button"
+text = "Run Scene"
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PlayModeEdit" type="OptionButton" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+item_count = 3
+selected = 0
+popup/item_0/text = "Main Scene"
+popup/item_0/icon = SubResource("ImageTexture_hfgpw")
+popup/item_0/id = 0
+popup/item_1/text = "Current Scene"
+popup/item_1/icon = SubResource("ImageTexture_hfgpw")
+popup/item_1/id = 1
+popup/item_2/text = "Custom Scene"
+popup/item_2/icon = SubResource("ImageTexture_hfgpw")
+popup/item_2/id = 2
+script = ExtResource("1_bhvuh")
+
+[node name="CustomSceneEdit" type="Button" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form/HBoxContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Choose a scene..."
+icon = SubResource("ImageTexture_hfgpw")
+script = SubResource("GDScript_fhb5p")
+
+[node name="Env" type="Label" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form"]
+layout_mode = 2
+size_flags_vertical = 0
+tooltip_text = "Environment variables
+Use OS.get_environment() to access these values in runtime"
+text = "Environment Variables"
+
+[node name="EnvEdit" type="VBoxContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form"]
+unique_name_in_owner = true
+layout_mode = 2
+script = ExtResource("3_2bcxm")
+
+[node name="GridContainer" type="GridContainer" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form/EnvEdit"]
+layout_mode = 2
+columns = 3
+
+[node name="AddEnv" type="Button" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer/Form/EnvEdit"]
+layout_mode = 2
+size_flags_horizontal = 8
+text = "New Variable"
+icon = SubResource("ImageTexture_hfgpw")
+script = SubResource("GDScript_ggysl")
+
+[node name="Hint" type="Label" parent="MarginContainer/ConfigsEditor/HSplitContainer/ScrollContainer/PanelContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 0
+text = "Click \"+\" to create a new config."
diff --git a/source/addons/run-configs/editor/controls/configs_editor/env_editor.gd b/source/addons/run-configs/editor/controls/configs_editor/env_editor.gd
new file mode 100644
index 0000000..2a4f4f8
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/env_editor.gd
@@ -0,0 +1,82 @@
+@tool
+extends Control
+
+@onready var grid_container: GridContainer = $GridContainer
+@onready var add_env_button: Button = $AddEnv
+
+signal changed(envs: Dictionary)
+
+var columns: Array[Array] = []
+
+func _ready() -> void:
+ add_env_button.pressed.connect(_add_column)
+ grid_container.resized.connect(_on_resize)
+
+
+func render(envs: Dictionary):
+ _delete_all_columns()
+
+ for key in envs.keys():
+ _add_column(key, envs[key])
+
+ if columns.size() == 0:
+ _add_column()
+
+func _emit_changes():
+ var envs := {}
+ for column in columns:
+ var key: LineEdit = column[0]
+ var val: LineEdit = column[1]
+
+ if not key.text.is_empty():
+ envs[key.text] = val.text
+
+ changed.emit(envs)
+
+
+func _add_column(key_text: String = "", val_text: String = ""):
+ var key := LineEdit.new()
+ key.text = key_text
+ key.placeholder_text = "Key"
+ key.custom_minimum_size.x = grid_container.size.x / 3
+ key.text_changed.connect(func(txt): _emit_changes())
+
+ var value := LineEdit.new()
+ value.text = val_text
+ value.placeholder_text = "Value"
+ value.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ value.text_changed.connect(func(txt): _emit_changes())
+
+ var del := Button.new()
+ del.icon = get_theme_icon(&"ImportFail", &"EditorIcons")
+ del.pressed.connect(func(): _delete_column(del))
+
+ grid_container.add_child(key)
+ grid_container.add_child(value)
+ grid_container.add_child(del)
+
+ columns.append([key, value, del])
+ _emit_changes()
+
+
+func _delete_column(delete_button: Button):
+ for i in range(len(columns)):
+ if columns[i][2] == delete_button:
+ for control: Control in columns[i]:
+ control.queue_free()
+ columns.remove_at(i)
+ break
+ _emit_changes()
+
+
+func _delete_all_columns():
+ for column in columns:
+ for control in column:
+ control.queue_free()
+ columns = []
+
+
+func _on_resize():
+ var children = grid_container.get_children()
+ for i in range(0, children.size(), 3):
+ children[i].custom_minimum_size.x = grid_container.size.x / 3
diff --git a/source/addons/run-configs/editor/controls/configs_editor/env_editor.gd.uid b/source/addons/run-configs/editor/controls/configs_editor/env_editor.gd.uid
new file mode 100644
index 0000000..029282c
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/env_editor.gd.uid
@@ -0,0 +1 @@
+uid://jbxwvla3sahm
diff --git a/source/addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd b/source/addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd
new file mode 100644
index 0000000..41f628c
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd
@@ -0,0 +1,10 @@
+@tool
+extends OptionButton
+
+func _ready():
+ clear()
+ add_icon_item(get_theme_icon(&"Play", &"EditorIcons"), "Main Scene")
+ add_icon_item(get_theme_icon(&"PlayScene", &"EditorIcons"), "Current Scene")
+ add_icon_item(get_theme_icon(&"PlayCustom", &"EditorIcons"), "Custom Scene")
+
+ select(0)
diff --git a/source/addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd.uid b/source/addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd.uid
new file mode 100644
index 0000000..93781f7
--- /dev/null
+++ b/source/addons/run-configs/editor/controls/configs_editor/play_mode_dropdown.gd.uid
@@ -0,0 +1 @@
+uid://bcaa1qlb4eiqc
diff --git a/source/addons/run-configs/editor/lib/inspector_plugin.gd b/source/addons/run-configs/editor/lib/inspector_plugin.gd
new file mode 100644
index 0000000..35d22cb
--- /dev/null
+++ b/source/addons/run-configs/editor/lib/inspector_plugin.gd
@@ -0,0 +1,21 @@
+@tool
+extends EditorInspectorPlugin
+
+const RunConfig := preload("res://addons/run-configs/models/run_config.gd")
+
+func _can_handle(object):
+ return object is RunConfig
+
+
+#func _parse_property(object, type, name, hint_type, hint_string, usage_flags, wide):
+ #if name in [&"resource_local_to_scene", &"resource_path", &"resource_name", &"script", &"metadata"]:
+ #return true
+#
+ #if name == &"environment_variables":
+ #var delete_button := Button.new()
+ #delete_button.text = "Delete Config"
+ #add_custom_control(delete_button)
+#
+ #return false
+
+
diff --git a/source/addons/run-configs/editor/lib/inspector_plugin.gd.uid b/source/addons/run-configs/editor/lib/inspector_plugin.gd.uid
new file mode 100644
index 0000000..ddf3749
--- /dev/null
+++ b/source/addons/run-configs/editor/lib/inspector_plugin.gd.uid
@@ -0,0 +1 @@
+uid://b7ke22bl7wbjb
diff --git a/source/addons/run-configs/editor/lib/run_configs_core.gd b/source/addons/run-configs/editor/lib/run_configs_core.gd
new file mode 100644
index 0000000..08c9125
--- /dev/null
+++ b/source/addons/run-configs/editor/lib/run_configs_core.gd
@@ -0,0 +1,2 @@
+extends Object
+
diff --git a/source/addons/run-configs/editor/lib/run_configs_core.gd.uid b/source/addons/run-configs/editor/lib/run_configs_core.gd.uid
new file mode 100644
index 0000000..9380f0f
--- /dev/null
+++ b/source/addons/run-configs/editor/lib/run_configs_core.gd.uid
@@ -0,0 +1 @@
+uid://2x1422qq2ri4
diff --git a/source/addons/run-configs/editor/lib/ui_extension.gd b/source/addons/run-configs/editor/lib/ui_extension.gd
new file mode 100644
index 0000000..0adccc2
--- /dev/null
+++ b/source/addons/run-configs/editor/lib/ui_extension.gd
@@ -0,0 +1,42 @@
+extends Object
+
+static var _cached_editor_run_bar: Control = null
+
+## Search for the EditorRunBar by finding the parent of EditorRunNative
+## We could just search for EditorRunBar, but finding the button's parent is less likely to break in the future
+static func _get_editor_run_bar_container(root: Node = EditorInterface.get_base_control()) -> Node:
+ if _cached_editor_run_bar:
+ return _cached_editor_run_bar
+
+ for child in root.get_children():
+ if child.get_class() == &"EditorRunNative":
+ var container = child.get_parent()
+ _cached_editor_run_bar = container
+ return container
+
+ var res = _get_editor_run_bar_container(child)
+
+ if res:
+ return res
+
+ return null
+
+
+static func add_control_to_editor_run_bar(control: Control) -> void:
+ var run_bar := _get_editor_run_bar_container()
+
+ if not run_bar:
+ printerr("[Run Configs] Could not find EditorRunBar. Please contact developer.")
+ return
+
+ run_bar.add_child(control)
+
+
+static func remove_control_from_editor_run_bar(control: Control) -> void:
+ var run_bar := _get_editor_run_bar_container()
+
+ if not run_bar:
+ printerr("[Run Configs] Could not find EditorRunBar. Please contact developer.")
+ return
+
+ run_bar.remove_child(control)
diff --git a/source/addons/run-configs/editor/lib/ui_extension.gd.uid b/source/addons/run-configs/editor/lib/ui_extension.gd.uid
new file mode 100644
index 0000000..f437b2c
--- /dev/null
+++ b/source/addons/run-configs/editor/lib/ui_extension.gd.uid
@@ -0,0 +1 @@
+uid://bbesk76sfnnbb
diff --git a/source/addons/run-configs/editor/plugin.gd b/source/addons/run-configs/editor/plugin.gd
new file mode 100644
index 0000000..4f48ee3
--- /dev/null
+++ b/source/addons/run-configs/editor/plugin.gd
@@ -0,0 +1,94 @@
+@tool
+extends EditorPlugin
+
+
+const ConfigManager := preload("../run-config-manager.gd")
+const RunConfig := preload("../models/run_config.gd")
+
+const InspectorPlugin := preload("./lib/inspector_plugin.gd")
+const UIExtension := preload("./lib/ui_extension.gd")
+const ConfigsDropdown := preload("./controls/configs_dropdown.gd")
+
+const RunShortcut: Shortcut = preload("res://addons/run-configs/editor/res/run_shortcut.tres")
+
+const SETTINGS_BASE_PATH := ConfigManager.CONFIGS_BASE_PATH
+const SETTINGS_SUB_PATH := "/shortcuts"
+
+const _RUN_SHORTCUT_PATH := SETTINGS_BASE_PATH + SETTINGS_SUB_PATH + "/run_config_scene"
+
+var play_button := Button.new()
+var separator := VSeparator.new()
+var configs_button := ConfigsDropdown.new()
+
+var inspector_plugin := InspectorPlugin.new()
+
+const AUTOLOAD_PATH = &"RunConfigManager"
+var confg_manager_autoload := ConfigManager.new()
+
+
+func _enter_tree():
+ var base_control := get_editor_interface().get_base_control()
+
+ # Menu Bar
+ UIExtension.add_control_to_editor_run_bar(separator)
+ # - Play Button
+ play_button.icon = preload("res://addons/run-configs/editor/assets/PlayConfig.svg")
+ play_button.pressed.connect(_play_scene)
+ play_button.tooltip_text = "Run Config Scene (Shift + F5)"
+ UIExtension.add_control_to_editor_run_bar(play_button)
+ # - Configs button
+ UIExtension.add_control_to_editor_run_bar(configs_button)
+
+ # Inspector plugin
+ add_inspector_plugin(inspector_plugin)
+
+ # Settings
+ var editor_settings := EditorInterface.get_editor_settings()
+ if not editor_settings.has_setting(_RUN_SHORTCUT_PATH):
+ editor_settings.set_setting(_RUN_SHORTCUT_PATH, RunShortcut.duplicate())
+ editor_settings.set_initial_value(_RUN_SHORTCUT_PATH, RunShortcut.duplicate(), false)
+
+func _enable_plugin() -> void:
+ add_autoload_singleton(AUTOLOAD_PATH, "res://addons/run-configs/run-config-manager.gd")
+
+
+func _disable_plugin() -> void:
+ UIExtension.remove_control_from_editor_run_bar(separator)
+ UIExtension.remove_control_from_editor_run_bar(play_button)
+ UIExtension.remove_control_from_editor_run_bar(configs_button)
+
+ remove_inspector_plugin(inspector_plugin)
+
+ remove_autoload_singleton(AUTOLOAD_PATH)
+
+
+
+func _play_scene():
+ var config := ConfigManager.get_current_config()
+
+ if not config:
+ EditorInterface.play_main_scene()
+
+ match config.play_mode:
+ RunConfig.PlayMode.MainScene:
+ EditorInterface.play_main_scene()
+ RunConfig.PlayMode.CurrentScene:
+ EditorInterface.play_current_scene()
+ RunConfig.PlayMode.CustomScene:
+ var scene := config.custom_scene
+ EditorInterface.play_custom_scene(scene)
+
+
+
+func _input(event: InputEvent):
+ var editor_settings := EditorInterface.get_editor_settings()
+ var shortcut: Shortcut
+
+ if editor_settings.has_setting(_RUN_SHORTCUT_PATH):
+ shortcut = editor_settings.get_setting(_RUN_SHORTCUT_PATH)
+ else:
+ shortcut = RunShortcut
+
+ if event is InputEventKey:
+ if shortcut.matches_event(event) and event.is_pressed() and not event.is_echo():
+ _play_scene()
diff --git a/source/addons/run-configs/editor/plugin.gd.uid b/source/addons/run-configs/editor/plugin.gd.uid
new file mode 100644
index 0000000..6fcfc7b
--- /dev/null
+++ b/source/addons/run-configs/editor/plugin.gd.uid
@@ -0,0 +1 @@
+uid://ddncwkdw8ojw4
diff --git a/source/addons/run-configs/editor/res/run_shortcut.tres b/source/addons/run-configs/editor/res/run_shortcut.tres
new file mode 100644
index 0000000..8ad8ab5
--- /dev/null
+++ b/source/addons/run-configs/editor/res/run_shortcut.tres
@@ -0,0 +1,11 @@
+[gd_resource type="Shortcut" load_steps=2 format=3 uid="uid://b866jugg2ip41"]
+
+[sub_resource type="InputEventKey" id="InputEventKey_03p4n"]
+device = -1
+shift_pressed = true
+keycode = 4194336
+physical_keycode = 4194336
+key_label = 4194336
+
+[resource]
+events = [SubResource("InputEventKey_03p4n")]
diff --git a/source/addons/run-configs/models/run_config.gd b/source/addons/run-configs/models/run_config.gd
new file mode 100644
index 0000000..c98b5a8
--- /dev/null
+++ b/source/addons/run-configs/models/run_config.gd
@@ -0,0 +1,52 @@
+@tool
+extends Resource
+
+enum PlayMode { MainScene, CurrentScene, CustomScene }
+
+@export_category("Run Config")
+
+## Name of config
+@export var name: String = "Config"
+
+## Play mode when launched
+## See [enum PlayMode]
+@export var play_mode: PlayMode:
+ set(val):
+ play_mode = val
+ if play_mode != PlayMode.CustomScene:
+ custom_scene = ""
+ notify_property_list_changed()
+## Custom scene to launch
+@export_file("*.tscn", "*.scn") var custom_scene: String
+
+## Environment variables
+@export var environment_variables: Dictionary
+
+
+# Serialization
+func serialize() -> String:
+ var dict := {
+ "name": name,
+ "play_mode": play_mode,
+ "custom_scene": custom_scene,
+ "environment_variables": environment_variables
+ }
+
+ return JSON.stringify(dict)
+
+
+func deserialize(json: String) -> Resource:
+ var dict := JSON.parse_string(json)
+
+ name = dict.name
+ play_mode = dict.play_mode
+ custom_scene = dict.custom_scene
+ environment_variables = dict.environment_variables
+
+ return self
+
+
+# Editor
+func _validate_property(property: Dictionary):
+ if property.name == &"custom_scene" and play_mode != PlayMode.CustomScene:
+ property.usage |= PROPERTY_USAGE_READ_ONLY
diff --git a/source/addons/run-configs/models/run_config.gd.uid b/source/addons/run-configs/models/run_config.gd.uid
new file mode 100644
index 0000000..d1d222f
--- /dev/null
+++ b/source/addons/run-configs/models/run_config.gd.uid
@@ -0,0 +1 @@
+uid://cjxx8el154bw5
diff --git a/source/addons/run-configs/plugin.cfg b/source/addons/run-configs/plugin.cfg
new file mode 100644
index 0000000..69d3441
--- /dev/null
+++ b/source/addons/run-configs/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Run Configs"
+description="Adds run configs to setup different run "
+author="poohcom1"
+version="0.2.0"
+script="editor/plugin.gd"
diff --git a/source/addons/run-configs/run-config-manager.gd b/source/addons/run-configs/run-config-manager.gd
new file mode 100644
index 0000000..d1d75c7
--- /dev/null
+++ b/source/addons/run-configs/run-config-manager.gd
@@ -0,0 +1,112 @@
+extends Node
+
+const CONFIGS_BASE_PATH := "run_configs"
+
+const _CONFIGS_DATA_PATH := "/data"
+const _CONFIGS_PATH := CONFIGS_BASE_PATH + _CONFIGS_DATA_PATH + "/configs"
+const _CURRENT_CONFIG_PATH := CONFIGS_BASE_PATH + _CONFIGS_DATA_PATH + "/current"
+
+const RunConfig := preload("res://addons/run-configs/models/run_config.gd")
+
+func _init():
+ if not OS.has_feature(&"editor"):
+ return
+
+ if Engine.is_editor_hint():
+ return
+
+ var config := get_current_config()
+ if not config:
+ return
+
+ var env = config.environment_variables
+
+ for key in env.keys():
+ OS.set_environment(key, env[key])
+
+ print_rich("[color=grey][Run Config][/color] [color=white]Applied environment variables from the [b]%s[/b] config." % config.name)
+
+func _ready():
+ var config := get_current_config()
+ if not config: return
+ if config.custom_scene != "" and get_tree().current_scene.scene_file_path != config.custom_scene:
+ print_rich("[color=grey][Run Config][/color] [color=yellow][Warn][/color] The [b]%s[/b] config has a custom scene set, but the game is ran from the regular Run button. Please use the config Run button to run the custom scene." % config.name)
+
+
+## API
+static func get_current_config() -> RunConfig:
+ var ind := get_current_config_index()
+ var configs := load_configs()
+
+ if ind < 0 or ind >= configs.size():
+ return null
+
+ return configs[ind]
+
+
+static func load_configs() -> Array[RunConfig]:
+ var settings = ProjectSettings.get_setting(_CONFIGS_PATH)
+
+ var configs: Array[RunConfig] = []
+
+ if not settings:
+ return configs
+
+ for json in settings:
+ var config := RunConfig.new()
+ config.deserialize(json)
+ configs.append(config)
+
+ return configs
+
+
+static func set_configs(configs: Array[RunConfig]) -> void:
+ var config_jsons = []
+
+ for config in configs:
+ config_jsons.append(config.serialize())
+
+ ProjectSettings.set_setting(_CONFIGS_PATH, config_jsons)
+ ProjectSettings.set_as_internal(_CONFIGS_PATH, true)
+ ProjectSettings.save()
+
+
+static func add_config(new_config := RunConfig.new()) -> void:
+ var configs = ProjectSettings.get_setting(_CONFIGS_PATH)
+
+ if not configs:
+ configs = []
+
+ configs.append(new_config.serialize())
+
+ ProjectSettings.set_setting(_CONFIGS_PATH, configs)
+ ProjectSettings.set_as_internal(_CONFIGS_PATH, true)
+ ProjectSettings.save()
+
+
+static func remove_config_index(ind: int) -> void:
+ var configs: Array = ProjectSettings.get_setting(_CONFIGS_PATH)
+
+ if not configs:
+ configs = []
+ return
+
+ configs.remove_at(ind)
+
+ ProjectSettings.set_setting(_CONFIGS_PATH, configs)
+ ProjectSettings.set_as_internal(_CONFIGS_PATH, true)
+ ProjectSettings.save()
+
+
+static func set_current_config_index(id: int) -> void:
+ ProjectSettings.set_setting(_CURRENT_CONFIG_PATH, id)
+ ProjectSettings.save()
+
+
+static func get_current_config_index() -> int:
+ var ind = ProjectSettings.get_setting(_CURRENT_CONFIG_PATH)
+
+ if ind != null:
+ return ind
+
+ return -1
diff --git a/source/addons/run-configs/run-config-manager.gd.uid b/source/addons/run-configs/run-config-manager.gd.uid
new file mode 100644
index 0000000..51f5a99
--- /dev/null
+++ b/source/addons/run-configs/run-config-manager.gd.uid
@@ -0,0 +1 @@
+uid://dvfrocown7eqd
diff --git a/source/addons/version_display/plugin.cfg b/source/addons/version_display/plugin.cfg
new file mode 100644
index 0000000..b21eefa
--- /dev/null
+++ b/source/addons/version_display/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Version Display - Pixelation Games"
+description="Displays information about a project in one of the screens corner."
+author="SchimmelSpreu83"
+version="0.5.0"
+script="plugin.gd"
diff --git a/source/addons/version_display/plugin.gd b/source/addons/version_display/plugin.gd
new file mode 100644
index 0000000..68787d9
--- /dev/null
+++ b/source/addons/version_display/plugin.gd
@@ -0,0 +1,10 @@
+@tool
+extends EditorPlugin
+
+
+func _enable_plugin() -> void:
+ add_autoload_singleton("VersionDisplay", "res://addons/version_display/version_display.tscn")
+
+
+func _disable_plugin() -> void:
+ remove_autoload_singleton("VersionDisplay")
diff --git a/source/addons/version_display/plugin.gd.uid b/source/addons/version_display/plugin.gd.uid
new file mode 100644
index 0000000..bcb1915
--- /dev/null
+++ b/source/addons/version_display/plugin.gd.uid
@@ -0,0 +1 @@
+uid://53r2owjmbm21
diff --git a/source/addons/version_display/version_display.gd b/source/addons/version_display/version_display.gd
new file mode 100644
index 0000000..df0ae9c
--- /dev/null
+++ b/source/addons/version_display/version_display.gd
@@ -0,0 +1,30 @@
+extends CanvasLayer
+
+const DEFAULT_TEXT: String = "{game_name} - {state} - V - {version}"
+const UNDEFINED_TEXT: String = "Undefined"
+
+@export_enum("Pre-Alpha", "Early-Alpha", "Alpha", "Beta", "Early-Access", "Release") var state: String = "Pre-Alpha"
+@export_multiline var text_override: String = DEFAULT_TEXT: set = set_text
+
+@onready var version_label: Label = $MarginContainer/VersionLabel
+
+
+func _ready() -> void:
+ set_text(text_override)
+
+
+func set_text(new_text: String) -> void:
+ new_text = new_text.replace("{game_name}", ProjectSettings.get_setting("application/config/name", UNDEFINED_TEXT))
+ new_text = new_text.replace("{version}", ProjectSettings.get_setting("application/config/version", UNDEFINED_TEXT))
+ new_text = new_text.replace("{state}", str(state))
+
+ text_override = new_text
+
+ _update_hud()
+
+
+func _update_hud() -> void:
+ if not self.is_node_ready():
+ await self.ready
+
+ version_label.set_text(text_override)
diff --git a/source/addons/version_display/version_display.gd.uid b/source/addons/version_display/version_display.gd.uid
new file mode 100644
index 0000000..c046753
--- /dev/null
+++ b/source/addons/version_display/version_display.gd.uid
@@ -0,0 +1 @@
+uid://b7q4to8qjprem
diff --git a/source/addons/version_display/version_display.tscn b/source/addons/version_display/version_display.tscn
new file mode 100644
index 0000000..debf51a
--- /dev/null
+++ b/source/addons/version_display/version_display.tscn
@@ -0,0 +1,32 @@
+[gd_scene load_steps=2 format=3 uid="uid://bqxtpo2c64h22"]
+
+[ext_resource type="Script" uid="uid://b7q4to8qjprem" path="res://addons/version_display/version_display.gd" id="1_jk1t8"]
+
+[node name="VersionDisplay" type="CanvasLayer"]
+process_mode = 3
+layer = 64
+follow_viewport_enabled = true
+script = ExtResource("1_jk1t8")
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+mouse_filter = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 0
+theme_override_constants/margin_right = 4
+
+[node name="VersionLabel" type="Label" parent="MarginContainer"]
+modulate = Color(1, 1, 1, 0.498039)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
+text = "{GameName} - {State} - V - {Version}"
+horizontal_alignment = 2
+vertical_alignment = 2
diff --git a/source/components/characters/character_base.gd b/source/components/characters/character_base.gd
new file mode 100644
index 0000000..03a4170
--- /dev/null
+++ b/source/components/characters/character_base.gd
@@ -0,0 +1,86 @@
+class_name CharacterBase3D
+extends CharacterBody3D
+
+@export var movement: CharacterMovementBase
+
+var speed: float = 0.0
+var movement_direction: Vector3
+var ground_control: float = 1.0
+var air_control: float = 1.0
+# If [code]true[/code], [member air_control] won't be reset to [code]1.0[/code] when touching the ground.
+var freeze_air_control: bool = false
+var last_platform_velocity := Vector3.ZERO
+var _was_on_floor: bool = false
+
+
+func move(direction: Vector3, delta: float) -> void:
+ direction *= speed
+
+ var on_floor: bool = is_on_floor()
+
+ if on_floor:
+ last_platform_velocity = get_platform_velocity()
+
+ # Remove platform velocity when landing.
+ if not _was_on_floor:
+ velocity -= get_platform_velocity() # TODO: Test if last_platform_velocity is desired.
+ else:
+ direction += last_platform_velocity
+
+ _was_on_floor = on_floor
+
+ var acceleration: float = movement.max_acceleration if on_floor else movement.max_air_acceleration
+ var deceleration: float = movement.max_friction if on_floor else movement.max_air_friction
+ var turning_speed: float = movement.max_turning_speed if on_floor else movement.max_air_turning_speed
+
+ var speed_change: float = acceleration
+
+ if direction.is_zero_approx():
+ speed_change = deceleration
+ else:
+ var flat_velocity: Vector3 = velocity * Utils.VEC3_HOR
+
+ if direction.sign() != flat_velocity.sign():
+ speed_change = turning_speed
+
+ #DebugDraw3D.draw_arrow(global_position, global_position + direction, Color.ORANGE, 0.5, true)
+ direction.y = velocity.y
+
+ speed_change *= ground_control if on_floor else air_control
+
+ if on_floor and not freeze_air_control:
+ air_control = 1.0
+
+ velocity = velocity.move_toward(direction, speed_change * delta)
+ #DebugDraw3D.draw_arrow(global_position, global_position + velocity, Color.BLUE, 0.5, true)
+ #Logger.print_msg("%s Velocity: %s" %[self , velocity], 0.02)
+
+
+## @tutorial: https://gmtk.itch.io/platformer-toolkit/devlog/395523/behind-the-code
+func apply_gravity(delta: float) -> void:
+ var margin: float = movement.gravity_check_margin
+ var gravity_multiplier: float = 1.0
+
+ if velocity.y < -margin:
+ #Logger.print_msg("Falling\n%s" %velocity.y, 0.02)
+ gravity_multiplier = movement.fall_gravity_multiplier
+ elif velocity.y > margin:
+ #Logger.print_msg("Rising\n%s" %velocity.y, 0.02)
+ gravity_multiplier = movement.rise_gravity_multiplier
+ else:
+ #Logger.print_msg("Peaking\n%s" %velocity.y, 0.02)
+ gravity_multiplier = movement.peak_gravity_multiplier
+
+ velocity.y -= (movement.get_gravity() * gravity_multiplier) * delta
+
+
+## @tutorial: https://gmtk.itch.io/platformer-toolkit/devlog/395523/behind-the-code
+func jump() -> void:
+ var jump_strength: float = sqrt(-2.0 * -movement.get_gravity() * movement.jump_height)
+
+ if velocity.y > 0.0:
+ jump_strength = maxf(jump_strength - velocity.y, 0.0)
+ elif velocity.y < 0.0:
+ jump_strength += absf(velocity.y)
+
+ velocity.y += jump_strength
diff --git a/source/components/characters/character_base.gd.uid b/source/components/characters/character_base.gd.uid
new file mode 100644
index 0000000..ef2cf7e
--- /dev/null
+++ b/source/components/characters/character_base.gd.uid
@@ -0,0 +1 @@
+uid://74yhpxyi82yp
diff --git a/source/components/characters/character_movement_base.gd b/source/components/characters/character_movement_base.gd
new file mode 100644
index 0000000..2d0b70a
--- /dev/null
+++ b/source/components/characters/character_movement_base.gd
@@ -0,0 +1,31 @@
+class_name CharacterMovementBase
+extends Resource
+
+@export var jump_height: float = 1.25
+@export var walking_speed: float = 3.5
+@export var air_walking_speed: float = 3.75
+@export var running_speed: float = 5.5
+@export var air_running_speed: float = 6.0
+
+@export var max_turning_speed: float = 50.0
+@export var max_air_turning_speed: float = 10.0
+
+@export_exp_easing("inout") var max_acceleration: float = 30.0
+@export_exp_easing("inout") var max_air_acceleration: float = 10.0
+@export_exp_easing("attenuation") var max_friction: float = 20.0
+@export_exp_easing("attenuation") var max_air_friction: float = 10.0
+
+@export var use_default_physics_gravity: bool = true
+@export var gravity: float = 9.8: get = get_gravity
+@export_group("Gravity Multiplier")
+@export var gravity_check_margin: float = 0.05
+@export var rise_gravity_multiplier: float = 1.0
+@export var peak_gravity_multiplier: float = 0.85
+@export var fall_gravity_multiplier: float = 1.5
+
+
+func get_gravity() -> float:
+ if use_default_physics_gravity:
+ return ProjectSettings.get_setting("physics/3d/default_gravity")
+ else:
+ return gravity
diff --git a/source/components/characters/character_movement_base.gd.uid b/source/components/characters/character_movement_base.gd.uid
new file mode 100644
index 0000000..5404154
--- /dev/null
+++ b/source/components/characters/character_movement_base.gd.uid
@@ -0,0 +1 @@
+uid://dsjlv8midt2g2
diff --git a/source/components/characters/common/footstep_component.gd b/source/components/characters/common/footstep_component.gd
new file mode 100644
index 0000000..6e99444
--- /dev/null
+++ b/source/components/characters/common/footstep_component.gd
@@ -0,0 +1,58 @@
+class_name FootstepComponent
+extends Node
+
+signal footstep_occured
+
+@export var step_measure: float = 1.25
+@export var character: CharacterBody3D
+@export_node_path("AudioStreamPlayer", "AudioStreamPlayer2D", "AudioStreamPlayer3D")
+var audio_player: NodePath: set = set_audio_player
+
+var _distance_traveled: float = 0.0
+var _was_in_air: bool = false
+var _audio_player: Node
+
+
+func _ready() -> void:
+ set_audio_player(audio_player)
+
+
+func _physics_process(delta: float) -> void:
+ if not is_instance_valid(character):
+ return
+
+ if audio_player.is_empty():
+ # Don't process if it isn't necessary.
+ return
+
+ var on_floor: bool = character.is_on_floor()
+ if on_floor:
+ if _was_in_air:
+ play_footstep()
+ _distance_traveled = 0.0
+
+ var velocity: Vector3 = abs(character.velocity) #+ (abs(character.get_platform_velocity()) if not character.velocity.is_zero_approx() else Vector3.ZERO)
+ velocity.y = 0.0
+
+ if velocity.is_zero_approx():
+ _distance_traveled = 0.0
+ else:
+ _distance_traveled += velocity.length() * delta
+
+ if _distance_traveled >= step_measure:
+ _distance_traveled = 0.0
+ play_footstep()
+
+ _was_in_air = not on_floor
+
+
+func play_footstep() -> void:
+ footstep_occured.emit()
+
+ if is_instance_valid(_audio_player) and _audio_player.has_method(&"play"):
+ _audio_player.play()
+
+
+func set_audio_player(new_player_path: NodePath) -> void:
+ audio_player = new_player_path
+ _audio_player = get_node_or_null(new_player_path)
diff --git a/source/components/characters/common/footstep_component.gd.uid b/source/components/characters/common/footstep_component.gd.uid
new file mode 100644
index 0000000..362e4fc
--- /dev/null
+++ b/source/components/characters/common/footstep_component.gd.uid
@@ -0,0 +1 @@
+uid://nuwb55sbveaf
diff --git a/source/components/characters/player/head.gd b/source/components/characters/player/head.gd
new file mode 100644
index 0000000..0429a00
--- /dev/null
+++ b/source/components/characters/player/head.gd
@@ -0,0 +1,146 @@
+class_name GameCamera3D
+extends Node3D
+
+const ACTION_CAMERA_UP: StringName = &"camera_up"
+const ACTION_CAMERA_DOWN: StringName = &"camera_down"
+const ACTION_CAMERA_LEFT: StringName = &"camera_left"
+const ACTION_CAMERA_RIGHT: StringName = &"camera_right"
+
+const MOUSE_SENSITIVITY_PATH: StringName = &"game/input/sensitivity"
+const CONTROLLER_SENSITIVITY_PATH: StringName = &"game/input/controller_sensitivity"
+const INVERT_X_PATH: StringName = &"game/input/camera_invert_x"
+const INVERT_Y_PATH: StringName = &"game/input/camera_invert_y"
+const CONTROLLER_INVERT_X_PATH: StringName = &"game/input/camera_controller_invert_x"
+const CONTROLLER_INVERT_Y_PATH: StringName = &"game/input/camera_controller_invert_y"
+
+@export var camera: Camera3D
+@export_range(-360, 360, 0.5, "suffix:°") var look_min_vertical_angle: float = -85.0
+@export_range(-360, 360, 0.5, "suffix:°") var look_max_vertical_angle: float = 85.0
+
+@export_group("Acceleration")
+@export var mouse_acceleration: bool = false
+@export_exp_easing("attenuation") var mouse_friction: float = 15.0
+@export var controller_acceleration: bool = true
+@export_exp_easing("attenuation") var controller_friction: float = 15.0
+
+@export_group("Input")
+@export_subgroup("Sensitivity")
+@export_range(0.0, 100.0, 0.001, "or_greater") var mouse_sensitivity: float = 1.0
+@export_range(0.0, 100.0, 0.001, "or_greater") var controller_sensitivity: float = 0.75
+@export_subgroup("Invert")
+@export var invert_x: bool = false
+@export var invert_y: bool = false
+@export var controller_invert_x: bool = false
+@export var controller_invert_y: bool = false
+
+var rotational_direction: Vector2
+var rotational_velocity: Vector2
+var input_event: InputEvent
+var using_controller: bool = false
+
+
+func _ready() -> void:
+ # Update values based on project settings.
+ var _update_settings: Callable = func() -> void:
+ mouse_sensitivity = ProjectSettings.get_setting(MOUSE_SENSITIVITY_PATH, 1.6)
+ controller_sensitivity = ProjectSettings.get_setting(CONTROLLER_SENSITIVITY_PATH, 5.0)
+ invert_x = ProjectSettings.get_setting(INVERT_X_PATH, false)
+ invert_y = ProjectSettings.get_setting(INVERT_Y_PATH, false)
+ controller_invert_x = ProjectSettings.get_setting(CONTROLLER_INVERT_X_PATH, false)
+ controller_invert_y = ProjectSettings.get_setting(CONTROLLER_INVERT_Y_PATH, false)
+
+ ProjectSettings.settings_changed.connect(_update_settings)
+ _update_settings.call()
+
+
+func _physics_process(delta: float) -> void:
+ _process_input(delta)
+
+
+func _unhandled_input(event: InputEvent) -> void:
+ if event is InputEventMouseMotion or event is InputEventJoypadMotion:
+ input_event = event
+
+
+func apply_rotation(rot: Vector2) -> void:
+ rotate_y(-rot.x)
+ rotation.x = rotation.x - rot.y
+ rotation_degrees.x = clampf(rotation_degrees.x, look_min_vertical_angle, look_max_vertical_angle)
+
+
+func get_sensitivity() -> float:
+ var sensitivity: float = mouse_sensitivity if not using_controller else controller_sensitivity
+ var frame_rate: float = Engine.get_frames_per_second() / 60.0
+ sensitivity *= frame_rate
+ #print(frame_rate)
+
+ return sensitivity
+
+
+func _process_input(delta: float) -> void:
+ if Input.mouse_mode != Input.MOUSE_MODE_CAPTURED or not InputManager.window_focused():
+ return
+
+ if input_event is InputEventMouseMotion:
+ _process_mouse(input_event, delta)
+ using_controller = false
+ rotational_direction = Vector2.ZERO
+ input_event = null
+
+ elif input_event is InputEventJoypadMotion:
+ _process_controller(delta)
+ using_controller = true
+ rotational_direction = Vector2.ZERO
+
+ # Decelerating when nothing is being pressed.
+ elif not rotational_velocity.is_zero_approx() and rotational_direction.is_zero_approx():
+ input_event = null
+
+ if not using_controller and mouse_acceleration:
+ rotational_velocity = _lerp_rotational_velocity(get_sensitivity() / 10, mouse_friction, delta)
+ elif using_controller and controller_acceleration:
+ rotational_velocity = _lerp_rotational_velocity(get_sensitivity(), controller_friction,delta)
+ apply_rotation(rotational_velocity)
+ else:
+ rotational_velocity = Vector2.ZERO
+
+ apply_rotation(rotational_velocity)
+
+
+func _process_mouse(event: InputEventMouseMotion, delta: float) -> void:
+ # TODO: Somehow fix the fps-dependent mouse :/
+ # https://yosoyfreeman.github.io/godot/achieving-better-mouse-input-in-godot-4-the-perfect-camera-controller-full-project/
+ var viewport_transform: Transform2D = get_tree().get_root().get_final_transform()
+ rotational_direction = event.xformed_by(viewport_transform).get_relative()
+
+ if invert_x:
+ rotational_direction.x = -rotational_direction.x
+
+ if invert_y:
+ rotational_direction.y = -rotational_direction.y
+
+ if mouse_acceleration:
+ rotational_velocity = _lerp_rotational_velocity(deg_to_rad(get_sensitivity() / 10.0), mouse_friction, delta)
+ apply_rotation(rotational_velocity)
+ else:
+ apply_rotation(rotational_direction * deg_to_rad(get_sensitivity() / 10.0))
+
+
+func _process_controller(delta: float) -> void:
+ rotational_direction = Input.get_vector(ACTION_CAMERA_LEFT, ACTION_CAMERA_RIGHT, ACTION_CAMERA_UP, ACTION_CAMERA_DOWN)
+
+ if controller_invert_x:
+ rotational_direction.x = -rotational_direction.x
+
+ if controller_invert_y:
+ rotational_direction.y = -rotational_direction.y
+
+ if controller_acceleration:
+ rotational_velocity = _lerp_rotational_velocity(deg_to_rad(get_sensitivity()), controller_friction, delta)
+ apply_rotation(rotational_velocity)
+ else:
+ apply_rotation(rotational_direction * deg_to_rad(get_sensitivity()))
+
+
+func _lerp_rotational_velocity(sensitivity: float, friction: float, delta: float) -> Vector2:
+ return rotational_velocity.lerp(rotational_direction * sensitivity, friction * delta)
diff --git a/source/components/characters/player/head.gd.uid b/source/components/characters/player/head.gd.uid
new file mode 100644
index 0000000..2de950d
--- /dev/null
+++ b/source/components/characters/player/head.gd.uid
@@ -0,0 +1 @@
+uid://2y3gnaqtrfnx
diff --git a/source/components/characters/player/player_character.gd b/source/components/characters/player/player_character.gd
new file mode 100644
index 0000000..2bc6eca
--- /dev/null
+++ b/source/components/characters/player/player_character.gd
@@ -0,0 +1,66 @@
+class_name PlayerCharacter
+extends CharacterBase3D
+
+
+const ACTION_RUN: StringName = &"run"
+const ACTION_JUMP: StringName = &"jump"
+const ACTION_MOVE_LEFT: StringName = &"move_left"
+const ACTION_MOVE_RIGHT: StringName = &"move_right"
+const ACTION_MOVE_FORWARD: StringName = &"move_forward"
+const ACTION_MOVE_BACKWARD: StringName = &"move_backward"
+
+var has_control: bool = true
+
+@onready var head: GameCamera3D = $Head
+
+
+func _ready() -> void:
+ GameGlobals.player = self
+
+
+func _physics_process(delta: float) -> void:
+ # Add the gravity.
+ if not is_on_floor():
+ apply_gravity(delta)
+
+ if not has_control:
+ move(Vector3.ZERO, delta)
+ move_and_slide()
+ return
+
+ # Handle jump.
+ if Input.is_action_just_pressed(ACTION_JUMP) and is_on_floor():
+ jump()
+
+ var input_dir: Vector3 = get_input_direction()
+ movement_direction = input_dir.normalized()
+
+ # Rotate the movement direction based on the cameras orientation.
+ movement_direction = movement_direction.rotated(Vector3.UP, head.global_rotation.y)
+
+ speed = get_desired_speed() * input_dir.length()
+
+ move(movement_direction, delta)
+
+ move_and_slide()
+
+
+func apply_gravity(delta: float) -> void:
+ super(delta)
+
+
+func get_input_direction() -> Vector3:
+ if not InputManager.window_focused():
+ return Vector3.ZERO
+
+ var input_dir := Input.get_vector(ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT, ACTION_MOVE_FORWARD, ACTION_MOVE_BACKWARD)
+ var direction: Vector3 = (transform.basis * Vector3(input_dir.x, 1, input_dir.y))#.normalized()
+ direction.y = 0.0
+ return direction
+
+
+func get_desired_speed() -> float:
+ if Input.is_action_pressed(ACTION_RUN):
+ return movement.running_speed if is_on_floor() else movement.air_running_speed
+
+ return movement.walking_speed if is_on_floor() else movement.air_walking_speed
diff --git a/source/components/characters/player/player_character.gd.uid b/source/components/characters/player/player_character.gd.uid
new file mode 100644
index 0000000..d000131
--- /dev/null
+++ b/source/components/characters/player/player_character.gd.uid
@@ -0,0 +1 @@
+uid://day6rhxicaxqf
diff --git a/source/components/characters/player/player_character.tscn b/source/components/characters/player/player_character.tscn
new file mode 100644
index 0000000..6f6e4bf
--- /dev/null
+++ b/source/components/characters/player/player_character.tscn
@@ -0,0 +1,50 @@
+[gd_scene load_steps=7 format=3 uid="uid://clhy3kiceqf2o"]
+
+[ext_resource type="Script" uid="uid://day6rhxicaxqf" path="res://components/characters/player/player_character.gd" id="1_hqu6r"]
+[ext_resource type="Script" uid="uid://dsjlv8midt2g2" path="res://components/characters/character_movement_base.gd" id="2_1ixuj"]
+[ext_resource type="Script" uid="uid://2y3gnaqtrfnx" path="res://components/characters/player/head.gd" id="2_fjt7c"]
+[ext_resource type="Script" uid="uid://nuwb55sbveaf" path="res://components/characters/common/footstep_component.gd" id="4_vq0uu"]
+
+[sub_resource type="Resource" id="Resource_vq0uu"]
+script = ExtResource("2_1ixuj")
+jump_height = 0.25
+walking_speed = 3.5
+air_walking_speed = 3.75
+running_speed = 5.5
+air_running_speed = 6.0
+max_turning_speed = 70.0
+max_air_turning_speed = 10.0
+max_acceleration = 30.0
+max_air_acceleration = 10.0
+max_friction = 20.0
+max_air_friction = 10.0
+use_default_physics_gravity = true
+gravity = 9.8
+gravity_check_margin = 0.05
+rise_gravity_multiplier = 1.0
+peak_gravity_multiplier = 0.3
+fall_gravity_multiplier = 1.5
+metadata/_custom_type_script = "uid://dsjlv8midt2g2"
+
+[sub_resource type="CylinderShape3D" id="CylinderShape3D_fjt7c"]
+
+[node name="PlayerCharacter" type="CharacterBody3D"]
+script = ExtResource("1_hqu6r")
+movement = SubResource("Resource_vq0uu")
+metadata/_custom_type_script = "uid://day6rhxicaxqf"
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
+shape = SubResource("CylinderShape3D_fjt7c")
+
+[node name="Head" type="Node3D" parent="." node_paths=PackedStringArray("camera")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8, 0)
+script = ExtResource("2_fjt7c")
+camera = NodePath("Camera3D")
+
+[node name="Camera3D" type="Camera3D" parent="Head"]
+fov = 85.0
+
+[node name="FootstepComponent" type="Node" parent="." node_paths=PackedStringArray("character")]
+script = ExtResource("4_vq0uu")
+character = NodePath("..")
diff --git a/source/components/collision/areas/dynamic_area_loader.gd b/source/components/collision/areas/dynamic_area_loader.gd
new file mode 100644
index 0000000..6ec207c
--- /dev/null
+++ b/source/components/collision/areas/dynamic_area_loader.gd
@@ -0,0 +1,106 @@
+@icon("dynamic_area_loader.svg")
+class_name DynamicAreaLoader3D
+extends Area3D
+
+## An [Area3D] that dynamicly load a scene based on proximity.
+##
+## [b]Note:[/b] By default the [signal body_entered] and [signal body_exited] signals are linked
+## to private [method _on_body_entered] and [method _on_body_exited] functions that check
+## if the [param body] is the [member GameGlobals.player] and (un)load the area based on that.
+
+## The signal emitted when the area to be loaded finished loading and was added to the scene tree.[br]
+## You can combine this for eg. a door that only opens once the area behind it finished loading.
+signal load_finished(loaded_node: Node)
+
+
+## The node to load and add.[br][br]
+## [b]IMPORTANT:[/b] The node needs to be marked as [b]Load as Placeholder[/b], otherwise nothing
+## happens when loading (see [InstancePlaceholder]).
+@export var placeholder_node: Node
+## If [code]true[/code], the actual loading will be done separately in a thread.[br]
+## This prevents the game from freezing for a moment when loading a large scene.[br]
+## However, loading can be slower on lower-end hardware.
+@export var threaded: bool = true
+## How long [i](in seconds)[/i] the area will still be loaded and inside the scene tree
+## when the [PlayerCharacter] exits this area.[br]This is to prevent the [PlayerCharacter]
+## from keep re-loading the area by just walking back and fourth through the load zones.
+@export_range(0.0, 10.0, 0.01, "or_greater", "suffix:s") var keep_loaded_duration: float = 3.0
+
+## The reference to the currently loaded node that was loaded.
+var loaded_node: Node
+
+
+func _ready() -> void:
+ body_entered.connect(_on_body_entered)
+ body_exited.connect(_on_body_exited)
+
+
+## Instances the area defined by [member placeholder_node].[br]
+## See [method load_area_threaded] if you want to load the area in a thread instead
+## of having a freeze during load.
+func load_area(custom_scene: PackedScene = null) -> void:
+ if is_instance_valid(placeholder_node) and placeholder_node is InstancePlaceholder:
+ if is_instance_valid(loaded_node) or not overlaps_body(GameGlobals.get_player()):
+ return
+
+ loaded_node = placeholder_node.create_instance(false, custom_scene)
+ load_finished.emit(loaded_node)
+
+
+## Loads the scene defined in
+## [member placeholder_node] ([member InstancePlaceholder.get_instance_path]) threaded.[br]
+## Calls [method load_area] with the [param custom_scene] set to the loaded scene.
+func load_area_threaded() -> void:
+ if is_instance_valid(loaded_node):
+ return
+
+ if not is_instance_valid(placeholder_node) or placeholder_node is not InstancePlaceholder:
+ return
+
+ placeholder_node = placeholder_node as InstancePlaceholder
+
+ var path: String = placeholder_node.get_instance_path()
+ ResourceLoader.load_threaded_request(path, "", true)
+
+ while ResourceLoader.load_threaded_get_status(path) == ResourceLoader.THREAD_LOAD_IN_PROGRESS:
+ if not is_inside_tree():
+ return
+
+ await get_tree().process_frame
+
+ var scene: PackedScene = ResourceLoader.load_threaded_get(path)
+
+ load_area(scene)
+
+
+## Unloads ([method Node.queue_free]) the [member loaded_node].[br]
+## If [param instantly_unload] is [code]true[/code], don't wait for the
+## [member keep_loaded_duration] to end and instantly free the node.
+func unload_area(instantly_unload: bool = false) -> void:
+ if not is_instance_valid(loaded_node):
+ return
+
+ if not instantly_unload and keep_loaded_duration > 0.0:
+ var duration: float = keep_loaded_duration
+
+ while is_inside_tree() and duration > 0.0:
+ if overlaps_body(GameGlobals.get_player()):
+ return
+
+ duration -= get_process_delta_time()
+ await get_tree().process_frame
+
+ loaded_node.queue_free()
+
+
+func _on_body_entered(body: Node3D) -> void:
+ if body == GameGlobals.get_player():
+ if threaded:
+ load_area_threaded()
+ else:
+ load_area()
+
+
+func _on_body_exited(body: Node3D) -> void:
+ if body == GameGlobals.get_player():
+ unload_area()
diff --git a/source/components/collision/areas/dynamic_area_loader.gd.uid b/source/components/collision/areas/dynamic_area_loader.gd.uid
new file mode 100644
index 0000000..b59f518
--- /dev/null
+++ b/source/components/collision/areas/dynamic_area_loader.gd.uid
@@ -0,0 +1 @@
+uid://bj2bhtdul8xct
diff --git a/source/components/collision/areas/dynamic_area_loader.svg b/source/components/collision/areas/dynamic_area_loader.svg
new file mode 100644
index 0000000..db1a244
--- /dev/null
+++ b/source/components/collision/areas/dynamic_area_loader.svg
@@ -0,0 +1,63 @@
+
+
diff --git a/source/components/collision/areas/dynamic_area_loader.svg.import b/source/components/collision/areas/dynamic_area_loader.svg.import
new file mode 100644
index 0000000..c53cd8b
--- /dev/null
+++ b/source/components/collision/areas/dynamic_area_loader.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://4qsmkgrm8frw"
+path="res://.godot/imported/dynamic_area_loader.svg-9c18be72046d8461d1671f5d055e60a9.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://components/collision/areas/dynamic_area_loader.svg"
+dest_files=["res://.godot/imported/dynamic_area_loader.svg-9c18be72046d8461d1671f5d055e60a9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/source/components/general/interactive_loader.gd b/source/components/general/interactive_loader.gd
new file mode 100644
index 0000000..588ccd3
--- /dev/null
+++ b/source/components/general/interactive_loader.gd
@@ -0,0 +1,27 @@
+class_name InteractiveLoader
+extends Node
+
+
+func load_threaded(path: String) -> Resource:
+ if not is_inside_tree():
+ Logger.print_msg("[Interactive Loader] needs to be added to the scene tree.", -1.0, Logger.ErrTypes.WARNING)
+ return null
+
+ if not ResourceLoader.exists(path):
+ Logger.print_msg("[Interactive Loader] the given path (%s) doesn't exist." %path, -1.0, Logger.ErrTypes.WARNING)
+ return null
+
+ ResourceLoader.load_threaded_request(path, "", false, ResourceLoader.CACHE_MODE_REUSE)
+
+ while ResourceLoader.load_threaded_get_status(path) != ResourceLoader.THREAD_LOAD_LOADED:
+ match ResourceLoader.load_threaded_get_status(path):
+ ResourceLoader.THREAD_LOAD_FAILED || ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
+ Logger.print_msg("[Interactive Loader] load failed.", -1.0, Logger.ErrTypes.WARNING)
+ return null
+
+ if is_inside_tree():
+ await get_tree().process_frame
+ else:
+ Logger.print_msg("[Interactive Loader] is no longer in the scene tree. We can't wait for a process frame anymore, resulting in a freeze.", -1.0, Logger.ErrTypes.WARNING)
+
+ return ResourceLoader.load_threaded_get(path)
diff --git a/source/components/general/interactive_loader.gd.uid b/source/components/general/interactive_loader.gd.uid
new file mode 100644
index 0000000..0a466ec
--- /dev/null
+++ b/source/components/general/interactive_loader.gd.uid
@@ -0,0 +1 @@
+uid://d0k03wk1s7cw0
diff --git a/source/components/general/player_spawn_point.gd b/source/components/general/player_spawn_point.gd
new file mode 100644
index 0000000..6c6cd4e
--- /dev/null
+++ b/source/components/general/player_spawn_point.gd
@@ -0,0 +1,27 @@
+@tool
+class_name PlayerSpawnPoint
+extends Marker3D
+
+@export var spawn_index: int = 0: set = set_spawn_index
+
+var idx_label: Label3D
+
+
+func _init() -> void:
+ if Engine.is_editor_hint():
+ add_child(load("res://components/characters/player/player_character.tscn").instantiate(), false, Node.INTERNAL_MODE_FRONT)
+
+ # Setup label.
+ idx_label = Label3D.new()
+ idx_label.billboard = BaseMaterial3D.BILLBOARD_ENABLED
+ idx_label.shaded = false
+ add_child(idx_label, false, Node.INTERNAL_MODE_FRONT)
+ idx_label.position.y = 1.8
+ set_spawn_index(spawn_index)
+
+
+func set_spawn_index(index: int) -> void:
+ spawn_index = index
+
+ if is_instance_valid(idx_label):
+ idx_label.text = str(spawn_index)
diff --git a/source/components/general/player_spawn_point.gd.uid b/source/components/general/player_spawn_point.gd.uid
new file mode 100644
index 0000000..d4d3142
--- /dev/null
+++ b/source/components/general/player_spawn_point.gd.uid
@@ -0,0 +1 @@
+uid://3hlvt5k34xva
diff --git a/source/components/general/time/stopwatch.gd b/source/components/general/time/stopwatch.gd
new file mode 100644
index 0000000..4113312
--- /dev/null
+++ b/source/components/general/time/stopwatch.gd
@@ -0,0 +1,92 @@
+@icon("stopwatch.svg")
+class_name Stopwatch
+extends Node
+
+
+## A clock that counts upwards, like a stopwatch.
+
+## Emitted, whenever the elapsed time reaches the [param max_time] limit.
+signal max_time_reached
+
+## See documentation for [param process_callback] in [Timer]
+@export var process_callback: Timer.TimerProcessCallback
+## The time, where we count upwards from when [method start] is called.
+@export var start_time: float = 0.0
+## The maximum allowed elapsed time we can have.[br]If this is under [code]0[/code]
+## we don't have any limit and we count towards infinity.
+@export var max_time: float = -1.0
+## If [code]true[/code], the stopwatch will call [method start] when entering the scene tree.
+@export var autostart: bool = false
+## If [code]true[/code], it will reset the timer when [method stop] is being called.
+@export var reset_timer_on_stop: bool = true
+
+
+## The stopwatch will halt it's counting when this is [code]true[/code].
+var paused: bool = false
+var _stopped: bool = true
+var _time_elapsed: float = 0.0
+
+
+func _ready() -> void:
+ if autostart:
+ start()
+
+
+func _process(delta: float) -> void:
+ if process_callback == Timer.TIMER_PROCESS_IDLE:
+ _process_timer(delta)
+
+
+func _physics_process(delta: float) -> void:
+ if process_callback == Timer.TIMER_PROCESS_PHYSICS:
+ _process_timer(delta)
+
+
+func _process_timer(delta: float) -> void:
+ if is_stopped() or is_paused():
+ return
+
+ _time_elapsed += delta
+
+ if (max_time >= 0.0) and (_time_elapsed >= max_time):
+ max_time_reached.emit()
+ stop()
+
+
+#region Starting/Stopping
+## Starts the stopwatch. [param custom_start_time] will set the elapsed time to it instead of
+## using [param start_time].
+func start(custom_start_time: float = start_time) -> void:
+ _time_elapsed = custom_start_time
+ _stopped = false
+
+
+## Stops the stopwatch.
+func stop(reset_time: bool = reset_timer_on_stop) -> float:
+ var final_time: float = _time_elapsed
+
+ if reset_time:
+ _time_elapsed = start_time
+
+ _stopped = true
+ return final_time
+#endregion
+
+
+## Returns the elapsed time since this stopwatch was started.
+func get_elapsed_time() -> float:
+ return _time_elapsed
+
+
+## Will pause or unpause the counting.
+func set_paused(value: bool) -> void:
+ paused = value
+
+
+## Returns [code]true[/code] when this stopwatch isn't running.
+func is_stopped() -> bool:
+ return _stopped
+
+## Returns [code]true[/code] when this stopwatch is [u]paused[/u].
+func is_paused() -> bool:
+ return paused
diff --git a/source/components/general/time/stopwatch.gd.uid b/source/components/general/time/stopwatch.gd.uid
new file mode 100644
index 0000000..b6920a3
--- /dev/null
+++ b/source/components/general/time/stopwatch.gd.uid
@@ -0,0 +1 @@
+uid://ks6mg2lcq8cp
diff --git a/source/components/general/time/stopwatch.svg b/source/components/general/time/stopwatch.svg
new file mode 100644
index 0000000..ec09b3d
--- /dev/null
+++ b/source/components/general/time/stopwatch.svg
@@ -0,0 +1 @@
+
diff --git a/source/components/general/time/stopwatch.svg.import b/source/components/general/time/stopwatch.svg.import
new file mode 100644
index 0000000..b9dcb2a
--- /dev/null
+++ b/source/components/general/time/stopwatch.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://tp3a265sgd56"
+path="res://.godot/imported/stopwatch.svg-08e28e82dba60f19b1db4b5017ec9c2b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://components/general/time/stopwatch.svg"
+dest_files=["res://.godot/imported/stopwatch.svg-08e28e82dba60f19b1db4b5017ec9c2b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/components/general/time/timescalable_timer.gd b/source/components/general/time/timescalable_timer.gd
new file mode 100644
index 0000000..2f45800
--- /dev/null
+++ b/source/components/general/time/timescalable_timer.gd
@@ -0,0 +1,126 @@
+@icon("res://components/ui/hud/timer/stopwatch.svg")
+class_name TimescalableTimer
+extends Node
+
+
+## A timescalable-countdown timer.
+##
+## The [b]Timer[/b] node is a countdown timer and is the simplest way to handle time-based logic in the engine.
+## When a timer reaches the end of its [member wait_time], it will emit the [signal timeout] signal.[br][br]
+## After a timer enters the tree, it can be manually started with [method start].
+## A timer node is also started automatically if [member autostart] is [code]true[/code].[br][br]
+## Without requiring much code, a timer node can be added and configured in the editor.
+## The [signal timeout] signal it emits can also be connected through the Node dock in the editor:
+##
+## [codeblock]
+## func _on_timer_timeout():
+## print("Time to attack!")
+## [/codeblock]
+## [b]Note:[/b] To create a one-shot timer without instantiating a node, use [method SceneTree.create_timer].[br][br]
+## [b]Note:[/b] Timers are affected by [member Engine.time_scale].
+## The higher the time scale, the sooner timers will end.
+## How often a timer processes may depend on the framerate or [member Engine.physics_ticks_per_second].
+
+
+## Emitted when the timer reaches the end.
+signal timeout
+
+## See documentation for [param process_callback] in [Timer]
+@export var process_callback: Timer.TimerProcessCallback
+## The time required for the timer to end, in seconds. This property can also be set every time [member start] is called.
+##
+## [b]Note[/b]: Timers can only process once per physics or process frame (depending on the [member process_callback]).
+## An unstable framerate may cause the timer to end inconsistently,
+## which is especially noticeable if the wait time is lower than roughly [code]0.05[/code] seconds.
+## For very short timers, it is recommended to write your own code instead of using a [Timer] node.
+## Timers are also affected by [Engine.time_scale].
+@export_range(0.001, 4096.0, 0.001, "suffix:s") var wait_time: float = 1.0: get = get_wait_time, set = set_wait_time
+## The maximum allowed elapsed time we can have.[br]If this is under [code]0[/code]
+## we don't have any limit and we count towards infinity.
+@export var one_shot: bool = false
+## If [code]true[/code], the stopwatch will call [method start] when entering the scene tree.
+@export var autostart: bool = false
+## Manipulates, how fast or slow the timer will count down.
+@export_range(-10.0, 10.0, 0.01, "or_greater", "or_less") var time_scale: float = 1.0
+
+var time_left: float = -1.0: get = get_time_left
+var paused: bool = false: set = set_paused, get = is_paused
+var _stopped: bool = true
+
+
+func _ready() -> void:
+ if autostart:
+ start()
+
+
+func _process(delta: float) -> void:
+ if process_callback == Timer.TIMER_PROCESS_IDLE:
+ _process_timer(delta)
+
+
+func _physics_process(delta: float) -> void:
+ if process_callback == Timer.TIMER_PROCESS_PHYSICS:
+ _process_timer(delta)
+
+
+func _process_timer(delta: float) -> void:
+ if is_stopped() or is_paused():
+ return
+
+ time_left = maxf(time_left - delta * time_scale, 0.0)
+
+ if time_left == 0.0:
+ timeout.emit()
+
+ if one_shot:
+ stop()
+ else:
+ time_left += wait_time
+
+
+#region Starting/Stopping
+## Starts the stopwatch. [param custom_start_time] will set the elapsed time to it instead of
+## using [param start_time].
+func start(time_sec: float = -1.0) -> void:
+ if time_sec >= 0.0:
+ wait_time = time_sec
+
+ time_left = wait_time
+ _stopped = false
+ paused = false
+
+
+## Stops the stopwatch.
+func stop() -> float:
+ var final_time: float = time_left
+
+ time_left = -1.0
+ _stopped = true
+
+ return final_time
+#endregion
+
+
+func get_wait_time() -> float:
+ return wait_time
+
+
+func set_wait_time(value: float) -> void:
+ wait_time = value
+
+
+## Returns the elapsed time since this stopwatch was started.
+func get_time_left() -> float:
+ return time_left if not is_stopped() else 0.0
+
+
+## Returns [code]true[/code] if the timer is stopped or has not started.
+func is_stopped() -> bool:
+ return _stopped
+
+
+func set_paused(value: bool) -> void:
+ paused = value
+
+func is_paused() -> bool:
+ return paused
diff --git a/source/components/general/time/timescalable_timer.gd.uid b/source/components/general/time/timescalable_timer.gd.uid
new file mode 100644
index 0000000..c6f98a8
--- /dev/null
+++ b/source/components/general/time/timescalable_timer.gd.uid
@@ -0,0 +1 @@
+uid://vxif8s75qb74
diff --git a/source/components/hazards/saw/saw.blend b/source/components/hazards/saw/saw.blend
new file mode 100644
index 0000000..9bceed3
Binary files /dev/null and b/source/components/hazards/saw/saw.blend differ
diff --git a/source/components/hazards/saw/saw.blend.import b/source/components/hazards/saw/saw.blend.import
new file mode 100644
index 0000000..4aa0618
--- /dev/null
+++ b/source/components/hazards/saw/saw.blend.import
@@ -0,0 +1,53 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://u56f1ks46ob6"
+path="res://.godot/imported/saw.blend-3146841855ef00b916ccba50c122f9a9.scn"
+
+[deps]
+
+source_file="res://components/hazards/saw/saw.blend"
+dest_files=["res://.godot/imported/saw.blend-3146841855ef00b916ccba50c122f9a9.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+nodes/use_node_type_suffixes=true
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=0
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+animation/import_rest_as_RESET=false
+import_script/path=""
+_subresources={}
+blender/nodes/visible=0
+blender/nodes/active_collection_only=false
+blender/nodes/punctual_lights=true
+blender/nodes/cameras=true
+blender/nodes/custom_properties=true
+blender/nodes/modifiers=1
+blender/meshes/colors=false
+blender/meshes/uvs=true
+blender/meshes/normals=true
+blender/meshes/export_geometry_nodes_instances=false
+blender/meshes/tangents=true
+blender/meshes/skins=2
+blender/meshes/export_bones_deforming_mesh_only=false
+blender/materials/unpack_enabled=true
+blender/materials/export_materials=1
+blender/animation/limit_playback=true
+blender/animation/always_sample=true
+blender/animation/group_tracks=true
diff --git a/source/components/hazards/saw/saw.blend1 b/source/components/hazards/saw/saw.blend1
new file mode 100644
index 0000000..17dc137
Binary files /dev/null and b/source/components/hazards/saw/saw.blend1 differ
diff --git a/source/components/hazards/saw/saw.gd b/source/components/hazards/saw/saw.gd
new file mode 100644
index 0000000..d7efef5
--- /dev/null
+++ b/source/components/hazards/saw/saw.gd
@@ -0,0 +1,10 @@
+extends Node3D
+
+@export var spin_speed: float = 7.0
+
+@onready var saw_skin: Node3D = $SawSkin
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _physics_process(delta: float) -> void:
+ saw_skin.rotate_z(spin_speed * delta)
diff --git a/source/components/hazards/saw/saw.gd.uid b/source/components/hazards/saw/saw.gd.uid
new file mode 100644
index 0000000..f8da699
--- /dev/null
+++ b/source/components/hazards/saw/saw.gd.uid
@@ -0,0 +1 @@
+uid://cd1p1fxbdglwu
diff --git a/source/components/hazards/saw/saw.tscn b/source/components/hazards/saw/saw.tscn
new file mode 100644
index 0000000..27c3352
--- /dev/null
+++ b/source/components/hazards/saw/saw.tscn
@@ -0,0 +1,9 @@
+[gd_scene load_steps=3 format=3 uid="uid://c0jearfhlqcvr"]
+
+[ext_resource type="Script" uid="uid://cd1p1fxbdglwu" path="res://components/hazards/saw/saw.gd" id="1_bec0m"]
+[ext_resource type="PackedScene" uid="uid://u56f1ks46ob6" path="res://components/hazards/saw/saw.blend" id="1_eq5lu"]
+
+[node name="Saw" type="Node3D"]
+script = ExtResource("1_bec0m")
+
+[node name="SawSkin" parent="." instance=ExtResource("1_eq5lu")]
diff --git a/source/components/ui/menus/boot/boot.gd b/source/components/ui/menus/boot/boot.gd
new file mode 100644
index 0000000..44e456d
--- /dev/null
+++ b/source/components/ui/menus/boot/boot.gd
@@ -0,0 +1,7 @@
+extends Control
+
+@onready var shader_precompiler: Node = $ShaderPrecompiler
+
+
+func _on_shader_precompiler_finished_compilation() -> void:
+ get_tree().quit()
diff --git a/source/components/ui/menus/boot/boot.gd.uid b/source/components/ui/menus/boot/boot.gd.uid
new file mode 100644
index 0000000..d15e891
--- /dev/null
+++ b/source/components/ui/menus/boot/boot.gd.uid
@@ -0,0 +1 @@
+uid://bf1k68a8ky3ps
diff --git a/source/components/ui/menus/boot/boot.tscn b/source/components/ui/menus/boot/boot.tscn
new file mode 100644
index 0000000..8aae3f2
--- /dev/null
+++ b/source/components/ui/menus/boot/boot.tscn
@@ -0,0 +1,17 @@
+[gd_scene load_steps=3 format=3 uid="uid://coga3ke4xw3a0"]
+
+[ext_resource type="Script" uid="uid://bf1k68a8ky3ps" path="res://components/ui/menus/boot/boot.gd" id="1_yodsw"]
+[ext_resource type="PackedScene" uid="uid://b2wlequ3m4trj" path="res://components/ui/menus/boot/shader_precompilation/shader_precompiler.tscn" id="2_fge7m"]
+
+[node name="Boot" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_yodsw")
+
+[node name="ShaderPrecompiler" parent="." instance=ExtResource("2_fge7m")]
+
+[connection signal="finished_compilation" from="ShaderPrecompiler" to="." method="_on_shader_precompiler_finished_compilation"]
diff --git a/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd b/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd
new file mode 100644
index 0000000..bfbfb80
--- /dev/null
+++ b/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd
@@ -0,0 +1,79 @@
+extends Node
+
+signal finished_compilation
+
+const EXCLUDED_DIRECTORIES: Array[String] = [
+ "res://addons",
+ "res://.godot"
+]
+
+#const SIMUTANEOUS_SCENES: int = 5
+
+@onready var progress_bar: ProgressBar = %ProgressBar
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+ await get_tree().create_timer(1.0).timeout
+ precompile_shaders()
+
+
+func precompile_shaders() -> void:
+ var files: PackedStringArray = find_scene_file_paths("res://")
+ var index: int = 0
+
+ while index < files.size():
+ #print("Compilation Progress: ", index, "/", files.size() - 1)
+
+ var file: String = files[index]
+ index += 1
+
+ if scene_file_path == file or get_tree().current_scene.scene_file_path == file:
+ continue
+
+ await compile_scene(file)
+
+ progress_bar.value = index / float(files.size())
+
+ finished_compilation.emit()
+
+
+func compile_scene(scene_path: String) -> void:
+ var scene: PackedScene = load(scene_path)
+
+ if not scene.can_instantiate():
+ return
+
+ var node: Node = scene.instantiate()
+
+ node.set_script(null)
+
+ for child: Node in Utils.get_all_children(node):
+ child.set_script(null)
+ #child.set_process(false)
+ #child.set_process_internal(false)
+ #child.set_physics_process_internal(false)
+
+ add_child(node)
+ await get_tree().create_timer(0.2, false).timeout
+ node.queue_free()
+
+
+func find_scene_file_paths(path: String, find_recursive: bool = true) -> PackedStringArray:
+ var files: PackedStringArray = []
+
+ for file: String in DirAccess.get_files_at(path):
+ if file.get_extension().contains("scn"):
+ #print("Path: '%s' Filename: '%s'" %[path, file])
+ files.append(str(path, "/" if not path.ends_with("/") else "", file))
+
+ if find_recursive:
+ for folder: String in DirAccess.get_directories_at(path):
+ var _path: String = str(path, "/" if not path.ends_with("/") else "", folder)
+
+ if EXCLUDED_DIRECTORIES.has(_path):
+ continue
+
+ files.append_array(find_scene_file_paths(_path))
+
+ return files
diff --git a/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd.uid b/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd.uid
new file mode 100644
index 0000000..f9dd782
--- /dev/null
+++ b/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.gd.uid
@@ -0,0 +1 @@
+uid://cpt7foih8y88d
diff --git a/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.tscn b/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.tscn
new file mode 100644
index 0000000..093745a
--- /dev/null
+++ b/source/components/ui/menus/boot/shader_precompilation/shader_precompiler.tscn
@@ -0,0 +1,45 @@
+[gd_scene load_steps=2 format=3 uid="uid://b2wlequ3m4trj"]
+
+[ext_resource type="Script" uid="uid://cpt7foih8y88d" path="res://components/ui/menus/boot/shader_precompilation/shader_precompiler.gd" id="1_ibtyg"]
+
+[node name="ShaderPrecompiler" type="Node"]
+script = ExtResource("1_ibtyg")
+
+[node name="Camera3D" type="Camera3D" parent="."]
+transform = Transform3D(0.707107, -0.183013, 0.683013, 0, 0.965926, 0.258819, -0.707107, -0.183013, 0.683013, 27, 14, 38)
+current = true
+
+[node name="CanvasLayer" type="CanvasLayer" parent="."]
+layer = 128
+
+[node name="ColorRect" type="ColorRect" parent="CanvasLayer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0, 0, 0, 1)
+
+[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer"]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -256.0
+offset_top = -27.0
+offset_right = 256.0
+offset_bottom = 27.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Label" type="Label" parent="CanvasLayer/VBoxContainer"]
+layout_mode = 2
+text = "Compiling shaders, please wait..."
+horizontal_alignment = 1
+
+[node name="ProgressBar" type="ProgressBar" parent="CanvasLayer/VBoxContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(512, 0)
+layout_mode = 2
+max_value = 1.0
diff --git a/source/components/ui/menus/main_menu/main_menu.gd b/source/components/ui/menus/main_menu/main_menu.gd
new file mode 100644
index 0000000..173b569
--- /dev/null
+++ b/source/components/ui/menus/main_menu/main_menu.gd
@@ -0,0 +1,10 @@
+extends MenuBase
+
+
+
+func _on_play_button_pressed() -> void:
+ pass # Replace with function body.
+
+
+func _on_quit_button_pressed() -> void:
+ get_tree().quit()
diff --git a/source/components/ui/menus/main_menu/main_menu.gd.uid b/source/components/ui/menus/main_menu/main_menu.gd.uid
new file mode 100644
index 0000000..be60d40
--- /dev/null
+++ b/source/components/ui/menus/main_menu/main_menu.gd.uid
@@ -0,0 +1 @@
+uid://bmsx3h2kunhb0
diff --git a/source/components/ui/menus/main_menu/main_menu.tscn b/source/components/ui/menus/main_menu/main_menu.tscn
new file mode 100644
index 0000000..f3a94f3
--- /dev/null
+++ b/source/components/ui/menus/main_menu/main_menu.tscn
@@ -0,0 +1,49 @@
+[gd_scene load_steps=2 format=3 uid="uid://dwd8wf02j2epn"]
+
+[ext_resource type="Script" uid="uid://bmsx3h2kunhb0" path="res://components/ui/menus/main_menu/main_menu.gd" id="1_6xfbl"]
+
+[node name="MainMenu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_6xfbl")
+
+[node name="Label" type="Label" parent="."]
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 23.0
+grow_horizontal = 2
+theme_override_font_sizes/font_size = 64
+text = "Untitled Maskot Horror Game"
+horizontal_alignment = 1
+
+[node name="ButtonContainer" type="VBoxContainer" parent="."]
+custom_minimum_size = Vector2(128, 0)
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -21.0
+offset_top = -33.0
+offset_right = 21.0
+offset_bottom = 33.0
+grow_horizontal = 2
+grow_vertical = 2
+alignment = 1
+
+[node name="PlayButton" type="Button" parent="ButtonContainer"]
+layout_mode = 2
+text = "Play"
+
+[node name="QuitButton" type="Button" parent="ButtonContainer"]
+layout_mode = 2
+text = "Quit"
+
+[connection signal="pressed" from="ButtonContainer/PlayButton" to="." method="_on_play_button_pressed"]
+[connection signal="pressed" from="ButtonContainer/QuitButton" to="." method="_on_quit_button_pressed"]
diff --git a/source/components/ui/menus/menu_base.gd b/source/components/ui/menus/menu_base.gd
new file mode 100644
index 0000000..ab33ed5
--- /dev/null
+++ b/source/components/ui/menus/menu_base.gd
@@ -0,0 +1,24 @@
+class_name MenuBase
+extends Control
+
+signal menu_opened
+signal menu_closed
+
+var previous_menu: MenuBase
+
+
+func open_menu(last_menu: MenuBase = previous_menu) -> void:
+ show()
+
+ if is_instance_valid(last_menu):
+ previous_menu = last_menu
+ menu_opened.emit()
+
+
+func close_menu() -> void:
+ hide()
+
+ if is_instance_valid(previous_menu):
+ previous_menu.open_menu()
+ previous_menu = null
+ menu_closed.emit()
diff --git a/source/components/ui/menus/menu_base.gd.uid b/source/components/ui/menus/menu_base.gd.uid
new file mode 100644
index 0000000..1c5f153
--- /dev/null
+++ b/source/components/ui/menus/menu_base.gd.uid
@@ -0,0 +1 @@
+uid://crdgxvb8i0cif
diff --git a/source/globals/autoloads/game_globals.gd b/source/globals/autoloads/game_globals.gd
new file mode 100644
index 0000000..723048c
--- /dev/null
+++ b/source/globals/autoloads/game_globals.gd
@@ -0,0 +1,8 @@
+extends Node
+
+
+var player: PlayerCharacter
+
+
+func get_player() -> PlayerCharacter:
+ return player
diff --git a/source/globals/autoloads/game_globals.gd.uid b/source/globals/autoloads/game_globals.gd.uid
new file mode 100644
index 0000000..9ccfffc
--- /dev/null
+++ b/source/globals/autoloads/game_globals.gd.uid
@@ -0,0 +1 @@
+uid://btqy8shjbegwm
diff --git a/source/globals/autoloads/input_manager.gd b/source/globals/autoloads/input_manager.gd
new file mode 100644
index 0000000..2ad9e05
--- /dev/null
+++ b/source/globals/autoloads/input_manager.gd
@@ -0,0 +1,25 @@
+extends Node
+
+const TOGGLE_MOUSE_BUTTON: StringName = &"toggle_mouse"
+
+var using_controller: bool = false
+
+
+func _input(event: InputEvent) -> void:
+ if not window_focused():
+ get_viewport().set_input_as_handled()
+ return
+
+ if event is InputEventMouseButton or event is InputEventKey:
+ if using_controller:
+ using_controller = false
+ elif event is InputEventJoypadButton or event is InputEventJoypadMotion:
+ if not using_controller:
+ using_controller = true
+
+ if event.is_action_pressed(TOGGLE_MOUSE_BUTTON):
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED if Input.mouse_mode == Input.MOUSE_MODE_VISIBLE else Input.MOUSE_MODE_VISIBLE)
+
+
+func window_focused() -> bool:
+ return DisplayServer.window_is_focused()
diff --git a/source/globals/autoloads/input_manager.gd.uid b/source/globals/autoloads/input_manager.gd.uid
new file mode 100644
index 0000000..8736f51
--- /dev/null
+++ b/source/globals/autoloads/input_manager.gd.uid
@@ -0,0 +1 @@
+uid://cocp0vmvgd4ln
diff --git a/source/globals/general/utils.gd b/source/globals/general/utils.gd
new file mode 100644
index 0000000..13e838e
--- /dev/null
+++ b/source/globals/general/utils.gd
@@ -0,0 +1,31 @@
+class_name Utils
+extends Object
+
+
+const VEC3_HOR := Vector3(1.0, 0.0, 1.0)
+
+
+static func get_all_children(node: Node, internal: bool = false) -> Array[Node]:
+ if not is_instance_valid(node):
+ return []
+
+ var children: Array[Node] = []
+ for child: Node in node.get_children(internal):
+ children.append(child)
+ if child.get_child_count(internal) > 0:
+ children.append_array(get_all_children(child, internal))
+
+ return children
+
+
+static func node_distance(node_a: Node3D, node_b: Node3D, position_modifier := Vector3.ONE) -> float:
+ if not is_instance_valid(node_a) or not is_instance_valid(node_b):
+ return -1.0
+
+ return (node_a.global_position * position_modifier).distance_to(node_b.global_position * position_modifier)
+
+
+## Returns [code]true[/code] when [param node_a] is close to the [param from] node than [param node_b].[br]
+## [b]Note:[/b] Meant to be used with the [method Array.sort_custom] function.
+static func sort_by_distance(from: Node3D, node_a: Node3D, node_b: Node3D) -> bool:
+ return Utils.node_distance(from, node_a) <= Utils.node_distance(from, node_b)
diff --git a/source/globals/general/utils.gd.uid b/source/globals/general/utils.gd.uid
new file mode 100644
index 0000000..516d060
--- /dev/null
+++ b/source/globals/general/utils.gd.uid
@@ -0,0 +1 @@
+uid://7mx55g2sawk2
diff --git a/source/icon.svg b/source/icon.svg
new file mode 100644
index 0000000..9d8b7fa
--- /dev/null
+++ b/source/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/icon.svg.import b/source/icon.svg.import
new file mode 100644
index 0000000..5d80b17
--- /dev/null
+++ b/source/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dhw8y2oqxvgwu"
+path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.svg"
+dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/source/main.tscn b/source/main.tscn
new file mode 100644
index 0000000..8b94191
--- /dev/null
+++ b/source/main.tscn
@@ -0,0 +1,3 @@
+[gd_scene format=3 uid="uid://cvj5b6ygk8u02"]
+
+[node name="Main" type="Node"]
diff --git a/source/maps/_dynamic_load_test/_dynamic_load_test_map.tscn b/source/maps/_dynamic_load_test/_dynamic_load_test_map.tscn
new file mode 100644
index 0000000..59636be
--- /dev/null
+++ b/source/maps/_dynamic_load_test/_dynamic_load_test_map.tscn
@@ -0,0 +1,166 @@
+[gd_scene load_steps=19 format=3 uid="uid://d3ag4d4r8qcw7"]
+
+[ext_resource type="Script" uid="uid://bj2bhtdul8xct" path="res://components/collision/areas/dynamic_area_loader.gd" id="1_q4yy4"]
+[ext_resource type="PackedScene" uid="uid://clhy3kiceqf2o" path="res://components/characters/player/player_character.tscn" id="2_g60qb"]
+[ext_resource type="Script" uid="uid://3hlvt5k34xva" path="res://components/general/player_spawn_point.gd" id="3_yaqeo"]
+[ext_resource type="PackedScene" uid="uid://c0jearfhlqcvr" path="res://components/hazards/saw/saw.tscn" id="4_4rgsp"]
+
+[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_g60qb"]
+sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
+ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
+
+[sub_resource type="Sky" id="Sky_yaqeo"]
+sky_material = SubResource("ProceduralSkyMaterial_g60qb")
+
+[sub_resource type="Environment" id="Environment_4rgsp"]
+background_mode = 2
+sky = SubResource("Sky_yaqeo")
+tonemap_mode = 2
+glow_enabled = true
+
+[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_g60qb"]
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_g60qb"]
+size = Vector3(9, 4, 9)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_yaqeo"]
+size = Vector3(9, 4, 9)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_4rgsp"]
+size = Vector3(12, 4, 7)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_m4fap"]
+size = Vector3(4, 4, 11)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_k1ge7"]
+size = Vector3(25, 4, 21.3)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_ka7nb"]
+size = Vector3(25, 4, 6)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_kaxur"]
+size = Vector3(22, 4, 7)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_0qpgw"]
+size = Vector3(9, 4, 25)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_g60qb"]
+albedo_color = Color(1, 0.426083, 0.0827108, 1)
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_g60qb"]
+
+[node name="DynamicLoadTestMap" type="Node"]
+
+[node name="PlayerCharacter" parent="." instance=ExtResource("2_g60qb")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10)
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(-0.866025, -0.433013, 0.25, 0, 0.5, 0.866025, -0.5, 0.75, -0.433013, 0, 0, 0)
+shadow_enabled = true
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_4rgsp")
+
+[node name="WorldFloor" type="StaticBody3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+metadata/_edit_lock_ = true
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="WorldFloor"]
+shape = SubResource("WorldBoundaryShape3D_g60qb")
+
+[node name="DynamicAreaLoader3D" type="Area3D" parent="." node_paths=PackedStringArray("placeholder_node")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 0)
+script = ExtResource("1_q4yy4")
+placeholder_node = NodePath("Area1")
+metadata/_custom_type_script = "uid://bj2bhtdul8xct"
+
+[node name="Area1" parent="DynamicAreaLoader3D" instance_placeholder="res://maps/_dynamic_load_test/area_1.tscn"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -2, 2)
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="DynamicAreaLoader3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 2)
+shape = SubResource("BoxShape3D_g60qb")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="DynamicAreaLoader3D2" type="Area3D" parent="." node_paths=PackedStringArray("placeholder_node")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, -7)
+script = ExtResource("1_q4yy4")
+placeholder_node = NodePath("Area2")
+metadata/_custom_type_script = "uid://bj2bhtdul8xct"
+
+[node name="Area2" parent="DynamicAreaLoader3D2" instance_placeholder="res://maps/_dynamic_load_test/area_2.tscn"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -2, 2)
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="DynamicAreaLoader3D2"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 2)
+shape = SubResource("BoxShape3D_yaqeo")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="CollisionShape3D2" type="CollisionShape3D" parent="DynamicAreaLoader3D2"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 0.5, 3.67773)
+shape = SubResource("BoxShape3D_4rgsp")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="CollisionShape3D3" type="CollisionShape3D" parent="DynamicAreaLoader3D2"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.5, 0.5, 5.67773)
+shape = SubResource("BoxShape3D_m4fap")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="Hallway1Loader" type="Area3D" parent="." node_paths=PackedStringArray("placeholder_node")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, -7)
+script = ExtResource("1_q4yy4")
+placeholder_node = NodePath("Hallway1")
+metadata/_custom_type_script = "uid://bj2bhtdul8xct"
+
+[node name="Hallway1" parent="Hallway1Loader" instance_placeholder="res://maps/_dynamic_load_test/hallway_1.tscn"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -2, 16)
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Hallway1Loader"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 17.85)
+shape = SubResource("BoxShape3D_k1ge7")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="Hallway2Loader" type="Area3D" parent="." node_paths=PackedStringArray("placeholder_node")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, -7)
+script = ExtResource("1_q4yy4")
+placeholder_node = NodePath("Hallway2")
+metadata/_custom_type_script = "uid://bj2bhtdul8xct"
+
+[node name="Hallway2" parent="Hallway2Loader" instance_placeholder="res://maps/_dynamic_load_test/hallway_2.tscn"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -2, 16)
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Hallway2Loader"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 25.5)
+shape = SubResource("BoxShape3D_ka7nb")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="CollisionShape3D2" type="CollisionShape3D" parent="Hallway2Loader"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 0.5, 3.67773)
+shape = SubResource("BoxShape3D_kaxur")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="CollisionShape3D3" type="CollisionShape3D" parent="Hallway2Loader"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14, 0.5, 12.6777)
+shape = SubResource("BoxShape3D_0qpgw")
+debug_color = Color(0.678973, 0.504376, 0, 0.42)
+
+[node name="AlwaysLoaded" type="CSGCombiner3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 9)
+use_collision = true
+
+[node name="CSGBox3D" type="CSGBox3D" parent="AlwaysLoaded"]
+size = Vector3(8, 1, 7)
+material = SubResource("StandardMaterial3D_g60qb")
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+transform = Transform3D(5.58473, 6.33307, 0, -6.33307, 5.58473, 0, 0, 0, 8.44375, -13.6652, 0, -15.4998)
+mesh = SubResource("CylinderMesh_g60qb")
+
+[node name="PlayerSpawnPoint" type="Marker3D" parent="."]
+transform = Transform3D(0.330597, 0, 0.943772, 0, 1, 0, -0.943772, 0, 0.330597, 2.60837, 0.5, 3.3168)
+script = ExtResource("3_yaqeo")
+metadata/_custom_type_script = "uid://3hlvt5k34xva"
+
+[node name="Saw" parent="." instance=ExtResource("4_4rgsp")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.31477, 1.59362, 6.44809)
diff --git a/source/maps/_dynamic_load_test/area_1.tscn b/source/maps/_dynamic_load_test/area_1.tscn
new file mode 100644
index 0000000..39dcfe6
--- /dev/null
+++ b/source/maps/_dynamic_load_test/area_1.tscn
@@ -0,0 +1,6426 @@
+[gd_scene load_steps=6 format=3 uid="uid://cae1iasqr2mf1"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2egex"]
+albedo_color = Color(0.589291, 0.560155, 1, 1)
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_2egex"]
+resource_local_to_scene = true
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_limus"]
+resource_local_to_scene = true
+width = 2048
+height = 2048
+noise = SubResource("FastNoiseLite_2egex")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_limus"]
+resource_local_to_scene = true
+albedo_texture = SubResource("NoiseTexture2D_limus")
+
+[sub_resource type="QuadMesh" id="QuadMesh_8n3f7"]
+
+[node name="Area1" type="CSGCombiner3D"]
+use_collision = true
+
+[node name="CSGBox3D" type="CSGBox3D" parent="."]
+size = Vector3(8, 1, 7)
+material = SubResource("StandardMaterial3D_2egex")
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D4" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D5" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D6" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D7" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D8" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D9" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D10" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D11" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D12" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D13" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D14" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D15" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D16" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D17" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D18" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D19" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D20" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D21" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D22" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D23" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D24" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D25" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D26" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D27" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D28" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D29" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D30" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D31" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D32" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D33" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D34" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D35" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D36" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D37" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D38" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D39" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D40" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D41" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D42" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D43" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D44" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D45" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D46" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D47" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D48" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D49" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D50" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D51" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D52" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D53" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D54" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D55" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D56" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D57" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D58" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D59" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D60" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D61" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D62" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D63" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D64" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D65" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D66" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D67" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D68" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D69" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D70" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D71" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D72" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D73" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D74" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D75" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D76" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D77" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D78" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D79" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D80" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D81" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D82" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D83" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D84" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D85" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D86" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D87" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D88" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D89" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D90" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D91" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D92" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D93" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D94" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D95" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D96" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D97" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D98" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D99" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D100" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D101" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D102" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D103" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D104" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D105" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D106" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D107" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D108" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D109" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D110" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D111" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D112" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D113" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D114" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D115" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D116" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D117" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D118" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D119" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D120" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D121" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D122" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D123" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D124" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D125" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D126" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D127" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D128" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D129" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D130" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D131" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D132" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D133" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D134" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D135" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D136" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D137" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D138" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D139" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D140" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D141" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D142" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D143" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D144" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D145" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D146" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D147" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D148" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D149" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D150" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D151" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D152" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D153" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D154" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D155" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D156" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D157" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D158" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D159" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D160" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D161" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D162" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D163" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D164" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D165" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D166" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D167" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D168" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D169" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D170" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D171" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D172" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D173" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D174" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D175" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D176" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D177" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D178" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D179" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D180" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D181" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D182" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D183" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D184" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D185" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D186" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D187" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D188" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D189" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D190" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D191" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D192" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D193" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D194" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D195" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D196" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D197" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D198" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D199" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D200" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D201" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D202" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D203" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D204" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D205" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D206" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D207" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D208" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D209" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D210" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D211" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D212" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D213" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D214" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D215" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D216" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D217" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D218" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D219" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D220" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D221" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D222" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D223" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D224" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D225" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D226" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D227" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D228" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D229" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D230" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D231" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D232" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D233" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D234" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D235" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D236" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D237" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D238" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D239" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D240" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D241" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D242" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D243" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D244" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D245" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D246" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D247" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D248" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D249" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D250" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D251" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D252" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D253" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D254" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D255" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D256" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D257" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D258" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D259" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D260" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D261" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D262" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D263" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D264" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D265" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D266" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D267" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D268" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D269" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D270" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D271" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D272" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D273" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D274" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D275" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D276" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D277" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D278" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D279" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D280" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D281" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D282" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D283" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D284" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D285" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D286" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D287" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D288" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D289" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D290" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D291" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D292" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D293" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D294" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D295" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D296" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D297" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D298" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D299" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D300" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D301" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D302" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D303" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D304" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D305" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D306" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D307" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D308" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D309" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D310" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D311" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D312" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D313" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D314" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D315" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D316" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D317" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D318" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D319" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D320" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D321" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D322" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D323" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D324" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D325" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D326" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D327" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D328" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D329" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D330" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D331" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D332" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D333" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D334" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D335" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D336" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D337" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D338" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D339" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D340" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D341" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D342" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D343" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D344" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D345" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D346" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D347" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D348" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D349" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D350" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D351" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D352" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D353" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D354" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D355" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D356" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D357" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D358" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D359" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D360" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D361" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D362" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D363" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D364" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D365" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D366" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D367" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D368" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D369" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D370" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D371" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D372" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D373" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D374" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D375" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D376" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D377" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D378" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D379" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D380" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D381" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D382" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D383" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D384" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D385" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D386" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D387" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D388" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D389" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D390" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D391" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D392" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D393" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D394" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D395" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D396" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D397" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D398" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D399" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D400" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D401" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D402" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D403" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D404" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D405" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D406" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D407" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D408" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D409" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D410" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D411" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D412" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D413" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D414" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D415" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D416" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D417" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D418" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D419" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D420" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D421" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D422" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D423" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D424" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D425" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D426" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D427" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D428" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D429" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D430" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D431" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D432" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D433" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D434" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D435" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D436" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D437" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D438" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D439" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D440" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D441" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D442" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D443" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D444" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D445" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D446" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D447" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D448" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D449" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D450" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D451" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D452" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D453" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D454" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D455" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D456" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D457" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D458" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D459" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D460" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D461" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D462" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D463" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D464" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D465" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D466" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D467" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D468" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D469" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D470" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D471" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D472" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D473" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D474" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D475" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D476" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D477" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D478" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D479" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D480" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D481" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D482" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D483" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D484" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D485" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D486" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D487" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D488" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D489" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D490" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D491" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D492" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D493" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D494" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D495" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D496" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D497" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D498" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D499" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D500" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D501" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D502" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D503" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D504" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D505" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D506" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D507" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D508" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D509" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D510" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D511" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D512" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D513" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D514" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D515" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D516" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D517" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D518" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D519" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D520" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D521" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D522" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D523" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D524" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D525" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D526" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D527" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D528" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D529" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D530" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D531" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D532" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D533" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D534" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D535" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D536" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D537" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D538" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D539" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D540" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D541" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D542" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D543" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D544" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D545" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D546" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D547" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D548" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D549" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D550" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D551" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D552" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D553" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D554" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D555" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D556" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D557" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D558" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D559" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D560" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D561" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D562" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D563" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D564" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D565" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D566" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D567" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D568" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D569" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D570" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D571" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D572" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D573" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D574" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D575" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D576" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D577" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D578" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D579" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D580" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D581" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D582" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D583" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D584" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D585" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D586" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D587" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D588" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D589" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D590" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D591" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D592" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D593" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D594" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D595" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D596" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D597" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D598" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D599" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D600" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D601" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D602" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D603" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D604" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D605" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D606" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D607" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D608" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D609" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D610" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D611" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D612" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D613" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D614" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D615" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D616" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D617" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D618" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D619" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D620" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D621" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D622" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D623" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D624" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D625" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D626" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D627" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D628" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D629" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D630" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D631" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D632" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D633" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D634" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D635" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D636" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D637" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D638" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D639" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D640" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D641" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D642" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D643" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D644" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D645" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D646" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D647" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D648" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D649" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D650" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D651" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D652" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D653" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D654" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D655" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D656" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D657" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D658" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D659" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D660" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D661" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D662" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D663" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D664" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D665" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D666" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D667" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D668" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D669" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D670" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D671" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D672" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D673" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D674" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D675" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D676" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D677" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D678" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D679" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D680" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D681" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D682" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D683" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D684" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D685" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D686" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D687" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D688" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D689" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D690" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D691" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D692" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D693" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D694" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D695" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D696" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D697" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D698" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D699" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D700" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D701" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D702" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D703" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D704" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D705" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D706" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D707" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D708" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D709" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D710" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D711" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D712" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D713" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D714" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D715" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D716" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D717" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D718" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D719" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D720" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D721" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D722" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D723" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D724" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D725" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D726" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D727" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D728" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D729" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D730" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D731" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D732" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D733" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D734" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D735" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D736" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D737" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D738" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D739" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D740" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D741" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D742" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D743" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D744" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D745" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D746" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D747" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D748" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D749" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D750" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D751" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D752" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D753" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D754" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D755" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D756" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D757" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D758" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D759" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D760" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D761" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D762" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D763" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D764" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D765" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D766" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D767" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D768" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D769" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D770" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D771" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D772" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D773" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D774" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D775" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D776" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D777" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D778" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D779" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D780" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D781" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D782" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D783" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D784" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D785" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D786" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D787" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D788" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D789" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D790" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D791" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D792" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D793" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D794" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D795" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D796" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D797" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D798" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D799" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D800" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D801" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D802" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D803" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D804" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D805" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D806" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D807" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D808" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D809" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D810" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D811" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D812" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D813" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D814" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D815" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D816" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D817" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D818" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D819" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D820" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D821" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D822" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D823" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D824" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D825" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D826" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D827" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D828" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D829" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D830" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D831" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D832" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D833" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D834" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D835" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D836" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D837" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D838" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D839" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D840" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D841" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D842" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D843" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D844" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D845" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D846" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D847" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D848" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D849" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D850" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D851" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D852" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D853" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D854" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D855" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D856" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D857" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D858" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D859" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D860" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D861" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D862" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D863" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D864" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D865" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D866" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D867" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D868" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D869" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D870" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D871" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D872" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D873" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D874" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D875" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D876" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D877" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D878" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D879" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D880" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D881" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D882" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D883" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D884" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D885" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D886" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D887" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D888" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D889" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D890" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D891" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D892" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D893" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D894" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D895" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D896" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D897" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D898" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D899" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D900" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D901" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D902" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D903" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D904" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D905" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D906" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D907" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D908" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D909" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D910" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D911" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D912" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D913" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D914" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D915" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D916" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D917" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D918" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D919" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D920" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D921" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D922" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D923" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D924" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D925" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D926" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D927" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D928" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D929" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D930" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D931" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D932" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D933" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D934" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D935" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D936" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D937" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D938" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D939" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D940" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D941" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D942" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D943" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D944" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D945" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D946" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D947" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D948" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D949" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D950" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D951" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D952" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D953" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D954" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D955" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D956" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D957" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D958" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D959" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D960" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D961" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D962" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D963" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D964" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D965" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D966" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D967" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D968" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D969" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D970" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D971" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D972" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D973" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D974" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D975" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D976" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D977" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D978" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D979" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D980" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D981" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D982" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D983" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D984" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D985" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D986" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D987" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D988" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D989" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D990" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D991" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D992" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D993" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D994" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D995" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D996" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D997" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D998" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D999" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1000" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1001" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1002" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1003" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1004" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1005" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1006" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1007" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1008" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1009" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1010" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1011" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1012" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1013" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1014" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1015" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1016" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1017" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1018" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1019" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1020" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1021" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1022" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1023" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1024" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1025" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1026" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1027" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1028" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1029" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1030" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1031" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1032" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1033" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1034" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1035" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1036" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1037" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1038" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1039" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1040" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1041" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1042" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1043" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1044" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1045" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1046" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1047" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1048" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1049" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1050" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1051" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1052" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1053" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1054" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1055" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1056" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1057" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1058" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1059" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1060" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1061" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1062" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1063" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1064" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1065" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1066" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1067" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1068" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1069" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1070" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1071" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1072" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1073" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1074" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1075" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1076" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1077" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1078" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1079" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1080" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1081" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1082" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1083" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1084" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1085" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1086" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1087" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1088" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1089" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1090" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1091" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1092" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1093" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1094" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1095" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1096" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1097" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1098" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1099" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1100" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1101" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1102" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1103" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1104" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1105" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1106" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1107" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1108" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1109" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1110" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1111" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1112" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1113" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1114" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1115" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1116" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1117" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1118" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1119" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1120" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1121" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1122" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1123" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1124" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1125" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1126" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1127" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1128" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1129" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1130" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1131" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1132" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1133" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1134" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1135" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1136" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1137" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1138" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1139" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1140" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1141" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1142" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1143" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1144" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1145" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1146" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1147" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1148" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1149" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1150" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1151" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1152" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1153" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1154" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1155" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1156" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1157" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1158" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1159" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1160" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1161" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1162" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1163" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1164" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1165" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1166" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1167" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1168" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1169" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1170" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1171" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1172" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1173" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1174" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1175" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1176" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1177" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1178" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1179" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1180" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1181" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1182" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1183" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1184" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1185" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1186" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1187" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1188" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1189" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1190" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1191" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1192" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1193" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1194" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1195" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1196" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1197" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1198" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1199" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1200" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1201" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1202" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1203" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1204" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1205" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1206" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1207" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1208" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1209" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1210" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1211" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1212" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1213" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1214" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1215" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1216" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1217" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1218" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1219" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1220" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1221" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1222" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1223" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1224" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1225" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1226" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1227" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1228" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1229" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1230" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1231" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1232" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1233" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1234" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1235" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1236" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1237" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1238" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1239" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1240" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1241" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1242" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1243" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1244" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1245" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1246" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1247" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1248" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1249" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1250" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1251" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1252" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1253" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1254" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1255" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1256" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1257" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1258" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1259" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1260" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1261" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1262" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1263" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1264" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1265" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1266" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1267" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1268" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1269" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1270" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1271" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1272" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1273" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1274" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1275" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1276" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1277" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1278" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1279" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
+
+[node name="MeshInstance3D1280" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_limus")
+mesh = SubResource("QuadMesh_8n3f7")
diff --git a/source/maps/_dynamic_load_test/area_2.tscn b/source/maps/_dynamic_load_test/area_2.tscn
new file mode 100644
index 0000000..063aa83
--- /dev/null
+++ b/source/maps/_dynamic_load_test/area_2.tscn
@@ -0,0 +1,6426 @@
+[gd_scene load_steps=6 format=3 uid="uid://f5ti7f6p5x03"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wp0cu"]
+albedo_color = Color(0, 0.586893, 0.0976942, 1)
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_wp0cu"]
+resource_local_to_scene = true
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_wp0cu"]
+resource_local_to_scene = true
+width = 2048
+height = 2048
+noise = SubResource("FastNoiseLite_wp0cu")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mg84x"]
+resource_local_to_scene = true
+albedo_texture = SubResource("NoiseTexture2D_wp0cu")
+
+[sub_resource type="QuadMesh" id="QuadMesh_0d8tl"]
+
+[node name="Area2" type="CSGCombiner3D"]
+use_collision = true
+
+[node name="CSGBox3D" type="CSGBox3D" parent="."]
+size = Vector3(8, 1, 7)
+material = SubResource("StandardMaterial3D_wp0cu")
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D4" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D5" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D6" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D7" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D8" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D9" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D10" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D11" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D12" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D13" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D14" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D15" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D16" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D17" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D18" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D19" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D20" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D21" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D22" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D23" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D24" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D25" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D26" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D27" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D28" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D29" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D30" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D31" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D32" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D33" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D34" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D35" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D36" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D37" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D38" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D39" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D40" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D41" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D42" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D43" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D44" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D45" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D46" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D47" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D48" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D49" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D50" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D51" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D52" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D53" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D54" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D55" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D56" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D57" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D58" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D59" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D60" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D61" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D62" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D63" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D64" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D65" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D66" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D67" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D68" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D69" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D70" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D71" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D72" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D73" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D74" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D75" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D76" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D77" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D78" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D79" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D80" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D81" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D82" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D83" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D84" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D85" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D86" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D87" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D88" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D89" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D90" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D91" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D92" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D93" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D94" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D95" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D96" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D97" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D98" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D99" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D100" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D101" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D102" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D103" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D104" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D105" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D106" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D107" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D108" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D109" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D110" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D111" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D112" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D113" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D114" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D115" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D116" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D117" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D118" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D119" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D120" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D121" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D122" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D123" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D124" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D125" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D126" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D127" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D128" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D129" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D130" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D131" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D132" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D133" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D134" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D135" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D136" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D137" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D138" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D139" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D140" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D141" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D142" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D143" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D144" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D145" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D146" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D147" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D148" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D149" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D150" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D151" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D152" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D153" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D154" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D155" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D156" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D157" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D158" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D159" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D160" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D161" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D162" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D163" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D164" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D165" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D166" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D167" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D168" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D169" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D170" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D171" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D172" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D173" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D174" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D175" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D176" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D177" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D178" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D179" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D180" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D181" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D182" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D183" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D184" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D185" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D186" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D187" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D188" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D189" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D190" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D191" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D192" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D193" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D194" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D195" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D196" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D197" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D198" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D199" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D200" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D201" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D202" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D203" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D204" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D205" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D206" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D207" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D208" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D209" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D210" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D211" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D212" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D213" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D214" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D215" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D216" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D217" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D218" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D219" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D220" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D221" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D222" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D223" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D224" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D225" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D226" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D227" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D228" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D229" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D230" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D231" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D232" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D233" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D234" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D235" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D236" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D237" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D238" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D239" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D240" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D241" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D242" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D243" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D244" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D245" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D246" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D247" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D248" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D249" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D250" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D251" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D252" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D253" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D254" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D255" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D256" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D257" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D258" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D259" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D260" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D261" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D262" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D263" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D264" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D265" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D266" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D267" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D268" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D269" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D270" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D271" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D272" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D273" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D274" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D275" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D276" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D277" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D278" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D279" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D280" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D281" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D282" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D283" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D284" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D285" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D286" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D287" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D288" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D289" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D290" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D291" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D292" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D293" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D294" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D295" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D296" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D297" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D298" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D299" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D300" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D301" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D302" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D303" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D304" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D305" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D306" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D307" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D308" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D309" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D310" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D311" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D312" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D313" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D314" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D315" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D316" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D317" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D318" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D319" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D320" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D321" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D322" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D323" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D324" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D325" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D326" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D327" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D328" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D329" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D330" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D331" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D332" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D333" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D334" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D335" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D336" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D337" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D338" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D339" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D340" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D341" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D342" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D343" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D344" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D345" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D346" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D347" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D348" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D349" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D350" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D351" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D352" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D353" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D354" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D355" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D356" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D357" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D358" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D359" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D360" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D361" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D362" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D363" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D364" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D365" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D366" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D367" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D368" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D369" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D370" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D371" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D372" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D373" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D374" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D375" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D376" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D377" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D378" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D379" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D380" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D381" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D382" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D383" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D384" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D385" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D386" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D387" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D388" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D389" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D390" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D391" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D392" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D393" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D394" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D395" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D396" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D397" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D398" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D399" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D400" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D401" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D402" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D403" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D404" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D405" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D406" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D407" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D408" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D409" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D410" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D411" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D412" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D413" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D414" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D415" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D416" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D417" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D418" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D419" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D420" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D421" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D422" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D423" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D424" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D425" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D426" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D427" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D428" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D429" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D430" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D431" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D432" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D433" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D434" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D435" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D436" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D437" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D438" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D439" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D440" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D441" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D442" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D443" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D444" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D445" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D446" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D447" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D448" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D449" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D450" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D451" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D452" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D453" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D454" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D455" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D456" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D457" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D458" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D459" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D460" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D461" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D462" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D463" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D464" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D465" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D466" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D467" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D468" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D469" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D470" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D471" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D472" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D473" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D474" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D475" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D476" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D477" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D478" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D479" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D480" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D481" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D482" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D483" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D484" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D485" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D486" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D487" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D488" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D489" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D490" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D491" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D492" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D493" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D494" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D495" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D496" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D497" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D498" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D499" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D500" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D501" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D502" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D503" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D504" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D505" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D506" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D507" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D508" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D509" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D510" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D511" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D512" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D513" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D514" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D515" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D516" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D517" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D518" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D519" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D520" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D521" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D522" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D523" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D524" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D525" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D526" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D527" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D528" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D529" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D530" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D531" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D532" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D533" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D534" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D535" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D536" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D537" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D538" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D539" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D540" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D541" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D542" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D543" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D544" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D545" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D546" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D547" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D548" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D549" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D550" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D551" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D552" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D553" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D554" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D555" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D556" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D557" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D558" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D559" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D560" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D561" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D562" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D563" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D564" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D565" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D566" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D567" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D568" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D569" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D570" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D571" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D572" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D573" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D574" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D575" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D576" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D577" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D578" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D579" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D580" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D581" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D582" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D583" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D584" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D585" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D586" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D587" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D588" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D589" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D590" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D591" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D592" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D593" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D594" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D595" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D596" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D597" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D598" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D599" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D600" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D601" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D602" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D603" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D604" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D605" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D606" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D607" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D608" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D609" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D610" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D611" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D612" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D613" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D614" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D615" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D616" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D617" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D618" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D619" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D620" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D621" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D622" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D623" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D624" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D625" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D626" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D627" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D628" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D629" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D630" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D631" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D632" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D633" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D634" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D635" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D636" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D637" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D638" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D639" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D640" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D641" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D642" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D643" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D644" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D645" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D646" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D647" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D648" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D649" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D650" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D651" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D652" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D653" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D654" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D655" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D656" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D657" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D658" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D659" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D660" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D661" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D662" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D663" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D664" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D665" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D666" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D667" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D668" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D669" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D670" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D671" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D672" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D673" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D674" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D675" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D676" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D677" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D678" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D679" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D680" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D681" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D682" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D683" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D684" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D685" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D686" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D687" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D688" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D689" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D690" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D691" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D692" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D693" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D694" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D695" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D696" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D697" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D698" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D699" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D700" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D701" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D702" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D703" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D704" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D705" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D706" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D707" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D708" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D709" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D710" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D711" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D712" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D713" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D714" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D715" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D716" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D717" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D718" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D719" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D720" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D721" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D722" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D723" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D724" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D725" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D726" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D727" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D728" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D729" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D730" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D731" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D732" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D733" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D734" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D735" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D736" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D737" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D738" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D739" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D740" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D741" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D742" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D743" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D744" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D745" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D746" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D747" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D748" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D749" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D750" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D751" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D752" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D753" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D754" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D755" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D756" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D757" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D758" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D759" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D760" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D761" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D762" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D763" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D764" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D765" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D766" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D767" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D768" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D769" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D770" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D771" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D772" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D773" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D774" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D775" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D776" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D777" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D778" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D779" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D780" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D781" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D782" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D783" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D784" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D785" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D786" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D787" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D788" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D789" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D790" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D791" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D792" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D793" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D794" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D795" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D796" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D797" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D798" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D799" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D800" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D801" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D802" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D803" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D804" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D805" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D806" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D807" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D808" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D809" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D810" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D811" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D812" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D813" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D814" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D815" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D816" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D817" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D818" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D819" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D820" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D821" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D822" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D823" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D824" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D825" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D826" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D827" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D828" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D829" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D830" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D831" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D832" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D833" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D834" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D835" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D836" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D837" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D838" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D839" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D840" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D841" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D842" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D843" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D844" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D845" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D846" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D847" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D848" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D849" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D850" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D851" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D852" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D853" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D854" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D855" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D856" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D857" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D858" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D859" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D860" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D861" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D862" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D863" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D864" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D865" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D866" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D867" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D868" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D869" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D870" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D871" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D872" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D873" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D874" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D875" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D876" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D877" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D878" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D879" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D880" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D881" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D882" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D883" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D884" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D885" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D886" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D887" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D888" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D889" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D890" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D891" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D892" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D893" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D894" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D895" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D896" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D897" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D898" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D899" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D900" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D901" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D902" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D903" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D904" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D905" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D906" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D907" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D908" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D909" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D910" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D911" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D912" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D913" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D914" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D915" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D916" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D917" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D918" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D919" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D920" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D921" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D922" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D923" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D924" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D925" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D926" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D927" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D928" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D929" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D930" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D931" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D932" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D933" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D934" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D935" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D936" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D937" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D938" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D939" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D940" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D941" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D942" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D943" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D944" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D945" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D946" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D947" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D948" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D949" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D950" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D951" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D952" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D953" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D954" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D955" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D956" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D957" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D958" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D959" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D960" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D961" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D962" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D963" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D964" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D965" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D966" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D967" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D968" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D969" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D970" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D971" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D972" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D973" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D974" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D975" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D976" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D977" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D978" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D979" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D980" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D981" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D982" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D983" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D984" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D985" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D986" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D987" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D988" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D989" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D990" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D991" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D992" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D993" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D994" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D995" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D996" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D997" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D998" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D999" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1000" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1001" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1002" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1003" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1004" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1005" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1006" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1007" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1008" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1009" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1010" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1011" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1012" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1013" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1014" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1015" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1016" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1017" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1018" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1019" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1020" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1021" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1022" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1023" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1024" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1025" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1026" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1027" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1028" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1029" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1030" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1031" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1032" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1033" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1034" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1035" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1036" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1037" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1038" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1039" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1040" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1041" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1042" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1043" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1044" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1045" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1046" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1047" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1048" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1049" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1050" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1051" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1052" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1053" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1054" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1055" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1056" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1057" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1058" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1059" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1060" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1061" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1062" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1063" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1064" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1065" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1066" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1067" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1068" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1069" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1070" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1071" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1072" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1073" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1074" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1075" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1076" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1077" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1078" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1079" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1080" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1081" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1082" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1083" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1084" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1085" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1086" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1087" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1088" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1089" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1090" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1091" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1092" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1093" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1094" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1095" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1096" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1097" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1098" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1099" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1100" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1101" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1102" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1103" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1104" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1105" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1106" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1107" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1108" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1109" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1110" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1111" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1112" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1113" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1114" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1115" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1116" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1117" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1118" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1119" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1120" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1121" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1122" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1123" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1124" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1125" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1126" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1127" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1128" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1129" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1130" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1131" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1132" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1133" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1134" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1135" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1136" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1137" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1138" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1139" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1140" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1141" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1142" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1143" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1144" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1145" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1146" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1147" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1148" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1149" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1150" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1151" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1152" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1153" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1154" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1155" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1156" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1157" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1158" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1159" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1160" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1161" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1162" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1163" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1164" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1165" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1166" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1167" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1168" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1169" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1170" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1171" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1172" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1173" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1174" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1175" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1176" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1177" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1178" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1179" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1180" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1181" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1182" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1183" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1184" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1185" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1186" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1187" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1188" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1189" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1190" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1191" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1192" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1193" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1194" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1195" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1196" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1197" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1198" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1199" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1200" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1201" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1202" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1203" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1204" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1205" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1206" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1207" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1208" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1209" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1210" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1211" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1212" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1213" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1214" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1215" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1216" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1217" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1218" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1219" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1220" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1221" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1222" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1223" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1224" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1225" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1226" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1227" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1228" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1229" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1230" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1231" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1232" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1233" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1234" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1235" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1236" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1237" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1238" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1239" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1240" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1241" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1242" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1243" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1244" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1245" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1246" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1247" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1248" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1249" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1250" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1251" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1252" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1253" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1254" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1255" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1256" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1257" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1258" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1259" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1260" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1261" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1262" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1263" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1264" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1265" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1266" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1267" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1268" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1269" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1270" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1271" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1272" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1273" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1274" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1275" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1276" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1277" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1278" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1279" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
+
+[node name="MeshInstance3D1280" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.810536, 0)
+material_override = SubResource("StandardMaterial3D_mg84x")
+mesh = SubResource("QuadMesh_0d8tl")
diff --git a/source/maps/_dynamic_load_test/hallway_1.tscn b/source/maps/_dynamic_load_test/hallway_1.tscn
new file mode 100644
index 0000000..c83b89c
--- /dev/null
+++ b/source/maps/_dynamic_load_test/hallway_1.tscn
@@ -0,0 +1,56 @@
+[gd_scene format=3 uid="uid://dr0gtcel5qdqg"]
+
+[node name="Hallway1" type="CSGCombiner3D"]
+use_collision = true
+
+[node name="Floor" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 1)
+size = Vector3(8, 1, 3)
+
+[node name="Floor2" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0, 7.5)
+size = Vector3(3, 1, 10)
+
+[node name="Floor3" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 0, 10.5)
+size = Vector3(21, 1, 4)
+
+[node name="Ceiling" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 5, 1)
+size = Vector3(8, 1, 3)
+
+[node name="Ceiling2" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 5, 7.5)
+size = Vector3(3, 1, 10)
+
+[node name="Ceiling3" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 5, 10.5)
+size = Vector3(21, 1, 4)
+
+[node name="Wall" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 2.5, 13)
+size = Vector3(24, 6, 1)
+
+[node name="Wall2" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, -1)
+size = Vector3(8, 6, 1)
+
+[node name="Wall3" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.5, 2.5, 8)
+size = Vector3(17, 6, 1)
+
+[node name="Wall4" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 2.5, 3)
+size = Vector3(5, 6, 1)
+
+[node name="Wall5" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 2.5, 6)
+size = Vector3(1, 6, 15)
+
+[node name="Wall6" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 2.5, 5.5)
+size = Vector3(1, 6, 4)
+
+[node name="Wall7" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.5, 2.5, 11)
+size = Vector3(1, 6, 5)
diff --git a/source/maps/_dynamic_load_test/hallway_2.tscn b/source/maps/_dynamic_load_test/hallway_2.tscn
new file mode 100644
index 0000000..8dfb45d
--- /dev/null
+++ b/source/maps/_dynamic_load_test/hallway_2.tscn
@@ -0,0 +1,68 @@
+[gd_scene format=3 uid="uid://loo81pvlxlhh"]
+
+[node name="Hallway2" type="CSGCombiner3D"]
+use_collision = true
+
+[node name="Floor" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 1.5)
+size = Vector3(3, 1, 14)
+
+[node name="Floor2" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.5, 0, -7)
+size = Vector3(7, 1, 3)
+
+[node name="Floor3" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.5, 0, -12)
+size = Vector3(3, 1, 7)
+
+[node name="Floor4" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 0, -14)
+size = Vector3(9, 1, 3)
+
+[node name="Wall" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14, 2.5, -16)
+size = Vector3(12, 6, 1)
+
+[node name="Wall2" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 2.5, -12)
+size = Vector3(9, 6, 1)
+
+[node name="Wall3" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 2.5, -9)
+size = Vector3(5, 6, 1)
+
+[node name="Wall4" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.5, 2.5, -5)
+size = Vector3(5, 6, 1)
+
+[node name="Wall5" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.5, 2.5, -11)
+size = Vector3(1, 6, 11)
+
+[node name="Wall6" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.5, 2.5, -10.5)
+size = Vector3(1, 6, 2)
+
+[node name="Wall7" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 2.5, 0)
+size = Vector3(1, 6, 17)
+
+[node name="Wall8" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.5, 2.5, 2)
+size = Vector3(1, 6, 13)
+
+[node name="Ceiling" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 5, 1.5)
+size = Vector3(3, 1, 14)
+
+[node name="Ceiling2" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.5, 5, -7)
+size = Vector3(7, 1, 3)
+
+[node name="Ceiling3" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.5, 5, -12)
+size = Vector3(3, 1, 7)
+
+[node name="Ceiling4" type="CSGBox3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 5, -14)
+size = Vector3(9, 1, 3)
diff --git a/source/project.godot b/source/project.godot
new file mode 100644
index 0000000..8fa3f93
--- /dev/null
+++ b/source/project.godot
@@ -0,0 +1,131 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+; [section] ; section goes between []
+; param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="MagicNStuff"
+config/features=PackedStringArray("4.4", "Forward Plus")
+config/icon="res://icon.svg"
+
+[autoload]
+
+GameGlobals="*res://globals/autoloads/game_globals.gd"
+InputManager="*res://globals/autoloads/input_manager.gd"
+Logger="*res://addons/logger/logger.tscn"
+RunConfigManager="*res://addons/run-configs/run-config-manager.gd"
+VersionDisplay="*res://addons/version_display/version_display.tscn"
+Panku="*res://addons/panku_console/console.tscn"
+
+[editor_plugins]
+
+enabled=PackedStringArray("res://addons/bbcode_edit.editor/plugin.cfg", "res://addons/logger/plugin.cfg", "res://addons/panku_console/plugin.cfg", "res://addons/run-configs/plugin.cfg", "res://addons/version_display/plugin.cfg")
+
+[file_customization]
+
+folder_colors={
+"res://addons/": "gray",
+"res://components/": "green",
+"res://globals/": "orange",
+"res://maps/": "yellow"
+}
+
+[input]
+
+move_forward={
+"deadzone": 0.2,
+"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)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
+]
+}
+move_backward={
+"deadzone": 0.2,
+"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)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
+]
+}
+move_left={
+"deadzone": 0.2,
+"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)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
+]
+}
+move_right={
+"deadzone": 0.2,
+"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)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
+]
+}
+run={
+"deadzone": 0.2,
+"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":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null)
+]
+}
+jump={
+"deadzone": 0.2,
+"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null)
+]
+}
+toggle_mouse={
+"deadzone": 0.2,
+"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":4194332,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+camera_up={
+"deadzone": 0.5,
+"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null)
+]
+}
+camera_down={
+"deadzone": 0.5,
+"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
+]
+}
+camera_left={
+"deadzone": 0.5,
+"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null)
+]
+}
+camera_right={
+"deadzone": 0.5,
+"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null)
+]
+}
+toggle_console={
+"deadzone": 0.2,
+"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":4194341,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+bbcode_edit/toggle_bold={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+bbcode_edit/toggle_italic={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+bbcode_edit/toggle_underline={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":85,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+bbcode_edit/toggle_strike={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+bbcode_edit/editor/open_current_file_documentation={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194332,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}