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]) + +![Addon's icon](/icon.svg) + +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: + +![Using the keyboard to toggle bold, italic, underline, striketrough](/addons/bbcode_edit.editor/.assets_for_readme/shortcuts.gif) + + +**Completion** for formatting tags, with some special completions implemented for specific tags: + +![Advanced completion for color tag](/addons/bbcode_edit.editor/.assets_for_readme/color_completion.gif) + + +**Documentation references** are completed: + +![Reference completion](/addons/bbcode_edit.editor/.assets_for_readme/reference_completion.gif) + + +Some useful **snippets** are included: + +![A "Note" snippet, with the same formatting as the one used in the official documentation](/addons/bbcode_edit.editor/.assets_for_readme/snippet.gif) + + +# 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 @@ +![icon](/images/icon_3d_128.png) + +# 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. + +Boosty + +USDT-TRC20 + +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/) + +[![screenshot_web](/images/screenshot_web.png)](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) +``` + +![screenshot_1](/images/screenshot_1.png) + +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) +``` + +![screenshot_5](/images/screenshot_5.png) + +> [!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`). + +![screenshot_4](/images/screenshot_4.png) + +## 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 +![screenshot_2](/images/screenshot_2.png) + +`DebugDrawDemoScene.tscn` in play mode +![screenshot_3](/images/screenshot_3.png) 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 @@ + + + +Created with Fabric.js 4.6.0 + + + + + + + + + + + + + + + + + + \ 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 @@ + + + +Created with Fabric.js 4.6.0 + + + + + + + + + + + + + + + \ 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 @@ + + + + + pause [#1010] + Created with Sketch. + + + + + + + + + + + + + \ 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 @@ + + + + + play [#1001] + Created with Sketch. + + + + + + + + + + + + + \ 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 @@ + + + + + + + + + + pop-out-line + + + + \ 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 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + \ 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) +] +}