commit d02447c7e6973dd91d02fa4ab179248e00a27cbb Author: anyreso Date: Sun Apr 7 14:25:59 2024 -0400 🎉 initial commit diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f0f08d8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,81 @@ +[[_TOC_]] + +# How to Contribute? + +Thank you for considering contributing to our project! + +Whether you're an experienced developer or just starting out, we welcome your contributions to help make our game even better. + +## Reporting Issues + +If you encounter any bugs or issues, please report them in the [Issue Tracker](https://gitlab.com/godotribes/godotribes/-/issues). Include as much detail as possible, such as steps to reproduce the issue and expected vs. actual behavior. + +## Merge Requests and Releases + +We highly recommend using [gitmoji](https://gitmoji.dev) for expressive and visually appealing commit messages, as it provides an easy way of identifying the purpose or intention of a commit simply by looking at the emojis used. + +Every **merge request** (MR) must be merged into the `develop` branch before any release is made on the `main` branch. + +The `develop` branch serves as the staging area for upcoming features and fixes. + +When the `develop` branch is deemed stable and ready for release, it is merged into the `main` branch to create a new release. + +This practice ensures that everyone remains updated on ongoing tasks, fostering transparency and encouraging collaboration within the team. + +# Development Guidelines + +## Code Style Guide + +For consistency across the source code, we *must* follow the [Godot Engine Style Guide](https://docs.godotengine.org/en/stable/tutorials/best_practices/project_organization.html#style-guide) at any time: + +>- Use **snake_case** for folder and file names (with the exception of C# +> scripts). This sidesteps case sensitivity issues that can crop up after +> exporting a project on Windows. C# scripts are an exception to this rule, +> as the convention is to name them after the class name which should be +> in PascalCase. +>- Use **PascalCase** for node names, as this matches built-in node casing. +>- In general, keep third-party resources in a top-level `addons/` folder, even +> if they aren't editor plugins. This makes it easier to track which files are +> third-party. There are some exceptions to this rule; for instance, if you use +> third-party game assets for a character, it makes more sense to include them +> within the same folder as the character scenes and scripts. + +## Branch Naming Convention + +When working on a new *feature*, prefix the branch name with `feat/`. For *bug fixes*, use the prefix `fix/`. + +This naming convention helps to categorize branches and makes it easier to identify their purpose at a glance. + +# Git Quick Reference + +1. Create a new branch for your changes: + +```shell +git checkout -b fix/my-branch +``` + +2. Make your changes, stage then and commit: + +```shell +git commit -am "📝 update CONTRIBUTIONS.md" +``` + +3. Push your changes to the repository: + +```shell +git push +``` + +4. Create a [Merge Request (MR)](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) with a clear description of your changes + +## Excluding local files without creating a _.gitignore_ file + +If you don't want to add new rules in a `.gitignore` file to be shared with everyone, you can create *exclusion rules* that are not committed with the repository. You can use this technique for locally-generated files that you don't expect other users to generate, such as files created by your editor. + +Use your favorite text editor to open the file called `.git/info/exclude` within the root of your git repository. Any rule you add here will not be checked in, and will only ignore files for your local repository. + +--- + +By following these guidelines, we aim to streamline our development process, maintain code quality, and ensure that our releases are stable and reliable. + +Happy coding! 🎮✨ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7cdbe0b --- /dev/null +++ b/LICENSE @@ -0,0 +1,438 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7fd0840 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# open-fpsz + +We love fpsz video games, but we're tired of the genre being abandoned by prominent studios. To properly honor its legacy, we've chosen to develop our own game inspired by it, aiming to surpass its qualities with familiar jetpack and skiing mechanics. + +## Prerequisities + +Download `Godot Engine` at https://godotengine.org/download + +## Getting started + +1. Clone the repository +2. Open Godot Engine +3. Navigate to the repository and import the `project.godot` +4. Start coding or run the project! + +## Contributing + +Before contributing, please take a moment to review our [Contribution Guidelines](CONTRIBUTING.md) in this repository. These guidelines outline best practices, coding standards, and other important information to ensure that your contributions align with the project's goals and maintain consistency across the codebase. + +We welcome contributions from the community to help improve and expand the project. Feel free to submit pull requests, report bugs, or share ideas for new features. + +## License + +This project is licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). For more details, please refer to the [LICENSE](LICENSE) file. diff --git a/addons/godot-jolt/LICENSE.txt b/addons/godot-jolt/LICENSE.txt new file mode 100644 index 0000000..2675022 --- /dev/null +++ b/addons/godot-jolt/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) Mikael Hermansson and Godot Jolt contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/addons/godot-jolt/THIRDPARTY.txt b/addons/godot-jolt/THIRDPARTY.txt new file mode 100644 index 0000000..e294095 --- /dev/null +++ b/addons/godot-jolt/THIRDPARTY.txt @@ -0,0 +1,91 @@ +Godot Jolt incorporates third-party material from the projects listed below. + +Godot Engine (https://github.com/godotengine/godot) + + Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). + Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. + + 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. + +godot-cpp (https://github.com/godot-jolt/godot-cpp) + + Copyright (c) 2017-present Godot Engine contributors. + Copyright (c) 2022-present Mikael Hermansson. + + 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. + +Jolt Physics (https://github.com/godot-jolt/jolt) + + Copyright (c) 2021 Jorrit Rouwe. + + 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. + +mimalloc (https://github.com/godot-jolt/mimalloc) + + Copyright (c) 2018-2021 Microsoft Corporation, Daan Leijen. + + 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/addons/godot-jolt/android/libgodot-jolt_android-arm32.so b/addons/godot-jolt/android/libgodot-jolt_android-arm32.so new file mode 100644 index 0000000..5282da6 Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-arm32.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-arm32_editor.so b/addons/godot-jolt/android/libgodot-jolt_android-arm32_editor.so new file mode 100644 index 0000000..2430955 Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-arm32_editor.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-arm64.so b/addons/godot-jolt/android/libgodot-jolt_android-arm64.so new file mode 100644 index 0000000..6b79392 Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-arm64.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-arm64_editor.so b/addons/godot-jolt/android/libgodot-jolt_android-arm64_editor.so new file mode 100644 index 0000000..95d6b26 Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-arm64_editor.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-x64.so b/addons/godot-jolt/android/libgodot-jolt_android-x64.so new file mode 100644 index 0000000..4e4882e Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-x64.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-x64_editor.so b/addons/godot-jolt/android/libgodot-jolt_android-x64_editor.so new file mode 100644 index 0000000..e93e93a Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-x64_editor.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-x86.so b/addons/godot-jolt/android/libgodot-jolt_android-x86.so new file mode 100644 index 0000000..485fa22 Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-x86.so differ diff --git a/addons/godot-jolt/android/libgodot-jolt_android-x86_editor.so b/addons/godot-jolt/android/libgodot-jolt_android-x86_editor.so new file mode 100644 index 0000000..a061017 Binary files /dev/null and b/addons/godot-jolt/android/libgodot-jolt_android-x86_editor.so differ diff --git a/addons/godot-jolt/godot-jolt.gdextension b/addons/godot-jolt/godot-jolt.gdextension new file mode 100644 index 0000000..e866e8b --- /dev/null +++ b/addons/godot-jolt/godot-jolt.gdextension @@ -0,0 +1,36 @@ +[configuration] + +entry_symbol = "godot_jolt_main" +compatibility_minimum = "4.2" + +[libraries] + +windows.release.x86_64 = "windows/godot-jolt_windows-x64.dll" +windows.debug.x86_64 = "windows/godot-jolt_windows-x64_editor.dll" + +windows.release.x86_32 = "windows/godot-jolt_windows-x86.dll" +windows.debug.x86_32 = "windows/godot-jolt_windows-x86_editor.dll" + +linux.release.x86_64 = "linux/godot-jolt_linux-x64.so" +linux.debug.x86_64 = "linux/godot-jolt_linux-x64_editor.so" + +linux.release.x86_32 = "linux/godot-jolt_linux-x86.so" +linux.debug.x86_32 = "linux/godot-jolt_linux-x86_editor.so" + +macos.release = "macos/godot-jolt_macos.framework" +macos.debug = "macos/godot-jolt_macos_editor.framework" + +ios.release = "ios/godot-jolt_ios.framework" +ios.debug = "ios/godot-jolt_ios_editor.framework" + +android.release.arm64 = "android/libgodot-jolt_android-arm64.so" +android.debug.arm64 = "android/libgodot-jolt_android-arm64_editor.so" + +android.release.arm32 = "android/libgodot-jolt_android-arm32.so" +android.debug.arm32 = "android/libgodot-jolt_android-arm32_editor.so" + +android.release.x86_64 = "android/libgodot-jolt_android-x64.so" +android.debug.x86_64 = "android/libgodot-jolt_android-x64_editor.so" + +android.release.x86_32 = "android/libgodot-jolt_android-x86.so" +android.debug.x86_32 = "android/libgodot-jolt_android-x86_editor.so" diff --git a/addons/godot-jolt/ios/godot-jolt_ios.framework/Info.plist b/addons/godot-jolt/ios/godot-jolt_ios.framework/Info.plist new file mode 100644 index 0000000..68ab9f6 --- /dev/null +++ b/addons/godot-jolt/ios/godot-jolt_ios.framework/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + godot-jolt_ios + CFBundleName + Godot Jolt + CFBundleDisplayName + Godot Jolt + CFBundleIdentifier + org.godot-jolt.godot-jolt + NSHumanReadableCopyright + Copyright (c) Mikael Hermansson and Godot Jolt contributors. + CFBundleVersion + 0.12.0 + CFBundleShortVersionString + 0.12.0 + CFBundlePackageType + FMWK + CSResourcesFileMapped + + DTPlatformName + iphoneos + MinimumOSVersion + 12.0 + + diff --git a/addons/godot-jolt/ios/godot-jolt_ios.framework/godot-jolt_ios b/addons/godot-jolt/ios/godot-jolt_ios.framework/godot-jolt_ios new file mode 100644 index 0000000..37c9d5a Binary files /dev/null and b/addons/godot-jolt/ios/godot-jolt_ios.framework/godot-jolt_ios differ diff --git a/addons/godot-jolt/ios/godot-jolt_ios_editor.framework/Info.plist b/addons/godot-jolt/ios/godot-jolt_ios_editor.framework/Info.plist new file mode 100644 index 0000000..f3c28dc --- /dev/null +++ b/addons/godot-jolt/ios/godot-jolt_ios_editor.framework/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + godot-jolt_ios_editor + CFBundleName + Godot Jolt + CFBundleDisplayName + Godot Jolt + CFBundleIdentifier + org.godot-jolt.godot-jolt + NSHumanReadableCopyright + Copyright (c) Mikael Hermansson and Godot Jolt contributors. + CFBundleVersion + 0.12.0 + CFBundleShortVersionString + 0.12.0 + CFBundlePackageType + FMWK + CSResourcesFileMapped + + DTPlatformName + iphoneos + MinimumOSVersion + 12.0 + + diff --git a/addons/godot-jolt/ios/godot-jolt_ios_editor.framework/godot-jolt_ios_editor b/addons/godot-jolt/ios/godot-jolt_ios_editor.framework/godot-jolt_ios_editor new file mode 100644 index 0000000..9e8140c Binary files /dev/null and b/addons/godot-jolt/ios/godot-jolt_ios_editor.framework/godot-jolt_ios_editor differ diff --git a/addons/godot-jolt/linux/godot-jolt_linux-x64.so b/addons/godot-jolt/linux/godot-jolt_linux-x64.so new file mode 100644 index 0000000..364242d Binary files /dev/null and b/addons/godot-jolt/linux/godot-jolt_linux-x64.so differ diff --git a/addons/godot-jolt/linux/godot-jolt_linux-x64_editor.so b/addons/godot-jolt/linux/godot-jolt_linux-x64_editor.so new file mode 100644 index 0000000..4ad0285 Binary files /dev/null and b/addons/godot-jolt/linux/godot-jolt_linux-x64_editor.so differ diff --git a/addons/godot-jolt/linux/godot-jolt_linux-x86.so b/addons/godot-jolt/linux/godot-jolt_linux-x86.so new file mode 100644 index 0000000..ad7d2be Binary files /dev/null and b/addons/godot-jolt/linux/godot-jolt_linux-x86.so differ diff --git a/addons/godot-jolt/linux/godot-jolt_linux-x86_editor.so b/addons/godot-jolt/linux/godot-jolt_linux-x86_editor.so new file mode 100644 index 0000000..e639d07 Binary files /dev/null and b/addons/godot-jolt/linux/godot-jolt_linux-x86_editor.so differ diff --git a/addons/godot-jolt/macos/godot-jolt_macos.framework/Resources/Info.plist b/addons/godot-jolt/macos/godot-jolt_macos.framework/Resources/Info.plist new file mode 100644 index 0000000..f88e713 --- /dev/null +++ b/addons/godot-jolt/macos/godot-jolt_macos.framework/Resources/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + godot-jolt_macos + CFBundleName + Godot Jolt + CFBundleDisplayName + Godot Jolt + CFBundleIdentifier + org.godot-jolt.godot-jolt + NSHumanReadableCopyright + Copyright (c) Mikael Hermansson and Godot Jolt contributors. + CFBundleVersion + 0.12.0 + CFBundleShortVersionString + 0.12.0 + CFBundlePackageType + FMWK + CSResourcesFileMapped + + DTPlatformName + macosx + LSMinimumSystemVersion + 10.12 + + diff --git a/addons/godot-jolt/macos/godot-jolt_macos.framework/_CodeSignature/CodeResources b/addons/godot-jolt/macos/godot-jolt_macos.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..cb463f5 --- /dev/null +++ b/addons/godot-jolt/macos/godot-jolt_macos.framework/_CodeSignature/CodeResources @@ -0,0 +1,128 @@ + + + + + files + + Resources/Info.plist + + HxpaqrKUN+D+lkF90Phqlb+CZKo= + + + files2 + + Resources/Info.plist + + hash2 + + ZTtvl19PLRzCoTuDRMZ2FnJXIXsLYRhaBFxjroNsLDw= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/godot-jolt/macos/godot-jolt_macos.framework/godot-jolt_macos b/addons/godot-jolt/macos/godot-jolt_macos.framework/godot-jolt_macos new file mode 100644 index 0000000..1d5bd24 Binary files /dev/null and b/addons/godot-jolt/macos/godot-jolt_macos.framework/godot-jolt_macos differ diff --git a/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/Resources/Info.plist b/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/Resources/Info.plist new file mode 100644 index 0000000..ac10d93 --- /dev/null +++ b/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/Resources/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + godot-jolt_macos_editor + CFBundleName + Godot Jolt + CFBundleDisplayName + Godot Jolt + CFBundleIdentifier + org.godot-jolt.godot-jolt + NSHumanReadableCopyright + Copyright (c) Mikael Hermansson and Godot Jolt contributors. + CFBundleVersion + 0.12.0 + CFBundleShortVersionString + 0.12.0 + CFBundlePackageType + FMWK + CSResourcesFileMapped + + DTPlatformName + macosx + LSMinimumSystemVersion + 10.12 + + diff --git a/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/_CodeSignature/CodeResources b/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..4b087b4 --- /dev/null +++ b/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/_CodeSignature/CodeResources @@ -0,0 +1,128 @@ + + + + + files + + Resources/Info.plist + + CpU1kp9qZhdCVqKdSia+981vm40= + + + files2 + + Resources/Info.plist + + hash2 + + 4CTRXI34pj3JIJzQDUUZTlAagKWQeohPQN20M0VCK4o= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/godot-jolt_macos_editor b/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/godot-jolt_macos_editor new file mode 100644 index 0000000..3787fa9 Binary files /dev/null and b/addons/godot-jolt/macos/godot-jolt_macos_editor.framework/godot-jolt_macos_editor differ diff --git a/addons/godot-jolt/windows/godot-jolt_windows-x64.dll b/addons/godot-jolt/windows/godot-jolt_windows-x64.dll new file mode 100644 index 0000000..ce010d6 Binary files /dev/null and b/addons/godot-jolt/windows/godot-jolt_windows-x64.dll differ diff --git a/addons/godot-jolt/windows/godot-jolt_windows-x64_editor.dll b/addons/godot-jolt/windows/godot-jolt_windows-x64_editor.dll new file mode 100644 index 0000000..9ed5550 Binary files /dev/null and b/addons/godot-jolt/windows/godot-jolt_windows-x64_editor.dll differ diff --git a/addons/godot-jolt/windows/godot-jolt_windows-x86.dll b/addons/godot-jolt/windows/godot-jolt_windows-x86.dll new file mode 100644 index 0000000..b6c44f7 Binary files /dev/null and b/addons/godot-jolt/windows/godot-jolt_windows-x86.dll differ diff --git a/addons/godot-jolt/windows/godot-jolt_windows-x86_editor.dll b/addons/godot-jolt/windows/godot-jolt_windows-x86_editor.dll new file mode 100644 index 0000000..7312494 Binary files /dev/null and b/addons/godot-jolt/windows/godot-jolt_windows-x86_editor.dll differ diff --git a/addons/terrain_3d/LICENSE.txt b/addons/terrain_3d/LICENSE.txt new file mode 100644 index 0000000..b4293b7 --- /dev/null +++ b/addons/terrain_3d/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Cory Petkovsek, Roope Palmroos, and Contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/addons/terrain_3d/README.md b/addons/terrain_3d/README.md new file mode 100644 index 0000000..0a57570 --- /dev/null +++ b/addons/terrain_3d/README.md @@ -0,0 +1,55 @@ + + +# Terrain3D +A high performance, editable terrain system for Godot 4. + +## Features +* Written in C++ as a GDExtension plugin, which works with official engine builds +* Can be accessed by GDScript, C#, and any language Godot supports +* Geometric Clipmap Mesh Terrain, as used in The Witcher 3. See [System Architecture](https://terrain3d.readthedocs.io/en/stable/docs/system_architecture.html) +* Up to 16k x 16k in 1k regions (imagine multiple islands without paying for 16k^2 vram) +* Up to 10 Levels of Detail (LODs) +* Up to 32 texture sets using albedo, normal, roughness, height +* Sculpting, holes, texture painting, texture detiling, painting colors and wetness +* Supports importing heightmaps from [HTerrain](https://github.com/Zylann/godot_heightmap_plugin/), WorldMachine, Unity, Unreal and any tool that can export a heightmap (raw/r16/exr/+). See [importing data](https://terrain3d.readthedocs.io/en/stable/docs/import_export.html) + +See [Project Status](https://terrain3d.readthedocs.io/en/stable/docs/project_status.html) for details. + +## Getting Started + +1. Read through our [documentation](https://terrain3d.readthedocs.io/en/stable/index.html), starting with [Installation](https://terrain3d.readthedocs.io/en/stable/docs/installation.html). + +2. For support, read [Getting Help](https://terrain3d.readthedocs.io/en/stable/docs/getting_help.html) or join our [Discord server](https://tokisan.com/discord). + +3. Watch the tutorial videos: + +**Installation, Setup, Basic Usage** + +[![Using Terrain3D - Part 1](https://i.ytimg.com/vi/oV8c9alXVwU/hqdefault.jpg)](https://youtu.be/oV8c9alXVwU) + +**Texture Painting, Holes, Navigation, Advanced Usage** + +[![Using Terrain3D - Part 2](https://i.ytimg.com/vi/YtiAI2F6Xkk/hqdefault.jpg)](https://youtu.be/YtiAI2F6Xkk) + + +## Credit +Developed for the Godot community by: + +||| +|--|--| +| **Cory Petkovsek, Tokisan Games** | [](https://twitter.com/TokisanGames) [](https://github.com/TokisanGames) [](https://tokisan.com/) [](https://tokisan.com/discord) [](https://www.youtube.com/@TokisanGames)| +| **Roope Palmroos, Outobugi Games** | [](https://twitter.com/outobugi) [](https://github.com/outobugi) [](https://outobugi.com/) [](https://www.youtube.com/@outobugi)| + +And other contributors displayed on the right of the github page and in [AUTHORS.md](https://github.com/TokisanGames/Terrain3D/blob/main/AUTHORS.md). + +Geometry clipmap mesh code created by [Mike J. Savage](https://mikejsavage.co.uk/blog/geometry-clipmaps.html). Blog and repository code released under the MIT license per email communication with Mike. + +## Contributing + +Please see [CONTRIBUTING.md](https://github.com/TokisanGames/Terrain3D/blob/main/CONTRIBUTING.md) if you would like to help make Terrain3D the best terrain system for Godot. + + +## License + +This plugin has been released under the [MIT License](https://github.com/TokisanGames/Terrain3D/blob/main/LICENSE.txt). + diff --git a/addons/terrain_3d/bin/libterrain.android.debug.arm32.so b/addons/terrain_3d/bin/libterrain.android.debug.arm32.so new file mode 100644 index 0000000..eb7604d Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.debug.arm32.so differ diff --git a/addons/terrain_3d/bin/libterrain.android.debug.arm64.so b/addons/terrain_3d/bin/libterrain.android.debug.arm64.so new file mode 100644 index 0000000..243cedd Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.debug.arm64.so differ diff --git a/addons/terrain_3d/bin/libterrain.android.release.arm32.so b/addons/terrain_3d/bin/libterrain.android.release.arm32.so new file mode 100644 index 0000000..8b618bf Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.release.arm32.so differ diff --git a/addons/terrain_3d/bin/libterrain.android.release.arm64.so b/addons/terrain_3d/bin/libterrain.android.release.arm64.so new file mode 100644 index 0000000..e56a265 Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.android.release.arm64.so differ diff --git a/addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib b/addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib new file mode 100644 index 0000000..0852752 Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib differ diff --git a/addons/terrain_3d/bin/libterrain.ios.release.universal.dylib b/addons/terrain_3d/bin/libterrain.ios.release.universal.dylib new file mode 100644 index 0000000..96ae88f Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.ios.release.universal.dylib differ diff --git a/addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so b/addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so new file mode 100644 index 0000000..d024aa5 Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so differ diff --git a/addons/terrain_3d/bin/libterrain.linux.release.x86_64.so b/addons/terrain_3d/bin/libterrain.linux.release.x86_64.so new file mode 100644 index 0000000..64d0f8c Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.linux.release.x86_64.so differ diff --git a/addons/terrain_3d/bin/libterrain.macos.debug.framework/libterrain.macos.debug b/addons/terrain_3d/bin/libterrain.macos.debug.framework/libterrain.macos.debug new file mode 100644 index 0000000..8f1d52b Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.macos.debug.framework/libterrain.macos.debug differ diff --git a/addons/terrain_3d/bin/libterrain.macos.release.framework/libterrain.macos.release b/addons/terrain_3d/bin/libterrain.macos.release.framework/libterrain.macos.release new file mode 100644 index 0000000..f141b33 Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.macos.release.framework/libterrain.macos.release differ diff --git a/addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll b/addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll new file mode 100644 index 0000000..b58b6f2 Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll differ diff --git a/addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll b/addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll new file mode 100644 index 0000000..7b6d4f2 Binary files /dev/null and b/addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll differ diff --git a/addons/terrain_3d/editor/brushes/.gdignore b/addons/terrain_3d/editor/brushes/.gdignore new file mode 100644 index 0000000..e69de29 diff --git a/addons/terrain_3d/editor/brushes/acrylic1.exr b/addons/terrain_3d/editor/brushes/acrylic1.exr new file mode 100644 index 0000000..14b66d6 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/acrylic1.exr differ diff --git a/addons/terrain_3d/editor/brushes/circle0.exr b/addons/terrain_3d/editor/brushes/circle0.exr new file mode 100644 index 0000000..78937f1 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/circle0.exr differ diff --git a/addons/terrain_3d/editor/brushes/circle1.exr b/addons/terrain_3d/editor/brushes/circle1.exr new file mode 100644 index 0000000..e91d97e Binary files /dev/null and b/addons/terrain_3d/editor/brushes/circle1.exr differ diff --git a/addons/terrain_3d/editor/brushes/circle2.exr b/addons/terrain_3d/editor/brushes/circle2.exr new file mode 100644 index 0000000..f6931ba Binary files /dev/null and b/addons/terrain_3d/editor/brushes/circle2.exr differ diff --git a/addons/terrain_3d/editor/brushes/circle3.exr b/addons/terrain_3d/editor/brushes/circle3.exr new file mode 100644 index 0000000..477ab7e Binary files /dev/null and b/addons/terrain_3d/editor/brushes/circle3.exr differ diff --git a/addons/terrain_3d/editor/brushes/circle4.exr b/addons/terrain_3d/editor/brushes/circle4.exr new file mode 100644 index 0000000..b466f92 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/circle4.exr differ diff --git a/addons/terrain_3d/editor/brushes/hill1.exr b/addons/terrain_3d/editor/brushes/hill1.exr new file mode 100644 index 0000000..a668ab6 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/hill1.exr differ diff --git a/addons/terrain_3d/editor/brushes/hill2.exr b/addons/terrain_3d/editor/brushes/hill2.exr new file mode 100644 index 0000000..068e22b Binary files /dev/null and b/addons/terrain_3d/editor/brushes/hill2.exr differ diff --git a/addons/terrain_3d/editor/brushes/mountain1.exr b/addons/terrain_3d/editor/brushes/mountain1.exr new file mode 100644 index 0000000..be71748 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/mountain1.exr differ diff --git a/addons/terrain_3d/editor/brushes/mountain2.exr b/addons/terrain_3d/editor/brushes/mountain2.exr new file mode 100644 index 0000000..ca30373 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/mountain2.exr differ diff --git a/addons/terrain_3d/editor/brushes/mountain3.exr b/addons/terrain_3d/editor/brushes/mountain3.exr new file mode 100644 index 0000000..ca07a1e Binary files /dev/null and b/addons/terrain_3d/editor/brushes/mountain3.exr differ diff --git a/addons/terrain_3d/editor/brushes/mountain4.exr b/addons/terrain_3d/editor/brushes/mountain4.exr new file mode 100644 index 0000000..f8197fe Binary files /dev/null and b/addons/terrain_3d/editor/brushes/mountain4.exr differ diff --git a/addons/terrain_3d/editor/brushes/peak1.exr b/addons/terrain_3d/editor/brushes/peak1.exr new file mode 100644 index 0000000..49d341e Binary files /dev/null and b/addons/terrain_3d/editor/brushes/peak1.exr differ diff --git a/addons/terrain_3d/editor/brushes/peak2.exr b/addons/terrain_3d/editor/brushes/peak2.exr new file mode 100644 index 0000000..db74297 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/peak2.exr differ diff --git a/addons/terrain_3d/editor/brushes/peak3.exr b/addons/terrain_3d/editor/brushes/peak3.exr new file mode 100644 index 0000000..9383681 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/peak3.exr differ diff --git a/addons/terrain_3d/editor/brushes/ring1.exr b/addons/terrain_3d/editor/brushes/ring1.exr new file mode 100644 index 0000000..6396804 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/ring1.exr differ diff --git a/addons/terrain_3d/editor/brushes/smoke.exr b/addons/terrain_3d/editor/brushes/smoke.exr new file mode 100644 index 0000000..021947b Binary files /dev/null and b/addons/terrain_3d/editor/brushes/smoke.exr differ diff --git a/addons/terrain_3d/editor/brushes/square1.exr b/addons/terrain_3d/editor/brushes/square1.exr new file mode 100644 index 0000000..3aff9cd Binary files /dev/null and b/addons/terrain_3d/editor/brushes/square1.exr differ diff --git a/addons/terrain_3d/editor/brushes/square2.exr b/addons/terrain_3d/editor/brushes/square2.exr new file mode 100644 index 0000000..230113c Binary files /dev/null and b/addons/terrain_3d/editor/brushes/square2.exr differ diff --git a/addons/terrain_3d/editor/brushes/square3.exr b/addons/terrain_3d/editor/brushes/square3.exr new file mode 100644 index 0000000..6da88b8 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/square3.exr differ diff --git a/addons/terrain_3d/editor/brushes/square4.exr b/addons/terrain_3d/editor/brushes/square4.exr new file mode 100644 index 0000000..350cd7d Binary files /dev/null and b/addons/terrain_3d/editor/brushes/square4.exr differ diff --git a/addons/terrain_3d/editor/brushes/square5.exr b/addons/terrain_3d/editor/brushes/square5.exr new file mode 100644 index 0000000..f0832e0 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/square5.exr differ diff --git a/addons/terrain_3d/editor/brushes/stones.exr b/addons/terrain_3d/editor/brushes/stones.exr new file mode 100644 index 0000000..7ef5977 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/stones.exr differ diff --git a/addons/terrain_3d/editor/brushes/terrain1.exr b/addons/terrain_3d/editor/brushes/terrain1.exr new file mode 100644 index 0000000..8366b52 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/terrain1.exr differ diff --git a/addons/terrain_3d/editor/brushes/terrain2.exr b/addons/terrain_3d/editor/brushes/terrain2.exr new file mode 100644 index 0000000..d11a069 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/terrain2.exr differ diff --git a/addons/terrain_3d/editor/brushes/terrain3.exr b/addons/terrain_3d/editor/brushes/terrain3.exr new file mode 100644 index 0000000..61bfe0f Binary files /dev/null and b/addons/terrain_3d/editor/brushes/terrain3.exr differ diff --git a/addons/terrain_3d/editor/brushes/terrain4.exr b/addons/terrain_3d/editor/brushes/terrain4.exr new file mode 100644 index 0000000..e8f4ce4 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/terrain4.exr differ diff --git a/addons/terrain_3d/editor/brushes/terrain5.exr b/addons/terrain_3d/editor/brushes/terrain5.exr new file mode 100644 index 0000000..ad3fe5b Binary files /dev/null and b/addons/terrain_3d/editor/brushes/terrain5.exr differ diff --git a/addons/terrain_3d/editor/brushes/terrain6.exr b/addons/terrain_3d/editor/brushes/terrain6.exr new file mode 100644 index 0000000..0a15419 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/terrain6.exr differ diff --git a/addons/terrain_3d/editor/brushes/texture1.exr b/addons/terrain_3d/editor/brushes/texture1.exr new file mode 100644 index 0000000..f456b77 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/texture1.exr differ diff --git a/addons/terrain_3d/editor/brushes/texture2.exr b/addons/terrain_3d/editor/brushes/texture2.exr new file mode 100644 index 0000000..2624d3b Binary files /dev/null and b/addons/terrain_3d/editor/brushes/texture2.exr differ diff --git a/addons/terrain_3d/editor/brushes/texture3.exr b/addons/terrain_3d/editor/brushes/texture3.exr new file mode 100644 index 0000000..690fe5e Binary files /dev/null and b/addons/terrain_3d/editor/brushes/texture3.exr differ diff --git a/addons/terrain_3d/editor/brushes/texture4.exr b/addons/terrain_3d/editor/brushes/texture4.exr new file mode 100644 index 0000000..a2d96aa Binary files /dev/null and b/addons/terrain_3d/editor/brushes/texture4.exr differ diff --git a/addons/terrain_3d/editor/brushes/texture5.exr b/addons/terrain_3d/editor/brushes/texture5.exr new file mode 100644 index 0000000..62aad60 Binary files /dev/null and b/addons/terrain_3d/editor/brushes/texture5.exr differ diff --git a/addons/terrain_3d/editor/brushes/vegetation1.exr b/addons/terrain_3d/editor/brushes/vegetation1.exr new file mode 100644 index 0000000..d65bc6e Binary files /dev/null and b/addons/terrain_3d/editor/brushes/vegetation1.exr differ diff --git a/addons/terrain_3d/editor/components/bake_lod_dialog.gd b/addons/terrain_3d/editor/components/bake_lod_dialog.gd new file mode 100644 index 0000000..f73c82c --- /dev/null +++ b/addons/terrain_3d/editor/components/bake_lod_dialog.gd @@ -0,0 +1,28 @@ +@tool +extends ConfirmationDialog + +var lod: int = 0 +var description: String = "" + + +func _ready() -> void: + set_unparent_when_invisible(true) + about_to_popup.connect(_on_about_to_popup) + visibility_changed.connect(_on_visibility_changed) + %LodBox.value_changed.connect(_on_lod_box_value_changed) + + +func _on_about_to_popup() -> void: + lod = %LodBox.value + + +func _on_visibility_changed() -> void: + # Change text on the autowrap label only when the popup is visible. + # Works around Godot issue #47005: + # https://github.com/godotengine/godot/issues/47005 + if visible: + %DescriptionLabel.text = description + + +func _on_lod_box_value_changed(p_value: float) -> void: + lod = %LodBox.value diff --git a/addons/terrain_3d/editor/components/bake_lod_dialog.tscn b/addons/terrain_3d/editor/components/bake_lod_dialog.tscn new file mode 100644 index 0000000..17d5c72 --- /dev/null +++ b/addons/terrain_3d/editor/components/bake_lod_dialog.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=2 format=3 uid="uid://bhvrrmb8bk1bt"] + +[ext_resource type="Script" path="res://addons/terrain_3d/editor/components/bake_lod_dialog.gd" id="1_57670"] + +[node name="bake_lod_dialog" type="ConfirmationDialog"] +title = "Bake Terrain3D Mesh" +position = Vector2i(0, 36) +size = Vector2i(400, 115) +visible = true +script = ExtResource("1_57670") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 8.0 +offset_top = 8.0 +offset_right = -8.0 +offset_bottom = -49.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "LOD:" + +[node name="LodBox" type="SpinBox" parent="VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 8.0 +value = 4.0 + +[node name="DescriptionLabel" type="Label" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +autowrap_mode = 2 diff --git a/addons/terrain_3d/editor/components/baker.gd b/addons/terrain_3d/editor/components/baker.gd new file mode 100644 index 0000000..37ff153 --- /dev/null +++ b/addons/terrain_3d/editor/components/baker.gd @@ -0,0 +1,385 @@ +extends Node + +const BakeLodDialog: PackedScene = preload("res://addons/terrain_3d/editor/components/bake_lod_dialog.tscn") +const BAKE_MESH_DESCRIPTION: String = "This will create a child MeshInstance3D. LOD4+ is recommended. LOD0 is slow and dense with vertices every 1 unit. It is not an optimal mesh." +const BAKE_OCCLUDER_DESCRIPTION: String = "This will create a child OccluderInstance3D. LOD4+ is recommended and will take 5+ seconds per region to generate. LOD0 is unnecessarily dense and slow." +const SET_UP_NAVIGATION_DESCRIPTION: String = "This operation will: + +- Create a NavigationRegion3D node, +- Assign it a blank NavigationMesh resource, +- Move the Terrain3D node to be a child of the new node, +- And bake the nav mesh. + +Once setup is complete, you can modify the settings on your nav mesh, and rebake +without having to run through the setup again. + +If preferred, this setup can be canceled and the steps performed manually. For +the best results, adjust the settings on the NavigationMesh resource to match +the settings of your navigation agents and collisions." + +var plugin: EditorPlugin +var bake_method: Callable +var bake_lod_dialog: ConfirmationDialog +var confirm_dialog: ConfirmationDialog + + +func _enter_tree() -> void: + bake_lod_dialog = BakeLodDialog.instantiate() + bake_lod_dialog.hide() + bake_lod_dialog.confirmed.connect(func(): bake_method.call()) + bake_lod_dialog.set_unparent_when_invisible(true) + + confirm_dialog = ConfirmationDialog.new() + confirm_dialog.hide() + confirm_dialog.confirmed.connect(func(): bake_method.call()) + confirm_dialog.set_unparent_when_invisible(true) + + +func _exit_tree() -> void: + bake_lod_dialog.queue_free() + confirm_dialog.queue_free() + + +func bake_mesh_popup() -> void: + if plugin.terrain: + bake_method = _bake_mesh + bake_lod_dialog.description = BAKE_MESH_DESCRIPTION + plugin.get_editor_interface().popup_dialog_centered(bake_lod_dialog) + + +func _bake_mesh() -> void: + var mesh: Mesh = plugin.terrain.bake_mesh(bake_lod_dialog.lod, Terrain3DStorage.HEIGHT_FILTER_NEAREST) + if !mesh: + push_error("Failed to bake mesh from Terrain3D") + return + + var undo: EditorUndoRedoManager = plugin.get_undo_redo() + undo.create_action("Terrain3D Bake ArrayMesh") + + var mesh_instance := plugin.terrain.get_node_or_null(^"MeshInstance3D") as MeshInstance3D + if !mesh_instance: + mesh_instance = MeshInstance3D.new() + mesh_instance.name = &"MeshInstance3D" + mesh_instance.set_skeleton_path(NodePath()) + mesh_instance.mesh = mesh + + undo.add_do_method(plugin.terrain, &"add_child", mesh_instance, true) + undo.add_undo_method(plugin.terrain, &"remove_child", mesh_instance) + undo.add_do_property(mesh_instance, &"owner", plugin.terrain.owner) + undo.add_do_reference(mesh_instance) + + else: + undo.add_do_property(mesh_instance, &"mesh", mesh) + undo.add_undo_property(mesh_instance, &"mesh", mesh_instance.mesh) + + if mesh_instance.mesh.resource_path: + var path := mesh_instance.mesh.resource_path + undo.add_do_method(mesh, &"take_over_path", path) + undo.add_undo_method(mesh_instance.mesh, &"take_over_path", path) + undo.add_do_method(ResourceSaver, &"save", mesh) + undo.add_undo_method(ResourceSaver, &"save", mesh_instance.mesh) + + undo.commit_action() + + +func bake_occluder_popup() -> void: + if plugin.terrain: + bake_method = _bake_occluder + bake_lod_dialog.description = BAKE_OCCLUDER_DESCRIPTION + plugin.get_editor_interface().popup_dialog_centered(bake_lod_dialog) + + +func _bake_occluder() -> void: + var mesh: Mesh = plugin.terrain.bake_mesh(bake_lod_dialog.lod, Terrain3DStorage.HEIGHT_FILTER_MINIMUM) + if !mesh: + push_error("Failed to bake mesh from Terrain3D") + return + assert(mesh.get_surface_count() == 1) + + var undo: EditorUndoRedoManager = plugin.get_undo_redo() + undo.create_action("Terrain3D Bake Occluder3D") + + var occluder := ArrayOccluder3D.new() + var arrays: Array = mesh.surface_get_arrays(0) + assert(arrays.size() > Mesh.ARRAY_INDEX) + assert(arrays[Mesh.ARRAY_INDEX] != null) + occluder.set_arrays(arrays[Mesh.ARRAY_VERTEX], arrays[Mesh.ARRAY_INDEX]) + + var occluder_instance := plugin.terrain.get_node_or_null(^"OccluderInstance3D") as OccluderInstance3D + if !occluder_instance: + occluder_instance = OccluderInstance3D.new() + occluder_instance.name = &"OccluderInstance3D" + occluder_instance.occluder = occluder + + undo.add_do_method(plugin.terrain, &"add_child", occluder_instance, true) + undo.add_undo_method(plugin.terrain, &"remove_child", occluder_instance) + undo.add_do_property(occluder_instance, &"owner", plugin.terrain.owner) + undo.add_do_reference(occluder_instance) + + else: + undo.add_do_property(occluder_instance, &"occluder", occluder) + undo.add_undo_property(occluder_instance, &"occluder", occluder_instance.occluder) + + if occluder_instance.occluder.resource_path: + var path := occluder_instance.occluder.resource_path + undo.add_do_method(occluder, &"take_over_path", path) + undo.add_undo_method(occluder_instance.occluder, &"take_over_path", path) + undo.add_do_method(ResourceSaver, &"save", occluder) + undo.add_undo_method(ResourceSaver, &"save", occluder_instance.occluder) + + undo.commit_action() + + +func find_nav_region_terrains(p_nav_region: NavigationRegion3D) -> Array[Terrain3D]: + var result: Array[Terrain3D] = [] + if not p_nav_region.navigation_mesh: + return result + + var source_mode: NavigationMesh.SourceGeometryMode + source_mode = p_nav_region.navigation_mesh.geometry_source_geometry_mode + if source_mode == NavigationMesh.SOURCE_GEOMETRY_ROOT_NODE_CHILDREN: + result.append_array(p_nav_region.find_children("", "Terrain3D", true, true)) + return result + + var group_nodes: Array = p_nav_region.get_tree().get_nodes_in_group(p_nav_region.navigation_mesh.geometry_source_group_name) + for node in group_nodes: + if node is Terrain3D: + result.push_back(node) + if source_mode == NavigationMesh.SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN: + result.append_array(node.find_children("", "Terrain3D", true, true)) + + return result + + +func find_terrain_nav_regions(p_terrain: Terrain3D) -> Array[NavigationRegion3D]: + var result: Array[NavigationRegion3D] = [] + var root: Node = plugin.get_editor_interface().get_edited_scene_root() + if not root: + return result + for nav_region in root.find_children("", "NavigationRegion3D", true, true): + if find_nav_region_terrains(nav_region).has(p_terrain): + result.push_back(nav_region) + return result + + +func bake_nav_mesh() -> void: + if plugin.nav_region: + # A NavigationRegion3D is selected. We only need to bake that one navmesh. + _bake_nav_region_nav_mesh(plugin.nav_region) + print("Terrain3DNavigation: Finished baking 1 NavigationMesh.") + + elif plugin.terrain: + # A Terrain3D is selected. There are potentially multiple navmeshes to bake and we need to + # find them all. (The multiple navmesh use-case is likely on very large scenes with lots of + # geometry. Each navmesh in this case would define its own, non-overlapping, baking AABB, to + # cut down on the amount of geometry to bake. In a large open-world RPG, for instance, there + # could be a navmesh for each town.) + var nav_regions: Array[NavigationRegion3D] = find_terrain_nav_regions(plugin.terrain) + for nav_region in nav_regions: + _bake_nav_region_nav_mesh(nav_region) + print("Terrain3DNavigation: Finished baking %d NavigationMesh(es)." % nav_regions.size()) + + +func _bake_nav_region_nav_mesh(p_nav_region: NavigationRegion3D) -> void: + var nav_mesh: NavigationMesh = p_nav_region.navigation_mesh + assert(nav_mesh != null) + + var source_geometry_data := NavigationMeshSourceGeometryData3D.new() + NavigationMeshGenerator.parse_source_geometry_data(nav_mesh, source_geometry_data, p_nav_region) + + for terrain in find_nav_region_terrains(p_nav_region): + var aabb: AABB = nav_mesh.filter_baking_aabb + aabb.position += nav_mesh.filter_baking_aabb_offset + aabb = p_nav_region.global_transform * aabb + var faces: PackedVector3Array = terrain.generate_nav_mesh_source_geometry(aabb) + if not faces.is_empty(): + source_geometry_data.add_faces(faces, p_nav_region.global_transform.inverse()) + + NavigationMeshGenerator.bake_from_source_geometry_data(nav_mesh, source_geometry_data) + + _postprocess_nav_mesh(nav_mesh) + + # Assign null first to force the debug display to actually update: + p_nav_region.set_navigation_mesh(null) + p_nav_region.set_navigation_mesh(nav_mesh) + + # Trigger save to disk if it is saved as an external file + if not nav_mesh.get_path().is_empty(): + ResourceSaver.save(nav_mesh, nav_mesh.get_path(), ResourceSaver.FLAG_COMPRESS) + + # Let other editor plugins and tool scripts know the nav mesh was just baked: + p_nav_region.bake_finished.emit() + + +func _postprocess_nav_mesh(p_nav_mesh: NavigationMesh) -> void: + # Post-process the nav mesh to work around Godot issue #85548 + + # Round all the vertices in the nav_mesh to the nearest cell_size/cell_height so that it doesn't + # contain any edges shorter than cell_size/cell_height (one cause of #85548). + var vertices: PackedVector3Array = _postprocess_nav_mesh_round_vertices(p_nav_mesh) + + # Rounding vertices can collapse some edges to 0 length. We remove these edges, and any polygons + # that have been reduced to 0 area. + var polygons: Array[PackedInt32Array] = _postprocess_nav_mesh_remove_empty_polygons(p_nav_mesh, vertices) + + # Another cause of #85548 is baking producing overlapping polygons. We remove these. + _postprocess_nav_mesh_remove_overlapping_polygons(p_nav_mesh, vertices, polygons) + + p_nav_mesh.clear_polygons() + p_nav_mesh.set_vertices(vertices) + for polygon in polygons: + p_nav_mesh.add_polygon(polygon) + + +func _postprocess_nav_mesh_round_vertices(p_nav_mesh: NavigationMesh) -> PackedVector3Array: + assert(p_nav_mesh != null) + assert(p_nav_mesh.cell_size > 0.0) + assert(p_nav_mesh.cell_height > 0.0) + + var cell_size: Vector3 = Vector3(p_nav_mesh.cell_size, p_nav_mesh.cell_height, p_nav_mesh.cell_size) + + # Round a little harder to avoid rounding errors with non-power-of-two cell_size/cell_height + # causing the navigation map to put two non-matching edges in the same cell: + var round_factor := cell_size * 1.001 + + var vertices: PackedVector3Array = p_nav_mesh.get_vertices() + for i in range(vertices.size()): + vertices[i] = (vertices[i] / round_factor).floor() * round_factor + return vertices + + +func _postprocess_nav_mesh_remove_empty_polygons(p_nav_mesh: NavigationMesh, p_vertices: PackedVector3Array) -> Array[PackedInt32Array]: + var polygons: Array[PackedInt32Array] = [] + + for i in range(p_nav_mesh.get_polygon_count()): + var old_polygon: PackedInt32Array = p_nav_mesh.get_polygon(i) + var new_polygon: PackedInt32Array = [] + + # Remove duplicate vertices (introduced by rounding) from the polygon: + var polygon_vertices: PackedVector3Array = [] + for index in old_polygon: + var vertex: Vector3 = p_vertices[index] + if polygon_vertices.has(vertex): + continue + polygon_vertices.push_back(vertex) + new_polygon.push_back(index) + + # If we removed some vertices, we might be able to remove the polygon too: + if new_polygon.size() <= 2: + continue + polygons.push_back(new_polygon) + + return polygons + + +func _postprocess_nav_mesh_remove_overlapping_polygons(p_nav_mesh: NavigationMesh, p_vertices: PackedVector3Array, p_polygons: Array[PackedInt32Array]) -> void: + # Occasionally, a baked nav mesh comes out with overlapping polygons: + # https://github.com/godotengine/godot/issues/85548#issuecomment-1839341071 + # Until the bug is fixed in the engine, this function attempts to detect and remove overlapping + # polygons. + + # This function has to make a choice of which polygon to remove when an overlap is detected, + # because in this case the nav mesh is ambiguous. To do this it uses a heuristic: + # (1) an 'overlap' is defined as an edge that is shared by 3 or more polygons. + # (2) a 'bad polygon' is defined as a polygon that contains 2 or more 'overlaps'. + # The function removes the 'bad polygons', which in practice seems to be enough to remove all + # overlaps without creating holes in the nav mesh. + + var cell_size: Vector3 = Vector3(p_nav_mesh.cell_size, p_nav_mesh.cell_height, p_nav_mesh.cell_size) + + # `edges` is going to map edges (vertex pairs) to arrays of polygons that contain that edge. + var edges: Dictionary = {} + + for polygon_index in range(p_polygons.size()): + var polygon: PackedInt32Array = p_polygons[polygon_index] + for j in range(polygon.size()): + var vertex: Vector3 = p_vertices[polygon[j]] + var next_vertex: Vector3 = p_vertices[polygon[(j + 1) % polygon.size()]] + + # edge_key is a key we can use in the edges dictionary that uniquely identifies the + # edge. We use cell coordinates here (Vector3i) because with a non-power-of-two + # cell_size, rounding errors can cause Vector3 vertices to not be equal. + # Array.sort IS defined for vector types - see the Godot docs. It's necessary here + # because polygons that share an edge can have their vertices in a different order. + var edge_key: Array = [Vector3i(vertex / cell_size), Vector3i(next_vertex / cell_size)] + edge_key.sort() + + if !edges.has(edge_key): + edges[edge_key] = [] + edges[edge_key].push_back(polygon_index) + + var overlap_count: Dictionary = {} + for connections in edges.values(): + if connections.size() <= 2: + continue + for polygon_index in connections: + overlap_count[polygon_index] = overlap_count.get(polygon_index, 0) + 1 + + var bad_polygons: Array = [] + for polygon_index in overlap_count.keys(): + if overlap_count[polygon_index] >= 2: + bad_polygons.push_back(polygon_index) + + bad_polygons.sort() + for i in range(bad_polygons.size() - 1, -1, -1): + p_polygons.remove_at(bad_polygons[i]) + + +func set_up_navigation_popup() -> void: + if plugin.terrain: + bake_method = _set_up_navigation + confirm_dialog.dialog_text = SET_UP_NAVIGATION_DESCRIPTION + plugin.get_editor_interface().popup_dialog_centered(confirm_dialog) + + +func _set_up_navigation() -> void: + assert(plugin.terrain) + var terrain: Terrain3D = plugin.terrain + + var nav_region := NavigationRegion3D.new() + nav_region.name = &"NavigationRegion3D" + nav_region.navigation_mesh = NavigationMesh.new() + + var undo_redo: EditorUndoRedoManager = plugin.get_undo_redo() + + undo_redo.create_action("Terrain3D Set up Navigation") + undo_redo.add_do_method(self, &"_do_set_up_navigation", nav_region, terrain) + undo_redo.add_undo_method(self, &"_undo_set_up_navigation", nav_region, terrain) + undo_redo.add_do_reference(nav_region) + undo_redo.commit_action() + + plugin.get_editor_interface().inspect_object(nav_region) + assert(plugin.nav_region == nav_region) + + bake_nav_mesh() + + +func _do_set_up_navigation(p_nav_region: NavigationRegion3D, p_terrain: Terrain3D) -> void: + var parent: Node = p_terrain.get_parent() + var index: int = p_terrain.get_index() + var t_owner: Node = p_terrain.owner + + parent.remove_child(p_terrain) + p_nav_region.add_child(p_terrain) + + parent.add_child(p_nav_region, true) + parent.move_child(p_nav_region, index) + + p_nav_region.owner = t_owner + p_terrain.owner = t_owner + + +func _undo_set_up_navigation(p_nav_region: NavigationRegion3D, p_terrain: Terrain3D) -> void: + assert(p_terrain.get_parent() == p_nav_region) + + var parent: Node = p_nav_region.get_parent() + var index: int = p_nav_region.get_index() + var t_owner: Node = p_nav_region.get_owner() + + parent.remove_child(p_nav_region) + p_nav_region.remove_child(p_terrain) + + parent.add_child(p_terrain, true) + parent.move_child(p_terrain, index) + + p_terrain.owner = t_owner diff --git a/addons/terrain_3d/editor/components/channel_packer.gd b/addons/terrain_3d/editor/components/channel_packer.gd new file mode 100644 index 0000000..30067b1 --- /dev/null +++ b/addons/terrain_3d/editor/components/channel_packer.gd @@ -0,0 +1,212 @@ +extends Object + +const WINDOW_SCENE: String = "res://addons/terrain_3d/editor/components/channel_packer.tscn" +const TEMPLATE_PATH: String = "res://addons/terrain_3d/editor/components/channel_packer_import_template.txt" + +enum { + IMAGE_ALBEDO, + IMAGE_HEIGHT, + IMAGE_NORMAL, + IMAGE_ROUGHNESS, +} + +var plugin: EditorPlugin +var editor_interface: EditorInterface +var dialog: AcceptDialog +var save_file_dialog: FileDialog +var open_file_dialog: FileDialog +var invert_green_checkbox: CheckBox +var last_opened_directory: String +var last_saved_directory: String +var packing_albedo: bool = false +var queue_pack_normal_roughness: bool = false +var images: Array[Image] = [null, null, null, null] +var status_label: Label +var no_op: Callable = func(): pass +var last_file_selected_fn: Callable = no_op + + +func pack_textures_popup() -> void: + if dialog != null: + print("Terrain3DChannelPacker: Cannot open pack tool, dialog already open.") + return + + dialog = (load(WINDOW_SCENE) as PackedScene).instantiate() + dialog.confirmed.connect(_on_close_requested) + dialog.canceled.connect(_on_close_requested) + status_label = dialog.find_child("StatusLabel") + invert_green_checkbox = dialog.find_child("InvertGreenChannelCheckBox") + + editor_interface = plugin.get_editor_interface() + _init_file_dialogs() + editor_interface.popup_dialog_centered(dialog) + + _init_texture_picker(dialog.find_child("AlbedoVBox"), IMAGE_ALBEDO) + _init_texture_picker(dialog.find_child("HeightVBox"), IMAGE_HEIGHT) + _init_texture_picker(dialog.find_child("NormalVBox"), IMAGE_NORMAL) + _init_texture_picker(dialog.find_child("RoughnessVBox"), IMAGE_ROUGHNESS) + var pack_button_path: String = "Panel/MarginContainer/VBoxContainer/PackButton" + (dialog.get_node(pack_button_path) as Button).pressed.connect(_on_pack_button_pressed) + + +func _on_close_requested() -> void: + last_file_selected_fn = no_op + images = [null, null, null, null] + dialog.queue_free() + dialog = null + + +func _init_file_dialogs() -> void: + save_file_dialog = FileDialog.new() + save_file_dialog.set_filters(PackedStringArray(["*.png"])) + save_file_dialog.set_file_mode(FileDialog.FILE_MODE_SAVE_FILE) + save_file_dialog.access = FileDialog.ACCESS_FILESYSTEM + save_file_dialog.file_selected.connect(_on_save_file_selected) + + open_file_dialog = FileDialog.new() + open_file_dialog.set_filters(PackedStringArray(["*.png", "*.bmp", "*.exr", "*.hdr", "*.jpg", "*.jpeg", "*.tga", "*.svg", "*.webp", ".ktx"])) + open_file_dialog.set_file_mode(FileDialog.FILE_MODE_OPEN_FILE) + open_file_dialog.access = FileDialog.ACCESS_FILESYSTEM + + dialog.add_child(save_file_dialog) + dialog.add_child(open_file_dialog) + + +func _init_texture_picker(p_parent: Node, p_image_index: int) -> void: + var line_edit: LineEdit = p_parent.find_child("LineEdit") + var file_pick_button: Button = p_parent.find_child("PickButton") + var clear_button: Button = p_parent.find_child("ClearButton") + var texture_rect: TextureRect = p_parent.find_child("TextureRect") + var texture_button: Button = p_parent.find_child("TextureButton") + + var open_fn: Callable = func() -> void: + open_file_dialog.current_path = last_opened_directory + if last_file_selected_fn != no_op: + open_file_dialog.file_selected.disconnect(last_file_selected_fn) + last_file_selected_fn = func(path: String) -> void: + line_edit.text = path + line_edit.caret_column = path.length() + last_opened_directory = path.get_base_dir() + "/" + var image: Image = Image.new() + var code: int = image.load(path) + if code != OK: + _show_error("Failed to load texture '" + path + "'") + texture_rect.texture = null + images[p_image_index] = null + else: + _show_success("Loaded texture '" + path + "'") + texture_rect.texture = ImageTexture.create_from_image(image) + images[p_image_index] = image + open_file_dialog.file_selected.connect(last_file_selected_fn) + open_file_dialog.popup_centered_ratio() + + var clear_fn: Callable = func() -> void: + line_edit.text = "" + texture_rect.texture = null + images[p_image_index] = null + + # allow user to edit textbox and press enter because Godot's file picker doesn't work 100% of the time + var line_edit_submit_fn: Callable = func(path: String) -> void: + var image: Image = Image.new() + var code: int = image.load(path) + if code != OK: + _show_error("Failed to load texture '" + path + "'") + texture_rect.texture = null + images[p_image_index] = null + else: + texture_rect.texture = ImageTexture.create_from_image(image) + images[p_image_index] = image + + line_edit.text_submitted.connect(line_edit_submit_fn) + file_pick_button.pressed.connect(open_fn) + texture_button.pressed.connect(open_fn) + clear_button.pressed.connect(clear_fn) + _set_button_icon(file_pick_button, "Folder") + _set_button_icon(clear_button, "Remove") + + +func _set_button_icon(p_button: Button, p_icon_name: String) -> void: + var editor_base: Control = editor_interface.get_base_control() + var icon: Texture2D = editor_base.get_theme_icon(p_icon_name, "EditorIcons") + p_button.icon = icon + + +func _show_error(p_text: String) -> void: + push_error("Terrain3DChannelPacker: " + p_text) + status_label.text = p_text + status_label.add_theme_color_override("font_color", Color(0.9, 0, 0)) + + +func _show_success(p_text: String) -> void: + print("Terrain3DChannelPacker: " + p_text) + status_label.text = p_text + status_label.add_theme_color_override("font_color", Color(0, 0.82, 0.14)) + + +func _create_import_file(png_path: String) -> void: + var dst_import_path: String = png_path + ".import" + + var file: FileAccess = FileAccess.open(TEMPLATE_PATH, FileAccess.READ) + var template_content: String = file.get_as_text() + file.close() + + var import_content: String = template_content.replace("$SOURCE_FILE", png_path) + file = FileAccess.open(dst_import_path, FileAccess.WRITE) + file.store_string(import_content) + file.close() + + +func _on_pack_button_pressed() -> void: + packing_albedo = images[IMAGE_ALBEDO] != null and images[IMAGE_HEIGHT] != null + var packing_normal_roughness: bool = images[IMAGE_NORMAL] != null and images[IMAGE_ROUGHNESS] != null + + if not packing_albedo and not packing_normal_roughness: + _show_error("Please select an albedo and height texture or a normal and roughness texture.") + return + + if packing_albedo: + save_file_dialog.current_path = last_saved_directory + "packed_albedo_height" + save_file_dialog.title = "Save Packed Albedo/Height Texture" + save_file_dialog.popup_centered_ratio() + if packing_normal_roughness: + queue_pack_normal_roughness = true + return + if packing_normal_roughness: + save_file_dialog.current_path = last_saved_directory + "packed_normal_roughness" + save_file_dialog.title = "Save Packed Normal/Roughness Texture" + save_file_dialog.popup_centered_ratio() + + +func _on_save_file_selected(p_dst_path) -> void: + last_saved_directory = p_dst_path.get_base_dir() + "/" + if packing_albedo: + _pack_textures(images[IMAGE_ALBEDO], images[IMAGE_HEIGHT], p_dst_path, false) + else: + _pack_textures(images[IMAGE_NORMAL], images[IMAGE_ROUGHNESS], p_dst_path, invert_green_checkbox.button_pressed) + + if queue_pack_normal_roughness: + queue_pack_normal_roughness = false + packing_albedo = false + save_file_dialog.current_path = last_saved_directory + "packed_normal_roughness" + save_file_dialog.title = "Save Packed Normal/Roughness Texture" + save_file_dialog.call_deferred("popup_centered_ratio") + + +func _pack_textures(p_rgb_image: Image, p_a_image: Image, p_dst_path: String, p_invert_green: bool) -> void: + if p_rgb_image and p_a_image: + if p_rgb_image.get_size() != p_a_image.get_size(): + _show_error("Textures must be the same size.") + return + + var output_image: Image = Terrain3D.pack_image(p_rgb_image, p_a_image, p_invert_green) + + if not output_image: + _show_error("Failed to pack textures.") + return + + output_image.save_png(p_dst_path) + editor_interface.get_resource_filesystem().scan_sources() + _create_import_file(p_dst_path) + _show_success("Packed to " + p_dst_path + ".") + else: + _show_error("Failed to load one or more textures.") diff --git a/addons/terrain_3d/editor/components/channel_packer.tscn b/addons/terrain_3d/editor/components/channel_packer.tscn new file mode 100644 index 0000000..ebd2f0c --- /dev/null +++ b/addons/terrain_3d/editor/components/channel_packer.tscn @@ -0,0 +1,359 @@ +[gd_scene load_steps=5 format=3 uid="uid://nud6dwjcnj5v"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ysabf"] +bg_color = Color(0.211765, 0.239216, 0.290196, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lcvna"] +bg_color = Color(0.168627, 0.211765, 0.266667, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.270588, 0.435294, 0.580392, 1) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cb0xf"] +bg_color = Color(0.137255, 0.137255, 0.137255, 1) +draw_center = false +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.784314, 0.784314, 0.784314, 1) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7qdas"] + +[node name="AcceptDialog" type="AcceptDialog"] +title = "Terrain3D Channel Packer" +initial_position = 1 +size = Vector2i(660, 900) +visible = true +ok_button_text = "Close" + +[node name="Panel" type="Panel" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 8.0 +offset_top = 8.0 +offset_right = -8.0 +offset_bottom = -49.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_ysabf") + +[node name="MarginContainer" type="MarginContainer" parent="Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -1.0 +offset_bottom = -53.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer"] +layout_mode = 2 +size_flags_vertical = 0 +theme_override_constants/separation = 10 + +[node name="AlbedoHeightPanel" type="Panel" parent="Panel/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 250) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_lcvna") + +[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="HBoxContainer" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer"] +layout_mode = 2 + +[node name="AlbedoVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="AlbedoLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"] +layout_mode = 2 +text = "Albedo texture" + +[node name="AlbedoHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"] +layout_mode = 2 + +[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"] +layout_mode = 2 +size_flags_vertical = 4 +theme_override_constants/margin_top = 10 + +[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer"] +custom_minimum_size = Vector2(110, 110) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf") + +[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 +expand_mode = 1 + +[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas") + +[node name="HeightVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HeightLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"] +layout_mode = 2 +text = "Height texture" + +[node name="HeightHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"] +layout_mode = 2 + +[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"] +layout_mode = 2 +size_flags_vertical = 4 +theme_override_constants/margin_top = 10 + +[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer"] +custom_minimum_size = Vector2(110, 110) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf") + +[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 +expand_mode = 1 + +[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas") + +[node name="NormalRoughnessPanel" type="Panel" parent="Panel/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 280) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_lcvna") + +[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="HBoxContainer" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer"] +layout_mode = 2 + +[node name="NormalVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="NormalLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"] +layout_mode = 2 +text = "Normal texture" + +[node name="NormalHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"] +layout_mode = 2 + +[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"] +layout_mode = 2 +size_flags_vertical = 4 +theme_override_constants/margin_top = 10 + +[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer"] +custom_minimum_size = Vector2(110, 110) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf") + +[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 +expand_mode = 1 + +[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas") + +[node name="InvertGreenChannelCheckBox" type="CheckBox" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"] +layout_mode = 2 +text = "Convert DirectX to OpenGL" + +[node name="RoughnessVBox" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="RoughnessLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"] +layout_mode = 2 +text = "Roughness texture" + +[node name="RoughnessHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PickButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"] +layout_mode = 2 + +[node name="ClearButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"] +layout_mode = 2 +size_flags_vertical = 4 +theme_override_constants/margin_top = 10 + +[node name="Panel" type="Panel" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer"] +custom_minimum_size = Vector2(110, 110) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf") + +[node name="TextureRect" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +grow_horizontal = 2 +grow_vertical = 2 +expand_mode = 1 + +[node name="TextureButton" type="Button" parent="Panel/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas") + +[node name="NormalRoughnessHBox" type="HBoxContainer" parent="Panel/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="PackButton" type="Button" parent="Panel/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Pack textures as..." + +[node name="StatusLabel" type="Label" parent="Panel/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 10) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +text = "Use this to create a packed Albedo + Height texture and/or a packed Normal + Roughness texture. + +You can then use these textures with Terrain3D." +autowrap_mode = 2 diff --git a/addons/terrain_3d/editor/components/channel_packer_import_template.txt b/addons/terrain_3d/editor/components/channel_packer_import_template.txt new file mode 100644 index 0000000..e5da5eb --- /dev/null +++ b/addons/terrain_3d/editor/components/channel_packer_import_template.txt @@ -0,0 +1,32 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="$SOURCE_FILE" + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=2 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 \ No newline at end of file diff --git a/addons/terrain_3d/editor/components/gradient_operation_builder.gd b/addons/terrain_3d/editor/components/gradient_operation_builder.gd new file mode 100644 index 0000000..e92875f --- /dev/null +++ b/addons/terrain_3d/editor/components/gradient_operation_builder.gd @@ -0,0 +1,55 @@ +extends "res://addons/terrain_3d/editor/components/operation_builder.gd" + + +const PointPicker: Script = preload("res://addons/terrain_3d/editor/components/point_picker.gd") + + +func _get_point_picker() -> PointPicker: + return tool_settings.settings["gradient_points"] + + +func _get_brush_size() -> float: + return tool_settings.get_setting("size") + + +func _is_drawable() -> bool: + return tool_settings.get_setting("drawable") + + +func is_picking() -> bool: + return not _get_point_picker().all_points_selected() + + +func pick(p_global_position: Vector3, p_terrain: Terrain3D) -> void: + if not _get_point_picker().all_points_selected(): + _get_point_picker().add_point(p_global_position) + + +func is_ready() -> bool: + return _get_point_picker().all_points_selected() and not _is_drawable() + + +func apply_operation(p_editor: Terrain3DEditor, p_global_position: Vector3, p_camera_direction: float) -> void: + var points: PackedVector3Array = _get_point_picker().get_points() + assert(points.size() == 2) + assert(not _is_drawable()) + + var brush_size: float = _get_brush_size() + assert(brush_size > 0.0) + + var start: Vector3 = points[0] + var end: Vector3 = points[1] + + p_editor.start_operation(start) + + var dir: Vector3 = (end - start).normalized() + + var pos: Vector3 = start + while dir.dot(end - pos) > 0.0: + p_editor.operate(pos, p_camera_direction) + pos += dir * brush_size * 0.2 + + p_editor.stop_operation() + + _get_point_picker().clear() + diff --git a/addons/terrain_3d/editor/components/operation_builder.gd b/addons/terrain_3d/editor/components/operation_builder.gd new file mode 100644 index 0000000..ec3d51e --- /dev/null +++ b/addons/terrain_3d/editor/components/operation_builder.gd @@ -0,0 +1,23 @@ +extends RefCounted + + +const ToolSettings: Script = preload("res://addons/terrain_3d/editor/components/tool_settings.gd") + + +var tool_settings: ToolSettings + + +func is_picking() -> bool: + return false + + +func pick(p_global_position: Vector3, p_terrain: Terrain3D) -> void: + pass + + +func is_ready() -> bool: + return false + + +func apply_operation(editor: Terrain3DEditor, p_global_position: Vector3, p_camera_direction: float) -> void: + pass diff --git a/addons/terrain_3d/editor/components/point_picker.gd b/addons/terrain_3d/editor/components/point_picker.gd new file mode 100644 index 0000000..dbc1280 --- /dev/null +++ b/addons/terrain_3d/editor/components/point_picker.gd @@ -0,0 +1,91 @@ +extends HBoxContainer + + +signal pressed +signal value_changed + + +const ICON_PICKER: String = "res://addons/terrain_3d/icons/icon_picker.svg" +const ICON_PICKER_CHECKED: String = "res://addons/terrain_3d/icons/icon_picker_checked.svg" +const MAX_POINTS: int = 2 + + +var icon_picker: Texture2D +var icon_picker_checked: Texture2D +var points: PackedVector3Array +var picking_index: int = -1 + + +func _init() -> void: + icon_picker = load(ICON_PICKER) + icon_picker_checked = load(ICON_PICKER_CHECKED) + + var label := Label.new() + label.text = "Points:" + add_child(label) + + points.resize(MAX_POINTS) + + for i in range(MAX_POINTS): + var button := Button.new() + button.icon = icon_picker + button.tooltip_text = "Pick point on the Terrain" + button.set_meta(&"point_index", i) + button.pressed.connect(_on_button_pressed.bind(i)) + add_child(button) + + _update_buttons() + + +func _on_button_pressed(button_index: int) -> void: + points[button_index] = Vector3.ZERO + picking_index = button_index + _update_buttons() + pressed.emit() + + +func _update_buttons() -> void: + for child in get_children(): + if child is Button: + _update_button(child) + + +func _update_button(button: Button) -> void: + var index: int = button.get_meta(&"point_index") + + if points[index] != Vector3.ZERO: + button.icon = icon_picker_checked + else: + button.icon = icon_picker + + +func clear() -> void: + points.fill(Vector3.ZERO) + _update_buttons() + value_changed.emit() + + +func all_points_selected() -> bool: + return points.count(Vector3.ZERO) == 0 + + +func add_point(p_value: Vector3) -> void: + if points.has(p_value): + return + + # If manually selecting a point individually + if picking_index != -1: + points[picking_index] = p_value + picking_index = -1 + else: + # Else picking a sequence of points (non-drawable) + for i in range(MAX_POINTS): + if points[i] == Vector3.ZERO: + points[i] = p_value + break + _update_buttons() + value_changed.emit() + + +func get_points() -> PackedVector3Array: + return points diff --git a/addons/terrain_3d/editor/components/region_gizmo.gd b/addons/terrain_3d/editor/components/region_gizmo.gd new file mode 100644 index 0000000..af2a6cd --- /dev/null +++ b/addons/terrain_3d/editor/components/region_gizmo.gd @@ -0,0 +1,66 @@ +extends EditorNode3DGizmo + +var material: StandardMaterial3D +var selection_material: StandardMaterial3D +var region_position: Vector2 +var region_size: float +var grid: Array[Vector2i] +var use_secondary_color: bool = false +var show_rect: bool = true + +var main_color: Color = Color.GREEN_YELLOW +var secondary_color: Color = Color.RED +var grid_color: Color = Color.WHITE +var border_color: Color = Color.BLUE + + +func _init() -> void: + material = StandardMaterial3D.new() + material.set_flag(BaseMaterial3D.FLAG_DISABLE_DEPTH_TEST, true) + material.set_flag(BaseMaterial3D.FLAG_ALBEDO_FROM_VERTEX_COLOR, true) + material.set_shading_mode(BaseMaterial3D.SHADING_MODE_UNSHADED) + material.set_albedo(Color.WHITE) + + selection_material = material.duplicate() + selection_material.set_render_priority(0) + + +func _redraw() -> void: + clear() + + var rect_position = region_position * region_size + + if show_rect: + var modulate: Color = main_color if !use_secondary_color else secondary_color + if abs(region_position.x) > 8 or abs(region_position.y) > 8: + modulate = Color.GRAY + draw_rect(Vector2(region_size,region_size)*.5 + rect_position, region_size, selection_material, modulate) + + for pos in grid: + var grid_tile_position = Vector2(pos) * region_size + if show_rect and grid_tile_position == rect_position: + # Skip this one, otherwise focused region borders are not always visible due to draw order + continue + + draw_rect(Vector2(region_size,region_size)*.5 + grid_tile_position, region_size, material, grid_color) + + draw_rect(Vector2.ZERO, region_size * 16.0, material, border_color) + + +func draw_rect(p_pos: Vector2, p_size: float, p_material: StandardMaterial3D, p_modulate: Color) -> void: + var lines: PackedVector3Array = [ + Vector3(-1, 0, -1), + Vector3(-1, 0, 1), + Vector3(1, 0, 1), + Vector3(1, 0, -1), + Vector3(-1, 0, 1), + Vector3(1, 0, 1), + Vector3(1, 0, -1), + Vector3(-1, 0, -1), + ] + + for i in lines.size(): + lines[i] = ((lines[i] / 2.0) * p_size) + Vector3(p_pos.x, 0, p_pos.y) + + add_lines(lines, p_material, false, p_modulate) + diff --git a/addons/terrain_3d/editor/components/terrain_tools.gd b/addons/terrain_3d/editor/components/terrain_tools.gd new file mode 100644 index 0000000..e9fbbcc --- /dev/null +++ b/addons/terrain_3d/editor/components/terrain_tools.gd @@ -0,0 +1,71 @@ +extends HBoxContainer + + +const Baker: Script = preload("res://addons/terrain_3d/editor/components/baker.gd") +const Packer: Script = preload("res://addons/terrain_3d/editor/components/channel_packer.gd") + +var plugin: EditorPlugin +var menu_button: MenuButton = MenuButton.new() +var baker: Baker = Baker.new() +var packer: Packer = Packer.new() + +enum { + MENU_BAKE_ARRAY_MESH, + MENU_BAKE_OCCLUDER, + MENU_BAKE_NAV_MESH, + MENU_SEPARATOR, + MENU_SET_UP_NAVIGATION, + MENU_PACK_TEXTURES, +} + + +func _enter_tree() -> void: + baker.plugin = plugin + packer.plugin = plugin + + add_child(baker) + + menu_button.text = "Terrain3D Tools" + menu_button.get_popup().add_item("Bake ArrayMesh", MENU_BAKE_ARRAY_MESH) + menu_button.get_popup().add_item("Bake Occluder3D", MENU_BAKE_OCCLUDER) + menu_button.get_popup().add_item("Bake NavMesh", MENU_BAKE_NAV_MESH) + menu_button.get_popup().add_separator("", MENU_SEPARATOR) + menu_button.get_popup().add_item("Set up Navigation", MENU_SET_UP_NAVIGATION) + menu_button.get_popup().add_separator("", MENU_SEPARATOR) + menu_button.get_popup().add_item("Pack Textures", MENU_PACK_TEXTURES) + + menu_button.get_popup().id_pressed.connect(_on_menu_pressed) + menu_button.about_to_popup.connect(_on_menu_about_to_popup) + add_child(menu_button) + + +func _on_menu_pressed(p_id: int) -> void: + match p_id: + MENU_BAKE_ARRAY_MESH: + baker.bake_mesh_popup() + MENU_BAKE_OCCLUDER: + baker.bake_occluder_popup() + MENU_BAKE_NAV_MESH: + baker.bake_nav_mesh() + MENU_SET_UP_NAVIGATION: + baker.set_up_navigation_popup() + MENU_PACK_TEXTURES: + packer.pack_textures_popup() + + +func _on_menu_about_to_popup() -> void: + menu_button.get_popup().set_item_disabled(MENU_BAKE_ARRAY_MESH, not plugin.terrain) + menu_button.get_popup().set_item_disabled(MENU_BAKE_OCCLUDER, not plugin.terrain) + menu_button.get_popup().set_item_disabled(MENU_PACK_TEXTURES, not plugin.terrain) + + if plugin.terrain: + var nav_regions: Array[NavigationRegion3D] = baker.find_terrain_nav_regions(plugin.terrain) + menu_button.get_popup().set_item_disabled(MENU_BAKE_NAV_MESH, nav_regions.size() == 0) + menu_button.get_popup().set_item_disabled(MENU_SET_UP_NAVIGATION, nav_regions.size() != 0) + elif plugin.nav_region: + var terrains: Array[Terrain3D] = baker.find_nav_region_terrains(plugin.nav_region) + menu_button.get_popup().set_item_disabled(MENU_BAKE_NAV_MESH, terrains.size() == 0) + menu_button.get_popup().set_item_disabled(MENU_SET_UP_NAVIGATION, true) + else: + menu_button.get_popup().set_item_disabled(MENU_BAKE_NAV_MESH, true) + menu_button.get_popup().set_item_disabled(MENU_SET_UP_NAVIGATION, true) diff --git a/addons/terrain_3d/editor/components/texture_dock.gd b/addons/terrain_3d/editor/components/texture_dock.gd new file mode 100644 index 0000000..0d64dc9 --- /dev/null +++ b/addons/terrain_3d/editor/components/texture_dock.gd @@ -0,0 +1,284 @@ +extends PanelContainer + + +signal resource_changed(resource: Resource, index: int) +signal resource_inspected(resource: Resource) +signal resource_selected + +var list: ListContainer +var entries: Array[ListEntry] +var selected_index: int = 0 + + +func _init() -> void: + list = ListContainer.new() + + var root: VBoxContainer = VBoxContainer.new() + var scroll: ScrollContainer = ScrollContainer.new() + var label: Label = Label.new() + + label.set_text("Textures") + label.set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER) + label.set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER) + scroll.set_v_size_flags(SIZE_EXPAND_FILL) + scroll.set_h_size_flags(SIZE_EXPAND_FILL) + list.set_v_size_flags(SIZE_EXPAND_FILL) + list.set_h_size_flags(SIZE_EXPAND_FILL) + + scroll.add_child(list) + root.add_child(label) + root.add_child(scroll) + add_child(root) + + set_custom_minimum_size(Vector2(256, 448)) + + +func _ready() -> void: + get_child(0).get_child(0).set("theme_override_styles/normal", get_theme_stylebox("bg", "EditorInspectorCategory")) + get_child(0).get_child(0).set("theme_override_fonts/font", get_theme_font("bold", "EditorFonts")) + get_child(0).get_child(0).set("theme_override_font_sizes/font_size",get_theme_font_size("bold_size", "EditorFonts")) + set("theme_override_styles/panel", get_theme_stylebox("panel", "Panel")) + + +func clear() -> void: + for i in entries: + i.get_parent().remove_child(i) + i.queue_free() + entries.clear() + + +func add_item(p_resource: Resource = null) -> void: + var entry: ListEntry = ListEntry.new() + var index: int = entries.size() + + entry.set_edited_resource(p_resource) + entry.selected.connect(set_selected_index.bind(index)) + entry.inspected.connect(notify_resource_inspected) + entry.changed.connect(notify_resource_changed.bind(index)) + + if p_resource: + entry.set_selected(index == selected_index) + if not p_resource.id_changed.is_connected(set_selected_after_swap): + p_resource.id_changed.connect(set_selected_after_swap) + + list.add_child(entry) + entries.push_back(entry) + + +func set_selected_after_swap(p_old_index: int, p_new_index: int) -> void: + set_selected_index(clamp(p_new_index, 0, entries.size() - 2)) + + +func set_selected_index(p_index: int) -> void: + selected_index = p_index + emit_signal("resource_selected") + + for i in entries.size(): + var entry: ListEntry = entries[i] + entry.set_selected(i == selected_index) + + +func get_selected_index() -> int: + return selected_index + + +func notify_resource_inspected(p_resource: Resource) -> void: + emit_signal("resource_inspected", p_resource) + + +func notify_resource_changed(p_resource: Resource, p_index: int) -> void: + emit_signal("resource_changed", p_resource, p_index) + if !p_resource: + var last_offset: int = 2 + if p_index == entries.size()-2: + last_offset = 3 + selected_index = clamp(selected_index, 0, entries.size() - last_offset) + + +############################################################## +## class ListContainer +############################################################## + + +class ListContainer extends Container: + var height: float = 0 + + func _notification(p_what) -> void: + if p_what == NOTIFICATION_SORT_CHILDREN: + height = 0 + var index: int = 0 + var separation: float = 4 + for c in get_children(): + if is_instance_valid(c): + var width: float = size.x / 3 + c.size = Vector2(width,width) - Vector2(separation, separation) + c.position = Vector2(index % 3, index / 3) * width + Vector2(separation/3, separation/3) + height = max(height, c.position.y + width) + index += 1 + + func _get_minimum_size() -> Vector2: + return Vector2(0, height) + + +############################################################## +## class ListEntry +############################################################## + + +class ListEntry extends VBoxContainer: + signal selected() + signal changed(resource: Terrain3DTexture) + signal inspected(resource: Terrain3DTexture) + + var resource: Terrain3DTexture + var drop_data: bool = false + var is_hovered: bool = false + var is_selected: bool = false + + var button_clear: TextureButton + var button_edit: TextureButton + var name_label: Label + + @onready var add_icon: Texture2D = get_theme_icon("Add", "EditorIcons") + @onready var clear_icon: Texture2D = get_theme_icon("Close", "EditorIcons") + @onready var edit_icon: Texture2D = get_theme_icon("Edit", "EditorIcons") + @onready var background: StyleBox = get_theme_stylebox("pressed", "Button") + @onready var focus: StyleBox = get_theme_stylebox("focus", "Button") + + + func _ready() -> void: + var icon_size: Vector2 = Vector2(12, 12) + + button_clear = TextureButton.new() + button_clear.set_texture_normal(clear_icon) + button_clear.set_custom_minimum_size(icon_size) + button_clear.set_h_size_flags(Control.SIZE_SHRINK_END) + button_clear.set_visible(resource != null) + button_clear.pressed.connect(clear) + add_child(button_clear) + + button_edit = TextureButton.new() + button_edit.set_texture_normal(edit_icon) + button_edit.set_custom_minimum_size(icon_size) + button_edit.set_h_size_flags(Control.SIZE_SHRINK_END) + button_edit.set_visible(resource != null) + button_edit.pressed.connect(edit) + add_child(button_edit) + + name_label = Label.new() + add_child(name_label, true) + name_label.visible = false + name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + name_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM + name_label.size_flags_vertical = Control.SIZE_EXPAND_FILL + name_label.add_theme_color_override("font_shadow_color", Color.BLACK) + name_label.add_theme_constant_override("shadow_offset_x", 1) + name_label.add_theme_constant_override("shadow_offset_y", 1) + name_label.add_theme_font_size_override("font_size", 15) + name_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + name_label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS + name_label.text = "Add New" + + + func _notification(p_what) -> void: + match p_what: + NOTIFICATION_DRAW: + var rect: Rect2 = Rect2(Vector2.ZERO, get_size()) + if !resource: + draw_style_box(background, rect) + draw_texture(add_icon, (get_size() / 2) - (add_icon.get_size() / 2)) + else: + name_label.text = resource.get_name() + self_modulate = resource.get_albedo_color() + var texture: Texture2D = resource.get_albedo_texture() + if texture: + draw_texture_rect(texture, rect, false) + texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST_WITH_MIPMAPS + name_label.add_theme_font_size_override("font_size", 4 + rect.size.x/10) + if drop_data: + draw_style_box(focus, rect) + if is_hovered: + draw_rect(rect, Color(1,1,1,0.2)) + if is_selected: + draw_style_box(focus, rect) + NOTIFICATION_MOUSE_ENTER: + is_hovered = true + name_label.visible = true + queue_redraw() + NOTIFICATION_MOUSE_EXIT: + is_hovered = false + name_label.visible = false + drop_data = false + queue_redraw() + + + func _gui_input(p_event: InputEvent) -> void: + if p_event is InputEventMouseButton: + if p_event.is_pressed(): + match p_event.get_button_index(): + MOUSE_BUTTON_LEFT: + # If `Add new` is clicked + if !resource: + set_edited_resource(Terrain3DTexture.new(), false) + edit() + else: + emit_signal("selected") + MOUSE_BUTTON_RIGHT: + if resource: + edit() + MOUSE_BUTTON_MIDDLE: + if resource: + clear() + + + func _can_drop_data(p_at_position: Vector2, p_data: Variant) -> bool: + drop_data = false + if typeof(p_data) == TYPE_DICTIONARY: + if p_data.files.size() == 1: + queue_redraw() + drop_data = true + return drop_data + + + func _drop_data(p_at_position: Vector2, p_data: Variant) -> void: + if typeof(p_data) == TYPE_DICTIONARY: + var res: Resource = load(p_data.files[0]) + if res is Terrain3DTexture: + set_edited_resource(res, false) + if res is Texture2D: + var surf: Terrain3DTexture = Terrain3DTexture.new() + surf.set_albedo_texture(res) + set_edited_resource(surf, false) + + + func set_edited_resource(p_res: Terrain3DTexture, p_no_signal: bool = true) -> void: + resource = p_res + if resource: + resource.setting_changed.connect(_on_texture_changed) + resource.file_changed.connect(_on_texture_changed) + + if button_clear: + button_clear.set_visible(resource != null) + + queue_redraw() + if !p_no_signal: + emit_signal("changed", resource) + + + func _on_texture_changed() -> void: + emit_signal("changed", resource) + + + func set_selected(value: bool) -> void: + is_selected = value + queue_redraw() + + + func clear() -> void: + if resource: + set_edited_resource(null, false) + + + func edit() -> void: + emit_signal("selected") + emit_signal("inspected", resource) diff --git a/addons/terrain_3d/editor/components/tool_settings.gd b/addons/terrain_3d/editor/components/tool_settings.gd new file mode 100644 index 0000000..1bfed2e --- /dev/null +++ b/addons/terrain_3d/editor/components/tool_settings.gd @@ -0,0 +1,460 @@ +extends PanelContainer + +signal picking(type, callback) +signal setting_changed + +enum Layout { + HORIZONTAL, + VERTICAL, + GRID, +} + +enum SettingType { + CHECKBOX, + SLIDER, + DOUBLE_SLIDER, + COLOR_SELECT, + PICKER, + POINT_PICKER, +} + +const PointPicker: Script = preload("res://addons/terrain_3d/editor/components/point_picker.gd") +const DEFAULT_BRUSH: String = "circle0.exr" +const BRUSH_PATH: String = "res://addons/terrain_3d/editor/brushes" +const PICKER_ICON: String = "res://addons/terrain_3d/icons/icon_picker.svg" + +const NONE: int = 0x0 +const ALLOW_LARGER: int = 0x1 +const ALLOW_SMALLER: int = 0x2 +const ALLOW_OUT_OF_BOUNDS: int = 0x3 + +var brush_preview_material: ShaderMaterial + +var list: HBoxContainer +var advanced_list: VBoxContainer +var settings: Dictionary = {} + + +func _ready() -> void: + list = HBoxContainer.new() + add_child(list, true) + + add_brushes(list) + + add_setting(SettingType.SLIDER, "size", 50, list, "m", 4, 200, 1, ALLOW_LARGER) + add_setting(SettingType.SLIDER, "opacity", 10, list, "%", 1, 100) + add_setting(SettingType.CHECKBOX, "enable", true, list) + + add_setting(SettingType.COLOR_SELECT, "color", Color.WHITE, list) + add_setting(SettingType.PICKER, "color picker", Terrain3DEditor.COLOR, list) + + add_setting(SettingType.SLIDER, "roughness", 0, list, "%", -100, 100, 1) + add_setting(SettingType.PICKER, "roughness picker", Terrain3DEditor.ROUGHNESS, list) + + add_setting(SettingType.SLIDER, "height", 50, list, "m", -500, 500, 0.1, ALLOW_OUT_OF_BOUNDS) + add_setting(SettingType.PICKER, "height picker", Terrain3DEditor.HEIGHT, list) + add_setting(SettingType.DOUBLE_SLIDER, "slope", 0, list, "°", 0, 180, 1) + + add_setting(SettingType.POINT_PICKER, "gradient_points", Terrain3DEditor.HEIGHT, list) + add_setting(SettingType.CHECKBOX, "drawable", false, list) + + settings["drawable"].toggled.connect(_on_drawable_toggled) + + var spacer: Control = Control.new() + spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL + list.add_child(spacer, true) + + ## Advanced Settings Menu + advanced_list = create_submenu(list, "Advanced", Layout.VERTICAL) + add_setting(SettingType.CHECKBOX, "automatic_regions", true, advanced_list) + add_setting(SettingType.CHECKBOX, "align_to_view", true, advanced_list) + add_setting(SettingType.CHECKBOX, "show_cursor_while_painting", true, advanced_list) + advanced_list.add_child(HSeparator.new(), true) + add_setting(SettingType.SLIDER, "gamma", 1.0, advanced_list, "γ", 0.1, 2.0, 0.01) + add_setting(SettingType.SLIDER, "jitter", 50, advanced_list, "%", 0, 100) + + +func create_submenu(p_parent: Control, p_button_name: String, p_layout: Layout) -> Container: + var menu_button: Button = Button.new() + menu_button.set_text(p_button_name) + menu_button.set_toggle_mode(true) + menu_button.set_v_size_flags(SIZE_SHRINK_CENTER) + menu_button.connect("toggled", _on_show_submenu.bind(menu_button)) + + var submenu: PopupPanel = PopupPanel.new() + submenu.connect("popup_hide", menu_button.set_pressed_no_signal.bind(false)) + submenu.set("theme_override_styles/panel", get_theme_stylebox("panel", "PopupMenu")) + + var sublist: Container + match(p_layout): + Layout.GRID: + sublist = GridContainer.new() + Layout.VERTICAL: + sublist = VBoxContainer.new() + Layout.HORIZONTAL, _: + sublist = HBoxContainer.new() + + p_parent.add_child(menu_button, true) + menu_button.add_child(submenu, true) + submenu.add_child(sublist, true) + + return sublist + + +func _on_show_submenu(p_toggled: bool, p_button: Button) -> void: + var popup: PopupPanel = p_button.get_child(0) + var popup_pos: Vector2 = p_button.get_screen_transform().origin + popup.set_visible(p_toggled) + popup_pos.y -= popup.get_size().y + popup.set_position(popup_pos) + + +func add_brushes(p_parent: Control) -> void: + var brush_list: GridContainer = create_submenu(p_parent, "Brush", Layout.GRID) + brush_list.name = "BrushList" + + var brush_button_group: ButtonGroup = ButtonGroup.new() + brush_button_group.connect("pressed", _on_setting_changed) + var default_brush_btn: Button + + var dir: DirAccess = DirAccess.open(BRUSH_PATH) + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if !dir.current_is_dir() and file_name.ends_with(".exr"): + var img: Image = Image.load_from_file(BRUSH_PATH + "/" + file_name) + _black_to_alpha(img) + var tex: ImageTexture = ImageTexture.create_from_image(img) + + var btn: Button = Button.new() + btn.set_custom_minimum_size(Vector2.ONE * 100) + btn.set_button_icon(tex) + btn.set_meta("image", img) + btn.set_expand_icon(true) + btn.set_material(_get_brush_preview_material()) + btn.set_toggle_mode(true) + btn.set_button_group(brush_button_group) + btn.mouse_entered.connect(_on_brush_hover.bind(true, btn)) + btn.mouse_exited.connect(_on_brush_hover.bind(false, btn)) + brush_list.add_child(btn, true) + if file_name == DEFAULT_BRUSH: + default_brush_btn = btn + + var lbl: Label = Label.new() + btn.add_child(lbl, true) + lbl.text = file_name.get_basename() + lbl.visible = false + lbl.position.y = 70 + lbl.add_theme_color_override("font_shadow_color", Color.BLACK) + lbl.add_theme_constant_override("shadow_offset_x", 1) + lbl.add_theme_constant_override("shadow_offset_y", 1) + lbl.add_theme_font_size_override("font_size", 16) + + file_name = dir.get_next() + + brush_list.columns = sqrt(brush_list.get_child_count()) + 2 + + if not default_brush_btn: + default_brush_btn = brush_button_group.get_buttons()[0] + default_brush_btn.set_pressed(true) + + settings["brush"] = brush_button_group + + # Optionally erase the main brush button text and replace it with the texture +# var select_brush_btn: Button = brush_list.get_parent().get_parent() +# select_brush_btn.set_button_icon(default_brush_btn.get_button_icon()) +# select_brush_btn.set_custom_minimum_size(Vector2.ONE * 36) +# select_brush_btn.set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER) +# select_brush_btn.set_expand_icon(true) + + +func _on_brush_hover(p_hovering: bool, p_button: Button) -> void: + if p_button.get_child_count() > 0: + var child = p_button.get_child(0) + if child is Label: + if p_hovering: + child.visible = true + else: + child.visible = false + + +func _on_pick(p_type: Terrain3DEditor.Tool) -> void: + emit_signal("picking", p_type, _on_picked) + + +func _on_picked(p_type: Terrain3DEditor.Tool, p_color: Color, p_global_position: Vector3) -> void: + match p_type: + Terrain3DEditor.HEIGHT: + settings["height"].value = p_color.r + Terrain3DEditor.COLOR: + settings["color"].color = p_color + Terrain3DEditor.ROUGHNESS: + # 200... -.5 converts 0,1 to -100,100 + settings["roughness"].value = round(200 * (p_color.a - 0.5)) + _on_setting_changed() + + +func _on_point_pick(p_type: Terrain3DEditor.Tool, p_name: String) -> void: + assert(p_type == Terrain3DEditor.HEIGHT) + emit_signal("picking", p_type, _on_point_picked.bind(p_name)) + + +func _on_point_picked(p_type: Terrain3DEditor.Tool, p_color: Color, p_global_position: Vector3, p_name: String) -> void: + assert(p_type == Terrain3DEditor.HEIGHT) + + var point: Vector3 = p_global_position + point.y = p_color.r + settings[p_name].add_point(point) + _on_setting_changed() + + +func add_setting(p_type: SettingType, p_name: StringName, p_value: Variant, p_parent: Control, + p_suffix: String = "", p_min_value: float = 0.0, p_max_value: float = 0.0, p_step: float = 1.0, + p_flags: int = NONE) -> void: + + var container: HBoxContainer = HBoxContainer.new() + var label: Label = Label.new() + var control: Control + + container.set_v_size_flags(SIZE_EXPAND_FILL) + + match p_type: + SettingType.SLIDER, SettingType.DOUBLE_SLIDER: + label.set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER) + label.set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER) + label.set_custom_minimum_size(Vector2(32, 0)) + label.set_v_size_flags(SIZE_SHRINK_CENTER) + label.set_text(p_name.capitalize() + ": ") + container.add_child(label, true) + + var slider: Control + if p_type == SettingType.SLIDER: + control = EditorSpinSlider.new() + control.set_flat(true) + control.set_hide_slider(true) + control.connect("value_changed", _on_setting_changed) + control.set_max(p_max_value) + control.set_min(p_min_value) + control.set_step(p_step) + control.set_value(p_value) + control.set_suffix(p_suffix) + control.set_v_size_flags(SIZE_SHRINK_CENTER) + + slider = HSlider.new() + slider.share(control) + if p_flags & ALLOW_LARGER: + slider.set_allow_greater(true) + if p_flags & ALLOW_SMALLER: + slider.set_allow_lesser(true) + + else: + control = Label.new() + control.set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER) + control.set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER) + slider = DoubleSlider.new() + slider.label = control + slider.suffix = p_suffix + slider.connect("value_changed", _on_setting_changed) + + control.set_custom_minimum_size(Vector2(75, 0)) + slider.set_max(p_max_value) + slider.set_min(p_min_value) + slider.set_step(p_step) + slider.set_value(p_value) + slider.set_v_size_flags(SIZE_SHRINK_CENTER) + slider.set_h_size_flags(SIZE_SHRINK_END | SIZE_EXPAND) + slider.set_custom_minimum_size(Vector2(100, 10)) + + container.add_child(slider, true) + + SettingType.CHECKBOX: + control = CheckBox.new() + control.set_text(p_name.capitalize()) + control.set_pressed_no_signal(p_value) + control.connect("pressed", _on_setting_changed) + + SettingType.COLOR_SELECT: + control = ColorPickerButton.new() + control.set_custom_minimum_size(Vector2(100, 10)) + control.color = Color.WHITE + control.edit_alpha = false + control.get_picker().set_color_mode(ColorPicker.MODE_HSV) + control.connect("color_changed", _on_setting_changed) + + SettingType.PICKER: + control = Button.new() + control.icon = load(PICKER_ICON) + control.tooltip_text = "Pick value from the Terrain" + control.connect("pressed", _on_pick.bind(p_value)) + + SettingType.POINT_PICKER: + control = PointPicker.new() + control.connect("pressed", _on_point_pick.bind(p_value, p_name)) + control.connect("value_changed", _on_setting_changed) + + container.add_child(control, true) + p_parent.add_child(container, true) + + settings[p_name] = control + + +func get_setting(p_setting: String) -> Variant: + var object: Object = settings[p_setting] + var value: Variant + if object is Range: + value = object.get_value() + elif object is DoubleSlider: + value = [object.get_min_value(), object.get_max_value()] + elif object is ButtonGroup: + var img: Image = object.get_pressed_button().get_meta("image") + var tex: Texture2D = object.get_pressed_button().get_button_icon() + value = [ img, tex ] + elif object is CheckBox: + value = object.is_pressed() + elif object is ColorPickerButton: + value = object.color + elif object is PointPicker: + value = object.get_points() + return value + + +func hide_settings(p_settings: PackedStringArray) -> void: + for setting in settings.keys(): + var object: Object = settings[setting] + if object is Control: + object.get_parent().show() + + for setting in p_settings: + if settings.has(setting): + var object: Object = settings[setting] + if object is Control: + object.get_parent().hide() + + +func _on_setting_changed(p_data: Variant = null) -> void: + # If a button was clicked on a submenu + if p_data is Button and p_data.get_parent().get_parent() is PopupPanel: + if p_data.get_parent().name == "BrushList": + # Optionally Set selected brush texture in main brush button +# p_data.get_parent().get_parent().get_parent().set_button_icon(p_data.get_button_icon()) + # Hide popup + p_data.get_parent().get_parent().set_visible(false) + # Hide label + if p_data.get_child_count() > 0: + p_data.get_child(0).visible = false + + emit_signal("setting_changed") + + +func _on_drawable_toggled(p_button_pressed: bool) -> void: + if not p_button_pressed: + settings["gradient_points"].clear() + + +func _get_brush_preview_material() -> ShaderMaterial: + if !brush_preview_material: + brush_preview_material = ShaderMaterial.new() + + var shader: Shader = Shader.new() + var code: String = "shader_type canvas_item;\n" + + code += "varying vec4 v_vertex_color;\n" + code += "void vertex() {\n" + code += " v_vertex_color = COLOR;\n" + code += "}\n" + code += "void fragment(){\n" + code += " vec4 tex = texture(TEXTURE, UV);\n" + code += " COLOR.a *= pow(tex.r, 0.666);\n" + code += " COLOR.rgb = v_vertex_color.rgb;\n" + code += "}\n" + + shader.set_code(code) + + brush_preview_material.set_shader(shader) + + return brush_preview_material + + +func _black_to_alpha(p_image: Image) -> void: + if p_image.get_format() != Image.FORMAT_RGBAF: + p_image.convert(Image.FORMAT_RGBAF) + + for y in p_image.get_height(): + for x in p_image.get_width(): + var color: Color = p_image.get_pixel(x,y) + color.a = color.get_luminance() + p_image.set_pixel(x, y, color) + + +#### Sub Class DoubleSlider + +class DoubleSlider extends Range: + + var label: Label + var suffix: String + var grabbed: bool = false + var _max_value: float + + + func _gui_input(p_event: InputEvent) -> void: + if p_event is InputEventMouseButton: + if p_event.get_button_index() == MOUSE_BUTTON_LEFT: + grabbed = p_event.is_pressed() + set_min_max(p_event.get_position().x) + + if p_event is InputEventMouseMotion: + if grabbed: + set_min_max(p_event.get_position().x) + + + func _notification(p_what: int) -> void: + if p_what == NOTIFICATION_RESIZED: + pass + if p_what == NOTIFICATION_DRAW: + var bg: StyleBox = get_theme_stylebox("slider", "HSlider") + var bg_height: float = bg.get_minimum_size().y + draw_style_box(bg, Rect2(Vector2(0, (size.y - bg_height) / 2), Vector2(size.x, bg_height))) + + var grabber: Texture2D = get_theme_icon("grabber", "HSlider") + var area: StyleBox = get_theme_stylebox("grabber_area", "HSlider") + var h: float = size.y / 2 - grabber.get_size().y / 2 + + var minpos: Vector2 = Vector2((min_value / _max_value) * size.x - grabber.get_size().x / 2, h) + var maxpos: Vector2 = Vector2((max_value / _max_value) * size.x - grabber.get_size().x / 2, h) + + draw_style_box(area, Rect2(Vector2(minpos.x + grabber.get_size().x / 2, (size.y - bg_height) / 2), Vector2(maxpos.x - minpos.x, bg_height))) + + draw_texture(grabber, minpos) + draw_texture(grabber, maxpos) + + + func set_max(p_value: float) -> void: + max_value = p_value + if _max_value == 0: + _max_value = max_value + update_label() + + + func set_min_max(p_xpos: float) -> void: + var mid_value_normalized: float = ((max_value + min_value) / 2.0) / _max_value + var mid_value: float = size.x * mid_value_normalized + var min_active: bool = p_xpos < mid_value + var xpos_ranged: float = snappedf((p_xpos / size.x) * _max_value, step) + + if min_active: + min_value = xpos_ranged + else: + max_value = xpos_ranged + + min_value = clamp(min_value, 0, max_value - 10) + max_value = clamp(max_value, min_value + 10, _max_value) + + update_label() + emit_signal("setting_changed", value) + queue_redraw() + + + func update_label() -> void: + if label: + label.set_text(str(min_value) + suffix + "/" + str(max_value) + suffix) diff --git a/addons/terrain_3d/editor/components/toolbar.gd b/addons/terrain_3d/editor/components/toolbar.gd new file mode 100644 index 0000000..c8ac76b --- /dev/null +++ b/addons/terrain_3d/editor/components/toolbar.gd @@ -0,0 +1,74 @@ +extends VBoxContainer + + +signal tool_changed(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation) + +const ICON_REGION_ADD: String = "res://addons/terrain_3d/icons/icon_map_add.svg" +const ICON_REGION_REMOVE: String = "res://addons/terrain_3d/icons/icon_map_remove.svg" +const ICON_HEIGHT_ADD: String = "res://addons/terrain_3d/icons/icon_height_add.svg" +const ICON_HEIGHT_SUB: String = "res://addons/terrain_3d/icons/icon_height_sub.svg" +const ICON_HEIGHT_MUL: String = "res://addons/terrain_3d/icons/icon_height_mul.svg" +const ICON_HEIGHT_DIV: String = "res://addons/terrain_3d/icons/icon_height_div.svg" +const ICON_HEIGHT_FLAT: String = "res://addons/terrain_3d/icons/icon_height_flat.svg" +const ICON_HEIGHT_SLOPE: String = "res://addons/terrain_3d/icons/icon_height_slope.svg" +const ICON_HEIGHT_SMOOTH: String = "res://addons/terrain_3d/icons/icon_height_smooth.svg" +const ICON_PAINT_TEXTURE: String = "res://addons/terrain_3d/icons/icon_brush.svg" +const ICON_SPRAY_TEXTURE: String = "res://addons/terrain_3d/icons/icon_spray.svg" +const ICON_COLOR: String = "res://addons/terrain_3d/icons/icon_color.svg" +const ICON_WETNESS: String = "res://addons/terrain_3d/icons/icon_wetness.svg" +const ICON_AUTOSHADER: String = "res://addons/terrain_3d/icons/icon_terrain_material.svg" +const ICON_HOLES: String = "res://addons/terrain_3d/icons/icon_holes.svg" +const ICON_NAVIGATION: String = "res://addons/terrain_3d/icons/icon_navigation.svg" + +var tool_group: ButtonGroup = ButtonGroup.new() + + +func _init() -> void: + set_custom_minimum_size(Vector2(32, 0)) + + +func _ready() -> void: + tool_group.connect("pressed", _on_tool_selected) + + add_tool_button(Terrain3DEditor.REGION, Terrain3DEditor.ADD, "Add Region", load(ICON_REGION_ADD), tool_group) + add_tool_button(Terrain3DEditor.REGION, Terrain3DEditor.SUBTRACT, "Delete Region", load(ICON_REGION_REMOVE), tool_group) + add_child(HSeparator.new()) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.ADD, "Raise", load(ICON_HEIGHT_ADD), tool_group) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.SUBTRACT, "Lower", load(ICON_HEIGHT_SUB), tool_group) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.MULTIPLY, "Expand (Away from 0)", load(ICON_HEIGHT_MUL), tool_group) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.DIVIDE, "Reduce (Towards 0)", load(ICON_HEIGHT_DIV), tool_group) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.REPLACE, "Flatten", load(ICON_HEIGHT_FLAT), tool_group) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.GRADIENT, "Slope", load(ICON_HEIGHT_SLOPE), tool_group) + add_tool_button(Terrain3DEditor.HEIGHT, Terrain3DEditor.AVERAGE, "Smooth", load(ICON_HEIGHT_SMOOTH), tool_group) + add_child(HSeparator.new()) + add_tool_button(Terrain3DEditor.TEXTURE, Terrain3DEditor.REPLACE, "Paint Base Texture", load(ICON_PAINT_TEXTURE), tool_group) + add_tool_button(Terrain3DEditor.TEXTURE, Terrain3DEditor.ADD, "Spray Overlay Texture", load(ICON_SPRAY_TEXTURE), tool_group) + add_tool_button(Terrain3DEditor.AUTOSHADER, Terrain3DEditor.REPLACE, "Autoshader", load(ICON_AUTOSHADER), tool_group) + add_child(HSeparator.new()) + add_tool_button(Terrain3DEditor.COLOR, Terrain3DEditor.REPLACE, "Paint Color", load(ICON_COLOR), tool_group) + add_tool_button(Terrain3DEditor.ROUGHNESS, Terrain3DEditor.REPLACE, "Paint Wetness", load(ICON_WETNESS), tool_group) + add_child(HSeparator.new()) + add_tool_button(Terrain3DEditor.HOLES, Terrain3DEditor.REPLACE, "Create Holes", load(ICON_HOLES), tool_group) + add_tool_button(Terrain3DEditor.NAVIGATION, Terrain3DEditor.REPLACE, "Paint Navigable Area", load(ICON_NAVIGATION), tool_group) + + var buttons: Array[BaseButton] = tool_group.get_buttons() + buttons[0].set_pressed(true) + + +func add_tool_button(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation, + p_tip: String, p_icon: Texture2D, p_group: ButtonGroup) -> void: + + var button: Button = Button.new() + button.set_meta("Tool", p_tool) + button.set_meta("Operation", p_operation) + button.set_tooltip_text(p_tip) + button.set_button_icon(p_icon) + button.set_button_group(p_group) + button.set_flat(true) + button.set_toggle_mode(true) + button.set_h_size_flags(SIZE_SHRINK_END) + add_child(button) + + +func _on_tool_selected(p_button: BaseButton) -> void: + emit_signal("tool_changed", p_button.get_meta("Tool", -1), p_button.get_meta("Operation", -1)) diff --git a/addons/terrain_3d/editor/components/ui.gd b/addons/terrain_3d/editor/components/ui.gd new file mode 100644 index 0000000..0987c2a --- /dev/null +++ b/addons/terrain_3d/editor/components/ui.gd @@ -0,0 +1,379 @@ +extends Node +#class_name Terrain3DUI Cannot be named until Godot #75388 + + +# Includes +const Toolbar: Script = preload("res://addons/terrain_3d/editor/components/toolbar.gd") +const ToolSettings: Script = preload("res://addons/terrain_3d/editor/components/tool_settings.gd") +const TerrainTools: Script = preload("res://addons/terrain_3d/editor/components/terrain_tools.gd") +const OperationBuilder: Script = preload("res://addons/terrain_3d/editor/components/operation_builder.gd") +const GradientOperationBuilder: Script = preload("res://addons/terrain_3d/editor/components/gradient_operation_builder.gd") +const RING1: String = "res://addons/terrain_3d/editor/brushes/ring1.exr" +const COLOR_RAISE := Color.WHITE +const COLOR_LOWER := Color.BLACK +const COLOR_SMOOTH := Color(0.5, 0, .1) +const COLOR_EXPAND := Color.ORANGE +const COLOR_REDUCE := Color.BLUE_VIOLET +const COLOR_FLATTEN := Color(0., 0.32, .4) +const COLOR_SLOPE := Color.YELLOW +const COLOR_PAINT := Color.FOREST_GREEN +const COLOR_SPRAY := Color.SEA_GREEN +const COLOR_ROUGHNESS := Color.ROYAL_BLUE +const COLOR_AUTOSHADER := Color.DODGER_BLUE +const COLOR_HOLES := Color.BLACK +const COLOR_NAVIGATION := Color.REBECCA_PURPLE +const COLOR_PICK_COLOR := Color.WHITE +const COLOR_PICK_HEIGHT := Color.DARK_RED +const COLOR_PICK_ROUGH := Color.ROYAL_BLUE + + +var plugin: EditorPlugin # Actually Terrain3DEditorPlugin, but Godot still has CRC errors +var toolbar: Toolbar +var toolbar_settings: ToolSettings +var terrain_tools: TerrainTools +var setting_has_changed: bool = false +var visible: bool = false +var picking: int = Terrain3DEditor.TOOL_MAX +var picking_callback: Callable +var decal: Decal +var decal_timer: Timer +var gradient_decals: Array[Decal] +var brush_data: Dictionary +var operation_builder: OperationBuilder +@onready var picker_texture: ImageTexture = ImageTexture.create_from_image(Image.load_from_file(RING1)) + + +func _enter_tree() -> void: + toolbar = Toolbar.new() + toolbar.hide() + toolbar.connect("tool_changed", _on_tool_changed) + + toolbar_settings = ToolSettings.new() + toolbar_settings.connect("setting_changed", _on_setting_changed) + toolbar_settings.connect("picking", _on_picking) + toolbar_settings.hide() + + terrain_tools = TerrainTools.new() + terrain_tools.plugin = plugin + terrain_tools.hide() + + plugin.add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_LEFT, toolbar) + plugin.add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_BOTTOM, toolbar_settings) + plugin.add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_MENU, terrain_tools) + + decal = Decal.new() + add_child(decal) + decal_timer = Timer.new() + decal_timer.wait_time = .5 + decal_timer.one_shot = true + decal_timer.timeout.connect(Callable(func(node): + if node: + get_tree().create_tween().tween_property(node, "albedo_mix", 0.0, 0.15)).bind(decal)) + add_child(decal_timer) + + +func _exit_tree() -> void: + plugin.remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_LEFT, toolbar) + plugin.remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_BOTTOM, toolbar_settings) + toolbar.queue_free() + toolbar_settings.queue_free() + terrain_tools.queue_free() + decal.queue_free() + decal_timer.queue_free() + for gradient_decal in gradient_decals: + gradient_decal.queue_free() + gradient_decals.clear() + + +func set_visible(p_visible: bool) -> void: + visible = p_visible + toolbar.set_visible(p_visible and plugin.terrain) + terrain_tools.set_visible(p_visible) + + if p_visible and plugin.terrain: + p_visible = plugin.editor.get_tool() != Terrain3DEditor.REGION + toolbar_settings.set_visible(p_visible and plugin.terrain) + update_decal() + + +func _on_tool_changed(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation) -> void: + clear_picking() + + if not visible or not plugin.terrain: + return + + if plugin.editor: + plugin.editor.set_tool(p_tool) + plugin.editor.set_operation(p_operation) + + if p_tool != Terrain3DEditor.REGION: + # Select which settings to hide. Options: + # size, opactiy, height, slope, color, roughness, (height|color|roughness) picker + var to_hide: PackedStringArray = [] + + if p_tool == Terrain3DEditor.HEIGHT: + to_hide.push_back("color") + to_hide.push_back("color picker") + to_hide.push_back("roughness") + to_hide.push_back("roughness picker") + to_hide.push_back("slope") + to_hide.push_back("enable") + if p_operation != Terrain3DEditor.REPLACE: + to_hide.push_back("height") + to_hide.push_back("height picker") + if p_operation != Terrain3DEditor.GRADIENT: + to_hide.push_back("gradient_points") + to_hide.push_back("drawable") + + elif p_tool == Terrain3DEditor.TEXTURE: + to_hide.push_back("height") + to_hide.push_back("height picker") + to_hide.push_back("gradient_points") + to_hide.push_back("drawable") + to_hide.push_back("color") + to_hide.push_back("color picker") + to_hide.push_back("roughness") + to_hide.push_back("roughness picker") + to_hide.push_back("slope") + to_hide.push_back("enable") + if p_operation == Terrain3DEditor.REPLACE: + to_hide.push_back("opacity") + + elif p_tool == Terrain3DEditor.COLOR: + to_hide.push_back("height") + to_hide.push_back("height picker") + to_hide.push_back("gradient_points") + to_hide.push_back("drawable") + to_hide.push_back("roughness") + to_hide.push_back("roughness picker") + to_hide.push_back("slope") + to_hide.push_back("enable") + + elif p_tool == Terrain3DEditor.ROUGHNESS: + to_hide.push_back("height") + to_hide.push_back("height picker") + to_hide.push_back("gradient_points") + to_hide.push_back("drawable") + to_hide.push_back("color") + to_hide.push_back("color picker") + to_hide.push_back("slope") + to_hide.push_back("enable") + + elif p_tool in [ Terrain3DEditor.AUTOSHADER, Terrain3DEditor.HOLES, Terrain3DEditor.NAVIGATION ]: + to_hide.push_back("height") + to_hide.push_back("height picker") + to_hide.push_back("gradient_points") + to_hide.push_back("drawable") + to_hide.push_back("color") + to_hide.push_back("color picker") + to_hide.push_back("roughness") + to_hide.push_back("roughness picker") + to_hide.push_back("slope") + to_hide.push_back("opacity") + + toolbar_settings.hide_settings(to_hide) + + toolbar_settings.set_visible(p_tool != Terrain3DEditor.REGION) + + operation_builder = null + if p_operation == Terrain3DEditor.GRADIENT: + operation_builder = GradientOperationBuilder.new() + operation_builder.tool_settings = toolbar_settings + + _on_setting_changed() + plugin.update_region_grid() + + + +func _on_setting_changed() -> void: + if not visible or not plugin.terrain: + return + brush_data = { + "size": int(toolbar_settings.get_setting("size")), + "opacity": toolbar_settings.get_setting("opacity") / 100.0, + "height": toolbar_settings.get_setting("height"), + "texture_index": plugin.texture_dock.get_selected_index(), + "color": toolbar_settings.get_setting("color"), + "roughness": toolbar_settings.get_setting("roughness"), + "gradient_points": toolbar_settings.get_setting("gradient_points"), + "enable": toolbar_settings.get_setting("enable"), + "automatic_regions": toolbar_settings.get_setting("automatic_regions"), + "align_to_view": toolbar_settings.get_setting("align_to_view"), + "show_cursor_while_painting": toolbar_settings.get_setting("show_cursor_while_painting"), + "gamma": toolbar_settings.get_setting("gamma"), + "jitter": toolbar_settings.get_setting("jitter"), + } + var brush_imgs: Array = toolbar_settings.get_setting("brush") + brush_data["image"] = brush_imgs[0] + brush_data["texture"] = brush_imgs[1] + + update_decal() + plugin.editor.set_brush_data(brush_data) + + +func update_decal() -> void: + var mouse_buttons: int = Input.get_mouse_button_mask() + if not visible or \ + not plugin.terrain or \ + brush_data.is_empty() or \ + mouse_buttons & MOUSE_BUTTON_RIGHT or \ + (mouse_buttons & MOUSE_BUTTON_LEFT and not brush_data["show_cursor_while_painting"]) or \ + plugin.editor.get_tool() == Terrain3DEditor.REGION: + decal.visible = false + for gradient_decal in gradient_decals: + gradient_decal.visible = false + return + else: + # Wait for cursor to recenter after right-click before revealing + # See https://github.com/godotengine/godot/issues/70098 + await get_tree().create_timer(.05).timeout + decal.visible = true + + decal.size = Vector3.ONE * brush_data["size"] + if brush_data["align_to_view"]: + var cam: Camera3D = plugin.terrain.get_camera(); + if (cam): + decal.rotation.y = cam.rotation.y + else: + decal.rotation.y = 0 + + # Set texture and color + if picking != Terrain3DEditor.TOOL_MAX: + decal.texture_albedo = picker_texture + decal.size = Vector3.ONE * 10. * plugin.terrain.get_mesh_vertex_spacing() + match picking: + Terrain3DEditor.HEIGHT: + decal.modulate = COLOR_PICK_HEIGHT + Terrain3DEditor.COLOR: + decal.modulate = COLOR_PICK_COLOR + Terrain3DEditor.ROUGHNESS: + decal.modulate = COLOR_PICK_ROUGH + decal.modulate.a = 1.0 + else: + decal.texture_albedo = brush_data["texture"] + match plugin.editor.get_tool(): + Terrain3DEditor.HEIGHT: + match plugin.editor.get_operation(): + Terrain3DEditor.ADD: + decal.modulate = COLOR_RAISE + Terrain3DEditor.SUBTRACT: + decal.modulate = COLOR_LOWER + Terrain3DEditor.MULTIPLY: + decal.modulate = COLOR_EXPAND + Terrain3DEditor.DIVIDE: + decal.modulate = COLOR_REDUCE + Terrain3DEditor.REPLACE: + decal.modulate = COLOR_FLATTEN + Terrain3DEditor.AVERAGE: + decal.modulate = COLOR_SMOOTH + Terrain3DEditor.GRADIENT: + decal.modulate = COLOR_SLOPE + _: + decal.modulate = Color.WHITE + decal.modulate.a = max(.3, brush_data["opacity"]) + Terrain3DEditor.TEXTURE: + match plugin.editor.get_operation(): + Terrain3DEditor.REPLACE: + decal.modulate = COLOR_PAINT + decal.modulate.a = 1.0 + Terrain3DEditor.ADD: + decal.modulate = COLOR_SPRAY + decal.modulate.a = max(.3, brush_data["opacity"]) + _: + decal.modulate = Color.WHITE + Terrain3DEditor.COLOR: + decal.modulate = brush_data["color"].srgb_to_linear()*.5 + decal.modulate.a = max(.3, brush_data["opacity"]) + Terrain3DEditor.ROUGHNESS: + decal.modulate = COLOR_ROUGHNESS + decal.modulate.a = max(.3, brush_data["opacity"]) + Terrain3DEditor.AUTOSHADER: + decal.modulate = COLOR_AUTOSHADER + decal.modulate.a = 1.0 + Terrain3DEditor.HOLES: + decal.modulate = COLOR_HOLES + decal.modulate.a = 1.0 + Terrain3DEditor.NAVIGATION: + decal.modulate = COLOR_NAVIGATION + decal.modulate.a = 1.0 + _: + decal.modulate = Color.WHITE + decal.modulate.a = max(.3, brush_data["opacity"]) + decal.size.y = max(1000, decal.size.y) + decal.albedo_mix = 1.0 + decal.cull_mask = 1 << ( plugin.terrain.get_mouse_layer() - 1 ) + decal_timer.start() + + for gradient_decal in gradient_decals: + gradient_decal.visible = false + + if plugin.editor.get_operation() == Terrain3DEditor.GRADIENT: + var index := 0 + for point in brush_data["gradient_points"]: + if point != Vector3.ZERO: + var point_decal: Decal = _get_gradient_decal(index) + point_decal.visible = true + point_decal.position = point + index += 1 + + +func _get_gradient_decal(index: int) -> Decal: + if gradient_decals.size() > index: + return gradient_decals[index] + + var gradient_decal := Decal.new() + gradient_decal = Decal.new() + gradient_decal.texture_albedo = picker_texture + gradient_decal.modulate = COLOR_SLOPE + gradient_decal.size = Vector3.ONE * 10. * plugin.terrain.get_mesh_vertex_spacing() + gradient_decal.size.y = 1000. + gradient_decal.cull_mask = decal.cull_mask + add_child(gradient_decal) + + gradient_decals.push_back(gradient_decal) + return gradient_decal + + +func set_decal_rotation(p_rot: float) -> void: + decal.rotation.y = p_rot + + +func _on_picking(p_type: int, p_callback: Callable) -> void: + picking = p_type + picking_callback = p_callback + update_decal() + + +func clear_picking() -> void: + picking = Terrain3DEditor.TOOL_MAX + + +func is_picking() -> bool: + if picking != Terrain3DEditor.TOOL_MAX: + return true + + if operation_builder and operation_builder.is_picking(): + return true + + return false + + +func pick(p_global_position: Vector3) -> void: + if picking != Terrain3DEditor.TOOL_MAX: + var color: Color + match picking: + Terrain3DEditor.HEIGHT: + color = plugin.terrain.get_storage().get_pixel(Terrain3DStorage.TYPE_HEIGHT, p_global_position) + Terrain3DEditor.ROUGHNESS: + color = plugin.terrain.get_storage().get_pixel(Terrain3DStorage.TYPE_COLOR, p_global_position) + Terrain3DEditor.COLOR: + color = plugin.terrain.get_storage().get_color(p_global_position) + _: + push_error("Unsupported picking type: ", picking) + return + picking_callback.call(picking, color, p_global_position) + picking = Terrain3DEditor.TOOL_MAX + + elif operation_builder and operation_builder.is_picking(): + operation_builder.pick(p_global_position, plugin.terrain) + diff --git a/addons/terrain_3d/editor/editor.gd b/addons/terrain_3d/editor/editor.gd new file mode 100644 index 0000000..64a69d8 --- /dev/null +++ b/addons/terrain_3d/editor/editor.gd @@ -0,0 +1,282 @@ +@tool +extends EditorPlugin +#class_name Terrain3DEditorPlugin Cannot be named until Godot #75388 + + +# Includes +const UI: Script = preload("res://addons/terrain_3d/editor/components/ui.gd") +const RegionGizmo: Script = preload("res://addons/terrain_3d/editor/components/region_gizmo.gd") +const TextureDock: Script = preload("res://addons/terrain_3d/editor/components/texture_dock.gd") + +var terrain: Terrain3D +var nav_region: NavigationRegion3D + +var editor: Terrain3DEditor +var ui: Node # Terrain3DUI see Godot #75388 +var texture_dock: TextureDock +var texture_dock_container: CustomControlContainer = CONTAINER_INSPECTOR_BOTTOM + +var visible: bool +var region_gizmo: RegionGizmo +var current_region_position: Vector2 +var mouse_global_position: Vector3 = Vector3.ZERO + + +func _enter_tree() -> void: + editor = Terrain3DEditor.new() + ui = UI.new() + ui.plugin = self + add_child(ui) + + texture_dock = TextureDock.new() + texture_dock.hide() + texture_dock.resource_changed.connect(_on_texture_dock_resource_changed) + texture_dock.resource_inspected.connect(_on_texture_dock_resource_selected) + texture_dock.resource_selected.connect(ui._on_setting_changed) + + region_gizmo = RegionGizmo.new() + + add_control_to_container(texture_dock_container, texture_dock) + texture_dock.get_parent().visibility_changed.connect(_on_texture_dock_visibility_changed) + + +func _exit_tree() -> void: + remove_control_from_container(texture_dock_container, texture_dock) + texture_dock.queue_free() + ui.queue_free() + editor.free() + + +func _handles(p_object: Object) -> bool: + return p_object is Terrain3D or p_object is NavigationRegion3D + + +func _edit(p_object: Object) -> void: + if !p_object: + _clear() + + if p_object is Terrain3D: + if p_object == terrain: + return + terrain = p_object + editor.set_terrain(terrain) + region_gizmo.set_node_3d(terrain) + terrain.add_gizmo(region_gizmo) + terrain.set_plugin(self) + + if not terrain.texture_list_changed.is_connected(_load_textures): + terrain.texture_list_changed.connect(_load_textures) + _load_textures() + if not terrain.storage_changed.is_connected(_load_storage): + terrain.storage_changed.connect(_load_storage) + _load_storage() + else: + terrain = null + + if p_object is NavigationRegion3D: + nav_region = p_object + else: + nav_region = null + + _update_visibility() + + +func _make_visible(p_visible: bool) -> void: + visible = p_visible + _update_visibility() + + +func _update_visibility() -> void: + ui.set_visible(visible) + texture_dock.set_visible(visible and terrain) + if terrain: + update_region_grid() + region_gizmo.set_hidden(not visible or not terrain) + + +func _clear() -> void: + if is_terrain_valid(): + terrain.storage_changed.disconnect(_load_storage) + + terrain.clear_gizmos() + terrain = null + editor.set_terrain(null) + + ui.clear_picking() + + region_gizmo.clear() + + +func _forward_3d_gui_input(p_viewport_camera: Camera3D, p_event: InputEvent) -> int: + if not is_terrain_valid(): + return AFTER_GUI_INPUT_PASS + + ## Handle mouse movement + if p_event is InputEventMouseMotion: + if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): + return AFTER_GUI_INPUT_PASS + + ## Get mouse location on terrain + + # Snap terrain to current camera + terrain.set_camera(p_viewport_camera) + + # Detect if viewport is set to half_resolution + # Structure is: Node3DEditorViewportContainer/Node3DEditorViewport/SubViewportContainer/SubViewport/Camera3D + var editor_vpc: SubViewportContainer = p_viewport_camera.get_parent().get_parent() + var full_resolution: bool = false if editor_vpc.stretch_shrink == 2 else true + + # Project 2D mouse position to 3D position and direction + var mouse_pos: Vector2 = p_event.position if full_resolution else p_event.position/2 + var camera_pos: Vector3 = p_viewport_camera.project_ray_origin(mouse_pos) + var camera_dir: Vector3 = p_viewport_camera.project_ray_normal(mouse_pos) + + # If region tool, grab mouse position without considering height + if editor.get_tool() == Terrain3DEditor.REGION: + var t = -Vector3(0, 1, 0).dot(camera_pos) / Vector3(0, 1, 0).dot(camera_dir) + mouse_global_position = (camera_pos + t * camera_dir) + else: + # Else look for intersection with terrain + var intersection_point: Vector3 = terrain.get_intersection(camera_pos, camera_dir) + if intersection_point.z > 3.4e38: # double max + return AFTER_GUI_INPUT_STOP + mouse_global_position = intersection_point + + ## Update decal + ui.decal.global_position = mouse_global_position + ui.decal.albedo_mix = 1.0 + if ui.decal_timer.is_stopped(): + ui.update_decal() + else: + ui.decal_timer.start() + + ## Update region highlight + var region_size = terrain.get_storage().get_region_size() + var region_position: Vector2 = ( Vector2(mouse_global_position.x, mouse_global_position.z) \ + / (region_size * terrain.get_mesh_vertex_spacing()) ).floor() + if current_region_position != region_position: + current_region_position = region_position + update_region_grid() + + if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and editor.is_operating(): + editor.operate(mouse_global_position, p_viewport_camera.rotation.y) + return AFTER_GUI_INPUT_STOP + + elif p_event is InputEventMouseButton: + ui.update_decal() + + if p_event.get_button_index() == MOUSE_BUTTON_LEFT: + if p_event.is_pressed(): + if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): + return AFTER_GUI_INPUT_STOP + + # If picking + if ui.is_picking(): + ui.pick(mouse_global_position) + if not ui.operation_builder or not ui.operation_builder.is_ready(): + return AFTER_GUI_INPUT_STOP + + # If adjusting regions + if editor.get_tool() == Terrain3DEditor.REGION: + # Skip regions that already exist or don't + var has_region: bool = terrain.get_storage().has_region(mouse_global_position) + var op: int = editor.get_operation() + if ( has_region and op == Terrain3DEditor.ADD) or \ + ( not has_region and op == Terrain3DEditor.SUBTRACT ): + return AFTER_GUI_INPUT_STOP + + # If an automatic operation is ready to go (e.g. gradient) + if ui.operation_builder and ui.operation_builder.is_ready(): + ui.operation_builder.apply_operation(editor, mouse_global_position, p_viewport_camera.rotation.y) + return AFTER_GUI_INPUT_STOP + + # Mouse clicked, start editing + editor.start_operation(mouse_global_position) + editor.operate(mouse_global_position, p_viewport_camera.rotation.y) + return AFTER_GUI_INPUT_STOP + + elif editor.is_operating(): + # Mouse released, save undo data + editor.stop_operation() + return AFTER_GUI_INPUT_STOP + + return AFTER_GUI_INPUT_PASS + + +func is_terrain_valid() -> bool: + var valid: bool = false + if is_instance_valid(terrain): + valid = terrain.get_storage() != null + return valid + + +func update_texture_dock(p_args: Array) -> void: + texture_dock.clear() + + if is_terrain_valid() and terrain.texture_list: + var texture_count: int = terrain.texture_list.get_texture_count() + for i in texture_count: + var texture: Terrain3DTexture = terrain.texture_list.get_texture(i) + texture_dock.add_item(texture) + + if texture_count < Terrain3DTextureList.MAX_TEXTURES: + texture_dock.add_item() + + +func update_region_grid() -> void: + if !region_gizmo.get_node_3d(): + return + + if is_terrain_valid(): + region_gizmo.show_rect = editor.get_tool() == Terrain3DEditor.REGION + region_gizmo.use_secondary_color = editor.get_operation() == Terrain3DEditor.SUBTRACT + region_gizmo.region_position = current_region_position + region_gizmo.region_size = terrain.get_storage().get_region_size() * terrain.get_mesh_vertex_spacing() + region_gizmo.grid = terrain.get_storage().get_region_offsets() + + terrain.update_gizmos() + return + + region_gizmo.show_rect = false + region_gizmo.region_size = 1024 + region_gizmo.grid = [Vector2i.ZERO] + + +# Signal handlers + + +func _load_textures() -> void: + if terrain and terrain.texture_list: + if not terrain.texture_list.textures_changed.is_connected(update_texture_dock): + terrain.texture_list.textures_changed.connect(update_texture_dock) + update_texture_dock(Array()) + + +func _load_storage() -> void: + if terrain: + update_region_grid() + + +func _on_texture_dock_resource_changed(texture: Resource, index: int) -> void: + if is_terrain_valid(): + # If removing last entry and its selected, clear inspector + if not texture and index == texture_dock.get_selected_index() and \ + texture_dock.get_selected_index() == texture_dock.entries.size() - 2: + get_editor_interface().inspect_object(null) + terrain.get_texture_list().set_texture(index, texture) + call_deferred("_load_storage") + + +func _on_texture_dock_resource_selected(texture) -> void: + get_editor_interface().inspect_object(texture, "", true) + + +func _on_texture_dock_visibility_changed() -> void: + if texture_dock.get_parent() != null: + remove_control_from_container(texture_dock_container, texture_dock) + + if texture_dock.get_parent() == null: + texture_dock_container = CONTAINER_INSPECTOR_BOTTOM + if get_editor_interface().is_distraction_free_mode_enabled(): + texture_dock_container = CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT + add_control_to_container(texture_dock_container, texture_dock) diff --git a/addons/terrain_3d/extras/minimum.gdshader b/addons/terrain_3d/extras/minimum.gdshader new file mode 100644 index 0000000..dcc297e --- /dev/null +++ b/addons/terrain_3d/extras/minimum.gdshader @@ -0,0 +1,109 @@ +// This shader is the minimum needed to allow the terrain to function. + +shader_type spatial; +render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx; + +// Private uniforms +uniform float _region_size = 1024.0; +uniform float _region_texel_size = 0.0009765625; // = 1/1024 +uniform float _mesh_vertex_spacing = 1.0; +uniform float _mesh_vertex_density = 1.0; // = 1/_mesh_vertex_spacing +uniform int _region_map_size = 16; +uniform int _region_map[256]; +uniform vec2 _region_offsets[256]; +uniform sampler2DArray _height_maps : repeat_disable; + +varying vec3 v_vertex; // World coordinate vertex location + +//////////////////////// +// Vertex +//////////////////////// + +// Takes in UV world space coordinates, returns ivec3 with: +// XY: (0 to _region_size) coordinates within a region +// Z: layer index used for texturearrays, -1 if not in a region +ivec3 get_region_uv(vec2 uv) { + uv *= _region_texel_size; + ivec2 pos = ivec2(floor(uv)) + (_region_map_size / 2); + int bounds = int(pos.x>=0 && pos.x<_region_map_size && pos.y>=0 && pos.y<_region_map_size); + int layer_index = _region_map[ pos.y * _region_map_size + pos.x ] * bounds - 1; + return ivec3(ivec2((uv - _region_offsets[layer_index]) * _region_size), layer_index); +} + +// Takes in UV2 region space coordinates, returns vec3 with: +// XY: (0 to 1) coordinates within a region +// Z: layer index used for texturearrays, -1 if not in a region +vec3 get_region_uv2(vec2 uv) { + ivec2 pos = ivec2(floor(uv)) + (_region_map_size / 2); + int bounds = int(pos.x>=0 && pos.x<_region_map_size && pos.y>=0 && pos.y<_region_map_size); + int layer_index = _region_map[ pos.y * _region_map_size + pos.x ] * bounds - 1; + return vec3(uv - _region_offsets[layer_index], float(layer_index)); +} + +float get_height(vec2 uv) { + highp float height = 0.0; + vec3 region = get_region_uv2(uv); + if (region.z >= 0.) { + height = texture(_height_maps, region).r; + } + return height; +} + +void vertex() { + // Get vertex of flat plane in world coordinates and set world UV + v_vertex = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; + + // UV coordinates in world space. Values are 0 to _region_size within regions + UV = round(v_vertex.xz * _mesh_vertex_density); + + // UV coordinates in region space + texel offset. Values are 0 to 1 within regions + UV2 = (UV + vec2(0.5)) * _region_texel_size; + + // Get final vertex location and save it + VERTEX.y = get_height(UV2); + v_vertex = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; +} + +//////////////////////// +// Fragment +//////////////////////// + +vec3 get_normal(vec2 uv, out vec3 tangent, out vec3 binormal) { + // Get the height of the current vertex + float height = get_height(uv); + + // Get the heights to the right and in front, but because of hardware + // interpolation on the edges of the heightmaps, the values are off + // causing the normal map to look weird. So, near the edges of the map + // get the heights to the left or behind instead. Hacky solution that + // reduces the artifact, but doesn't fix it entirely. See #185. + float u, v; + if(mod(uv.y*_region_size, _region_size) > _region_size-2.) { + v = get_height(uv + vec2(0, -_region_texel_size)) - height; + } else { + v = height - get_height(uv + vec2(0, _region_texel_size)); + } + if(mod(uv.x*_region_size, _region_size) > _region_size-2.) { + u = get_height(uv + vec2(-_region_texel_size, 0)) - height; + } else { + u = height - get_height(uv + vec2(_region_texel_size, 0)); + } + + vec3 normal = vec3(u, _mesh_vertex_spacing, v); + normal = normalize(normal); + tangent = cross(normal, vec3(0, 0, 1)); + binormal = cross(normal, tangent); + return normal; +} + +void fragment() { + // Calculate Terrain Normals + vec3 w_tangent, w_binormal; + vec3 w_normal = get_normal(UV2, w_tangent, w_binormal); + NORMAL = mat3(VIEW_MATRIX) * w_normal; + TANGENT = mat3(VIEW_MATRIX) * w_tangent; + BINORMAL = mat3(VIEW_MATRIX) * w_binormal; + + // Apply PBR + ALBEDO=vec3(.2); +} diff --git a/addons/terrain_3d/extras/project_on_terrain3d.gd b/addons/terrain_3d/extras/project_on_terrain3d.gd new file mode 100644 index 0000000..c4f0321 --- /dev/null +++ b/addons/terrain_3d/extras/project_on_terrain3d.gd @@ -0,0 +1,83 @@ +# This script is an addon for HungryProton's Scatter https://github.com/HungryProton/scatter +# It allows Scatter to detect the terrain height from Terrain3D +# Copy this file into /addons/proton_scatter/src/modifiers +# Then uncomment everything below +# In the editor, add this modifier, then set your Terrain3D node + +#@tool +#extends "base_modifier.gd" +# +# +#signal projection_completed +# +# +#@export var terrain_node : NodePath +#@export var align_with_collision_normal := false +# +#var _terrain: Terrain3D +# +# +#func _init() -> void: +# display_name = "Project On Terrain3D" +# category = "Edit" +# can_restrict_height = false +# global_reference_frame_available = true +# local_reference_frame_available = true +# individual_instances_reference_frame_available = true +# use_global_space_by_default() +# +# documentation.add_paragraph( +# "This is a duplicate of `Project on Colliders` that queries the terrain system +# for height and sets the transform height appropriately. +# +# This modifier must have terrain_node set to a Terrain3D node.") +# +# var p := documentation.add_parameter("Terrain Node") +# p.set_type("NodePath") +# p.set_description("Set your Terrain3D node.") +# +# p = documentation.add_parameter("Align with collision normal") +# p.set_type("bool") +# p.set_description( +# "Rotate the transform to align it with the collision normal in case +# the ray cast hit a collider.") +# +# +#func _process_transforms(transforms, domain, _seed) -> void: +# if transforms.is_empty(): +# return +# +# if terrain_node: +# _terrain = domain.get_root().get_node_or_null(terrain_node) +# +# if not _terrain: +# warning += """No Terrain3D node found""" +# return +# +# if not _terrain.storage: +# warning += """Terrain3D storage is not initialized""" +# return +# +# # Get global transform +# var gt: Transform3D = domain.get_global_transform() +# var gt_inverse: Transform3D = gt.affine_inverse() +# for i in transforms.list.size(): +# var location: Vector3 = (gt * transforms.list[i]).origin +# var height: float = _terrain.storage.get_height(location) +# var normal: Vector3 = _terrain.storage.get_normal(location) +# +# if align_with_collision_normal: +# transforms.list[i].basis.y = normal +# transforms.list[i].basis.x = -transforms.list[i].basis.z.cross(normal) +# transforms.list[i].basis = transforms.list[i].basis.orthonormalized() +# +# transforms.list[i].origin.y = height - gt.origin.y +# +# if transforms.is_empty(): +# warning += """Every point has been removed. Possible reasons include: \n +# + No collider is close enough to the shapes. +# + Ray length is too short. +# + Ray direction is incorrect. +# + Collision mask is not set properly. +# + Max slope is too low. +# """ diff --git a/addons/terrain_3d/icons/icon_brush.svg b/addons/terrain_3d/icons/icon_brush.svg new file mode 100644 index 0000000..908d3f4 --- /dev/null +++ b/addons/terrain_3d/icons/icon_brush.svg @@ -0,0 +1,151 @@ + +image/svg+xml diff --git a/addons/terrain_3d/icons/icon_brush.svg.import b/addons/terrain_3d/icons/icon_brush.svg.import new file mode 100644 index 0000000..02c3201 --- /dev/null +++ b/addons/terrain_3d/icons/icon_brush.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjrjfjmbyseol" +path="res://.godot/imported/icon_brush.svg-8886426485f67abe2233686de39952ce.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_brush.svg" +dest_files=["res://.godot/imported/icon_brush.svg-8886426485f67abe2233686de39952ce.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/addons/terrain_3d/icons/icon_color.svg b/addons/terrain_3d/icons/icon_color.svg new file mode 100644 index 0000000..317b742 --- /dev/null +++ b/addons/terrain_3d/icons/icon_color.svg @@ -0,0 +1,175 @@ + +image/svg+xml diff --git a/addons/terrain_3d/icons/icon_color.svg.import b/addons/terrain_3d/icons/icon_color.svg.import new file mode 100644 index 0000000..f532bbc --- /dev/null +++ b/addons/terrain_3d/icons/icon_color.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnytnsydxqdn2" +path="res://.godot/imported/icon_color.svg-b5b52e67ad2f610c27688c5daeb9cd1c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_color.svg" +dest_files=["res://.godot/imported/icon_color.svg-b5b52e67ad2f610c27688c5daeb9cd1c.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/addons/terrain_3d/icons/icon_height_add.svg b/addons/terrain_3d/icons/icon_height_add.svg new file mode 100644 index 0000000..299a1b8 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_add.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_height_add.svg.import b/addons/terrain_3d/icons/icon_height_add.svg.import new file mode 100644 index 0000000..3ab6671 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_add.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ca7l0radlfn5w" +path="res://.godot/imported/icon_height_add.svg-2928bbcb35ef4816ead056c5bcf5bdbd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_add.svg" +dest_files=["res://.godot/imported/icon_height_add.svg-2928bbcb35ef4816ead056c5bcf5bdbd.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/addons/terrain_3d/icons/icon_height_div.svg b/addons/terrain_3d/icons/icon_height_div.svg new file mode 100644 index 0000000..79a6111 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_div.svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_height_div.svg.import b/addons/terrain_3d/icons/icon_height_div.svg.import new file mode 100644 index 0000000..2573051 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_div.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cunkwpgutguvo" +path="res://.godot/imported/icon_height_div.svg-982f74e4859453a7d67caa2f6a71b056.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_div.svg" +dest_files=["res://.godot/imported/icon_height_div.svg-982f74e4859453a7d67caa2f6a71b056.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/addons/terrain_3d/icons/icon_height_flat.svg b/addons/terrain_3d/icons/icon_height_flat.svg new file mode 100644 index 0000000..98973fe --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_flat.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_height_flat.svg.import b/addons/terrain_3d/icons/icon_height_flat.svg.import new file mode 100644 index 0000000..1c01887 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_flat.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs2injw82o1il" +path="res://.godot/imported/icon_height_flat.svg-e58f6a7038e84631a5f56866c4c671e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_flat.svg" +dest_files=["res://.godot/imported/icon_height_flat.svg-e58f6a7038e84631a5f56866c4c671e0.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/addons/terrain_3d/icons/icon_height_mul.svg b/addons/terrain_3d/icons/icon_height_mul.svg new file mode 100644 index 0000000..ef4f92e --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_mul.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_height_mul.svg.import b/addons/terrain_3d/icons/icon_height_mul.svg.import new file mode 100644 index 0000000..66a84ee --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_mul.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tvaw0pb2bdhu" +path="res://.godot/imported/icon_height_mul.svg-b6b666e20be820f5aa48e7410648290c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_mul.svg" +dest_files=["res://.godot/imported/icon_height_mul.svg-b6b666e20be820f5aa48e7410648290c.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/addons/terrain_3d/icons/icon_height_slope.svg b/addons/terrain_3d/icons/icon_height_slope.svg new file mode 100644 index 0000000..fe2903d --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_slope.svg @@ -0,0 +1,105 @@ + + + + diff --git a/addons/terrain_3d/icons/icon_height_slope.svg.import b/addons/terrain_3d/icons/icon_height_slope.svg.import new file mode 100644 index 0000000..defce65 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_slope.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3xbj3i7emxir" +path="res://.godot/imported/icon_height_slope.svg-2a8181e8d9f9b74739d6f4a9e62f040d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_slope.svg" +dest_files=["res://.godot/imported/icon_height_slope.svg-2a8181e8d9f9b74739d6f4a9e62f040d.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/addons/terrain_3d/icons/icon_height_smooth.svg b/addons/terrain_3d/icons/icon_height_smooth.svg new file mode 100644 index 0000000..81154c3 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_smooth.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_height_smooth.svg.import b/addons/terrain_3d/icons/icon_height_smooth.svg.import new file mode 100644 index 0000000..a308e01 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_smooth.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ub12g3jkvivd" +path="res://.godot/imported/icon_height_smooth.svg-83cfb47d64fb9579b212027a5aa50672.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_smooth.svg" +dest_files=["res://.godot/imported/icon_height_smooth.svg-83cfb47d64fb9579b212027a5aa50672.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/addons/terrain_3d/icons/icon_height_sub.svg b/addons/terrain_3d/icons/icon_height_sub.svg new file mode 100644 index 0000000..bb0d2a7 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_sub.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_height_sub.svg.import b/addons/terrain_3d/icons/icon_height_sub.svg.import new file mode 100644 index 0000000..9208500 --- /dev/null +++ b/addons/terrain_3d/icons/icon_height_sub.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vyw5rhfpbjku" +path="res://.godot/imported/icon_height_sub.svg-f01f73a219b6c1858d4bd958d01e8130.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_height_sub.svg" +dest_files=["res://.godot/imported/icon_height_sub.svg-f01f73a219b6c1858d4bd958d01e8130.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/addons/terrain_3d/icons/icon_holes.svg b/addons/terrain_3d/icons/icon_holes.svg new file mode 100644 index 0000000..da639d9 --- /dev/null +++ b/addons/terrain_3d/icons/icon_holes.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/addons/terrain_3d/icons/icon_holes.svg.import b/addons/terrain_3d/icons/icon_holes.svg.import new file mode 100644 index 0000000..cd00a66 --- /dev/null +++ b/addons/terrain_3d/icons/icon_holes.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqktati6gi08q" +path="res://.godot/imported/icon_holes.svg-fadd8eef4df4cdc393621d5ff25aa8e3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_holes.svg" +dest_files=["res://.godot/imported/icon_holes.svg-fadd8eef4df4cdc393621d5ff25aa8e3.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/addons/terrain_3d/icons/icon_map_add.svg b/addons/terrain_3d/icons/icon_map_add.svg new file mode 100644 index 0000000..56d7c92 --- /dev/null +++ b/addons/terrain_3d/icons/icon_map_add.svg @@ -0,0 +1,95 @@ + +image/svg+xml diff --git a/addons/terrain_3d/icons/icon_map_add.svg.import b/addons/terrain_3d/icons/icon_map_add.svg.import new file mode 100644 index 0000000..84445b4 --- /dev/null +++ b/addons/terrain_3d/icons/icon_map_add.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://js5u88icy324" +path="res://.godot/imported/icon_map_add.svg-a13cebbb261c5138d4ca5cbb5df24202.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_map_add.svg" +dest_files=["res://.godot/imported/icon_map_add.svg-a13cebbb261c5138d4ca5cbb5df24202.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/addons/terrain_3d/icons/icon_map_remove.svg b/addons/terrain_3d/icons/icon_map_remove.svg new file mode 100644 index 0000000..315657d --- /dev/null +++ b/addons/terrain_3d/icons/icon_map_remove.svg @@ -0,0 +1,102 @@ + +image/svg+xml diff --git a/addons/terrain_3d/icons/icon_map_remove.svg.import b/addons/terrain_3d/icons/icon_map_remove.svg.import new file mode 100644 index 0000000..952a8a0 --- /dev/null +++ b/addons/terrain_3d/icons/icon_map_remove.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1o6vv5wx3w65" +path="res://.godot/imported/icon_map_remove.svg-bf5a269f9171f7027b6de1785cc63713.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_map_remove.svg" +dest_files=["res://.godot/imported/icon_map_remove.svg-bf5a269f9171f7027b6de1785cc63713.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/addons/terrain_3d/icons/icon_multimesh.svg b/addons/terrain_3d/icons/icon_multimesh.svg new file mode 100644 index 0000000..a62e5f9 --- /dev/null +++ b/addons/terrain_3d/icons/icon_multimesh.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/addons/terrain_3d/icons/icon_multimesh.svg.import b/addons/terrain_3d/icons/icon_multimesh.svg.import new file mode 100644 index 0000000..32cf127 --- /dev/null +++ b/addons/terrain_3d/icons/icon_multimesh.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xg3l0exmqch3" +path="res://.godot/imported/icon_multimesh.svg-9447b6c5fe1ee9d406fd55dd3c63e196.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_multimesh.svg" +dest_files=["res://.godot/imported/icon_multimesh.svg-9447b6c5fe1ee9d406fd55dd3c63e196.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/addons/terrain_3d/icons/icon_navigation.svg b/addons/terrain_3d/icons/icon_navigation.svg new file mode 100644 index 0000000..1056202 --- /dev/null +++ b/addons/terrain_3d/icons/icon_navigation.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_navigation.svg.import b/addons/terrain_3d/icons/icon_navigation.svg.import new file mode 100644 index 0000000..ef0bf8e --- /dev/null +++ b/addons/terrain_3d/icons/icon_navigation.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0sprba3li1x4" +path="res://.godot/imported/icon_navigation.svg-35e49ee3c403c103a0079d4156b0d168.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_navigation.svg" +dest_files=["res://.godot/imported/icon_navigation.svg-35e49ee3c403c103a0079d4156b0d168.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/addons/terrain_3d/icons/icon_picker.svg b/addons/terrain_3d/icons/icon_picker.svg new file mode 100644 index 0000000..0ce7af4 --- /dev/null +++ b/addons/terrain_3d/icons/icon_picker.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/addons/terrain_3d/icons/icon_picker.svg.import b/addons/terrain_3d/icons/icon_picker.svg.import new file mode 100644 index 0000000..7ad1ca7 --- /dev/null +++ b/addons/terrain_3d/icons/icon_picker.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://516qh3duc33g" +path="res://.godot/imported/icon_picker.svg-9f872a162ed3e0053283f4bf299ac645.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_picker.svg" +dest_files=["res://.godot/imported/icon_picker.svg-9f872a162ed3e0053283f4bf299ac645.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/addons/terrain_3d/icons/icon_picker_checked.svg b/addons/terrain_3d/icons/icon_picker_checked.svg new file mode 100644 index 0000000..653d57e --- /dev/null +++ b/addons/terrain_3d/icons/icon_picker_checked.svg @@ -0,0 +1,43 @@ + + + + + + + diff --git a/addons/terrain_3d/icons/icon_picker_checked.svg.import b/addons/terrain_3d/icons/icon_picker_checked.svg.import new file mode 100644 index 0000000..66d885c --- /dev/null +++ b/addons/terrain_3d/icons/icon_picker_checked.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wor7v0l4vc6t" +path="res://.godot/imported/icon_picker_checked.svg-4e271ac1a29c979a28440c683998675e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_picker_checked.svg" +dest_files=["res://.godot/imported/icon_picker_checked.svg-4e271ac1a29c979a28440c683998675e.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/addons/terrain_3d/icons/icon_spray.svg b/addons/terrain_3d/icons/icon_spray.svg new file mode 100644 index 0000000..bfc3e82 --- /dev/null +++ b/addons/terrain_3d/icons/icon_spray.svg @@ -0,0 +1,165 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_spray.svg.import b/addons/terrain_3d/icons/icon_spray.svg.import new file mode 100644 index 0000000..bc68921 --- /dev/null +++ b/addons/terrain_3d/icons/icon_spray.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bx2wxkso083ht" +path="res://.godot/imported/icon_spray.svg-d9864c87d5d420aa9f80c0d3fdc80e87.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_spray.svg" +dest_files=["res://.godot/imported/icon_spray.svg-d9864c87d5d420aa9f80c0d3fdc80e87.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/addons/terrain_3d/icons/icon_terrain3d.svg b/addons/terrain_3d/icons/icon_terrain3d.svg new file mode 100644 index 0000000..ca8c661 --- /dev/null +++ b/addons/terrain_3d/icons/icon_terrain3d.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_terrain3d.svg.import b/addons/terrain_3d/icons/icon_terrain3d.svg.import new file mode 100644 index 0000000..5622659 --- /dev/null +++ b/addons/terrain_3d/icons/icon_terrain3d.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b03x10iou1m5" +path="res://.godot/imported/icon_terrain3d.svg-39252bb986e607c413d93e00ee31a619.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_terrain3d.svg" +dest_files=["res://.godot/imported/icon_terrain3d.svg-39252bb986e607c413d93e00ee31a619.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/addons/terrain_3d/icons/icon_terrain_layer_material.svg b/addons/terrain_3d/icons/icon_terrain_layer_material.svg new file mode 100644 index 0000000..5c9c4c9 --- /dev/null +++ b/addons/terrain_3d/icons/icon_terrain_layer_material.svg @@ -0,0 +1,102 @@ + + diff --git a/addons/terrain_3d/icons/icon_terrain_layer_material.svg.import b/addons/terrain_3d/icons/icon_terrain_layer_material.svg.import new file mode 100644 index 0000000..b96ea64 --- /dev/null +++ b/addons/terrain_3d/icons/icon_terrain_layer_material.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gt2l3qdaivl2" +path="res://.godot/imported/icon_terrain_layer_material.svg-f3d447e84f51556fc60c5f0bd3f57443.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_terrain_layer_material.svg" +dest_files=["res://.godot/imported/icon_terrain_layer_material.svg-f3d447e84f51556fc60c5f0bd3f57443.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/addons/terrain_3d/icons/icon_terrain_material.svg b/addons/terrain_3d/icons/icon_terrain_material.svg new file mode 100644 index 0000000..5e6ee1a --- /dev/null +++ b/addons/terrain_3d/icons/icon_terrain_material.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_terrain_material.svg.import b/addons/terrain_3d/icons/icon_terrain_material.svg.import new file mode 100644 index 0000000..a7e3e96 --- /dev/null +++ b/addons/terrain_3d/icons/icon_terrain_material.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccywk15q2ad8q" +path="res://.godot/imported/icon_terrain_material.svg-ea0cde03d29920e042a4043982714cbe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_terrain_material.svg" +dest_files=["res://.godot/imported/icon_terrain_material.svg-ea0cde03d29920e042a4043982714cbe.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/addons/terrain_3d/icons/icon_wetness.svg b/addons/terrain_3d/icons/icon_wetness.svg new file mode 100644 index 0000000..90c3d03 --- /dev/null +++ b/addons/terrain_3d/icons/icon_wetness.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/terrain_3d/icons/icon_wetness.svg.import b/addons/terrain_3d/icons/icon_wetness.svg.import new file mode 100644 index 0000000..367b1a0 --- /dev/null +++ b/addons/terrain_3d/icons/icon_wetness.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bv4f7kijr12yr" +path="res://.godot/imported/icon_wetness.svg-6c67b1e4e9435c1aa106bee56f000e06.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/terrain_3d/icons/icon_wetness.svg" +dest_files=["res://.godot/imported/icon_wetness.svg-6c67b1e4e9435c1aa106bee56f000e06.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/addons/terrain_3d/plugin.cfg b/addons/terrain_3d/plugin.cfg new file mode 100644 index 0000000..19f799a --- /dev/null +++ b/addons/terrain_3d/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Terrain3D" +description="A high performance, editable terrain system for Godot 4." +author="Cory Petkovsek & Roope Palmroos" +version="0.9.1" +script="editor/editor.gd" diff --git a/addons/terrain_3d/terrain.gdextension b/addons/terrain_3d/terrain.gdextension new file mode 100644 index 0000000..7e5d482 --- /dev/null +++ b/addons/terrain_3d/terrain.gdextension @@ -0,0 +1,25 @@ +[configuration] + +entry_symbol = "terrain_3d_init" +compatibility_minimum = 4.1 + +[libraries] + +windows.debug.x86_64 = "res://addons/terrain_3d/bin/libterrain.windows.debug.x86_64.dll" +windows.release.x86_64 = "res://addons/terrain_3d/bin/libterrain.windows.release.x86_64.dll" + +linux.debug.x86_64 = "res://addons/terrain_3d/bin/libterrain.linux.debug.x86_64.so" +linux.release.x86_64 = "res://addons/terrain_3d/bin/libterrain.linux.release.x86_64.so" +linux.debug.arm64 = "res://addons/terrain_3d/bin/libterrain.linux.debug.arm64.so" +linux.release.arm64 = "res://addons/terrain_3d/bin/libterrain.linux.release.arm64.so" +linux.debug.rv64 = "res://addons/terrain_3d/bin/libterrain.linux.debug.rv64.so" +linux.release.rv64 = "res://addons/terrain_3d/bin/libterrain.linux.release.rv64.so" + +macos.debug = "res://addons/terrain_3d/bin/libterrain.macos.debug.framework" +macos.release = "res://addons/terrain_3d/bin/libterrain.macos.release.framework" + +android.debug.arm64 = "res://addons/terrain_3d/bin/libterrain.android.debug.arm64.so" +android.release.arm64 = "res://addons/terrain_3d/bin/libterrain.android.release.arm64.so" + +ios.debug = "res://addons/terrain_3d/bin/libterrain.ios.debug.universal.dylib" +ios.release = "res://addons/terrain_3d/bin/libterrain.ios.release.universal.dylib" \ No newline at end of file diff --git a/addons/terrain_3d/tools/importer.gd b/addons/terrain_3d/tools/importer.gd new file mode 100644 index 0000000..219b27c --- /dev/null +++ b/addons/terrain_3d/tools/importer.gd @@ -0,0 +1,82 @@ +@tool +extends Terrain3D + + +@export var clear_all: bool = false : set = reset_settings +@export var clear_terrain: bool = false : set = reset_terrain +@export var update_height_range: bool = false : set = update_heights + + +func reset_settings(p_value) -> void: + if p_value: + height_file_name = "" + control_file_name = "" + color_file_name = "" + import_position = Vector3.ZERO + import_offset = 0.0 + import_scale = 1.0 + r16_range = Vector2(0, 1) + r16_size = Vector2i(1024, 1024) + storage = null + material = null + texture_list = null + + +func reset_terrain(p_value) -> void: + if p_value: + storage = null + + +func update_heights(p_value) -> void: + if p_value and storage: + storage.update_height_range() + + +@export_group("Import File") +@export_global_file var height_file_name: String = "" +@export_global_file var control_file_name: String = "" +@export_global_file var color_file_name: String = "" +@export var import_position: Vector3 = Vector3.ZERO +@export var import_scale: float = 1.0 +@export var import_offset: float = 0.0 +@export var r16_range: Vector2 = Vector2(0, 1) +@export var r16_size: Vector2i = Vector2i(1024, 1024) +@export var run_import: bool = false : set = start_import + +func start_import(p_value: bool) -> void: + if p_value: + print("Terrain3DImporter: Importing files:\n\t%s\n\t%s\n\t%s" % [ height_file_name, control_file_name, color_file_name]) + if not storage: + storage = Terrain3DStorage.new() + + var imported_images: Array[Image] + imported_images.resize(Terrain3DStorage.TYPE_MAX) + var min_max := Vector2(0, 1) + var img: Image + if height_file_name: + img = Terrain3DStorage.load_image(height_file_name, ResourceLoader.CACHE_MODE_IGNORE, r16_range, r16_size) + min_max = Terrain3D.get_min_max(img) + imported_images[Terrain3DStorage.TYPE_HEIGHT] = img + if control_file_name: + img = Terrain3DStorage.load_image(control_file_name, ResourceLoader.CACHE_MODE_IGNORE) + imported_images[Terrain3DStorage.TYPE_CONTROL] = img + if color_file_name: + img = Terrain3DStorage.load_image(color_file_name, ResourceLoader.CACHE_MODE_IGNORE) + imported_images[Terrain3DStorage.TYPE_COLOR] = img + if texture_list.get_texture_count() == 0: + material.show_checkered = false + material.show_colormap = true + storage.import_images(imported_images, import_position, import_offset, import_scale) + print("Terrain3DImporter: Import finished") + + +@export_group("Export File") +enum { TYPE_HEIGHT, TYPE_CONTROL, TYPE_COLOR } +@export_enum("Height:0", "Control:1", "Color:2") var map_type: int = TYPE_HEIGHT +@export var file_name_out: String = "" +@export var run_export: bool = false : set = start_export + +func start_export(p_value: bool) -> void: + var err: int = storage.export_image(file_name_out, map_type) + print("Terrain3DImporter: Export error status: ", err, " ", error_string(err)) + diff --git a/addons/terrain_3d/tools/importer.tscn b/addons/terrain_3d/tools/importer.tscn new file mode 100644 index 0000000..32252b0 --- /dev/null +++ b/addons/terrain_3d/tools/importer.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=8 format=3 uid="uid://blaieaqp413k7"] + +[ext_resource type="Terrain3DStorage" uid="uid://dyon4xda4k40d" path="res://maps/genesis/resources/storage.res" id="1_8wr5r"] +[ext_resource type="Script" path="res://addons/terrain_3d/tools/importer.gd" id="1_60b8f"] + +[sub_resource type="Gradient" id="Gradient_5sc5a"] +offsets = PackedFloat32Array(0.2, 1) +colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1) + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_lp4p7"] +noise_type = 2 +frequency = 0.03 +cellular_jitter = 3.0 +cellular_return_type = 0 +domain_warp_enabled = true +domain_warp_type = 1 +domain_warp_amplitude = 50.0 +domain_warp_fractal_type = 2 +domain_warp_fractal_lacunarity = 1.5 +domain_warp_fractal_gain = 1.0 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_vyjp8"] +seamless = true +color_ramp = SubResource("Gradient_5sc5a") +noise = SubResource("FastNoiseLite_lp4p7") + +[sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_f0cwi"] +_shader_parameters = { +"_mouse_layer": 2147483648, +"blend_sharpness": null, +"height_blending": null, +"macro_variation1": null, +"macro_variation2": null, +"noise1_angle": null, +"noise1_offset": null, +"noise1_scale": null, +"noise2_scale": null, +"noise3_scale": null, +"noise_texture": SubResource("NoiseTexture2D_vyjp8") +} +show_checkered = true + +[sub_resource type="Terrain3DTextureList" id="Terrain3DTextureList_i35jn"] + +[node name="Importer" type="Terrain3D"] +storage = ExtResource("1_8wr5r") +material = SubResource("Terrain3DMaterial_f0cwi") +texture_list = SubResource("Terrain3DTextureList_i35jn") +script = ExtResource("1_60b8f") +height_file_name = "C:/msys64/home/osram/GODOT/develop/levels/greth_vortex/Vortex_Smooth2_2048.r16" +import_position = Vector3(-1024, 0, -1024) +r16_range = Vector2(0, 250) +r16_size = Vector2i(2048, 2048) diff --git a/characters/player/player.gd b/characters/player/player.gd new file mode 100644 index 0000000..611434c --- /dev/null +++ b/characters/player/player.gd @@ -0,0 +1,81 @@ +extends RigidBody3D + +# constants +const max_energy : float = 100.0 +const energy_charge_rate : float = 10 # energy per second +const energy_drain_rate : float = 20 # energy per second +const ground_speed : float = 48 / 3.6 # m/s +const jetpack_vertical_force : float = 800 +const jetpack_horizontal_force : float = 400 +const jetpack_force_factor : float = 2 + +# parameters +@export var max_floor_angle : float = 60 +@export var energy: float = 100.0 +var g : float = ProjectSettings.get_setting("physics/3d/default_gravity") # in m/s² +var gravity : Vector3 = g * ProjectSettings.get_setting("physics/3d/default_gravity_vector") + +# floor detection +@onready var hud = $HUD +@onready var shape_cast = $ShapeCast3D +@onready var weapon = $SpringArm3D/Inventory/SpaceGun + +# signals +signal energy_changed(energy) + +func _ready(): + energy_changed.connect(hud._on_energy_changed) + +func is_on_floor(): + return shape_cast.is_colliding() + +func is_skiing() -> bool: + return Input.is_action_pressed("ski") + +func handle_jetpack(delta, direction): + if Input.is_action_pressed("jump_and_jet"): + if energy > 0: + var up_vector = Vector3.UP * jetpack_vertical_force * jetpack_force_factor + var side_vector = direction * jetpack_horizontal_force * jetpack_force_factor + apply_force(up_vector + side_vector) + energy -= energy_drain_rate * delta + else: + energy += energy_charge_rate * delta + + energy = clamp(energy, 0, max_energy) + energy_changed.emit(energy) + +func _physics_process(delta): + # retrieve user's direction vector + var _input_dir = Input.get_vector("left", "right", "forward", "backward") + # compute direction in local space + var _direction = (transform.basis * Vector3(_input_dir.x, 0, _input_dir.y)).normalized() + # adjust direction based on spring arm rotation + _direction = _direction.rotated(Vector3.UP, $SpringArm3D.rotation.y) + + handle_jetpack(delta, _direction) + + # handle ski + if is_skiing(): + physics_material_override.friction = 0 + else: + physics_material_override.friction = 1 + + if is_on_floor(): + if not _direction.is_zero_approx() and not is_skiing(): + # retrieve collision normal + var normal = shape_cast.get_collision_normal(0) + # calculate the angle between the ground normal and the up vector + var slope_angle = rad_to_deg(acos(normal.dot(Vector3.UP))) + # check if the slope angle exceeds the maximum slope angle + if slope_angle <= max_floor_angle: + # adjust direction based on the floor normal to align with the slope + _direction = _direction.slide(normal) + + linear_velocity = lerp(linear_velocity, _direction * ground_speed, .1) + + if Input.is_action_just_pressed("jump_and_jet"): + linear_velocity.y = sqrt(2 * abs((mass * gravity * delta).y) * 1) + else: + pass + diff --git a/characters/player/player.tscn b/characters/player/player.tscn new file mode 100644 index 0000000..77cd902 --- /dev/null +++ b/characters/player/player.tscn @@ -0,0 +1,96 @@ +[gd_scene load_steps=9 format=3 uid="uid://cbhx1xme0sb7k"] + +[ext_resource type="Script" path="res://characters/player/player.gd" id="1_ymjub"] +[ext_resource type="PackedScene" uid="uid://bcv81ku26xo" path="res://interfaces/hud/hud.tscn" id="2_5qvi2"] +[ext_resource type="PackedScene" uid="uid://c8co0qa2omjmh" path="res://weapons/space_gun/space_gun.tscn" id="2_ka38u"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_clur0"] +bounce = 1.0 +absorbent = true + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_vmqfq"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_rm4oh"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3l0v2"] + +[sub_resource type="GDScript" id="GDScript_qcxi0"] +script/source = "extends SpringArm3D + +@export var MOUSE_SENSITIVITY : float = 0.5 +@export var WHEEL_SENSITIVITY : float = 0.5 + +var _mouse_position: Vector2 +var _mouse_rotation : Vector3 + +# Called when the node enters the scene tree for the first time. +func _ready(): + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + $Camera3D.current = true + + +func _unhandled_input(event: InputEvent) -> void: + var mouse_mode = Input.get_mouse_mode() + + # isolate mouse events + if event is InputEventMouseMotion: + if mouse_mode == Input.MOUSE_MODE_CAPTURED: + # retrieve mouse position relative to last frame + _mouse_position = event.relative * MOUSE_SENSITIVITY + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + _update_camera(delta) + +func _update_camera(delta): + # clamp vertical rotation (head motion) + _mouse_rotation.y -= _mouse_position.y * delta + _mouse_rotation.y = clamp(_mouse_rotation.y, deg_to_rad(-90.0),deg_to_rad(90.0)) + # wrap horizontal rotation (to prevent accumulation) + _mouse_rotation.x -= _mouse_position.x * delta + _mouse_rotation.x = wrapf(_mouse_rotation.x, deg_to_rad(0.0),deg_to_rad(360.0)) + # reset mouse motion until next input event + _mouse_position = Vector2.ZERO + # update spring arm global rotation + global_transform.basis = Basis.from_euler(Vector3(_mouse_rotation.y, _mouse_rotation.x, 0.0)) +" + +[node name="Player" type="RigidBody3D"] +axis_lock_angular_x = true +axis_lock_angular_y = true +axis_lock_angular_z = true +mass = 75.0 +physics_material_override = SubResource("PhysicsMaterial_clur0") +continuous_cd = true +script = ExtResource("1_ymjub") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +visible = false +mesh = SubResource("CapsuleMesh_vmqfq") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_rm4oh") + +[node name="ShapeCast3D" type="ShapeCast3D" parent="."] +transform = Transform3D(1.05, 0, 0, 0, 1.05, 0, 0, 0, 1.05, 0, 0, 0) +shape = SubResource("CapsuleShape3D_3l0v2") +target_position = Vector3(0, 0, 0) +collide_with_areas = true + +[node name="HUD" parent="." instance=ExtResource("2_5qvi2")] + +[node name="SpringArm3D" type="SpringArm3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +spring_length = 0.0 +script = SubResource("GDScript_qcxi0") + +[node name="Camera3D" type="Camera3D" parent="SpringArm3D"] +fov = 100.0 +near = 0.1 + +[node name="Inventory" type="Node3D" parent="SpringArm3D"] + +[node name="SpaceGun" parent="SpringArm3D/Inventory" instance=ExtResource("2_ka38u")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0.145, -0.095, -0.261784) diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..b370ceb --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..e05fd45 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btb1uhogma5ev" +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/interfaces/hud/hud.tscn b/interfaces/hud/hud.tscn new file mode 100644 index 0000000..4ad5b3d --- /dev/null +++ b/interfaces/hud/hud.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=5 format=3 uid="uid://bcv81ku26xo"] + +[sub_resource type="GDScript" id="GDScript_2vxif"] +script/source = "extends CanvasLayer + +@onready var energy_bar = $EnergyBar + +func _update_energy_label(energy): + energy_bar.value = energy + +func _ready(): + _update_energy_label(100.0) + +func _on_energy_changed(new_energy) -> void: + _update_energy_label(new_energy) + +" + +[sub_resource type="Theme" id="Theme_irfqb"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_f23s3"] +bg_color = Color(0, 0.454902, 0.992157, 1) + +[sub_resource type="GDScript" id="GDScript_w8l21"] +script/source = "extends Label + +@onready var player = get_parent().owner + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + text = \"\" + text += \"fps: %s\\n\" % str(Engine.get_frames_per_second()) + text += \"position: %d, %d, %d\\n\" % [player.position.x, player.position.y, player.position.z] + text += \"speed: %d km/h\\n\" % (player.linear_velocity.length() * 3.6) +" + +[node name="HUD" type="CanvasLayer"] +script = SubResource("GDScript_2vxif") + +[node name="EnergyBar" type="ProgressBar" parent="."] +offset_left = 32.0 +offset_top = 32.0 +offset_right = 288.0 +offset_bottom = 40.0 +size_flags_horizontal = 0 +mouse_filter = 2 +theme = SubResource("Theme_irfqb") +theme_override_styles/fill = SubResource("StyleBoxFlat_f23s3") +value = 60.0 +show_percentage = false + +[node name="DebugLabel" type="Label" parent="."] +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 20.0 +offset_top = -33.0 +offset_right = 21.0 +offset_bottom = -10.0 +grow_vertical = 0 +script = SubResource("GDScript_w8l21") diff --git a/interfaces/menus/boot/background.webp b/interfaces/menus/boot/background.webp new file mode 100644 index 0000000..9afd691 Binary files /dev/null and b/interfaces/menus/boot/background.webp differ diff --git a/interfaces/menus/boot/background.webp.import b/interfaces/menus/boot/background.webp.import new file mode 100644 index 0000000..5b478ed --- /dev/null +++ b/interfaces/menus/boot/background.webp.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1tjamjm8qjog" +path="res://.godot/imported/background.webp-f3f369ebd80fe0ef765a073acba84e0f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://interfaces/menus/boot/background.webp" +dest_files=["res://.godot/imported/background.webp-f3f369ebd80fe0ef765a073acba84e0f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/interfaces/menus/boot/boot.tscn b/interfaces/menus/boot/boot.tscn new file mode 100644 index 0000000..c50e588 --- /dev/null +++ b/interfaces/menus/boot/boot.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=5 format=3 uid="uid://bjctlqvs33nqy"] + +[ext_resource type="Texture2D" uid="uid://c1tjamjm8qjog" path="res://interfaces/menus/boot/background.webp" id="1_ph586"] +[ext_resource type="PackedScene" uid="uid://1seg8cvss7a7" path="res://interfaces/menus/boot/multiplayer.tscn" id="2_lcb0h"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_snh7i"] +bg_color = Color(0, 0.5, 0.5, 0.25) + +[sub_resource type="GDScript" id="GDScript_yqbr7"] +script/source = "extends PanelContainer + +const PLAYER = preload(\"res://characters/player/player.tscn\") +const MAP = preload(\"res://maps/genesis/genesis.tscn\") + +func _on_demo_pressed(): + # instantiate scenes + var player = PLAYER.instantiate() + var map = MAP.instantiate() + # set player initial position + player.position = Vector3(0,150,0) + # add as siblings in tree + for o in [map, player]: + owner.add_sibling(o) + # queue main_menu node for deletion + owner.queue_free() + +func _on_multiplayer_pressed(): + hide() + owner.get_node(\"Multiplayer\").show() + +func _on_quit_pressed(): + get_tree().quit() +" + +[node name="MainMenu" type="CanvasLayer"] + +[node name="TextureRect" type="TextureRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_ph586") +stretch_mode = 6 + +[node name="Multiplayer" parent="." instance=ExtResource("2_lcb0h")] +visible = false + +[node name="Main" type="PanelContainer" parent="."] +anchors_preset = 9 +anchor_bottom = 1.0 +offset_right = 313.0 +grow_vertical = 2 +size_flags_horizontal = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_snh7i") +script = SubResource("GDScript_yqbr7") + +[node name="MarginContainer" type="MarginContainer" parent="Main"] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_right = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="Main/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 10 +alignment = 1 + +[node name="Demo" type="Button" parent="Main/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 32 +text = "Demo" + +[node name="Multiplayer" type="Button" parent="Main/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 32 +text = "Multiplayer" + +[node name="Quit" type="Button" parent="Main/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 32 +text = "Quit" + +[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Demo" to="Main" method="_on_demo_pressed"] +[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Multiplayer" to="Main" method="_on_multiplayer_pressed"] +[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Quit" to="Main" method="_on_quit_pressed"] diff --git a/interfaces/menus/boot/multiplayer.tscn b/interfaces/menus/boot/multiplayer.tscn new file mode 100644 index 0000000..b2573fc --- /dev/null +++ b/interfaces/menus/boot/multiplayer.tscn @@ -0,0 +1,258 @@ +[gd_scene load_steps=3 format=3 uid="uid://1seg8cvss7a7"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_krqeq"] +bg_color = Color(0.5, 0.5, 0.5, 0.25) + +[sub_resource type="GDScript" id="GDScript_tc1bm"] +script/source = "extends PanelContainer + +const MAX_CLIENTS : int = 20 +const DEFAULT_PORT : int = 9000 +const DEFAULT_HOST : String = \"localhost\" + +var _join_address = RegEx.new() +var _registered_ports = RegEx.new() + +func _ready(): + # see https://datatracker.ietf.org/doc/html/rfc1700 + _registered_ports.compile(r'^(?:102[4-9]|10[3-9]\\d|1[1-9]\\d{2}|[2-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$') + _join_address.compile(r'^(?[a-zA-Z0-9.-]+)(:(?:102[4-9]|10[3-9]\\d|1[1-9]\\d{2}|[2-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5]))?$') + hide() # start hidden + +func _on_menu_pressed(): + hide() + owner.get_node(\"Main\").show() + +func _on_quit_pressed(): + get_tree().quit() + +func _on_join_pressed(): + var addr = [DEFAULT_HOST, DEFAULT_PORT] + # validate join address input + var result = _join_address.search(%JoinAddress.text) + if result: # address is valid + addr[0] = result.get_string(\"host\") + var rport = result.get_string(\"port\") + if rport: addr[1] = int(rport) + + # create client + var peer = ENetMultiplayerPeer.new() + peer.create_client(addr[0], addr[1]) + multiplayer.multiplayer_peer = peer + +func _on_host_pressed(): + var port = DEFAULT_PORT + + # check for registered ports number matches + if %ServerPort.text: + var result = _registered_ports.search(%ServerPort.text) + if result: # port is valid + port = int(result.get_string()) + else: # port is not valid + push_warning(\"A valid port number in the range 1024-65535 is required.\") + return + + # create server + var peer = ENetMultiplayerPeer.new() + peer.create_server(port, MAX_CLIENTS) + multiplayer.multiplayer_peer = peer + + multiplayer.peer_connected.connect(_on_peer_connected) + +func _on_peer_connected(peer_id): + print(\"Peer `%s` connected\" % peer_id) + +" + +[node name="Multiplayer" type="PanelContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_krqeq") +script = SubResource("GDScript_tc1bm") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="TabContainer" type="TabContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/side_margin = 0 + +[node name="Profile" type="TabBar" parent="MarginContainer/TabContainer"] +layout_mode = 2 +theme_override_constants/h_separation = 0 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/TabContainer/Profile"] +layout_mode = 0 +offset_right = 1116.0 +offset_bottom = 577.0 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/TabContainer/Profile/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="LeftBox" type="VBoxContainer" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.25 + +[node name="Create" type="Button" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +disabled = true +text = "Create" + +[node name="Delete" type="Button" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +disabled = true +text = "Delete" + +[node name="Spacer" type="MarginContainer" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Menu" type="Button" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Menu +" + +[node name="Quit" type="Button" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Quit" + +[node name="RightBox" type="VBoxContainer" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/RightBox"] +layout_mode = 2 +text = "Current Profile:" + +[node name="ProfileName" type="LineEdit" parent="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/RightBox"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Newblood" + +[node name="Join" type="TabBar" parent="MarginContainer/TabContainer"] +visible = false +layout_mode = 2 +select_with_rmb = true + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/TabContainer/Join"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/TabContainer/Join/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="LeftBox" type="VBoxContainer" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.25 + +[node name="Join" type="Button" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Join" + +[node name="Spacer" type="MarginContainer" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Menu" type="Button" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Menu +" + +[node name="Quit" type="Button" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Quit" + +[node name="RightBox" type="VBoxContainer" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="JoinAddress" type="LineEdit" parent="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/RightBox"] +unique_name_in_owner = true +layout_mode = 2 +placeholder_text = "localhost" + +[node name="Host" type="TabBar" parent="MarginContainer/TabContainer"] +visible = false +layout_mode = 2 +select_with_rmb = true + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/TabContainer/Host"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/TabContainer/Host/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="LeftBox" type="VBoxContainer" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.25 + +[node name="Host" type="Button" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Host" + +[node name="Spacer" type="MarginContainer" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Menu" type="Button" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Menu +" + +[node name="Quit" type="Button" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox"] +layout_mode = 2 +text = "Quit" + +[node name="RightBox" type="VBoxContainer" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ServerPort" type="LineEdit" parent="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/RightBox"] +unique_name_in_owner = true +layout_mode = 2 +placeholder_text = "9000" + +[connection signal="pressed" from="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox/Menu" to="." method="_on_menu_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Profile/MarginContainer/HBoxContainer/LeftBox/Quit" to="." method="_on_quit_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox/Join" to="." method="_on_join_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox/Menu" to="." method="_on_menu_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Join/MarginContainer/HBoxContainer/LeftBox/Quit" to="." method="_on_quit_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox/Host" to="." method="_on_host_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox/Menu" to="." method="_on_menu_pressed"] +[connection signal="pressed" from="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/LeftBox/Quit" to="." method="_on_quit_pressed"] +[connection signal="text_changed" from="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/RightBox/ServerPort" to="MarginContainer/TabContainer/Host/MarginContainer/HBoxContainer/RightBox/ServerPort" method="_on_text_changed"] diff --git a/main.tscn b/main.tscn new file mode 100644 index 0000000..49047f0 --- /dev/null +++ b/main.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=3 format=3 uid="uid://58gb6qi4jojs"] + +[ext_resource type="PackedScene" uid="uid://bjctlqvs33nqy" path="res://interfaces/menus/boot/boot.tscn" id="1_acy5o"] + +[sub_resource type="GDScript" id="GDScript_e61dq"] +script/source = "extends Node3D + +func _unhandled_input(event): + # exit the program + if event.is_action_pressed(\"exit\"): + get_tree().quit() + # switch window mode + if event.is_action_pressed(\"window_mode\"): + if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) +" + +[node name="Game" type="Node3D"] +script = SubResource("GDScript_e61dq") + +[node name="MainMenu" parent="." instance=ExtResource("1_acy5o")] diff --git a/maps/genesis/genesis.tscn b/maps/genesis/genesis.tscn new file mode 100644 index 0000000..baec426 --- /dev/null +++ b/maps/genesis/genesis.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=7 format=3 uid="uid://chbno00ugl6te"] + +[ext_resource type="Terrain3DStorage" uid="uid://dyon4xda4k40d" path="res://maps/genesis/resources/storage.res" id="1_a88qe"] +[ext_resource type="Terrain3DMaterial" uid="uid://bd4lr5sxu8xu" path="res://maps/genesis/resources/material.res" id="2_o2y3d"] +[ext_resource type="Terrain3DTextureList" uid="uid://dnqa8kxgm3xuw" path="res://maps/genesis/resources/textures.res" id="3_1cww7"] + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_gi1uj"] +sky_top_color = Color(0.384314, 0.454902, 0.54902, 1) +sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) +ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) + +[sub_resource type="Sky" id="Sky_t5qlv"] +sky_material = SubResource("ProceduralSkyMaterial_gi1uj") +process_mode = 1 +radiance_size = 4 + +[sub_resource type="Environment" id="Environment_6whfw"] +background_mode = 2 +sky = SubResource("Sky_t5qlv") +tonemap_mode = 3 +glow_normalized = true +glow_intensity = 2.0 +glow_strength = 0.96 +fog_light_color = Color(0.721569, 0.494118, 0.294118, 1) +fog_sun_scatter = 0.27 +fog_density = 0.0001 +fog_aerial_perspective = 0.602 +fog_sky_affect = 0.518 +volumetric_fog_density = 0.003 +volumetric_fog_albedo = Color(1, 0.380392, 0.380392, 1) +volumetric_fog_emission_energy = 192.23 +volumetric_fog_length = 551.32 +volumetric_fog_ambient_inject = 0.37 + +[node name="Map" type="Node3D"] + +[node name="Sunlight" type="DirectionalLight3D" parent="."] +transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866026, -0.500003, 0.749999, -0.43301, 0, 0, 0) +shadow_enabled = true + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_6whfw") + +[node name="Terrain3D" type="Terrain3D" parent="."] +storage = ExtResource("1_a88qe") +material = ExtResource("2_o2y3d") +texture_list = ExtResource("3_1cww7") diff --git a/maps/genesis/resources/material.res b/maps/genesis/resources/material.res new file mode 100644 index 0000000..18c2dca Binary files /dev/null and b/maps/genesis/resources/material.res differ diff --git a/maps/genesis/resources/storage.res b/maps/genesis/resources/storage.res new file mode 100644 index 0000000..322bd92 Binary files /dev/null and b/maps/genesis/resources/storage.res differ diff --git a/maps/genesis/resources/textures.res b/maps/genesis/resources/textures.res new file mode 100644 index 0000000..3338f1e Binary files /dev/null and b/maps/genesis/resources/textures.res differ diff --git a/maps/genesis/textures/ground037_alb_ht.png b/maps/genesis/textures/ground037_alb_ht.png new file mode 100644 index 0000000..165e288 Binary files /dev/null and b/maps/genesis/textures/ground037_alb_ht.png differ diff --git a/maps/genesis/textures/ground037_alb_ht.png.import b/maps/genesis/textures/ground037_alb_ht.png.import new file mode 100644 index 0000000..3124bdb --- /dev/null +++ b/maps/genesis/textures/ground037_alb_ht.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddprscrpsofah" +path.bptc="res://.godot/imported/ground037_alb_ht.png-e94bcf81dfd35d432692c06ac781741b.bptc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://maps/genesis/textures/ground037_alb_ht.png" +dest_files=["res://.godot/imported/ground037_alb_ht.png-e94bcf81dfd35d432692c06ac781741b.bptc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=true +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=2 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/maps/genesis/textures/ground037_nrm_rgh.png b/maps/genesis/textures/ground037_nrm_rgh.png new file mode 100644 index 0000000..0b83c14 Binary files /dev/null and b/maps/genesis/textures/ground037_nrm_rgh.png differ diff --git a/maps/genesis/textures/ground037_nrm_rgh.png.import b/maps/genesis/textures/ground037_nrm_rgh.png.import new file mode 100644 index 0000000..c17bdcd --- /dev/null +++ b/maps/genesis/textures/ground037_nrm_rgh.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1ots7w6i0i1q" +path.bptc="res://.godot/imported/ground037_nrm_rgh.png-81b0e480d48434b2b70dcb00c9b9be8a.bptc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://maps/genesis/textures/ground037_nrm_rgh.png" +dest_files=["res://.godot/imported/ground037_nrm_rgh.png-81b0e480d48434b2b70dcb00c9b9be8a.bptc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=true +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/maps/genesis/textures/rock030_alb_ht.png b/maps/genesis/textures/rock030_alb_ht.png new file mode 100644 index 0000000..ba2396a Binary files /dev/null and b/maps/genesis/textures/rock030_alb_ht.png differ diff --git a/maps/genesis/textures/rock030_alb_ht.png.import b/maps/genesis/textures/rock030_alb_ht.png.import new file mode 100644 index 0000000..be793a9 --- /dev/null +++ b/maps/genesis/textures/rock030_alb_ht.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://br7bfxcxh60df" +path.bptc="res://.godot/imported/rock030_alb_ht.png-194ac44f1664ad902e6112d7c538b8ea.bptc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://maps/genesis/textures/rock030_alb_ht.png" +dest_files=["res://.godot/imported/rock030_alb_ht.png-194ac44f1664ad902e6112d7c538b8ea.bptc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=true +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=2 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/maps/genesis/textures/rock030_nrm_rgh.png b/maps/genesis/textures/rock030_nrm_rgh.png new file mode 100644 index 0000000..b2cb710 Binary files /dev/null and b/maps/genesis/textures/rock030_nrm_rgh.png differ diff --git a/maps/genesis/textures/rock030_nrm_rgh.png.import b/maps/genesis/textures/rock030_nrm_rgh.png.import new file mode 100644 index 0000000..37878b0 --- /dev/null +++ b/maps/genesis/textures/rock030_nrm_rgh.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cr72kjil43vgj" +path.bptc="res://.godot/imported/rock030_nrm_rgh.png-4c72231defef9c07b29c49d8904a13df.bptc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://maps/genesis/textures/rock030_nrm_rgh.png" +dest_files=["res://.godot/imported/rock030_nrm_rgh.png-4c72231defef9c07b29c49d8904a13df.bptc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=true +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=1 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/maps/vortex/vortex_2048.r16 b/maps/vortex/vortex_2048.r16 new file mode 100644 index 0000000..18b7d4b Binary files /dev/null and b/maps/vortex/vortex_2048.r16 differ diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..ae92077 --- /dev/null +++ b/project.godot @@ -0,0 +1,83 @@ +; 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="open-fpsz" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.2", "Forward Plus") +config/icon="res://icon.svg" + +[editor] + +movie_writer/disable_vsync=true + +[editor_plugins] + +enabled=PackedStringArray("res://addons/terrain_3d/plugin.cfg") + +[input] + +forward={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) +] +} +left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) +] +} +right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) +] +} +backward={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) +] +} +ski={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null) +] +} +jump_and_jet={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +exit={ +"deadzone": 0.5, +"events": [null, 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":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +camera={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":80,"key_label":0,"unicode":112,"echo":false,"script":null) +] +} +window_mode={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194342,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +fire_primary={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} + +[physics] + +3d/physics_engine="JoltPhysics3D" +3d/default_gravity=19.6 +3d/default_linear_damp=0.01 diff --git a/shaders/bg.gdshader b/shaders/bg.gdshader new file mode 100644 index 0000000..0abdba8 --- /dev/null +++ b/shaders/bg.gdshader @@ -0,0 +1,8 @@ +shader_type canvas_item; + +uniform sampler2D background : source_color; + +void fragment() { + COLOR = texture(background, UV); +} + diff --git a/shaders/zclip.gdshader b/shaders/zclip.gdshader new file mode 100644 index 0000000..bc15ec3 --- /dev/null +++ b/shaders/zclip.gdshader @@ -0,0 +1,36 @@ +// this shader is applied to spatial nodes +shader_type spatial; + +// specifies the field of view angle in degrees +uniform float FOV : hint_range(0.0, 180.0) = 70.0; + +// sets the base color of the material +uniform vec4 albedo : source_color = vec4(1.0); +// specifies the albedo texture used for the material +uniform sampler2D texture_albedo : source_color; + +// transforms vertex positions and sets up projection matrix +void vertex() { + // calculate tangent of half the FOV angle + float onetanfov = 1.0f / tan(.5f * (FOV * PI / 180.0f)); + // calculate aspect ratio based on viewport size + float aspect = VIEWPORT_SIZE.x / VIEWPORT_SIZE.y; + // modify the projection matrix to adjust FOV + PROJECTION_MATRIX[1][1] = -onetanfov; + PROJECTION_MATRIX[0][0] = onetanfov / aspect; + + // transform vertex position into clip space + POSITION = PROJECTION_MATRIX * MODELVIEW_MATRIX * vec4(VERTEX.xyz, 1.0); + // adjust z-coordinate to prevent clipping + POSITION.z = mix(POSITION.z, 0.0, 0.999); +} + +// calculates final color using albedo texture and color +void fragment() { + // sample albedo texture at the current UV coordinate + vec4 albedo_tex = texture(texture_albedo, UV); + // multiply albedo color with texture color to get final color + ALBEDO = albedo.rgb * albedo_tex.rgb; +} + + diff --git a/weapons/space_gun/assets/SpaceGun.glb b/weapons/space_gun/assets/SpaceGun.glb new file mode 100644 index 0000000..cd52816 Binary files /dev/null and b/weapons/space_gun/assets/SpaceGun.glb differ diff --git a/weapons/space_gun/assets/SpaceGun.glb.import b/weapons/space_gun/assets/SpaceGun.glb.import new file mode 100644 index 0000000..e677290 --- /dev/null +++ b/weapons/space_gun/assets/SpaceGun.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://clq4uym4arpv3" +path="res://.godot/imported/SpaceGun.glb-ee1e940c9dd77150eaf36c6537feefef.scn" + +[deps] + +source_file="res://weapons/space_gun/assets/SpaceGun.glb" +dest_files=["res://.godot/imported/SpaceGun.glb-ee1e940c9dd77150eaf36c6537feefef.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"_defaultMat": { +"use_external/enabled": true, +"use_external/path": "" +}, +"dark": { +"use_external/enabled": true, +"use_external/path": "" +} +} +} +gltf/naming_version=1 +gltf/embedded_image_handling=2 diff --git a/weapons/space_gun/assets/albedo.png b/weapons/space_gun/assets/albedo.png new file mode 100644 index 0000000..4ee4d81 Binary files /dev/null and b/weapons/space_gun/assets/albedo.png differ diff --git a/weapons/space_gun/assets/albedo.png.import b/weapons/space_gun/assets/albedo.png.import new file mode 100644 index 0000000..786b04a --- /dev/null +++ b/weapons/space_gun/assets/albedo.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvtqt0k2ewd07" +path.s3tc="res://.godot/imported/albedo.png-7f543d432ab75668956abd5bcc51a13b.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://weapons/space_gun/assets/albedo.png" +dest_files=["res://.godot/imported/albedo.png-7f543d432ab75668956abd5bcc51a13b.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/weapons/space_gun/assets/material.tres b/weapons/space_gun/assets/material.tres new file mode 100644 index 0000000..323b8c9 --- /dev/null +++ b/weapons/space_gun/assets/material.tres @@ -0,0 +1,11 @@ +[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://de6t4olk7hrs1"] + +[ext_resource type="Texture2D" uid="uid://cvtqt0k2ewd07" path="res://weapons/space_gun/assets/albedo.png" id="1_36iph"] +[ext_resource type="Shader" path="res://shaders/zclip.gdshader" id="1_c4uko"] + +[resource] +render_priority = 0 +shader = ExtResource("1_c4uko") +shader_parameter/FOV = 70.0 +shader_parameter/albedo = Color(1, 1, 1, 1) +shader_parameter/texture_albedo = ExtResource("1_36iph") diff --git a/weapons/space_gun/assets/textures/albedo0.png b/weapons/space_gun/assets/textures/albedo0.png new file mode 100644 index 0000000..4ee4d81 Binary files /dev/null and b/weapons/space_gun/assets/textures/albedo0.png differ diff --git a/weapons/space_gun/assets/textures/albedo0.png.import b/weapons/space_gun/assets/textures/albedo0.png.import new file mode 100644 index 0000000..40f0fc4 --- /dev/null +++ b/weapons/space_gun/assets/textures/albedo0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b30y3pq4u5r0h" +path="res://.godot/imported/albedo0.png-8dedb9e51f95ee8e69f9a00bccf9fb16.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://weapons/space_gun/assets/textures/albedo0.png" +dest_files=["res://.godot/imported/albedo0.png-8dedb9e51f95ee8e69f9a00bccf9fb16.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/weapons/space_gun/projectile.gd b/weapons/space_gun/projectile.gd new file mode 100644 index 0000000..ac28361 --- /dev/null +++ b/weapons/space_gun/projectile.gd @@ -0,0 +1,37 @@ +extends Node3D + +const speed : float = 68.0 +var velocity : Vector3 = Vector3.ZERO + +# @FIXME: with an imaginary box around the map +const lifespan : float = 5.0 # in seconds + +@onready var shape_cast = $ShapeCast3D +@onready var game = get_tree().get_current_scene() + +const EXPLOSION = preload("res://weapons/space_gun/projectile_explosion.tscn") + +func _ready(): + var lifespan_timer = Timer.new() + lifespan_timer.set_wait_time(lifespan) + lifespan_timer.set_one_shot(true) + lifespan_timer.set_autostart(true) + lifespan_timer.timeout.connect(self_destruct) + add_child(lifespan_timer) + +func self_destruct(): + explode(position) + +func explode(spawn_location): + var spawned_explosion = EXPLOSION.instantiate() + spawned_explosion.position = spawn_location + game.add_child(spawned_explosion) + spawned_explosion.explode() + queue_free() + +func _physics_process(delta): + global_position += velocity * delta + shape_cast.target_position = to_local(global_position - velocity) * delta + if shape_cast.is_colliding(): + var contact_point = shape_cast.collision_result[0].point + explode(contact_point) diff --git a/weapons/space_gun/projectile.tscn b/weapons/space_gun/projectile.tscn new file mode 100644 index 0000000..507dc4e --- /dev/null +++ b/weapons/space_gun/projectile.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=4 format=3 uid="uid://dn1tcakam5egs"] + +[ext_resource type="Script" path="res://weapons/space_gun/projectile.gd" id="1_4j1dp"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o6j55"] +albedo_color = Color(0, 0.498039, 0.854902, 1) +emission_enabled = true +emission = Color(0.482353, 0.65098, 1, 1) + +[sub_resource type="SphereShape3D" id="SphereShape3D_umtte"] +radius = 0.3 + +[node name="Projectile" type="Node3D"] +script = ExtResource("1_4j1dp") + +[node name="Mesh" type="CSGSphere3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.2, 0, 0, 0, 1, 0, 0, 0) +radius = 0.3 +radial_segments = 24 +rings = 8 +material = SubResource("StandardMaterial3D_o6j55") + +[node name="ShapeCast3D" type="ShapeCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.2, 0, 0, 0, 1, 0, 0, 0) +shape = SubResource("SphereShape3D_umtte") +target_position = Vector3(0, 0, 0) +margin = 0.1 +max_results = 1 +debug_shape_custom_color = Color(1, 0, 0, 1) diff --git a/weapons/space_gun/projectile_explosion.gd b/weapons/space_gun/projectile_explosion.gd new file mode 100644 index 0000000..ec01e87 --- /dev/null +++ b/weapons/space_gun/projectile_explosion.gd @@ -0,0 +1,24 @@ +extends Node3D + +@onready var fire = $Fire +@onready var explosion_area = $Area3D +var explosion_effect_pending : bool = false + +const impulse_force = 1000; + +func explode(): + explosion_effect_pending = true + fire.emitting = true + +func _physics_process(_delta): + if explosion_effect_pending: + var bodies = explosion_area.get_overlapping_bodies() + + for body in bodies: + if body is RigidBody3D: + var direction = (body.global_position - global_position).normalized() + body.apply_central_impulse(direction * impulse_force) + + explosion_effect_pending = false + await get_tree().create_timer(1.0).timeout + queue_free() diff --git a/weapons/space_gun/projectile_explosion.tscn b/weapons/space_gun/projectile_explosion.tscn new file mode 100644 index 0000000..1d82735 --- /dev/null +++ b/weapons/space_gun/projectile_explosion.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=6 format=3 uid="uid://8atq41j7wd55"] + +[ext_resource type="Script" path="res://weapons/space_gun/projectile_explosion.gd" id="1_fp5td"] + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_3mf41"] +spread = 180.0 +initial_velocity_min = 12.0 +initial_velocity_max = 12.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wpu51"] +albedo_color = Color(0.819608, 0, 0, 1) +emission_enabled = true +emission = Color(1, 0.254902, 0.109804, 1) +emission_energy_multiplier = 4.0 + +[sub_resource type="SphereMesh" id="SphereMesh_k3pnh"] +material = SubResource("StandardMaterial3D_wpu51") + +[sub_resource type="SphereShape3D" id="SphereShape3D_ou8x6"] +radius = 5.0 + +[node name="ProjectileExplosion" type="Node3D"] +script = ExtResource("1_fp5td") + +[node name="Fire" type="GPUParticles3D" parent="."] +emitting = false +amount = 24 +lifetime = 0.5 +one_shot = true +explosiveness = 1.0 +fixed_fps = 60 +process_material = SubResource("ParticleProcessMaterial_3mf41") +draw_pass_1 = SubResource("SphereMesh_k3pnh") + +[node name="Area3D" type="Area3D" parent="."] +input_ray_pickable = false + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] +shape = SubResource("SphereShape3D_ou8x6") diff --git a/weapons/space_gun/space_gun.gd b/weapons/space_gun/space_gun.gd new file mode 100644 index 0000000..eacf221 --- /dev/null +++ b/weapons/space_gun/space_gun.gd @@ -0,0 +1,37 @@ +extends Node3D +class_name SpaceGun + +signal shoot(projectile, velocity, initial_location, initial_rotation) + +const PROJECTILE = preload("res://weapons/space_gun/projectile.tscn") + +@onready var nozzle = $Nozzle +@onready var inventory = get_parent() + +const ammo_max : int = 20 +var ammo : int = ammo_max + +var inheritance : float = 100.0 # percent + +func print_node_properties(node): + var properties = node.get_property_list() + for prop in properties: + prints(prop.name, node.get(prop.name)) + +func _ready(): + shoot.connect(_on_shoot) + +func _input(_event): + if Input.is_action_just_pressed("fire_primary"): + var projectile = PROJECTILE.instantiate() + shoot.emit(projectile, nozzle, inventory.owner) + +func _on_shoot(projectile, origin, player): + projectile.position = origin.global_position + projectile.rotation = origin.global_rotation + projectile.velocity = origin.global_basis.z.normalized() * projectile.speed + var inheritance_factor = clamp(inheritance, 0., 100.) / 100. + projectile.velocity += (player.linear_velocity * inheritance_factor) + inventory.owner.add_sibling(projectile) + var collider = projectile.shape_cast + collider.add_exception(player) diff --git a/weapons/space_gun/space_gun.tscn b/weapons/space_gun/space_gun.tscn new file mode 100644 index 0000000..7068a1e --- /dev/null +++ b/weapons/space_gun/space_gun.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=7 format=3 uid="uid://c8co0qa2omjmh"] + +[ext_resource type="Script" path="res://weapons/space_gun/space_gun.gd" id="1_6sm4s"] +[ext_resource type="Texture2D" uid="uid://cvtqt0k2ewd07" path="res://weapons/space_gun/assets/albedo.png" id="1_51bf5"] +[ext_resource type="Material" uid="uid://de6t4olk7hrs1" path="res://weapons/space_gun/assets/material.tres" id="1_uaehs"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ioife"] +resource_name = "dark" +albedo_color = Color(0, 0, 0, 1) +albedo_texture = ExtResource("1_51bf5") +metallic = 0.35 +texture_filter = 1 + +[sub_resource type="ArrayMesh" id="ArrayMesh_2hpnh"] +_surfaces = [{ +"aabb": AABB(-1.5172, -0.57, -4.4, 1.0692, 1.57, 4.6), +"format": 34896613377, +"index_count": 1632, +"index_data": PackedByteArray(2, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 6, 0, 4, 0, 5, 0, 7, 0, 5, 0, 4, 0, 8, 0, 7, 0, 4, 0, 9, 0, 8, 0, 4, 0, 10, 0, 9, 0, 4, 0, 4, 0, 11, 0, 10, 0, 7, 0, 12, 0, 5, 0, 7, 0, 13, 0, 12, 0, 2, 0, 9, 0, 10, 0, 10, 0, 0, 0, 2, 0, 13, 0, 14, 0, 15, 0, 15, 0, 12, 0, 13, 0, 1, 0, 16, 0, 17, 0, 17, 0, 3, 0, 1, 0, 19, 0, 18, 0, 14, 0, 14, 0, 13, 0, 19, 0, 13, 0, 7, 0, 19, 0, 7, 0, 20, 0, 19, 0, 23, 0, 21, 0, 22, 0, 22, 0, 24, 0, 23, 0, 27, 0, 25, 0, 26, 0, 26, 0, 28, 0, 27, 0, 28, 0, 29, 0, 27, 0, 28, 0, 26, 0, 30, 0, 30, 0, 31, 0, 28, 0, 8, 0, 9, 0, 22, 0, 22, 0, 21, 0, 8, 0, 34, 0, 32, 0, 33, 0, 33, 0, 35, 0, 34, 0, 33, 0, 4, 0, 35, 0, 33, 0, 36, 0, 4, 0, 11, 0, 4, 0, 36, 0, 30, 0, 11, 0, 36, 0, 36, 0, 31, 0, 30, 0, 10, 0, 11, 0, 30, 0, 30, 0, 26, 0, 10, 0, 2, 0, 3, 0, 22, 0, 22, 0, 9, 0, 2, 0, 37, 0, 22, 0, 3, 0, 27, 0, 37, 0, 3, 0, 25, 0, 27, 0, 3, 0, 38, 0, 25, 0, 3, 0, 38, 0, 3, 0, 17, 0, 17, 0, 39, 0, 38, 0, 39, 0, 40, 0, 38, 0, 37, 0, 24, 0, 22, 0, 41, 0, 38, 0, 40, 0, 8, 0, 21, 0, 23, 0, 23, 0, 42, 0, 8, 0, 42, 0, 43, 0, 8, 0, 7, 0, 8, 0, 43, 0, 20, 0, 7, 0, 43, 0, 19, 0, 20, 0, 43, 0, 43, 0, 44, 0, 19, 0, 47, 0, 45, 0, 46, 0, 46, 0, 48, 0, 47, 0, 43, 0, 42, 0, 36, 0, 36, 0, 33, 0, 43, 0, 50, 0, 49, 0, 6, 0, 6, 0, 5, 0, 50, 0, 49, 0, 51, 0, 34, 0, 34, 0, 35, 0, 49, 0, 35, 0, 6, 0, 49, 0, 35, 0, 4, 0, 6, 0, 16, 0, 1, 0, 52, 0, 52, 0, 53, 0, 16, 0, 52, 0, 54, 0, 53, 0, 52, 0, 55, 0, 54, 0, 1, 0, 26, 0, 52, 0, 1, 0, 10, 0, 26, 0, 1, 0, 0, 0, 10, 0, 56, 0, 29, 0, 28, 0, 28, 0, 57, 0, 56, 0, 46, 0, 58, 0, 59, 0, 59, 0, 48, 0, 46, 0, 18, 0, 51, 0, 49, 0, 49, 0, 14, 0, 18, 0, 33, 0, 32, 0, 56, 0, 56, 0, 47, 0, 33, 0, 47, 0, 43, 0, 33, 0, 47, 0, 48, 0, 43, 0, 48, 0, 59, 0, 43, 0, 59, 0, 37, 0, 43, 0, 37, 0, 27, 0, 43, 0, 27, 0, 41, 0, 43, 0, 41, 0, 40, 0, 43, 0, 40, 0, 39, 0, 43, 0, 39, 0, 44, 0, 43, 0, 55, 0, 41, 0, 27, 0, 27, 0, 29, 0, 55, 0, 56, 0, 37, 0, 60, 0, 60, 0, 47, 0, 56, 0, 37, 0, 59, 0, 60, 0, 56, 0, 32, 0, 53, 0, 53, 0, 29, 0, 56, 0, 53, 0, 55, 0, 29, 0, 53, 0, 54, 0, 55, 0, 41, 0, 55, 0, 54, 0, 54, 0, 40, 0, 41, 0, 24, 0, 57, 0, 61, 0, 61, 0, 58, 0, 24, 0, 58, 0, 23, 0, 24, 0, 58, 0, 46, 0, 23, 0, 45, 0, 61, 0, 57, 0, 36, 0, 45, 0, 57, 0, 36, 0, 57, 0, 28, 0, 28, 0, 31, 0, 36, 0, 36, 0, 42, 0, 45, 0, 42, 0, 46, 0, 45, 0, 42, 0, 23, 0, 46, 0, 55, 0, 52, 0, 38, 0, 38, 0, 41, 0, 55, 0, 59, 0, 58, 0, 61, 0, 61, 0, 60, 0, 59, 0, 47, 0, 60, 0, 61, 0, 61, 0, 45, 0, 47, 0, 14, 0, 49, 0, 50, 0, 50, 0, 15, 0, 14, 0, 38, 0, 52, 0, 26, 0, 26, 0, 25, 0, 38, 0, 15, 0, 50, 0, 5, 0, 5, 0, 12, 0, 15, 0, 56, 0, 57, 0, 24, 0, 24, 0, 37, 0, 56, 0, 53, 0, 32, 0, 34, 0, 34, 0, 62, 0, 53, 0, 58, 0, 61, 0, 45, 0, 45, 0, 46, 0, 58, 0, 65, 0, 63, 0, 64, 0, 64, 0, 66, 0, 65, 0, 66, 0, 67, 0, 65, 0, 64, 0, 63, 0, 68, 0, 68, 0, 69, 0, 64, 0, 69, 0, 70, 0, 64, 0, 69, 0, 71, 0, 70, 0, 72, 0, 69, 0, 68, 0, 68, 0, 73, 0, 72, 0, 73, 0, 74, 0, 72, 0, 74, 0, 75, 0, 76, 0, 76, 0, 72, 0, 74, 0, 76, 0, 77, 0, 72, 0, 77, 0, 78, 0, 72, 0, 78, 0, 79, 0, 72, 0, 79, 0, 80, 0, 72, 0, 80, 0, 81, 0, 72, 0, 66, 0, 72, 0, 81, 0, 66, 0, 81, 0, 82, 0, 66, 0, 82, 0, 83, 0, 66, 0, 83, 0, 84, 0, 66, 0, 84, 0, 85, 0, 66, 0, 85, 0, 86, 0, 67, 0, 66, 0, 86, 0, 86, 0, 87, 0, 67, 0, 67, 0, 87, 0, 88, 0, 88, 0, 65, 0, 67, 0, 75, 0, 74, 0, 73, 0, 73, 0, 89, 0, 75, 0, 64, 0, 70, 0, 90, 0, 66, 0, 64, 0, 90, 0, 66, 0, 90, 0, 91, 0, 72, 0, 66, 0, 91, 0, 72, 0, 91, 0, 71, 0, 71, 0, 69, 0, 72, 0, 94, 0, 92, 0, 93, 0, 93, 0, 95, 0, 94, 0, 95, 0, 96, 0, 94, 0, 95, 0, 97, 0, 96, 0, 99, 0, 92, 0, 98, 0, 98, 0, 100, 0, 99, 0, 98, 0, 101, 0, 100, 0, 101, 0, 102, 0, 100, 0, 92, 0, 99, 0, 103, 0, 103, 0, 104, 0, 92, 0, 104, 0, 93, 0, 92, 0, 100, 0, 105, 0, 103, 0, 103, 0, 99, 0, 100, 0, 106, 0, 104, 0, 103, 0, 103, 0, 105, 0, 106, 0, 93, 0, 104, 0, 106, 0, 106, 0, 95, 0, 93, 0, 109, 0, 107, 0, 108, 0, 108, 0, 110, 0, 109, 0, 113, 0, 111, 0, 112, 0, 112, 0, 114, 0, 113, 0, 115, 0, 113, 0, 114, 0, 114, 0, 116, 0, 115, 0, 117, 0, 115, 0, 116, 0, 116, 0, 118, 0, 117, 0, 121, 0, 119, 0, 120, 0, 120, 0, 122, 0, 121, 0, 111, 0, 123, 0, 124, 0, 124, 0, 112, 0, 111, 0, 123, 0, 125, 0, 126, 0, 126, 0, 124, 0, 123, 0, 126, 0, 125, 0, 127, 0, 127, 0, 128, 0, 126, 0, 129, 0, 114, 0, 112, 0, 112, 0, 130, 0, 129, 0, 112, 0, 124, 0, 130, 0, 124, 0, 126, 0, 130, 0, 126, 0, 128, 0, 130, 0, 128, 0, 131, 0, 130, 0, 131, 0, 121, 0, 130, 0, 121, 0, 132, 0, 130, 0, 121, 0, 122, 0, 132, 0, 122, 0, 133, 0, 132, 0, 133, 0, 134, 0, 132, 0, 134, 0, 135, 0, 132, 0, 135, 0, 136, 0, 132, 0, 135, 0, 137, 0, 136, 0, 137, 0, 107, 0, 136, 0, 138, 0, 136, 0, 107, 0, 138, 0, 107, 0, 109, 0, 138, 0, 109, 0, 139, 0, 140, 0, 138, 0, 139, 0, 140, 0, 139, 0, 141, 0, 140, 0, 141, 0, 142, 0, 140, 0, 142, 0, 143, 0, 144, 0, 140, 0, 143, 0, 144, 0, 143, 0, 145, 0, 144, 0, 145, 0, 146, 0, 144, 0, 146, 0, 147, 0, 144, 0, 147, 0, 148, 0, 144, 0, 148, 0, 118, 0, 144, 0, 118, 0, 116, 0, 149, 0, 144, 0, 116, 0, 149, 0, 116, 0, 129, 0, 150, 0, 149, 0, 129, 0, 150, 0, 129, 0, 151, 0, 152, 0, 150, 0, 151, 0, 152, 0, 151, 0, 153, 0, 154, 0, 152, 0, 153, 0, 154, 0, 153, 0, 155, 0, 156, 0, 154, 0, 155, 0, 156, 0, 155, 0, 157, 0, 157, 0, 158, 0, 156, 0, 116, 0, 114, 0, 129, 0, 138, 0, 159, 0, 136, 0, 138, 0, 160, 0, 159, 0, 160, 0, 161, 0, 159, 0, 160, 0, 162, 0, 161, 0, 162, 0, 163, 0, 161, 0, 163, 0, 164, 0, 161, 0, 163, 0, 165, 0, 164, 0, 137, 0, 135, 0, 166, 0, 166, 0, 167, 0, 137, 0, 128, 0, 127, 0, 168, 0, 168, 0, 131, 0, 128, 0, 107, 0, 137, 0, 167, 0, 167, 0, 108, 0, 107, 0, 133, 0, 169, 0, 170, 0, 170, 0, 134, 0, 133, 0, 131, 0, 168, 0, 119, 0, 119, 0, 121, 0, 131, 0, 122, 0, 120, 0, 169, 0, 169, 0, 133, 0, 122, 0, 135, 0, 134, 0, 170, 0, 170, 0, 166, 0, 135, 0, 147, 0, 171, 0, 172, 0, 172, 0, 148, 0, 147, 0, 146, 0, 173, 0, 171, 0, 171, 0, 147, 0, 146, 0, 172, 0, 117, 0, 118, 0, 118, 0, 148, 0, 172, 0, 79, 0, 78, 0, 159, 0, 159, 0, 161, 0, 79, 0, 82, 0, 81, 0, 165, 0, 165, 0, 163, 0, 82, 0, 153, 0, 174, 0, 102, 0, 102, 0, 101, 0, 153, 0, 101, 0, 155, 0, 153, 0, 154, 0, 156, 0, 94, 0, 94, 0, 96, 0, 154, 0, 154, 0, 96, 0, 97, 0, 97, 0, 175, 0, 154, 0, 175, 0, 152, 0, 154, 0, 80, 0, 79, 0, 161, 0, 161, 0, 164, 0, 80, 0, 83, 0, 82, 0, 163, 0, 163, 0, 162, 0, 83, 0, 129, 0, 176, 0, 177, 0, 177, 0, 151, 0, 129, 0, 149, 0, 178, 0, 88, 0, 88, 0, 87, 0, 149, 0, 87, 0, 144, 0, 149, 0, 150, 0, 179, 0, 178, 0, 178, 0, 149, 0, 150, 0, 84, 0, 83, 0, 162, 0, 162, 0, 160, 0, 84, 0, 144, 0, 87, 0, 86, 0, 86, 0, 140, 0, 144, 0, 75, 0, 89, 0, 176, 0, 176, 0, 129, 0, 75, 0, 129, 0, 130, 0, 75, 0, 140, 0, 86, 0, 85, 0, 85, 0, 138, 0, 140, 0, 136, 0, 77, 0, 76, 0, 76, 0, 132, 0, 136, 0, 138, 0, 85, 0, 84, 0, 84, 0, 160, 0, 138, 0, 132, 0, 76, 0, 75, 0, 75, 0, 130, 0, 132, 0, 157, 0, 155, 0, 101, 0, 101, 0, 98, 0, 157, 0, 81, 0, 80, 0, 164, 0, 164, 0, 165, 0, 81, 0, 159, 0, 78, 0, 77, 0, 77, 0, 136, 0, 159, 0, 151, 0, 177, 0, 174, 0, 174, 0, 153, 0, 151, 0, 152, 0, 175, 0, 179, 0, 179, 0, 150, 0, 152, 0, 158, 0, 157, 0, 98, 0, 98, 0, 92, 0, 158, 0, 156, 0, 158, 0, 92, 0, 92, 0, 94, 0, 156, 0, 142, 0, 180, 0, 181, 0, 181, 0, 143, 0, 142, 0, 141, 0, 139, 0, 182, 0, 182, 0, 183, 0, 141, 0, 139, 0, 109, 0, 110, 0, 110, 0, 182, 0, 139, 0, 145, 0, 184, 0, 173, 0, 173, 0, 146, 0, 145, 0, 143, 0, 181, 0, 184, 0, 184, 0, 145, 0, 143, 0, 141, 0, 183, 0, 180, 0, 180, 0, 142, 0, 141, 0, 111, 0, 113, 0, 115, 0, 115, 0, 123, 0, 111, 0, 115, 0, 117, 0, 123, 0, 117, 0, 125, 0, 123, 0, 117, 0, 172, 0, 125, 0, 172, 0, 127, 0, 125, 0, 172, 0, 171, 0, 127, 0, 171, 0, 168, 0, 127, 0, 171, 0, 173, 0, 168, 0, 173, 0, 119, 0, 168, 0, 173, 0, 184, 0, 119, 0, 184, 0, 120, 0, 119, 0, 184, 0, 181, 0, 120, 0, 181, 0, 180, 0, 120, 0, 180, 0, 169, 0, 120, 0, 180, 0, 170, 0, 169, 0, 180, 0, 183, 0, 170, 0, 183, 0, 166, 0, 170, 0, 183, 0, 182, 0, 166, 0, 182, 0, 167, 0, 166, 0, 182, 0, 110, 0, 167, 0, 110, 0, 108, 0, 167, 0, 70, 0, 71, 0, 91, 0, 91, 0, 90, 0, 70, 0, 187, 0, 185, 0, 186, 0, 186, 0, 188, 0, 187, 0, 188, 0, 186, 0, 105, 0, 105, 0, 100, 0, 188, 0, 190, 0, 189, 0, 63, 0, 63, 0, 65, 0, 190, 0, 193, 0, 191, 0, 192, 0, 192, 0, 194, 0, 193, 0, 73, 0, 68, 0, 195, 0, 195, 0, 196, 0, 73, 0, 63, 0, 189, 0, 192, 0, 192, 0, 185, 0, 63, 0, 185, 0, 195, 0, 63, 0, 195, 0, 68, 0, 63, 0, 191, 0, 106, 0, 105, 0, 105, 0, 186, 0, 191, 0, 186, 0, 192, 0, 191, 0, 186, 0, 185, 0, 192, 0, 95, 0, 106, 0, 191, 0, 191, 0, 193, 0, 95, 0, 73, 0, 196, 0, 187, 0, 187, 0, 176, 0, 73, 0, 176, 0, 89, 0, 73, 0, 188, 0, 100, 0, 102, 0, 102, 0, 174, 0, 188, 0, 174, 0, 177, 0, 188, 0, 177, 0, 187, 0, 188, 0, 177, 0, 176, 0, 187, 0, 175, 0, 97, 0, 95, 0, 95, 0, 193, 0, 175, 0, 193, 0, 179, 0, 175, 0, 193, 0, 194, 0, 179, 0, 194, 0, 178, 0, 179, 0, 194, 0, 190, 0, 178, 0, 190, 0, 65, 0, 178, 0, 65, 0, 88, 0, 178, 0, 190, 0, 194, 0, 192, 0, 192, 0, 189, 0, 190, 0, 187, 0, 196, 0, 195, 0, 195, 0, 185, 0, 187, 0, 199, 0, 197, 0, 198, 0, 198, 0, 200, 0, 199, 0, 200, 0, 201, 0, 199, 0, 201, 0, 202, 0, 199, 0, 202, 0, 203, 0, 199, 0, 204, 0, 202, 0, 201, 0, 205, 0, 204, 0, 201, 0, 206, 0, 205, 0, 201, 0, 201, 0, 207, 0, 206, 0, 205, 0, 208, 0, 204, 0, 209, 0, 208, 0, 205, 0, 205, 0, 210, 0, 209, 0, 213, 0, 211, 0, 212, 0, 212, 0, 214, 0, 213, 0, 214, 0, 215, 0, 213, 0, 218, 0, 216, 0, 217, 0, 217, 0, 219, 0, 218, 0, 216, 0, 220, 0, 212, 0, 212, 0, 211, 0, 216, 0, 211, 0, 217, 0, 216, 0, 211, 0, 221, 0, 217, 0, 210, 0, 220, 0, 216, 0, 216, 0, 218, 0, 210, 0, 218, 0, 222, 0, 210, 0, 213, 0, 215, 0, 222, 0, 222, 0, 218, 0, 213, 0, 218, 0, 223, 0, 213, 0, 218, 0, 219, 0, 223, 0, 223, 0, 221, 0, 211, 0, 211, 0, 213, 0, 223, 0, 225, 0, 224, 0, 212, 0, 212, 0, 220, 0, 225, 0, 214, 0, 212, 0, 224, 0, 224, 0, 197, 0, 214, 0, 197, 0, 199, 0, 214, 0, 197, 0, 224, 0, 226, 0, 206, 0, 227, 0, 225, 0, 225, 0, 220, 0, 210, 0, 210, 0, 206, 0, 225, 0, 210, 0, 205, 0, 206, 0, 198, 0, 197, 0, 226, 0, 226, 0, 227, 0, 198, 0, 227, 0, 207, 0, 198, 0, 227, 0, 206, 0, 207, 0, 214, 0, 199, 0, 203, 0, 203, 0, 228, 0, 214, 0, 225, 0, 227, 0, 226, 0, 226, 0, 224, 0, 225, 0, 214, 0, 228, 0, 229, 0, 229, 0, 230, 0, 214, 0, 228, 0, 231, 0, 229, 0, 215, 0, 214, 0, 230, 0, 230, 0, 222, 0, 215, 0, 230, 0, 232, 0, 222, 0, 232, 0, 233, 0, 222, 0, 229, 0, 231, 0, 234, 0, 234, 0, 233, 0, 229, 0, 234, 0, 235, 0, 233, 0, 237, 0, 236, 0, 233, 0, 209, 0, 210, 0, 233, 0, 235, 0, 237, 0, 233, 0, 236, 0, 209, 0, 233, 0, 210, 0, 222, 0, 233, 0, 238, 0, 234, 0, 231, 0, 231, 0, 228, 0, 203, 0, 239, 0, 231, 0, 203, 0, 239, 0, 203, 0, 202, 0, 202, 0, 240, 0, 239, 0, 240, 0, 241, 0, 239, 0, 240, 0, 242, 0, 241, 0, 240, 0, 243, 0, 242, 0, 244, 0, 240, 0, 202, 0, 202, 0, 204, 0, 244, 0, 246, 0, 245, 0, 198, 0, 198, 0, 207, 0, 246, 0, 246, 0, 207, 0, 201, 0, 201, 0, 247, 0, 246, 0, 247, 0, 248, 0, 246, 0, 248, 0, 249, 0, 246, 0, 248, 0, 233, 0, 249, 0, 233, 0, 232, 0, 249, 0, 230, 0, 229, 0, 250, 0, 250, 0, 245, 0, 230, 0, 245, 0, 251, 0, 230, 0, 245, 0, 250, 0, 252, 0, 245, 0, 252, 0, 200, 0, 200, 0, 198, 0, 245, 0, 251, 0, 249, 0, 232, 0, 232, 0, 230, 0, 251, 0, 245, 0, 246, 0, 249, 0, 249, 0, 251, 0, 245, 0, 247, 0, 252, 0, 250, 0, 250, 0, 248, 0, 247, 0, 201, 0, 200, 0, 252, 0, 252, 0, 247, 0, 201, 0, 248, 0, 250, 0, 253, 0, 253, 0, 233, 0, 248, 0, 253, 0, 254, 0, 233, 0, 254, 0, 242, 0, 233, 0, 243, 0, 253, 0, 250, 0, 254, 0, 253, 0, 243, 0, 243, 0, 242, 0, 254, 0, 250, 0, 229, 0, 243, 0, 229, 0, 242, 0, 243, 0, 229, 0, 233, 0, 242, 0, 204, 0, 208, 0, 255, 0, 255, 0, 244, 0, 204, 0, 208, 0, 209, 0, 255, 0, 255, 0, 0, 1, 244, 0, 0, 1, 254, 0, 244, 0, 254, 0, 253, 0, 244, 0, 236, 0, 255, 0, 209, 0, 2, 1, 1, 1, 238, 0, 238, 0, 237, 0, 2, 1, 234, 0, 3, 1, 4, 1, 4, 1, 235, 0, 234, 0, 255, 0, 239, 0, 241, 0, 241, 0, 0, 1, 255, 0, 253, 0, 243, 0, 240, 0, 240, 0, 244, 0, 253, 0, 234, 0, 238, 0, 1, 1, 1, 1, 3, 1, 234, 0, 4, 1, 3, 1, 1, 1, 1, 1, 2, 1, 4, 1, 231, 0, 239, 0, 255, 0, 255, 0, 236, 0, 231, 0, 236, 0, 238, 0, 231, 0, 236, 0, 237, 0, 238, 0, 2, 1, 237, 0, 235, 0, 235, 0, 4, 1, 2, 1, 0, 1, 241, 0, 242, 0, 242, 0, 254, 0, 0, 1, 7, 1, 5, 1, 6, 1, 6, 1, 8, 1, 7, 1, 10, 1, 9, 1, 221, 0, 221, 0, 223, 0, 10, 1, 219, 0, 217, 0, 5, 1, 5, 1, 7, 1, 219, 0, 12, 1, 11, 1, 9, 1, 9, 1, 10, 1, 12, 1, 6, 1, 11, 1, 12, 1, 12, 1, 8, 1, 6, 1, 5, 1, 217, 0, 221, 0, 221, 0, 9, 1, 5, 1, 9, 1, 6, 1, 5, 1, 9, 1, 11, 1, 6, 1, 10, 1, 223, 0, 219, 0, 219, 0, 7, 1, 10, 1, 7, 1, 12, 1, 10, 1, 7, 1, 8, 1, 12, 1), +"name": "_defaultMat", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 275, +"vertex_data": PackedByteArray(187, 165, 235, 123, 188, 105, 0, 0, 187, 165, 235, 123, 222, 52, 0, 0, 123, 103, 235, 123, 188, 105, 0, 0, 123, 103, 235, 123, 222, 52, 0, 0, 75, 181, 90, 232, 188, 105, 0, 0, 43, 150, 90, 232, 188, 105, 0, 0, 187, 165, 215, 247, 188, 105, 0, 0, 234, 87, 90, 232, 188, 105, 0, 0, 234, 87, 230, 154, 188, 105, 0, 0, 123, 103, 230, 154, 188, 105, 0, 0, 187, 165, 230, 154, 188, 105, 0, 0, 75, 181, 230, 154, 188, 105, 0, 0, 11, 119, 90, 232, 188, 105, 0, 0, 123, 103, 215, 247, 188, 105, 0, 0, 123, 103, 215, 247, 220, 15, 0, 0, 11, 119, 90, 232, 111, 26, 0, 0, 187, 165, 0, 0, 146, 10, 0, 0, 123, 103, 0, 0, 146, 10, 0, 0, 123, 103, 215, 247, 146, 10, 0, 0, 234, 87, 90, 232, 146, 10, 0, 0, 234, 87, 90, 232, 220, 15, 0, 0, 234, 87, 230, 154, 222, 52, 0, 0, 123, 103, 230, 154, 222, 52, 0, 0, 234, 87, 100, 170, 222, 52, 0, 0, 123, 103, 100, 170, 222, 52, 0, 0, 123, 103, 230, 154, 148, 47, 0, 0, 187, 165, 230, 154, 148, 47, 0, 0, 123, 103, 220, 216, 148, 47, 0, 0, 187, 165, 100, 170, 148, 47, 0, 0, 187, 165, 220, 216, 148, 47, 0, 0, 75, 181, 230, 154, 148, 47, 0, 0, 75, 181, 100, 170, 148, 47, 0, 0, 75, 181, 220, 216, 146, 10, 0, 0, 75, 181, 220, 216, 115, 100, 0, 0, 75, 181, 90, 232, 146, 10, 0, 0, 75, 181, 90, 232, 220, 15, 0, 0, 75, 181, 100, 170, 115, 100, 0, 0, 123, 103, 220, 216, 222, 52, 0, 0, 123, 103, 115, 77, 37, 21, 0, 0, 123, 103, 220, 216, 146, 10, 0, 0, 123, 103, 220, 216, 220, 15, 0, 0, 123, 103, 220, 216, 37, 21, 0, 0, 234, 87, 100, 170, 115, 100, 0, 0, 234, 87, 220, 216, 115, 100, 0, 0, 234, 87, 220, 216, 146, 10, 0, 0, 43, 150, 100, 170, 224, 89, 0, 0, 123, 103, 100, 170, 224, 89, 0, 0, 43, 150, 220, 216, 224, 89, 0, 0, 123, 103, 220, 216, 224, 89, 0, 0, 187, 165, 215, 247, 220, 15, 0, 0, 43, 150, 90, 232, 111, 26, 0, 0, 187, 165, 215, 247, 146, 10, 0, 0, 187, 165, 115, 77, 37, 21, 0, 0, 187, 165, 220, 216, 146, 10, 0, 0, 187, 165, 220, 216, 220, 15, 0, 0, 187, 165, 220, 216, 37, 21, 0, 0, 187, 165, 220, 216, 222, 52, 0, 0, 187, 165, 100, 170, 222, 52, 0, 0, 123, 103, 100, 170, 151, 84, 0, 0, 123, 103, 220, 216, 151, 84, 0, 0, 43, 150, 220, 216, 151, 84, 0, 0, 43, 150, 100, 170, 151, 84, 0, 0, 187, 165, 90, 232, 146, 10, 0, 0, 249, 63, 98, 223, 10, 217, 0, 0, 234, 87, 255, 255, 10, 217, 0, 0, 249, 63, 98, 223, 221, 244, 0, 0, 234, 87, 255, 255, 110, 250, 0, 0, 249, 63, 98, 223, 110, 250, 0, 0, 176, 183, 98, 223, 10, 217, 0, 0, 191, 159, 255, 255, 10, 217, 0, 0, 220, 111, 255, 255, 10, 217, 0, 0, 205, 135, 255, 255, 10, 217, 0, 0, 191, 159, 255, 255, 110, 250, 0, 0, 176, 183, 98, 223, 221, 244, 0, 0, 176, 183, 98, 223, 110, 250, 0, 0, 191, 159, 98, 223, 110, 250, 0, 0, 133, 158, 183, 229, 110, 250, 0, 0, 239, 154, 157, 235, 110, 250, 0, 0, 58, 149, 174, 240, 110, 250, 0, 0, 202, 141, 145, 244, 110, 250, 0, 0, 32, 133, 2, 247, 110, 250, 0, 0, 212, 123, 215, 247, 110, 250, 0, 0, 137, 114, 2, 247, 110, 250, 0, 0, 223, 105, 145, 244, 110, 250, 0, 0, 111, 98, 174, 240, 110, 250, 0, 0, 186, 92, 157, 235, 110, 250, 0, 0, 36, 89, 183, 229, 110, 250, 0, 0, 234, 87, 98, 223, 110, 250, 0, 0, 234, 87, 98, 223, 221, 244, 0, 0, 191, 159, 98, 223, 221, 244, 0, 0, 220, 111, 255, 255, 221, 244, 0, 0, 205, 135, 255, 255, 221, 244, 0, 0, 212, 123, 80, 166, 221, 244, 0, 0, 234, 87, 80, 166, 221, 244, 0, 0, 137, 114, 66, 168, 221, 244, 0, 0, 234, 87, 119, 174, 221, 244, 0, 0, 223, 105, 246, 173, 221, 244, 0, 0, 117, 105, 119, 174, 221, 244, 0, 0, 32, 133, 66, 168, 221, 244, 0, 0, 191, 159, 80, 166, 221, 244, 0, 0, 191, 159, 119, 174, 221, 244, 0, 0, 202, 141, 246, 173, 221, 244, 0, 0, 52, 142, 119, 174, 221, 244, 0, 0, 191, 159, 80, 166, 10, 217, 0, 0, 234, 87, 80, 166, 10, 217, 0, 0, 191, 159, 119, 174, 10, 217, 0, 0, 234, 87, 119, 174, 10, 217, 0, 0, 212, 123, 137, 231, 255, 255, 0, 0, 212, 123, 137, 231, 221, 244, 0, 0, 187, 120, 66, 231, 255, 255, 0, 0, 187, 120, 66, 231, 221, 244, 0, 0, 238, 126, 130, 215, 221, 244, 0, 0, 238, 126, 130, 215, 255, 255, 0, 0, 212, 123, 59, 215, 221, 244, 0, 0, 212, 123, 59, 215, 255, 255, 0, 0, 187, 120, 130, 215, 221, 244, 0, 0, 187, 120, 130, 215, 255, 255, 0, 0, 216, 117, 83, 216, 221, 244, 0, 0, 216, 117, 83, 216, 255, 255, 0, 0, 205, 135, 98, 223, 221, 244, 0, 0, 101, 135, 126, 225, 221, 244, 0, 0, 205, 135, 98, 223, 255, 255, 0, 0, 101, 135, 126, 225, 255, 255, 0, 0, 209, 129, 83, 216, 221, 244, 0, 0, 209, 129, 83, 216, 255, 255, 0, 0, 76, 132, 158, 217, 221, 244, 0, 0, 76, 132, 158, 217, 255, 255, 0, 0, 51, 134, 79, 219, 221, 244, 0, 0, 51, 134, 79, 219, 255, 255, 0, 0, 133, 158, 157, 208, 255, 255, 0, 0, 191, 159, 98, 223, 255, 255, 0, 0, 101, 135, 70, 221, 255, 255, 0, 0, 133, 158, 183, 229, 255, 255, 0, 0, 51, 134, 118, 227, 255, 255, 0, 0, 76, 132, 38, 229, 255, 255, 0, 0, 209, 129, 114, 230, 255, 255, 0, 0, 239, 154, 157, 235, 255, 255, 0, 0, 238, 126, 66, 231, 255, 255, 0, 0, 186, 92, 157, 235, 255, 255, 0, 0, 216, 117, 114, 230, 255, 255, 0, 0, 36, 89, 183, 229, 255, 255, 0, 0, 93, 115, 38, 229, 255, 255, 0, 0, 118, 113, 118, 227, 255, 255, 0, 0, 68, 112, 126, 225, 255, 255, 0, 0, 234, 87, 98, 223, 255, 255, 0, 0, 220, 111, 98, 223, 255, 255, 0, 0, 68, 112, 70, 221, 255, 255, 0, 0, 118, 113, 79, 219, 255, 255, 0, 0, 93, 115, 158, 217, 255, 255, 0, 0, 36, 89, 157, 208, 255, 255, 0, 0, 186, 92, 217, 194, 255, 255, 0, 0, 239, 154, 217, 194, 255, 255, 0, 0, 111, 98, 7, 183, 255, 255, 0, 0, 58, 149, 7, 183, 255, 255, 0, 0, 223, 105, 246, 173, 255, 255, 0, 0, 202, 141, 246, 173, 255, 255, 0, 0, 137, 114, 66, 168, 255, 255, 0, 0, 32, 133, 66, 168, 255, 255, 0, 0, 212, 123, 80, 166, 255, 255, 0, 0, 58, 149, 174, 240, 255, 255, 0, 0, 111, 98, 174, 240, 255, 255, 0, 0, 202, 141, 145, 244, 255, 255, 0, 0, 223, 105, 145, 244, 255, 255, 0, 0, 137, 114, 2, 247, 255, 255, 0, 0, 32, 133, 2, 247, 255, 255, 0, 0, 212, 123, 215, 247, 255, 255, 0, 0, 209, 129, 114, 230, 221, 244, 0, 0, 238, 126, 66, 231, 221, 244, 0, 0, 101, 135, 70, 221, 221, 244, 0, 0, 51, 134, 118, 227, 221, 244, 0, 0, 76, 132, 38, 229, 221, 244, 0, 0, 118, 113, 79, 219, 221, 244, 0, 0, 93, 115, 158, 217, 221, 244, 0, 0, 68, 112, 70, 221, 221, 244, 0, 0, 58, 149, 7, 183, 221, 244, 0, 0, 111, 98, 7, 183, 221, 244, 0, 0, 133, 158, 157, 208, 221, 244, 0, 0, 239, 154, 217, 194, 221, 244, 0, 0, 36, 89, 157, 208, 221, 244, 0, 0, 186, 92, 217, 194, 221, 244, 0, 0, 118, 113, 118, 227, 221, 244, 0, 0, 68, 112, 126, 225, 221, 244, 0, 0, 216, 117, 114, 230, 221, 244, 0, 0, 93, 115, 38, 229, 221, 244, 0, 0, 220, 111, 98, 223, 221, 244, 0, 0, 183, 171, 20, 207, 10, 217, 0, 0, 183, 171, 198, 190, 10, 217, 0, 0, 183, 171, 20, 207, 221, 244, 0, 0, 183, 171, 198, 190, 221, 244, 0, 0, 249, 63, 20, 207, 10, 217, 0, 0, 249, 63, 20, 207, 221, 244, 0, 0, 242, 75, 198, 190, 10, 217, 0, 0, 242, 75, 20, 207, 10, 217, 0, 0, 242, 75, 198, 190, 221, 244, 0, 0, 242, 75, 20, 207, 221, 244, 0, 0, 176, 183, 20, 207, 10, 217, 0, 0, 176, 183, 20, 207, 221, 244, 0, 0, 255, 223, 7, 119, 28, 129, 0, 0, 50, 179, 7, 119, 28, 129, 0, 0, 255, 223, 209, 173, 43, 164, 0, 0, 50, 179, 186, 132, 224, 137, 0, 0, 204, 76, 186, 132, 224, 137, 0, 0, 255, 159, 30, 160, 104, 155, 0, 0, 255, 159, 209, 173, 43, 164, 0, 0, 255, 95, 30, 160, 104, 155, 0, 0, 255, 31, 209, 173, 43, 164, 0, 0, 255, 31, 7, 119, 28, 129, 0, 0, 204, 76, 7, 119, 28, 129, 0, 0, 255, 95, 209, 173, 43, 164, 0, 0, 255, 95, 131, 187, 43, 164, 0, 0, 255, 31, 131, 187, 43, 164, 0, 0, 255, 255, 14, 208, 188, 105, 0, 0, 255, 223, 131, 187, 188, 105, 0, 0, 254, 255, 14, 208, 154, 222, 0, 0, 255, 223, 131, 187, 43, 164, 0, 0, 255, 223, 131, 187, 154, 222, 0, 0, 0, 0, 14, 208, 188, 105, 0, 0, 0, 0, 193, 221, 188, 105, 0, 0, 0, 0, 14, 208, 154, 222, 0, 0, 0, 0, 193, 221, 154, 222, 0, 0, 255, 31, 131, 187, 188, 105, 0, 0, 255, 255, 193, 221, 188, 105, 0, 0, 255, 31, 131, 187, 154, 222, 0, 0, 254, 255, 193, 221, 154, 222, 0, 0, 255, 223, 209, 173, 108, 117, 0, 0, 255, 31, 209, 173, 108, 117, 0, 0, 255, 223, 7, 119, 188, 105, 0, 0, 255, 31, 7, 119, 188, 105, 0, 0, 255, 159, 131, 187, 43, 164, 0, 0, 50, 179, 131, 187, 59, 199, 0, 0, 50, 179, 131, 187, 235, 210, 0, 0, 255, 159, 131, 187, 3, 170, 0, 0, 204, 76, 131, 187, 235, 210, 0, 0, 204, 76, 131, 187, 59, 199, 0, 0, 204, 140, 131, 187, 179, 181, 0, 0, 50, 115, 131, 187, 179, 181, 0, 0, 255, 95, 131, 187, 3, 170, 0, 0, 50, 115, 131, 187, 3, 170, 0, 0, 204, 140, 131, 187, 3, 170, 0, 0, 255, 159, 247, 166, 3, 170, 0, 0, 255, 159, 30, 160, 139, 187, 0, 0, 255, 159, 247, 166, 31, 185, 0, 0, 255, 159, 128, 183, 59, 199, 0, 0, 255, 159, 209, 173, 59, 199, 0, 0, 255, 95, 30, 160, 139, 187, 0, 0, 50, 179, 7, 119, 59, 199, 0, 0, 204, 76, 7, 119, 59, 199, 0, 0, 204, 76, 186, 132, 100, 194, 0, 0, 204, 76, 102, 138, 59, 199, 0, 0, 204, 76, 186, 132, 235, 210, 0, 0, 50, 179, 102, 138, 59, 199, 0, 0, 50, 179, 186, 132, 235, 210, 0, 0, 50, 179, 186, 132, 100, 194, 0, 0, 255, 95, 209, 173, 59, 199, 0, 0, 255, 95, 128, 183, 59, 199, 0, 0, 255, 95, 247, 166, 3, 170, 0, 0, 255, 95, 247, 166, 31, 185, 0, 0, 204, 140, 209, 173, 179, 181, 0, 0, 50, 115, 209, 173, 179, 181, 0, 0, 204, 140, 209, 173, 53, 185, 0, 0, 50, 115, 209, 173, 53, 185, 0, 0, 0, 0, 115, 235, 188, 105, 0, 0, 255, 31, 255, 255, 188, 105, 0, 0, 0, 0, 115, 235, 154, 222, 0, 0, 255, 31, 255, 255, 154, 222, 0, 0, 255, 255, 115, 235, 188, 105, 0, 0, 254, 255, 115, 235, 154, 222, 0, 0, 255, 223, 255, 255, 188, 105, 0, 0, 255, 223, 255, 255, 154, 222, 0, 0, 11, 119, 125, 15, 0, 0, 0, 0, 11, 119, 220, 216, 0, 0, 0, 0, 11, 119, 90, 232, 0, 0, 0, 0, 43, 150, 220, 216, 0, 0, 0, 0, 43, 150, 90, 232, 0, 0, 0, 0, 43, 150, 125, 15, 0, 0, 0, 0) +}, { +"aabb": AABB(-1.5172, -0.57, -4.4, 1.0692, 1.57, 4.6), +"format": 34896613377, +"index_count": 60, +"index_data": PackedByteArray(17, 0, 13, 1, 14, 1, 14, 1, 39, 0, 17, 0, 19, 0, 44, 0, 14, 1, 14, 1, 15, 1, 19, 0, 17, 1, 16, 1, 32, 0, 32, 0, 34, 0, 17, 1, 14, 1, 13, 1, 18, 1, 18, 1, 16, 1, 14, 1, 16, 1, 15, 1, 14, 1, 16, 1, 17, 1, 15, 1, 17, 0, 16, 0, 18, 1, 18, 1, 13, 1, 17, 0, 44, 0, 39, 0, 14, 1, 53, 0, 16, 1, 18, 1, 18, 1, 16, 0, 53, 0, 34, 0, 51, 0, 17, 1, 17, 1, 51, 0, 18, 0, 18, 0, 15, 1, 17, 1, 18, 0, 19, 0, 15, 1, 16, 1, 53, 0, 32, 0), +"name": "dark", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 275, +"vertex_data": PackedByteArray(187, 165, 235, 123, 188, 105, 0, 0, 187, 165, 235, 123, 222, 52, 0, 0, 123, 103, 235, 123, 188, 105, 0, 0, 123, 103, 235, 123, 222, 52, 0, 0, 75, 181, 90, 232, 188, 105, 0, 0, 43, 150, 90, 232, 188, 105, 0, 0, 187, 165, 215, 247, 188, 105, 0, 0, 234, 87, 90, 232, 188, 105, 0, 0, 234, 87, 230, 154, 188, 105, 0, 0, 123, 103, 230, 154, 188, 105, 0, 0, 187, 165, 230, 154, 188, 105, 0, 0, 75, 181, 230, 154, 188, 105, 0, 0, 11, 119, 90, 232, 188, 105, 0, 0, 123, 103, 215, 247, 188, 105, 0, 0, 123, 103, 215, 247, 220, 15, 0, 0, 11, 119, 90, 232, 111, 26, 0, 0, 187, 165, 0, 0, 146, 10, 0, 0, 123, 103, 0, 0, 146, 10, 0, 0, 123, 103, 215, 247, 146, 10, 0, 0, 234, 87, 90, 232, 146, 10, 0, 0, 234, 87, 90, 232, 220, 15, 0, 0, 234, 87, 230, 154, 222, 52, 0, 0, 123, 103, 230, 154, 222, 52, 0, 0, 234, 87, 100, 170, 222, 52, 0, 0, 123, 103, 100, 170, 222, 52, 0, 0, 123, 103, 230, 154, 148, 47, 0, 0, 187, 165, 230, 154, 148, 47, 0, 0, 123, 103, 220, 216, 148, 47, 0, 0, 187, 165, 100, 170, 148, 47, 0, 0, 187, 165, 220, 216, 148, 47, 0, 0, 75, 181, 230, 154, 148, 47, 0, 0, 75, 181, 100, 170, 148, 47, 0, 0, 75, 181, 220, 216, 146, 10, 0, 0, 75, 181, 220, 216, 115, 100, 0, 0, 75, 181, 90, 232, 146, 10, 0, 0, 75, 181, 90, 232, 220, 15, 0, 0, 75, 181, 100, 170, 115, 100, 0, 0, 123, 103, 220, 216, 222, 52, 0, 0, 123, 103, 115, 77, 37, 21, 0, 0, 123, 103, 220, 216, 146, 10, 0, 0, 123, 103, 220, 216, 220, 15, 0, 0, 123, 103, 220, 216, 37, 21, 0, 0, 234, 87, 100, 170, 115, 100, 0, 0, 234, 87, 220, 216, 115, 100, 0, 0, 234, 87, 220, 216, 146, 10, 0, 0, 43, 150, 100, 170, 224, 89, 0, 0, 123, 103, 100, 170, 224, 89, 0, 0, 43, 150, 220, 216, 224, 89, 0, 0, 123, 103, 220, 216, 224, 89, 0, 0, 187, 165, 215, 247, 220, 15, 0, 0, 43, 150, 90, 232, 111, 26, 0, 0, 187, 165, 215, 247, 146, 10, 0, 0, 187, 165, 115, 77, 37, 21, 0, 0, 187, 165, 220, 216, 146, 10, 0, 0, 187, 165, 220, 216, 220, 15, 0, 0, 187, 165, 220, 216, 37, 21, 0, 0, 187, 165, 220, 216, 222, 52, 0, 0, 187, 165, 100, 170, 222, 52, 0, 0, 123, 103, 100, 170, 151, 84, 0, 0, 123, 103, 220, 216, 151, 84, 0, 0, 43, 150, 220, 216, 151, 84, 0, 0, 43, 150, 100, 170, 151, 84, 0, 0, 187, 165, 90, 232, 146, 10, 0, 0, 249, 63, 98, 223, 10, 217, 0, 0, 234, 87, 255, 255, 10, 217, 0, 0, 249, 63, 98, 223, 221, 244, 0, 0, 234, 87, 255, 255, 110, 250, 0, 0, 249, 63, 98, 223, 110, 250, 0, 0, 176, 183, 98, 223, 10, 217, 0, 0, 191, 159, 255, 255, 10, 217, 0, 0, 220, 111, 255, 255, 10, 217, 0, 0, 205, 135, 255, 255, 10, 217, 0, 0, 191, 159, 255, 255, 110, 250, 0, 0, 176, 183, 98, 223, 221, 244, 0, 0, 176, 183, 98, 223, 110, 250, 0, 0, 191, 159, 98, 223, 110, 250, 0, 0, 133, 158, 183, 229, 110, 250, 0, 0, 239, 154, 157, 235, 110, 250, 0, 0, 58, 149, 174, 240, 110, 250, 0, 0, 202, 141, 145, 244, 110, 250, 0, 0, 32, 133, 2, 247, 110, 250, 0, 0, 212, 123, 215, 247, 110, 250, 0, 0, 137, 114, 2, 247, 110, 250, 0, 0, 223, 105, 145, 244, 110, 250, 0, 0, 111, 98, 174, 240, 110, 250, 0, 0, 186, 92, 157, 235, 110, 250, 0, 0, 36, 89, 183, 229, 110, 250, 0, 0, 234, 87, 98, 223, 110, 250, 0, 0, 234, 87, 98, 223, 221, 244, 0, 0, 191, 159, 98, 223, 221, 244, 0, 0, 220, 111, 255, 255, 221, 244, 0, 0, 205, 135, 255, 255, 221, 244, 0, 0, 212, 123, 80, 166, 221, 244, 0, 0, 234, 87, 80, 166, 221, 244, 0, 0, 137, 114, 66, 168, 221, 244, 0, 0, 234, 87, 119, 174, 221, 244, 0, 0, 223, 105, 246, 173, 221, 244, 0, 0, 117, 105, 119, 174, 221, 244, 0, 0, 32, 133, 66, 168, 221, 244, 0, 0, 191, 159, 80, 166, 221, 244, 0, 0, 191, 159, 119, 174, 221, 244, 0, 0, 202, 141, 246, 173, 221, 244, 0, 0, 52, 142, 119, 174, 221, 244, 0, 0, 191, 159, 80, 166, 10, 217, 0, 0, 234, 87, 80, 166, 10, 217, 0, 0, 191, 159, 119, 174, 10, 217, 0, 0, 234, 87, 119, 174, 10, 217, 0, 0, 212, 123, 137, 231, 255, 255, 0, 0, 212, 123, 137, 231, 221, 244, 0, 0, 187, 120, 66, 231, 255, 255, 0, 0, 187, 120, 66, 231, 221, 244, 0, 0, 238, 126, 130, 215, 221, 244, 0, 0, 238, 126, 130, 215, 255, 255, 0, 0, 212, 123, 59, 215, 221, 244, 0, 0, 212, 123, 59, 215, 255, 255, 0, 0, 187, 120, 130, 215, 221, 244, 0, 0, 187, 120, 130, 215, 255, 255, 0, 0, 216, 117, 83, 216, 221, 244, 0, 0, 216, 117, 83, 216, 255, 255, 0, 0, 205, 135, 98, 223, 221, 244, 0, 0, 101, 135, 126, 225, 221, 244, 0, 0, 205, 135, 98, 223, 255, 255, 0, 0, 101, 135, 126, 225, 255, 255, 0, 0, 209, 129, 83, 216, 221, 244, 0, 0, 209, 129, 83, 216, 255, 255, 0, 0, 76, 132, 158, 217, 221, 244, 0, 0, 76, 132, 158, 217, 255, 255, 0, 0, 51, 134, 79, 219, 221, 244, 0, 0, 51, 134, 79, 219, 255, 255, 0, 0, 133, 158, 157, 208, 255, 255, 0, 0, 191, 159, 98, 223, 255, 255, 0, 0, 101, 135, 70, 221, 255, 255, 0, 0, 133, 158, 183, 229, 255, 255, 0, 0, 51, 134, 118, 227, 255, 255, 0, 0, 76, 132, 38, 229, 255, 255, 0, 0, 209, 129, 114, 230, 255, 255, 0, 0, 239, 154, 157, 235, 255, 255, 0, 0, 238, 126, 66, 231, 255, 255, 0, 0, 186, 92, 157, 235, 255, 255, 0, 0, 216, 117, 114, 230, 255, 255, 0, 0, 36, 89, 183, 229, 255, 255, 0, 0, 93, 115, 38, 229, 255, 255, 0, 0, 118, 113, 118, 227, 255, 255, 0, 0, 68, 112, 126, 225, 255, 255, 0, 0, 234, 87, 98, 223, 255, 255, 0, 0, 220, 111, 98, 223, 255, 255, 0, 0, 68, 112, 70, 221, 255, 255, 0, 0, 118, 113, 79, 219, 255, 255, 0, 0, 93, 115, 158, 217, 255, 255, 0, 0, 36, 89, 157, 208, 255, 255, 0, 0, 186, 92, 217, 194, 255, 255, 0, 0, 239, 154, 217, 194, 255, 255, 0, 0, 111, 98, 7, 183, 255, 255, 0, 0, 58, 149, 7, 183, 255, 255, 0, 0, 223, 105, 246, 173, 255, 255, 0, 0, 202, 141, 246, 173, 255, 255, 0, 0, 137, 114, 66, 168, 255, 255, 0, 0, 32, 133, 66, 168, 255, 255, 0, 0, 212, 123, 80, 166, 255, 255, 0, 0, 58, 149, 174, 240, 255, 255, 0, 0, 111, 98, 174, 240, 255, 255, 0, 0, 202, 141, 145, 244, 255, 255, 0, 0, 223, 105, 145, 244, 255, 255, 0, 0, 137, 114, 2, 247, 255, 255, 0, 0, 32, 133, 2, 247, 255, 255, 0, 0, 212, 123, 215, 247, 255, 255, 0, 0, 209, 129, 114, 230, 221, 244, 0, 0, 238, 126, 66, 231, 221, 244, 0, 0, 101, 135, 70, 221, 221, 244, 0, 0, 51, 134, 118, 227, 221, 244, 0, 0, 76, 132, 38, 229, 221, 244, 0, 0, 118, 113, 79, 219, 221, 244, 0, 0, 93, 115, 158, 217, 221, 244, 0, 0, 68, 112, 70, 221, 221, 244, 0, 0, 58, 149, 7, 183, 221, 244, 0, 0, 111, 98, 7, 183, 221, 244, 0, 0, 133, 158, 157, 208, 221, 244, 0, 0, 239, 154, 217, 194, 221, 244, 0, 0, 36, 89, 157, 208, 221, 244, 0, 0, 186, 92, 217, 194, 221, 244, 0, 0, 118, 113, 118, 227, 221, 244, 0, 0, 68, 112, 126, 225, 221, 244, 0, 0, 216, 117, 114, 230, 221, 244, 0, 0, 93, 115, 38, 229, 221, 244, 0, 0, 220, 111, 98, 223, 221, 244, 0, 0, 183, 171, 20, 207, 10, 217, 0, 0, 183, 171, 198, 190, 10, 217, 0, 0, 183, 171, 20, 207, 221, 244, 0, 0, 183, 171, 198, 190, 221, 244, 0, 0, 249, 63, 20, 207, 10, 217, 0, 0, 249, 63, 20, 207, 221, 244, 0, 0, 242, 75, 198, 190, 10, 217, 0, 0, 242, 75, 20, 207, 10, 217, 0, 0, 242, 75, 198, 190, 221, 244, 0, 0, 242, 75, 20, 207, 221, 244, 0, 0, 176, 183, 20, 207, 10, 217, 0, 0, 176, 183, 20, 207, 221, 244, 0, 0, 255, 223, 7, 119, 28, 129, 0, 0, 50, 179, 7, 119, 28, 129, 0, 0, 255, 223, 209, 173, 43, 164, 0, 0, 50, 179, 186, 132, 224, 137, 0, 0, 204, 76, 186, 132, 224, 137, 0, 0, 255, 159, 30, 160, 104, 155, 0, 0, 255, 159, 209, 173, 43, 164, 0, 0, 255, 95, 30, 160, 104, 155, 0, 0, 255, 31, 209, 173, 43, 164, 0, 0, 255, 31, 7, 119, 28, 129, 0, 0, 204, 76, 7, 119, 28, 129, 0, 0, 255, 95, 209, 173, 43, 164, 0, 0, 255, 95, 131, 187, 43, 164, 0, 0, 255, 31, 131, 187, 43, 164, 0, 0, 255, 255, 14, 208, 188, 105, 0, 0, 255, 223, 131, 187, 188, 105, 0, 0, 254, 255, 14, 208, 154, 222, 0, 0, 255, 223, 131, 187, 43, 164, 0, 0, 255, 223, 131, 187, 154, 222, 0, 0, 0, 0, 14, 208, 188, 105, 0, 0, 0, 0, 193, 221, 188, 105, 0, 0, 0, 0, 14, 208, 154, 222, 0, 0, 0, 0, 193, 221, 154, 222, 0, 0, 255, 31, 131, 187, 188, 105, 0, 0, 255, 255, 193, 221, 188, 105, 0, 0, 255, 31, 131, 187, 154, 222, 0, 0, 254, 255, 193, 221, 154, 222, 0, 0, 255, 223, 209, 173, 108, 117, 0, 0, 255, 31, 209, 173, 108, 117, 0, 0, 255, 223, 7, 119, 188, 105, 0, 0, 255, 31, 7, 119, 188, 105, 0, 0, 255, 159, 131, 187, 43, 164, 0, 0, 50, 179, 131, 187, 59, 199, 0, 0, 50, 179, 131, 187, 235, 210, 0, 0, 255, 159, 131, 187, 3, 170, 0, 0, 204, 76, 131, 187, 235, 210, 0, 0, 204, 76, 131, 187, 59, 199, 0, 0, 204, 140, 131, 187, 179, 181, 0, 0, 50, 115, 131, 187, 179, 181, 0, 0, 255, 95, 131, 187, 3, 170, 0, 0, 50, 115, 131, 187, 3, 170, 0, 0, 204, 140, 131, 187, 3, 170, 0, 0, 255, 159, 247, 166, 3, 170, 0, 0, 255, 159, 30, 160, 139, 187, 0, 0, 255, 159, 247, 166, 31, 185, 0, 0, 255, 159, 128, 183, 59, 199, 0, 0, 255, 159, 209, 173, 59, 199, 0, 0, 255, 95, 30, 160, 139, 187, 0, 0, 50, 179, 7, 119, 59, 199, 0, 0, 204, 76, 7, 119, 59, 199, 0, 0, 204, 76, 186, 132, 100, 194, 0, 0, 204, 76, 102, 138, 59, 199, 0, 0, 204, 76, 186, 132, 235, 210, 0, 0, 50, 179, 102, 138, 59, 199, 0, 0, 50, 179, 186, 132, 235, 210, 0, 0, 50, 179, 186, 132, 100, 194, 0, 0, 255, 95, 209, 173, 59, 199, 0, 0, 255, 95, 128, 183, 59, 199, 0, 0, 255, 95, 247, 166, 3, 170, 0, 0, 255, 95, 247, 166, 31, 185, 0, 0, 204, 140, 209, 173, 179, 181, 0, 0, 50, 115, 209, 173, 179, 181, 0, 0, 204, 140, 209, 173, 53, 185, 0, 0, 50, 115, 209, 173, 53, 185, 0, 0, 0, 0, 115, 235, 188, 105, 0, 0, 255, 31, 255, 255, 188, 105, 0, 0, 0, 0, 115, 235, 154, 222, 0, 0, 255, 31, 255, 255, 154, 222, 0, 0, 255, 255, 115, 235, 188, 105, 0, 0, 254, 255, 115, 235, 154, 222, 0, 0, 255, 223, 255, 255, 188, 105, 0, 0, 255, 223, 255, 255, 154, 222, 0, 0, 11, 119, 125, 15, 0, 0, 0, 0, 11, 119, 220, 216, 0, 0, 0, 0, 11, 119, 90, 232, 0, 0, 0, 0, 43, 150, 220, 216, 0, 0, 0, 0, 43, 150, 90, 232, 0, 0, 0, 0, 43, 150, 125, 15, 0, 0, 0, 0) +}] +blend_shape_mode = 0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_hudfn"] +resource_name = "Space-Shooter-Gun_mesh" +_surfaces = [{ +"aabb": AABB(-1.5172, -0.57, -4.4, 1.0692, 1.57, 4.6), +"attribute_data": PackedByteArray(255, 103, 245, 210, 255, 103, 122, 233, 111, 96, 245, 210, 111, 96, 122, 233, 227, 105, 111, 131, 27, 102, 111, 131, 255, 103, 46, 129, 227, 153, 111, 131, 27, 150, 111, 131, 115, 161, 111, 131, 139, 94, 111, 131, 139, 94, 177, 142, 111, 96, 177, 142, 255, 103, 177, 142, 227, 105, 177, 142, 171, 157, 111, 131, 111, 96, 46, 129, 83, 98, 111, 131, 111, 96, 50, 147, 255, 103, 50, 147, 180, 247, 46, 129, 45, 242, 111, 131, 185, 200, 46, 129, 185, 200, 111, 131, 255, 103, 54, 165, 111, 96, 54, 165, 255, 103, 50, 147, 111, 96, 50, 147, 134, 5, 46, 129, 74, 8, 46, 129, 134, 5, 111, 131, 69, 55, 46, 129, 69, 55, 111, 131, 115, 161, 111, 131, 115, 161, 111, 131, 115, 161, 111, 131, 115, 161, 177, 142, 143, 159, 177, 142, 115, 161, 113, 140, 143, 159, 113, 140, 143, 159, 177, 142, 255, 151, 177, 142, 143, 159, 175, 133, 255, 151, 113, 140, 255, 151, 175, 133, 27, 150, 177, 142, 27, 150, 113, 140, 111, 96, 245, 210, 111, 96, 122, 233, 139, 94, 245, 210, 139, 94, 122, 233, 120, 250, 175, 133, 124, 203, 175, 133, 120, 250, 111, 131, 180, 247, 111, 131, 185, 200, 111, 131, 124, 203, 113, 140, 185, 200, 177, 142, 31, 231, 177, 142, 31, 231, 113, 140, 227, 105, 245, 210, 227, 105, 186, 235, 255, 103, 245, 210, 255, 103, 186, 235, 162, 27, 50, 147, 162, 27, 177, 142, 69, 55, 50, 147, 69, 55, 177, 142, 143, 159, 177, 142, 143, 159, 50, 147, 143, 159, 175, 133, 162, 27, 175, 133, 223, 24, 175, 133, 223, 24, 177, 142, 13, 11, 244, 153, 134, 5, 54, 165, 134, 5, 175, 133, 74, 8, 175, 133, 143, 159, 113, 140, 13, 11, 175, 133, 162, 27, 177, 142, 162, 27, 113, 140, 69, 55, 177, 142, 130, 52, 113, 140, 130, 52, 175, 133, 69, 55, 111, 131, 74, 8, 111, 131, 134, 5, 111, 131, 134, 5, 175, 133, 27, 102, 113, 140, 111, 96, 113, 140, 27, 102, 175, 133, 111, 96, 175, 133, 115, 161, 113, 140, 27, 150, 113, 140, 115, 161, 175, 133, 27, 150, 175, 133, 74, 8, 46, 129, 69, 55, 46, 129, 209, 13, 111, 131, 69, 55, 111, 131, 120, 250, 46, 129, 120, 250, 111, 131, 180, 247, 46, 129, 180, 247, 111, 131, 185, 200, 46, 129, 185, 200, 111, 131, 92, 228, 50, 147, 241, 244, 244, 153, 120, 250, 54, 165, 120, 250, 175, 133, 180, 247, 175, 133, 241, 244, 175, 133, 31, 231, 177, 142, 185, 200, 177, 142, 185, 200, 50, 147, 31, 231, 175, 133, 31, 231, 113, 140, 92, 228, 175, 133, 92, 228, 113, 140, 55, 44, 113, 140, 55, 44, 175, 133, 251, 46, 113, 140, 251, 46, 175, 133, 255, 103, 233, 51, 255, 103, 41, 54, 111, 96, 233, 51, 111, 96, 41, 54, 227, 105, 126, 251, 255, 103, 122, 233, 227, 105, 54, 213, 27, 102, 183, 217, 139, 94, 54, 213, 111, 96, 183, 217, 111, 96, 247, 219, 111, 96, 122, 233, 111, 96, 186, 235, 111, 96, 253, 246, 111, 96, 61, 249, 111, 96, 126, 251, 139, 94, 126, 251, 255, 103, 253, 246, 255, 103, 186, 235, 27, 102, 247, 219, 255, 103, 126, 251, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 103, 61, 249, 255, 103, 236, 69, 27, 102, 111, 83, 111, 96, 236, 69, 111, 96, 111, 83, 139, 94, 236, 69, 111, 96, 176, 85, 27, 102, 176, 85, 227, 105, 48, 90, 255, 103, 172, 67, 227, 105, 172, 67, 139, 94, 48, 90, 255, 103, 244, 153, 111, 96, 244, 153, 255, 103, 175, 133, 111, 96, 175, 133, 143, 159, 113, 140, 227, 153, 113, 140, 143, 159, 175, 133, 227, 153, 175, 133, 199, 211, 175, 133, 199, 211, 113, 140, 3, 209, 175, 133, 3, 209, 113, 140, 255, 103, 41, 54, 27, 102, 170, 58, 111, 96, 41, 54, 83, 98, 170, 58, 255, 151, 244, 153, 255, 151, 177, 142, 143, 159, 244, 153, 143, 159, 177, 142, 27, 102, 170, 58, 27, 102, 113, 92, 83, 98, 170, 58, 83, 98, 113, 92, 255, 103, 113, 140, 111, 96, 113, 140, 255, 103, 175, 133, 111, 96, 175, 133, 27, 150, 175, 133, 27, 150, 111, 131, 255, 151, 175, 133, 255, 151, 111, 131, 255, 151, 175, 133, 27, 150, 111, 131, 27, 102, 111, 83, 27, 102, 176, 85, 111, 96, 111, 83, 111, 96, 176, 85, 111, 96, 111, 83, 27, 102, 176, 85, 115, 113, 189, 132, 115, 113, 255, 127, 255, 127, 189, 132, 232, 130, 255, 127, 232, 130, 189, 132, 92, 164, 189, 132, 208, 149, 189, 132, 115, 161, 255, 127, 185, 152, 255, 127, 139, 158, 255, 127, 162, 155, 255, 127, 139, 142, 255, 127, 139, 142, 189, 132, 22, 125, 255, 127, 255, 127, 189, 132, 22, 125, 189, 132, 69, 103, 189, 132, 31, 103, 209, 131, 46, 106, 189, 132, 69, 103, 255, 127, 175, 102, 246, 130, 254, 101, 57, 130, 22, 101, 168, 129, 9, 100, 77, 129, 232, 98, 46, 129, 139, 94, 255, 127, 199, 97, 77, 129, 185, 96, 168, 129, 210, 95, 57, 130, 32, 95, 246, 130, 177, 94, 209, 131, 162, 91, 189, 132, 139, 94, 189, 132, 139, 94, 84, 149, 139, 94, 179, 151, 162, 91, 84, 149, 162, 91, 179, 151, 46, 106, 84, 149, 46, 106, 179, 151, 69, 103, 84, 149, 69, 103, 179, 151, 115, 97, 217, 139, 115, 97, 179, 151, 139, 94, 217, 139, 139, 94, 18, 154, 92, 100, 179, 151, 69, 103, 18, 154, 92, 100, 217, 139, 69, 103, 217, 139, 115, 97, 217, 139, 115, 97, 179, 151, 139, 94, 217, 139, 139, 94, 18, 154, 92, 100, 179, 151, 69, 103, 18, 154, 92, 100, 217, 139, 69, 103, 217, 139, 232, 98, 8, 141, 139, 94, 8, 141, 199, 97, 192, 140, 139, 94, 217, 139, 185, 96, 236, 139, 172, 96, 217, 139, 9, 100, 192, 140, 69, 103, 8, 141, 69, 103, 217, 139, 22, 101, 236, 139, 35, 101, 217, 139, 69, 103, 179, 151, 69, 103, 141, 163, 232, 98, 179, 151, 139, 94, 141, 163, 139, 94, 179, 151, 139, 142, 217, 139, 139, 142, 8, 141, 255, 127, 217, 139, 255, 127, 8, 141, 115, 161, 8, 141, 185, 152, 8, 141, 115, 161, 217, 139, 185, 152, 217, 139, 115, 113, 8, 141, 115, 113, 217, 139, 255, 127, 8, 141, 255, 127, 217, 139, 232, 98, 245, 146, 232, 98, 179, 151, 135, 98, 245, 146, 135, 98, 179, 151, 72, 99, 179, 151, 72, 99, 113, 156, 232, 98, 179, 151, 232, 98, 113, 156, 232, 98, 179, 151, 232, 98, 113, 156, 135, 98, 179, 151, 135, 98, 113, 156, 135, 98, 179, 151, 135, 98, 113, 156, 46, 98, 179, 151, 46, 98, 113, 156, 255, 127, 189, 132, 255, 127, 110, 132, 208, 133, 189, 132, 208, 133, 110, 132, 162, 99, 179, 151, 162, 99, 113, 156, 72, 99, 179, 151, 72, 99, 113, 156, 239, 99, 179, 151, 239, 99, 113, 156, 162, 99, 179, 151, 162, 99, 113, 156, 255, 127, 147, 133, 255, 127, 84, 133, 208, 133, 147, 133, 208, 133, 84, 133, 232, 98, 236, 133, 72, 99, 226, 133, 31, 103, 226, 134, 69, 103, 189, 132, 162, 99, 195, 133, 239, 99, 147, 133, 42, 100, 84, 133, 80, 100, 11, 133, 92, 100, 189, 132, 31, 103, 209, 131, 80, 100, 110, 132, 42, 100, 37, 132, 239, 99, 230, 131, 162, 99, 182, 131, 175, 102, 246, 130, 72, 99, 152, 131, 232, 98, 141, 131, 32, 95, 246, 130, 135, 98, 152, 131, 46, 98, 182, 131, 177, 94, 209, 131, 225, 97, 230, 131, 165, 97, 37, 132, 128, 97, 110, 132, 139, 94, 189, 132, 115, 97, 189, 132, 128, 97, 11, 133, 165, 97, 84, 133, 225, 97, 147, 133, 46, 98, 195, 133, 135, 98, 226, 133, 177, 94, 226, 134, 32, 95, 227, 136, 175, 102, 227, 136, 210, 95, 154, 138, 254, 101, 154, 138, 185, 96, 236, 139, 22, 101, 236, 139, 199, 97, 192, 140, 9, 100, 192, 140, 232, 98, 8, 141, 254, 101, 57, 130, 210, 95, 57, 130, 22, 101, 168, 129, 185, 96, 168, 129, 199, 97, 77, 129, 9, 100, 77, 129, 232, 98, 46, 129, 162, 99, 245, 146, 162, 99, 179, 151, 72, 99, 245, 146, 72, 99, 179, 151, 255, 127, 84, 133, 255, 127, 11, 133, 208, 133, 84, 133, 208, 133, 11, 133, 72, 99, 245, 146, 72, 99, 179, 151, 232, 98, 245, 146, 232, 98, 179, 151, 255, 127, 37, 132, 255, 127, 230, 131, 208, 133, 37, 132, 208, 133, 230, 131, 255, 127, 11, 133, 255, 127, 189, 132, 208, 133, 11, 133, 208, 133, 189, 132, 255, 127, 110, 132, 255, 127, 37, 132, 208, 133, 110, 132, 208, 133, 37, 132, 239, 99, 245, 146, 239, 99, 179, 151, 162, 99, 245, 146, 162, 99, 179, 151, 255, 127, 84, 133, 255, 127, 147, 133, 46, 122, 84, 133, 46, 122, 147, 133, 255, 127, 11, 133, 255, 127, 84, 133, 46, 122, 11, 133, 46, 122, 84, 133, 46, 98, 179, 151, 46, 98, 113, 156, 225, 97, 179, 151, 225, 97, 113, 156, 254, 101, 18, 154, 254, 101, 113, 156, 22, 101, 18, 154, 22, 101, 113, 156, 232, 98, 18, 154, 232, 98, 113, 156, 199, 97, 18, 154, 199, 97, 113, 156, 255, 127, 154, 138, 255, 127, 217, 139, 46, 122, 154, 138, 255, 127, 236, 139, 46, 122, 236, 139, 199, 97, 245, 146, 199, 97, 179, 151, 185, 96, 245, 146, 185, 96, 179, 151, 255, 127, 236, 139, 255, 127, 217, 139, 208, 133, 236, 139, 255, 127, 154, 138, 208, 133, 154, 138, 22, 101, 18, 154, 22, 101, 113, 156, 9, 100, 18, 154, 9, 100, 113, 156, 199, 97, 18, 154, 199, 97, 113, 156, 185, 96, 18, 154, 185, 96, 113, 156, 255, 127, 226, 134, 255, 127, 227, 136, 46, 122, 226, 134, 46, 122, 227, 136, 255, 127, 226, 134, 255, 127, 189, 132, 208, 133, 226, 134, 232, 130, 189, 132, 208, 133, 189, 132, 255, 127, 227, 136, 255, 127, 226, 134, 208, 133, 227, 136, 208, 133, 226, 134, 185, 96, 18, 154, 185, 96, 113, 156, 210, 95, 18, 154, 210, 95, 113, 156, 232, 130, 189, 132, 232, 130, 209, 131, 208, 133, 189, 132, 208, 133, 209, 131, 255, 127, 189, 132, 255, 127, 226, 134, 22, 125, 189, 132, 46, 122, 226, 134, 46, 122, 189, 132, 232, 130, 209, 131, 232, 130, 246, 130, 208, 133, 209, 131, 208, 133, 246, 130, 22, 125, 246, 130, 22, 125, 209, 131, 46, 122, 246, 130, 46, 122, 209, 131, 232, 130, 246, 130, 232, 130, 57, 130, 208, 133, 246, 130, 208, 133, 57, 130, 22, 125, 209, 131, 22, 125, 189, 132, 46, 122, 209, 131, 46, 122, 189, 132, 22, 101, 245, 146, 22, 101, 179, 151, 9, 100, 245, 146, 9, 100, 179, 151, 9, 100, 18, 154, 9, 100, 113, 156, 232, 98, 18, 154, 232, 98, 113, 156, 22, 125, 57, 130, 22, 125, 246, 130, 46, 122, 57, 130, 46, 122, 246, 130, 255, 127, 227, 136, 255, 127, 154, 138, 46, 122, 227, 136, 46, 122, 154, 138, 255, 127, 154, 138, 255, 127, 227, 136, 208, 133, 154, 138, 208, 133, 227, 136, 9, 100, 245, 146, 9, 100, 179, 151, 232, 98, 245, 146, 232, 98, 179, 151, 232, 98, 245, 146, 232, 98, 179, 151, 199, 97, 245, 146, 199, 97, 179, 151, 255, 127, 37, 132, 255, 127, 110, 132, 46, 122, 37, 132, 46, 122, 110, 132, 46, 98, 245, 146, 46, 98, 179, 151, 225, 97, 245, 146, 225, 97, 179, 151, 135, 98, 245, 146, 135, 98, 179, 151, 46, 98, 245, 146, 46, 98, 179, 151, 255, 127, 189, 132, 255, 127, 11, 133, 46, 122, 189, 132, 46, 122, 11, 133, 255, 127, 110, 132, 255, 127, 189, 132, 46, 122, 110, 132, 46, 122, 189, 132, 255, 127, 230, 131, 255, 127, 37, 132, 46, 122, 230, 131, 46, 122, 37, 132, 232, 98, 236, 133, 135, 98, 226, 133, 72, 99, 226, 133, 162, 99, 195, 133, 46, 98, 195, 133, 239, 99, 147, 133, 225, 97, 147, 133, 42, 100, 84, 133, 165, 97, 84, 133, 80, 100, 11, 133, 128, 97, 11, 133, 92, 100, 189, 132, 115, 97, 189, 132, 80, 100, 110, 132, 128, 97, 110, 132, 165, 97, 37, 132, 42, 100, 37, 132, 239, 99, 230, 131, 225, 97, 230, 131, 162, 99, 182, 131, 46, 98, 182, 131, 72, 99, 152, 131, 135, 98, 152, 131, 232, 98, 141, 131, 139, 142, 27, 135, 139, 142, 122, 137, 255, 127, 27, 135, 255, 127, 122, 137, 255, 127, 27, 135, 139, 142, 122, 137, 139, 142, 122, 137, 139, 142, 217, 139, 255, 127, 122, 137, 255, 127, 217, 139, 255, 127, 122, 137, 139, 142, 217, 139, 115, 113, 27, 135, 115, 113, 189, 132, 255, 127, 27, 135, 255, 127, 189, 132, 255, 127, 27, 135, 115, 113, 189, 132, 115, 113, 122, 137, 115, 113, 27, 135, 255, 127, 122, 137, 255, 127, 27, 135, 255, 127, 122, 137, 115, 113, 27, 135, 139, 142, 189, 132, 139, 142, 27, 135, 255, 127, 189, 132, 255, 127, 27, 135, 255, 127, 189, 132, 139, 142, 27, 135, 92, 164, 27, 135, 232, 162, 27, 135, 92, 164, 189, 132, 69, 151, 27, 135, 92, 164, 189, 132, 232, 162, 27, 135, 208, 149, 27, 135, 69, 151, 27, 135, 208, 149, 189, 132, 92, 164, 189, 132, 208, 149, 27, 135, 115, 161, 217, 139, 185, 152, 217, 139, 232, 162, 122, 137, 69, 151, 122, 137, 232, 162, 122, 137, 185, 152, 217, 139, 232, 162, 27, 135, 232, 162, 122, 137, 69, 151, 122, 137, 69, 151, 27, 135, 232, 162, 27, 135, 69, 151, 122, 137, 115, 113, 217, 139, 115, 113, 122, 137, 255, 127, 217, 139, 255, 127, 122, 137, 255, 127, 217, 139, 115, 113, 122, 137, 46, 106, 27, 135, 185, 104, 27, 135, 46, 106, 189, 132, 31, 103, 226, 134, 46, 106, 189, 132, 185, 104, 27, 135, 69, 103, 189, 132, 46, 106, 189, 132, 31, 103, 226, 134, 69, 103, 217, 139, 35, 101, 217, 139, 185, 104, 122, 137, 254, 101, 154, 138, 185, 104, 122, 137, 35, 101, 217, 139, 175, 102, 227, 136, 185, 104, 122, 137, 254, 101, 154, 138, 185, 104, 27, 135, 185, 104, 122, 137, 175, 102, 227, 136, 31, 103, 226, 134, 185, 104, 27, 135, 175, 102, 227, 136, 172, 96, 217, 139, 139, 94, 217, 139, 210, 95, 154, 138, 22, 93, 122, 137, 210, 95, 154, 138, 139, 94, 217, 139, 32, 95, 227, 136, 210, 95, 154, 138, 22, 93, 122, 137, 22, 93, 27, 135, 32, 95, 227, 136, 22, 93, 122, 137, 177, 94, 226, 134, 32, 95, 227, 136, 22, 93, 27, 135, 162, 91, 27, 135, 177, 94, 226, 134, 22, 93, 27, 135, 162, 91, 189, 132, 177, 94, 226, 134, 162, 91, 27, 135, 139, 94, 189, 132, 177, 94, 226, 134, 162, 91, 189, 132, 22, 93, 179, 151, 22, 93, 141, 163, 162, 91, 179, 151, 162, 91, 141, 163, 162, 91, 179, 151, 22, 93, 141, 163, 46, 106, 179, 151, 46, 106, 141, 163, 185, 104, 179, 151, 185, 104, 141, 163, 185, 104, 179, 151, 46, 106, 141, 163, 19, 111, 1, 201, 162, 105, 1, 201, 19, 111, 18, 186, 162, 105, 69, 197, 49, 93, 69, 197, 77, 103, 205, 189, 77, 103, 18, 186, 134, 95, 205, 189, 191, 87, 18, 186, 191, 87, 1, 201, 49, 93, 1, 201, 134, 95, 18, 186, 134, 95, 241, 139, 191, 87, 241, 139, 134, 95, 244, 137, 191, 87, 244, 137, 134, 95, 244, 137, 191, 87, 241, 139, 247, 114, 245, 210, 19, 111, 245, 210, 247, 114, 46, 161, 19, 111, 18, 186, 247, 114, 46, 161, 19, 111, 245, 210, 19, 111, 46, 161, 19, 111, 18, 186, 69, 55, 247, 134, 69, 55, 249, 132, 92, 116, 247, 134, 92, 116, 249, 132, 92, 116, 247, 134, 69, 55, 249, 132, 63, 168, 244, 137, 235, 144, 244, 137, 34, 172, 247, 134, 7, 141, 247, 134, 34, 172, 247, 134, 235, 144, 244, 137, 34, 172, 249, 132, 34, 172, 247, 134, 7, 141, 247, 134, 7, 141, 249, 132, 34, 172, 249, 132, 7, 141, 247, 134, 191, 87, 245, 210, 220, 83, 245, 210, 191, 87, 18, 186, 220, 83, 46, 161, 191, 87, 18, 186, 220, 83, 245, 210, 191, 87, 46, 161, 191, 87, 18, 186, 220, 83, 46, 161, 19, 111, 244, 137, 191, 87, 244, 137, 247, 114, 247, 134, 220, 83, 247, 134, 247, 114, 247, 134, 191, 87, 244, 137, 247, 114, 249, 132, 247, 114, 247, 134, 220, 83, 247, 134, 220, 83, 249, 132, 247, 114, 249, 132, 220, 83, 247, 134, 185, 200, 249, 132, 185, 200, 247, 134, 162, 139, 249, 132, 162, 139, 247, 134, 162, 139, 249, 132, 185, 200, 247, 134, 19, 111, 251, 205, 19, 111, 245, 210, 191, 87, 251, 205, 191, 87, 245, 210, 191, 87, 251, 205, 19, 111, 245, 210, 185, 200, 244, 137, 157, 194, 241, 139, 45, 170, 244, 137, 129, 188, 232, 147, 45, 170, 244, 137, 157, 194, 241, 139, 45, 170, 241, 139, 45, 170, 244, 137, 129, 188, 232, 147, 157, 194, 241, 139, 185, 200, 232, 147, 129, 188, 232, 147, 69, 55, 232, 147, 97, 61, 241, 139, 125, 67, 232, 147, 69, 55, 244, 137, 209, 85, 244, 137, 97, 61, 241, 139, 125, 67, 232, 147, 97, 61, 241, 139, 209, 85, 244, 137, 209, 85, 241, 139, 125, 67, 232, 147, 209, 85, 244, 137, 19, 111, 1, 201, 19, 111, 245, 210, 162, 105, 1, 201, 191, 87, 245, 210, 162, 105, 1, 201, 19, 111, 245, 210, 49, 93, 1, 201, 162, 105, 1, 201, 191, 87, 245, 210, 191, 87, 1, 201, 49, 93, 1, 201, 191, 87, 245, 210, 19, 111, 241, 139, 77, 103, 241, 139, 19, 111, 244, 137, 77, 103, 244, 137, 19, 111, 244, 137, 77, 103, 241, 139, 63, 168, 232, 147, 235, 144, 232, 147, 63, 168, 241, 139, 235, 144, 241, 139, 63, 168, 241, 139, 235, 144, 232, 147, 77, 103, 18, 186, 162, 105, 35, 171, 19, 111, 18, 186, 162, 105, 41, 166, 19, 111, 18, 186, 162, 105, 35, 171, 77, 103, 149, 183, 162, 105, 35, 171, 77, 103, 18, 186, 19, 111, 18, 186, 162, 105, 41, 166, 19, 111, 46, 161, 191, 87, 46, 161, 19, 111, 46, 161, 162, 105, 41, 166, 49, 93, 41, 166, 191, 87, 46, 161, 162, 105, 41, 166, 49, 93, 35, 171, 191, 87, 46, 161, 49, 93, 41, 166, 77, 103, 149, 183, 248, 100, 154, 178, 162, 105, 35, 171, 49, 93, 35, 171, 162, 105, 35, 171, 248, 100, 154, 178, 219, 97, 154, 178, 49, 93, 35, 171, 248, 100, 154, 178, 134, 95, 149, 183, 219, 97, 149, 183, 191, 87, 18, 186, 134, 95, 18, 186, 219, 97, 149, 183, 49, 93, 35, 171, 219, 97, 154, 178, 134, 95, 18, 186, 134, 95, 149, 183, 191, 87, 46, 161, 49, 93, 35, 171, 191, 87, 18, 186, 248, 100, 154, 178, 77, 103, 149, 183, 248, 100, 149, 183, 45, 170, 244, 137, 45, 170, 241, 139, 31, 167, 244, 137, 31, 167, 240, 140, 194, 174, 239, 141, 246, 157, 239, 141, 57, 159, 240, 140, 218, 151, 137, 138, 218, 151, 241, 139, 77, 103, 29, 176, 77, 103, 205, 189, 134, 95, 29, 176, 134, 95, 205, 189, 162, 105, 35, 171, 162, 105, 1, 201, 49, 93, 35, 171, 49, 93, 1, 201, 125, 67, 232, 147, 18, 72, 234, 145, 36, 104, 232, 147, 157, 101, 234, 145, 36, 104, 23, 145, 64, 110, 234, 145, 36, 104, 244, 137, 64, 110, 244, 137, 218, 151, 244, 137, 218, 151, 23, 145, 190, 145, 244, 137, 218, 151, 232, 147, 190, 145, 234, 145, 97, 154, 234, 145, 236, 183, 234, 145, 129, 188, 232, 147, 49, 93, 234, 145, 49, 93, 244, 137, 162, 105, 234, 145, 162, 105, 244, 137, 49, 93, 35, 171, 49, 93, 41, 166, 162, 105, 35, 171, 162, 105, 41, 166, 162, 105, 35, 171, 49, 93, 41, 166, 162, 105, 51, 130, 162, 105, 67, 132, 49, 93, 51, 130, 49, 93, 67, 132, 49, 93, 51, 130, 162, 105, 67, 132, 162, 105, 33, 106, 162, 105, 51, 130, 49, 93, 33, 106, 49, 93, 51, 130, 92, 150, 23, 145, 120, 160, 241, 139, 205, 162, 23, 145, 205, 162, 244, 137, 120, 160, 137, 138, 177, 152, 137, 138, 177, 152, 241, 139, 92, 150, 244, 137, 209, 85, 241, 139, 223, 88, 240, 140, 60, 81, 239, 141, 8, 98, 239, 141, 209, 85, 244, 137, 197, 96, 240, 140, 36, 104, 137, 138, 36, 104, 241, 139, 223, 88, 244, 137, 248, 100, 154, 178, 248, 100, 149, 183, 219, 97, 154, 178, 219, 97, 149, 183, 248, 100, 241, 139, 219, 97, 241, 139, 248, 100, 244, 137, 219, 97, 244, 137, 77, 103, 210, 119, 77, 103, 65, 126, 134, 95, 210, 119, 134, 95, 65, 126, 77, 103, 35, 171, 77, 103, 29, 176, 134, 95, 35, 171, 134, 95, 29, 176, 134, 95, 35, 171, 77, 103, 29, 176, 31, 167, 244, 137, 4, 161, 241, 139, 4, 161, 244, 137, 46, 159, 241, 139, 248, 100, 28, 177, 248, 100, 154, 178, 219, 97, 28, 177, 219, 97, 154, 178, 77, 103, 240, 140, 134, 95, 240, 140, 77, 103, 244, 137, 134, 95, 244, 137, 6, 155, 244, 137, 177, 152, 244, 137, 120, 160, 244, 137, 35, 158, 244, 137, 223, 88, 244, 137, 250, 94, 244, 137, 250, 94, 241, 139, 208, 96, 241, 139, 77, 103, 65, 126, 77, 103, 67, 132, 134, 95, 65, 126, 134, 95, 67, 132, 134, 95, 65, 126, 77, 103, 67, 132, 220, 83, 113, 92, 191, 87, 113, 92, 220, 83, 56, 142, 191, 87, 56, 142, 185, 200, 252, 130, 185, 200, 249, 132, 162, 139, 252, 130, 162, 139, 249, 132, 69, 55, 249, 132, 69, 55, 252, 130, 92, 116, 249, 132, 92, 116, 252, 130, 19, 111, 113, 92, 247, 114, 113, 92, 19, 111, 56, 142, 247, 114, 56, 142, 19, 111, 113, 92, 19, 111, 56, 142, 191, 87, 113, 92, 191, 87, 56, 142, 34, 172, 249, 132, 7, 141, 249, 132, 34, 172, 252, 130, 7, 141, 252, 130, 63, 168, 255, 127, 235, 144, 255, 127, 247, 114, 249, 132, 220, 83, 249, 132, 247, 114, 252, 130, 220, 83, 252, 130, 19, 111, 255, 127, 191, 87, 255, 127, 227, 105, 126, 251, 255, 103, 122, 233, 227, 105, 54, 213, 27, 102, 183, 217, 139, 94, 54, 213, 111, 96, 183, 217, 111, 96, 247, 219, 111, 96, 122, 233, 111, 96, 186, 235, 111, 96, 253, 246, 111, 96, 61, 249, 111, 96, 126, 251, 139, 94, 126, 251, 255, 103, 253, 246, 255, 103, 186, 235, 27, 102, 247, 219, 255, 103, 126, 251, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 103, 61, 249, 255, 103, 236, 69, 27, 102, 111, 83, 111, 96, 236, 69, 111, 96, 111, 83, 139, 94, 236, 69, 111, 96, 176, 85, 27, 102, 176, 85, 227, 105, 48, 90, 255, 103, 172, 67, 227, 105, 172, 67, 139, 94, 48, 90, 255, 103, 244, 153, 111, 96, 244, 153, 255, 103, 175, 133, 111, 96, 175, 133, 143, 159, 113, 140, 227, 153, 113, 140, 143, 159, 175, 133, 227, 153, 175, 133, 199, 211, 175, 133, 199, 211, 113, 140, 3, 209, 175, 133, 3, 209, 113, 140, 255, 103, 41, 54, 27, 102, 170, 58, 111, 96, 41, 54, 83, 98, 170, 58, 255, 151, 244, 153, 255, 151, 177, 142, 143, 159, 244, 153, 143, 159, 177, 142, 27, 102, 170, 58, 27, 102, 113, 92, 83, 98, 170, 58, 83, 98, 113, 92, 255, 103, 113, 140, 111, 96, 113, 140, 255, 103, 175, 133, 111, 96, 175, 133, 0, 0, 245, 162, 0, 0, 175, 133, 134, 5, 54, 165, 134, 5, 175, 133, 134, 5, 175, 133, 0, 0, 175, 133, 134, 5, 111, 131, 0, 0, 111, 131, 255, 255, 175, 133, 120, 250, 175, 133, 255, 255, 111, 131, 120, 250, 111, 131, 171, 157, 245, 162, 227, 153, 245, 162, 171, 157, 175, 133, 227, 153, 175, 133, 171, 157, 111, 131, 227, 153, 111, 131, 255, 103, 126, 251, 27, 102, 255, 255, 111, 96, 126, 251, 83, 98, 255, 255, 83, 98, 255, 255, 255, 255, 175, 133, 255, 255, 245, 162, 120, 250, 175, 133, 120, 250, 54, 165, 120, 250, 46, 129, 255, 255, 111, 131, 120, 250, 111, 131, 255, 103, 233, 51, 111, 96, 233, 51, 27, 102, 104, 47, 83, 98, 104, 47, 134, 5, 111, 131, 0, 0, 111, 131, 134, 5, 46, 129, 27, 102, 255, 255), +"format": 34896613399, +"index_count": 1632, +"index_data": PackedByteArray(2, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 6, 0, 4, 0, 5, 0, 9, 0, 7, 0, 8, 0, 11, 0, 10, 0, 4, 0, 12, 0, 11, 0, 4, 0, 13, 0, 12, 0, 4, 0, 4, 0, 14, 0, 13, 0, 9, 0, 15, 0, 7, 0, 10, 0, 16, 0, 17, 0, 18, 0, 12, 0, 13, 0, 13, 0, 19, 0, 18, 0, 22, 0, 20, 0, 21, 0, 21, 0, 23, 0, 22, 0, 26, 0, 24, 0, 25, 0, 25, 0, 27, 0, 26, 0, 30, 0, 28, 0, 29, 0, 29, 0, 31, 0, 30, 0, 31, 0, 32, 0, 30, 0, 35, 0, 33, 0, 34, 0, 38, 0, 36, 0, 37, 0, 37, 0, 39, 0, 38, 0, 42, 0, 40, 0, 41, 0, 41, 0, 43, 0, 42, 0, 43, 0, 44, 0, 42, 0, 43, 0, 41, 0, 45, 0, 45, 0, 46, 0, 43, 0, 49, 0, 47, 0, 48, 0, 48, 0, 50, 0, 49, 0, 53, 0, 51, 0, 52, 0, 52, 0, 54, 0, 53, 0, 52, 0, 55, 0, 54, 0, 52, 0, 56, 0, 55, 0, 57, 0, 55, 0, 56, 0, 58, 0, 57, 0, 56, 0, 56, 0, 59, 0, 58, 0, 62, 0, 60, 0, 61, 0, 61, 0, 63, 0, 62, 0, 66, 0, 64, 0, 65, 0, 65, 0, 67, 0, 66, 0, 70, 0, 68, 0, 69, 0, 72, 0, 71, 0, 64, 0, 73, 0, 72, 0, 64, 0, 74, 0, 73, 0, 64, 0, 74, 0, 64, 0, 75, 0, 75, 0, 76, 0, 74, 0, 76, 0, 77, 0, 74, 0, 70, 0, 78, 0, 68, 0, 79, 0, 74, 0, 77, 0, 82, 0, 80, 0, 81, 0, 81, 0, 83, 0, 82, 0, 83, 0, 84, 0, 82, 0, 85, 0, 82, 0, 84, 0, 86, 0, 85, 0, 84, 0, 87, 0, 86, 0, 84, 0, 84, 0, 88, 0, 87, 0, 91, 0, 89, 0, 90, 0, 90, 0, 92, 0, 91, 0, 95, 0, 93, 0, 94, 0, 94, 0, 96, 0, 95, 0, 99, 0, 97, 0, 98, 0, 98, 0, 100, 0, 99, 0, 103, 0, 101, 0, 102, 0, 102, 0, 104, 0, 103, 0, 104, 0, 105, 0, 103, 0, 104, 0, 106, 0, 105, 0, 109, 0, 107, 0, 108, 0, 108, 0, 110, 0, 109, 0, 108, 0, 111, 0, 110, 0, 108, 0, 112, 0, 111, 0, 107, 0, 113, 0, 108, 0, 107, 0, 114, 0, 113, 0, 107, 0, 115, 0, 114, 0, 118, 0, 116, 0, 117, 0, 117, 0, 119, 0, 118, 0, 122, 0, 120, 0, 121, 0, 121, 0, 123, 0, 122, 0, 126, 0, 124, 0, 125, 0, 125, 0, 127, 0, 126, 0, 130, 0, 128, 0, 129, 0, 129, 0, 131, 0, 130, 0, 131, 0, 132, 0, 130, 0, 131, 0, 133, 0, 132, 0, 133, 0, 134, 0, 132, 0, 134, 0, 135, 0, 132, 0, 135, 0, 136, 0, 132, 0, 136, 0, 137, 0, 132, 0, 137, 0, 138, 0, 132, 0, 138, 0, 139, 0, 132, 0, 139, 0, 140, 0, 132, 0, 141, 0, 137, 0, 136, 0, 136, 0, 142, 0, 141, 0, 129, 0, 135, 0, 143, 0, 143, 0, 131, 0, 129, 0, 135, 0, 134, 0, 143, 0, 129, 0, 128, 0, 144, 0, 147, 0, 145, 0, 146, 0, 147, 0, 148, 0, 145, 0, 147, 0, 149, 0, 148, 0, 137, 0, 141, 0, 150, 0, 150, 0, 138, 0, 137, 0, 153, 0, 151, 0, 152, 0, 152, 0, 154, 0, 153, 0, 154, 0, 155, 0, 153, 0, 154, 0, 156, 0, 155, 0, 157, 0, 152, 0, 151, 0, 158, 0, 157, 0, 151, 0, 158, 0, 151, 0, 159, 0, 159, 0, 160, 0, 158, 0, 158, 0, 161, 0, 157, 0, 161, 0, 156, 0, 157, 0, 161, 0, 155, 0, 156, 0, 164, 0, 162, 0, 163, 0, 163, 0, 165, 0, 164, 0, 168, 0, 166, 0, 167, 0, 167, 0, 169, 0, 168, 0, 172, 0, 170, 0, 171, 0, 171, 0, 173, 0, 172, 0, 176, 0, 174, 0, 175, 0, 175, 0, 177, 0, 176, 0, 180, 0, 178, 0, 179, 0, 179, 0, 181, 0, 180, 0, 184, 0, 182, 0, 183, 0, 183, 0, 185, 0, 184, 0, 188, 0, 186, 0, 187, 0, 187, 0, 189, 0, 188, 0, 192, 0, 190, 0, 191, 0, 195, 0, 193, 0, 194, 0, 198, 0, 196, 0, 197, 0, 201, 0, 199, 0, 200, 0, 204, 0, 202, 0, 203, 0, 203, 0, 205, 0, 204, 0, 205, 0, 206, 0, 204, 0, 209, 0, 207, 0, 208, 0, 208, 0, 210, 0, 209, 0, 210, 0, 211, 0, 209, 0, 210, 0, 212, 0, 211, 0, 215, 0, 213, 0, 214, 0, 214, 0, 216, 0, 215, 0, 216, 0, 217, 0, 215, 0, 220, 0, 218, 0, 219, 0, 219, 0, 221, 0, 220, 0, 219, 0, 222, 0, 221, 0, 222, 0, 223, 0, 221, 0, 223, 0, 224, 0, 221, 0, 224, 0, 225, 0, 221, 0, 225, 0, 226, 0, 221, 0, 227, 0, 221, 0, 226, 0, 227, 0, 226, 0, 228, 0, 227, 0, 228, 0, 229, 0, 227, 0, 229, 0, 230, 0, 227, 0, 230, 0, 231, 0, 227, 0, 231, 0, 232, 0, 233, 0, 227, 0, 232, 0, 232, 0, 234, 0, 233, 0, 237, 0, 235, 0, 236, 0, 236, 0, 238, 0, 237, 0, 241, 0, 239, 0, 240, 0, 240, 0, 242, 0, 241, 0, 245, 0, 243, 0, 244, 0, 246, 0, 245, 0, 244, 0, 246, 0, 244, 0, 247, 0, 248, 0, 246, 0, 247, 0, 248, 0, 247, 0, 249, 0, 249, 0, 250, 0, 248, 0, 5, 1, 3, 1, 4, 1, 4, 1, 6, 1, 5, 1, 6, 1, 7, 1, 5, 1, 6, 1, 8, 1, 7, 1, 10, 1, 3, 1, 9, 1, 9, 1, 11, 1, 10, 1, 9, 1, 12, 1, 11, 1, 12, 1, 13, 1, 11, 1, 16, 1, 14, 1, 15, 1, 15, 1, 17, 1, 16, 1, 17, 1, 18, 1, 16, 1, 21, 1, 19, 1, 20, 1, 20, 1, 22, 1, 21, 1, 25, 1, 23, 1, 24, 1, 24, 1, 26, 1, 25, 1, 29, 1, 27, 1, 28, 1, 28, 1, 30, 1, 29, 1, 33, 1, 31, 1, 32, 1, 32, 1, 34, 1, 33, 1, 37, 1, 35, 1, 36, 1, 36, 1, 38, 1, 37, 1, 41, 1, 39, 1, 40, 1, 40, 1, 42, 1, 41, 1, 45, 1, 43, 1, 44, 1, 44, 1, 46, 1, 45, 1, 49, 1, 47, 1, 48, 1, 48, 1, 50, 1, 49, 1, 53, 1, 51, 1, 52, 1, 52, 1, 54, 1, 53, 1, 57, 1, 55, 1, 56, 1, 56, 1, 58, 1, 57, 1, 61, 1, 59, 1, 60, 1, 60, 1, 62, 1, 61, 1, 65, 1, 63, 1, 64, 1, 64, 1, 66, 1, 65, 1, 64, 1, 67, 1, 66, 1, 67, 1, 68, 1, 66, 1, 68, 1, 69, 1, 66, 1, 69, 1, 70, 1, 66, 1, 70, 1, 71, 1, 66, 1, 71, 1, 72, 1, 66, 1, 71, 1, 73, 1, 72, 1, 73, 1, 74, 1, 72, 1, 74, 1, 75, 1, 72, 1, 75, 1, 76, 1, 72, 1, 76, 1, 77, 1, 72, 1, 76, 1, 78, 1, 77, 1, 78, 1, 79, 1, 77, 1, 80, 1, 77, 1, 79, 1, 80, 1, 79, 1, 81, 1, 80, 1, 81, 1, 82, 1, 83, 1, 80, 1, 82, 1, 83, 1, 82, 1, 84, 1, 83, 1, 84, 1, 85, 1, 83, 1, 85, 1, 86, 1, 87, 1, 83, 1, 86, 1, 87, 1, 86, 1, 88, 1, 87, 1, 88, 1, 89, 1, 87, 1, 89, 1, 90, 1, 87, 1, 90, 1, 91, 1, 87, 1, 91, 1, 92, 1, 87, 1, 92, 1, 93, 1, 94, 1, 87, 1, 93, 1, 94, 1, 93, 1, 65, 1, 95, 1, 94, 1, 65, 1, 95, 1, 65, 1, 96, 1, 97, 1, 95, 1, 96, 1, 97, 1, 96, 1, 98, 1, 99, 1, 97, 1, 98, 1, 99, 1, 98, 1, 100, 1, 101, 1, 99, 1, 100, 1, 101, 1, 100, 1, 102, 1, 102, 1, 103, 1, 101, 1, 93, 1, 63, 1, 65, 1, 80, 1, 104, 1, 77, 1, 80, 1, 105, 1, 104, 1, 105, 1, 106, 1, 104, 1, 105, 1, 107, 1, 106, 1, 107, 1, 108, 1, 106, 1, 108, 1, 109, 1, 106, 1, 108, 1, 110, 1, 109, 1, 113, 1, 111, 1, 112, 1, 112, 1, 114, 1, 113, 1, 117, 1, 115, 1, 116, 1, 116, 1, 118, 1, 117, 1, 121, 1, 119, 1, 120, 1, 120, 1, 122, 1, 121, 1, 125, 1, 123, 1, 124, 1, 124, 1, 126, 1, 125, 1, 129, 1, 127, 1, 128, 1, 128, 1, 130, 1, 129, 1, 133, 1, 131, 1, 132, 1, 132, 1, 134, 1, 133, 1, 137, 1, 135, 1, 136, 1, 136, 1, 138, 1, 137, 1, 141, 1, 139, 1, 140, 1, 140, 1, 142, 1, 141, 1, 145, 1, 143, 1, 144, 1, 144, 1, 146, 1, 145, 1, 149, 1, 147, 1, 148, 1, 148, 1, 150, 1, 149, 1, 153, 1, 151, 1, 152, 1, 152, 1, 154, 1, 153, 1, 157, 1, 155, 1, 156, 1, 156, 1, 158, 1, 157, 1, 161, 1, 159, 1, 160, 1, 160, 1, 162, 1, 161, 1, 162, 1, 163, 1, 161, 1, 166, 1, 164, 1, 165, 1, 165, 1, 167, 1, 166, 1, 170, 1, 168, 1, 169, 1, 169, 1, 171, 1, 170, 1, 171, 1, 172, 1, 170, 1, 175, 1, 173, 1, 174, 1, 174, 1, 176, 1, 175, 1, 179, 1, 177, 1, 178, 1, 178, 1, 180, 1, 179, 1, 183, 1, 181, 1, 182, 1, 182, 1, 184, 1, 183, 1, 187, 1, 185, 1, 186, 1, 186, 1, 188, 1, 187, 1, 188, 1, 189, 1, 187, 1, 192, 1, 190, 1, 191, 1, 191, 1, 193, 1, 192, 1, 196, 1, 194, 1, 195, 1, 195, 1, 197, 1, 196, 1, 200, 1, 198, 1, 199, 1, 199, 1, 201, 1, 200, 1, 204, 1, 202, 1, 203, 1, 203, 1, 205, 1, 204, 1, 205, 1, 206, 1, 204, 1, 209, 1, 207, 1, 208, 1, 208, 1, 210, 1, 209, 1, 213, 1, 211, 1, 212, 1, 212, 1, 214, 1, 213, 1, 217, 1, 215, 1, 216, 1, 216, 1, 218, 1, 217, 1, 221, 1, 219, 1, 220, 1, 220, 1, 222, 1, 221, 1, 225, 1, 223, 1, 224, 1, 224, 1, 226, 1, 225, 1, 229, 1, 227, 1, 228, 1, 228, 1, 230, 1, 229, 1, 233, 1, 231, 1, 232, 1, 232, 1, 234, 1, 233, 1, 237, 1, 235, 1, 236, 1, 236, 1, 238, 1, 237, 1, 241, 1, 239, 1, 240, 1, 240, 1, 242, 1, 241, 1, 245, 1, 243, 1, 244, 1, 244, 1, 246, 1, 245, 1, 249, 1, 247, 1, 248, 1, 248, 1, 250, 1, 249, 1, 253, 1, 251, 1, 252, 1, 252, 1, 254, 1, 253, 1, 1, 2, 255, 1, 0, 2, 0, 2, 2, 2, 1, 2, 5, 2, 3, 2, 4, 2, 4, 2, 6, 2, 5, 2, 9, 2, 7, 2, 8, 2, 8, 2, 10, 2, 9, 2, 13, 2, 11, 2, 12, 2, 12, 2, 14, 2, 13, 2, 17, 2, 15, 2, 16, 2, 16, 2, 18, 2, 17, 2, 21, 2, 19, 2, 20, 2, 20, 2, 22, 2, 21, 2, 20, 2, 23, 2, 22, 2, 23, 2, 24, 2, 22, 2, 23, 2, 25, 2, 24, 2, 25, 2, 26, 2, 24, 2, 25, 2, 27, 2, 26, 2, 27, 2, 28, 2, 26, 2, 27, 2, 29, 2, 28, 2, 29, 2, 30, 2, 28, 2, 29, 2, 31, 2, 30, 2, 31, 2, 32, 2, 30, 2, 31, 2, 33, 2, 32, 2, 33, 2, 34, 2, 32, 2, 34, 2, 35, 2, 32, 2, 34, 2, 36, 2, 35, 2, 34, 2, 37, 2, 36, 2, 37, 2, 38, 2, 36, 2, 37, 2, 39, 2, 38, 2, 39, 2, 40, 2, 38, 2, 39, 2, 41, 2, 40, 2, 41, 2, 42, 2, 40, 2, 251, 0, 1, 1, 255, 0, 255, 0, 252, 0, 251, 0, 45, 2, 43, 2, 44, 2, 48, 2, 46, 2, 47, 2, 51, 2, 49, 2, 50, 2, 54, 2, 52, 2, 53, 2, 57, 2, 55, 2, 56, 2, 60, 2, 58, 2, 59, 2, 63, 2, 61, 2, 62, 2, 66, 2, 64, 2, 65, 2, 69, 2, 67, 2, 68, 2, 72, 2, 70, 2, 71, 2, 75, 2, 73, 2, 74, 2, 78, 2, 76, 2, 77, 2, 80, 2, 79, 2, 77, 2, 83, 2, 81, 2, 82, 2, 86, 2, 84, 2, 85, 2, 89, 2, 87, 2, 88, 2, 92, 2, 90, 2, 91, 2, 95, 2, 93, 2, 94, 2, 98, 2, 96, 2, 97, 2, 101, 2, 99, 2, 100, 2, 104, 2, 102, 2, 103, 2, 107, 2, 105, 2, 106, 2, 110, 2, 108, 2, 109, 2, 113, 2, 111, 2, 112, 2, 116, 2, 114, 2, 115, 2, 119, 2, 117, 2, 118, 2, 122, 2, 120, 2, 121, 2, 125, 2, 123, 2, 124, 2, 128, 2, 126, 2, 127, 2, 131, 2, 129, 2, 130, 2, 134, 2, 132, 2, 133, 2, 137, 2, 135, 2, 136, 2, 140, 2, 138, 2, 139, 2, 143, 2, 141, 2, 142, 2, 146, 2, 144, 2, 145, 2, 149, 2, 147, 2, 148, 2, 152, 2, 150, 2, 151, 2, 155, 2, 153, 2, 154, 2, 158, 2, 156, 2, 157, 2, 161, 2, 159, 2, 160, 2, 164, 2, 162, 2, 163, 2, 163, 2, 165, 2, 164, 2, 165, 2, 166, 2, 164, 2, 166, 2, 167, 2, 164, 2, 167, 2, 168, 2, 164, 2, 169, 2, 167, 2, 166, 2, 170, 2, 169, 2, 166, 2, 171, 2, 170, 2, 166, 2, 166, 2, 172, 2, 171, 2, 170, 2, 173, 2, 169, 2, 176, 2, 174, 2, 175, 2, 179, 2, 177, 2, 178, 2, 182, 2, 180, 2, 181, 2, 185, 2, 183, 2, 184, 2, 187, 2, 186, 2, 184, 2, 190, 2, 188, 2, 189, 2, 193, 2, 191, 2, 192, 2, 196, 2, 194, 2, 195, 2, 199, 2, 197, 2, 198, 2, 202, 2, 200, 2, 201, 2, 205, 2, 203, 2, 204, 2, 208, 2, 206, 2, 207, 2, 211, 2, 209, 2, 210, 2, 214, 2, 212, 2, 213, 2, 217, 2, 215, 2, 216, 2, 220, 2, 218, 2, 219, 2, 223, 2, 221, 2, 222, 2, 226, 2, 224, 2, 225, 2, 229, 2, 227, 2, 228, 2, 232, 2, 230, 2, 231, 2, 235, 2, 233, 2, 234, 2, 238, 2, 236, 2, 237, 2, 241, 2, 239, 2, 240, 2, 244, 2, 242, 2, 243, 2, 247, 2, 245, 2, 246, 2, 250, 2, 248, 2, 249, 2, 253, 2, 251, 2, 252, 2, 0, 3, 254, 2, 255, 2, 3, 3, 1, 3, 2, 3, 6, 3, 4, 3, 5, 3, 9, 3, 7, 3, 8, 3, 12, 3, 10, 3, 11, 3, 15, 3, 13, 3, 14, 3, 18, 3, 16, 3, 17, 3, 21, 3, 19, 3, 20, 3, 24, 3, 22, 3, 23, 3, 27, 3, 25, 3, 26, 3, 30, 3, 28, 3, 29, 3, 33, 3, 31, 3, 32, 3, 36, 3, 34, 3, 35, 3, 39, 3, 37, 3, 38, 3, 42, 3, 40, 3, 41, 3, 45, 3, 43, 3, 44, 3, 48, 3, 46, 3, 47, 3, 51, 3, 49, 3, 50, 3, 54, 3, 52, 3, 53, 3, 57, 3, 55, 3, 56, 3, 60, 3, 58, 3, 59, 3, 62, 3, 61, 3, 59, 3, 64, 3, 63, 3, 59, 3, 67, 3, 65, 3, 66, 3, 69, 3, 68, 3, 66, 3, 72, 3, 70, 3, 71, 3, 75, 3, 73, 3, 74, 3, 78, 3, 76, 3, 77, 3, 79, 3, 78, 3, 77, 3, 79, 3, 77, 3, 80, 3, 80, 3, 81, 3, 79, 3, 81, 3, 82, 3, 79, 3, 81, 3, 83, 3, 82, 3, 81, 3, 84, 3, 83, 3, 87, 3, 85, 3, 86, 3, 86, 3, 88, 3, 87, 3, 91, 3, 89, 3, 90, 3, 90, 3, 92, 3, 91, 3, 95, 3, 93, 3, 94, 3, 94, 3, 96, 3, 95, 3, 96, 3, 97, 3, 95, 3, 97, 3, 98, 3, 95, 3, 97, 3, 99, 3, 98, 3, 99, 3, 100, 3, 98, 3, 103, 3, 101, 3, 102, 3, 102, 3, 104, 3, 103, 3, 104, 3, 105, 3, 103, 3, 104, 3, 102, 3, 106, 3, 104, 3, 106, 3, 107, 3, 107, 3, 108, 3, 104, 3, 111, 3, 109, 3, 110, 3, 110, 3, 112, 3, 111, 3, 115, 3, 113, 3, 114, 3, 118, 3, 116, 3, 117, 3, 121, 3, 119, 3, 120, 3, 124, 3, 122, 3, 123, 3, 127, 3, 125, 3, 126, 3, 126, 3, 128, 3, 127, 3, 131, 3, 129, 3, 130, 3, 130, 3, 132, 3, 131, 3, 130, 3, 133, 3, 132, 3, 133, 3, 134, 3, 132, 3, 135, 3, 130, 3, 129, 3, 133, 3, 130, 3, 135, 3, 135, 3, 134, 3, 133, 3, 129, 3, 136, 3, 135, 3, 136, 3, 134, 3, 135, 3, 136, 3, 132, 3, 134, 3, 139, 3, 137, 3, 138, 3, 138, 3, 140, 3, 139, 3, 137, 3, 141, 3, 138, 3, 138, 3, 142, 3, 140, 3, 142, 3, 143, 3, 140, 3, 143, 3, 144, 3, 140, 3, 145, 3, 138, 3, 141, 3, 148, 3, 146, 3, 147, 3, 147, 3, 149, 3, 148, 3, 152, 3, 150, 3, 151, 3, 151, 3, 153, 3, 152, 3, 156, 3, 154, 3, 155, 3, 155, 3, 157, 3, 156, 3, 160, 3, 158, 3, 159, 3, 163, 3, 161, 3, 162, 3, 166, 3, 164, 3, 165, 3, 165, 3, 167, 3, 166, 3, 170, 3, 168, 3, 169, 3, 169, 3, 171, 3, 170, 3, 174, 3, 172, 3, 173, 3, 173, 3, 175, 3, 174, 3, 178, 3, 176, 3, 177, 3, 178, 3, 179, 3, 176, 3, 182, 3, 180, 3, 181, 3, 181, 3, 183, 3, 182, 3, 186, 3, 184, 3, 185, 3, 189, 3, 187, 3, 188, 3, 192, 3, 190, 3, 191, 3, 191, 3, 193, 3, 192, 3, 196, 3, 194, 3, 195, 3, 195, 3, 197, 3, 196, 3, 200, 3, 198, 3, 199, 3, 199, 3, 201, 3, 200, 3, 204, 3, 202, 3, 203, 3, 203, 3, 205, 3, 204, 3, 208, 3, 206, 3, 207, 3, 207, 3, 209, 3, 208, 3, 212, 3, 210, 3, 211, 3, 211, 3, 213, 3, 212, 3, 213, 3, 214, 3, 212, 3, 213, 3, 215, 3, 214, 3, 218, 3, 216, 3, 217, 3, 217, 3, 219, 3, 218, 3, 219, 3, 220, 3, 218, 3, 219, 3, 221, 3, 220, 3), +"material": ExtResource("1_uaehs"), +"name": "albedo", +"primitive": 3, +"uv_scale": Vector4(8.8, 10.8, 0, 0), +"vertex_count": 1090, +"vertex_data": PackedByteArray(187, 165, 235, 123, 188, 105, 255, 191, 187, 165, 235, 123, 222, 52, 255, 191, 123, 103, 235, 123, 188, 105, 255, 191, 123, 103, 235, 123, 222, 52, 255, 191, 75, 181, 90, 232, 188, 105, 255, 127, 43, 150, 90, 232, 188, 105, 255, 127, 187, 165, 215, 247, 188, 105, 255, 127, 43, 150, 90, 232, 188, 105, 254, 127, 75, 181, 90, 232, 188, 105, 254, 127, 234, 87, 90, 232, 188, 105, 254, 127, 234, 87, 90, 232, 188, 105, 255, 127, 234, 87, 230, 154, 188, 105, 255, 127, 123, 103, 230, 154, 188, 105, 255, 127, 187, 165, 230, 154, 188, 105, 255, 127, 75, 181, 230, 154, 188, 105, 255, 127, 11, 119, 90, 232, 188, 105, 254, 127, 123, 103, 215, 247, 188, 105, 255, 127, 11, 119, 90, 232, 188, 105, 255, 127, 123, 103, 235, 123, 188, 105, 255, 127, 187, 165, 235, 123, 188, 105, 255, 127, 123, 103, 215, 247, 220, 15, 143, 195, 11, 119, 90, 232, 111, 26, 143, 195, 123, 103, 215, 247, 188, 105, 143, 195, 11, 119, 90, 232, 188, 105, 143, 195, 187, 165, 0, 0, 146, 10, 255, 159, 123, 103, 0, 0, 146, 10, 255, 159, 187, 165, 235, 123, 222, 52, 255, 159, 123, 103, 235, 123, 222, 52, 255, 159, 123, 103, 215, 247, 146, 10, 143, 195, 123, 103, 215, 247, 220, 15, 143, 195, 234, 87, 90, 232, 146, 10, 143, 195, 123, 103, 215, 247, 188, 105, 143, 195, 234, 87, 90, 232, 188, 105, 143, 195, 234, 87, 90, 232, 220, 15, 255, 191, 234, 87, 90, 232, 146, 10, 255, 191, 234, 87, 90, 232, 188, 105, 255, 191, 234, 87, 230, 154, 222, 52, 255, 255, 123, 103, 230, 154, 222, 52, 255, 255, 234, 87, 100, 170, 222, 52, 255, 255, 123, 103, 100, 170, 222, 52, 255, 255, 123, 103, 230, 154, 148, 47, 255, 255, 187, 165, 230, 154, 148, 47, 255, 255, 123, 103, 220, 216, 148, 47, 255, 255, 187, 165, 100, 170, 148, 47, 255, 255, 187, 165, 220, 216, 148, 47, 255, 255, 75, 181, 230, 154, 148, 47, 255, 255, 75, 181, 100, 170, 148, 47, 255, 255, 123, 103, 230, 154, 188, 105, 255, 191, 123, 103, 230, 154, 222, 52, 255, 191, 234, 87, 230, 154, 188, 105, 255, 191, 234, 87, 230, 154, 222, 52, 255, 191, 75, 181, 220, 216, 146, 10, 255, 191, 75, 181, 220, 216, 115, 100, 255, 191, 75, 181, 90, 232, 146, 10, 255, 191, 75, 181, 90, 232, 220, 15, 255, 191, 75, 181, 90, 232, 188, 105, 255, 191, 75, 181, 100, 170, 115, 100, 255, 191, 75, 181, 230, 154, 188, 105, 255, 191, 75, 181, 230, 154, 148, 47, 255, 191, 75, 181, 100, 170, 148, 47, 255, 191, 75, 181, 230, 154, 188, 105, 255, 191, 75, 181, 230, 154, 148, 47, 255, 191, 187, 165, 230, 154, 188, 105, 255, 191, 187, 165, 230, 154, 148, 47, 255, 191, 123, 103, 235, 123, 222, 52, 255, 191, 123, 103, 230, 154, 222, 52, 255, 191, 123, 103, 235, 123, 188, 105, 255, 191, 123, 103, 230, 154, 188, 105, 255, 191, 123, 103, 230, 154, 222, 52, 84, 213, 123, 103, 235, 123, 222, 52, 84, 213, 123, 103, 220, 216, 222, 52, 84, 213, 123, 103, 220, 216, 222, 52, 255, 191, 123, 103, 220, 216, 148, 47, 255, 191, 123, 103, 230, 154, 148, 47, 255, 191, 123, 103, 115, 77, 37, 21, 255, 191, 123, 103, 0, 0, 146, 10, 255, 191, 123, 103, 220, 216, 146, 10, 255, 191, 123, 103, 220, 216, 220, 15, 255, 191, 123, 103, 100, 170, 222, 52, 84, 213, 123, 103, 220, 216, 37, 21, 255, 191, 234, 87, 230, 154, 222, 52, 255, 191, 234, 87, 100, 170, 222, 52, 255, 191, 234, 87, 230, 154, 188, 105, 255, 191, 234, 87, 100, 170, 115, 100, 255, 191, 234, 87, 220, 216, 115, 100, 255, 191, 234, 87, 90, 232, 188, 105, 255, 191, 234, 87, 90, 232, 220, 15, 255, 191, 234, 87, 90, 232, 146, 10, 255, 191, 234, 87, 220, 216, 146, 10, 255, 191, 43, 150, 100, 170, 224, 89, 255, 127, 123, 103, 100, 170, 224, 89, 255, 127, 43, 150, 220, 216, 224, 89, 255, 127, 123, 103, 220, 216, 224, 89, 255, 127, 234, 87, 100, 170, 115, 100, 255, 255, 75, 181, 100, 170, 115, 100, 255, 255, 234, 87, 220, 216, 115, 100, 255, 255, 75, 181, 220, 216, 115, 100, 255, 255, 187, 165, 215, 247, 220, 15, 143, 195, 187, 165, 215, 247, 188, 105, 143, 195, 43, 150, 90, 232, 111, 26, 143, 195, 43, 150, 90, 232, 188, 105, 143, 195, 187, 165, 215, 247, 146, 10, 143, 195, 75, 181, 90, 232, 146, 10, 143, 195, 187, 165, 215, 247, 220, 15, 143, 195, 75, 181, 90, 232, 220, 15, 143, 195, 187, 165, 215, 247, 188, 105, 143, 195, 75, 181, 90, 232, 188, 105, 143, 195, 187, 165, 235, 123, 222, 52, 255, 191, 187, 165, 115, 77, 37, 21, 255, 191, 187, 165, 0, 0, 146, 10, 255, 191, 187, 165, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 220, 15, 255, 191, 187, 165, 220, 216, 37, 21, 255, 191, 187, 165, 230, 154, 148, 47, 255, 191, 187, 165, 230, 154, 188, 105, 255, 191, 187, 165, 235, 123, 188, 105, 255, 191, 187, 165, 220, 216, 148, 47, 255, 191, 187, 165, 100, 170, 148, 47, 255, 191, 187, 165, 220, 216, 222, 52, 255, 191, 187, 165, 100, 170, 222, 52, 255, 191, 123, 103, 100, 170, 151, 84, 255, 191, 123, 103, 220, 216, 151, 84, 255, 191, 123, 103, 100, 170, 224, 89, 255, 191, 123, 103, 220, 216, 224, 89, 255, 191, 187, 165, 215, 247, 146, 10, 255, 191, 187, 165, 215, 247, 220, 15, 255, 191, 123, 103, 215, 247, 146, 10, 255, 191, 123, 103, 215, 247, 220, 15, 255, 191, 75, 181, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 222, 52, 255, 191, 75, 181, 220, 216, 115, 100, 255, 191, 43, 150, 220, 216, 224, 89, 255, 191, 234, 87, 220, 216, 115, 100, 255, 191, 123, 103, 220, 216, 224, 89, 255, 191, 123, 103, 220, 216, 151, 84, 255, 191, 123, 103, 220, 216, 222, 52, 255, 191, 123, 103, 220, 216, 148, 47, 255, 191, 123, 103, 220, 216, 37, 21, 255, 191, 123, 103, 220, 216, 220, 15, 255, 191, 123, 103, 220, 216, 146, 10, 255, 191, 234, 87, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 37, 21, 255, 191, 187, 165, 220, 216, 148, 47, 255, 191, 43, 150, 220, 216, 151, 84, 255, 191, 187, 165, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 148, 47, 255, 191, 187, 165, 220, 216, 222, 52, 255, 191, 187, 165, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 37, 21, 255, 191, 187, 165, 220, 216, 220, 15, 255, 191, 187, 165, 220, 216, 220, 15, 255, 191, 187, 165, 100, 170, 222, 52, 255, 191, 43, 150, 100, 170, 151, 84, 255, 191, 123, 103, 100, 170, 222, 52, 255, 191, 123, 103, 100, 170, 151, 84, 255, 191, 234, 87, 100, 170, 222, 52, 255, 191, 123, 103, 100, 170, 224, 89, 255, 191, 43, 150, 100, 170, 224, 89, 255, 191, 75, 181, 100, 170, 115, 100, 255, 191, 187, 165, 100, 170, 148, 47, 255, 191, 75, 181, 100, 170, 148, 47, 255, 191, 234, 87, 100, 170, 115, 100, 255, 191, 187, 165, 115, 77, 37, 21, 255, 127, 123, 103, 115, 77, 37, 21, 255, 127, 187, 165, 220, 216, 37, 21, 255, 127, 123, 103, 220, 216, 37, 21, 255, 127, 123, 103, 100, 170, 151, 84, 255, 255, 43, 150, 100, 170, 151, 84, 255, 255, 123, 103, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 255, 191, 43, 150, 100, 170, 151, 84, 255, 191, 43, 150, 220, 216, 224, 89, 255, 191, 43, 150, 100, 170, 224, 89, 255, 191, 187, 165, 215, 247, 220, 15, 27, 173, 43, 150, 90, 232, 111, 26, 27, 173, 123, 103, 215, 247, 220, 15, 27, 173, 11, 119, 90, 232, 111, 26, 27, 173, 187, 165, 115, 77, 37, 21, 255, 255, 187, 165, 230, 154, 148, 47, 255, 255, 123, 103, 115, 77, 37, 21, 255, 255, 123, 103, 230, 154, 148, 47, 255, 255, 43, 150, 90, 232, 111, 26, 255, 191, 43, 150, 90, 232, 188, 105, 255, 191, 11, 119, 90, 232, 111, 26, 255, 191, 11, 119, 90, 232, 188, 105, 255, 191, 187, 165, 100, 170, 222, 52, 255, 127, 123, 103, 100, 170, 222, 52, 255, 127, 187, 165, 220, 216, 222, 52, 255, 127, 123, 103, 220, 216, 222, 52, 255, 127, 75, 181, 220, 216, 146, 10, 255, 255, 75, 181, 90, 232, 146, 10, 255, 255, 187, 165, 220, 216, 146, 10, 255, 255, 187, 165, 90, 232, 146, 10, 255, 255, 187, 165, 220, 216, 146, 10, 255, 255, 75, 181, 90, 232, 146, 10, 255, 255, 43, 150, 100, 170, 151, 84, 255, 191, 43, 150, 100, 170, 224, 89, 255, 191, 123, 103, 100, 170, 151, 84, 255, 191, 123, 103, 100, 170, 224, 89, 255, 191, 123, 103, 100, 170, 151, 84, 255, 191, 43, 150, 100, 170, 224, 89, 255, 191, 249, 63, 98, 223, 10, 217, 38, 194, 234, 87, 255, 255, 10, 217, 38, 194, 249, 63, 98, 223, 221, 244, 38, 194, 234, 87, 255, 255, 110, 250, 38, 194, 249, 63, 98, 223, 110, 250, 38, 194, 249, 63, 98, 223, 10, 217, 255, 255, 176, 183, 98, 223, 10, 217, 255, 255, 234, 87, 255, 255, 10, 217, 255, 255, 191, 159, 255, 255, 10, 217, 255, 255, 220, 111, 255, 255, 10, 217, 255, 255, 205, 135, 255, 255, 10, 217, 255, 255, 191, 159, 255, 255, 10, 217, 38, 194, 176, 183, 98, 223, 10, 217, 38, 194, 191, 159, 255, 255, 110, 250, 38, 194, 176, 183, 98, 223, 221, 244, 38, 194, 176, 183, 98, 223, 110, 250, 38, 194, 191, 159, 98, 223, 110, 250, 255, 127, 133, 158, 183, 229, 110, 250, 255, 127, 176, 183, 98, 223, 110, 250, 255, 127, 191, 159, 255, 255, 110, 250, 255, 127, 239, 154, 157, 235, 110, 250, 255, 127, 58, 149, 174, 240, 110, 250, 255, 127, 202, 141, 145, 244, 110, 250, 255, 127, 32, 133, 2, 247, 110, 250, 255, 127, 212, 123, 215, 247, 110, 250, 255, 127, 234, 87, 255, 255, 110, 250, 255, 127, 137, 114, 2, 247, 110, 250, 255, 127, 223, 105, 145, 244, 110, 250, 255, 127, 111, 98, 174, 240, 110, 250, 255, 127, 186, 92, 157, 235, 110, 250, 255, 127, 36, 89, 183, 229, 110, 250, 255, 127, 249, 63, 98, 223, 110, 250, 255, 127, 234, 87, 98, 223, 110, 250, 255, 127, 234, 87, 98, 223, 110, 250, 255, 191, 234, 87, 98, 223, 221, 244, 255, 191, 249, 63, 98, 223, 110, 250, 255, 191, 249, 63, 98, 223, 221, 244, 255, 191, 176, 183, 98, 223, 110, 250, 255, 191, 176, 183, 98, 223, 221, 244, 255, 191, 191, 159, 98, 223, 110, 250, 255, 191, 191, 159, 98, 223, 221, 244, 255, 191, 220, 111, 255, 255, 10, 217, 255, 191, 220, 111, 255, 255, 221, 244, 255, 191, 234, 87, 255, 255, 10, 217, 255, 191, 234, 87, 255, 255, 110, 250, 255, 191, 205, 135, 255, 255, 221, 244, 255, 191, 191, 159, 255, 255, 110, 250, 255, 191, 205, 135, 255, 255, 10, 217, 255, 191, 191, 159, 255, 255, 10, 217, 255, 191, 220, 111, 255, 255, 10, 217, 255, 191, 220, 111, 255, 255, 221, 244, 255, 191, 234, 87, 255, 255, 10, 217, 84, 213, 234, 87, 255, 255, 110, 250, 84, 213, 205, 135, 255, 255, 221, 244, 255, 191, 191, 159, 255, 255, 110, 250, 84, 213, 205, 135, 255, 255, 10, 217, 255, 191, 191, 159, 255, 255, 10, 217, 84, 213, 212, 123, 80, 166, 221, 244, 255, 127, 234, 87, 80, 166, 221, 244, 255, 127, 137, 114, 66, 168, 221, 244, 255, 127, 234, 87, 119, 174, 221, 244, 255, 127, 223, 105, 246, 173, 221, 244, 255, 127, 117, 105, 119, 174, 221, 244, 255, 127, 32, 133, 66, 168, 221, 244, 255, 127, 191, 159, 80, 166, 221, 244, 255, 127, 191, 159, 119, 174, 221, 244, 255, 127, 202, 141, 246, 173, 221, 244, 255, 127, 52, 142, 119, 174, 221, 244, 255, 127, 191, 159, 80, 166, 221, 244, 255, 191, 191, 159, 80, 166, 10, 217, 255, 191, 212, 123, 80, 166, 221, 244, 255, 191, 234, 87, 80, 166, 10, 217, 255, 191, 234, 87, 80, 166, 221, 244, 255, 191, 191, 159, 119, 174, 10, 217, 255, 191, 191, 159, 80, 166, 10, 217, 255, 191, 191, 159, 119, 174, 221, 244, 255, 191, 191, 159, 80, 166, 221, 244, 255, 191, 234, 87, 80, 166, 10, 217, 255, 255, 191, 159, 80, 166, 10, 217, 255, 255, 234, 87, 119, 174, 10, 217, 255, 255, 191, 159, 119, 174, 10, 217, 255, 255, 234, 87, 80, 166, 10, 217, 255, 191, 234, 87, 119, 174, 10, 217, 255, 191, 234, 87, 80, 166, 221, 244, 255, 191, 234, 87, 119, 174, 221, 244, 255, 191, 212, 123, 137, 231, 255, 255, 255, 191, 212, 123, 137, 231, 221, 244, 255, 191, 187, 120, 66, 231, 255, 255, 176, 192, 187, 120, 66, 231, 221, 244, 176, 192, 238, 126, 130, 215, 221, 244, 176, 192, 238, 126, 130, 215, 255, 255, 176, 192, 212, 123, 59, 215, 221, 244, 255, 191, 212, 123, 59, 215, 255, 255, 255, 191, 212, 123, 59, 215, 221, 244, 255, 191, 212, 123, 59, 215, 255, 255, 255, 191, 187, 120, 130, 215, 221, 244, 176, 192, 187, 120, 130, 215, 255, 255, 176, 192, 187, 120, 130, 215, 221, 244, 176, 192, 187, 120, 130, 215, 255, 255, 176, 192, 216, 117, 83, 216, 221, 244, 186, 194, 216, 117, 83, 216, 255, 255, 186, 194, 205, 135, 98, 223, 221, 244, 255, 191, 101, 135, 126, 225, 221, 244, 176, 192, 205, 135, 98, 223, 255, 255, 255, 191, 101, 135, 126, 225, 255, 255, 176, 192, 209, 129, 83, 216, 221, 244, 186, 194, 209, 129, 83, 216, 255, 255, 186, 194, 238, 126, 130, 215, 221, 244, 176, 192, 238, 126, 130, 215, 255, 255, 176, 192, 76, 132, 158, 217, 221, 244, 252, 197, 76, 132, 158, 217, 255, 255, 252, 197, 209, 129, 83, 216, 221, 244, 186, 194, 209, 129, 83, 216, 255, 255, 186, 194, 76, 132, 158, 217, 221, 244, 252, 197, 51, 134, 79, 219, 221, 244, 186, 194, 76, 132, 158, 217, 255, 255, 252, 197, 51, 134, 79, 219, 255, 255, 186, 194, 212, 123, 59, 215, 255, 255, 255, 127, 238, 126, 130, 215, 255, 255, 255, 127, 133, 158, 157, 208, 255, 255, 255, 127, 191, 159, 98, 223, 255, 255, 255, 127, 209, 129, 83, 216, 255, 255, 255, 127, 76, 132, 158, 217, 255, 255, 255, 127, 51, 134, 79, 219, 255, 255, 255, 127, 101, 135, 70, 221, 255, 255, 255, 127, 205, 135, 98, 223, 255, 255, 255, 127, 133, 158, 183, 229, 255, 255, 255, 127, 101, 135, 126, 225, 255, 255, 255, 127, 51, 134, 118, 227, 255, 255, 255, 127, 76, 132, 38, 229, 255, 255, 255, 127, 209, 129, 114, 230, 255, 255, 255, 127, 239, 154, 157, 235, 255, 255, 255, 127, 238, 126, 66, 231, 255, 255, 255, 127, 212, 123, 137, 231, 255, 255, 255, 127, 186, 92, 157, 235, 255, 255, 255, 127, 187, 120, 66, 231, 255, 255, 255, 127, 216, 117, 114, 230, 255, 255, 255, 127, 36, 89, 183, 229, 255, 255, 255, 127, 93, 115, 38, 229, 255, 255, 255, 127, 118, 113, 118, 227, 255, 255, 255, 127, 68, 112, 126, 225, 255, 255, 255, 127, 234, 87, 98, 223, 255, 255, 255, 127, 220, 111, 98, 223, 255, 255, 255, 127, 68, 112, 70, 221, 255, 255, 255, 127, 118, 113, 79, 219, 255, 255, 255, 127, 93, 115, 158, 217, 255, 255, 255, 127, 216, 117, 83, 216, 255, 255, 255, 127, 187, 120, 130, 215, 255, 255, 255, 127, 36, 89, 157, 208, 255, 255, 255, 127, 186, 92, 217, 194, 255, 255, 255, 127, 239, 154, 217, 194, 255, 255, 255, 127, 111, 98, 7, 183, 255, 255, 255, 127, 58, 149, 7, 183, 255, 255, 255, 127, 223, 105, 246, 173, 255, 255, 255, 127, 202, 141, 246, 173, 255, 255, 255, 127, 137, 114, 66, 168, 255, 255, 255, 127, 32, 133, 66, 168, 255, 255, 255, 127, 212, 123, 80, 166, 255, 255, 255, 127, 58, 149, 174, 240, 255, 255, 255, 127, 111, 98, 174, 240, 255, 255, 255, 127, 202, 141, 145, 244, 255, 255, 255, 127, 223, 105, 145, 244, 255, 255, 255, 127, 137, 114, 2, 247, 255, 255, 255, 127, 32, 133, 2, 247, 255, 255, 255, 127, 212, 123, 215, 247, 255, 255, 255, 127, 209, 129, 114, 230, 255, 255, 186, 194, 209, 129, 114, 230, 221, 244, 186, 194, 238, 126, 66, 231, 255, 255, 176, 192, 238, 126, 66, 231, 221, 244, 176, 192, 51, 134, 79, 219, 221, 244, 186, 194, 101, 135, 70, 221, 221, 244, 176, 192, 51, 134, 79, 219, 255, 255, 186, 194, 101, 135, 70, 221, 255, 255, 176, 192, 238, 126, 66, 231, 255, 255, 176, 192, 238, 126, 66, 231, 221, 244, 176, 192, 212, 123, 137, 231, 255, 255, 255, 191, 212, 123, 137, 231, 221, 244, 255, 191, 51, 134, 118, 227, 221, 244, 186, 194, 76, 132, 38, 229, 221, 244, 252, 197, 51, 134, 118, 227, 255, 255, 186, 194, 76, 132, 38, 229, 255, 255, 252, 197, 101, 135, 70, 221, 221, 244, 176, 192, 205, 135, 98, 223, 221, 244, 255, 191, 101, 135, 70, 221, 255, 255, 176, 192, 205, 135, 98, 223, 255, 255, 255, 191, 101, 135, 126, 225, 221, 244, 176, 192, 51, 134, 118, 227, 221, 244, 186, 194, 101, 135, 126, 225, 255, 255, 176, 192, 51, 134, 118, 227, 255, 255, 186, 194, 76, 132, 38, 229, 255, 255, 252, 197, 76, 132, 38, 229, 221, 244, 252, 197, 209, 129, 114, 230, 255, 255, 186, 194, 209, 129, 114, 230, 221, 244, 186, 194, 118, 113, 79, 219, 221, 244, 186, 194, 93, 115, 158, 217, 221, 244, 252, 197, 118, 113, 79, 219, 255, 255, 186, 194, 93, 115, 158, 217, 255, 255, 252, 197, 68, 112, 70, 221, 221, 244, 176, 192, 118, 113, 79, 219, 221, 244, 186, 194, 68, 112, 70, 221, 255, 255, 176, 192, 118, 113, 79, 219, 255, 255, 186, 194, 216, 117, 83, 216, 221, 244, 186, 194, 216, 117, 83, 216, 255, 255, 186, 194, 93, 115, 158, 217, 221, 244, 252, 197, 93, 115, 158, 217, 255, 255, 252, 197, 58, 149, 174, 240, 110, 250, 252, 197, 58, 149, 174, 240, 255, 255, 252, 197, 202, 141, 145, 244, 110, 250, 186, 194, 202, 141, 145, 244, 255, 255, 186, 194, 212, 123, 215, 247, 110, 250, 255, 191, 212, 123, 215, 247, 255, 255, 255, 191, 137, 114, 2, 247, 110, 250, 176, 192, 137, 114, 2, 247, 255, 255, 176, 192, 58, 149, 7, 183, 221, 244, 182, 193, 52, 142, 119, 174, 221, 244, 149, 194, 58, 149, 7, 183, 255, 255, 182, 193, 202, 141, 246, 173, 221, 244, 59, 196, 202, 141, 246, 173, 255, 255, 59, 196, 137, 114, 66, 168, 255, 255, 211, 194, 137, 114, 66, 168, 221, 244, 211, 194, 223, 105, 246, 173, 255, 255, 254, 199, 223, 105, 246, 173, 221, 244, 254, 199, 223, 105, 246, 173, 221, 244, 59, 196, 117, 105, 119, 174, 221, 244, 149, 194, 223, 105, 246, 173, 255, 255, 59, 196, 111, 98, 7, 183, 221, 244, 182, 193, 111, 98, 7, 183, 255, 255, 182, 193, 202, 141, 145, 244, 110, 250, 186, 194, 202, 141, 145, 244, 255, 255, 186, 194, 32, 133, 2, 247, 110, 250, 176, 192, 32, 133, 2, 247, 255, 255, 176, 192, 137, 114, 2, 247, 110, 250, 176, 192, 137, 114, 2, 247, 255, 255, 176, 192, 223, 105, 145, 244, 110, 250, 186, 194, 223, 105, 145, 244, 255, 255, 186, 194, 133, 158, 157, 208, 221, 244, 34, 192, 239, 154, 217, 194, 221, 244, 157, 192, 133, 158, 157, 208, 255, 255, 34, 192, 239, 154, 217, 194, 255, 255, 157, 192, 36, 89, 157, 208, 221, 244, 34, 192, 234, 87, 98, 223, 221, 244, 7, 192, 36, 89, 157, 208, 255, 255, 34, 192, 234, 87, 98, 223, 110, 250, 7, 192, 234, 87, 98, 223, 255, 255, 7, 192, 186, 92, 217, 194, 221, 244, 157, 192, 36, 89, 157, 208, 221, 244, 34, 192, 186, 92, 217, 194, 255, 255, 157, 192, 36, 89, 157, 208, 255, 255, 34, 192, 223, 105, 145, 244, 110, 250, 186, 194, 223, 105, 145, 244, 255, 255, 186, 194, 111, 98, 174, 240, 110, 250, 252, 197, 111, 98, 174, 240, 255, 255, 252, 197, 234, 87, 98, 223, 110, 250, 43, 192, 36, 89, 183, 229, 110, 250, 176, 192, 234, 87, 98, 223, 255, 255, 43, 192, 36, 89, 183, 229, 255, 255, 176, 192, 191, 159, 98, 223, 221, 244, 7, 192, 133, 158, 157, 208, 221, 244, 34, 192, 191, 159, 98, 223, 110, 250, 7, 192, 133, 158, 157, 208, 255, 255, 34, 192, 191, 159, 98, 223, 255, 255, 7, 192, 36, 89, 183, 229, 110, 250, 176, 192, 186, 92, 157, 235, 110, 250, 186, 194, 36, 89, 183, 229, 255, 255, 176, 192, 186, 92, 157, 235, 255, 255, 186, 194, 239, 154, 157, 235, 110, 250, 186, 194, 133, 158, 183, 229, 110, 250, 176, 192, 239, 154, 157, 235, 255, 255, 186, 194, 133, 158, 183, 229, 255, 255, 176, 192, 186, 92, 157, 235, 110, 250, 186, 194, 111, 98, 174, 240, 110, 250, 252, 197, 186, 92, 157, 235, 255, 255, 186, 194, 111, 98, 174, 240, 255, 255, 252, 197, 133, 158, 183, 229, 110, 250, 176, 192, 191, 159, 98, 223, 110, 250, 43, 192, 133, 158, 183, 229, 255, 255, 176, 192, 191, 159, 98, 223, 255, 255, 43, 192, 202, 141, 246, 173, 255, 255, 254, 199, 202, 141, 246, 173, 221, 244, 254, 199, 32, 133, 66, 168, 255, 255, 211, 194, 32, 133, 66, 168, 221, 244, 211, 194, 32, 133, 2, 247, 110, 250, 176, 192, 32, 133, 2, 247, 255, 255, 176, 192, 212, 123, 215, 247, 110, 250, 255, 191, 212, 123, 215, 247, 255, 255, 255, 191, 58, 149, 174, 240, 110, 250, 252, 197, 239, 154, 157, 235, 110, 250, 186, 194, 58, 149, 174, 240, 255, 255, 252, 197, 239, 154, 157, 235, 255, 255, 186, 194, 239, 154, 217, 194, 221, 244, 157, 192, 58, 149, 7, 183, 221, 244, 182, 193, 239, 154, 217, 194, 255, 255, 157, 192, 58, 149, 7, 183, 255, 255, 182, 193, 111, 98, 7, 183, 221, 244, 182, 193, 186, 92, 217, 194, 221, 244, 157, 192, 111, 98, 7, 183, 255, 255, 182, 193, 186, 92, 217, 194, 255, 255, 157, 192, 32, 133, 66, 168, 255, 255, 211, 194, 32, 133, 66, 168, 221, 244, 211, 194, 212, 123, 80, 166, 255, 255, 255, 191, 212, 123, 80, 166, 221, 244, 255, 191, 212, 123, 80, 166, 255, 255, 255, 191, 212, 123, 80, 166, 221, 244, 255, 191, 137, 114, 66, 168, 255, 255, 211, 194, 137, 114, 66, 168, 221, 244, 211, 194, 118, 113, 118, 227, 221, 244, 186, 194, 68, 112, 126, 225, 221, 244, 176, 192, 118, 113, 118, 227, 255, 255, 186, 194, 68, 112, 126, 225, 255, 255, 176, 192, 216, 117, 114, 230, 255, 255, 186, 194, 216, 117, 114, 230, 221, 244, 186, 194, 93, 115, 38, 229, 255, 255, 252, 197, 93, 115, 38, 229, 221, 244, 252, 197, 187, 120, 66, 231, 255, 255, 176, 192, 187, 120, 66, 231, 221, 244, 176, 192, 216, 117, 114, 230, 255, 255, 186, 194, 216, 117, 114, 230, 221, 244, 186, 194, 220, 111, 98, 223, 221, 244, 255, 191, 68, 112, 70, 221, 221, 244, 176, 192, 220, 111, 98, 223, 255, 255, 255, 191, 68, 112, 70, 221, 255, 255, 176, 192, 68, 112, 126, 225, 221, 244, 176, 192, 220, 111, 98, 223, 221, 244, 255, 191, 68, 112, 126, 225, 255, 255, 176, 192, 220, 111, 98, 223, 255, 255, 255, 191, 93, 115, 38, 229, 221, 244, 252, 197, 118, 113, 118, 227, 221, 244, 186, 194, 93, 115, 38, 229, 255, 255, 252, 197, 118, 113, 118, 227, 255, 255, 186, 194, 212, 123, 59, 215, 221, 244, 255, 127, 187, 120, 130, 215, 221, 244, 255, 127, 238, 126, 130, 215, 221, 244, 255, 127, 209, 129, 83, 216, 221, 244, 255, 127, 216, 117, 83, 216, 221, 244, 255, 127, 76, 132, 158, 217, 221, 244, 255, 127, 93, 115, 158, 217, 221, 244, 255, 127, 51, 134, 79, 219, 221, 244, 255, 127, 118, 113, 79, 219, 221, 244, 255, 127, 101, 135, 70, 221, 221, 244, 255, 127, 68, 112, 70, 221, 221, 244, 255, 127, 205, 135, 98, 223, 221, 244, 255, 127, 220, 111, 98, 223, 221, 244, 255, 127, 101, 135, 126, 225, 221, 244, 255, 127, 68, 112, 126, 225, 221, 244, 255, 127, 118, 113, 118, 227, 221, 244, 255, 127, 51, 134, 118, 227, 221, 244, 255, 127, 76, 132, 38, 229, 221, 244, 255, 127, 93, 115, 38, 229, 221, 244, 255, 127, 209, 129, 114, 230, 221, 244, 255, 127, 216, 117, 114, 230, 221, 244, 255, 127, 238, 126, 66, 231, 221, 244, 255, 127, 187, 120, 66, 231, 221, 244, 255, 127, 212, 123, 137, 231, 221, 244, 255, 127, 183, 171, 20, 207, 10, 217, 255, 191, 183, 171, 198, 190, 10, 217, 255, 191, 183, 171, 20, 207, 221, 244, 255, 191, 183, 171, 198, 190, 221, 244, 255, 191, 183, 171, 20, 207, 221, 244, 255, 191, 183, 171, 198, 190, 10, 217, 255, 191, 183, 171, 198, 190, 10, 217, 38, 194, 191, 159, 119, 174, 10, 217, 38, 194, 183, 171, 198, 190, 221, 244, 38, 194, 191, 159, 119, 174, 221, 244, 38, 194, 183, 171, 198, 190, 221, 244, 38, 194, 191, 159, 119, 174, 10, 217, 38, 194, 249, 63, 20, 207, 10, 217, 255, 191, 249, 63, 98, 223, 10, 217, 255, 191, 249, 63, 20, 207, 221, 244, 255, 191, 249, 63, 98, 223, 221, 244, 255, 191, 249, 63, 20, 207, 221, 244, 255, 191, 249, 63, 98, 223, 10, 217, 255, 191, 242, 75, 198, 190, 10, 217, 255, 191, 242, 75, 20, 207, 10, 217, 255, 191, 242, 75, 198, 190, 221, 244, 255, 191, 242, 75, 20, 207, 221, 244, 255, 191, 242, 75, 198, 190, 221, 244, 255, 191, 242, 75, 20, 207, 10, 217, 255, 191, 176, 183, 98, 223, 10, 217, 255, 191, 176, 183, 20, 207, 10, 217, 255, 191, 176, 183, 98, 223, 221, 244, 255, 191, 176, 183, 20, 207, 221, 244, 255, 191, 176, 183, 98, 223, 221, 244, 255, 191, 176, 183, 20, 207, 10, 217, 255, 191, 249, 63, 20, 207, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 249, 63, 98, 223, 10, 217, 255, 255, 183, 171, 20, 207, 10, 217, 255, 255, 249, 63, 98, 223, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 176, 183, 20, 207, 10, 217, 255, 255, 183, 171, 20, 207, 10, 217, 255, 255, 176, 183, 98, 223, 10, 217, 255, 255, 249, 63, 98, 223, 10, 217, 255, 255, 176, 183, 20, 207, 10, 217, 255, 255, 234, 87, 119, 174, 10, 217, 255, 255, 191, 159, 119, 174, 10, 217, 255, 255, 242, 75, 198, 190, 10, 217, 255, 255, 183, 171, 198, 190, 10, 217, 255, 255, 242, 75, 198, 190, 10, 217, 255, 255, 191, 159, 119, 174, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 242, 75, 198, 190, 10, 217, 255, 255, 183, 171, 198, 190, 10, 217, 255, 255, 183, 171, 20, 207, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 183, 171, 198, 190, 10, 217, 255, 255, 234, 87, 119, 174, 10, 217, 38, 194, 242, 75, 198, 190, 10, 217, 38, 194, 234, 87, 119, 174, 221, 244, 38, 194, 242, 75, 198, 190, 221, 244, 38, 194, 234, 87, 119, 174, 221, 244, 38, 194, 242, 75, 198, 190, 10, 217, 38, 194, 176, 183, 20, 207, 221, 244, 255, 127, 183, 171, 20, 207, 221, 244, 255, 127, 176, 183, 98, 223, 221, 244, 255, 127, 133, 158, 157, 208, 221, 244, 255, 127, 176, 183, 98, 223, 221, 244, 255, 127, 183, 171, 20, 207, 221, 244, 255, 127, 191, 159, 98, 223, 221, 244, 255, 127, 176, 183, 98, 223, 221, 244, 255, 127, 133, 158, 157, 208, 221, 244, 255, 127, 191, 159, 119, 174, 221, 244, 255, 127, 52, 142, 119, 174, 221, 244, 255, 127, 183, 171, 198, 190, 221, 244, 255, 127, 58, 149, 7, 183, 221, 244, 255, 127, 183, 171, 198, 190, 221, 244, 255, 127, 52, 142, 119, 174, 221, 244, 255, 127, 239, 154, 217, 194, 221, 244, 255, 127, 183, 171, 198, 190, 221, 244, 255, 127, 58, 149, 7, 183, 221, 244, 255, 127, 183, 171, 20, 207, 221, 244, 255, 127, 183, 171, 198, 190, 221, 244, 255, 127, 239, 154, 217, 194, 221, 244, 255, 127, 133, 158, 157, 208, 221, 244, 255, 127, 183, 171, 20, 207, 221, 244, 255, 127, 239, 154, 217, 194, 221, 244, 255, 127, 117, 105, 119, 174, 221, 244, 255, 127, 234, 87, 119, 174, 221, 244, 255, 127, 111, 98, 7, 183, 221, 244, 255, 127, 242, 75, 198, 190, 221, 244, 255, 127, 111, 98, 7, 183, 221, 244, 255, 127, 234, 87, 119, 174, 221, 244, 255, 127, 186, 92, 217, 194, 221, 244, 255, 127, 111, 98, 7, 183, 221, 244, 255, 127, 242, 75, 198, 190, 221, 244, 255, 127, 242, 75, 20, 207, 221, 244, 255, 127, 186, 92, 217, 194, 221, 244, 255, 127, 242, 75, 198, 190, 221, 244, 255, 127, 36, 89, 157, 208, 221, 244, 255, 127, 186, 92, 217, 194, 221, 244, 255, 127, 242, 75, 20, 207, 221, 244, 255, 127, 249, 63, 20, 207, 221, 244, 255, 127, 36, 89, 157, 208, 221, 244, 255, 127, 242, 75, 20, 207, 221, 244, 255, 127, 249, 63, 98, 223, 221, 244, 255, 127, 36, 89, 157, 208, 221, 244, 255, 127, 249, 63, 20, 207, 221, 244, 255, 127, 234, 87, 98, 223, 221, 244, 255, 127, 36, 89, 157, 208, 221, 244, 255, 127, 249, 63, 98, 223, 221, 244, 255, 127, 242, 75, 20, 207, 221, 244, 255, 191, 242, 75, 20, 207, 10, 217, 255, 191, 249, 63, 20, 207, 221, 244, 255, 191, 249, 63, 20, 207, 10, 217, 255, 191, 249, 63, 20, 207, 221, 244, 255, 191, 242, 75, 20, 207, 10, 217, 255, 191, 176, 183, 20, 207, 221, 244, 255, 191, 176, 183, 20, 207, 10, 217, 255, 191, 183, 171, 20, 207, 221, 244, 255, 191, 183, 171, 20, 207, 10, 217, 255, 191, 183, 171, 20, 207, 221, 244, 255, 191, 176, 183, 20, 207, 10, 217, 255, 191, 255, 223, 7, 119, 28, 129, 8, 172, 50, 179, 7, 119, 28, 129, 8, 172, 255, 223, 209, 173, 43, 164, 8, 172, 50, 179, 186, 132, 224, 137, 8, 172, 204, 76, 186, 132, 224, 137, 8, 172, 255, 159, 30, 160, 104, 155, 8, 172, 255, 159, 209, 173, 43, 164, 8, 172, 255, 95, 30, 160, 104, 155, 8, 172, 255, 31, 209, 173, 43, 164, 8, 172, 255, 31, 7, 119, 28, 129, 8, 172, 204, 76, 7, 119, 28, 129, 8, 172, 255, 95, 209, 173, 43, 164, 8, 172, 255, 95, 209, 173, 43, 164, 255, 127, 255, 31, 209, 173, 43, 164, 255, 127, 255, 95, 131, 187, 43, 164, 255, 127, 255, 31, 131, 187, 43, 164, 255, 127, 255, 95, 131, 187, 43, 164, 255, 127, 255, 31, 209, 173, 43, 164, 255, 127, 255, 255, 14, 208, 188, 105, 144, 197, 255, 223, 131, 187, 188, 105, 144, 197, 254, 255, 14, 208, 154, 222, 144, 197, 255, 223, 131, 187, 43, 164, 144, 197, 254, 255, 14, 208, 154, 222, 144, 197, 255, 223, 131, 187, 188, 105, 144, 197, 255, 223, 131, 187, 154, 222, 144, 197, 255, 223, 131, 187, 43, 164, 144, 197, 0, 0, 14, 208, 188, 105, 255, 191, 0, 0, 193, 221, 188, 105, 255, 191, 0, 0, 14, 208, 154, 222, 255, 191, 0, 0, 193, 221, 154, 222, 255, 191, 0, 0, 14, 208, 154, 222, 255, 191, 0, 0, 193, 221, 188, 105, 255, 191, 255, 31, 131, 187, 188, 105, 255, 255, 255, 223, 131, 187, 188, 105, 255, 255, 0, 0, 14, 208, 188, 105, 255, 255, 255, 255, 14, 208, 188, 105, 255, 255, 0, 0, 14, 208, 188, 105, 255, 255, 255, 223, 131, 187, 188, 105, 255, 255, 0, 0, 193, 221, 188, 105, 255, 255, 0, 0, 14, 208, 188, 105, 255, 255, 255, 255, 14, 208, 188, 105, 255, 255, 255, 255, 193, 221, 188, 105, 255, 255, 0, 0, 193, 221, 188, 105, 255, 255, 255, 255, 14, 208, 188, 105, 255, 255, 255, 31, 131, 187, 188, 105, 144, 197, 0, 0, 14, 208, 188, 105, 144, 197, 255, 31, 131, 187, 43, 164, 144, 197, 0, 0, 14, 208, 154, 222, 144, 197, 255, 31, 131, 187, 43, 164, 144, 197, 0, 0, 14, 208, 188, 105, 144, 197, 255, 31, 131, 187, 154, 222, 144, 197, 255, 31, 131, 187, 43, 164, 144, 197, 0, 0, 14, 208, 154, 222, 144, 197, 255, 223, 131, 187, 154, 222, 255, 127, 255, 31, 131, 187, 154, 222, 255, 127, 254, 255, 14, 208, 154, 222, 255, 127, 0, 0, 14, 208, 154, 222, 255, 127, 254, 255, 14, 208, 154, 222, 255, 127, 255, 31, 131, 187, 154, 222, 255, 127, 254, 255, 193, 221, 154, 222, 255, 127, 254, 255, 14, 208, 154, 222, 255, 127, 0, 0, 14, 208, 154, 222, 255, 127, 0, 0, 193, 221, 154, 222, 255, 127, 254, 255, 193, 221, 154, 222, 255, 127, 0, 0, 14, 208, 154, 222, 255, 127, 255, 255, 193, 221, 188, 105, 255, 191, 255, 255, 14, 208, 188, 105, 255, 191, 254, 255, 193, 221, 154, 222, 255, 191, 254, 255, 14, 208, 154, 222, 255, 191, 254, 255, 193, 221, 154, 222, 255, 191, 255, 255, 14, 208, 188, 105, 255, 191, 255, 223, 209, 173, 108, 117, 128, 207, 255, 223, 131, 187, 188, 105, 128, 207, 255, 31, 209, 173, 108, 117, 128, 207, 255, 31, 131, 187, 188, 105, 128, 207, 255, 31, 209, 173, 108, 117, 128, 207, 255, 223, 131, 187, 188, 105, 128, 207, 255, 223, 131, 187, 188, 105, 255, 191, 255, 223, 209, 173, 108, 117, 255, 191, 255, 223, 131, 187, 43, 164, 255, 191, 255, 223, 7, 119, 28, 129, 255, 191, 255, 223, 131, 187, 43, 164, 255, 191, 255, 223, 209, 173, 108, 117, 255, 191, 255, 223, 209, 173, 43, 164, 255, 191, 255, 223, 131, 187, 43, 164, 255, 191, 255, 223, 7, 119, 28, 129, 255, 191, 255, 223, 209, 173, 108, 117, 255, 191, 255, 223, 7, 119, 188, 105, 255, 191, 255, 223, 7, 119, 28, 129, 255, 191, 255, 31, 7, 119, 188, 105, 255, 191, 255, 31, 209, 173, 108, 117, 255, 191, 255, 31, 7, 119, 28, 129, 255, 191, 255, 31, 131, 187, 188, 105, 255, 191, 255, 31, 131, 187, 43, 164, 255, 191, 255, 31, 209, 173, 108, 117, 255, 191, 255, 31, 7, 119, 28, 129, 255, 191, 255, 31, 209, 173, 108, 117, 255, 191, 255, 31, 131, 187, 43, 164, 255, 191, 255, 31, 209, 173, 43, 164, 255, 191, 255, 31, 7, 119, 28, 129, 255, 191, 255, 31, 131, 187, 43, 164, 255, 191, 255, 223, 7, 119, 28, 129, 255, 191, 255, 223, 7, 119, 188, 105, 255, 191, 50, 179, 7, 119, 28, 129, 255, 191, 255, 31, 7, 119, 188, 105, 255, 191, 50, 179, 7, 119, 28, 129, 255, 191, 255, 223, 7, 119, 188, 105, 255, 191, 204, 76, 7, 119, 28, 129, 255, 191, 50, 179, 7, 119, 28, 129, 255, 191, 255, 31, 7, 119, 188, 105, 255, 191, 255, 31, 7, 119, 28, 129, 255, 191, 204, 76, 7, 119, 28, 129, 255, 191, 255, 31, 7, 119, 188, 105, 255, 191, 255, 223, 209, 173, 43, 164, 255, 127, 255, 159, 209, 173, 43, 164, 255, 127, 255, 223, 131, 187, 43, 164, 255, 127, 255, 159, 131, 187, 43, 164, 255, 127, 255, 223, 131, 187, 43, 164, 255, 127, 255, 159, 209, 173, 43, 164, 255, 127, 255, 31, 7, 119, 188, 105, 255, 255, 255, 223, 7, 119, 188, 105, 255, 255, 255, 31, 209, 173, 108, 117, 255, 255, 255, 223, 209, 173, 108, 117, 255, 255, 255, 31, 209, 173, 108, 117, 255, 255, 255, 223, 7, 119, 188, 105, 255, 255, 255, 159, 131, 187, 43, 164, 255, 191, 50, 179, 131, 187, 59, 199, 255, 191, 255, 223, 131, 187, 43, 164, 255, 191, 50, 179, 131, 187, 235, 210, 255, 191, 255, 223, 131, 187, 43, 164, 255, 191, 50, 179, 131, 187, 59, 199, 255, 191, 255, 159, 131, 187, 3, 170, 255, 191, 50, 179, 131, 187, 59, 199, 255, 191, 255, 159, 131, 187, 43, 164, 255, 191, 255, 223, 131, 187, 43, 164, 255, 191, 50, 179, 131, 187, 235, 210, 255, 191, 255, 223, 131, 187, 154, 222, 255, 191, 255, 31, 131, 187, 154, 222, 255, 191, 255, 223, 131, 187, 154, 222, 255, 191, 50, 179, 131, 187, 235, 210, 255, 191, 204, 76, 131, 187, 235, 210, 255, 191, 255, 31, 131, 187, 154, 222, 255, 191, 50, 179, 131, 187, 235, 210, 255, 191, 204, 76, 131, 187, 59, 199, 255, 191, 255, 31, 131, 187, 154, 222, 255, 191, 204, 76, 131, 187, 235, 210, 255, 191, 255, 159, 131, 187, 3, 170, 255, 191, 204, 140, 131, 187, 179, 181, 255, 191, 50, 179, 131, 187, 59, 199, 255, 191, 204, 76, 131, 187, 59, 199, 255, 191, 50, 179, 131, 187, 59, 199, 255, 191, 204, 140, 131, 187, 179, 181, 255, 191, 50, 115, 131, 187, 179, 181, 255, 191, 204, 76, 131, 187, 59, 199, 255, 191, 204, 140, 131, 187, 179, 181, 255, 191, 255, 95, 131, 187, 3, 170, 255, 191, 50, 115, 131, 187, 3, 170, 255, 191, 255, 31, 131, 187, 43, 164, 255, 191, 255, 95, 131, 187, 43, 164, 255, 191, 50, 115, 131, 187, 3, 170, 255, 191, 204, 76, 131, 187, 59, 199, 255, 191, 50, 115, 131, 187, 179, 181, 255, 191, 255, 95, 131, 187, 43, 164, 255, 191, 255, 95, 131, 187, 3, 170, 255, 191, 255, 31, 131, 187, 154, 222, 255, 191, 204, 76, 131, 187, 59, 199, 255, 191, 255, 31, 131, 187, 43, 164, 255, 191, 204, 140, 131, 187, 179, 181, 255, 191, 255, 159, 131, 187, 3, 170, 255, 191, 204, 140, 131, 187, 3, 170, 255, 191, 255, 159, 131, 187, 43, 164, 255, 191, 255, 159, 209, 173, 43, 164, 255, 191, 255, 159, 131, 187, 3, 170, 255, 191, 255, 159, 247, 166, 3, 170, 255, 191, 255, 159, 30, 160, 104, 155, 255, 191, 255, 159, 30, 160, 139, 187, 255, 191, 255, 159, 247, 166, 31, 185, 255, 191, 255, 159, 128, 183, 59, 199, 255, 191, 255, 159, 209, 173, 59, 199, 255, 191, 255, 159, 30, 160, 139, 187, 255, 191, 255, 159, 30, 160, 104, 155, 255, 191, 255, 95, 30, 160, 139, 187, 255, 191, 255, 95, 30, 160, 104, 155, 255, 191, 50, 179, 7, 119, 59, 199, 255, 191, 50, 179, 7, 119, 28, 129, 255, 191, 204, 76, 7, 119, 59, 199, 255, 191, 204, 76, 7, 119, 28, 129, 255, 191, 204, 76, 7, 119, 28, 129, 255, 191, 204, 76, 186, 132, 224, 137, 255, 191, 204, 76, 7, 119, 59, 199, 255, 191, 204, 76, 186, 132, 100, 194, 255, 191, 204, 76, 102, 138, 59, 199, 255, 191, 204, 76, 186, 132, 235, 210, 255, 191, 204, 76, 131, 187, 59, 199, 255, 191, 204, 76, 131, 187, 235, 210, 255, 191, 50, 179, 131, 187, 59, 199, 255, 191, 50, 179, 102, 138, 59, 199, 255, 191, 50, 179, 131, 187, 235, 210, 255, 191, 50, 179, 7, 119, 59, 199, 255, 191, 50, 179, 186, 132, 235, 210, 255, 191, 50, 179, 186, 132, 100, 194, 255, 191, 50, 179, 186, 132, 224, 137, 255, 191, 50, 179, 7, 119, 28, 129, 255, 191, 204, 76, 186, 132, 235, 210, 255, 127, 204, 76, 131, 187, 235, 210, 255, 127, 50, 179, 186, 132, 235, 210, 255, 127, 50, 179, 131, 187, 235, 210, 255, 127, 204, 76, 7, 119, 59, 199, 126, 176, 204, 76, 186, 132, 235, 210, 126, 176, 50, 179, 7, 119, 59, 199, 126, 176, 50, 179, 186, 132, 235, 210, 126, 176, 50, 179, 7, 119, 59, 199, 126, 176, 204, 76, 186, 132, 235, 210, 126, 176, 50, 179, 186, 132, 100, 194, 128, 207, 50, 179, 102, 138, 59, 199, 128, 207, 204, 76, 186, 132, 100, 194, 128, 207, 204, 76, 102, 138, 59, 199, 128, 207, 204, 76, 186, 132, 100, 194, 128, 207, 50, 179, 102, 138, 59, 199, 128, 207, 50, 179, 186, 132, 224, 137, 255, 191, 50, 179, 186, 132, 100, 194, 255, 191, 204, 76, 186, 132, 224, 137, 255, 191, 204, 76, 186, 132, 100, 194, 255, 191, 50, 179, 102, 138, 59, 199, 255, 255, 255, 95, 209, 173, 59, 199, 255, 255, 204, 76, 102, 138, 59, 199, 255, 255, 204, 76, 131, 187, 59, 199, 255, 255, 255, 95, 128, 183, 59, 199, 255, 255, 255, 159, 128, 183, 59, 199, 255, 255, 255, 159, 209, 173, 59, 199, 255, 255, 50, 179, 131, 187, 59, 199, 255, 255, 255, 95, 209, 173, 43, 164, 255, 191, 255, 95, 247, 166, 3, 170, 255, 191, 255, 95, 30, 160, 104, 155, 255, 191, 255, 95, 30, 160, 139, 187, 255, 191, 255, 95, 131, 187, 43, 164, 255, 191, 255, 95, 247, 166, 31, 185, 255, 191, 255, 95, 128, 183, 59, 199, 255, 191, 255, 95, 209, 173, 59, 199, 255, 191, 255, 95, 131, 187, 3, 170, 255, 191, 204, 140, 209, 173, 179, 181, 128, 207, 204, 140, 131, 187, 3, 170, 128, 207, 50, 115, 209, 173, 179, 181, 128, 207, 50, 115, 131, 187, 3, 170, 128, 207, 204, 140, 209, 173, 53, 185, 55, 154, 50, 115, 209, 173, 53, 185, 55, 154, 204, 140, 131, 187, 179, 181, 55, 154, 50, 115, 131, 187, 179, 181, 55, 154, 255, 159, 247, 166, 3, 170, 255, 191, 255, 159, 247, 166, 31, 185, 255, 191, 255, 95, 247, 166, 3, 170, 255, 191, 255, 95, 247, 166, 31, 185, 255, 191, 255, 159, 209, 173, 59, 199, 126, 176, 255, 159, 30, 160, 139, 187, 126, 176, 255, 95, 209, 173, 59, 199, 126, 176, 255, 95, 30, 160, 139, 187, 126, 176, 255, 95, 209, 173, 59, 199, 126, 176, 255, 159, 30, 160, 139, 187, 126, 176, 204, 140, 131, 187, 3, 170, 255, 191, 204, 140, 209, 173, 179, 181, 255, 191, 204, 140, 131, 187, 179, 181, 255, 191, 204, 140, 209, 173, 53, 185, 255, 191, 204, 140, 209, 173, 53, 185, 255, 191, 204, 140, 209, 173, 179, 181, 255, 191, 50, 115, 209, 173, 53, 185, 255, 191, 50, 115, 209, 173, 179, 181, 255, 191, 255, 159, 247, 166, 3, 170, 255, 127, 255, 95, 247, 166, 3, 170, 255, 127, 255, 159, 131, 187, 3, 170, 255, 127, 255, 95, 131, 187, 3, 170, 255, 127, 204, 140, 131, 187, 3, 170, 254, 127, 255, 159, 131, 187, 3, 170, 254, 127, 255, 95, 131, 187, 3, 170, 254, 127, 50, 115, 131, 187, 3, 170, 254, 127, 50, 115, 131, 187, 3, 170, 255, 191, 50, 115, 131, 187, 179, 181, 255, 191, 50, 115, 209, 173, 179, 181, 255, 191, 50, 115, 209, 173, 53, 185, 255, 191, 255, 159, 247, 166, 31, 185, 128, 207, 255, 159, 128, 183, 59, 199, 128, 207, 255, 95, 247, 166, 31, 185, 128, 207, 255, 95, 128, 183, 59, 199, 128, 207, 255, 95, 247, 166, 31, 185, 128, 207, 255, 159, 128, 183, 59, 199, 128, 207, 0, 0, 115, 235, 188, 105, 144, 197, 255, 31, 255, 255, 188, 105, 144, 197, 0, 0, 115, 235, 154, 222, 144, 197, 255, 31, 255, 255, 154, 222, 144, 197, 255, 255, 115, 235, 188, 105, 255, 191, 255, 255, 193, 221, 188, 105, 255, 191, 254, 255, 115, 235, 154, 222, 255, 191, 254, 255, 193, 221, 154, 222, 255, 191, 0, 0, 193, 221, 188, 105, 255, 191, 0, 0, 115, 235, 188, 105, 255, 191, 0, 0, 193, 221, 154, 222, 255, 191, 0, 0, 115, 235, 154, 222, 255, 191, 255, 223, 255, 255, 188, 105, 144, 197, 255, 255, 115, 235, 188, 105, 144, 197, 255, 223, 255, 255, 154, 222, 144, 197, 254, 255, 115, 235, 154, 222, 144, 197, 255, 223, 255, 255, 188, 105, 255, 191, 255, 223, 255, 255, 154, 222, 255, 191, 255, 31, 255, 255, 188, 105, 255, 191, 255, 31, 255, 255, 154, 222, 255, 191, 0, 0, 193, 221, 188, 105, 255, 255, 255, 255, 193, 221, 188, 105, 255, 255, 0, 0, 115, 235, 188, 105, 255, 255, 255, 255, 115, 235, 188, 105, 255, 255, 255, 31, 255, 255, 188, 105, 255, 255, 255, 223, 255, 255, 188, 105, 255, 255, 254, 255, 193, 221, 154, 222, 255, 127, 0, 0, 193, 221, 154, 222, 255, 127, 254, 255, 115, 235, 154, 222, 255, 127, 0, 0, 115, 235, 154, 222, 255, 127, 255, 223, 255, 255, 154, 222, 255, 127, 255, 31, 255, 255, 154, 222, 255, 127, 75, 181, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 222, 52, 84, 213, 75, 181, 220, 216, 115, 100, 84, 213, 43, 150, 220, 216, 224, 89, 84, 213, 234, 87, 220, 216, 115, 100, 84, 213, 123, 103, 220, 216, 224, 89, 84, 213, 123, 103, 220, 216, 151, 84, 84, 213, 123, 103, 220, 216, 222, 52, 84, 213, 123, 103, 220, 216, 148, 47, 84, 213, 123, 103, 220, 216, 37, 21, 84, 213, 123, 103, 220, 216, 220, 15, 84, 213, 123, 103, 220, 216, 146, 10, 84, 213, 234, 87, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 220, 216, 148, 47, 84, 213, 43, 150, 220, 216, 151, 84, 84, 213, 187, 165, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 148, 47, 84, 213, 187, 165, 220, 216, 222, 52, 84, 213, 187, 165, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 100, 170, 222, 52, 84, 213, 43, 150, 100, 170, 151, 84, 84, 213, 123, 103, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 151, 84, 84, 213, 234, 87, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 224, 89, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 75, 181, 100, 170, 115, 100, 84, 213, 187, 165, 100, 170, 148, 47, 84, 213, 75, 181, 100, 170, 148, 47, 84, 213, 234, 87, 100, 170, 115, 100, 84, 213, 187, 165, 115, 77, 37, 21, 255, 255, 123, 103, 115, 77, 37, 21, 255, 255, 187, 165, 220, 216, 37, 21, 255, 255, 123, 103, 220, 216, 37, 21, 255, 255, 123, 103, 100, 170, 151, 84, 255, 255, 43, 150, 100, 170, 151, 84, 255, 255, 123, 103, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 84, 213, 43, 150, 100, 170, 151, 84, 84, 213, 43, 150, 220, 216, 224, 89, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 187, 165, 215, 247, 220, 15, 104, 203, 43, 150, 90, 232, 111, 26, 104, 203, 123, 103, 215, 247, 220, 15, 104, 203, 11, 119, 90, 232, 111, 26, 104, 203, 187, 165, 115, 77, 37, 21, 170, 233, 187, 165, 230, 154, 148, 47, 170, 233, 123, 103, 115, 77, 37, 21, 170, 233, 123, 103, 230, 154, 148, 47, 170, 233, 43, 150, 90, 232, 111, 26, 84, 213, 43, 150, 90, 232, 188, 105, 84, 213, 11, 119, 90, 232, 111, 26, 84, 213, 11, 119, 90, 232, 188, 105, 84, 213, 187, 165, 100, 170, 222, 52, 255, 255, 123, 103, 100, 170, 222, 52, 255, 255, 187, 165, 220, 216, 222, 52, 255, 255, 123, 103, 220, 216, 222, 52, 255, 255, 11, 119, 125, 15, 0, 0, 119, 221, 11, 119, 220, 216, 0, 0, 119, 221, 123, 103, 0, 0, 146, 10, 119, 221, 123, 103, 220, 216, 146, 10, 119, 221, 234, 87, 220, 216, 146, 10, 153, 228, 11, 119, 220, 216, 0, 0, 153, 228, 234, 87, 90, 232, 146, 10, 153, 228, 11, 119, 90, 232, 0, 0, 153, 228, 43, 150, 220, 216, 0, 0, 153, 228, 75, 181, 220, 216, 146, 10, 153, 228, 43, 150, 90, 232, 0, 0, 153, 228, 75, 181, 90, 232, 146, 10, 153, 228, 11, 119, 125, 15, 0, 0, 255, 255, 43, 150, 125, 15, 0, 0, 255, 255, 11, 119, 220, 216, 0, 0, 255, 255, 43, 150, 220, 216, 0, 0, 255, 255, 11, 119, 90, 232, 0, 0, 255, 255, 43, 150, 90, 232, 0, 0, 255, 255, 187, 165, 0, 0, 146, 10, 245, 224, 43, 150, 125, 15, 0, 0, 245, 224, 123, 103, 0, 0, 146, 10, 245, 224, 11, 119, 125, 15, 0, 0, 245, 224, 11, 119, 220, 216, 0, 0, 84, 213, 43, 150, 220, 216, 0, 0, 119, 221, 43, 150, 125, 15, 0, 0, 119, 221, 187, 165, 220, 216, 146, 10, 119, 221, 187, 165, 0, 0, 146, 10, 119, 221, 187, 165, 215, 247, 146, 10, 75, 226, 43, 150, 90, 232, 0, 0, 75, 226, 75, 181, 90, 232, 146, 10, 75, 226, 187, 165, 215, 247, 146, 10, 245, 224, 123, 103, 215, 247, 146, 10, 245, 224, 43, 150, 90, 232, 0, 0, 245, 224, 11, 119, 90, 232, 0, 0, 245, 224, 234, 87, 90, 232, 146, 10, 75, 226, 11, 119, 90, 232, 0, 0, 75, 226, 123, 103, 215, 247, 146, 10, 75, 226, 43, 150, 220, 216, 0, 0, 84, 213, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 236, 176, 118, 24, 236, 176, 118, 24, 236, 176, 118, 24, 236, 176, 118, 24, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 117, 152, 18, 207, 117, 152, 18, 207, 117, 152, 18, 207, 117, 152, 18, 207, 117, 152, 18, 207, 203, 211, 50, 172, 203, 211, 50, 172, 203, 211, 50, 172, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 117, 152, 18, 207, 117, 152, 18, 207, 117, 152, 18, 207, 117, 152, 18, 207, 236, 176, 118, 24, 236, 176, 118, 24, 236, 176, 118, 24, 236, 176, 118, 24, 236, 176, 118, 24, 236, 176, 118, 24, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 1, 0, 254, 127, 1, 0, 2, 128, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 127, 129, 218, 255, 127, 129, 218, 255, 127, 129, 218, 255, 127, 129, 218, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 134, 148, 241, 214, 134, 148, 241, 214, 134, 148, 241, 214, 134, 148, 241, 214, 134, 148, 241, 214, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 127, 12, 169, 134, 20, 12, 169, 134, 20, 12, 169, 134, 20, 12, 169, 134, 20, 12, 169, 134, 20, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 86, 13, 81, 101, 86, 13, 81, 101, 168, 242, 173, 154, 168, 242, 173, 154, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 81, 229, 168, 114, 81, 229, 168, 114, 81, 229, 168, 114, 81, 229, 168, 114, 85, 211, 170, 105, 85, 211, 170, 105, 255, 127, 255, 255, 81, 101, 168, 242, 255, 127, 255, 255, 81, 101, 168, 242, 170, 233, 168, 172, 170, 233, 168, 172, 168, 242, 173, 154, 168, 242, 173, 154, 255, 226, 253, 185, 255, 226, 253, 185, 170, 233, 168, 172, 170, 233, 168, 172, 254, 156, 0, 198, 84, 150, 85, 211, 254, 156, 0, 198, 84, 150, 85, 211, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 169, 44, 84, 150, 169, 44, 84, 150, 173, 26, 86, 141, 173, 26, 86, 141, 84, 150, 85, 211, 86, 141, 81, 229, 84, 150, 85, 211, 86, 141, 81, 229, 173, 26, 86, 141, 173, 26, 86, 141, 0, 0, 255, 127, 0, 0, 255, 127, 86, 83, 170, 233, 1, 70, 255, 226, 86, 83, 170, 233, 1, 70, 255, 226, 86, 141, 81, 229, 255, 127, 255, 255, 86, 141, 81, 229, 255, 127, 255, 255, 81, 101, 168, 242, 86, 83, 170, 233, 81, 101, 168, 242, 86, 83, 170, 233, 254, 57, 254, 156, 254, 57, 254, 156, 169, 44, 84, 150, 169, 44, 84, 150, 168, 172, 84, 22, 253, 185, 255, 28, 168, 172, 84, 22, 253, 185, 255, 28, 173, 154, 86, 13, 168, 172, 84, 22, 173, 154, 86, 13, 168, 172, 84, 22, 85, 211, 170, 105, 85, 211, 170, 105, 0, 198, 0, 99, 0, 198, 0, 99, 0, 198, 0, 99, 0, 198, 0, 99, 85, 211, 170, 105, 85, 211, 170, 105, 255, 255, 255, 127, 255, 255, 255, 127, 168, 242, 173, 154, 168, 242, 173, 154, 21, 109, 212, 37, 21, 106, 211, 43, 21, 109, 212, 37, 21, 102, 212, 51, 21, 102, 212, 51, 55, 45, 155, 150, 55, 45, 155, 150, 128, 63, 191, 159, 128, 63, 191, 159, 43, 76, 20, 230, 44, 84, 21, 234, 43, 76, 20, 230, 43, 90, 20, 237, 43, 90, 20, 237, 85, 211, 170, 105, 85, 211, 170, 105, 81, 229, 168, 114, 81, 229, 168, 114, 168, 242, 173, 154, 168, 242, 173, 154, 170, 233, 168, 172, 170, 233, 168, 172, 86, 121, 82, 13, 72, 115, 110, 25, 86, 121, 82, 13, 72, 115, 110, 25, 173, 114, 85, 249, 42, 121, 148, 252, 173, 114, 85, 249, 42, 121, 148, 252, 42, 121, 148, 252, 144, 102, 71, 243, 173, 114, 85, 249, 144, 102, 71, 243, 173, 114, 85, 249, 170, 233, 168, 172, 170, 233, 168, 172, 255, 226, 253, 185, 255, 226, 253, 185, 106, 135, 41, 241, 86, 141, 81, 229, 106, 135, 41, 241, 86, 141, 81, 229, 149, 124, 212, 6, 86, 121, 82, 13, 149, 124, 212, 6, 86, 121, 82, 13, 149, 124, 212, 6, 86, 141, 81, 229, 84, 150, 85, 211, 86, 141, 81, 229, 84, 150, 85, 211, 168, 172, 84, 22, 173, 154, 86, 13, 168, 172, 84, 22, 173, 154, 86, 13, 84, 150, 85, 211, 254, 156, 0, 198, 84, 150, 85, 211, 254, 156, 0, 198, 173, 154, 86, 13, 213, 142, 106, 7, 173, 154, 86, 13, 213, 142, 106, 7, 192, 31, 127, 64, 192, 31, 127, 64, 155, 22, 200, 82, 155, 22, 200, 82, 81, 229, 168, 114, 81, 229, 168, 114, 255, 255, 255, 127, 255, 255, 255, 127, 253, 185, 255, 28, 168, 172, 84, 22, 253, 185, 255, 28, 168, 172, 84, 22, 72, 115, 110, 25, 21, 109, 212, 37, 72, 115, 110, 25, 21, 109, 212, 37, 43, 90, 20, 237, 144, 102, 71, 243, 43, 90, 20, 237, 144, 102, 71, 243, 155, 22, 200, 82, 155, 22, 200, 82, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 55, 45, 155, 150, 55, 45, 155, 150, 170, 105, 169, 44, 168, 114, 173, 26, 170, 105, 169, 44, 168, 114, 173, 26, 84, 22, 86, 83, 84, 22, 86, 83, 255, 28, 1, 70, 255, 28, 1, 70, 86, 13, 81, 101, 86, 13, 81, 101, 84, 22, 86, 83, 84, 22, 86, 83, 255, 127, 0, 0, 173, 154, 86, 13, 255, 127, 0, 0, 173, 154, 86, 13, 168, 114, 173, 26, 255, 127, 0, 0, 168, 114, 173, 26, 255, 127, 0, 0, 0, 99, 254, 57, 170, 105, 169, 44, 0, 99, 254, 57, 170, 105, 169, 44, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 120, 107, 13, 41, 120, 107, 13, 41, 120, 107, 13, 41, 120, 107, 13, 41, 120, 107, 13, 41, 120, 107, 13, 41, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 242, 86, 120, 235, 242, 86, 120, 235, 242, 86, 120, 235, 242, 86, 120, 235, 242, 86, 120, 235, 242, 86, 120, 235, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 83, 28, 87, 71, 83, 28, 87, 71, 83, 28, 87, 71, 83, 28, 87, 71, 83, 28, 87, 71, 83, 28, 87, 71, 83, 28, 87, 71, 83, 28, 87, 71, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 167, 56, 83, 156, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 119, 227, 255, 127, 119, 227, 255, 127, 119, 227, 255, 127, 119, 227, 255, 127, 119, 227, 255, 127, 119, 227, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 171, 227, 167, 184, 171, 227, 167, 184, 171, 227, 167, 184, 171, 227, 167, 184, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 87, 199, 171, 99, 87, 199, 171, 99, 87, 199, 171, 99, 87, 199, 171, 99, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 0, 0, 255, 127) +}, { +"aabb": AABB(-1.5172, -0.57, -4.4, 1.0692, 1.57, 4.6), +"attribute_data": PackedByteArray(255, 103, 245, 210, 255, 103, 122, 233, 111, 96, 245, 210, 111, 96, 122, 233, 227, 105, 111, 131, 27, 102, 111, 131, 255, 103, 46, 129, 227, 153, 111, 131, 27, 150, 111, 131, 115, 161, 111, 131, 139, 94, 111, 131, 139, 94, 177, 142, 111, 96, 177, 142, 255, 103, 177, 142, 227, 105, 177, 142, 171, 157, 111, 131, 111, 96, 46, 129, 83, 98, 111, 131, 111, 96, 50, 147, 255, 103, 50, 147, 180, 247, 46, 129, 45, 242, 111, 131, 185, 200, 46, 129, 185, 200, 111, 131, 255, 103, 54, 165, 111, 96, 54, 165, 255, 103, 50, 147, 111, 96, 50, 147, 134, 5, 46, 129, 74, 8, 46, 129, 134, 5, 111, 131, 69, 55, 46, 129, 69, 55, 111, 131, 115, 161, 111, 131, 115, 161, 111, 131, 115, 161, 111, 131, 115, 161, 177, 142, 143, 159, 177, 142, 115, 161, 113, 140, 143, 159, 113, 140, 143, 159, 177, 142, 255, 151, 177, 142, 143, 159, 175, 133, 255, 151, 113, 140, 255, 151, 175, 133, 27, 150, 177, 142, 27, 150, 113, 140, 111, 96, 245, 210, 111, 96, 122, 233, 139, 94, 245, 210, 139, 94, 122, 233, 120, 250, 175, 133, 124, 203, 175, 133, 120, 250, 111, 131, 180, 247, 111, 131, 185, 200, 111, 131, 124, 203, 113, 140, 185, 200, 177, 142, 31, 231, 177, 142, 31, 231, 113, 140, 227, 105, 245, 210, 227, 105, 186, 235, 255, 103, 245, 210, 255, 103, 186, 235, 162, 27, 50, 147, 162, 27, 177, 142, 69, 55, 50, 147, 69, 55, 177, 142, 143, 159, 177, 142, 143, 159, 50, 147, 143, 159, 175, 133, 162, 27, 175, 133, 223, 24, 175, 133, 223, 24, 177, 142, 13, 11, 244, 153, 134, 5, 54, 165, 134, 5, 175, 133, 74, 8, 175, 133, 143, 159, 113, 140, 13, 11, 175, 133, 162, 27, 177, 142, 162, 27, 113, 140, 69, 55, 177, 142, 130, 52, 113, 140, 130, 52, 175, 133, 69, 55, 111, 131, 74, 8, 111, 131, 134, 5, 111, 131, 134, 5, 175, 133, 27, 102, 113, 140, 111, 96, 113, 140, 27, 102, 175, 133, 111, 96, 175, 133, 115, 161, 113, 140, 27, 150, 113, 140, 115, 161, 175, 133, 27, 150, 175, 133, 74, 8, 46, 129, 69, 55, 46, 129, 209, 13, 111, 131, 69, 55, 111, 131, 120, 250, 46, 129, 120, 250, 111, 131, 180, 247, 46, 129, 180, 247, 111, 131, 185, 200, 46, 129, 185, 200, 111, 131, 92, 228, 50, 147, 241, 244, 244, 153, 120, 250, 54, 165, 120, 250, 175, 133, 180, 247, 175, 133, 241, 244, 175, 133, 31, 231, 177, 142, 185, 200, 177, 142, 185, 200, 50, 147, 31, 231, 175, 133, 31, 231, 113, 140, 92, 228, 175, 133, 92, 228, 113, 140, 55, 44, 113, 140, 55, 44, 175, 133, 251, 46, 113, 140, 251, 46, 175, 133, 255, 103, 233, 51, 255, 103, 41, 54, 111, 96, 233, 51, 111, 96, 41, 54, 227, 105, 126, 251, 255, 103, 122, 233, 227, 105, 54, 213, 27, 102, 183, 217, 139, 94, 54, 213, 111, 96, 183, 217, 111, 96, 247, 219, 111, 96, 122, 233, 111, 96, 186, 235, 111, 96, 253, 246, 111, 96, 61, 249, 111, 96, 126, 251, 139, 94, 126, 251, 255, 103, 253, 246, 255, 103, 186, 235, 27, 102, 247, 219, 255, 103, 126, 251, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 103, 61, 249, 255, 103, 236, 69, 27, 102, 111, 83, 111, 96, 236, 69, 111, 96, 111, 83, 139, 94, 236, 69, 111, 96, 176, 85, 27, 102, 176, 85, 227, 105, 48, 90, 255, 103, 172, 67, 227, 105, 172, 67, 139, 94, 48, 90, 255, 103, 244, 153, 111, 96, 244, 153, 255, 103, 175, 133, 111, 96, 175, 133, 143, 159, 113, 140, 227, 153, 113, 140, 143, 159, 175, 133, 227, 153, 175, 133, 199, 211, 175, 133, 199, 211, 113, 140, 3, 209, 175, 133, 3, 209, 113, 140, 255, 103, 41, 54, 27, 102, 170, 58, 111, 96, 41, 54, 83, 98, 170, 58, 255, 151, 244, 153, 255, 151, 177, 142, 143, 159, 244, 153, 143, 159, 177, 142, 27, 102, 170, 58, 27, 102, 113, 92, 83, 98, 170, 58, 83, 98, 113, 92, 255, 103, 113, 140, 111, 96, 113, 140, 255, 103, 175, 133, 111, 96, 175, 133, 27, 150, 175, 133, 27, 150, 111, 131, 255, 151, 175, 133, 255, 151, 111, 131, 255, 151, 175, 133, 27, 150, 111, 131, 27, 102, 111, 83, 27, 102, 176, 85, 111, 96, 111, 83, 111, 96, 176, 85, 111, 96, 111, 83, 27, 102, 176, 85, 115, 113, 189, 132, 115, 113, 255, 127, 255, 127, 189, 132, 232, 130, 255, 127, 232, 130, 189, 132, 92, 164, 189, 132, 208, 149, 189, 132, 115, 161, 255, 127, 185, 152, 255, 127, 139, 158, 255, 127, 162, 155, 255, 127, 139, 142, 255, 127, 139, 142, 189, 132, 22, 125, 255, 127, 255, 127, 189, 132, 22, 125, 189, 132, 69, 103, 189, 132, 31, 103, 209, 131, 46, 106, 189, 132, 69, 103, 255, 127, 175, 102, 246, 130, 254, 101, 57, 130, 22, 101, 168, 129, 9, 100, 77, 129, 232, 98, 46, 129, 139, 94, 255, 127, 199, 97, 77, 129, 185, 96, 168, 129, 210, 95, 57, 130, 32, 95, 246, 130, 177, 94, 209, 131, 162, 91, 189, 132, 139, 94, 189, 132, 139, 94, 84, 149, 139, 94, 179, 151, 162, 91, 84, 149, 162, 91, 179, 151, 46, 106, 84, 149, 46, 106, 179, 151, 69, 103, 84, 149, 69, 103, 179, 151, 115, 97, 217, 139, 115, 97, 179, 151, 139, 94, 217, 139, 139, 94, 18, 154, 92, 100, 179, 151, 69, 103, 18, 154, 92, 100, 217, 139, 69, 103, 217, 139, 115, 97, 217, 139, 115, 97, 179, 151, 139, 94, 217, 139, 139, 94, 18, 154, 92, 100, 179, 151, 69, 103, 18, 154, 92, 100, 217, 139, 69, 103, 217, 139, 232, 98, 8, 141, 139, 94, 8, 141, 199, 97, 192, 140, 139, 94, 217, 139, 185, 96, 236, 139, 172, 96, 217, 139, 9, 100, 192, 140, 69, 103, 8, 141, 69, 103, 217, 139, 22, 101, 236, 139, 35, 101, 217, 139, 69, 103, 179, 151, 69, 103, 141, 163, 232, 98, 179, 151, 139, 94, 141, 163, 139, 94, 179, 151, 139, 142, 217, 139, 139, 142, 8, 141, 255, 127, 217, 139, 255, 127, 8, 141, 115, 161, 8, 141, 185, 152, 8, 141, 115, 161, 217, 139, 185, 152, 217, 139, 115, 113, 8, 141, 115, 113, 217, 139, 255, 127, 8, 141, 255, 127, 217, 139, 232, 98, 245, 146, 232, 98, 179, 151, 135, 98, 245, 146, 135, 98, 179, 151, 72, 99, 179, 151, 72, 99, 113, 156, 232, 98, 179, 151, 232, 98, 113, 156, 232, 98, 179, 151, 232, 98, 113, 156, 135, 98, 179, 151, 135, 98, 113, 156, 135, 98, 179, 151, 135, 98, 113, 156, 46, 98, 179, 151, 46, 98, 113, 156, 255, 127, 189, 132, 255, 127, 110, 132, 208, 133, 189, 132, 208, 133, 110, 132, 162, 99, 179, 151, 162, 99, 113, 156, 72, 99, 179, 151, 72, 99, 113, 156, 239, 99, 179, 151, 239, 99, 113, 156, 162, 99, 179, 151, 162, 99, 113, 156, 255, 127, 147, 133, 255, 127, 84, 133, 208, 133, 147, 133, 208, 133, 84, 133, 232, 98, 236, 133, 72, 99, 226, 133, 31, 103, 226, 134, 69, 103, 189, 132, 162, 99, 195, 133, 239, 99, 147, 133, 42, 100, 84, 133, 80, 100, 11, 133, 92, 100, 189, 132, 31, 103, 209, 131, 80, 100, 110, 132, 42, 100, 37, 132, 239, 99, 230, 131, 162, 99, 182, 131, 175, 102, 246, 130, 72, 99, 152, 131, 232, 98, 141, 131, 32, 95, 246, 130, 135, 98, 152, 131, 46, 98, 182, 131, 177, 94, 209, 131, 225, 97, 230, 131, 165, 97, 37, 132, 128, 97, 110, 132, 139, 94, 189, 132, 115, 97, 189, 132, 128, 97, 11, 133, 165, 97, 84, 133, 225, 97, 147, 133, 46, 98, 195, 133, 135, 98, 226, 133, 177, 94, 226, 134, 32, 95, 227, 136, 175, 102, 227, 136, 210, 95, 154, 138, 254, 101, 154, 138, 185, 96, 236, 139, 22, 101, 236, 139, 199, 97, 192, 140, 9, 100, 192, 140, 232, 98, 8, 141, 254, 101, 57, 130, 210, 95, 57, 130, 22, 101, 168, 129, 185, 96, 168, 129, 199, 97, 77, 129, 9, 100, 77, 129, 232, 98, 46, 129, 162, 99, 245, 146, 162, 99, 179, 151, 72, 99, 245, 146, 72, 99, 179, 151, 255, 127, 84, 133, 255, 127, 11, 133, 208, 133, 84, 133, 208, 133, 11, 133, 72, 99, 245, 146, 72, 99, 179, 151, 232, 98, 245, 146, 232, 98, 179, 151, 255, 127, 37, 132, 255, 127, 230, 131, 208, 133, 37, 132, 208, 133, 230, 131, 255, 127, 11, 133, 255, 127, 189, 132, 208, 133, 11, 133, 208, 133, 189, 132, 255, 127, 110, 132, 255, 127, 37, 132, 208, 133, 110, 132, 208, 133, 37, 132, 239, 99, 245, 146, 239, 99, 179, 151, 162, 99, 245, 146, 162, 99, 179, 151, 255, 127, 84, 133, 255, 127, 147, 133, 46, 122, 84, 133, 46, 122, 147, 133, 255, 127, 11, 133, 255, 127, 84, 133, 46, 122, 11, 133, 46, 122, 84, 133, 46, 98, 179, 151, 46, 98, 113, 156, 225, 97, 179, 151, 225, 97, 113, 156, 254, 101, 18, 154, 254, 101, 113, 156, 22, 101, 18, 154, 22, 101, 113, 156, 232, 98, 18, 154, 232, 98, 113, 156, 199, 97, 18, 154, 199, 97, 113, 156, 255, 127, 154, 138, 255, 127, 217, 139, 46, 122, 154, 138, 255, 127, 236, 139, 46, 122, 236, 139, 199, 97, 245, 146, 199, 97, 179, 151, 185, 96, 245, 146, 185, 96, 179, 151, 255, 127, 236, 139, 255, 127, 217, 139, 208, 133, 236, 139, 255, 127, 154, 138, 208, 133, 154, 138, 22, 101, 18, 154, 22, 101, 113, 156, 9, 100, 18, 154, 9, 100, 113, 156, 199, 97, 18, 154, 199, 97, 113, 156, 185, 96, 18, 154, 185, 96, 113, 156, 255, 127, 226, 134, 255, 127, 227, 136, 46, 122, 226, 134, 46, 122, 227, 136, 255, 127, 226, 134, 255, 127, 189, 132, 208, 133, 226, 134, 232, 130, 189, 132, 208, 133, 189, 132, 255, 127, 227, 136, 255, 127, 226, 134, 208, 133, 227, 136, 208, 133, 226, 134, 185, 96, 18, 154, 185, 96, 113, 156, 210, 95, 18, 154, 210, 95, 113, 156, 232, 130, 189, 132, 232, 130, 209, 131, 208, 133, 189, 132, 208, 133, 209, 131, 255, 127, 189, 132, 255, 127, 226, 134, 22, 125, 189, 132, 46, 122, 226, 134, 46, 122, 189, 132, 232, 130, 209, 131, 232, 130, 246, 130, 208, 133, 209, 131, 208, 133, 246, 130, 22, 125, 246, 130, 22, 125, 209, 131, 46, 122, 246, 130, 46, 122, 209, 131, 232, 130, 246, 130, 232, 130, 57, 130, 208, 133, 246, 130, 208, 133, 57, 130, 22, 125, 209, 131, 22, 125, 189, 132, 46, 122, 209, 131, 46, 122, 189, 132, 22, 101, 245, 146, 22, 101, 179, 151, 9, 100, 245, 146, 9, 100, 179, 151, 9, 100, 18, 154, 9, 100, 113, 156, 232, 98, 18, 154, 232, 98, 113, 156, 22, 125, 57, 130, 22, 125, 246, 130, 46, 122, 57, 130, 46, 122, 246, 130, 255, 127, 227, 136, 255, 127, 154, 138, 46, 122, 227, 136, 46, 122, 154, 138, 255, 127, 154, 138, 255, 127, 227, 136, 208, 133, 154, 138, 208, 133, 227, 136, 9, 100, 245, 146, 9, 100, 179, 151, 232, 98, 245, 146, 232, 98, 179, 151, 232, 98, 245, 146, 232, 98, 179, 151, 199, 97, 245, 146, 199, 97, 179, 151, 255, 127, 37, 132, 255, 127, 110, 132, 46, 122, 37, 132, 46, 122, 110, 132, 46, 98, 245, 146, 46, 98, 179, 151, 225, 97, 245, 146, 225, 97, 179, 151, 135, 98, 245, 146, 135, 98, 179, 151, 46, 98, 245, 146, 46, 98, 179, 151, 255, 127, 189, 132, 255, 127, 11, 133, 46, 122, 189, 132, 46, 122, 11, 133, 255, 127, 110, 132, 255, 127, 189, 132, 46, 122, 110, 132, 46, 122, 189, 132, 255, 127, 230, 131, 255, 127, 37, 132, 46, 122, 230, 131, 46, 122, 37, 132, 232, 98, 236, 133, 135, 98, 226, 133, 72, 99, 226, 133, 162, 99, 195, 133, 46, 98, 195, 133, 239, 99, 147, 133, 225, 97, 147, 133, 42, 100, 84, 133, 165, 97, 84, 133, 80, 100, 11, 133, 128, 97, 11, 133, 92, 100, 189, 132, 115, 97, 189, 132, 80, 100, 110, 132, 128, 97, 110, 132, 165, 97, 37, 132, 42, 100, 37, 132, 239, 99, 230, 131, 225, 97, 230, 131, 162, 99, 182, 131, 46, 98, 182, 131, 72, 99, 152, 131, 135, 98, 152, 131, 232, 98, 141, 131, 139, 142, 27, 135, 139, 142, 122, 137, 255, 127, 27, 135, 255, 127, 122, 137, 255, 127, 27, 135, 139, 142, 122, 137, 139, 142, 122, 137, 139, 142, 217, 139, 255, 127, 122, 137, 255, 127, 217, 139, 255, 127, 122, 137, 139, 142, 217, 139, 115, 113, 27, 135, 115, 113, 189, 132, 255, 127, 27, 135, 255, 127, 189, 132, 255, 127, 27, 135, 115, 113, 189, 132, 115, 113, 122, 137, 115, 113, 27, 135, 255, 127, 122, 137, 255, 127, 27, 135, 255, 127, 122, 137, 115, 113, 27, 135, 139, 142, 189, 132, 139, 142, 27, 135, 255, 127, 189, 132, 255, 127, 27, 135, 255, 127, 189, 132, 139, 142, 27, 135, 92, 164, 27, 135, 232, 162, 27, 135, 92, 164, 189, 132, 69, 151, 27, 135, 92, 164, 189, 132, 232, 162, 27, 135, 208, 149, 27, 135, 69, 151, 27, 135, 208, 149, 189, 132, 92, 164, 189, 132, 208, 149, 27, 135, 115, 161, 217, 139, 185, 152, 217, 139, 232, 162, 122, 137, 69, 151, 122, 137, 232, 162, 122, 137, 185, 152, 217, 139, 232, 162, 27, 135, 232, 162, 122, 137, 69, 151, 122, 137, 69, 151, 27, 135, 232, 162, 27, 135, 69, 151, 122, 137, 115, 113, 217, 139, 115, 113, 122, 137, 255, 127, 217, 139, 255, 127, 122, 137, 255, 127, 217, 139, 115, 113, 122, 137, 46, 106, 27, 135, 185, 104, 27, 135, 46, 106, 189, 132, 31, 103, 226, 134, 46, 106, 189, 132, 185, 104, 27, 135, 69, 103, 189, 132, 46, 106, 189, 132, 31, 103, 226, 134, 69, 103, 217, 139, 35, 101, 217, 139, 185, 104, 122, 137, 254, 101, 154, 138, 185, 104, 122, 137, 35, 101, 217, 139, 175, 102, 227, 136, 185, 104, 122, 137, 254, 101, 154, 138, 185, 104, 27, 135, 185, 104, 122, 137, 175, 102, 227, 136, 31, 103, 226, 134, 185, 104, 27, 135, 175, 102, 227, 136, 172, 96, 217, 139, 139, 94, 217, 139, 210, 95, 154, 138, 22, 93, 122, 137, 210, 95, 154, 138, 139, 94, 217, 139, 32, 95, 227, 136, 210, 95, 154, 138, 22, 93, 122, 137, 22, 93, 27, 135, 32, 95, 227, 136, 22, 93, 122, 137, 177, 94, 226, 134, 32, 95, 227, 136, 22, 93, 27, 135, 162, 91, 27, 135, 177, 94, 226, 134, 22, 93, 27, 135, 162, 91, 189, 132, 177, 94, 226, 134, 162, 91, 27, 135, 139, 94, 189, 132, 177, 94, 226, 134, 162, 91, 189, 132, 22, 93, 179, 151, 22, 93, 141, 163, 162, 91, 179, 151, 162, 91, 141, 163, 162, 91, 179, 151, 22, 93, 141, 163, 46, 106, 179, 151, 46, 106, 141, 163, 185, 104, 179, 151, 185, 104, 141, 163, 185, 104, 179, 151, 46, 106, 141, 163, 19, 111, 1, 201, 162, 105, 1, 201, 19, 111, 18, 186, 162, 105, 69, 197, 49, 93, 69, 197, 77, 103, 205, 189, 77, 103, 18, 186, 134, 95, 205, 189, 191, 87, 18, 186, 191, 87, 1, 201, 49, 93, 1, 201, 134, 95, 18, 186, 134, 95, 241, 139, 191, 87, 241, 139, 134, 95, 244, 137, 191, 87, 244, 137, 134, 95, 244, 137, 191, 87, 241, 139, 247, 114, 245, 210, 19, 111, 245, 210, 247, 114, 46, 161, 19, 111, 18, 186, 247, 114, 46, 161, 19, 111, 245, 210, 19, 111, 46, 161, 19, 111, 18, 186, 69, 55, 247, 134, 69, 55, 249, 132, 92, 116, 247, 134, 92, 116, 249, 132, 92, 116, 247, 134, 69, 55, 249, 132, 63, 168, 244, 137, 235, 144, 244, 137, 34, 172, 247, 134, 7, 141, 247, 134, 34, 172, 247, 134, 235, 144, 244, 137, 34, 172, 249, 132, 34, 172, 247, 134, 7, 141, 247, 134, 7, 141, 249, 132, 34, 172, 249, 132, 7, 141, 247, 134, 191, 87, 245, 210, 220, 83, 245, 210, 191, 87, 18, 186, 220, 83, 46, 161, 191, 87, 18, 186, 220, 83, 245, 210, 191, 87, 46, 161, 191, 87, 18, 186, 220, 83, 46, 161, 19, 111, 244, 137, 191, 87, 244, 137, 247, 114, 247, 134, 220, 83, 247, 134, 247, 114, 247, 134, 191, 87, 244, 137, 247, 114, 249, 132, 247, 114, 247, 134, 220, 83, 247, 134, 220, 83, 249, 132, 247, 114, 249, 132, 220, 83, 247, 134, 185, 200, 249, 132, 185, 200, 247, 134, 162, 139, 249, 132, 162, 139, 247, 134, 162, 139, 249, 132, 185, 200, 247, 134, 19, 111, 251, 205, 19, 111, 245, 210, 191, 87, 251, 205, 191, 87, 245, 210, 191, 87, 251, 205, 19, 111, 245, 210, 185, 200, 244, 137, 157, 194, 241, 139, 45, 170, 244, 137, 129, 188, 232, 147, 45, 170, 244, 137, 157, 194, 241, 139, 45, 170, 241, 139, 45, 170, 244, 137, 129, 188, 232, 147, 157, 194, 241, 139, 185, 200, 232, 147, 129, 188, 232, 147, 69, 55, 232, 147, 97, 61, 241, 139, 125, 67, 232, 147, 69, 55, 244, 137, 209, 85, 244, 137, 97, 61, 241, 139, 125, 67, 232, 147, 97, 61, 241, 139, 209, 85, 244, 137, 209, 85, 241, 139, 125, 67, 232, 147, 209, 85, 244, 137, 19, 111, 1, 201, 19, 111, 245, 210, 162, 105, 1, 201, 191, 87, 245, 210, 162, 105, 1, 201, 19, 111, 245, 210, 49, 93, 1, 201, 162, 105, 1, 201, 191, 87, 245, 210, 191, 87, 1, 201, 49, 93, 1, 201, 191, 87, 245, 210, 19, 111, 241, 139, 77, 103, 241, 139, 19, 111, 244, 137, 77, 103, 244, 137, 19, 111, 244, 137, 77, 103, 241, 139, 63, 168, 232, 147, 235, 144, 232, 147, 63, 168, 241, 139, 235, 144, 241, 139, 63, 168, 241, 139, 235, 144, 232, 147, 77, 103, 18, 186, 162, 105, 35, 171, 19, 111, 18, 186, 162, 105, 41, 166, 19, 111, 18, 186, 162, 105, 35, 171, 77, 103, 149, 183, 162, 105, 35, 171, 77, 103, 18, 186, 19, 111, 18, 186, 162, 105, 41, 166, 19, 111, 46, 161, 191, 87, 46, 161, 19, 111, 46, 161, 162, 105, 41, 166, 49, 93, 41, 166, 191, 87, 46, 161, 162, 105, 41, 166, 49, 93, 35, 171, 191, 87, 46, 161, 49, 93, 41, 166, 77, 103, 149, 183, 248, 100, 154, 178, 162, 105, 35, 171, 49, 93, 35, 171, 162, 105, 35, 171, 248, 100, 154, 178, 219, 97, 154, 178, 49, 93, 35, 171, 248, 100, 154, 178, 134, 95, 149, 183, 219, 97, 149, 183, 191, 87, 18, 186, 134, 95, 18, 186, 219, 97, 149, 183, 49, 93, 35, 171, 219, 97, 154, 178, 134, 95, 18, 186, 134, 95, 149, 183, 191, 87, 46, 161, 49, 93, 35, 171, 191, 87, 18, 186, 248, 100, 154, 178, 77, 103, 149, 183, 248, 100, 149, 183, 45, 170, 244, 137, 45, 170, 241, 139, 31, 167, 244, 137, 31, 167, 240, 140, 194, 174, 239, 141, 246, 157, 239, 141, 57, 159, 240, 140, 218, 151, 137, 138, 218, 151, 241, 139, 77, 103, 29, 176, 77, 103, 205, 189, 134, 95, 29, 176, 134, 95, 205, 189, 162, 105, 35, 171, 162, 105, 1, 201, 49, 93, 35, 171, 49, 93, 1, 201, 125, 67, 232, 147, 18, 72, 234, 145, 36, 104, 232, 147, 157, 101, 234, 145, 36, 104, 23, 145, 64, 110, 234, 145, 36, 104, 244, 137, 64, 110, 244, 137, 218, 151, 244, 137, 218, 151, 23, 145, 190, 145, 244, 137, 218, 151, 232, 147, 190, 145, 234, 145, 97, 154, 234, 145, 236, 183, 234, 145, 129, 188, 232, 147, 49, 93, 234, 145, 49, 93, 244, 137, 162, 105, 234, 145, 162, 105, 244, 137, 49, 93, 35, 171, 49, 93, 41, 166, 162, 105, 35, 171, 162, 105, 41, 166, 162, 105, 35, 171, 49, 93, 41, 166, 162, 105, 51, 130, 162, 105, 67, 132, 49, 93, 51, 130, 49, 93, 67, 132, 49, 93, 51, 130, 162, 105, 67, 132, 162, 105, 33, 106, 162, 105, 51, 130, 49, 93, 33, 106, 49, 93, 51, 130, 92, 150, 23, 145, 120, 160, 241, 139, 205, 162, 23, 145, 205, 162, 244, 137, 120, 160, 137, 138, 177, 152, 137, 138, 177, 152, 241, 139, 92, 150, 244, 137, 209, 85, 241, 139, 223, 88, 240, 140, 60, 81, 239, 141, 8, 98, 239, 141, 209, 85, 244, 137, 197, 96, 240, 140, 36, 104, 137, 138, 36, 104, 241, 139, 223, 88, 244, 137, 248, 100, 154, 178, 248, 100, 149, 183, 219, 97, 154, 178, 219, 97, 149, 183, 248, 100, 241, 139, 219, 97, 241, 139, 248, 100, 244, 137, 219, 97, 244, 137, 77, 103, 210, 119, 77, 103, 65, 126, 134, 95, 210, 119, 134, 95, 65, 126, 77, 103, 35, 171, 77, 103, 29, 176, 134, 95, 35, 171, 134, 95, 29, 176, 134, 95, 35, 171, 77, 103, 29, 176, 31, 167, 244, 137, 4, 161, 241, 139, 4, 161, 244, 137, 46, 159, 241, 139, 248, 100, 28, 177, 248, 100, 154, 178, 219, 97, 28, 177, 219, 97, 154, 178, 77, 103, 240, 140, 134, 95, 240, 140, 77, 103, 244, 137, 134, 95, 244, 137, 6, 155, 244, 137, 177, 152, 244, 137, 120, 160, 244, 137, 35, 158, 244, 137, 223, 88, 244, 137, 250, 94, 244, 137, 250, 94, 241, 139, 208, 96, 241, 139, 77, 103, 65, 126, 77, 103, 67, 132, 134, 95, 65, 126, 134, 95, 67, 132, 134, 95, 65, 126, 77, 103, 67, 132, 220, 83, 113, 92, 191, 87, 113, 92, 220, 83, 56, 142, 191, 87, 56, 142, 185, 200, 252, 130, 185, 200, 249, 132, 162, 139, 252, 130, 162, 139, 249, 132, 69, 55, 249, 132, 69, 55, 252, 130, 92, 116, 249, 132, 92, 116, 252, 130, 19, 111, 113, 92, 247, 114, 113, 92, 19, 111, 56, 142, 247, 114, 56, 142, 19, 111, 113, 92, 19, 111, 56, 142, 191, 87, 113, 92, 191, 87, 56, 142, 34, 172, 249, 132, 7, 141, 249, 132, 34, 172, 252, 130, 7, 141, 252, 130, 63, 168, 255, 127, 235, 144, 255, 127, 247, 114, 249, 132, 220, 83, 249, 132, 247, 114, 252, 130, 220, 83, 252, 130, 19, 111, 255, 127, 191, 87, 255, 127, 227, 105, 126, 251, 255, 103, 122, 233, 227, 105, 54, 213, 27, 102, 183, 217, 139, 94, 54, 213, 111, 96, 183, 217, 111, 96, 247, 219, 111, 96, 122, 233, 111, 96, 186, 235, 111, 96, 253, 246, 111, 96, 61, 249, 111, 96, 126, 251, 139, 94, 126, 251, 255, 103, 253, 246, 255, 103, 186, 235, 27, 102, 247, 219, 255, 103, 126, 251, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 151, 175, 133, 255, 103, 61, 249, 255, 103, 236, 69, 27, 102, 111, 83, 111, 96, 236, 69, 111, 96, 111, 83, 139, 94, 236, 69, 111, 96, 176, 85, 27, 102, 176, 85, 227, 105, 48, 90, 255, 103, 172, 67, 227, 105, 172, 67, 139, 94, 48, 90, 255, 103, 244, 153, 111, 96, 244, 153, 255, 103, 175, 133, 111, 96, 175, 133, 143, 159, 113, 140, 227, 153, 113, 140, 143, 159, 175, 133, 227, 153, 175, 133, 199, 211, 175, 133, 199, 211, 113, 140, 3, 209, 175, 133, 3, 209, 113, 140, 255, 103, 41, 54, 27, 102, 170, 58, 111, 96, 41, 54, 83, 98, 170, 58, 255, 151, 244, 153, 255, 151, 177, 142, 143, 159, 244, 153, 143, 159, 177, 142, 27, 102, 170, 58, 27, 102, 113, 92, 83, 98, 170, 58, 83, 98, 113, 92, 255, 103, 113, 140, 111, 96, 113, 140, 255, 103, 175, 133, 111, 96, 175, 133, 0, 0, 245, 162, 0, 0, 175, 133, 134, 5, 54, 165, 134, 5, 175, 133, 134, 5, 175, 133, 0, 0, 175, 133, 134, 5, 111, 131, 0, 0, 111, 131, 255, 255, 175, 133, 120, 250, 175, 133, 255, 255, 111, 131, 120, 250, 111, 131, 171, 157, 245, 162, 227, 153, 245, 162, 171, 157, 175, 133, 227, 153, 175, 133, 171, 157, 111, 131, 227, 153, 111, 131, 255, 103, 126, 251, 27, 102, 255, 255, 111, 96, 126, 251, 83, 98, 255, 255, 83, 98, 255, 255, 255, 255, 175, 133, 255, 255, 245, 162, 120, 250, 175, 133, 120, 250, 54, 165, 120, 250, 46, 129, 255, 255, 111, 131, 120, 250, 111, 131, 255, 103, 233, 51, 111, 96, 233, 51, 27, 102, 104, 47, 83, 98, 104, 47, 134, 5, 111, 131, 0, 0, 111, 131, 134, 5, 46, 129, 27, 102, 255, 255), +"format": 34896613399, +"index_count": 60, +"index_data": PackedByteArray(30, 4, 28, 4, 29, 4, 29, 4, 31, 4, 30, 4, 34, 4, 32, 4, 33, 4, 33, 4, 35, 4, 34, 4, 38, 4, 36, 4, 37, 4, 37, 4, 39, 4, 38, 4, 42, 4, 40, 4, 41, 4, 41, 4, 43, 4, 42, 4, 43, 4, 44, 4, 42, 4, 43, 4, 45, 4, 44, 4, 48, 4, 46, 4, 47, 4, 47, 4, 49, 4, 48, 4, 234, 3, 233, 3, 50, 4, 53, 4, 51, 4, 52, 4, 52, 4, 54, 4, 53, 4, 57, 4, 55, 4, 56, 4, 60, 4, 58, 4, 59, 4, 59, 4, 61, 4, 60, 4, 64, 4, 62, 4, 63, 4, 65, 4, 238, 3, 222, 3), +"material": SubResource("StandardMaterial3D_ioife"), +"name": "dark", +"primitive": 3, +"uv_scale": Vector4(8.8, 10.8, 0, 0), +"vertex_count": 1090, +"vertex_data": PackedByteArray(187, 165, 235, 123, 188, 105, 84, 213, 187, 165, 235, 123, 222, 52, 84, 213, 123, 103, 235, 123, 188, 105, 84, 213, 123, 103, 235, 123, 222, 52, 84, 213, 75, 181, 90, 232, 188, 105, 255, 255, 43, 150, 90, 232, 188, 105, 255, 255, 187, 165, 215, 247, 188, 105, 255, 255, 43, 150, 90, 232, 188, 105, 255, 255, 75, 181, 90, 232, 188, 105, 255, 255, 234, 87, 90, 232, 188, 105, 255, 255, 234, 87, 90, 232, 188, 105, 255, 255, 234, 87, 230, 154, 188, 105, 255, 255, 123, 103, 230, 154, 188, 105, 255, 255, 187, 165, 230, 154, 188, 105, 255, 255, 75, 181, 230, 154, 188, 105, 255, 255, 11, 119, 90, 232, 188, 105, 255, 255, 123, 103, 215, 247, 188, 105, 255, 255, 11, 119, 90, 232, 188, 105, 255, 255, 123, 103, 235, 123, 188, 105, 255, 255, 187, 165, 235, 123, 188, 105, 255, 255, 123, 103, 215, 247, 220, 15, 84, 213, 11, 119, 90, 232, 111, 26, 84, 213, 123, 103, 215, 247, 188, 105, 84, 213, 11, 119, 90, 232, 188, 105, 84, 213, 187, 165, 0, 0, 146, 10, 252, 197, 123, 103, 0, 0, 146, 10, 252, 197, 187, 165, 235, 123, 222, 52, 252, 197, 123, 103, 235, 123, 222, 52, 252, 197, 123, 103, 215, 247, 146, 10, 84, 213, 123, 103, 215, 247, 220, 15, 84, 213, 234, 87, 90, 232, 146, 10, 84, 213, 123, 103, 215, 247, 188, 105, 84, 213, 234, 87, 90, 232, 188, 105, 84, 213, 234, 87, 90, 232, 220, 15, 84, 213, 234, 87, 90, 232, 146, 10, 84, 213, 234, 87, 90, 232, 188, 105, 84, 213, 234, 87, 230, 154, 222, 52, 255, 255, 123, 103, 230, 154, 222, 52, 255, 255, 234, 87, 100, 170, 222, 52, 255, 255, 123, 103, 100, 170, 222, 52, 255, 255, 123, 103, 230, 154, 148, 47, 255, 255, 187, 165, 230, 154, 148, 47, 255, 255, 123, 103, 220, 216, 148, 47, 255, 255, 187, 165, 100, 170, 148, 47, 255, 255, 187, 165, 220, 216, 148, 47, 255, 255, 75, 181, 230, 154, 148, 47, 255, 255, 75, 181, 100, 170, 148, 47, 255, 255, 123, 103, 230, 154, 188, 105, 84, 213, 123, 103, 230, 154, 222, 52, 84, 213, 234, 87, 230, 154, 188, 105, 84, 213, 234, 87, 230, 154, 222, 52, 84, 213, 75, 181, 220, 216, 146, 10, 84, 213, 75, 181, 220, 216, 115, 100, 84, 213, 75, 181, 90, 232, 146, 10, 84, 213, 75, 181, 90, 232, 220, 15, 84, 213, 75, 181, 90, 232, 188, 105, 84, 213, 75, 181, 100, 170, 115, 100, 84, 213, 75, 181, 230, 154, 188, 105, 84, 213, 75, 181, 230, 154, 148, 47, 84, 213, 75, 181, 100, 170, 148, 47, 84, 213, 75, 181, 230, 154, 188, 105, 84, 213, 75, 181, 230, 154, 148, 47, 84, 213, 187, 165, 230, 154, 188, 105, 84, 213, 187, 165, 230, 154, 148, 47, 84, 213, 123, 103, 235, 123, 222, 52, 84, 213, 123, 103, 230, 154, 222, 52, 84, 213, 123, 103, 235, 123, 188, 105, 84, 213, 123, 103, 230, 154, 188, 105, 84, 213, 123, 103, 230, 154, 222, 52, 84, 213, 123, 103, 235, 123, 222, 52, 84, 213, 123, 103, 220, 216, 222, 52, 84, 213, 123, 103, 220, 216, 222, 52, 84, 213, 123, 103, 220, 216, 148, 47, 84, 213, 123, 103, 230, 154, 148, 47, 84, 213, 123, 103, 115, 77, 37, 21, 84, 213, 123, 103, 0, 0, 146, 10, 84, 213, 123, 103, 220, 216, 146, 10, 84, 213, 123, 103, 220, 216, 220, 15, 84, 213, 123, 103, 100, 170, 222, 52, 84, 213, 123, 103, 220, 216, 37, 21, 84, 213, 234, 87, 230, 154, 222, 52, 84, 213, 234, 87, 100, 170, 222, 52, 84, 213, 234, 87, 230, 154, 188, 105, 84, 213, 234, 87, 100, 170, 115, 100, 84, 213, 234, 87, 220, 216, 115, 100, 84, 213, 234, 87, 90, 232, 188, 105, 84, 213, 234, 87, 90, 232, 220, 15, 84, 213, 234, 87, 90, 232, 146, 10, 84, 213, 234, 87, 220, 216, 146, 10, 84, 213, 43, 150, 100, 170, 224, 89, 255, 255, 123, 103, 100, 170, 224, 89, 255, 255, 43, 150, 220, 216, 224, 89, 255, 255, 123, 103, 220, 216, 224, 89, 255, 255, 234, 87, 100, 170, 115, 100, 255, 255, 75, 181, 100, 170, 115, 100, 255, 255, 234, 87, 220, 216, 115, 100, 255, 255, 75, 181, 220, 216, 115, 100, 255, 255, 187, 165, 215, 247, 220, 15, 84, 213, 187, 165, 215, 247, 188, 105, 84, 213, 43, 150, 90, 232, 111, 26, 84, 213, 43, 150, 90, 232, 188, 105, 84, 213, 187, 165, 215, 247, 146, 10, 84, 213, 75, 181, 90, 232, 146, 10, 84, 213, 187, 165, 215, 247, 220, 15, 84, 213, 75, 181, 90, 232, 220, 15, 84, 213, 187, 165, 215, 247, 188, 105, 84, 213, 75, 181, 90, 232, 188, 105, 84, 213, 187, 165, 235, 123, 222, 52, 84, 213, 187, 165, 115, 77, 37, 21, 84, 213, 187, 165, 0, 0, 146, 10, 84, 213, 187, 165, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 230, 154, 148, 47, 84, 213, 187, 165, 230, 154, 188, 105, 84, 213, 187, 165, 235, 123, 188, 105, 84, 213, 187, 165, 220, 216, 148, 47, 84, 213, 187, 165, 100, 170, 148, 47, 84, 213, 187, 165, 220, 216, 222, 52, 84, 213, 187, 165, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 151, 84, 84, 213, 123, 103, 220, 216, 151, 84, 84, 213, 123, 103, 100, 170, 224, 89, 84, 213, 123, 103, 220, 216, 224, 89, 84, 213, 187, 165, 215, 247, 146, 10, 84, 213, 187, 165, 215, 247, 220, 15, 84, 213, 123, 103, 215, 247, 146, 10, 84, 213, 123, 103, 215, 247, 220, 15, 84, 213, 75, 181, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 222, 52, 84, 213, 75, 181, 220, 216, 115, 100, 84, 213, 43, 150, 220, 216, 224, 89, 84, 213, 234, 87, 220, 216, 115, 100, 84, 213, 123, 103, 220, 216, 224, 89, 84, 213, 123, 103, 220, 216, 151, 84, 84, 213, 123, 103, 220, 216, 222, 52, 84, 213, 123, 103, 220, 216, 148, 47, 84, 213, 123, 103, 220, 216, 37, 21, 84, 213, 123, 103, 220, 216, 220, 15, 84, 213, 123, 103, 220, 216, 146, 10, 84, 213, 234, 87, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 220, 216, 148, 47, 84, 213, 43, 150, 220, 216, 151, 84, 84, 213, 187, 165, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 148, 47, 84, 213, 187, 165, 220, 216, 222, 52, 84, 213, 187, 165, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 100, 170, 222, 52, 84, 213, 43, 150, 100, 170, 151, 84, 84, 213, 123, 103, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 151, 84, 84, 213, 234, 87, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 224, 89, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 75, 181, 100, 170, 115, 100, 84, 213, 187, 165, 100, 170, 148, 47, 84, 213, 75, 181, 100, 170, 148, 47, 84, 213, 234, 87, 100, 170, 115, 100, 84, 213, 187, 165, 115, 77, 37, 21, 255, 255, 123, 103, 115, 77, 37, 21, 255, 255, 187, 165, 220, 216, 37, 21, 255, 255, 123, 103, 220, 216, 37, 21, 255, 255, 123, 103, 100, 170, 151, 84, 255, 255, 43, 150, 100, 170, 151, 84, 255, 255, 123, 103, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 84, 213, 43, 150, 100, 170, 151, 84, 84, 213, 43, 150, 220, 216, 224, 89, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 187, 165, 215, 247, 220, 15, 104, 203, 43, 150, 90, 232, 111, 26, 104, 203, 123, 103, 215, 247, 220, 15, 104, 203, 11, 119, 90, 232, 111, 26, 104, 203, 187, 165, 115, 77, 37, 21, 170, 233, 187, 165, 230, 154, 148, 47, 170, 233, 123, 103, 115, 77, 37, 21, 170, 233, 123, 103, 230, 154, 148, 47, 170, 233, 43, 150, 90, 232, 111, 26, 84, 213, 43, 150, 90, 232, 188, 105, 84, 213, 11, 119, 90, 232, 111, 26, 84, 213, 11, 119, 90, 232, 188, 105, 84, 213, 187, 165, 100, 170, 222, 52, 255, 255, 123, 103, 100, 170, 222, 52, 255, 255, 187, 165, 220, 216, 222, 52, 255, 255, 123, 103, 220, 216, 222, 52, 255, 255, 75, 181, 220, 216, 146, 10, 255, 255, 75, 181, 90, 232, 146, 10, 255, 255, 187, 165, 220, 216, 146, 10, 255, 255, 187, 165, 90, 232, 146, 10, 255, 255, 187, 165, 220, 216, 146, 10, 255, 255, 75, 181, 90, 232, 146, 10, 255, 255, 43, 150, 100, 170, 151, 84, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 123, 103, 100, 170, 151, 84, 84, 213, 123, 103, 100, 170, 224, 89, 84, 213, 123, 103, 100, 170, 151, 84, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 249, 63, 98, 223, 10, 217, 84, 213, 234, 87, 255, 255, 10, 217, 84, 213, 249, 63, 98, 223, 221, 244, 84, 213, 234, 87, 255, 255, 110, 250, 84, 213, 249, 63, 98, 223, 110, 250, 84, 213, 249, 63, 98, 223, 10, 217, 255, 255, 176, 183, 98, 223, 10, 217, 255, 255, 234, 87, 255, 255, 10, 217, 255, 255, 191, 159, 255, 255, 10, 217, 255, 255, 220, 111, 255, 255, 10, 217, 255, 255, 205, 135, 255, 255, 10, 217, 255, 255, 191, 159, 255, 255, 10, 217, 84, 213, 176, 183, 98, 223, 10, 217, 84, 213, 191, 159, 255, 255, 110, 250, 84, 213, 176, 183, 98, 223, 221, 244, 84, 213, 176, 183, 98, 223, 110, 250, 84, 213, 191, 159, 98, 223, 110, 250, 255, 255, 133, 158, 183, 229, 110, 250, 255, 255, 176, 183, 98, 223, 110, 250, 255, 255, 191, 159, 255, 255, 110, 250, 255, 255, 239, 154, 157, 235, 110, 250, 255, 255, 58, 149, 174, 240, 110, 250, 255, 255, 202, 141, 145, 244, 110, 250, 255, 255, 32, 133, 2, 247, 110, 250, 255, 255, 212, 123, 215, 247, 110, 250, 255, 255, 234, 87, 255, 255, 110, 250, 255, 255, 137, 114, 2, 247, 110, 250, 255, 255, 223, 105, 145, 244, 110, 250, 255, 255, 111, 98, 174, 240, 110, 250, 255, 255, 186, 92, 157, 235, 110, 250, 255, 255, 36, 89, 183, 229, 110, 250, 255, 255, 249, 63, 98, 223, 110, 250, 255, 255, 234, 87, 98, 223, 110, 250, 255, 255, 234, 87, 98, 223, 110, 250, 84, 213, 234, 87, 98, 223, 221, 244, 84, 213, 249, 63, 98, 223, 110, 250, 84, 213, 249, 63, 98, 223, 221, 244, 84, 213, 176, 183, 98, 223, 110, 250, 84, 213, 176, 183, 98, 223, 221, 244, 84, 213, 191, 159, 98, 223, 110, 250, 84, 213, 191, 159, 98, 223, 221, 244, 84, 213, 220, 111, 255, 255, 10, 217, 84, 213, 220, 111, 255, 255, 221, 244, 84, 213, 234, 87, 255, 255, 10, 217, 84, 213, 234, 87, 255, 255, 110, 250, 84, 213, 205, 135, 255, 255, 221, 244, 84, 213, 191, 159, 255, 255, 110, 250, 84, 213, 205, 135, 255, 255, 10, 217, 84, 213, 191, 159, 255, 255, 10, 217, 84, 213, 220, 111, 255, 255, 10, 217, 84, 213, 220, 111, 255, 255, 221, 244, 84, 213, 234, 87, 255, 255, 10, 217, 84, 213, 234, 87, 255, 255, 110, 250, 84, 213, 205, 135, 255, 255, 221, 244, 84, 213, 191, 159, 255, 255, 110, 250, 84, 213, 205, 135, 255, 255, 10, 217, 84, 213, 191, 159, 255, 255, 10, 217, 84, 213, 212, 123, 80, 166, 221, 244, 255, 255, 234, 87, 80, 166, 221, 244, 255, 255, 137, 114, 66, 168, 221, 244, 255, 255, 234, 87, 119, 174, 221, 244, 255, 255, 223, 105, 246, 173, 221, 244, 255, 255, 117, 105, 119, 174, 221, 244, 255, 255, 32, 133, 66, 168, 221, 244, 255, 255, 191, 159, 80, 166, 221, 244, 255, 255, 191, 159, 119, 174, 221, 244, 255, 255, 202, 141, 246, 173, 221, 244, 255, 255, 52, 142, 119, 174, 221, 244, 255, 255, 191, 159, 80, 166, 221, 244, 84, 213, 191, 159, 80, 166, 10, 217, 84, 213, 212, 123, 80, 166, 221, 244, 84, 213, 234, 87, 80, 166, 10, 217, 84, 213, 234, 87, 80, 166, 221, 244, 84, 213, 191, 159, 119, 174, 10, 217, 84, 213, 191, 159, 80, 166, 10, 217, 84, 213, 191, 159, 119, 174, 221, 244, 84, 213, 191, 159, 80, 166, 221, 244, 84, 213, 234, 87, 80, 166, 10, 217, 255, 255, 191, 159, 80, 166, 10, 217, 255, 255, 234, 87, 119, 174, 10, 217, 255, 255, 191, 159, 119, 174, 10, 217, 255, 255, 234, 87, 80, 166, 10, 217, 84, 213, 234, 87, 119, 174, 10, 217, 84, 213, 234, 87, 80, 166, 221, 244, 84, 213, 234, 87, 119, 174, 221, 244, 84, 213, 212, 123, 137, 231, 255, 255, 84, 213, 212, 123, 137, 231, 221, 244, 84, 213, 187, 120, 66, 231, 255, 255, 84, 213, 187, 120, 66, 231, 221, 244, 84, 213, 238, 126, 130, 215, 221, 244, 84, 213, 238, 126, 130, 215, 255, 255, 84, 213, 212, 123, 59, 215, 221, 244, 84, 213, 212, 123, 59, 215, 255, 255, 84, 213, 212, 123, 59, 215, 221, 244, 84, 213, 212, 123, 59, 215, 255, 255, 84, 213, 187, 120, 130, 215, 221, 244, 84, 213, 187, 120, 130, 215, 255, 255, 84, 213, 187, 120, 130, 215, 221, 244, 84, 213, 187, 120, 130, 215, 255, 255, 84, 213, 216, 117, 83, 216, 221, 244, 84, 213, 216, 117, 83, 216, 255, 255, 84, 213, 205, 135, 98, 223, 221, 244, 84, 213, 101, 135, 126, 225, 221, 244, 84, 213, 205, 135, 98, 223, 255, 255, 84, 213, 101, 135, 126, 225, 255, 255, 84, 213, 209, 129, 83, 216, 221, 244, 84, 213, 209, 129, 83, 216, 255, 255, 84, 213, 238, 126, 130, 215, 221, 244, 84, 213, 238, 126, 130, 215, 255, 255, 84, 213, 76, 132, 158, 217, 221, 244, 84, 213, 76, 132, 158, 217, 255, 255, 84, 213, 209, 129, 83, 216, 221, 244, 84, 213, 209, 129, 83, 216, 255, 255, 84, 213, 76, 132, 158, 217, 221, 244, 84, 213, 51, 134, 79, 219, 221, 244, 84, 213, 76, 132, 158, 217, 255, 255, 84, 213, 51, 134, 79, 219, 255, 255, 84, 213, 212, 123, 59, 215, 255, 255, 255, 255, 238, 126, 130, 215, 255, 255, 255, 255, 133, 158, 157, 208, 255, 255, 255, 255, 191, 159, 98, 223, 255, 255, 255, 255, 209, 129, 83, 216, 255, 255, 255, 255, 76, 132, 158, 217, 255, 255, 255, 255, 51, 134, 79, 219, 255, 255, 255, 255, 101, 135, 70, 221, 255, 255, 255, 255, 205, 135, 98, 223, 255, 255, 255, 255, 133, 158, 183, 229, 255, 255, 255, 255, 101, 135, 126, 225, 255, 255, 255, 255, 51, 134, 118, 227, 255, 255, 255, 255, 76, 132, 38, 229, 255, 255, 255, 255, 209, 129, 114, 230, 255, 255, 255, 255, 239, 154, 157, 235, 255, 255, 255, 255, 238, 126, 66, 231, 255, 255, 255, 255, 212, 123, 137, 231, 255, 255, 255, 255, 186, 92, 157, 235, 255, 255, 255, 255, 187, 120, 66, 231, 255, 255, 255, 255, 216, 117, 114, 230, 255, 255, 255, 255, 36, 89, 183, 229, 255, 255, 255, 255, 93, 115, 38, 229, 255, 255, 255, 255, 118, 113, 118, 227, 255, 255, 255, 255, 68, 112, 126, 225, 255, 255, 255, 255, 234, 87, 98, 223, 255, 255, 255, 255, 220, 111, 98, 223, 255, 255, 255, 255, 68, 112, 70, 221, 255, 255, 255, 255, 118, 113, 79, 219, 255, 255, 255, 255, 93, 115, 158, 217, 255, 255, 255, 255, 216, 117, 83, 216, 255, 255, 255, 255, 187, 120, 130, 215, 255, 255, 255, 255, 36, 89, 157, 208, 255, 255, 255, 255, 186, 92, 217, 194, 255, 255, 255, 255, 239, 154, 217, 194, 255, 255, 255, 255, 111, 98, 7, 183, 255, 255, 255, 255, 58, 149, 7, 183, 255, 255, 255, 255, 223, 105, 246, 173, 255, 255, 255, 255, 202, 141, 246, 173, 255, 255, 255, 255, 137, 114, 66, 168, 255, 255, 255, 255, 32, 133, 66, 168, 255, 255, 255, 255, 212, 123, 80, 166, 255, 255, 255, 255, 58, 149, 174, 240, 255, 255, 255, 255, 111, 98, 174, 240, 255, 255, 255, 255, 202, 141, 145, 244, 255, 255, 255, 255, 223, 105, 145, 244, 255, 255, 255, 255, 137, 114, 2, 247, 255, 255, 255, 255, 32, 133, 2, 247, 255, 255, 255, 255, 212, 123, 215, 247, 255, 255, 255, 255, 209, 129, 114, 230, 255, 255, 84, 213, 209, 129, 114, 230, 221, 244, 84, 213, 238, 126, 66, 231, 255, 255, 84, 213, 238, 126, 66, 231, 221, 244, 84, 213, 51, 134, 79, 219, 221, 244, 84, 213, 101, 135, 70, 221, 221, 244, 84, 213, 51, 134, 79, 219, 255, 255, 84, 213, 101, 135, 70, 221, 255, 255, 84, 213, 238, 126, 66, 231, 255, 255, 84, 213, 238, 126, 66, 231, 221, 244, 84, 213, 212, 123, 137, 231, 255, 255, 84, 213, 212, 123, 137, 231, 221, 244, 84, 213, 51, 134, 118, 227, 221, 244, 84, 213, 76, 132, 38, 229, 221, 244, 84, 213, 51, 134, 118, 227, 255, 255, 84, 213, 76, 132, 38, 229, 255, 255, 84, 213, 101, 135, 70, 221, 221, 244, 84, 213, 205, 135, 98, 223, 221, 244, 84, 213, 101, 135, 70, 221, 255, 255, 84, 213, 205, 135, 98, 223, 255, 255, 84, 213, 101, 135, 126, 225, 221, 244, 84, 213, 51, 134, 118, 227, 221, 244, 84, 213, 101, 135, 126, 225, 255, 255, 84, 213, 51, 134, 118, 227, 255, 255, 84, 213, 76, 132, 38, 229, 255, 255, 84, 213, 76, 132, 38, 229, 221, 244, 84, 213, 209, 129, 114, 230, 255, 255, 84, 213, 209, 129, 114, 230, 221, 244, 84, 213, 118, 113, 79, 219, 221, 244, 84, 213, 93, 115, 158, 217, 221, 244, 84, 213, 118, 113, 79, 219, 255, 255, 84, 213, 93, 115, 158, 217, 255, 255, 84, 213, 68, 112, 70, 221, 221, 244, 84, 213, 118, 113, 79, 219, 221, 244, 84, 213, 68, 112, 70, 221, 255, 255, 84, 213, 118, 113, 79, 219, 255, 255, 84, 213, 216, 117, 83, 216, 221, 244, 84, 213, 216, 117, 83, 216, 255, 255, 84, 213, 93, 115, 158, 217, 221, 244, 84, 213, 93, 115, 158, 217, 255, 255, 84, 213, 58, 149, 174, 240, 110, 250, 84, 213, 58, 149, 174, 240, 255, 255, 84, 213, 202, 141, 145, 244, 110, 250, 84, 213, 202, 141, 145, 244, 255, 255, 84, 213, 212, 123, 215, 247, 110, 250, 84, 213, 212, 123, 215, 247, 255, 255, 84, 213, 137, 114, 2, 247, 110, 250, 84, 213, 137, 114, 2, 247, 255, 255, 84, 213, 58, 149, 7, 183, 221, 244, 84, 213, 52, 142, 119, 174, 221, 244, 84, 213, 58, 149, 7, 183, 255, 255, 84, 213, 202, 141, 246, 173, 221, 244, 84, 213, 202, 141, 246, 173, 255, 255, 84, 213, 137, 114, 66, 168, 255, 255, 84, 213, 137, 114, 66, 168, 221, 244, 84, 213, 223, 105, 246, 173, 255, 255, 84, 213, 223, 105, 246, 173, 221, 244, 84, 213, 223, 105, 246, 173, 221, 244, 84, 213, 117, 105, 119, 174, 221, 244, 84, 213, 223, 105, 246, 173, 255, 255, 84, 213, 111, 98, 7, 183, 221, 244, 84, 213, 111, 98, 7, 183, 255, 255, 84, 213, 202, 141, 145, 244, 110, 250, 84, 213, 202, 141, 145, 244, 255, 255, 84, 213, 32, 133, 2, 247, 110, 250, 84, 213, 32, 133, 2, 247, 255, 255, 84, 213, 137, 114, 2, 247, 110, 250, 84, 213, 137, 114, 2, 247, 255, 255, 84, 213, 223, 105, 145, 244, 110, 250, 84, 213, 223, 105, 145, 244, 255, 255, 84, 213, 133, 158, 157, 208, 221, 244, 84, 213, 239, 154, 217, 194, 221, 244, 84, 213, 133, 158, 157, 208, 255, 255, 84, 213, 239, 154, 217, 194, 255, 255, 84, 213, 36, 89, 157, 208, 221, 244, 84, 213, 234, 87, 98, 223, 221, 244, 84, 213, 36, 89, 157, 208, 255, 255, 84, 213, 234, 87, 98, 223, 110, 250, 84, 213, 234, 87, 98, 223, 255, 255, 84, 213, 186, 92, 217, 194, 221, 244, 84, 213, 36, 89, 157, 208, 221, 244, 84, 213, 186, 92, 217, 194, 255, 255, 84, 213, 36, 89, 157, 208, 255, 255, 84, 213, 223, 105, 145, 244, 110, 250, 84, 213, 223, 105, 145, 244, 255, 255, 84, 213, 111, 98, 174, 240, 110, 250, 84, 213, 111, 98, 174, 240, 255, 255, 84, 213, 234, 87, 98, 223, 110, 250, 84, 213, 36, 89, 183, 229, 110, 250, 84, 213, 234, 87, 98, 223, 255, 255, 84, 213, 36, 89, 183, 229, 255, 255, 84, 213, 191, 159, 98, 223, 221, 244, 84, 213, 133, 158, 157, 208, 221, 244, 84, 213, 191, 159, 98, 223, 110, 250, 84, 213, 133, 158, 157, 208, 255, 255, 84, 213, 191, 159, 98, 223, 255, 255, 84, 213, 36, 89, 183, 229, 110, 250, 84, 213, 186, 92, 157, 235, 110, 250, 84, 213, 36, 89, 183, 229, 255, 255, 84, 213, 186, 92, 157, 235, 255, 255, 84, 213, 239, 154, 157, 235, 110, 250, 84, 213, 133, 158, 183, 229, 110, 250, 84, 213, 239, 154, 157, 235, 255, 255, 84, 213, 133, 158, 183, 229, 255, 255, 84, 213, 186, 92, 157, 235, 110, 250, 84, 213, 111, 98, 174, 240, 110, 250, 84, 213, 186, 92, 157, 235, 255, 255, 84, 213, 111, 98, 174, 240, 255, 255, 84, 213, 133, 158, 183, 229, 110, 250, 84, 213, 191, 159, 98, 223, 110, 250, 84, 213, 133, 158, 183, 229, 255, 255, 84, 213, 191, 159, 98, 223, 255, 255, 84, 213, 202, 141, 246, 173, 255, 255, 84, 213, 202, 141, 246, 173, 221, 244, 84, 213, 32, 133, 66, 168, 255, 255, 84, 213, 32, 133, 66, 168, 221, 244, 84, 213, 32, 133, 2, 247, 110, 250, 84, 213, 32, 133, 2, 247, 255, 255, 84, 213, 212, 123, 215, 247, 110, 250, 84, 213, 212, 123, 215, 247, 255, 255, 84, 213, 58, 149, 174, 240, 110, 250, 84, 213, 239, 154, 157, 235, 110, 250, 84, 213, 58, 149, 174, 240, 255, 255, 84, 213, 239, 154, 157, 235, 255, 255, 84, 213, 239, 154, 217, 194, 221, 244, 84, 213, 58, 149, 7, 183, 221, 244, 84, 213, 239, 154, 217, 194, 255, 255, 84, 213, 58, 149, 7, 183, 255, 255, 84, 213, 111, 98, 7, 183, 221, 244, 84, 213, 186, 92, 217, 194, 221, 244, 84, 213, 111, 98, 7, 183, 255, 255, 84, 213, 186, 92, 217, 194, 255, 255, 84, 213, 32, 133, 66, 168, 255, 255, 84, 213, 32, 133, 66, 168, 221, 244, 84, 213, 212, 123, 80, 166, 255, 255, 84, 213, 212, 123, 80, 166, 221, 244, 84, 213, 212, 123, 80, 166, 255, 255, 84, 213, 212, 123, 80, 166, 221, 244, 84, 213, 137, 114, 66, 168, 255, 255, 84, 213, 137, 114, 66, 168, 221, 244, 84, 213, 118, 113, 118, 227, 221, 244, 84, 213, 68, 112, 126, 225, 221, 244, 84, 213, 118, 113, 118, 227, 255, 255, 84, 213, 68, 112, 126, 225, 255, 255, 84, 213, 216, 117, 114, 230, 255, 255, 84, 213, 216, 117, 114, 230, 221, 244, 84, 213, 93, 115, 38, 229, 255, 255, 84, 213, 93, 115, 38, 229, 221, 244, 84, 213, 187, 120, 66, 231, 255, 255, 84, 213, 187, 120, 66, 231, 221, 244, 84, 213, 216, 117, 114, 230, 255, 255, 84, 213, 216, 117, 114, 230, 221, 244, 84, 213, 220, 111, 98, 223, 221, 244, 84, 213, 68, 112, 70, 221, 221, 244, 84, 213, 220, 111, 98, 223, 255, 255, 84, 213, 68, 112, 70, 221, 255, 255, 84, 213, 68, 112, 126, 225, 221, 244, 84, 213, 220, 111, 98, 223, 221, 244, 84, 213, 68, 112, 126, 225, 255, 255, 84, 213, 220, 111, 98, 223, 255, 255, 84, 213, 93, 115, 38, 229, 221, 244, 84, 213, 118, 113, 118, 227, 221, 244, 84, 213, 93, 115, 38, 229, 255, 255, 84, 213, 118, 113, 118, 227, 255, 255, 84, 213, 212, 123, 59, 215, 221, 244, 255, 255, 187, 120, 130, 215, 221, 244, 255, 255, 238, 126, 130, 215, 221, 244, 255, 255, 209, 129, 83, 216, 221, 244, 255, 255, 216, 117, 83, 216, 221, 244, 255, 255, 76, 132, 158, 217, 221, 244, 255, 255, 93, 115, 158, 217, 221, 244, 255, 255, 51, 134, 79, 219, 221, 244, 255, 255, 118, 113, 79, 219, 221, 244, 255, 255, 101, 135, 70, 221, 221, 244, 255, 255, 68, 112, 70, 221, 221, 244, 255, 255, 205, 135, 98, 223, 221, 244, 255, 255, 220, 111, 98, 223, 221, 244, 255, 255, 101, 135, 126, 225, 221, 244, 255, 255, 68, 112, 126, 225, 221, 244, 255, 255, 118, 113, 118, 227, 221, 244, 255, 255, 51, 134, 118, 227, 221, 244, 255, 255, 76, 132, 38, 229, 221, 244, 255, 255, 93, 115, 38, 229, 221, 244, 255, 255, 209, 129, 114, 230, 221, 244, 255, 255, 216, 117, 114, 230, 221, 244, 255, 255, 238, 126, 66, 231, 221, 244, 255, 255, 187, 120, 66, 231, 221, 244, 255, 255, 212, 123, 137, 231, 221, 244, 255, 255, 183, 171, 20, 207, 10, 217, 84, 213, 183, 171, 198, 190, 10, 217, 84, 213, 183, 171, 20, 207, 221, 244, 84, 213, 183, 171, 198, 190, 221, 244, 84, 213, 183, 171, 20, 207, 221, 244, 84, 213, 183, 171, 198, 190, 10, 217, 84, 213, 183, 171, 198, 190, 10, 217, 84, 213, 191, 159, 119, 174, 10, 217, 84, 213, 183, 171, 198, 190, 221, 244, 84, 213, 191, 159, 119, 174, 221, 244, 84, 213, 183, 171, 198, 190, 221, 244, 84, 213, 191, 159, 119, 174, 10, 217, 84, 213, 249, 63, 20, 207, 10, 217, 84, 213, 249, 63, 98, 223, 10, 217, 84, 213, 249, 63, 20, 207, 221, 244, 84, 213, 249, 63, 98, 223, 221, 244, 84, 213, 249, 63, 20, 207, 221, 244, 84, 213, 249, 63, 98, 223, 10, 217, 84, 213, 242, 75, 198, 190, 10, 217, 84, 213, 242, 75, 20, 207, 10, 217, 84, 213, 242, 75, 198, 190, 221, 244, 84, 213, 242, 75, 20, 207, 221, 244, 84, 213, 242, 75, 198, 190, 221, 244, 84, 213, 242, 75, 20, 207, 10, 217, 84, 213, 176, 183, 98, 223, 10, 217, 84, 213, 176, 183, 20, 207, 10, 217, 84, 213, 176, 183, 98, 223, 221, 244, 84, 213, 176, 183, 20, 207, 221, 244, 84, 213, 176, 183, 98, 223, 221, 244, 84, 213, 176, 183, 20, 207, 10, 217, 84, 213, 249, 63, 20, 207, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 249, 63, 98, 223, 10, 217, 255, 255, 183, 171, 20, 207, 10, 217, 255, 255, 249, 63, 98, 223, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 176, 183, 20, 207, 10, 217, 255, 255, 183, 171, 20, 207, 10, 217, 255, 255, 176, 183, 98, 223, 10, 217, 255, 255, 249, 63, 98, 223, 10, 217, 255, 255, 176, 183, 20, 207, 10, 217, 255, 255, 234, 87, 119, 174, 10, 217, 255, 255, 191, 159, 119, 174, 10, 217, 255, 255, 242, 75, 198, 190, 10, 217, 255, 255, 183, 171, 198, 190, 10, 217, 255, 255, 242, 75, 198, 190, 10, 217, 255, 255, 191, 159, 119, 174, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 242, 75, 198, 190, 10, 217, 255, 255, 183, 171, 198, 190, 10, 217, 255, 255, 183, 171, 20, 207, 10, 217, 255, 255, 242, 75, 20, 207, 10, 217, 255, 255, 183, 171, 198, 190, 10, 217, 255, 255, 234, 87, 119, 174, 10, 217, 84, 213, 242, 75, 198, 190, 10, 217, 84, 213, 234, 87, 119, 174, 221, 244, 84, 213, 242, 75, 198, 190, 221, 244, 84, 213, 234, 87, 119, 174, 221, 244, 84, 213, 242, 75, 198, 190, 10, 217, 84, 213, 176, 183, 20, 207, 221, 244, 255, 255, 183, 171, 20, 207, 221, 244, 255, 255, 176, 183, 98, 223, 221, 244, 255, 255, 133, 158, 157, 208, 221, 244, 255, 255, 176, 183, 98, 223, 221, 244, 255, 255, 183, 171, 20, 207, 221, 244, 255, 255, 191, 159, 98, 223, 221, 244, 255, 255, 176, 183, 98, 223, 221, 244, 255, 255, 133, 158, 157, 208, 221, 244, 255, 255, 191, 159, 119, 174, 221, 244, 255, 255, 52, 142, 119, 174, 221, 244, 255, 255, 183, 171, 198, 190, 221, 244, 255, 255, 58, 149, 7, 183, 221, 244, 255, 255, 183, 171, 198, 190, 221, 244, 255, 255, 52, 142, 119, 174, 221, 244, 255, 255, 239, 154, 217, 194, 221, 244, 255, 255, 183, 171, 198, 190, 221, 244, 255, 255, 58, 149, 7, 183, 221, 244, 255, 255, 183, 171, 20, 207, 221, 244, 255, 255, 183, 171, 198, 190, 221, 244, 255, 255, 239, 154, 217, 194, 221, 244, 255, 255, 133, 158, 157, 208, 221, 244, 255, 255, 183, 171, 20, 207, 221, 244, 255, 255, 239, 154, 217, 194, 221, 244, 255, 255, 117, 105, 119, 174, 221, 244, 255, 255, 234, 87, 119, 174, 221, 244, 255, 255, 111, 98, 7, 183, 221, 244, 255, 255, 242, 75, 198, 190, 221, 244, 255, 255, 111, 98, 7, 183, 221, 244, 255, 255, 234, 87, 119, 174, 221, 244, 255, 255, 186, 92, 217, 194, 221, 244, 255, 255, 111, 98, 7, 183, 221, 244, 255, 255, 242, 75, 198, 190, 221, 244, 255, 255, 242, 75, 20, 207, 221, 244, 255, 255, 186, 92, 217, 194, 221, 244, 255, 255, 242, 75, 198, 190, 221, 244, 255, 255, 36, 89, 157, 208, 221, 244, 255, 255, 186, 92, 217, 194, 221, 244, 255, 255, 242, 75, 20, 207, 221, 244, 255, 255, 249, 63, 20, 207, 221, 244, 255, 255, 36, 89, 157, 208, 221, 244, 255, 255, 242, 75, 20, 207, 221, 244, 255, 255, 249, 63, 98, 223, 221, 244, 255, 255, 36, 89, 157, 208, 221, 244, 255, 255, 249, 63, 20, 207, 221, 244, 255, 255, 234, 87, 98, 223, 221, 244, 255, 255, 36, 89, 157, 208, 221, 244, 255, 255, 249, 63, 98, 223, 221, 244, 255, 255, 242, 75, 20, 207, 221, 244, 84, 213, 242, 75, 20, 207, 10, 217, 84, 213, 249, 63, 20, 207, 221, 244, 84, 213, 249, 63, 20, 207, 10, 217, 84, 213, 249, 63, 20, 207, 221, 244, 84, 213, 242, 75, 20, 207, 10, 217, 84, 213, 176, 183, 20, 207, 221, 244, 84, 213, 176, 183, 20, 207, 10, 217, 84, 213, 183, 171, 20, 207, 221, 244, 84, 213, 183, 171, 20, 207, 10, 217, 84, 213, 183, 171, 20, 207, 221, 244, 84, 213, 176, 183, 20, 207, 10, 217, 84, 213, 255, 223, 7, 119, 28, 129, 233, 202, 50, 179, 7, 119, 28, 129, 233, 202, 255, 223, 209, 173, 43, 164, 233, 202, 50, 179, 186, 132, 224, 137, 233, 202, 204, 76, 186, 132, 224, 137, 233, 202, 255, 159, 30, 160, 104, 155, 233, 202, 255, 159, 209, 173, 43, 164, 233, 202, 255, 95, 30, 160, 104, 155, 233, 202, 255, 31, 209, 173, 43, 164, 233, 202, 255, 31, 7, 119, 28, 129, 233, 202, 204, 76, 7, 119, 28, 129, 233, 202, 255, 95, 209, 173, 43, 164, 233, 202, 255, 95, 209, 173, 43, 164, 255, 255, 255, 31, 209, 173, 43, 164, 255, 255, 255, 95, 131, 187, 43, 164, 255, 255, 255, 31, 131, 187, 43, 164, 255, 255, 255, 95, 131, 187, 43, 164, 255, 255, 255, 31, 209, 173, 43, 164, 255, 255, 255, 255, 14, 208, 188, 105, 84, 213, 255, 223, 131, 187, 188, 105, 84, 213, 254, 255, 14, 208, 154, 222, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 254, 255, 14, 208, 154, 222, 84, 213, 255, 223, 131, 187, 188, 105, 84, 213, 255, 223, 131, 187, 154, 222, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 0, 0, 14, 208, 188, 105, 84, 213, 0, 0, 193, 221, 188, 105, 84, 213, 0, 0, 14, 208, 154, 222, 84, 213, 0, 0, 193, 221, 154, 222, 84, 213, 0, 0, 14, 208, 154, 222, 84, 213, 0, 0, 193, 221, 188, 105, 84, 213, 255, 31, 131, 187, 188, 105, 255, 255, 255, 223, 131, 187, 188, 105, 255, 255, 0, 0, 14, 208, 188, 105, 255, 255, 255, 255, 14, 208, 188, 105, 255, 255, 0, 0, 14, 208, 188, 105, 255, 255, 255, 223, 131, 187, 188, 105, 255, 255, 0, 0, 193, 221, 188, 105, 255, 255, 0, 0, 14, 208, 188, 105, 255, 255, 255, 255, 14, 208, 188, 105, 255, 255, 255, 255, 193, 221, 188, 105, 255, 255, 0, 0, 193, 221, 188, 105, 255, 255, 255, 255, 14, 208, 188, 105, 255, 255, 255, 31, 131, 187, 188, 105, 84, 213, 0, 0, 14, 208, 188, 105, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 0, 0, 14, 208, 154, 222, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 0, 0, 14, 208, 188, 105, 84, 213, 255, 31, 131, 187, 154, 222, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 0, 0, 14, 208, 154, 222, 84, 213, 255, 223, 131, 187, 154, 222, 255, 255, 255, 31, 131, 187, 154, 222, 255, 255, 254, 255, 14, 208, 154, 222, 255, 255, 0, 0, 14, 208, 154, 222, 255, 255, 254, 255, 14, 208, 154, 222, 255, 255, 255, 31, 131, 187, 154, 222, 255, 255, 254, 255, 193, 221, 154, 222, 255, 255, 254, 255, 14, 208, 154, 222, 255, 255, 0, 0, 14, 208, 154, 222, 255, 255, 0, 0, 193, 221, 154, 222, 255, 255, 254, 255, 193, 221, 154, 222, 255, 255, 0, 0, 14, 208, 154, 222, 255, 255, 255, 255, 193, 221, 188, 105, 84, 213, 255, 255, 14, 208, 188, 105, 84, 213, 254, 255, 193, 221, 154, 222, 84, 213, 254, 255, 14, 208, 154, 222, 84, 213, 254, 255, 193, 221, 154, 222, 84, 213, 255, 255, 14, 208, 188, 105, 84, 213, 255, 223, 209, 173, 108, 117, 199, 222, 255, 223, 131, 187, 188, 105, 199, 222, 255, 31, 209, 173, 108, 117, 199, 222, 255, 31, 131, 187, 188, 105, 199, 222, 255, 31, 209, 173, 108, 117, 199, 222, 255, 223, 131, 187, 188, 105, 199, 222, 255, 223, 131, 187, 188, 105, 84, 213, 255, 223, 209, 173, 108, 117, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 255, 223, 7, 119, 28, 129, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 255, 223, 209, 173, 108, 117, 84, 213, 255, 223, 209, 173, 43, 164, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 255, 223, 7, 119, 28, 129, 84, 213, 255, 223, 209, 173, 108, 117, 84, 213, 255, 223, 7, 119, 188, 105, 84, 213, 255, 223, 7, 119, 28, 129, 84, 213, 255, 31, 7, 119, 188, 105, 84, 213, 255, 31, 209, 173, 108, 117, 84, 213, 255, 31, 7, 119, 28, 129, 84, 213, 255, 31, 131, 187, 188, 105, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 255, 31, 209, 173, 108, 117, 84, 213, 255, 31, 7, 119, 28, 129, 84, 213, 255, 31, 209, 173, 108, 117, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 255, 31, 209, 173, 43, 164, 84, 213, 255, 31, 7, 119, 28, 129, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 255, 223, 7, 119, 28, 129, 84, 213, 255, 223, 7, 119, 188, 105, 84, 213, 50, 179, 7, 119, 28, 129, 84, 213, 255, 31, 7, 119, 188, 105, 84, 213, 50, 179, 7, 119, 28, 129, 84, 213, 255, 223, 7, 119, 188, 105, 84, 213, 204, 76, 7, 119, 28, 129, 84, 213, 50, 179, 7, 119, 28, 129, 84, 213, 255, 31, 7, 119, 188, 105, 84, 213, 255, 31, 7, 119, 28, 129, 84, 213, 204, 76, 7, 119, 28, 129, 84, 213, 255, 31, 7, 119, 188, 105, 84, 213, 255, 223, 209, 173, 43, 164, 255, 255, 255, 159, 209, 173, 43, 164, 255, 255, 255, 223, 131, 187, 43, 164, 255, 255, 255, 159, 131, 187, 43, 164, 255, 255, 255, 223, 131, 187, 43, 164, 255, 255, 255, 159, 209, 173, 43, 164, 255, 255, 255, 31, 7, 119, 188, 105, 2, 240, 255, 223, 7, 119, 188, 105, 2, 240, 255, 31, 209, 173, 108, 117, 2, 240, 255, 223, 209, 173, 108, 117, 2, 240, 255, 31, 209, 173, 108, 117, 2, 240, 255, 223, 7, 119, 188, 105, 2, 240, 255, 159, 131, 187, 43, 164, 84, 213, 50, 179, 131, 187, 59, 199, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 50, 179, 131, 187, 235, 210, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 50, 179, 131, 187, 59, 199, 84, 213, 255, 159, 131, 187, 3, 170, 84, 213, 50, 179, 131, 187, 59, 199, 84, 213, 255, 159, 131, 187, 43, 164, 84, 213, 255, 223, 131, 187, 43, 164, 84, 213, 50, 179, 131, 187, 235, 210, 84, 213, 255, 223, 131, 187, 154, 222, 84, 213, 255, 31, 131, 187, 154, 222, 84, 213, 255, 223, 131, 187, 154, 222, 84, 213, 50, 179, 131, 187, 235, 210, 84, 213, 204, 76, 131, 187, 235, 210, 84, 213, 255, 31, 131, 187, 154, 222, 84, 213, 50, 179, 131, 187, 235, 210, 84, 213, 204, 76, 131, 187, 59, 199, 84, 213, 255, 31, 131, 187, 154, 222, 84, 213, 204, 76, 131, 187, 235, 210, 84, 213, 255, 159, 131, 187, 3, 170, 84, 213, 204, 140, 131, 187, 179, 181, 84, 213, 50, 179, 131, 187, 59, 199, 84, 213, 204, 76, 131, 187, 59, 199, 84, 213, 50, 179, 131, 187, 59, 199, 84, 213, 204, 140, 131, 187, 179, 181, 84, 213, 50, 115, 131, 187, 179, 181, 84, 213, 204, 76, 131, 187, 59, 199, 84, 213, 204, 140, 131, 187, 179, 181, 84, 213, 255, 95, 131, 187, 3, 170, 84, 213, 50, 115, 131, 187, 3, 170, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 255, 95, 131, 187, 43, 164, 84, 213, 50, 115, 131, 187, 3, 170, 84, 213, 204, 76, 131, 187, 59, 199, 84, 213, 50, 115, 131, 187, 179, 181, 84, 213, 255, 95, 131, 187, 43, 164, 84, 213, 255, 95, 131, 187, 3, 170, 84, 213, 255, 31, 131, 187, 154, 222, 84, 213, 204, 76, 131, 187, 59, 199, 84, 213, 255, 31, 131, 187, 43, 164, 84, 213, 204, 140, 131, 187, 179, 181, 84, 213, 255, 159, 131, 187, 3, 170, 84, 213, 204, 140, 131, 187, 3, 170, 84, 213, 255, 159, 131, 187, 43, 164, 84, 213, 255, 159, 209, 173, 43, 164, 84, 213, 255, 159, 131, 187, 3, 170, 84, 213, 255, 159, 247, 166, 3, 170, 84, 213, 255, 159, 30, 160, 104, 155, 84, 213, 255, 159, 30, 160, 139, 187, 84, 213, 255, 159, 247, 166, 31, 185, 84, 213, 255, 159, 128, 183, 59, 199, 84, 213, 255, 159, 209, 173, 59, 199, 84, 213, 255, 159, 30, 160, 139, 187, 84, 213, 255, 159, 30, 160, 104, 155, 84, 213, 255, 95, 30, 160, 139, 187, 84, 213, 255, 95, 30, 160, 104, 155, 84, 213, 50, 179, 7, 119, 59, 199, 84, 213, 50, 179, 7, 119, 28, 129, 84, 213, 204, 76, 7, 119, 59, 199, 84, 213, 204, 76, 7, 119, 28, 129, 84, 213, 204, 76, 7, 119, 28, 129, 84, 213, 204, 76, 186, 132, 224, 137, 84, 213, 204, 76, 7, 119, 59, 199, 84, 213, 204, 76, 186, 132, 100, 194, 84, 213, 204, 76, 102, 138, 59, 199, 84, 213, 204, 76, 186, 132, 235, 210, 84, 213, 204, 76, 131, 187, 59, 199, 84, 213, 204, 76, 131, 187, 235, 210, 84, 213, 50, 179, 131, 187, 59, 199, 84, 213, 50, 179, 102, 138, 59, 199, 84, 213, 50, 179, 131, 187, 235, 210, 84, 213, 50, 179, 7, 119, 59, 199, 84, 213, 50, 179, 186, 132, 235, 210, 84, 213, 50, 179, 186, 132, 100, 194, 84, 213, 50, 179, 186, 132, 224, 137, 84, 213, 50, 179, 7, 119, 28, 129, 84, 213, 204, 76, 186, 132, 235, 210, 255, 255, 204, 76, 131, 187, 235, 210, 255, 255, 50, 179, 186, 132, 235, 210, 255, 255, 50, 179, 131, 187, 235, 210, 255, 255, 204, 76, 7, 119, 59, 199, 6, 205, 204, 76, 186, 132, 235, 210, 6, 205, 50, 179, 7, 119, 59, 199, 6, 205, 50, 179, 186, 132, 235, 210, 6, 205, 50, 179, 7, 119, 59, 199, 6, 205, 204, 76, 186, 132, 235, 210, 6, 205, 50, 179, 186, 132, 100, 194, 199, 222, 50, 179, 102, 138, 59, 199, 199, 222, 204, 76, 186, 132, 100, 194, 199, 222, 204, 76, 102, 138, 59, 199, 199, 222, 204, 76, 186, 132, 100, 194, 199, 222, 50, 179, 102, 138, 59, 199, 199, 222, 50, 179, 186, 132, 224, 137, 84, 213, 50, 179, 186, 132, 100, 194, 84, 213, 204, 76, 186, 132, 224, 137, 84, 213, 204, 76, 186, 132, 100, 194, 84, 213, 50, 179, 102, 138, 59, 199, 255, 255, 255, 95, 209, 173, 59, 199, 255, 255, 204, 76, 102, 138, 59, 199, 255, 255, 204, 76, 131, 187, 59, 199, 255, 255, 255, 95, 128, 183, 59, 199, 255, 255, 255, 159, 128, 183, 59, 199, 255, 255, 255, 159, 209, 173, 59, 199, 255, 255, 50, 179, 131, 187, 59, 199, 255, 255, 255, 95, 209, 173, 43, 164, 84, 213, 255, 95, 247, 166, 3, 170, 84, 213, 255, 95, 30, 160, 104, 155, 84, 213, 255, 95, 30, 160, 139, 187, 84, 213, 255, 95, 131, 187, 43, 164, 84, 213, 255, 95, 247, 166, 31, 185, 84, 213, 255, 95, 128, 183, 59, 199, 84, 213, 255, 95, 209, 173, 59, 199, 84, 213, 255, 95, 131, 187, 3, 170, 84, 213, 204, 140, 209, 173, 179, 181, 199, 222, 204, 140, 131, 187, 3, 170, 199, 222, 50, 115, 209, 173, 179, 181, 199, 222, 50, 115, 131, 187, 3, 170, 199, 222, 204, 140, 209, 173, 53, 185, 20, 196, 50, 115, 209, 173, 53, 185, 20, 196, 204, 140, 131, 187, 179, 181, 20, 196, 50, 115, 131, 187, 179, 181, 20, 196, 255, 159, 247, 166, 3, 170, 84, 213, 255, 159, 247, 166, 31, 185, 84, 213, 255, 95, 247, 166, 3, 170, 84, 213, 255, 95, 247, 166, 31, 185, 84, 213, 255, 159, 209, 173, 59, 199, 6, 205, 255, 159, 30, 160, 139, 187, 6, 205, 255, 95, 209, 173, 59, 199, 6, 205, 255, 95, 30, 160, 139, 187, 6, 205, 255, 95, 209, 173, 59, 199, 6, 205, 255, 159, 30, 160, 139, 187, 6, 205, 204, 140, 131, 187, 3, 170, 84, 213, 204, 140, 209, 173, 179, 181, 84, 213, 204, 140, 131, 187, 179, 181, 84, 213, 204, 140, 209, 173, 53, 185, 84, 213, 204, 140, 209, 173, 53, 185, 84, 213, 204, 140, 209, 173, 179, 181, 84, 213, 50, 115, 209, 173, 53, 185, 84, 213, 50, 115, 209, 173, 179, 181, 84, 213, 255, 159, 247, 166, 3, 170, 255, 255, 255, 95, 247, 166, 3, 170, 255, 255, 255, 159, 131, 187, 3, 170, 255, 255, 255, 95, 131, 187, 3, 170, 255, 255, 204, 140, 131, 187, 3, 170, 255, 255, 255, 159, 131, 187, 3, 170, 255, 255, 255, 95, 131, 187, 3, 170, 255, 255, 50, 115, 131, 187, 3, 170, 255, 255, 50, 115, 131, 187, 3, 170, 84, 213, 50, 115, 131, 187, 179, 181, 84, 213, 50, 115, 209, 173, 179, 181, 84, 213, 50, 115, 209, 173, 53, 185, 84, 213, 255, 159, 247, 166, 31, 185, 199, 222, 255, 159, 128, 183, 59, 199, 199, 222, 255, 95, 247, 166, 31, 185, 199, 222, 255, 95, 128, 183, 59, 199, 199, 222, 255, 95, 247, 166, 31, 185, 199, 222, 255, 159, 128, 183, 59, 199, 199, 222, 0, 0, 115, 235, 188, 105, 84, 213, 255, 31, 255, 255, 188, 105, 84, 213, 0, 0, 115, 235, 154, 222, 84, 213, 255, 31, 255, 255, 154, 222, 84, 213, 255, 255, 115, 235, 188, 105, 84, 213, 255, 255, 193, 221, 188, 105, 84, 213, 254, 255, 115, 235, 154, 222, 84, 213, 254, 255, 193, 221, 154, 222, 84, 213, 0, 0, 193, 221, 188, 105, 84, 213, 0, 0, 115, 235, 188, 105, 84, 213, 0, 0, 193, 221, 154, 222, 84, 213, 0, 0, 115, 235, 154, 222, 84, 213, 255, 223, 255, 255, 188, 105, 84, 213, 255, 255, 115, 235, 188, 105, 84, 213, 255, 223, 255, 255, 154, 222, 84, 213, 254, 255, 115, 235, 154, 222, 84, 213, 255, 223, 255, 255, 188, 105, 84, 213, 255, 223, 255, 255, 154, 222, 84, 213, 255, 31, 255, 255, 188, 105, 84, 213, 255, 31, 255, 255, 154, 222, 84, 213, 0, 0, 193, 221, 188, 105, 255, 255, 255, 255, 193, 221, 188, 105, 255, 255, 0, 0, 115, 235, 188, 105, 255, 255, 255, 255, 115, 235, 188, 105, 255, 255, 255, 31, 255, 255, 188, 105, 255, 255, 255, 223, 255, 255, 188, 105, 255, 255, 254, 255, 193, 221, 154, 222, 255, 255, 0, 0, 193, 221, 154, 222, 255, 255, 254, 255, 115, 235, 154, 222, 255, 255, 0, 0, 115, 235, 154, 222, 255, 255, 255, 223, 255, 255, 154, 222, 255, 255, 255, 31, 255, 255, 154, 222, 255, 255, 75, 181, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 222, 52, 84, 213, 75, 181, 220, 216, 115, 100, 84, 213, 43, 150, 220, 216, 224, 89, 84, 213, 234, 87, 220, 216, 115, 100, 84, 213, 123, 103, 220, 216, 224, 89, 84, 213, 123, 103, 220, 216, 151, 84, 84, 213, 123, 103, 220, 216, 222, 52, 84, 213, 123, 103, 220, 216, 148, 47, 84, 213, 123, 103, 220, 216, 37, 21, 84, 213, 123, 103, 220, 216, 220, 15, 84, 213, 123, 103, 220, 216, 146, 10, 255, 191, 234, 87, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 220, 216, 148, 47, 84, 213, 43, 150, 220, 216, 151, 84, 84, 213, 187, 165, 220, 216, 146, 10, 255, 191, 187, 165, 220, 216, 148, 47, 84, 213, 187, 165, 220, 216, 222, 52, 84, 213, 187, 165, 220, 216, 146, 10, 84, 213, 187, 165, 220, 216, 37, 21, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 220, 216, 220, 15, 84, 213, 187, 165, 100, 170, 222, 52, 84, 213, 43, 150, 100, 170, 151, 84, 84, 213, 123, 103, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 151, 84, 84, 213, 234, 87, 100, 170, 222, 52, 84, 213, 123, 103, 100, 170, 224, 89, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 75, 181, 100, 170, 115, 100, 84, 213, 187, 165, 100, 170, 148, 47, 84, 213, 75, 181, 100, 170, 148, 47, 84, 213, 234, 87, 100, 170, 115, 100, 84, 213, 187, 165, 115, 77, 37, 21, 255, 255, 123, 103, 115, 77, 37, 21, 255, 255, 187, 165, 220, 216, 37, 21, 255, 255, 123, 103, 220, 216, 37, 21, 255, 255, 123, 103, 100, 170, 151, 84, 255, 255, 43, 150, 100, 170, 151, 84, 255, 255, 123, 103, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 255, 255, 43, 150, 220, 216, 151, 84, 84, 213, 43, 150, 100, 170, 151, 84, 84, 213, 43, 150, 220, 216, 224, 89, 84, 213, 43, 150, 100, 170, 224, 89, 84, 213, 187, 165, 215, 247, 220, 15, 104, 203, 43, 150, 90, 232, 111, 26, 104, 203, 123, 103, 215, 247, 220, 15, 104, 203, 11, 119, 90, 232, 111, 26, 104, 203, 187, 165, 115, 77, 37, 21, 170, 233, 187, 165, 230, 154, 148, 47, 170, 233, 123, 103, 115, 77, 37, 21, 170, 233, 123, 103, 230, 154, 148, 47, 170, 233, 43, 150, 90, 232, 111, 26, 84, 213, 43, 150, 90, 232, 188, 105, 84, 213, 11, 119, 90, 232, 111, 26, 84, 213, 11, 119, 90, 232, 188, 105, 84, 213, 187, 165, 100, 170, 222, 52, 255, 255, 123, 103, 100, 170, 222, 52, 255, 255, 187, 165, 220, 216, 222, 52, 255, 255, 123, 103, 220, 216, 222, 52, 255, 255, 11, 119, 125, 15, 0, 0, 109, 205, 11, 119, 220, 216, 0, 0, 109, 205, 123, 103, 0, 0, 146, 10, 109, 205, 123, 103, 220, 216, 146, 10, 109, 205, 234, 87, 220, 216, 146, 10, 113, 216, 11, 119, 220, 216, 0, 0, 113, 216, 234, 87, 90, 232, 146, 10, 113, 216, 11, 119, 90, 232, 0, 0, 113, 216, 43, 150, 220, 216, 0, 0, 113, 216, 75, 181, 220, 216, 146, 10, 113, 216, 43, 150, 90, 232, 0, 0, 113, 216, 75, 181, 90, 232, 146, 10, 113, 216, 11, 119, 125, 15, 0, 0, 255, 255, 43, 150, 125, 15, 0, 0, 255, 255, 11, 119, 220, 216, 0, 0, 255, 255, 43, 150, 220, 216, 0, 0, 255, 255, 11, 119, 90, 232, 0, 0, 255, 255, 43, 150, 90, 232, 0, 0, 255, 255, 187, 165, 0, 0, 146, 10, 227, 210, 43, 150, 125, 15, 0, 0, 227, 210, 123, 103, 0, 0, 146, 10, 227, 210, 11, 119, 125, 15, 0, 0, 227, 210, 11, 119, 220, 216, 0, 0, 255, 191, 43, 150, 220, 216, 0, 0, 109, 205, 43, 150, 125, 15, 0, 0, 109, 205, 187, 165, 220, 216, 146, 10, 109, 205, 187, 165, 0, 0, 146, 10, 109, 205, 187, 165, 215, 247, 146, 10, 217, 217, 43, 150, 90, 232, 0, 0, 217, 217, 75, 181, 90, 232, 146, 10, 217, 217, 187, 165, 215, 247, 146, 10, 227, 210, 123, 103, 215, 247, 146, 10, 227, 210, 43, 150, 90, 232, 0, 0, 227, 210, 11, 119, 90, 232, 0, 0, 227, 210, 234, 87, 90, 232, 146, 10, 217, 217, 11, 119, 90, 232, 0, 0, 217, 217, 123, 103, 215, 247, 146, 10, 217, 217, 43, 150, 220, 216, 0, 0, 255, 191, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 203, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 255, 179, 255, 51, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 170, 170, 84, 213, 170, 170, 84, 213, 170, 170, 84, 213, 170, 170, 84, 213, 170, 170, 84, 213, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 170, 170, 170, 42, 170, 170, 170, 42, 170, 170, 170, 42, 170, 170, 170, 42, 170, 170, 170, 42, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 12, 27, 242, 100, 12, 27, 242, 100, 242, 228, 12, 155, 242, 228, 12, 155, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 242, 228, 242, 100, 242, 228, 242, 100, 242, 228, 242, 100, 242, 228, 242, 100, 37, 209, 37, 81, 37, 209, 37, 81, 255, 127, 255, 255, 242, 100, 242, 228, 255, 127, 255, 255, 242, 100, 242, 228, 37, 209, 217, 174, 37, 209, 217, 174, 242, 228, 12, 155, 242, 228, 12, 155, 255, 191, 255, 191, 255, 191, 255, 191, 37, 209, 217, 174, 37, 209, 217, 174, 255, 191, 255, 191, 217, 174, 37, 209, 255, 191, 255, 191, 217, 174, 37, 209, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 217, 46, 217, 174, 217, 46, 217, 174, 12, 27, 12, 155, 12, 27, 12, 155, 217, 174, 37, 209, 12, 155, 242, 228, 217, 174, 37, 209, 12, 155, 242, 228, 12, 27, 12, 155, 12, 27, 12, 155, 0, 0, 255, 127, 0, 0, 255, 127, 37, 81, 37, 209, 255, 63, 255, 191, 37, 81, 37, 209, 255, 63, 255, 191, 12, 155, 242, 228, 255, 127, 255, 255, 12, 155, 242, 228, 255, 127, 255, 255, 242, 100, 242, 228, 37, 81, 37, 209, 242, 100, 242, 228, 37, 81, 37, 209, 255, 63, 255, 191, 255, 63, 255, 191, 217, 46, 217, 174, 217, 46, 217, 174, 217, 174, 217, 46, 255, 191, 255, 63, 217, 174, 217, 46, 255, 191, 255, 63, 12, 155, 12, 27, 217, 174, 217, 46, 12, 155, 12, 27, 217, 174, 217, 46, 37, 209, 37, 81, 37, 209, 37, 81, 255, 191, 255, 63, 255, 191, 255, 63, 255, 191, 255, 63, 255, 191, 255, 63, 37, 209, 37, 81, 37, 209, 37, 81, 255, 255, 255, 127, 255, 255, 255, 127, 242, 228, 12, 155, 242, 228, 12, 155, 245, 88, 10, 39, 32, 82, 222, 45, 245, 88, 10, 39, 85, 72, 170, 55, 85, 72, 170, 55, 129, 47, 129, 175, 129, 47, 129, 175, 85, 72, 84, 200, 85, 72, 84, 200, 85, 72, 84, 200, 32, 82, 32, 210, 85, 72, 84, 200, 245, 88, 244, 216, 245, 88, 244, 216, 37, 209, 37, 81, 37, 209, 37, 81, 242, 228, 242, 100, 242, 228, 242, 100, 242, 228, 12, 155, 242, 228, 12, 155, 37, 209, 217, 174, 37, 209, 217, 174, 163, 114, 92, 13, 63, 102, 191, 25, 163, 114, 92, 13, 63, 102, 191, 25, 163, 114, 162, 242, 41, 121, 40, 249, 163, 114, 162, 242, 41, 121, 40, 249, 41, 121, 40, 249, 63, 102, 63, 230, 163, 114, 162, 242, 63, 102, 63, 230, 163, 114, 162, 242, 37, 209, 217, 174, 37, 209, 217, 174, 255, 191, 255, 191, 255, 191, 255, 191, 227, 142, 26, 241, 12, 155, 242, 228, 227, 142, 26, 241, 12, 155, 242, 228, 41, 121, 214, 6, 163, 114, 92, 13, 41, 121, 214, 6, 163, 114, 92, 13, 41, 121, 214, 6, 12, 155, 242, 228, 217, 174, 37, 209, 12, 155, 242, 228, 217, 174, 37, 209, 217, 174, 217, 46, 12, 155, 12, 27, 217, 174, 217, 46, 12, 155, 12, 27, 217, 174, 37, 209, 255, 191, 255, 191, 217, 174, 37, 209, 255, 191, 255, 191, 12, 155, 12, 27, 227, 142, 228, 14, 12, 155, 12, 27, 227, 142, 228, 14, 85, 72, 170, 55, 85, 72, 170, 55, 129, 47, 125, 80, 129, 47, 125, 80, 242, 228, 242, 100, 242, 228, 242, 100, 255, 255, 255, 127, 255, 255, 255, 127, 255, 191, 255, 63, 217, 174, 217, 46, 255, 191, 255, 63, 217, 174, 217, 46, 63, 102, 191, 25, 245, 88, 10, 39, 63, 102, 191, 25, 245, 88, 10, 39, 245, 88, 244, 216, 63, 102, 63, 230, 245, 88, 244, 216, 63, 102, 63, 230, 129, 47, 125, 80, 129, 47, 125, 80, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 129, 47, 129, 175, 129, 47, 129, 175, 37, 81, 217, 46, 242, 100, 12, 27, 37, 81, 217, 46, 242, 100, 12, 27, 217, 46, 37, 81, 217, 46, 37, 81, 255, 63, 255, 63, 255, 63, 255, 63, 12, 27, 242, 100, 12, 27, 242, 100, 217, 46, 37, 81, 217, 46, 37, 81, 255, 127, 0, 0, 12, 155, 12, 27, 255, 127, 0, 0, 12, 155, 12, 27, 242, 100, 12, 27, 255, 127, 0, 0, 242, 100, 12, 27, 255, 127, 0, 0, 255, 63, 255, 63, 37, 81, 217, 46, 255, 63, 255, 63, 37, 81, 217, 46, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 84, 85, 170, 42, 84, 85, 170, 42, 84, 85, 170, 42, 84, 85, 170, 42, 84, 85, 170, 42, 84, 85, 170, 42, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 84, 85, 84, 213, 84, 85, 84, 213, 84, 85, 84, 213, 84, 85, 84, 213, 84, 85, 84, 213, 84, 85, 84, 213, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 29, 62, 226, 65, 29, 62, 226, 65, 29, 62, 226, 65, 29, 62, 226, 65, 29, 62, 226, 65, 29, 62, 226, 65, 29, 62, 226, 65, 29, 62, 226, 65, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 29, 62, 28, 190, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 225, 193, 28, 190, 225, 193, 28, 190, 225, 193, 28, 190, 225, 193, 28, 190, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 225, 193, 226, 65, 225, 193, 226, 65, 225, 193, 226, 65, 225, 193, 226, 65, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 254, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 255, 127, 0, 0, 170, 164, 169, 12, 170, 164, 169, 12, 170, 164, 169, 12, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 255, 255, 255, 127, 168, 140, 84, 219, 168, 140, 84, 219, 168, 140, 84, 219, 0, 0, 255, 127) +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_2hpnh") + +[node name="SpaceGun" type="Node3D"] +script = ExtResource("1_6sm4s") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.1, -0.078, 0.2) +layers = 1048575 +mesh = SubResource("ArrayMesh_hudfn") +skeleton = NodePath("") + +[node name="Nozzle" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.225)